162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/* Copyright(c) 2009-2010  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#include "trx.h"
1462306a36Sopenharmony_ci#include "../btcoexist/halbt_precomp.h"
1562306a36Sopenharmony_ci#include "hw.h"
1662306a36Sopenharmony_ci#include "../efuse.h"
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#define READ_NEXT_PAIR(array_table, v1, v2, i) \
1962306a36Sopenharmony_ci	do { \
2062306a36Sopenharmony_ci		i += 2; \
2162306a36Sopenharmony_ci		v1 = array_table[i]; \
2262306a36Sopenharmony_ci		v2 = array_table[i+1]; \
2362306a36Sopenharmony_ci	} while (0)
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cistatic u32 _rtl8821ae_phy_rf_serial_read(struct ieee80211_hw *hw,
2662306a36Sopenharmony_ci					 enum radio_path rfpath, u32 offset);
2762306a36Sopenharmony_cistatic void _rtl8821ae_phy_rf_serial_write(struct ieee80211_hw *hw,
2862306a36Sopenharmony_ci					   enum radio_path rfpath, u32 offset,
2962306a36Sopenharmony_ci					   u32 data);
3062306a36Sopenharmony_cistatic u32 _rtl8821ae_phy_calculate_bit_shift(u32 bitmask)
3162306a36Sopenharmony_ci{
3262306a36Sopenharmony_ci	if (WARN_ON_ONCE(!bitmask))
3362306a36Sopenharmony_ci		return 0;
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	return __ffs(bitmask);
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_cistatic bool _rtl8821ae_phy_bb8821a_config_parafile(struct ieee80211_hw *hw);
3862306a36Sopenharmony_ci/*static bool _rtl8812ae_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);*/
3962306a36Sopenharmony_cistatic bool _rtl8821ae_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);
4062306a36Sopenharmony_cistatic bool _rtl8821ae_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
4162306a36Sopenharmony_ci						     u8 configtype);
4262306a36Sopenharmony_cistatic bool _rtl8821ae_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
4362306a36Sopenharmony_ci						       u8 configtype);
4462306a36Sopenharmony_cistatic void phy_init_bb_rf_register_definition(struct ieee80211_hw *hw);
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_cistatic long _rtl8821ae_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
4762306a36Sopenharmony_ci					    enum wireless_mode wirelessmode,
4862306a36Sopenharmony_ci					    u8 txpwridx);
4962306a36Sopenharmony_cistatic void rtl8821ae_phy_set_rf_on(struct ieee80211_hw *hw);
5062306a36Sopenharmony_cistatic void rtl8821ae_phy_set_io(struct ieee80211_hw *hw);
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cistatic void rtl8812ae_fixspur(struct ieee80211_hw *hw,
5362306a36Sopenharmony_ci			      enum ht_channel_width band_width, u8 channel)
5462306a36Sopenharmony_ci{
5562306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci	/*C cut Item12 ADC FIFO CLOCK*/
5862306a36Sopenharmony_ci	if (IS_VENDOR_8812A_C_CUT(rtlhal->version)) {
5962306a36Sopenharmony_ci		if (band_width == HT_CHANNEL_WIDTH_20_40 && channel == 11)
6062306a36Sopenharmony_ci			rtl_set_bbreg(hw, RRFMOD, 0xC00, 0x3);
6162306a36Sopenharmony_ci			/* 0x8AC[11:10] = 2'b11*/
6262306a36Sopenharmony_ci		else
6362306a36Sopenharmony_ci			rtl_set_bbreg(hw, RRFMOD, 0xC00, 0x2);
6462306a36Sopenharmony_ci			/* 0x8AC[11:10] = 2'b10*/
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci		/* <20120914, Kordan> A workaround to resolve
6762306a36Sopenharmony_ci		 * 2480Mhz spur by setting ADC clock as 160M. (Asked by Binson)
6862306a36Sopenharmony_ci		 */
6962306a36Sopenharmony_ci		if (band_width == HT_CHANNEL_WIDTH_20 &&
7062306a36Sopenharmony_ci		    (channel == 13 || channel == 14)) {
7162306a36Sopenharmony_ci			rtl_set_bbreg(hw, RRFMOD, 0x300, 0x3);
7262306a36Sopenharmony_ci			/*0x8AC[9:8] = 2'b11*/
7362306a36Sopenharmony_ci			rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 1);
7462306a36Sopenharmony_ci			/* 0x8C4[30] = 1*/
7562306a36Sopenharmony_ci		} else if (band_width == HT_CHANNEL_WIDTH_20_40 &&
7662306a36Sopenharmony_ci			   channel == 11) {
7762306a36Sopenharmony_ci			rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 1);
7862306a36Sopenharmony_ci			/*0x8C4[30] = 1*/
7962306a36Sopenharmony_ci		} else if (band_width != HT_CHANNEL_WIDTH_80) {
8062306a36Sopenharmony_ci			rtl_set_bbreg(hw, RRFMOD, 0x300, 0x2);
8162306a36Sopenharmony_ci			/*0x8AC[9:8] = 2'b10*/
8262306a36Sopenharmony_ci			rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 0);
8362306a36Sopenharmony_ci			/*0x8C4[30] = 0*/
8462306a36Sopenharmony_ci		}
8562306a36Sopenharmony_ci	} else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
8662306a36Sopenharmony_ci		/* <20120914, Kordan> A workaround to resolve
8762306a36Sopenharmony_ci		 * 2480Mhz spur by setting ADC clock as 160M.
8862306a36Sopenharmony_ci		 */
8962306a36Sopenharmony_ci		if (band_width == HT_CHANNEL_WIDTH_20 &&
9062306a36Sopenharmony_ci		    (channel == 13 || channel == 14))
9162306a36Sopenharmony_ci			rtl_set_bbreg(hw, RRFMOD, 0x300, 0x3);
9262306a36Sopenharmony_ci			/*0x8AC[9:8] = 11*/
9362306a36Sopenharmony_ci		else if (channel  <= 14) /*2.4G only*/
9462306a36Sopenharmony_ci			rtl_set_bbreg(hw, RRFMOD, 0x300, 0x2);
9562306a36Sopenharmony_ci			/*0x8AC[9:8] = 10*/
9662306a36Sopenharmony_ci	}
9762306a36Sopenharmony_ci}
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ciu32 rtl8821ae_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr,
10062306a36Sopenharmony_ci			       u32 bitmask)
10162306a36Sopenharmony_ci{
10262306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
10362306a36Sopenharmony_ci	u32 returnvalue, originalvalue, bitshift;
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
10662306a36Sopenharmony_ci		"regaddr(%#x), bitmask(%#x)\n",
10762306a36Sopenharmony_ci		regaddr, bitmask);
10862306a36Sopenharmony_ci	originalvalue = rtl_read_dword(rtlpriv, regaddr);
10962306a36Sopenharmony_ci	bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask);
11062306a36Sopenharmony_ci	returnvalue = (originalvalue & bitmask) >> bitshift;
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
11362306a36Sopenharmony_ci		"BBR MASK=0x%x Addr[0x%x]=0x%x\n",
11462306a36Sopenharmony_ci		bitmask, regaddr, originalvalue);
11562306a36Sopenharmony_ci	return returnvalue;
11662306a36Sopenharmony_ci}
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_civoid rtl8821ae_phy_set_bb_reg(struct ieee80211_hw *hw,
11962306a36Sopenharmony_ci			      u32 regaddr, u32 bitmask, u32 data)
12062306a36Sopenharmony_ci{
12162306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
12262306a36Sopenharmony_ci	u32 originalvalue, bitshift;
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
12562306a36Sopenharmony_ci		"regaddr(%#x), bitmask(%#x), data(%#x)\n",
12662306a36Sopenharmony_ci		regaddr, bitmask, data);
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci	if (bitmask != MASKDWORD) {
12962306a36Sopenharmony_ci		originalvalue = rtl_read_dword(rtlpriv, regaddr);
13062306a36Sopenharmony_ci		bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask);
13162306a36Sopenharmony_ci		data = ((originalvalue & (~bitmask)) |
13262306a36Sopenharmony_ci			((data << bitshift) & bitmask));
13362306a36Sopenharmony_ci	}
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci	rtl_write_dword(rtlpriv, regaddr, data);
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
13862306a36Sopenharmony_ci		"regaddr(%#x), bitmask(%#x), data(%#x)\n",
13962306a36Sopenharmony_ci		regaddr, bitmask, data);
14062306a36Sopenharmony_ci}
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_ciu32 rtl8821ae_phy_query_rf_reg(struct ieee80211_hw *hw,
14362306a36Sopenharmony_ci			       enum radio_path rfpath, u32 regaddr,
14462306a36Sopenharmony_ci			       u32 bitmask)
14562306a36Sopenharmony_ci{
14662306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
14762306a36Sopenharmony_ci	u32 original_value, readback_value, bitshift;
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
15062306a36Sopenharmony_ci		"regaddr(%#x), rfpath(%#x), bitmask(%#x)\n",
15162306a36Sopenharmony_ci		regaddr, rfpath, bitmask);
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci	spin_lock(&rtlpriv->locks.rf_lock);
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci	original_value = _rtl8821ae_phy_rf_serial_read(hw, rfpath, regaddr);
15662306a36Sopenharmony_ci	bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask);
15762306a36Sopenharmony_ci	readback_value = (original_value & bitmask) >> bitshift;
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci	spin_unlock(&rtlpriv->locks.rf_lock);
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
16262306a36Sopenharmony_ci		"regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n",
16362306a36Sopenharmony_ci		regaddr, rfpath, bitmask, original_value);
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci	return readback_value;
16662306a36Sopenharmony_ci}
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_civoid rtl8821ae_phy_set_rf_reg(struct ieee80211_hw *hw,
16962306a36Sopenharmony_ci			   enum radio_path rfpath,
17062306a36Sopenharmony_ci			   u32 regaddr, u32 bitmask, u32 data)
17162306a36Sopenharmony_ci{
17262306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
17362306a36Sopenharmony_ci	u32 original_value, bitshift;
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
17662306a36Sopenharmony_ci		"regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
17762306a36Sopenharmony_ci		regaddr, bitmask, data, rfpath);
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci	spin_lock(&rtlpriv->locks.rf_lock);
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci	if (bitmask != RFREG_OFFSET_MASK) {
18262306a36Sopenharmony_ci		original_value =
18362306a36Sopenharmony_ci		   _rtl8821ae_phy_rf_serial_read(hw, rfpath, regaddr);
18462306a36Sopenharmony_ci		bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask);
18562306a36Sopenharmony_ci		data = ((original_value & (~bitmask)) | (data << bitshift));
18662306a36Sopenharmony_ci	}
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_ci	_rtl8821ae_phy_rf_serial_write(hw, rfpath, regaddr, data);
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ci	spin_unlock(&rtlpriv->locks.rf_lock);
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
19362306a36Sopenharmony_ci		"regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
19462306a36Sopenharmony_ci		 regaddr, bitmask, data, rfpath);
19562306a36Sopenharmony_ci}
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_cistatic u32 _rtl8821ae_phy_rf_serial_read(struct ieee80211_hw *hw,
19862306a36Sopenharmony_ci					 enum radio_path rfpath, u32 offset)
19962306a36Sopenharmony_ci{
20062306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
20162306a36Sopenharmony_ci	bool is_pi_mode = false;
20262306a36Sopenharmony_ci	u32 retvalue = 0;
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci	/* 2009/06/17 MH We can not execute IO for power
20562306a36Sopenharmony_ci	save or other accident mode.*/
20662306a36Sopenharmony_ci	if (RT_CANNOT_IO(hw)) {
20762306a36Sopenharmony_ci		pr_err("return all one\n");
20862306a36Sopenharmony_ci		return 0xFFFFFFFF;
20962306a36Sopenharmony_ci	}
21062306a36Sopenharmony_ci	/* <20120809, Kordan> CCA OFF(when entering),
21162306a36Sopenharmony_ci		asked by James to avoid reading the wrong value.
21262306a36Sopenharmony_ci	    <20120828, Kordan> Toggling CCA would affect RF 0x0, skip it!*/
21362306a36Sopenharmony_ci	if (offset != 0x0 &&
21462306a36Sopenharmony_ci	    !((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) ||
21562306a36Sopenharmony_ci	    (IS_VENDOR_8812A_C_CUT(rtlhal->version))))
21662306a36Sopenharmony_ci		rtl_set_bbreg(hw, RCCAONSEC, 0x8, 1);
21762306a36Sopenharmony_ci	offset &= 0xff;
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_ci	if (rfpath == RF90_PATH_A)
22062306a36Sopenharmony_ci		is_pi_mode = (bool)rtl_get_bbreg(hw, 0xC00, 0x4);
22162306a36Sopenharmony_ci	else if (rfpath == RF90_PATH_B)
22262306a36Sopenharmony_ci		is_pi_mode = (bool)rtl_get_bbreg(hw, 0xE00, 0x4);
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_ci	rtl_set_bbreg(hw, RHSSIREAD_8821AE, 0xff, offset);
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_ci	if ((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) ||
22762306a36Sopenharmony_ci	    (IS_VENDOR_8812A_C_CUT(rtlhal->version)))
22862306a36Sopenharmony_ci		udelay(20);
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_ci	if (is_pi_mode) {
23162306a36Sopenharmony_ci		if (rfpath == RF90_PATH_A)
23262306a36Sopenharmony_ci			retvalue =
23362306a36Sopenharmony_ci			  rtl_get_bbreg(hw, RA_PIREAD_8821A, BLSSIREADBACKDATA);
23462306a36Sopenharmony_ci		else if (rfpath == RF90_PATH_B)
23562306a36Sopenharmony_ci			retvalue =
23662306a36Sopenharmony_ci			  rtl_get_bbreg(hw, RB_PIREAD_8821A, BLSSIREADBACKDATA);
23762306a36Sopenharmony_ci	} else {
23862306a36Sopenharmony_ci		if (rfpath == RF90_PATH_A)
23962306a36Sopenharmony_ci			retvalue =
24062306a36Sopenharmony_ci			  rtl_get_bbreg(hw, RA_SIREAD_8821A, BLSSIREADBACKDATA);
24162306a36Sopenharmony_ci		else if (rfpath == RF90_PATH_B)
24262306a36Sopenharmony_ci			retvalue =
24362306a36Sopenharmony_ci			  rtl_get_bbreg(hw, RB_SIREAD_8821A, BLSSIREADBACKDATA);
24462306a36Sopenharmony_ci	}
24562306a36Sopenharmony_ci
24662306a36Sopenharmony_ci	/*<20120809, Kordan> CCA ON(when exiting),
24762306a36Sopenharmony_ci	 * asked by James to avoid reading the wrong value.
24862306a36Sopenharmony_ci	 *   <20120828, Kordan> Toggling CCA would affect RF 0x0, skip it!
24962306a36Sopenharmony_ci	 */
25062306a36Sopenharmony_ci	if (offset != 0x0 &&
25162306a36Sopenharmony_ci	    !((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) ||
25262306a36Sopenharmony_ci	    (IS_VENDOR_8812A_C_CUT(rtlhal->version))))
25362306a36Sopenharmony_ci		rtl_set_bbreg(hw, RCCAONSEC, 0x8, 0);
25462306a36Sopenharmony_ci	return retvalue;
25562306a36Sopenharmony_ci}
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_cistatic void _rtl8821ae_phy_rf_serial_write(struct ieee80211_hw *hw,
25862306a36Sopenharmony_ci					   enum radio_path rfpath, u32 offset,
25962306a36Sopenharmony_ci					   u32 data)
26062306a36Sopenharmony_ci{
26162306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
26262306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
26362306a36Sopenharmony_ci	struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
26462306a36Sopenharmony_ci	u32 data_and_addr;
26562306a36Sopenharmony_ci	u32 newoffset;
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_ci	if (RT_CANNOT_IO(hw)) {
26862306a36Sopenharmony_ci		pr_err("stop\n");
26962306a36Sopenharmony_ci		return;
27062306a36Sopenharmony_ci	}
27162306a36Sopenharmony_ci	offset &= 0xff;
27262306a36Sopenharmony_ci	newoffset = offset;
27362306a36Sopenharmony_ci	data_and_addr = ((newoffset << 20) |
27462306a36Sopenharmony_ci			 (data & 0x000fffff)) & 0x0fffffff;
27562306a36Sopenharmony_ci	rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr);
27662306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
27762306a36Sopenharmony_ci		"RFW-%d Addr[0x%x]=0x%x\n",
27862306a36Sopenharmony_ci		rfpath, pphyreg->rf3wire_offset, data_and_addr);
27962306a36Sopenharmony_ci}
28062306a36Sopenharmony_ci
28162306a36Sopenharmony_cibool rtl8821ae_phy_mac_config(struct ieee80211_hw *hw)
28262306a36Sopenharmony_ci{
28362306a36Sopenharmony_ci	bool rtstatus = 0;
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_ci	rtstatus = _rtl8821ae_phy_config_mac_with_headerfile(hw);
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_ci	return rtstatus;
28862306a36Sopenharmony_ci}
28962306a36Sopenharmony_ci
29062306a36Sopenharmony_cibool rtl8821ae_phy_bb_config(struct ieee80211_hw *hw)
29162306a36Sopenharmony_ci{
29262306a36Sopenharmony_ci	bool rtstatus = true;
29362306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
29462306a36Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
29562306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
29662306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
29762306a36Sopenharmony_ci	u8 regval;
29862306a36Sopenharmony_ci	u8 crystal_cap;
29962306a36Sopenharmony_ci
30062306a36Sopenharmony_ci	phy_init_bb_rf_register_definition(hw);
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci	regval = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN);
30362306a36Sopenharmony_ci	regval |= FEN_PCIEA;
30462306a36Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, regval);
30562306a36Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN,
30662306a36Sopenharmony_ci		       regval | FEN_BB_GLB_RSTN | FEN_BBRSTB);
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x7);
30962306a36Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_OPT_CTRL + 2, 0x7);
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci	rtstatus = _rtl8821ae_phy_bb8821a_config_parafile(hw);
31262306a36Sopenharmony_ci
31362306a36Sopenharmony_ci	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
31462306a36Sopenharmony_ci		crystal_cap = rtlefuse->crystalcap & 0x3F;
31562306a36Sopenharmony_ci		rtl_set_bbreg(hw, REG_MAC_PHY_CTRL, 0x7FF80000,
31662306a36Sopenharmony_ci			      (crystal_cap | (crystal_cap << 6)));
31762306a36Sopenharmony_ci	} else {
31862306a36Sopenharmony_ci		crystal_cap = rtlefuse->crystalcap & 0x3F;
31962306a36Sopenharmony_ci		rtl_set_bbreg(hw, REG_MAC_PHY_CTRL, 0xFFF000,
32062306a36Sopenharmony_ci			      (crystal_cap | (crystal_cap << 6)));
32162306a36Sopenharmony_ci	}
32262306a36Sopenharmony_ci	rtlphy->reg_837 = rtl_read_byte(rtlpriv, 0x837);
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_ci	return rtstatus;
32562306a36Sopenharmony_ci}
32662306a36Sopenharmony_ci
32762306a36Sopenharmony_cibool rtl8821ae_phy_rf_config(struct ieee80211_hw *hw)
32862306a36Sopenharmony_ci{
32962306a36Sopenharmony_ci	return rtl8821ae_phy_rf6052_config(hw);
33062306a36Sopenharmony_ci}
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_cistatic void _rtl8812ae_phy_set_rfe_reg_24g(struct ieee80211_hw *hw)
33362306a36Sopenharmony_ci{
33462306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
33562306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
33662306a36Sopenharmony_ci	u8 tmp;
33762306a36Sopenharmony_ci
33862306a36Sopenharmony_ci	switch (rtlhal->rfe_type) {
33962306a36Sopenharmony_ci	case 3:
34062306a36Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x54337770);
34162306a36Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x54337770);
34262306a36Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x010);
34362306a36Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010);
34462306a36Sopenharmony_ci		rtl_set_bbreg(hw, 0x900, 0x00000303, 0x1);
34562306a36Sopenharmony_ci		break;
34662306a36Sopenharmony_ci	case 4:
34762306a36Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x77777777);
34862306a36Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77777777);
34962306a36Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x001);
35062306a36Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x001);
35162306a36Sopenharmony_ci		break;
35262306a36Sopenharmony_ci	case 5:
35362306a36Sopenharmony_ci		rtl_write_byte(rtlpriv, RA_RFE_PINMUX + 2, 0x77);
35462306a36Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77777777);
35562306a36Sopenharmony_ci		tmp = rtl_read_byte(rtlpriv, RA_RFE_INV + 3);
35662306a36Sopenharmony_ci		rtl_write_byte(rtlpriv, RA_RFE_INV + 3, tmp & ~0x1);
35762306a36Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000);
35862306a36Sopenharmony_ci		break;
35962306a36Sopenharmony_ci	case 1:
36062306a36Sopenharmony_ci		if (rtlpriv->btcoexist.bt_coexistence) {
36162306a36Sopenharmony_ci			rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xffffff, 0x777777);
36262306a36Sopenharmony_ci			rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD,
36362306a36Sopenharmony_ci				      0x77777777);
36462306a36Sopenharmony_ci			rtl_set_bbreg(hw, RA_RFE_INV, 0x33f00000, 0x000);
36562306a36Sopenharmony_ci			rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000);
36662306a36Sopenharmony_ci			break;
36762306a36Sopenharmony_ci		}
36862306a36Sopenharmony_ci		fallthrough;
36962306a36Sopenharmony_ci	case 0:
37062306a36Sopenharmony_ci	case 2:
37162306a36Sopenharmony_ci	default:
37262306a36Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x77777777);
37362306a36Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77777777);
37462306a36Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x000);
37562306a36Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000);
37662306a36Sopenharmony_ci		break;
37762306a36Sopenharmony_ci	}
37862306a36Sopenharmony_ci}
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_cistatic void _rtl8812ae_phy_set_rfe_reg_5g(struct ieee80211_hw *hw)
38162306a36Sopenharmony_ci{
38262306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
38362306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
38462306a36Sopenharmony_ci	u8 tmp;
38562306a36Sopenharmony_ci
38662306a36Sopenharmony_ci	switch (rtlhal->rfe_type) {
38762306a36Sopenharmony_ci	case 0:
38862306a36Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x77337717);
38962306a36Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77337717);
39062306a36Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x010);
39162306a36Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010);
39262306a36Sopenharmony_ci		break;
39362306a36Sopenharmony_ci	case 1:
39462306a36Sopenharmony_ci		if (rtlpriv->btcoexist.bt_coexistence) {
39562306a36Sopenharmony_ci			rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xffffff, 0x337717);
39662306a36Sopenharmony_ci			rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD,
39762306a36Sopenharmony_ci				      0x77337717);
39862306a36Sopenharmony_ci			rtl_set_bbreg(hw, RA_RFE_INV, 0x33f00000, 0x000);
39962306a36Sopenharmony_ci			rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000);
40062306a36Sopenharmony_ci		} else {
40162306a36Sopenharmony_ci			rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD,
40262306a36Sopenharmony_ci				      0x77337717);
40362306a36Sopenharmony_ci			rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD,
40462306a36Sopenharmony_ci				      0x77337717);
40562306a36Sopenharmony_ci			rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x000);
40662306a36Sopenharmony_ci			rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000);
40762306a36Sopenharmony_ci		}
40862306a36Sopenharmony_ci		break;
40962306a36Sopenharmony_ci	case 3:
41062306a36Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x54337717);
41162306a36Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x54337717);
41262306a36Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x010);
41362306a36Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010);
41462306a36Sopenharmony_ci		rtl_set_bbreg(hw, 0x900, 0x00000303, 0x1);
41562306a36Sopenharmony_ci		break;
41662306a36Sopenharmony_ci	case 5:
41762306a36Sopenharmony_ci		rtl_write_byte(rtlpriv, RA_RFE_PINMUX + 2, 0x33);
41862306a36Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77337777);
41962306a36Sopenharmony_ci		tmp = rtl_read_byte(rtlpriv, RA_RFE_INV + 3);
42062306a36Sopenharmony_ci		rtl_write_byte(rtlpriv, RA_RFE_INV + 3, tmp | 0x1);
42162306a36Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010);
42262306a36Sopenharmony_ci		break;
42362306a36Sopenharmony_ci	case 2:
42462306a36Sopenharmony_ci	case 4:
42562306a36Sopenharmony_ci	default:
42662306a36Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x77337777);
42762306a36Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77337777);
42862306a36Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x010);
42962306a36Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010);
43062306a36Sopenharmony_ci		break;
43162306a36Sopenharmony_ci	}
43262306a36Sopenharmony_ci}
43362306a36Sopenharmony_ci
43462306a36Sopenharmony_ciu32 phy_get_tx_swing_8812A(struct ieee80211_hw *hw, u8	band,
43562306a36Sopenharmony_ci			   u8 rf_path)
43662306a36Sopenharmony_ci{
43762306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
43862306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
43962306a36Sopenharmony_ci	struct rtl_dm *rtldm = rtl_dm(rtlpriv);
44062306a36Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
44162306a36Sopenharmony_ci	s8 reg_swing_2g = -1;/* 0xff; */
44262306a36Sopenharmony_ci	s8 reg_swing_5g = -1;/* 0xff; */
44362306a36Sopenharmony_ci	s8 swing_2g = -1 * reg_swing_2g;
44462306a36Sopenharmony_ci	s8 swing_5g = -1 * reg_swing_5g;
44562306a36Sopenharmony_ci	u32  out = 0x200;
44662306a36Sopenharmony_ci	const s8 auto_temp = -1;
44762306a36Sopenharmony_ci
44862306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
44962306a36Sopenharmony_ci		"===> PHY_GetTXBBSwing_8812A, bbSwing_2G: %d, bbSwing_5G: %d,autoload_failflag=%d.\n",
45062306a36Sopenharmony_ci		(int)swing_2g, (int)swing_5g,
45162306a36Sopenharmony_ci		(int)rtlefuse->autoload_failflag);
45262306a36Sopenharmony_ci
45362306a36Sopenharmony_ci	if (rtlefuse->autoload_failflag) {
45462306a36Sopenharmony_ci		if (band == BAND_ON_2_4G) {
45562306a36Sopenharmony_ci			rtldm->swing_diff_2g = swing_2g;
45662306a36Sopenharmony_ci			if (swing_2g == 0) {
45762306a36Sopenharmony_ci				out = 0x200; /* 0 dB */
45862306a36Sopenharmony_ci			} else if (swing_2g == -3) {
45962306a36Sopenharmony_ci				out = 0x16A; /* -3 dB */
46062306a36Sopenharmony_ci			} else if (swing_2g == -6) {
46162306a36Sopenharmony_ci				out = 0x101; /* -6 dB */
46262306a36Sopenharmony_ci			} else if (swing_2g == -9) {
46362306a36Sopenharmony_ci				out = 0x0B6; /* -9 dB */
46462306a36Sopenharmony_ci			} else {
46562306a36Sopenharmony_ci				rtldm->swing_diff_2g = 0;
46662306a36Sopenharmony_ci				out = 0x200;
46762306a36Sopenharmony_ci			}
46862306a36Sopenharmony_ci		} else if (band == BAND_ON_5G) {
46962306a36Sopenharmony_ci			rtldm->swing_diff_5g = swing_5g;
47062306a36Sopenharmony_ci			if (swing_5g == 0) {
47162306a36Sopenharmony_ci				out = 0x200; /* 0 dB */
47262306a36Sopenharmony_ci			} else if (swing_5g == -3) {
47362306a36Sopenharmony_ci				out = 0x16A; /* -3 dB */
47462306a36Sopenharmony_ci			} else if (swing_5g == -6) {
47562306a36Sopenharmony_ci				out = 0x101; /* -6 dB */
47662306a36Sopenharmony_ci			} else if (swing_5g == -9) {
47762306a36Sopenharmony_ci				out = 0x0B6; /* -9 dB */
47862306a36Sopenharmony_ci			} else {
47962306a36Sopenharmony_ci				if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
48062306a36Sopenharmony_ci					rtldm->swing_diff_5g = -3;
48162306a36Sopenharmony_ci					out = 0x16A;
48262306a36Sopenharmony_ci				} else {
48362306a36Sopenharmony_ci					rtldm->swing_diff_5g = 0;
48462306a36Sopenharmony_ci					out = 0x200;
48562306a36Sopenharmony_ci				}
48662306a36Sopenharmony_ci			}
48762306a36Sopenharmony_ci		} else {
48862306a36Sopenharmony_ci			rtldm->swing_diff_2g = -3;
48962306a36Sopenharmony_ci			rtldm->swing_diff_5g = -3;
49062306a36Sopenharmony_ci			out = 0x16A; /* -3 dB */
49162306a36Sopenharmony_ci		}
49262306a36Sopenharmony_ci	} else {
49362306a36Sopenharmony_ci		u32 swing = 0, swing_a = 0, swing_b = 0;
49462306a36Sopenharmony_ci
49562306a36Sopenharmony_ci		if (band == BAND_ON_2_4G) {
49662306a36Sopenharmony_ci			if (reg_swing_2g == auto_temp) {
49762306a36Sopenharmony_ci				efuse_shadow_read(hw, 1, 0xC6, (u32 *)&swing);
49862306a36Sopenharmony_ci				swing = (swing == 0xFF) ? 0x00 : swing;
49962306a36Sopenharmony_ci			} else if (swing_2g ==  0) {
50062306a36Sopenharmony_ci				swing = 0x00; /* 0 dB */
50162306a36Sopenharmony_ci			} else if (swing_2g == -3) {
50262306a36Sopenharmony_ci				swing = 0x05; /* -3 dB */
50362306a36Sopenharmony_ci			} else if (swing_2g == -6) {
50462306a36Sopenharmony_ci				swing = 0x0A; /* -6 dB */
50562306a36Sopenharmony_ci			} else if (swing_2g == -9) {
50662306a36Sopenharmony_ci				swing = 0xFF; /* -9 dB */
50762306a36Sopenharmony_ci			} else {
50862306a36Sopenharmony_ci				swing = 0x00;
50962306a36Sopenharmony_ci			}
51062306a36Sopenharmony_ci		} else {
51162306a36Sopenharmony_ci			if (reg_swing_5g == auto_temp) {
51262306a36Sopenharmony_ci				efuse_shadow_read(hw, 1, 0xC7, (u32 *)&swing);
51362306a36Sopenharmony_ci				swing = (swing == 0xFF) ? 0x00 : swing;
51462306a36Sopenharmony_ci			} else if (swing_5g ==  0) {
51562306a36Sopenharmony_ci				swing = 0x00; /* 0 dB */
51662306a36Sopenharmony_ci			} else if (swing_5g == -3) {
51762306a36Sopenharmony_ci				swing = 0x05; /* -3 dB */
51862306a36Sopenharmony_ci			} else if (swing_5g == -6) {
51962306a36Sopenharmony_ci				swing = 0x0A; /* -6 dB */
52062306a36Sopenharmony_ci			} else if (swing_5g == -9) {
52162306a36Sopenharmony_ci				swing = 0xFF; /* -9 dB */
52262306a36Sopenharmony_ci			} else {
52362306a36Sopenharmony_ci				swing = 0x00;
52462306a36Sopenharmony_ci			}
52562306a36Sopenharmony_ci		}
52662306a36Sopenharmony_ci
52762306a36Sopenharmony_ci		swing_a = (swing & 0x3) >> 0; /* 0xC6/C7[1:0] */
52862306a36Sopenharmony_ci		swing_b = (swing & 0xC) >> 2; /* 0xC6/C7[3:2] */
52962306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
53062306a36Sopenharmony_ci			"===> PHY_GetTXBBSwing_8812A, swingA: 0x%X, swingB: 0x%X\n",
53162306a36Sopenharmony_ci			swing_a, swing_b);
53262306a36Sopenharmony_ci
53362306a36Sopenharmony_ci		/* 3 Path-A */
53462306a36Sopenharmony_ci		if (swing_a == 0x0) {
53562306a36Sopenharmony_ci			if (band == BAND_ON_2_4G)
53662306a36Sopenharmony_ci				rtldm->swing_diff_2g = 0;
53762306a36Sopenharmony_ci			else
53862306a36Sopenharmony_ci				rtldm->swing_diff_5g = 0;
53962306a36Sopenharmony_ci			out = 0x200; /* 0 dB */
54062306a36Sopenharmony_ci		} else if (swing_a == 0x1) {
54162306a36Sopenharmony_ci			if (band == BAND_ON_2_4G)
54262306a36Sopenharmony_ci				rtldm->swing_diff_2g = -3;
54362306a36Sopenharmony_ci			else
54462306a36Sopenharmony_ci				rtldm->swing_diff_5g = -3;
54562306a36Sopenharmony_ci			out = 0x16A; /* -3 dB */
54662306a36Sopenharmony_ci		} else if (swing_a == 0x2) {
54762306a36Sopenharmony_ci			if (band == BAND_ON_2_4G)
54862306a36Sopenharmony_ci				rtldm->swing_diff_2g = -6;
54962306a36Sopenharmony_ci			else
55062306a36Sopenharmony_ci				rtldm->swing_diff_5g = -6;
55162306a36Sopenharmony_ci			out = 0x101; /* -6 dB */
55262306a36Sopenharmony_ci		} else if (swing_a == 0x3) {
55362306a36Sopenharmony_ci			if (band == BAND_ON_2_4G)
55462306a36Sopenharmony_ci				rtldm->swing_diff_2g = -9;
55562306a36Sopenharmony_ci			else
55662306a36Sopenharmony_ci				rtldm->swing_diff_5g = -9;
55762306a36Sopenharmony_ci			out = 0x0B6; /* -9 dB */
55862306a36Sopenharmony_ci		}
55962306a36Sopenharmony_ci		/* 3 Path-B */
56062306a36Sopenharmony_ci		if (swing_b == 0x0) {
56162306a36Sopenharmony_ci			if (band == BAND_ON_2_4G)
56262306a36Sopenharmony_ci				rtldm->swing_diff_2g = 0;
56362306a36Sopenharmony_ci			else
56462306a36Sopenharmony_ci				rtldm->swing_diff_5g = 0;
56562306a36Sopenharmony_ci			out = 0x200; /* 0 dB */
56662306a36Sopenharmony_ci		} else if (swing_b == 0x1) {
56762306a36Sopenharmony_ci			if (band == BAND_ON_2_4G)
56862306a36Sopenharmony_ci				rtldm->swing_diff_2g = -3;
56962306a36Sopenharmony_ci			else
57062306a36Sopenharmony_ci				rtldm->swing_diff_5g = -3;
57162306a36Sopenharmony_ci			out = 0x16A; /* -3 dB */
57262306a36Sopenharmony_ci		} else if (swing_b == 0x2) {
57362306a36Sopenharmony_ci			if (band == BAND_ON_2_4G)
57462306a36Sopenharmony_ci				rtldm->swing_diff_2g = -6;
57562306a36Sopenharmony_ci			else
57662306a36Sopenharmony_ci				rtldm->swing_diff_5g = -6;
57762306a36Sopenharmony_ci			out = 0x101; /* -6 dB */
57862306a36Sopenharmony_ci		} else if (swing_b == 0x3) {
57962306a36Sopenharmony_ci			if (band == BAND_ON_2_4G)
58062306a36Sopenharmony_ci				rtldm->swing_diff_2g = -9;
58162306a36Sopenharmony_ci			else
58262306a36Sopenharmony_ci				rtldm->swing_diff_5g = -9;
58362306a36Sopenharmony_ci			out = 0x0B6; /* -9 dB */
58462306a36Sopenharmony_ci		}
58562306a36Sopenharmony_ci	}
58662306a36Sopenharmony_ci
58762306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
58862306a36Sopenharmony_ci		"<=== PHY_GetTXBBSwing_8812A, out = 0x%X\n", out);
58962306a36Sopenharmony_ci	return out;
59062306a36Sopenharmony_ci}
59162306a36Sopenharmony_ci
59262306a36Sopenharmony_civoid rtl8821ae_phy_switch_wirelessband(struct ieee80211_hw *hw, u8 band)
59362306a36Sopenharmony_ci{
59462306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
59562306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
59662306a36Sopenharmony_ci	struct rtl_dm *rtldm = rtl_dm(rtlpriv);
59762306a36Sopenharmony_ci	u8 current_band = rtlhal->current_bandtype;
59862306a36Sopenharmony_ci	s8 bb_diff_between_band;
59962306a36Sopenharmony_ci
60062306a36Sopenharmony_ci	rtl8821ae_phy_query_bb_reg(hw, RTXPATH, 0xf0);
60162306a36Sopenharmony_ci	rtl8821ae_phy_query_bb_reg(hw, RCCK_RX, 0x0f000000);
60262306a36Sopenharmony_ci	rtlhal->current_bandtype = (enum band_type) band;
60362306a36Sopenharmony_ci	/* reconfig BB/RF according to wireless mode */
60462306a36Sopenharmony_ci	if (rtlhal->current_bandtype == BAND_ON_2_4G) {
60562306a36Sopenharmony_ci		/* BB & RF Config */
60662306a36Sopenharmony_ci		rtl_set_bbreg(hw, ROFDMCCKEN, BOFDMEN|BCCKEN, 0x03);
60762306a36Sopenharmony_ci
60862306a36Sopenharmony_ci		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
60962306a36Sopenharmony_ci			/* 0xCB0[15:12] = 0x7 (LNA_On)*/
61062306a36Sopenharmony_ci			rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF000, 0x7);
61162306a36Sopenharmony_ci			/* 0xCB0[7:4] = 0x7 (PAPE_A)*/
61262306a36Sopenharmony_ci			rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF0, 0x7);
61362306a36Sopenharmony_ci		}
61462306a36Sopenharmony_ci
61562306a36Sopenharmony_ci		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
61662306a36Sopenharmony_ci			/*0x834[1:0] = 0x1*/
61762306a36Sopenharmony_ci			rtl_set_bbreg(hw, 0x834, 0x3, 0x1);
61862306a36Sopenharmony_ci		}
61962306a36Sopenharmony_ci
62062306a36Sopenharmony_ci		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
62162306a36Sopenharmony_ci			/* 0xC1C[11:8] = 0 */
62262306a36Sopenharmony_ci			rtl_set_bbreg(hw, RA_TXSCALE, 0xF00, 0);
62362306a36Sopenharmony_ci		} else {
62462306a36Sopenharmony_ci			/* 0x82C[1:0] = 2b'00 */
62562306a36Sopenharmony_ci			rtl_set_bbreg(hw, 0x82c, 0x3, 0);
62662306a36Sopenharmony_ci		}
62762306a36Sopenharmony_ci
62862306a36Sopenharmony_ci		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
62962306a36Sopenharmony_ci			_rtl8812ae_phy_set_rfe_reg_24g(hw);
63062306a36Sopenharmony_ci
63162306a36Sopenharmony_ci		rtl_set_bbreg(hw, RTXPATH, 0xf0, 0x1);
63262306a36Sopenharmony_ci		rtl_set_bbreg(hw, RCCK_RX, 0x0f000000, 0x1);
63362306a36Sopenharmony_ci
63462306a36Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_CCK_CHECK, 0x0);
63562306a36Sopenharmony_ci	} else {/* 5G band */
63662306a36Sopenharmony_ci		u16 count, reg_41a;
63762306a36Sopenharmony_ci
63862306a36Sopenharmony_ci		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
63962306a36Sopenharmony_ci			/*0xCB0[15:12] = 0x5 (LNA_On)*/
64062306a36Sopenharmony_ci			rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF000, 0x5);
64162306a36Sopenharmony_ci			/*0xCB0[7:4] = 0x4 (PAPE_A)*/
64262306a36Sopenharmony_ci			rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF0, 0x4);
64362306a36Sopenharmony_ci		}
64462306a36Sopenharmony_ci		/*CCK_CHECK_en*/
64562306a36Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_CCK_CHECK, 0x80);
64662306a36Sopenharmony_ci
64762306a36Sopenharmony_ci		count = 0;
64862306a36Sopenharmony_ci		reg_41a = rtl_read_word(rtlpriv, REG_TXPKT_EMPTY);
64962306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
65062306a36Sopenharmony_ci			"Reg41A value %d\n", reg_41a);
65162306a36Sopenharmony_ci		reg_41a &= 0x30;
65262306a36Sopenharmony_ci		while ((reg_41a != 0x30) && (count < 50)) {
65362306a36Sopenharmony_ci			udelay(50);
65462306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD, "Delay 50us\n");
65562306a36Sopenharmony_ci
65662306a36Sopenharmony_ci			reg_41a = rtl_read_word(rtlpriv, REG_TXPKT_EMPTY);
65762306a36Sopenharmony_ci			reg_41a &= 0x30;
65862306a36Sopenharmony_ci			count++;
65962306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
66062306a36Sopenharmony_ci				"Reg41A value %d\n", reg_41a);
66162306a36Sopenharmony_ci		}
66262306a36Sopenharmony_ci		if (count != 0)
66362306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD,
66462306a36Sopenharmony_ci				"PHY_SwitchWirelessBand8812(): Switch to 5G Band. Count = %d reg41A=0x%x\n",
66562306a36Sopenharmony_ci				count, reg_41a);
66662306a36Sopenharmony_ci
66762306a36Sopenharmony_ci		/* 2012/02/01, Sinda add registry to switch workaround
66862306a36Sopenharmony_ci		without long-run verification for scan issue. */
66962306a36Sopenharmony_ci		rtl_set_bbreg(hw, ROFDMCCKEN, BOFDMEN|BCCKEN, 0x03);
67062306a36Sopenharmony_ci
67162306a36Sopenharmony_ci		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
67262306a36Sopenharmony_ci			/*0x834[1:0] = 0x2*/
67362306a36Sopenharmony_ci			rtl_set_bbreg(hw, 0x834, 0x3, 0x2);
67462306a36Sopenharmony_ci		}
67562306a36Sopenharmony_ci
67662306a36Sopenharmony_ci		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
67762306a36Sopenharmony_ci			/* AGC table select */
67862306a36Sopenharmony_ci			/* 0xC1C[11:8] = 1*/
67962306a36Sopenharmony_ci			rtl_set_bbreg(hw, RA_TXSCALE, 0xF00, 1);
68062306a36Sopenharmony_ci		} else
68162306a36Sopenharmony_ci			/* 0x82C[1:0] = 2'b00 */
68262306a36Sopenharmony_ci			rtl_set_bbreg(hw, 0x82c, 0x3, 1);
68362306a36Sopenharmony_ci
68462306a36Sopenharmony_ci		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
68562306a36Sopenharmony_ci			_rtl8812ae_phy_set_rfe_reg_5g(hw);
68662306a36Sopenharmony_ci
68762306a36Sopenharmony_ci		rtl_set_bbreg(hw, RTXPATH, 0xf0, 0);
68862306a36Sopenharmony_ci		rtl_set_bbreg(hw, RCCK_RX, 0x0f000000, 0xf);
68962306a36Sopenharmony_ci
69062306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
69162306a36Sopenharmony_ci			"==>PHY_SwitchWirelessBand8812() BAND_ON_5G settings OFDM index 0x%x\n",
69262306a36Sopenharmony_ci			rtlpriv->dm.ofdm_index[RF90_PATH_A]);
69362306a36Sopenharmony_ci	}
69462306a36Sopenharmony_ci
69562306a36Sopenharmony_ci	if ((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) ||
69662306a36Sopenharmony_ci	    (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)) {
69762306a36Sopenharmony_ci		/* 0xC1C[31:21] */
69862306a36Sopenharmony_ci		rtl_set_bbreg(hw, RA_TXSCALE, 0xFFE00000,
69962306a36Sopenharmony_ci			      phy_get_tx_swing_8812A(hw, band, RF90_PATH_A));
70062306a36Sopenharmony_ci		/* 0xE1C[31:21] */
70162306a36Sopenharmony_ci		rtl_set_bbreg(hw, RB_TXSCALE, 0xFFE00000,
70262306a36Sopenharmony_ci			      phy_get_tx_swing_8812A(hw, band, RF90_PATH_B));
70362306a36Sopenharmony_ci
70462306a36Sopenharmony_ci		/* <20121005, Kordan> When TxPowerTrack is ON,
70562306a36Sopenharmony_ci		 *	we should take care of the change of BB swing.
70662306a36Sopenharmony_ci		 *   That is, reset all info to trigger Tx power tracking.
70762306a36Sopenharmony_ci		 */
70862306a36Sopenharmony_ci		if (band != current_band) {
70962306a36Sopenharmony_ci			bb_diff_between_band =
71062306a36Sopenharmony_ci				(rtldm->swing_diff_2g - rtldm->swing_diff_5g);
71162306a36Sopenharmony_ci			bb_diff_between_band = (band == BAND_ON_2_4G) ?
71262306a36Sopenharmony_ci						bb_diff_between_band :
71362306a36Sopenharmony_ci						(-1 * bb_diff_between_band);
71462306a36Sopenharmony_ci			rtldm->default_ofdm_index += bb_diff_between_band * 2;
71562306a36Sopenharmony_ci		}
71662306a36Sopenharmony_ci		rtl8821ae_dm_clear_txpower_tracking_state(hw);
71762306a36Sopenharmony_ci	}
71862306a36Sopenharmony_ci
71962306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE,
72062306a36Sopenharmony_ci		"<==%s():Switch Band OK.\n", __func__);
72162306a36Sopenharmony_ci	return;
72262306a36Sopenharmony_ci}
72362306a36Sopenharmony_ci
72462306a36Sopenharmony_cistatic bool _rtl8821ae_check_positive(struct ieee80211_hw *hw,
72562306a36Sopenharmony_ci				      const u32 condition1,
72662306a36Sopenharmony_ci				      const u32 condition2)
72762306a36Sopenharmony_ci{
72862306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
72962306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
73062306a36Sopenharmony_ci	u32 cut_ver = ((rtlhal->version & CHIP_VER_RTL_MASK)
73162306a36Sopenharmony_ci					>> CHIP_VER_RTL_SHIFT);
73262306a36Sopenharmony_ci	u32 intf = (rtlhal->interface == INTF_USB ? BIT(1) : BIT(0));
73362306a36Sopenharmony_ci
73462306a36Sopenharmony_ci	u8  board_type = ((rtlhal->board_type & BIT(4)) >> 4) << 0 | /* _GLNA */
73562306a36Sopenharmony_ci			 ((rtlhal->board_type & BIT(3)) >> 3) << 1 | /* _GPA  */
73662306a36Sopenharmony_ci			 ((rtlhal->board_type & BIT(7)) >> 7) << 2 | /* _ALNA */
73762306a36Sopenharmony_ci			 ((rtlhal->board_type & BIT(6)) >> 6) << 3 | /* _APA  */
73862306a36Sopenharmony_ci			 ((rtlhal->board_type & BIT(2)) >> 2) << 4;  /* _BT   */
73962306a36Sopenharmony_ci
74062306a36Sopenharmony_ci	u32 cond1 = condition1, cond2 = condition2;
74162306a36Sopenharmony_ci	u32 driver1 = cut_ver << 24 |	/* CUT ver */
74262306a36Sopenharmony_ci		      0 << 20 |			/* interface 2/2 */
74362306a36Sopenharmony_ci		      0x04 << 16 |		/* platform */
74462306a36Sopenharmony_ci		      rtlhal->package_type << 12 |
74562306a36Sopenharmony_ci		      intf << 8 |			/* interface 1/2 */
74662306a36Sopenharmony_ci		      board_type;
74762306a36Sopenharmony_ci
74862306a36Sopenharmony_ci	u32 driver2 = rtlhal->type_glna <<  0 |
74962306a36Sopenharmony_ci		      rtlhal->type_gpa  <<  8 |
75062306a36Sopenharmony_ci		      rtlhal->type_alna << 16 |
75162306a36Sopenharmony_ci		      rtlhal->type_apa  << 24;
75262306a36Sopenharmony_ci
75362306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
75462306a36Sopenharmony_ci		"===> [8812A] CheckPositive (cond1, cond2) = (0x%X 0x%X)\n",
75562306a36Sopenharmony_ci		cond1, cond2);
75662306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
75762306a36Sopenharmony_ci		"===> [8812A] CheckPositive (driver1, driver2) = (0x%X 0x%X)\n",
75862306a36Sopenharmony_ci		driver1, driver2);
75962306a36Sopenharmony_ci
76062306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
76162306a36Sopenharmony_ci		"	(Platform, Interface) = (0x%X, 0x%X)\n", 0x04, intf);
76262306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
76362306a36Sopenharmony_ci		"	(Board, Package) = (0x%X, 0x%X)\n",
76462306a36Sopenharmony_ci		rtlhal->board_type, rtlhal->package_type);
76562306a36Sopenharmony_ci
76662306a36Sopenharmony_ci	/*============== Value Defined Check ===============*/
76762306a36Sopenharmony_ci	/*QFN Type [15:12] and Cut Version [27:24] need to do value check*/
76862306a36Sopenharmony_ci
76962306a36Sopenharmony_ci	if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) !=
77062306a36Sopenharmony_ci		(driver1 & 0x0000F000)))
77162306a36Sopenharmony_ci		return false;
77262306a36Sopenharmony_ci	if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) !=
77362306a36Sopenharmony_ci		(driver1 & 0x0F000000)))
77462306a36Sopenharmony_ci		return false;
77562306a36Sopenharmony_ci
77662306a36Sopenharmony_ci	/*=============== Bit Defined Check ================*/
77762306a36Sopenharmony_ci	/* We don't care [31:28] */
77862306a36Sopenharmony_ci
77962306a36Sopenharmony_ci	cond1   &= 0x00FF0FFF;
78062306a36Sopenharmony_ci	driver1 &= 0x00FF0FFF;
78162306a36Sopenharmony_ci
78262306a36Sopenharmony_ci	if ((cond1 & driver1) == cond1) {
78362306a36Sopenharmony_ci		u32 mask = 0;
78462306a36Sopenharmony_ci
78562306a36Sopenharmony_ci		if ((cond1 & 0x0F) == 0) /* BoardType is DONTCARE*/
78662306a36Sopenharmony_ci			return true;
78762306a36Sopenharmony_ci
78862306a36Sopenharmony_ci		if ((cond1 & BIT(0)) != 0) /*GLNA*/
78962306a36Sopenharmony_ci			mask |= 0x000000FF;
79062306a36Sopenharmony_ci		if ((cond1 & BIT(1)) != 0) /*GPA*/
79162306a36Sopenharmony_ci			mask |= 0x0000FF00;
79262306a36Sopenharmony_ci		if ((cond1 & BIT(2)) != 0) /*ALNA*/
79362306a36Sopenharmony_ci			mask |= 0x00FF0000;
79462306a36Sopenharmony_ci		if ((cond1 & BIT(3)) != 0) /*APA*/
79562306a36Sopenharmony_ci			mask |= 0xFF000000;
79662306a36Sopenharmony_ci
79762306a36Sopenharmony_ci		/* BoardType of each RF path is matched*/
79862306a36Sopenharmony_ci		if ((cond2 & mask) == (driver2 & mask))
79962306a36Sopenharmony_ci			return true;
80062306a36Sopenharmony_ci		else
80162306a36Sopenharmony_ci			return false;
80262306a36Sopenharmony_ci	} else
80362306a36Sopenharmony_ci		return false;
80462306a36Sopenharmony_ci}
80562306a36Sopenharmony_ci
80662306a36Sopenharmony_cistatic bool _rtl8821ae_check_condition(struct ieee80211_hw *hw,
80762306a36Sopenharmony_ci				       const u32 condition)
80862306a36Sopenharmony_ci{
80962306a36Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
81062306a36Sopenharmony_ci	u32 _board = rtlefuse->board_type; /*need efuse define*/
81162306a36Sopenharmony_ci	u32 _interface = 0x01; /* ODM_ITRF_PCIE */
81262306a36Sopenharmony_ci	u32 _platform = 0x08;/* ODM_WIN */
81362306a36Sopenharmony_ci	u32 cond = condition;
81462306a36Sopenharmony_ci
81562306a36Sopenharmony_ci	if (condition == 0xCDCDCDCD)
81662306a36Sopenharmony_ci		return true;
81762306a36Sopenharmony_ci
81862306a36Sopenharmony_ci	cond = condition & 0xFF;
81962306a36Sopenharmony_ci	if ((_board != cond) && cond != 0xFF)
82062306a36Sopenharmony_ci		return false;
82162306a36Sopenharmony_ci
82262306a36Sopenharmony_ci	cond = condition & 0xFF00;
82362306a36Sopenharmony_ci	cond = cond >> 8;
82462306a36Sopenharmony_ci	if ((_interface & cond) == 0 && cond != 0x07)
82562306a36Sopenharmony_ci		return false;
82662306a36Sopenharmony_ci
82762306a36Sopenharmony_ci	cond = condition & 0xFF0000;
82862306a36Sopenharmony_ci	cond = cond >> 16;
82962306a36Sopenharmony_ci	if ((_platform & cond) == 0 && cond != 0x0F)
83062306a36Sopenharmony_ci		return false;
83162306a36Sopenharmony_ci	return true;
83262306a36Sopenharmony_ci}
83362306a36Sopenharmony_ci
83462306a36Sopenharmony_cistatic void _rtl8821ae_config_rf_reg(struct ieee80211_hw *hw,
83562306a36Sopenharmony_ci				     u32 addr, u32 data,
83662306a36Sopenharmony_ci				     enum radio_path rfpath, u32 regaddr)
83762306a36Sopenharmony_ci{
83862306a36Sopenharmony_ci	if (addr == 0xfe || addr == 0xffe) {
83962306a36Sopenharmony_ci		/* In order not to disturb BT music when
84062306a36Sopenharmony_ci		 * wifi init.(1ant NIC only)
84162306a36Sopenharmony_ci		 */
84262306a36Sopenharmony_ci		mdelay(50);
84362306a36Sopenharmony_ci	} else {
84462306a36Sopenharmony_ci		rtl_set_rfreg(hw, rfpath, regaddr, RFREG_OFFSET_MASK, data);
84562306a36Sopenharmony_ci		udelay(1);
84662306a36Sopenharmony_ci	}
84762306a36Sopenharmony_ci}
84862306a36Sopenharmony_ci
84962306a36Sopenharmony_cistatic void _rtl8821ae_config_rf_radio_a(struct ieee80211_hw *hw,
85062306a36Sopenharmony_ci					 u32 addr, u32 data)
85162306a36Sopenharmony_ci{
85262306a36Sopenharmony_ci	u32 content = 0x1000; /*RF Content: radio_a_txt*/
85362306a36Sopenharmony_ci	u32 maskforphyset = (u32)(content & 0xE000);
85462306a36Sopenharmony_ci
85562306a36Sopenharmony_ci	_rtl8821ae_config_rf_reg(hw, addr, data,
85662306a36Sopenharmony_ci				 RF90_PATH_A, addr | maskforphyset);
85762306a36Sopenharmony_ci}
85862306a36Sopenharmony_ci
85962306a36Sopenharmony_cistatic void _rtl8821ae_config_rf_radio_b(struct ieee80211_hw *hw,
86062306a36Sopenharmony_ci					 u32 addr, u32 data)
86162306a36Sopenharmony_ci{
86262306a36Sopenharmony_ci	u32 content = 0x1001; /*RF Content: radio_b_txt*/
86362306a36Sopenharmony_ci	u32 maskforphyset = (u32)(content & 0xE000);
86462306a36Sopenharmony_ci
86562306a36Sopenharmony_ci	_rtl8821ae_config_rf_reg(hw, addr, data,
86662306a36Sopenharmony_ci				 RF90_PATH_B, addr | maskforphyset);
86762306a36Sopenharmony_ci}
86862306a36Sopenharmony_ci
86962306a36Sopenharmony_cistatic void _rtl8821ae_config_bb_reg(struct ieee80211_hw *hw,
87062306a36Sopenharmony_ci				     u32 addr, u32 data)
87162306a36Sopenharmony_ci{
87262306a36Sopenharmony_ci	if (addr == 0xfe)
87362306a36Sopenharmony_ci		mdelay(50);
87462306a36Sopenharmony_ci	else if (addr == 0xfd)
87562306a36Sopenharmony_ci		mdelay(5);
87662306a36Sopenharmony_ci	else if (addr == 0xfc)
87762306a36Sopenharmony_ci		mdelay(1);
87862306a36Sopenharmony_ci	else if (addr == 0xfb)
87962306a36Sopenharmony_ci		udelay(50);
88062306a36Sopenharmony_ci	else if (addr == 0xfa)
88162306a36Sopenharmony_ci		udelay(5);
88262306a36Sopenharmony_ci	else if (addr == 0xf9)
88362306a36Sopenharmony_ci		udelay(1);
88462306a36Sopenharmony_ci	else
88562306a36Sopenharmony_ci		rtl_set_bbreg(hw, addr, MASKDWORD, data);
88662306a36Sopenharmony_ci
88762306a36Sopenharmony_ci	udelay(1);
88862306a36Sopenharmony_ci}
88962306a36Sopenharmony_ci
89062306a36Sopenharmony_cistatic void _rtl8821ae_phy_init_tx_power_by_rate(struct ieee80211_hw *hw)
89162306a36Sopenharmony_ci{
89262306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
89362306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
89462306a36Sopenharmony_ci	u8 band, rfpath, txnum, rate_section;
89562306a36Sopenharmony_ci
89662306a36Sopenharmony_ci	for (band = BAND_ON_2_4G; band <= BAND_ON_5G; ++band)
89762306a36Sopenharmony_ci		for (rfpath = 0; rfpath < TX_PWR_BY_RATE_NUM_RF; ++rfpath)
89862306a36Sopenharmony_ci			for (txnum = 0; txnum < TX_PWR_BY_RATE_NUM_RF; ++txnum)
89962306a36Sopenharmony_ci				for (rate_section = 0;
90062306a36Sopenharmony_ci				     rate_section < TX_PWR_BY_RATE_NUM_SECTION;
90162306a36Sopenharmony_ci				     ++rate_section)
90262306a36Sopenharmony_ci					rtlphy->tx_power_by_rate_offset[band]
90362306a36Sopenharmony_ci					    [rfpath][txnum][rate_section] = 0;
90462306a36Sopenharmony_ci}
90562306a36Sopenharmony_ci
90662306a36Sopenharmony_cistatic void _rtl8821ae_phy_set_txpower_by_rate_base(struct ieee80211_hw *hw,
90762306a36Sopenharmony_ci					  u8 band, u8 path,
90862306a36Sopenharmony_ci					  u8 rate_section,
90962306a36Sopenharmony_ci					  u8 txnum, u8 value)
91062306a36Sopenharmony_ci{
91162306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
91262306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
91362306a36Sopenharmony_ci
91462306a36Sopenharmony_ci	if (path > RF90_PATH_D) {
91562306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
91662306a36Sopenharmony_ci			"Invalid Rf Path %d in phy_SetTxPowerByRatBase()\n", path);
91762306a36Sopenharmony_ci		return;
91862306a36Sopenharmony_ci	}
91962306a36Sopenharmony_ci
92062306a36Sopenharmony_ci	if (band == BAND_ON_2_4G) {
92162306a36Sopenharmony_ci		switch (rate_section) {
92262306a36Sopenharmony_ci		case CCK:
92362306a36Sopenharmony_ci			rtlphy->txpwr_by_rate_base_24g[path][txnum][0] = value;
92462306a36Sopenharmony_ci			break;
92562306a36Sopenharmony_ci		case OFDM:
92662306a36Sopenharmony_ci			rtlphy->txpwr_by_rate_base_24g[path][txnum][1] = value;
92762306a36Sopenharmony_ci			break;
92862306a36Sopenharmony_ci		case HT_MCS0_MCS7:
92962306a36Sopenharmony_ci			rtlphy->txpwr_by_rate_base_24g[path][txnum][2] = value;
93062306a36Sopenharmony_ci			break;
93162306a36Sopenharmony_ci		case HT_MCS8_MCS15:
93262306a36Sopenharmony_ci			rtlphy->txpwr_by_rate_base_24g[path][txnum][3] = value;
93362306a36Sopenharmony_ci			break;
93462306a36Sopenharmony_ci		case VHT_1SSMCS0_1SSMCS9:
93562306a36Sopenharmony_ci			rtlphy->txpwr_by_rate_base_24g[path][txnum][4] = value;
93662306a36Sopenharmony_ci			break;
93762306a36Sopenharmony_ci		case VHT_2SSMCS0_2SSMCS9:
93862306a36Sopenharmony_ci			rtlphy->txpwr_by_rate_base_24g[path][txnum][5] = value;
93962306a36Sopenharmony_ci			break;
94062306a36Sopenharmony_ci		default:
94162306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
94262306a36Sopenharmony_ci				"Invalid RateSection %d in Band 2.4G,Rf Path %d, %dTx in PHY_SetTxPowerByRateBase()\n",
94362306a36Sopenharmony_ci				rate_section, path, txnum);
94462306a36Sopenharmony_ci			break;
94562306a36Sopenharmony_ci		}
94662306a36Sopenharmony_ci	} else if (band == BAND_ON_5G) {
94762306a36Sopenharmony_ci		switch (rate_section) {
94862306a36Sopenharmony_ci		case OFDM:
94962306a36Sopenharmony_ci			rtlphy->txpwr_by_rate_base_5g[path][txnum][0] = value;
95062306a36Sopenharmony_ci			break;
95162306a36Sopenharmony_ci		case HT_MCS0_MCS7:
95262306a36Sopenharmony_ci			rtlphy->txpwr_by_rate_base_5g[path][txnum][1] = value;
95362306a36Sopenharmony_ci			break;
95462306a36Sopenharmony_ci		case HT_MCS8_MCS15:
95562306a36Sopenharmony_ci			rtlphy->txpwr_by_rate_base_5g[path][txnum][2] = value;
95662306a36Sopenharmony_ci			break;
95762306a36Sopenharmony_ci		case VHT_1SSMCS0_1SSMCS9:
95862306a36Sopenharmony_ci			rtlphy->txpwr_by_rate_base_5g[path][txnum][3] = value;
95962306a36Sopenharmony_ci			break;
96062306a36Sopenharmony_ci		case VHT_2SSMCS0_2SSMCS9:
96162306a36Sopenharmony_ci			rtlphy->txpwr_by_rate_base_5g[path][txnum][4] = value;
96262306a36Sopenharmony_ci			break;
96362306a36Sopenharmony_ci		default:
96462306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
96562306a36Sopenharmony_ci				"Invalid RateSection %d in Band 5G, Rf Path %d, %dTx in PHY_SetTxPowerByRateBase()\n",
96662306a36Sopenharmony_ci				rate_section, path, txnum);
96762306a36Sopenharmony_ci			break;
96862306a36Sopenharmony_ci		}
96962306a36Sopenharmony_ci	} else {
97062306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
97162306a36Sopenharmony_ci			"Invalid Band %d in PHY_SetTxPowerByRateBase()\n", band);
97262306a36Sopenharmony_ci	}
97362306a36Sopenharmony_ci}
97462306a36Sopenharmony_ci
97562306a36Sopenharmony_cistatic u8 _rtl8821ae_phy_get_txpower_by_rate_base(struct ieee80211_hw *hw,
97662306a36Sopenharmony_ci						  u8 band, u8 path,
97762306a36Sopenharmony_ci						  u8 txnum, u8 rate_section)
97862306a36Sopenharmony_ci{
97962306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
98062306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
98162306a36Sopenharmony_ci	u8 value = 0;
98262306a36Sopenharmony_ci
98362306a36Sopenharmony_ci	if (path > RF90_PATH_D) {
98462306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
98562306a36Sopenharmony_ci			"Invalid Rf Path %d in PHY_GetTxPowerByRateBase()\n",
98662306a36Sopenharmony_ci			path);
98762306a36Sopenharmony_ci		return 0;
98862306a36Sopenharmony_ci	}
98962306a36Sopenharmony_ci
99062306a36Sopenharmony_ci	if (band == BAND_ON_2_4G) {
99162306a36Sopenharmony_ci		switch (rate_section) {
99262306a36Sopenharmony_ci		case CCK:
99362306a36Sopenharmony_ci			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][0];
99462306a36Sopenharmony_ci			break;
99562306a36Sopenharmony_ci		case OFDM:
99662306a36Sopenharmony_ci			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][1];
99762306a36Sopenharmony_ci			break;
99862306a36Sopenharmony_ci		case HT_MCS0_MCS7:
99962306a36Sopenharmony_ci			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][2];
100062306a36Sopenharmony_ci			break;
100162306a36Sopenharmony_ci		case HT_MCS8_MCS15:
100262306a36Sopenharmony_ci			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][3];
100362306a36Sopenharmony_ci			break;
100462306a36Sopenharmony_ci		case VHT_1SSMCS0_1SSMCS9:
100562306a36Sopenharmony_ci			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][4];
100662306a36Sopenharmony_ci			break;
100762306a36Sopenharmony_ci		case VHT_2SSMCS0_2SSMCS9:
100862306a36Sopenharmony_ci			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][5];
100962306a36Sopenharmony_ci			break;
101062306a36Sopenharmony_ci		default:
101162306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
101262306a36Sopenharmony_ci				"Invalid RateSection %d in Band 2.4G, Rf Path %d, %dTx in PHY_GetTxPowerByRateBase()\n",
101362306a36Sopenharmony_ci				rate_section, path, txnum);
101462306a36Sopenharmony_ci			break;
101562306a36Sopenharmony_ci		}
101662306a36Sopenharmony_ci	} else if (band == BAND_ON_5G) {
101762306a36Sopenharmony_ci		switch (rate_section) {
101862306a36Sopenharmony_ci		case OFDM:
101962306a36Sopenharmony_ci			value = rtlphy->txpwr_by_rate_base_5g[path][txnum][0];
102062306a36Sopenharmony_ci			break;
102162306a36Sopenharmony_ci		case HT_MCS0_MCS7:
102262306a36Sopenharmony_ci			value = rtlphy->txpwr_by_rate_base_5g[path][txnum][1];
102362306a36Sopenharmony_ci			break;
102462306a36Sopenharmony_ci		case HT_MCS8_MCS15:
102562306a36Sopenharmony_ci			value = rtlphy->txpwr_by_rate_base_5g[path][txnum][2];
102662306a36Sopenharmony_ci			break;
102762306a36Sopenharmony_ci		case VHT_1SSMCS0_1SSMCS9:
102862306a36Sopenharmony_ci			value = rtlphy->txpwr_by_rate_base_5g[path][txnum][3];
102962306a36Sopenharmony_ci			break;
103062306a36Sopenharmony_ci		case VHT_2SSMCS0_2SSMCS9:
103162306a36Sopenharmony_ci			value = rtlphy->txpwr_by_rate_base_5g[path][txnum][4];
103262306a36Sopenharmony_ci			break;
103362306a36Sopenharmony_ci		default:
103462306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
103562306a36Sopenharmony_ci				"Invalid RateSection %d in Band 5G, Rf Path %d, %dTx in PHY_GetTxPowerByRateBase()\n",
103662306a36Sopenharmony_ci				rate_section, path, txnum);
103762306a36Sopenharmony_ci			break;
103862306a36Sopenharmony_ci		}
103962306a36Sopenharmony_ci	} else {
104062306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
104162306a36Sopenharmony_ci			"Invalid Band %d in PHY_GetTxPowerByRateBase()\n", band);
104262306a36Sopenharmony_ci	}
104362306a36Sopenharmony_ci
104462306a36Sopenharmony_ci	return value;
104562306a36Sopenharmony_ci}
104662306a36Sopenharmony_ci
104762306a36Sopenharmony_cistatic void _rtl8821ae_phy_store_txpower_by_rate_base(struct ieee80211_hw *hw)
104862306a36Sopenharmony_ci{
104962306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
105062306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
105162306a36Sopenharmony_ci	u16 rawvalue = 0;
105262306a36Sopenharmony_ci	u8 base = 0, path = 0;
105362306a36Sopenharmony_ci
105462306a36Sopenharmony_ci	for (path = RF90_PATH_A; path <= RF90_PATH_B; ++path) {
105562306a36Sopenharmony_ci		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][0] >> 24) & 0xFF;
105662306a36Sopenharmony_ci		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
105762306a36Sopenharmony_ci		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, CCK, RF_1TX, base);
105862306a36Sopenharmony_ci
105962306a36Sopenharmony_ci		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][2] >> 24) & 0xFF;
106062306a36Sopenharmony_ci		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
106162306a36Sopenharmony_ci		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, OFDM, RF_1TX, base);
106262306a36Sopenharmony_ci
106362306a36Sopenharmony_ci		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][4] >> 24) & 0xFF;
106462306a36Sopenharmony_ci		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
106562306a36Sopenharmony_ci		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, HT_MCS0_MCS7, RF_1TX, base);
106662306a36Sopenharmony_ci
106762306a36Sopenharmony_ci		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_2TX][6] >> 24) & 0xFF;
106862306a36Sopenharmony_ci		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
106962306a36Sopenharmony_ci		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, HT_MCS8_MCS15, RF_2TX, base);
107062306a36Sopenharmony_ci
107162306a36Sopenharmony_ci		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][8] >> 24) & 0xFF;
107262306a36Sopenharmony_ci		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
107362306a36Sopenharmony_ci		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, VHT_1SSMCS0_1SSMCS9, RF_1TX, base);
107462306a36Sopenharmony_ci
107562306a36Sopenharmony_ci		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_2TX][11] >> 8) & 0xFF;
107662306a36Sopenharmony_ci		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
107762306a36Sopenharmony_ci		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, VHT_2SSMCS0_2SSMCS9, RF_2TX, base);
107862306a36Sopenharmony_ci
107962306a36Sopenharmony_ci		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_1TX][2] >> 24) & 0xFF;
108062306a36Sopenharmony_ci		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
108162306a36Sopenharmony_ci		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, OFDM, RF_1TX, base);
108262306a36Sopenharmony_ci
108362306a36Sopenharmony_ci		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_1TX][4] >> 24) & 0xFF;
108462306a36Sopenharmony_ci		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
108562306a36Sopenharmony_ci		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, HT_MCS0_MCS7, RF_1TX, base);
108662306a36Sopenharmony_ci
108762306a36Sopenharmony_ci		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_2TX][6] >> 24) & 0xFF;
108862306a36Sopenharmony_ci		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
108962306a36Sopenharmony_ci		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, HT_MCS8_MCS15, RF_2TX, base);
109062306a36Sopenharmony_ci
109162306a36Sopenharmony_ci		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_1TX][8] >> 24) & 0xFF;
109262306a36Sopenharmony_ci		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
109362306a36Sopenharmony_ci		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, VHT_1SSMCS0_1SSMCS9, RF_1TX, base);
109462306a36Sopenharmony_ci
109562306a36Sopenharmony_ci		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_2TX][11] >> 8) & 0xFF;
109662306a36Sopenharmony_ci		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
109762306a36Sopenharmony_ci		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, VHT_2SSMCS0_2SSMCS9, RF_2TX, base);
109862306a36Sopenharmony_ci	}
109962306a36Sopenharmony_ci}
110062306a36Sopenharmony_ci
110162306a36Sopenharmony_cistatic void _phy_convert_txpower_dbm_to_relative_value(u32 *data, u8 start,
110262306a36Sopenharmony_ci						u8 end, u8 base_val)
110362306a36Sopenharmony_ci{
110462306a36Sopenharmony_ci	int i;
110562306a36Sopenharmony_ci	u8 temp_value = 0;
110662306a36Sopenharmony_ci	u32 temp_data = 0;
110762306a36Sopenharmony_ci
110862306a36Sopenharmony_ci	for (i = 3; i >= 0; --i) {
110962306a36Sopenharmony_ci		if (i >= start && i <= end) {
111062306a36Sopenharmony_ci			/* Get the exact value */
111162306a36Sopenharmony_ci			temp_value = (u8)(*data >> (i * 8)) & 0xF;
111262306a36Sopenharmony_ci			temp_value += ((u8)((*data >> (i * 8 + 4)) & 0xF)) * 10;
111362306a36Sopenharmony_ci
111462306a36Sopenharmony_ci			/* Change the value to a relative value */
111562306a36Sopenharmony_ci			temp_value = (temp_value > base_val) ? temp_value -
111662306a36Sopenharmony_ci					base_val : base_val - temp_value;
111762306a36Sopenharmony_ci		} else {
111862306a36Sopenharmony_ci			temp_value = (u8)(*data >> (i * 8)) & 0xFF;
111962306a36Sopenharmony_ci		}
112062306a36Sopenharmony_ci		temp_data <<= 8;
112162306a36Sopenharmony_ci		temp_data |= temp_value;
112262306a36Sopenharmony_ci	}
112362306a36Sopenharmony_ci	*data = temp_data;
112462306a36Sopenharmony_ci}
112562306a36Sopenharmony_ci
112662306a36Sopenharmony_cistatic void _rtl8812ae_phy_cross_reference_ht_and_vht_txpower_limit(struct ieee80211_hw *hw)
112762306a36Sopenharmony_ci{
112862306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
112962306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
113062306a36Sopenharmony_ci	u8 regulation, bw, channel, rate_section;
113162306a36Sopenharmony_ci	s8 temp_pwrlmt = 0;
113262306a36Sopenharmony_ci
113362306a36Sopenharmony_ci	for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {
113462306a36Sopenharmony_ci		for (bw = 0; bw < MAX_5G_BANDWIDTH_NUM; ++bw) {
113562306a36Sopenharmony_ci			for (channel = 0; channel < CHANNEL_MAX_NUMBER_5G; ++channel) {
113662306a36Sopenharmony_ci				for (rate_section = 0; rate_section < MAX_RATE_SECTION_NUM; ++rate_section) {
113762306a36Sopenharmony_ci					temp_pwrlmt = rtlphy->txpwr_limit_5g[regulation]
113862306a36Sopenharmony_ci						[bw][rate_section][channel][RF90_PATH_A];
113962306a36Sopenharmony_ci					if (temp_pwrlmt == MAX_POWER_INDEX) {
114062306a36Sopenharmony_ci						if (bw == 0 || bw == 1) { /*5G 20M 40M VHT and HT can cross reference*/
114162306a36Sopenharmony_ci							rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
114262306a36Sopenharmony_ci								"No power limit table of the specified band %d, bandwidth %d, ratesection %d, channel %d, rf path %d\n",
114362306a36Sopenharmony_ci								1, bw, rate_section, channel, RF90_PATH_A);
114462306a36Sopenharmony_ci							if (rate_section == 2) {
114562306a36Sopenharmony_ci								rtlphy->txpwr_limit_5g[regulation][bw][2][channel][RF90_PATH_A] =
114662306a36Sopenharmony_ci									rtlphy->txpwr_limit_5g[regulation][bw][4][channel][RF90_PATH_A];
114762306a36Sopenharmony_ci							} else if (rate_section == 4) {
114862306a36Sopenharmony_ci								rtlphy->txpwr_limit_5g[regulation][bw][4][channel][RF90_PATH_A] =
114962306a36Sopenharmony_ci									rtlphy->txpwr_limit_5g[regulation][bw][2][channel][RF90_PATH_A];
115062306a36Sopenharmony_ci							} else if (rate_section == 3) {
115162306a36Sopenharmony_ci								rtlphy->txpwr_limit_5g[regulation][bw][3][channel][RF90_PATH_A] =
115262306a36Sopenharmony_ci									rtlphy->txpwr_limit_5g[regulation][bw][5][channel][RF90_PATH_A];
115362306a36Sopenharmony_ci							} else if (rate_section == 5) {
115462306a36Sopenharmony_ci								rtlphy->txpwr_limit_5g[regulation][bw][5][channel][RF90_PATH_A] =
115562306a36Sopenharmony_ci									rtlphy->txpwr_limit_5g[regulation][bw][3][channel][RF90_PATH_A];
115662306a36Sopenharmony_ci							}
115762306a36Sopenharmony_ci
115862306a36Sopenharmony_ci							rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
115962306a36Sopenharmony_ci								"use other value %d\n",
116062306a36Sopenharmony_ci								temp_pwrlmt);
116162306a36Sopenharmony_ci						}
116262306a36Sopenharmony_ci					}
116362306a36Sopenharmony_ci				}
116462306a36Sopenharmony_ci			}
116562306a36Sopenharmony_ci		}
116662306a36Sopenharmony_ci	}
116762306a36Sopenharmony_ci}
116862306a36Sopenharmony_ci
116962306a36Sopenharmony_cistatic u8 _rtl8812ae_phy_get_txpower_by_rate_base_index(struct ieee80211_hw *hw,
117062306a36Sopenharmony_ci						   enum band_type band, u8 rate)
117162306a36Sopenharmony_ci{
117262306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
117362306a36Sopenharmony_ci	u8 index = 0;
117462306a36Sopenharmony_ci	if (band == BAND_ON_2_4G) {
117562306a36Sopenharmony_ci		switch (rate) {
117662306a36Sopenharmony_ci		case MGN_1M:
117762306a36Sopenharmony_ci		case MGN_2M:
117862306a36Sopenharmony_ci		case MGN_5_5M:
117962306a36Sopenharmony_ci		case MGN_11M:
118062306a36Sopenharmony_ci			index = 0;
118162306a36Sopenharmony_ci			break;
118262306a36Sopenharmony_ci
118362306a36Sopenharmony_ci		case MGN_6M:
118462306a36Sopenharmony_ci		case MGN_9M:
118562306a36Sopenharmony_ci		case MGN_12M:
118662306a36Sopenharmony_ci		case MGN_18M:
118762306a36Sopenharmony_ci		case MGN_24M:
118862306a36Sopenharmony_ci		case MGN_36M:
118962306a36Sopenharmony_ci		case MGN_48M:
119062306a36Sopenharmony_ci		case MGN_54M:
119162306a36Sopenharmony_ci			index = 1;
119262306a36Sopenharmony_ci			break;
119362306a36Sopenharmony_ci
119462306a36Sopenharmony_ci		case MGN_MCS0:
119562306a36Sopenharmony_ci		case MGN_MCS1:
119662306a36Sopenharmony_ci		case MGN_MCS2:
119762306a36Sopenharmony_ci		case MGN_MCS3:
119862306a36Sopenharmony_ci		case MGN_MCS4:
119962306a36Sopenharmony_ci		case MGN_MCS5:
120062306a36Sopenharmony_ci		case MGN_MCS6:
120162306a36Sopenharmony_ci		case MGN_MCS7:
120262306a36Sopenharmony_ci			index = 2;
120362306a36Sopenharmony_ci			break;
120462306a36Sopenharmony_ci
120562306a36Sopenharmony_ci		case MGN_MCS8:
120662306a36Sopenharmony_ci		case MGN_MCS9:
120762306a36Sopenharmony_ci		case MGN_MCS10:
120862306a36Sopenharmony_ci		case MGN_MCS11:
120962306a36Sopenharmony_ci		case MGN_MCS12:
121062306a36Sopenharmony_ci		case MGN_MCS13:
121162306a36Sopenharmony_ci		case MGN_MCS14:
121262306a36Sopenharmony_ci		case MGN_MCS15:
121362306a36Sopenharmony_ci			index = 3;
121462306a36Sopenharmony_ci			break;
121562306a36Sopenharmony_ci
121662306a36Sopenharmony_ci		default:
121762306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
121862306a36Sopenharmony_ci				"Wrong rate 0x%x to obtain index in 2.4G in PHY_GetTxPowerByRateBaseIndex()\n",
121962306a36Sopenharmony_ci				rate);
122062306a36Sopenharmony_ci			break;
122162306a36Sopenharmony_ci		}
122262306a36Sopenharmony_ci	} else if (band == BAND_ON_5G) {
122362306a36Sopenharmony_ci		switch (rate) {
122462306a36Sopenharmony_ci		case MGN_6M:
122562306a36Sopenharmony_ci		case MGN_9M:
122662306a36Sopenharmony_ci		case MGN_12M:
122762306a36Sopenharmony_ci		case MGN_18M:
122862306a36Sopenharmony_ci		case MGN_24M:
122962306a36Sopenharmony_ci		case MGN_36M:
123062306a36Sopenharmony_ci		case MGN_48M:
123162306a36Sopenharmony_ci		case MGN_54M:
123262306a36Sopenharmony_ci			index = 0;
123362306a36Sopenharmony_ci			break;
123462306a36Sopenharmony_ci
123562306a36Sopenharmony_ci		case MGN_MCS0:
123662306a36Sopenharmony_ci		case MGN_MCS1:
123762306a36Sopenharmony_ci		case MGN_MCS2:
123862306a36Sopenharmony_ci		case MGN_MCS3:
123962306a36Sopenharmony_ci		case MGN_MCS4:
124062306a36Sopenharmony_ci		case MGN_MCS5:
124162306a36Sopenharmony_ci		case MGN_MCS6:
124262306a36Sopenharmony_ci		case MGN_MCS7:
124362306a36Sopenharmony_ci			index = 1;
124462306a36Sopenharmony_ci			break;
124562306a36Sopenharmony_ci
124662306a36Sopenharmony_ci		case MGN_MCS8:
124762306a36Sopenharmony_ci		case MGN_MCS9:
124862306a36Sopenharmony_ci		case MGN_MCS10:
124962306a36Sopenharmony_ci		case MGN_MCS11:
125062306a36Sopenharmony_ci		case MGN_MCS12:
125162306a36Sopenharmony_ci		case MGN_MCS13:
125262306a36Sopenharmony_ci		case MGN_MCS14:
125362306a36Sopenharmony_ci		case MGN_MCS15:
125462306a36Sopenharmony_ci			index = 2;
125562306a36Sopenharmony_ci			break;
125662306a36Sopenharmony_ci
125762306a36Sopenharmony_ci		case MGN_VHT1SS_MCS0:
125862306a36Sopenharmony_ci		case MGN_VHT1SS_MCS1:
125962306a36Sopenharmony_ci		case MGN_VHT1SS_MCS2:
126062306a36Sopenharmony_ci		case MGN_VHT1SS_MCS3:
126162306a36Sopenharmony_ci		case MGN_VHT1SS_MCS4:
126262306a36Sopenharmony_ci		case MGN_VHT1SS_MCS5:
126362306a36Sopenharmony_ci		case MGN_VHT1SS_MCS6:
126462306a36Sopenharmony_ci		case MGN_VHT1SS_MCS7:
126562306a36Sopenharmony_ci		case MGN_VHT1SS_MCS8:
126662306a36Sopenharmony_ci		case MGN_VHT1SS_MCS9:
126762306a36Sopenharmony_ci			index = 3;
126862306a36Sopenharmony_ci			break;
126962306a36Sopenharmony_ci
127062306a36Sopenharmony_ci		case MGN_VHT2SS_MCS0:
127162306a36Sopenharmony_ci		case MGN_VHT2SS_MCS1:
127262306a36Sopenharmony_ci		case MGN_VHT2SS_MCS2:
127362306a36Sopenharmony_ci		case MGN_VHT2SS_MCS3:
127462306a36Sopenharmony_ci		case MGN_VHT2SS_MCS4:
127562306a36Sopenharmony_ci		case MGN_VHT2SS_MCS5:
127662306a36Sopenharmony_ci		case MGN_VHT2SS_MCS6:
127762306a36Sopenharmony_ci		case MGN_VHT2SS_MCS7:
127862306a36Sopenharmony_ci		case MGN_VHT2SS_MCS8:
127962306a36Sopenharmony_ci		case MGN_VHT2SS_MCS9:
128062306a36Sopenharmony_ci			index = 4;
128162306a36Sopenharmony_ci			break;
128262306a36Sopenharmony_ci
128362306a36Sopenharmony_ci		default:
128462306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
128562306a36Sopenharmony_ci				"Wrong rate 0x%x to obtain index in 5G in PHY_GetTxPowerByRateBaseIndex()\n",
128662306a36Sopenharmony_ci				rate);
128762306a36Sopenharmony_ci			break;
128862306a36Sopenharmony_ci		}
128962306a36Sopenharmony_ci	}
129062306a36Sopenharmony_ci
129162306a36Sopenharmony_ci	return index;
129262306a36Sopenharmony_ci}
129362306a36Sopenharmony_ci
129462306a36Sopenharmony_cistatic void _rtl8812ae_phy_convert_txpower_limit_to_power_index(struct ieee80211_hw *hw)
129562306a36Sopenharmony_ci{
129662306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
129762306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
129862306a36Sopenharmony_ci	u8 bw40_pwr_base_dbm2_4G, bw40_pwr_base_dbm5G;
129962306a36Sopenharmony_ci	u8 regulation, bw, channel, rate_section;
130062306a36Sopenharmony_ci	u8 base_index2_4G = 0;
130162306a36Sopenharmony_ci	u8 base_index5G = 0;
130262306a36Sopenharmony_ci	s8 temp_value = 0, temp_pwrlmt = 0;
130362306a36Sopenharmony_ci	u8 rf_path = 0;
130462306a36Sopenharmony_ci
130562306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
130662306a36Sopenharmony_ci		"=====> _rtl8812ae_phy_convert_txpower_limit_to_power_index()\n");
130762306a36Sopenharmony_ci
130862306a36Sopenharmony_ci	_rtl8812ae_phy_cross_reference_ht_and_vht_txpower_limit(hw);
130962306a36Sopenharmony_ci
131062306a36Sopenharmony_ci	for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {
131162306a36Sopenharmony_ci		for (bw = 0; bw < MAX_2_4G_BANDWIDTH_NUM; ++bw) {
131262306a36Sopenharmony_ci			for (channel = 0; channel < CHANNEL_MAX_NUMBER_2G; ++channel) {
131362306a36Sopenharmony_ci				for (rate_section = 0; rate_section < MAX_RATE_SECTION_NUM; ++rate_section) {
131462306a36Sopenharmony_ci					/* obtain the base dBm values in 2.4G band
131562306a36Sopenharmony_ci					 CCK => 11M, OFDM => 54M, HT 1T => MCS7, HT 2T => MCS15*/
131662306a36Sopenharmony_ci					if (rate_section == 0) { /*CCK*/
131762306a36Sopenharmony_ci						base_index2_4G =
131862306a36Sopenharmony_ci							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
131962306a36Sopenharmony_ci							BAND_ON_2_4G, MGN_11M);
132062306a36Sopenharmony_ci					} else if (rate_section == 1) { /*OFDM*/
132162306a36Sopenharmony_ci						base_index2_4G =
132262306a36Sopenharmony_ci							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
132362306a36Sopenharmony_ci							BAND_ON_2_4G, MGN_54M);
132462306a36Sopenharmony_ci					} else if (rate_section == 2) { /*HT IT*/
132562306a36Sopenharmony_ci						base_index2_4G =
132662306a36Sopenharmony_ci							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
132762306a36Sopenharmony_ci							BAND_ON_2_4G, MGN_MCS7);
132862306a36Sopenharmony_ci					} else if (rate_section == 3) { /*HT 2T*/
132962306a36Sopenharmony_ci						base_index2_4G =
133062306a36Sopenharmony_ci							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
133162306a36Sopenharmony_ci							BAND_ON_2_4G, MGN_MCS15);
133262306a36Sopenharmony_ci					}
133362306a36Sopenharmony_ci
133462306a36Sopenharmony_ci					temp_pwrlmt = rtlphy->txpwr_limit_2_4g[regulation]
133562306a36Sopenharmony_ci						[bw][rate_section][channel][RF90_PATH_A];
133662306a36Sopenharmony_ci
133762306a36Sopenharmony_ci					for (rf_path = RF90_PATH_A;
133862306a36Sopenharmony_ci						rf_path < MAX_RF_PATH_NUM;
133962306a36Sopenharmony_ci						++rf_path) {
134062306a36Sopenharmony_ci						if (rate_section == 3)
134162306a36Sopenharmony_ci							bw40_pwr_base_dbm2_4G =
134262306a36Sopenharmony_ci							rtlphy->txpwr_by_rate_base_24g[rf_path][RF_2TX][base_index2_4G];
134362306a36Sopenharmony_ci						else
134462306a36Sopenharmony_ci							bw40_pwr_base_dbm2_4G =
134562306a36Sopenharmony_ci							rtlphy->txpwr_by_rate_base_24g[rf_path][RF_1TX][base_index2_4G];
134662306a36Sopenharmony_ci
134762306a36Sopenharmony_ci						if (temp_pwrlmt != MAX_POWER_INDEX) {
134862306a36Sopenharmony_ci							temp_value = temp_pwrlmt - bw40_pwr_base_dbm2_4G;
134962306a36Sopenharmony_ci							rtlphy->txpwr_limit_2_4g[regulation]
135062306a36Sopenharmony_ci								[bw][rate_section][channel][rf_path] =
135162306a36Sopenharmony_ci								temp_value;
135262306a36Sopenharmony_ci						}
135362306a36Sopenharmony_ci
135462306a36Sopenharmony_ci						rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
135562306a36Sopenharmony_ci							"TxPwrLimit_2_4G[regulation %d][bw %d][rateSection %d][channel %d] = %d\n(TxPwrLimit in dBm %d - BW40PwrLmt2_4G[channel %d][rfpath %d] %d)\n",
135662306a36Sopenharmony_ci							regulation, bw, rate_section, channel,
135762306a36Sopenharmony_ci							rtlphy->txpwr_limit_2_4g[regulation][bw]
135862306a36Sopenharmony_ci							[rate_section][channel][rf_path], (temp_pwrlmt == 63)
135962306a36Sopenharmony_ci							? 0 : temp_pwrlmt/2, channel, rf_path,
136062306a36Sopenharmony_ci							bw40_pwr_base_dbm2_4G);
136162306a36Sopenharmony_ci					}
136262306a36Sopenharmony_ci				}
136362306a36Sopenharmony_ci			}
136462306a36Sopenharmony_ci		}
136562306a36Sopenharmony_ci	}
136662306a36Sopenharmony_ci	for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {
136762306a36Sopenharmony_ci		for (bw = 0; bw < MAX_5G_BANDWIDTH_NUM; ++bw) {
136862306a36Sopenharmony_ci			for (channel = 0; channel < CHANNEL_MAX_NUMBER_5G; ++channel) {
136962306a36Sopenharmony_ci				for (rate_section = 0; rate_section < MAX_RATE_SECTION_NUM; ++rate_section) {
137062306a36Sopenharmony_ci					/* obtain the base dBm values in 5G band
137162306a36Sopenharmony_ci					 OFDM => 54M, HT 1T => MCS7, HT 2T => MCS15,
137262306a36Sopenharmony_ci					VHT => 1SSMCS7, VHT 2T => 2SSMCS7*/
137362306a36Sopenharmony_ci					if (rate_section == 1) { /*OFDM*/
137462306a36Sopenharmony_ci						base_index5G =
137562306a36Sopenharmony_ci							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
137662306a36Sopenharmony_ci							BAND_ON_5G, MGN_54M);
137762306a36Sopenharmony_ci					} else if (rate_section == 2) { /*HT 1T*/
137862306a36Sopenharmony_ci						base_index5G =
137962306a36Sopenharmony_ci							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
138062306a36Sopenharmony_ci							BAND_ON_5G, MGN_MCS7);
138162306a36Sopenharmony_ci					} else if (rate_section == 3) { /*HT 2T*/
138262306a36Sopenharmony_ci						base_index5G =
138362306a36Sopenharmony_ci							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
138462306a36Sopenharmony_ci							BAND_ON_5G, MGN_MCS15);
138562306a36Sopenharmony_ci					} else if (rate_section == 4) { /*VHT 1T*/
138662306a36Sopenharmony_ci						base_index5G =
138762306a36Sopenharmony_ci							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
138862306a36Sopenharmony_ci							BAND_ON_5G, MGN_VHT1SS_MCS7);
138962306a36Sopenharmony_ci					} else if (rate_section == 5) { /*VHT 2T*/
139062306a36Sopenharmony_ci						base_index5G =
139162306a36Sopenharmony_ci							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
139262306a36Sopenharmony_ci							BAND_ON_5G, MGN_VHT2SS_MCS7);
139362306a36Sopenharmony_ci					}
139462306a36Sopenharmony_ci
139562306a36Sopenharmony_ci					temp_pwrlmt = rtlphy->txpwr_limit_5g[regulation]
139662306a36Sopenharmony_ci						[bw][rate_section][channel]
139762306a36Sopenharmony_ci						[RF90_PATH_A];
139862306a36Sopenharmony_ci
139962306a36Sopenharmony_ci					for (rf_path = RF90_PATH_A;
140062306a36Sopenharmony_ci					     rf_path < MAX_RF_PATH_NUM;
140162306a36Sopenharmony_ci					     ++rf_path) {
140262306a36Sopenharmony_ci						if (rate_section == 3 || rate_section == 5)
140362306a36Sopenharmony_ci							bw40_pwr_base_dbm5G =
140462306a36Sopenharmony_ci							rtlphy->txpwr_by_rate_base_5g[rf_path]
140562306a36Sopenharmony_ci							[RF_2TX][base_index5G];
140662306a36Sopenharmony_ci						else
140762306a36Sopenharmony_ci							bw40_pwr_base_dbm5G =
140862306a36Sopenharmony_ci							rtlphy->txpwr_by_rate_base_5g[rf_path]
140962306a36Sopenharmony_ci							[RF_1TX][base_index5G];
141062306a36Sopenharmony_ci
141162306a36Sopenharmony_ci						if (temp_pwrlmt != MAX_POWER_INDEX) {
141262306a36Sopenharmony_ci							temp_value =
141362306a36Sopenharmony_ci								temp_pwrlmt - bw40_pwr_base_dbm5G;
141462306a36Sopenharmony_ci							rtlphy->txpwr_limit_5g[regulation]
141562306a36Sopenharmony_ci								[bw][rate_section][channel]
141662306a36Sopenharmony_ci								[rf_path] = temp_value;
141762306a36Sopenharmony_ci						}
141862306a36Sopenharmony_ci
141962306a36Sopenharmony_ci						rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
142062306a36Sopenharmony_ci							"TxPwrLimit_5G[regulation %d][bw %d][rateSection %d][channel %d] =%d\n(TxPwrLimit in dBm %d - BW40PwrLmt5G[chnl group %d][rfpath %d] %d)\n",
142162306a36Sopenharmony_ci							regulation, bw, rate_section,
142262306a36Sopenharmony_ci							channel, rtlphy->txpwr_limit_5g[regulation]
142362306a36Sopenharmony_ci							[bw][rate_section][channel][rf_path],
142462306a36Sopenharmony_ci							temp_pwrlmt, channel, rf_path, bw40_pwr_base_dbm5G);
142562306a36Sopenharmony_ci					}
142662306a36Sopenharmony_ci				}
142762306a36Sopenharmony_ci			}
142862306a36Sopenharmony_ci		}
142962306a36Sopenharmony_ci	}
143062306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
143162306a36Sopenharmony_ci		"<===== %s()\n", __func__);
143262306a36Sopenharmony_ci}
143362306a36Sopenharmony_ci
143462306a36Sopenharmony_cistatic void _rtl8821ae_phy_init_txpower_limit(struct ieee80211_hw *hw)
143562306a36Sopenharmony_ci{
143662306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
143762306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
143862306a36Sopenharmony_ci	u8 i, j, k, l, m;
143962306a36Sopenharmony_ci
144062306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
144162306a36Sopenharmony_ci		"=====>`%s()!\n", __func__);
144262306a36Sopenharmony_ci
144362306a36Sopenharmony_ci	for (i = 0; i < MAX_REGULATION_NUM; ++i) {
144462306a36Sopenharmony_ci		for (j = 0; j < MAX_2_4G_BANDWIDTH_NUM; ++j)
144562306a36Sopenharmony_ci			for (k = 0; k < MAX_RATE_SECTION_NUM; ++k)
144662306a36Sopenharmony_ci				for (m = 0; m < CHANNEL_MAX_NUMBER_2G; ++m)
144762306a36Sopenharmony_ci					for (l = 0; l < MAX_RF_PATH_NUM; ++l)
144862306a36Sopenharmony_ci						rtlphy->txpwr_limit_2_4g
144962306a36Sopenharmony_ci								[i][j][k][m][l]
145062306a36Sopenharmony_ci							= MAX_POWER_INDEX;
145162306a36Sopenharmony_ci	}
145262306a36Sopenharmony_ci	for (i = 0; i < MAX_REGULATION_NUM; ++i) {
145362306a36Sopenharmony_ci		for (j = 0; j < MAX_5G_BANDWIDTH_NUM; ++j)
145462306a36Sopenharmony_ci			for (k = 0; k < MAX_RATE_SECTION_NUM; ++k)
145562306a36Sopenharmony_ci				for (m = 0; m < CHANNEL_MAX_NUMBER_5G; ++m)
145662306a36Sopenharmony_ci					for (l = 0; l < MAX_RF_PATH_NUM; ++l)
145762306a36Sopenharmony_ci						rtlphy->txpwr_limit_5g
145862306a36Sopenharmony_ci								[i][j][k][m][l]
145962306a36Sopenharmony_ci							= MAX_POWER_INDEX;
146062306a36Sopenharmony_ci	}
146162306a36Sopenharmony_ci
146262306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
146362306a36Sopenharmony_ci		"<===== %s()!\n", __func__);
146462306a36Sopenharmony_ci}
146562306a36Sopenharmony_ci
146662306a36Sopenharmony_cistatic void _rtl8821ae_phy_convert_txpower_dbm_to_relative_value(struct ieee80211_hw *hw)
146762306a36Sopenharmony_ci{
146862306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
146962306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
147062306a36Sopenharmony_ci	u8 base = 0, rfpath = 0;
147162306a36Sopenharmony_ci
147262306a36Sopenharmony_ci	for (rfpath = RF90_PATH_A; rfpath <= RF90_PATH_B; ++rfpath) {
147362306a36Sopenharmony_ci		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath, RF_1TX, CCK);
147462306a36Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
147562306a36Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][0],
147662306a36Sopenharmony_ci			0, 3, base);
147762306a36Sopenharmony_ci
147862306a36Sopenharmony_ci		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath, RF_1TX, OFDM);
147962306a36Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
148062306a36Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][1],
148162306a36Sopenharmony_ci			0, 3, base);
148262306a36Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
148362306a36Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][2],
148462306a36Sopenharmony_ci			0, 3, base);
148562306a36Sopenharmony_ci
148662306a36Sopenharmony_ci		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath, RF_1TX, HT_MCS0_MCS7);
148762306a36Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
148862306a36Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][3],
148962306a36Sopenharmony_ci			0, 3, base);
149062306a36Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
149162306a36Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][4],
149262306a36Sopenharmony_ci			0, 3, base);
149362306a36Sopenharmony_ci
149462306a36Sopenharmony_ci		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath, RF_2TX, HT_MCS8_MCS15);
149562306a36Sopenharmony_ci
149662306a36Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
149762306a36Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_2TX][5],
149862306a36Sopenharmony_ci			0, 3, base);
149962306a36Sopenharmony_ci
150062306a36Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
150162306a36Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_2TX][6],
150262306a36Sopenharmony_ci			0, 3, base);
150362306a36Sopenharmony_ci
150462306a36Sopenharmony_ci		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath, RF_1TX, VHT_1SSMCS0_1SSMCS9);
150562306a36Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
150662306a36Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][7],
150762306a36Sopenharmony_ci			0, 3, base);
150862306a36Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
150962306a36Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][8],
151062306a36Sopenharmony_ci			0, 3, base);
151162306a36Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
151262306a36Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][9],
151362306a36Sopenharmony_ci			0, 1, base);
151462306a36Sopenharmony_ci
151562306a36Sopenharmony_ci		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath, RF_2TX, VHT_2SSMCS0_2SSMCS9);
151662306a36Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
151762306a36Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][9],
151862306a36Sopenharmony_ci			2, 3, base);
151962306a36Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
152062306a36Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_2TX][10],
152162306a36Sopenharmony_ci			0, 3, base);
152262306a36Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
152362306a36Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_2TX][11],
152462306a36Sopenharmony_ci			0, 3, base);
152562306a36Sopenharmony_ci
152662306a36Sopenharmony_ci		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfpath, RF_1TX, OFDM);
152762306a36Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
152862306a36Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][1],
152962306a36Sopenharmony_ci			0, 3, base);
153062306a36Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
153162306a36Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][2],
153262306a36Sopenharmony_ci			0, 3, base);
153362306a36Sopenharmony_ci
153462306a36Sopenharmony_ci		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfpath, RF_1TX, HT_MCS0_MCS7);
153562306a36Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
153662306a36Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][3],
153762306a36Sopenharmony_ci			0, 3, base);
153862306a36Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
153962306a36Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][4],
154062306a36Sopenharmony_ci			0, 3, base);
154162306a36Sopenharmony_ci
154262306a36Sopenharmony_ci		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfpath, RF_2TX, HT_MCS8_MCS15);
154362306a36Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
154462306a36Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_2TX][5],
154562306a36Sopenharmony_ci			0, 3, base);
154662306a36Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
154762306a36Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_2TX][6],
154862306a36Sopenharmony_ci			0, 3, base);
154962306a36Sopenharmony_ci
155062306a36Sopenharmony_ci		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfpath, RF_1TX, VHT_1SSMCS0_1SSMCS9);
155162306a36Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
155262306a36Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][7],
155362306a36Sopenharmony_ci			0, 3, base);
155462306a36Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
155562306a36Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][8],
155662306a36Sopenharmony_ci			0, 3, base);
155762306a36Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
155862306a36Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][9],
155962306a36Sopenharmony_ci			0, 1, base);
156062306a36Sopenharmony_ci
156162306a36Sopenharmony_ci		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfpath, RF_2TX, VHT_2SSMCS0_2SSMCS9);
156262306a36Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
156362306a36Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][9],
156462306a36Sopenharmony_ci			2, 3, base);
156562306a36Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
156662306a36Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_2TX][10],
156762306a36Sopenharmony_ci			0, 3, base);
156862306a36Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
156962306a36Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_2TX][11],
157062306a36Sopenharmony_ci			0, 3, base);
157162306a36Sopenharmony_ci	}
157262306a36Sopenharmony_ci
157362306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_POWER, DBG_TRACE,
157462306a36Sopenharmony_ci		"<===_rtl8821ae_phy_convert_txpower_dbm_to_relative_value()\n");
157562306a36Sopenharmony_ci}
157662306a36Sopenharmony_ci
157762306a36Sopenharmony_cistatic void _rtl8821ae_phy_txpower_by_rate_configuration(struct ieee80211_hw *hw)
157862306a36Sopenharmony_ci{
157962306a36Sopenharmony_ci	_rtl8821ae_phy_store_txpower_by_rate_base(hw);
158062306a36Sopenharmony_ci	_rtl8821ae_phy_convert_txpower_dbm_to_relative_value(hw);
158162306a36Sopenharmony_ci}
158262306a36Sopenharmony_ci
158362306a36Sopenharmony_ci/* string is in decimal */
158462306a36Sopenharmony_cistatic bool _rtl8812ae_get_integer_from_string(const char *str, u8 *pint)
158562306a36Sopenharmony_ci{
158662306a36Sopenharmony_ci	u16 i = 0;
158762306a36Sopenharmony_ci	*pint = 0;
158862306a36Sopenharmony_ci
158962306a36Sopenharmony_ci	while (str[i] != '\0') {
159062306a36Sopenharmony_ci		if (str[i] >= '0' && str[i] <= '9') {
159162306a36Sopenharmony_ci			*pint *= 10;
159262306a36Sopenharmony_ci			*pint += (str[i] - '0');
159362306a36Sopenharmony_ci		} else {
159462306a36Sopenharmony_ci			return false;
159562306a36Sopenharmony_ci		}
159662306a36Sopenharmony_ci		++i;
159762306a36Sopenharmony_ci	}
159862306a36Sopenharmony_ci
159962306a36Sopenharmony_ci	return true;
160062306a36Sopenharmony_ci}
160162306a36Sopenharmony_ci
160262306a36Sopenharmony_cistatic s8 _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(struct ieee80211_hw *hw,
160362306a36Sopenharmony_ci					      u8 band, u8 channel)
160462306a36Sopenharmony_ci{
160562306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
160662306a36Sopenharmony_ci	s8 channel_index = -1;
160762306a36Sopenharmony_ci	u8  i = 0;
160862306a36Sopenharmony_ci
160962306a36Sopenharmony_ci	if (band == BAND_ON_2_4G)
161062306a36Sopenharmony_ci		channel_index = channel - 1;
161162306a36Sopenharmony_ci	else if (band == BAND_ON_5G) {
161262306a36Sopenharmony_ci		for (i = 0; i < sizeof(channel5g)/sizeof(u8); ++i) {
161362306a36Sopenharmony_ci			if (channel5g[i] == channel)
161462306a36Sopenharmony_ci				channel_index = i;
161562306a36Sopenharmony_ci		}
161662306a36Sopenharmony_ci	} else
161762306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, "Invalid Band %d in %s\n",
161862306a36Sopenharmony_ci			band,  __func__);
161962306a36Sopenharmony_ci
162062306a36Sopenharmony_ci	if (channel_index == -1)
162162306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
162262306a36Sopenharmony_ci			"Invalid Channel %d of Band %d in %s\n", channel,
162362306a36Sopenharmony_ci			band, __func__);
162462306a36Sopenharmony_ci
162562306a36Sopenharmony_ci	return channel_index;
162662306a36Sopenharmony_ci}
162762306a36Sopenharmony_ci
162862306a36Sopenharmony_cistatic void _rtl8812ae_phy_set_txpower_limit(struct ieee80211_hw *hw,
162962306a36Sopenharmony_ci				      const char *pregulation,
163062306a36Sopenharmony_ci				      const char *pband, const char *pbandwidth,
163162306a36Sopenharmony_ci				      const char *prate_section, const char *prf_path,
163262306a36Sopenharmony_ci				      const char *pchannel, const char *ppower_limit)
163362306a36Sopenharmony_ci{
163462306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
163562306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
163662306a36Sopenharmony_ci	u8 regulation = 0, bandwidth = 0, rate_section = 0, channel;
163762306a36Sopenharmony_ci	u8 channel_index;
163862306a36Sopenharmony_ci	s8 power_limit = 0, prev_power_limit, ret;
163962306a36Sopenharmony_ci
164062306a36Sopenharmony_ci	if (!_rtl8812ae_get_integer_from_string(pchannel, &channel) ||
164162306a36Sopenharmony_ci	    !_rtl8812ae_get_integer_from_string(ppower_limit,
164262306a36Sopenharmony_ci						&power_limit)) {
164362306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
164462306a36Sopenharmony_ci			"Illegal index of pwr_lmt table [chnl %d][val %d]\n",
164562306a36Sopenharmony_ci			channel, power_limit);
164662306a36Sopenharmony_ci	}
164762306a36Sopenharmony_ci
164862306a36Sopenharmony_ci	power_limit = power_limit > MAX_POWER_INDEX ?
164962306a36Sopenharmony_ci		      MAX_POWER_INDEX : power_limit;
165062306a36Sopenharmony_ci
165162306a36Sopenharmony_ci	if (strcmp(pregulation, "FCC") == 0)
165262306a36Sopenharmony_ci		regulation = 0;
165362306a36Sopenharmony_ci	else if (strcmp(pregulation, "MKK") == 0)
165462306a36Sopenharmony_ci		regulation = 1;
165562306a36Sopenharmony_ci	else if (strcmp(pregulation, "ETSI") == 0)
165662306a36Sopenharmony_ci		regulation = 2;
165762306a36Sopenharmony_ci	else if (strcmp(pregulation, "WW13") == 0)
165862306a36Sopenharmony_ci		regulation = 3;
165962306a36Sopenharmony_ci
166062306a36Sopenharmony_ci	if (strcmp(prate_section, "CCK") == 0)
166162306a36Sopenharmony_ci		rate_section = 0;
166262306a36Sopenharmony_ci	else if (strcmp(prate_section, "OFDM") == 0)
166362306a36Sopenharmony_ci		rate_section = 1;
166462306a36Sopenharmony_ci	else if (strcmp(prate_section, "HT") == 0 &&
166562306a36Sopenharmony_ci		 strcmp(prf_path, "1T") == 0)
166662306a36Sopenharmony_ci		rate_section = 2;
166762306a36Sopenharmony_ci	else if (strcmp(prate_section, "HT") == 0 &&
166862306a36Sopenharmony_ci		 strcmp(prf_path, "2T") == 0)
166962306a36Sopenharmony_ci		rate_section = 3;
167062306a36Sopenharmony_ci	else if (strcmp(prate_section, "VHT") == 0 &&
167162306a36Sopenharmony_ci		 strcmp(prf_path, "1T") == 0)
167262306a36Sopenharmony_ci		rate_section = 4;
167362306a36Sopenharmony_ci	else if (strcmp(prate_section, "VHT") == 0 &&
167462306a36Sopenharmony_ci		 strcmp(prf_path, "2T") == 0)
167562306a36Sopenharmony_ci		rate_section = 5;
167662306a36Sopenharmony_ci
167762306a36Sopenharmony_ci	if (strcmp(pbandwidth, "20M") == 0)
167862306a36Sopenharmony_ci		bandwidth = 0;
167962306a36Sopenharmony_ci	else if (strcmp(pbandwidth, "40M") == 0)
168062306a36Sopenharmony_ci		bandwidth = 1;
168162306a36Sopenharmony_ci	else if (strcmp(pbandwidth, "80M") == 0)
168262306a36Sopenharmony_ci		bandwidth = 2;
168362306a36Sopenharmony_ci	else if (strcmp(pbandwidth, "160M") == 0)
168462306a36Sopenharmony_ci		bandwidth = 3;
168562306a36Sopenharmony_ci
168662306a36Sopenharmony_ci	if (strcmp(pband, "2.4G") == 0) {
168762306a36Sopenharmony_ci		ret = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw,
168862306a36Sopenharmony_ci							       BAND_ON_2_4G,
168962306a36Sopenharmony_ci							       channel);
169062306a36Sopenharmony_ci
169162306a36Sopenharmony_ci		if (ret == -1)
169262306a36Sopenharmony_ci			return;
169362306a36Sopenharmony_ci
169462306a36Sopenharmony_ci		channel_index = ret;
169562306a36Sopenharmony_ci
169662306a36Sopenharmony_ci		prev_power_limit = rtlphy->txpwr_limit_2_4g[regulation]
169762306a36Sopenharmony_ci						[bandwidth][rate_section]
169862306a36Sopenharmony_ci						[channel_index][RF90_PATH_A];
169962306a36Sopenharmony_ci
170062306a36Sopenharmony_ci		if (power_limit < prev_power_limit)
170162306a36Sopenharmony_ci			rtlphy->txpwr_limit_2_4g[regulation][bandwidth]
170262306a36Sopenharmony_ci				[rate_section][channel_index][RF90_PATH_A] =
170362306a36Sopenharmony_ci								   power_limit;
170462306a36Sopenharmony_ci
170562306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
170662306a36Sopenharmony_ci			"2.4G [regula %d][bw %d][sec %d][chnl %d][val %d]\n",
170762306a36Sopenharmony_ci			regulation, bandwidth, rate_section, channel_index,
170862306a36Sopenharmony_ci			rtlphy->txpwr_limit_2_4g[regulation][bandwidth]
170962306a36Sopenharmony_ci				[rate_section][channel_index][RF90_PATH_A]);
171062306a36Sopenharmony_ci	} else if (strcmp(pband, "5G") == 0) {
171162306a36Sopenharmony_ci		ret = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw,
171262306a36Sopenharmony_ci							       BAND_ON_5G,
171362306a36Sopenharmony_ci							       channel);
171462306a36Sopenharmony_ci
171562306a36Sopenharmony_ci		if (ret == -1)
171662306a36Sopenharmony_ci			return;
171762306a36Sopenharmony_ci
171862306a36Sopenharmony_ci		channel_index = ret;
171962306a36Sopenharmony_ci
172062306a36Sopenharmony_ci		prev_power_limit = rtlphy->txpwr_limit_5g[regulation][bandwidth]
172162306a36Sopenharmony_ci						[rate_section][channel_index]
172262306a36Sopenharmony_ci						[RF90_PATH_A];
172362306a36Sopenharmony_ci
172462306a36Sopenharmony_ci		if (power_limit < prev_power_limit)
172562306a36Sopenharmony_ci			rtlphy->txpwr_limit_5g[regulation][bandwidth]
172662306a36Sopenharmony_ci			[rate_section][channel_index][RF90_PATH_A] = power_limit;
172762306a36Sopenharmony_ci
172862306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
172962306a36Sopenharmony_ci			"5G: [regul %d][bw %d][sec %d][chnl %d][val %d]\n",
173062306a36Sopenharmony_ci			regulation, bandwidth, rate_section, channel,
173162306a36Sopenharmony_ci			rtlphy->txpwr_limit_5g[regulation][bandwidth]
173262306a36Sopenharmony_ci				[rate_section][channel_index][RF90_PATH_A]);
173362306a36Sopenharmony_ci	} else {
173462306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
173562306a36Sopenharmony_ci			"Cannot recognize the band info in %s\n", pband);
173662306a36Sopenharmony_ci		return;
173762306a36Sopenharmony_ci	}
173862306a36Sopenharmony_ci}
173962306a36Sopenharmony_ci
174062306a36Sopenharmony_cistatic void _rtl8812ae_phy_config_bb_txpwr_lmt(struct ieee80211_hw *hw,
174162306a36Sopenharmony_ci					  const char *regulation, const char *band,
174262306a36Sopenharmony_ci					  const char *bandwidth, const char *rate_section,
174362306a36Sopenharmony_ci					  const char *rf_path, const char *channel,
174462306a36Sopenharmony_ci					  const char *power_limit)
174562306a36Sopenharmony_ci{
174662306a36Sopenharmony_ci	_rtl8812ae_phy_set_txpower_limit(hw, regulation, band, bandwidth,
174762306a36Sopenharmony_ci					 rate_section, rf_path, channel,
174862306a36Sopenharmony_ci					 power_limit);
174962306a36Sopenharmony_ci}
175062306a36Sopenharmony_ci
175162306a36Sopenharmony_cistatic void _rtl8821ae_phy_read_and_config_txpwr_lmt(struct ieee80211_hw *hw)
175262306a36Sopenharmony_ci{
175362306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
175462306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
175562306a36Sopenharmony_ci	u32 i = 0;
175662306a36Sopenharmony_ci	u32 array_len;
175762306a36Sopenharmony_ci	const char **array;
175862306a36Sopenharmony_ci
175962306a36Sopenharmony_ci	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
176062306a36Sopenharmony_ci		array_len = RTL8812AE_TXPWR_LMT_ARRAY_LEN;
176162306a36Sopenharmony_ci		array = RTL8812AE_TXPWR_LMT;
176262306a36Sopenharmony_ci	} else {
176362306a36Sopenharmony_ci		array_len = RTL8821AE_TXPWR_LMT_ARRAY_LEN;
176462306a36Sopenharmony_ci		array = RTL8821AE_TXPWR_LMT;
176562306a36Sopenharmony_ci	}
176662306a36Sopenharmony_ci
176762306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "\n");
176862306a36Sopenharmony_ci
176962306a36Sopenharmony_ci	for (i = 0; i < array_len; i += 7) {
177062306a36Sopenharmony_ci		const char *regulation = array[i];
177162306a36Sopenharmony_ci		const char *band = array[i+1];
177262306a36Sopenharmony_ci		const char *bandwidth = array[i+2];
177362306a36Sopenharmony_ci		const char *rate = array[i+3];
177462306a36Sopenharmony_ci		const char *rf_path = array[i+4];
177562306a36Sopenharmony_ci		const char *chnl = array[i+5];
177662306a36Sopenharmony_ci		const char *val = array[i+6];
177762306a36Sopenharmony_ci
177862306a36Sopenharmony_ci		_rtl8812ae_phy_config_bb_txpwr_lmt(hw, regulation, band,
177962306a36Sopenharmony_ci						   bandwidth, rate, rf_path,
178062306a36Sopenharmony_ci						   chnl, val);
178162306a36Sopenharmony_ci	}
178262306a36Sopenharmony_ci}
178362306a36Sopenharmony_ci
178462306a36Sopenharmony_cistatic bool _rtl8821ae_phy_bb8821a_config_parafile(struct ieee80211_hw *hw)
178562306a36Sopenharmony_ci{
178662306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
178762306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
178862306a36Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
178962306a36Sopenharmony_ci	bool rtstatus;
179062306a36Sopenharmony_ci
179162306a36Sopenharmony_ci	_rtl8821ae_phy_init_txpower_limit(hw);
179262306a36Sopenharmony_ci
179362306a36Sopenharmony_ci	/* RegEnableTxPowerLimit == 1 for 8812a & 8821a */
179462306a36Sopenharmony_ci	if (rtlefuse->eeprom_regulatory != 2)
179562306a36Sopenharmony_ci		_rtl8821ae_phy_read_and_config_txpwr_lmt(hw);
179662306a36Sopenharmony_ci
179762306a36Sopenharmony_ci	rtstatus = _rtl8821ae_phy_config_bb_with_headerfile(hw,
179862306a36Sopenharmony_ci						       BASEBAND_CONFIG_PHY_REG);
179962306a36Sopenharmony_ci	if (!rtstatus) {
180062306a36Sopenharmony_ci		pr_err("Write BB Reg Fail!!\n");
180162306a36Sopenharmony_ci		return false;
180262306a36Sopenharmony_ci	}
180362306a36Sopenharmony_ci	_rtl8821ae_phy_init_tx_power_by_rate(hw);
180462306a36Sopenharmony_ci	if (!rtlefuse->autoload_failflag) {
180562306a36Sopenharmony_ci		rtstatus = _rtl8821ae_phy_config_bb_with_pgheaderfile(hw,
180662306a36Sopenharmony_ci						    BASEBAND_CONFIG_PHY_REG);
180762306a36Sopenharmony_ci	}
180862306a36Sopenharmony_ci	if (!rtstatus) {
180962306a36Sopenharmony_ci		pr_err("BB_PG Reg Fail!!\n");
181062306a36Sopenharmony_ci		return false;
181162306a36Sopenharmony_ci	}
181262306a36Sopenharmony_ci
181362306a36Sopenharmony_ci	_rtl8821ae_phy_txpower_by_rate_configuration(hw);
181462306a36Sopenharmony_ci
181562306a36Sopenharmony_ci	/* RegEnableTxPowerLimit == 1 for 8812a & 8821a */
181662306a36Sopenharmony_ci	if (rtlefuse->eeprom_regulatory != 2)
181762306a36Sopenharmony_ci		_rtl8812ae_phy_convert_txpower_limit_to_power_index(hw);
181862306a36Sopenharmony_ci
181962306a36Sopenharmony_ci	rtstatus = _rtl8821ae_phy_config_bb_with_headerfile(hw,
182062306a36Sopenharmony_ci						BASEBAND_CONFIG_AGC_TAB);
182162306a36Sopenharmony_ci
182262306a36Sopenharmony_ci	if (!rtstatus) {
182362306a36Sopenharmony_ci		pr_err("AGC Table Fail\n");
182462306a36Sopenharmony_ci		return false;
182562306a36Sopenharmony_ci	}
182662306a36Sopenharmony_ci	rtlphy->cck_high_power = (bool)(rtl_get_bbreg(hw,
182762306a36Sopenharmony_ci			RFPGA0_XA_HSSIPARAMETER2, 0x200));
182862306a36Sopenharmony_ci	return true;
182962306a36Sopenharmony_ci}
183062306a36Sopenharmony_ci
183162306a36Sopenharmony_cistatic bool
183262306a36Sopenharmony_ci__rtl8821ae_phy_config_with_headerfile(struct ieee80211_hw *hw,
183362306a36Sopenharmony_ci				       u32 *array_table, u16 arraylen,
183462306a36Sopenharmony_ci				       void (*set_reg)(struct ieee80211_hw *hw,
183562306a36Sopenharmony_ci						       u32 regaddr, u32 data))
183662306a36Sopenharmony_ci{
183762306a36Sopenharmony_ci	#define COND_ELSE  2
183862306a36Sopenharmony_ci	#define COND_ENDIF 3
183962306a36Sopenharmony_ci
184062306a36Sopenharmony_ci	int i = 0;
184162306a36Sopenharmony_ci	u8 cond;
184262306a36Sopenharmony_ci	bool matched = true, skipped = false;
184362306a36Sopenharmony_ci
184462306a36Sopenharmony_ci	while ((i + 1) < arraylen) {
184562306a36Sopenharmony_ci		u32 v1 = array_table[i];
184662306a36Sopenharmony_ci		u32 v2 = array_table[i + 1];
184762306a36Sopenharmony_ci
184862306a36Sopenharmony_ci		if (v1 & (BIT(31) | BIT(30))) {/*positive & negative condition*/
184962306a36Sopenharmony_ci			if (v1 & BIT(31)) {/* positive condition*/
185062306a36Sopenharmony_ci				cond  = (u8)((v1 & (BIT(29) | BIT(28))) >> 28);
185162306a36Sopenharmony_ci				if (cond == COND_ENDIF) {/*end*/
185262306a36Sopenharmony_ci					matched = true;
185362306a36Sopenharmony_ci					skipped = false;
185462306a36Sopenharmony_ci				} else if (cond == COND_ELSE) /*else*/
185562306a36Sopenharmony_ci					matched = skipped ? false : true;
185662306a36Sopenharmony_ci				else {/*if , else if*/
185762306a36Sopenharmony_ci					if (skipped) {
185862306a36Sopenharmony_ci						matched = false;
185962306a36Sopenharmony_ci					} else {
186062306a36Sopenharmony_ci						if (_rtl8821ae_check_positive(
186162306a36Sopenharmony_ci								hw, v1, v2)) {
186262306a36Sopenharmony_ci							matched = true;
186362306a36Sopenharmony_ci							skipped = true;
186462306a36Sopenharmony_ci						} else {
186562306a36Sopenharmony_ci							matched = false;
186662306a36Sopenharmony_ci							skipped = false;
186762306a36Sopenharmony_ci						}
186862306a36Sopenharmony_ci					}
186962306a36Sopenharmony_ci				}
187062306a36Sopenharmony_ci			} else if (v1 & BIT(30)) { /*negative condition*/
187162306a36Sopenharmony_ci			/*do nothing*/
187262306a36Sopenharmony_ci			}
187362306a36Sopenharmony_ci		} else {
187462306a36Sopenharmony_ci			if (matched)
187562306a36Sopenharmony_ci				set_reg(hw, v1, v2);
187662306a36Sopenharmony_ci		}
187762306a36Sopenharmony_ci		i = i + 2;
187862306a36Sopenharmony_ci	}
187962306a36Sopenharmony_ci
188062306a36Sopenharmony_ci	return true;
188162306a36Sopenharmony_ci}
188262306a36Sopenharmony_ci
188362306a36Sopenharmony_cistatic bool _rtl8821ae_phy_config_mac_with_headerfile(struct ieee80211_hw *hw)
188462306a36Sopenharmony_ci{
188562306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
188662306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
188762306a36Sopenharmony_ci	u32 arraylength;
188862306a36Sopenharmony_ci	u32 *ptrarray;
188962306a36Sopenharmony_ci
189062306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "Read MAC_REG_Array\n");
189162306a36Sopenharmony_ci	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
189262306a36Sopenharmony_ci		arraylength = RTL8821AE_MAC_1T_ARRAYLEN;
189362306a36Sopenharmony_ci		ptrarray = RTL8821AE_MAC_REG_ARRAY;
189462306a36Sopenharmony_ci	} else {
189562306a36Sopenharmony_ci		arraylength = RTL8812AE_MAC_1T_ARRAYLEN;
189662306a36Sopenharmony_ci		ptrarray = RTL8812AE_MAC_REG_ARRAY;
189762306a36Sopenharmony_ci	}
189862306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
189962306a36Sopenharmony_ci		"Img: MAC_REG_ARRAY LEN %d\n", arraylength);
190062306a36Sopenharmony_ci
190162306a36Sopenharmony_ci	return __rtl8821ae_phy_config_with_headerfile(hw,
190262306a36Sopenharmony_ci			ptrarray, arraylength, rtl_write_byte_with_val32);
190362306a36Sopenharmony_ci}
190462306a36Sopenharmony_ci
190562306a36Sopenharmony_cistatic bool _rtl8821ae_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
190662306a36Sopenharmony_ci						     u8 configtype)
190762306a36Sopenharmony_ci{
190862306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
190962306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
191062306a36Sopenharmony_ci	u32 *array_table;
191162306a36Sopenharmony_ci	u16 arraylen;
191262306a36Sopenharmony_ci
191362306a36Sopenharmony_ci	if (configtype == BASEBAND_CONFIG_PHY_REG) {
191462306a36Sopenharmony_ci		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
191562306a36Sopenharmony_ci			arraylen = RTL8812AE_PHY_REG_1TARRAYLEN;
191662306a36Sopenharmony_ci			array_table = RTL8812AE_PHY_REG_ARRAY;
191762306a36Sopenharmony_ci		} else {
191862306a36Sopenharmony_ci			arraylen = RTL8821AE_PHY_REG_1TARRAYLEN;
191962306a36Sopenharmony_ci			array_table = RTL8821AE_PHY_REG_ARRAY;
192062306a36Sopenharmony_ci		}
192162306a36Sopenharmony_ci
192262306a36Sopenharmony_ci		return __rtl8821ae_phy_config_with_headerfile(hw,
192362306a36Sopenharmony_ci				array_table, arraylen,
192462306a36Sopenharmony_ci				_rtl8821ae_config_bb_reg);
192562306a36Sopenharmony_ci	} else if (configtype == BASEBAND_CONFIG_AGC_TAB) {
192662306a36Sopenharmony_ci		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
192762306a36Sopenharmony_ci			arraylen = RTL8812AE_AGC_TAB_1TARRAYLEN;
192862306a36Sopenharmony_ci			array_table = RTL8812AE_AGC_TAB_ARRAY;
192962306a36Sopenharmony_ci		} else {
193062306a36Sopenharmony_ci			arraylen = RTL8821AE_AGC_TAB_1TARRAYLEN;
193162306a36Sopenharmony_ci			array_table = RTL8821AE_AGC_TAB_ARRAY;
193262306a36Sopenharmony_ci		}
193362306a36Sopenharmony_ci
193462306a36Sopenharmony_ci		return __rtl8821ae_phy_config_with_headerfile(hw,
193562306a36Sopenharmony_ci				array_table, arraylen,
193662306a36Sopenharmony_ci				rtl_set_bbreg_with_dwmask);
193762306a36Sopenharmony_ci	}
193862306a36Sopenharmony_ci	return true;
193962306a36Sopenharmony_ci}
194062306a36Sopenharmony_ci
194162306a36Sopenharmony_cistatic u8 _rtl8821ae_get_rate_section_index(u32 regaddr)
194262306a36Sopenharmony_ci{
194362306a36Sopenharmony_ci	u8 index = 0;
194462306a36Sopenharmony_ci	regaddr &= 0xFFF;
194562306a36Sopenharmony_ci	if (regaddr >= 0xC20 && regaddr <= 0xC4C)
194662306a36Sopenharmony_ci		index = (u8)((regaddr - 0xC20) / 4);
194762306a36Sopenharmony_ci	else if (regaddr >= 0xE20 && regaddr <= 0xE4C)
194862306a36Sopenharmony_ci		index = (u8)((regaddr - 0xE20) / 4);
194962306a36Sopenharmony_ci	else
195062306a36Sopenharmony_ci		WARN_ONCE(true,
195162306a36Sopenharmony_ci			  "rtl8821ae: Invalid RegAddr 0x%x\n", regaddr);
195262306a36Sopenharmony_ci	return index;
195362306a36Sopenharmony_ci}
195462306a36Sopenharmony_ci
195562306a36Sopenharmony_cistatic void _rtl8821ae_store_tx_power_by_rate(struct ieee80211_hw *hw,
195662306a36Sopenharmony_ci					      u32 band, u32 rfpath,
195762306a36Sopenharmony_ci					      u32 txnum, u32 regaddr,
195862306a36Sopenharmony_ci					      u32 bitmask, u32 data)
195962306a36Sopenharmony_ci{
196062306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
196162306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
196262306a36Sopenharmony_ci	u8 rate_section = _rtl8821ae_get_rate_section_index(regaddr);
196362306a36Sopenharmony_ci
196462306a36Sopenharmony_ci	if (band != BAND_ON_2_4G && band != BAND_ON_5G) {
196562306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid Band %d\n", band);
196662306a36Sopenharmony_ci		band = BAND_ON_2_4G;
196762306a36Sopenharmony_ci	}
196862306a36Sopenharmony_ci	if (rfpath >= MAX_RF_PATH) {
196962306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid RfPath %d\n", rfpath);
197062306a36Sopenharmony_ci		rfpath = MAX_RF_PATH - 1;
197162306a36Sopenharmony_ci	}
197262306a36Sopenharmony_ci	if (txnum >= MAX_RF_PATH) {
197362306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid TxNum %d\n", txnum);
197462306a36Sopenharmony_ci		txnum = MAX_RF_PATH - 1;
197562306a36Sopenharmony_ci	}
197662306a36Sopenharmony_ci	rtlphy->tx_power_by_rate_offset[band][rfpath][txnum][rate_section] = data;
197762306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
197862306a36Sopenharmony_ci		"TxPwrByRateOffset[Band %d][RfPath %d][TxNum %d][RateSection %d] = 0x%x\n",
197962306a36Sopenharmony_ci		band, rfpath, txnum, rate_section,
198062306a36Sopenharmony_ci		rtlphy->tx_power_by_rate_offset[band][rfpath][txnum][rate_section]);
198162306a36Sopenharmony_ci}
198262306a36Sopenharmony_ci
198362306a36Sopenharmony_cistatic bool _rtl8821ae_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
198462306a36Sopenharmony_ci							u8 configtype)
198562306a36Sopenharmony_ci{
198662306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
198762306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
198862306a36Sopenharmony_ci	int i;
198962306a36Sopenharmony_ci	u32 *array;
199062306a36Sopenharmony_ci	u16 arraylen;
199162306a36Sopenharmony_ci	u32 v1, v2, v3, v4, v5, v6;
199262306a36Sopenharmony_ci
199362306a36Sopenharmony_ci	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
199462306a36Sopenharmony_ci		arraylen = RTL8812AE_PHY_REG_ARRAY_PGLEN;
199562306a36Sopenharmony_ci		array = RTL8812AE_PHY_REG_ARRAY_PG;
199662306a36Sopenharmony_ci	} else {
199762306a36Sopenharmony_ci		arraylen = RTL8821AE_PHY_REG_ARRAY_PGLEN;
199862306a36Sopenharmony_ci		array = RTL8821AE_PHY_REG_ARRAY_PG;
199962306a36Sopenharmony_ci	}
200062306a36Sopenharmony_ci
200162306a36Sopenharmony_ci	if (configtype != BASEBAND_CONFIG_PHY_REG) {
200262306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_SEND, DBG_TRACE,
200362306a36Sopenharmony_ci			"configtype != BaseBand_Config_PHY_REG\n");
200462306a36Sopenharmony_ci		return true;
200562306a36Sopenharmony_ci	}
200662306a36Sopenharmony_ci	for (i = 0; i < arraylen; i += 6) {
200762306a36Sopenharmony_ci		v1 = array[i];
200862306a36Sopenharmony_ci		v2 = array[i+1];
200962306a36Sopenharmony_ci		v3 = array[i+2];
201062306a36Sopenharmony_ci		v4 = array[i+3];
201162306a36Sopenharmony_ci		v5 = array[i+4];
201262306a36Sopenharmony_ci		v6 = array[i+5];
201362306a36Sopenharmony_ci
201462306a36Sopenharmony_ci		if (v1 < 0xCDCDCDCD) {
201562306a36Sopenharmony_ci			if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE &&
201662306a36Sopenharmony_ci				(v4 == 0xfe || v4 == 0xffe)) {
201762306a36Sopenharmony_ci				msleep(50);
201862306a36Sopenharmony_ci				continue;
201962306a36Sopenharmony_ci			}
202062306a36Sopenharmony_ci
202162306a36Sopenharmony_ci			if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
202262306a36Sopenharmony_ci				if (v4 == 0xfe)
202362306a36Sopenharmony_ci					msleep(50);
202462306a36Sopenharmony_ci				else if (v4 == 0xfd)
202562306a36Sopenharmony_ci					mdelay(5);
202662306a36Sopenharmony_ci				else if (v4 == 0xfc)
202762306a36Sopenharmony_ci					mdelay(1);
202862306a36Sopenharmony_ci				else if (v4 == 0xfb)
202962306a36Sopenharmony_ci					udelay(50);
203062306a36Sopenharmony_ci				else if (v4 == 0xfa)
203162306a36Sopenharmony_ci					udelay(5);
203262306a36Sopenharmony_ci				else if (v4 == 0xf9)
203362306a36Sopenharmony_ci					udelay(1);
203462306a36Sopenharmony_ci			}
203562306a36Sopenharmony_ci			_rtl8821ae_store_tx_power_by_rate(hw, v1, v2, v3,
203662306a36Sopenharmony_ci							  v4, v5, v6);
203762306a36Sopenharmony_ci			continue;
203862306a36Sopenharmony_ci		} else {
203962306a36Sopenharmony_ci			 /*don't need the hw_body*/
204062306a36Sopenharmony_ci			if (!_rtl8821ae_check_condition(hw, v1)) {
204162306a36Sopenharmony_ci				i += 2; /* skip the pair of expression*/
204262306a36Sopenharmony_ci				v1 = array[i];
204362306a36Sopenharmony_ci				v2 = array[i+1];
204462306a36Sopenharmony_ci				v3 = array[i+2];
204562306a36Sopenharmony_ci				while (v2 != 0xDEAD) {
204662306a36Sopenharmony_ci					i += 3;
204762306a36Sopenharmony_ci					v1 = array[i];
204862306a36Sopenharmony_ci					v2 = array[i+1];
204962306a36Sopenharmony_ci					v3 = array[i+2];
205062306a36Sopenharmony_ci				}
205162306a36Sopenharmony_ci			}
205262306a36Sopenharmony_ci		}
205362306a36Sopenharmony_ci	}
205462306a36Sopenharmony_ci
205562306a36Sopenharmony_ci	return true;
205662306a36Sopenharmony_ci}
205762306a36Sopenharmony_ci
205862306a36Sopenharmony_cibool rtl8812ae_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
205962306a36Sopenharmony_ci					     enum radio_path rfpath)
206062306a36Sopenharmony_ci{
206162306a36Sopenharmony_ci	u32 *radioa_array_table_a, *radioa_array_table_b;
206262306a36Sopenharmony_ci	u16 radioa_arraylen_a, radioa_arraylen_b;
206362306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
206462306a36Sopenharmony_ci
206562306a36Sopenharmony_ci	radioa_arraylen_a = RTL8812AE_RADIOA_1TARRAYLEN;
206662306a36Sopenharmony_ci	radioa_array_table_a = RTL8812AE_RADIOA_ARRAY;
206762306a36Sopenharmony_ci	radioa_arraylen_b = RTL8812AE_RADIOB_1TARRAYLEN;
206862306a36Sopenharmony_ci	radioa_array_table_b = RTL8812AE_RADIOB_ARRAY;
206962306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
207062306a36Sopenharmony_ci		"Radio_A:RTL8821AE_RADIOA_ARRAY %d\n", radioa_arraylen_a);
207162306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath);
207262306a36Sopenharmony_ci	switch (rfpath) {
207362306a36Sopenharmony_ci	case RF90_PATH_A:
207462306a36Sopenharmony_ci		return __rtl8821ae_phy_config_with_headerfile(hw,
207562306a36Sopenharmony_ci				radioa_array_table_a, radioa_arraylen_a,
207662306a36Sopenharmony_ci				_rtl8821ae_config_rf_radio_a);
207762306a36Sopenharmony_ci	case RF90_PATH_B:
207862306a36Sopenharmony_ci		return __rtl8821ae_phy_config_with_headerfile(hw,
207962306a36Sopenharmony_ci				radioa_array_table_b, radioa_arraylen_b,
208062306a36Sopenharmony_ci				_rtl8821ae_config_rf_radio_b);
208162306a36Sopenharmony_ci	case RF90_PATH_C:
208262306a36Sopenharmony_ci	case RF90_PATH_D:
208362306a36Sopenharmony_ci		pr_err("switch case %#x not processed\n", rfpath);
208462306a36Sopenharmony_ci		break;
208562306a36Sopenharmony_ci	}
208662306a36Sopenharmony_ci	return true;
208762306a36Sopenharmony_ci}
208862306a36Sopenharmony_ci
208962306a36Sopenharmony_cibool rtl8821ae_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
209062306a36Sopenharmony_ci						enum radio_path rfpath)
209162306a36Sopenharmony_ci{
209262306a36Sopenharmony_ci	u32 *radioa_array_table;
209362306a36Sopenharmony_ci	u16 radioa_arraylen;
209462306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
209562306a36Sopenharmony_ci
209662306a36Sopenharmony_ci	radioa_arraylen = RTL8821AE_RADIOA_1TARRAYLEN;
209762306a36Sopenharmony_ci	radioa_array_table = RTL8821AE_RADIOA_ARRAY;
209862306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
209962306a36Sopenharmony_ci		"Radio_A:RTL8821AE_RADIOA_ARRAY %d\n", radioa_arraylen);
210062306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath);
210162306a36Sopenharmony_ci	switch (rfpath) {
210262306a36Sopenharmony_ci	case RF90_PATH_A:
210362306a36Sopenharmony_ci		return __rtl8821ae_phy_config_with_headerfile(hw,
210462306a36Sopenharmony_ci			radioa_array_table, radioa_arraylen,
210562306a36Sopenharmony_ci			_rtl8821ae_config_rf_radio_a);
210662306a36Sopenharmony_ci
210762306a36Sopenharmony_ci	case RF90_PATH_B:
210862306a36Sopenharmony_ci	case RF90_PATH_C:
210962306a36Sopenharmony_ci	case RF90_PATH_D:
211062306a36Sopenharmony_ci		pr_err("switch case %#x not processed\n", rfpath);
211162306a36Sopenharmony_ci		break;
211262306a36Sopenharmony_ci	}
211362306a36Sopenharmony_ci	return true;
211462306a36Sopenharmony_ci}
211562306a36Sopenharmony_ci
211662306a36Sopenharmony_civoid rtl8821ae_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
211762306a36Sopenharmony_ci{
211862306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
211962306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
212062306a36Sopenharmony_ci
212162306a36Sopenharmony_ci	rtlphy->default_initialgain[0] =
212262306a36Sopenharmony_ci	    (u8)rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
212362306a36Sopenharmony_ci	rtlphy->default_initialgain[1] =
212462306a36Sopenharmony_ci	    (u8)rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0);
212562306a36Sopenharmony_ci	rtlphy->default_initialgain[2] =
212662306a36Sopenharmony_ci	    (u8)rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0);
212762306a36Sopenharmony_ci	rtlphy->default_initialgain[3] =
212862306a36Sopenharmony_ci	    (u8)rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0);
212962306a36Sopenharmony_ci
213062306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
213162306a36Sopenharmony_ci		"Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n",
213262306a36Sopenharmony_ci		rtlphy->default_initialgain[0],
213362306a36Sopenharmony_ci		rtlphy->default_initialgain[1],
213462306a36Sopenharmony_ci		rtlphy->default_initialgain[2],
213562306a36Sopenharmony_ci		rtlphy->default_initialgain[3]);
213662306a36Sopenharmony_ci
213762306a36Sopenharmony_ci	rtlphy->framesync = (u8)rtl_get_bbreg(hw,
213862306a36Sopenharmony_ci					       ROFDM0_RXDETECTOR3, MASKBYTE0);
213962306a36Sopenharmony_ci	rtlphy->framesync_c34 = rtl_get_bbreg(hw,
214062306a36Sopenharmony_ci					      ROFDM0_RXDETECTOR2, MASKDWORD);
214162306a36Sopenharmony_ci
214262306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
214362306a36Sopenharmony_ci		"Default framesync (0x%x) = 0x%x\n",
214462306a36Sopenharmony_ci		ROFDM0_RXDETECTOR3, rtlphy->framesync);
214562306a36Sopenharmony_ci}
214662306a36Sopenharmony_ci
214762306a36Sopenharmony_cistatic void phy_init_bb_rf_register_definition(struct ieee80211_hw *hw)
214862306a36Sopenharmony_ci{
214962306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
215062306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
215162306a36Sopenharmony_ci
215262306a36Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_A].rfintfs = RFPGA0_XAB_RFINTERFACESW;
215362306a36Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_B].rfintfs = RFPGA0_XAB_RFINTERFACESW;
215462306a36Sopenharmony_ci
215562306a36Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_A].rfintfo = RFPGA0_XA_RFINTERFACEOE;
215662306a36Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_B].rfintfo = RFPGA0_XB_RFINTERFACEOE;
215762306a36Sopenharmony_ci
215862306a36Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_A].rfintfe = RFPGA0_XA_RFINTERFACEOE;
215962306a36Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE;
216062306a36Sopenharmony_ci
216162306a36Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset = RA_LSSIWRITE_8821A;
216262306a36Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset = RB_LSSIWRITE_8821A;
216362306a36Sopenharmony_ci
216462306a36Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para2 = RHSSIREAD_8821AE;
216562306a36Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para2 = RHSSIREAD_8821AE;
216662306a36Sopenharmony_ci
216762306a36Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_A].rf_rb = RA_SIREAD_8821A;
216862306a36Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_B].rf_rb = RB_SIREAD_8821A;
216962306a36Sopenharmony_ci
217062306a36Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_A].rf_rbpi = RA_PIREAD_8821A;
217162306a36Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_B].rf_rbpi = RB_PIREAD_8821A;
217262306a36Sopenharmony_ci}
217362306a36Sopenharmony_ci
217462306a36Sopenharmony_civoid rtl8821ae_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel)
217562306a36Sopenharmony_ci{
217662306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
217762306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
217862306a36Sopenharmony_ci	u8 txpwr_level;
217962306a36Sopenharmony_ci	long txpwr_dbm;
218062306a36Sopenharmony_ci
218162306a36Sopenharmony_ci	txpwr_level = rtlphy->cur_cck_txpwridx;
218262306a36Sopenharmony_ci	txpwr_dbm = _rtl8821ae_phy_txpwr_idx_to_dbm(hw,
218362306a36Sopenharmony_ci						 WIRELESS_MODE_B, txpwr_level);
218462306a36Sopenharmony_ci	txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
218562306a36Sopenharmony_ci	if (_rtl8821ae_phy_txpwr_idx_to_dbm(hw,
218662306a36Sopenharmony_ci					 WIRELESS_MODE_G,
218762306a36Sopenharmony_ci					 txpwr_level) > txpwr_dbm)
218862306a36Sopenharmony_ci		txpwr_dbm =
218962306a36Sopenharmony_ci		    _rtl8821ae_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G,
219062306a36Sopenharmony_ci						 txpwr_level);
219162306a36Sopenharmony_ci	txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
219262306a36Sopenharmony_ci	if (_rtl8821ae_phy_txpwr_idx_to_dbm(hw,
219362306a36Sopenharmony_ci					 WIRELESS_MODE_N_24G,
219462306a36Sopenharmony_ci					 txpwr_level) > txpwr_dbm)
219562306a36Sopenharmony_ci		txpwr_dbm =
219662306a36Sopenharmony_ci		    _rtl8821ae_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_N_24G,
219762306a36Sopenharmony_ci						 txpwr_level);
219862306a36Sopenharmony_ci	*powerlevel = txpwr_dbm;
219962306a36Sopenharmony_ci}
220062306a36Sopenharmony_ci
220162306a36Sopenharmony_cistatic bool _rtl8821ae_phy_get_chnl_index(u8 channel, u8 *chnl_index)
220262306a36Sopenharmony_ci{
220362306a36Sopenharmony_ci	u8 i = 0;
220462306a36Sopenharmony_ci	bool in_24g = true;
220562306a36Sopenharmony_ci
220662306a36Sopenharmony_ci	if (channel <= 14) {
220762306a36Sopenharmony_ci		in_24g = true;
220862306a36Sopenharmony_ci		*chnl_index = channel - 1;
220962306a36Sopenharmony_ci	} else {
221062306a36Sopenharmony_ci		in_24g = false;
221162306a36Sopenharmony_ci
221262306a36Sopenharmony_ci		for (i = 0; i < CHANNEL_MAX_NUMBER_5G; ++i) {
221362306a36Sopenharmony_ci			if (channel5g[i] == channel) {
221462306a36Sopenharmony_ci				*chnl_index = i;
221562306a36Sopenharmony_ci				return in_24g;
221662306a36Sopenharmony_ci			}
221762306a36Sopenharmony_ci		}
221862306a36Sopenharmony_ci	}
221962306a36Sopenharmony_ci	return in_24g;
222062306a36Sopenharmony_ci}
222162306a36Sopenharmony_ci
222262306a36Sopenharmony_cistatic s8 _rtl8821ae_phy_get_ratesection_intxpower_byrate(u8 path, u8 rate)
222362306a36Sopenharmony_ci{
222462306a36Sopenharmony_ci	s8 rate_section = 0;
222562306a36Sopenharmony_ci	switch (rate) {
222662306a36Sopenharmony_ci	case DESC_RATE1M:
222762306a36Sopenharmony_ci	case DESC_RATE2M:
222862306a36Sopenharmony_ci	case DESC_RATE5_5M:
222962306a36Sopenharmony_ci	case DESC_RATE11M:
223062306a36Sopenharmony_ci		rate_section = 0;
223162306a36Sopenharmony_ci		break;
223262306a36Sopenharmony_ci	case DESC_RATE6M:
223362306a36Sopenharmony_ci	case DESC_RATE9M:
223462306a36Sopenharmony_ci	case DESC_RATE12M:
223562306a36Sopenharmony_ci	case DESC_RATE18M:
223662306a36Sopenharmony_ci		rate_section = 1;
223762306a36Sopenharmony_ci		break;
223862306a36Sopenharmony_ci	case DESC_RATE24M:
223962306a36Sopenharmony_ci	case DESC_RATE36M:
224062306a36Sopenharmony_ci	case DESC_RATE48M:
224162306a36Sopenharmony_ci	case DESC_RATE54M:
224262306a36Sopenharmony_ci		rate_section = 2;
224362306a36Sopenharmony_ci		break;
224462306a36Sopenharmony_ci	case DESC_RATEMCS0:
224562306a36Sopenharmony_ci	case DESC_RATEMCS1:
224662306a36Sopenharmony_ci	case DESC_RATEMCS2:
224762306a36Sopenharmony_ci	case DESC_RATEMCS3:
224862306a36Sopenharmony_ci		rate_section = 3;
224962306a36Sopenharmony_ci		break;
225062306a36Sopenharmony_ci	case DESC_RATEMCS4:
225162306a36Sopenharmony_ci	case DESC_RATEMCS5:
225262306a36Sopenharmony_ci	case DESC_RATEMCS6:
225362306a36Sopenharmony_ci	case DESC_RATEMCS7:
225462306a36Sopenharmony_ci		rate_section = 4;
225562306a36Sopenharmony_ci		break;
225662306a36Sopenharmony_ci	case DESC_RATEMCS8:
225762306a36Sopenharmony_ci	case DESC_RATEMCS9:
225862306a36Sopenharmony_ci	case DESC_RATEMCS10:
225962306a36Sopenharmony_ci	case DESC_RATEMCS11:
226062306a36Sopenharmony_ci		rate_section = 5;
226162306a36Sopenharmony_ci		break;
226262306a36Sopenharmony_ci	case DESC_RATEMCS12:
226362306a36Sopenharmony_ci	case DESC_RATEMCS13:
226462306a36Sopenharmony_ci	case DESC_RATEMCS14:
226562306a36Sopenharmony_ci	case DESC_RATEMCS15:
226662306a36Sopenharmony_ci		rate_section = 6;
226762306a36Sopenharmony_ci		break;
226862306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS0:
226962306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS1:
227062306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS2:
227162306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS3:
227262306a36Sopenharmony_ci		rate_section = 7;
227362306a36Sopenharmony_ci		break;
227462306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS4:
227562306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS5:
227662306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS6:
227762306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS7:
227862306a36Sopenharmony_ci		rate_section = 8;
227962306a36Sopenharmony_ci		break;
228062306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS8:
228162306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS9:
228262306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS0:
228362306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS1:
228462306a36Sopenharmony_ci		rate_section = 9;
228562306a36Sopenharmony_ci		break;
228662306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS2:
228762306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS3:
228862306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS4:
228962306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS5:
229062306a36Sopenharmony_ci		rate_section = 10;
229162306a36Sopenharmony_ci		break;
229262306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS6:
229362306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS7:
229462306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS8:
229562306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS9:
229662306a36Sopenharmony_ci		rate_section = 11;
229762306a36Sopenharmony_ci		break;
229862306a36Sopenharmony_ci	default:
229962306a36Sopenharmony_ci		WARN_ONCE(true, "rtl8821ae: Rate_Section is Illegal\n");
230062306a36Sopenharmony_ci		break;
230162306a36Sopenharmony_ci	}
230262306a36Sopenharmony_ci
230362306a36Sopenharmony_ci	return rate_section;
230462306a36Sopenharmony_ci}
230562306a36Sopenharmony_ci
230662306a36Sopenharmony_cistatic s8 _rtl8812ae_phy_get_world_wide_limit(s8  *limit_table)
230762306a36Sopenharmony_ci{
230862306a36Sopenharmony_ci	s8 min = limit_table[0];
230962306a36Sopenharmony_ci	u8 i = 0;
231062306a36Sopenharmony_ci
231162306a36Sopenharmony_ci	for (i = 0; i < MAX_REGULATION_NUM; ++i) {
231262306a36Sopenharmony_ci		if (limit_table[i] < min)
231362306a36Sopenharmony_ci			min = limit_table[i];
231462306a36Sopenharmony_ci	}
231562306a36Sopenharmony_ci	return min;
231662306a36Sopenharmony_ci}
231762306a36Sopenharmony_ci
231862306a36Sopenharmony_cistatic s8 _rtl8812ae_phy_get_txpower_limit(struct ieee80211_hw *hw,
231962306a36Sopenharmony_ci					     u8 band,
232062306a36Sopenharmony_ci					     enum ht_channel_width bandwidth,
232162306a36Sopenharmony_ci					     enum radio_path rf_path,
232262306a36Sopenharmony_ci					     u8 rate, u8 channel)
232362306a36Sopenharmony_ci{
232462306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
232562306a36Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtlpriv);
232662306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
232762306a36Sopenharmony_ci	short band_temp = -1, regulation = -1, bandwidth_temp = -1,
232862306a36Sopenharmony_ci		 rate_section = -1, channel_temp = -1;
232962306a36Sopenharmony_ci	u16 regu, bdwidth, sec, chnl;
233062306a36Sopenharmony_ci	s8 power_limit = MAX_POWER_INDEX;
233162306a36Sopenharmony_ci
233262306a36Sopenharmony_ci	if (rtlefuse->eeprom_regulatory == 2)
233362306a36Sopenharmony_ci		return MAX_POWER_INDEX;
233462306a36Sopenharmony_ci
233562306a36Sopenharmony_ci	regulation = TXPWR_LMT_WW;
233662306a36Sopenharmony_ci
233762306a36Sopenharmony_ci	if (band == BAND_ON_2_4G)
233862306a36Sopenharmony_ci		band_temp = 0;
233962306a36Sopenharmony_ci	else if (band == BAND_ON_5G)
234062306a36Sopenharmony_ci		band_temp = 1;
234162306a36Sopenharmony_ci
234262306a36Sopenharmony_ci	if (bandwidth == HT_CHANNEL_WIDTH_20)
234362306a36Sopenharmony_ci		bandwidth_temp = 0;
234462306a36Sopenharmony_ci	else if (bandwidth == HT_CHANNEL_WIDTH_20_40)
234562306a36Sopenharmony_ci		bandwidth_temp = 1;
234662306a36Sopenharmony_ci	else if (bandwidth == HT_CHANNEL_WIDTH_80)
234762306a36Sopenharmony_ci		bandwidth_temp = 2;
234862306a36Sopenharmony_ci
234962306a36Sopenharmony_ci	switch (rate) {
235062306a36Sopenharmony_ci	case DESC_RATE1M:
235162306a36Sopenharmony_ci	case DESC_RATE2M:
235262306a36Sopenharmony_ci	case DESC_RATE5_5M:
235362306a36Sopenharmony_ci	case DESC_RATE11M:
235462306a36Sopenharmony_ci		rate_section = 0;
235562306a36Sopenharmony_ci		break;
235662306a36Sopenharmony_ci	case DESC_RATE6M:
235762306a36Sopenharmony_ci	case DESC_RATE9M:
235862306a36Sopenharmony_ci	case DESC_RATE12M:
235962306a36Sopenharmony_ci	case DESC_RATE18M:
236062306a36Sopenharmony_ci	case DESC_RATE24M:
236162306a36Sopenharmony_ci	case DESC_RATE36M:
236262306a36Sopenharmony_ci	case DESC_RATE48M:
236362306a36Sopenharmony_ci	case DESC_RATE54M:
236462306a36Sopenharmony_ci		rate_section = 1;
236562306a36Sopenharmony_ci		break;
236662306a36Sopenharmony_ci	case DESC_RATEMCS0:
236762306a36Sopenharmony_ci	case DESC_RATEMCS1:
236862306a36Sopenharmony_ci	case DESC_RATEMCS2:
236962306a36Sopenharmony_ci	case DESC_RATEMCS3:
237062306a36Sopenharmony_ci	case DESC_RATEMCS4:
237162306a36Sopenharmony_ci	case DESC_RATEMCS5:
237262306a36Sopenharmony_ci	case DESC_RATEMCS6:
237362306a36Sopenharmony_ci	case DESC_RATEMCS7:
237462306a36Sopenharmony_ci		rate_section = 2;
237562306a36Sopenharmony_ci		break;
237662306a36Sopenharmony_ci	case DESC_RATEMCS8:
237762306a36Sopenharmony_ci	case DESC_RATEMCS9:
237862306a36Sopenharmony_ci	case DESC_RATEMCS10:
237962306a36Sopenharmony_ci	case DESC_RATEMCS11:
238062306a36Sopenharmony_ci	case DESC_RATEMCS12:
238162306a36Sopenharmony_ci	case DESC_RATEMCS13:
238262306a36Sopenharmony_ci	case DESC_RATEMCS14:
238362306a36Sopenharmony_ci	case DESC_RATEMCS15:
238462306a36Sopenharmony_ci		rate_section = 3;
238562306a36Sopenharmony_ci		break;
238662306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS0:
238762306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS1:
238862306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS2:
238962306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS3:
239062306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS4:
239162306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS5:
239262306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS6:
239362306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS7:
239462306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS8:
239562306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS9:
239662306a36Sopenharmony_ci		rate_section = 4;
239762306a36Sopenharmony_ci		break;
239862306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS0:
239962306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS1:
240062306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS2:
240162306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS3:
240262306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS4:
240362306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS5:
240462306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS6:
240562306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS7:
240662306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS8:
240762306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS9:
240862306a36Sopenharmony_ci		rate_section = 5;
240962306a36Sopenharmony_ci		break;
241062306a36Sopenharmony_ci	default:
241162306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
241262306a36Sopenharmony_ci			"Wrong rate 0x%x\n", rate);
241362306a36Sopenharmony_ci		break;
241462306a36Sopenharmony_ci	}
241562306a36Sopenharmony_ci
241662306a36Sopenharmony_ci	if (band_temp == BAND_ON_5G  && rate_section == 0)
241762306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
241862306a36Sopenharmony_ci			"Wrong rate 0x%x: No CCK in 5G Band\n", rate);
241962306a36Sopenharmony_ci
242062306a36Sopenharmony_ci	/*workaround for wrong index combination to obtain tx power limit,
242162306a36Sopenharmony_ci	  OFDM only exists in BW 20M*/
242262306a36Sopenharmony_ci	if (rate_section == 1)
242362306a36Sopenharmony_ci		bandwidth_temp = 0;
242462306a36Sopenharmony_ci
242562306a36Sopenharmony_ci	/*workaround for wrong index combination to obtain tx power limit,
242662306a36Sopenharmony_ci	 *HT on 80M will reference to HT on 40M
242762306a36Sopenharmony_ci	 */
242862306a36Sopenharmony_ci	if ((rate_section == 2 || rate_section == 3) && band == BAND_ON_5G &&
242962306a36Sopenharmony_ci	    bandwidth_temp == 2)
243062306a36Sopenharmony_ci		bandwidth_temp = 1;
243162306a36Sopenharmony_ci
243262306a36Sopenharmony_ci	if (band == BAND_ON_2_4G)
243362306a36Sopenharmony_ci		channel_temp = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw,
243462306a36Sopenharmony_ci		BAND_ON_2_4G, channel);
243562306a36Sopenharmony_ci	else if (band == BAND_ON_5G)
243662306a36Sopenharmony_ci		channel_temp = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw,
243762306a36Sopenharmony_ci		BAND_ON_5G, channel);
243862306a36Sopenharmony_ci	else if (band == BAND_ON_BOTH) {
243962306a36Sopenharmony_ci		;/* BAND_ON_BOTH don't care temporarily */
244062306a36Sopenharmony_ci	}
244162306a36Sopenharmony_ci
244262306a36Sopenharmony_ci	if (band_temp == -1 || regulation == -1 || bandwidth_temp == -1 ||
244362306a36Sopenharmony_ci		rate_section == -1 || channel_temp == -1) {
244462306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
244562306a36Sopenharmony_ci			"Wrong index value to access power limit table [band %d][regulation %d][bandwidth %d][rf_path %d][rate_section %d][chnl %d]\n",
244662306a36Sopenharmony_ci			band_temp, regulation, bandwidth_temp, rf_path,
244762306a36Sopenharmony_ci			rate_section, channel_temp);
244862306a36Sopenharmony_ci		return MAX_POWER_INDEX;
244962306a36Sopenharmony_ci	}
245062306a36Sopenharmony_ci
245162306a36Sopenharmony_ci	regu = regulation;
245262306a36Sopenharmony_ci	bdwidth = bandwidth_temp;
245362306a36Sopenharmony_ci	sec = rate_section;
245462306a36Sopenharmony_ci	chnl = channel_temp;
245562306a36Sopenharmony_ci
245662306a36Sopenharmony_ci	if (band == BAND_ON_2_4G) {
245762306a36Sopenharmony_ci		s8 limits[10] = {0};
245862306a36Sopenharmony_ci		u8 i;
245962306a36Sopenharmony_ci
246062306a36Sopenharmony_ci		for (i = 0; i < 4; ++i)
246162306a36Sopenharmony_ci			limits[i] = rtlphy->txpwr_limit_2_4g[i][bdwidth]
246262306a36Sopenharmony_ci			[sec][chnl][rf_path];
246362306a36Sopenharmony_ci
246462306a36Sopenharmony_ci		power_limit = (regulation == TXPWR_LMT_WW) ?
246562306a36Sopenharmony_ci			_rtl8812ae_phy_get_world_wide_limit(limits) :
246662306a36Sopenharmony_ci			rtlphy->txpwr_limit_2_4g[regu][bdwidth]
246762306a36Sopenharmony_ci					[sec][chnl][rf_path];
246862306a36Sopenharmony_ci	} else if (band == BAND_ON_5G) {
246962306a36Sopenharmony_ci		s8 limits[10] = {0};
247062306a36Sopenharmony_ci		u8 i;
247162306a36Sopenharmony_ci
247262306a36Sopenharmony_ci		for (i = 0; i < MAX_REGULATION_NUM; ++i)
247362306a36Sopenharmony_ci			limits[i] = rtlphy->txpwr_limit_5g[i][bdwidth]
247462306a36Sopenharmony_ci			[sec][chnl][rf_path];
247562306a36Sopenharmony_ci
247662306a36Sopenharmony_ci		power_limit = (regulation == TXPWR_LMT_WW) ?
247762306a36Sopenharmony_ci			_rtl8812ae_phy_get_world_wide_limit(limits) :
247862306a36Sopenharmony_ci			rtlphy->txpwr_limit_5g[regu][chnl]
247962306a36Sopenharmony_ci			[sec][chnl][rf_path];
248062306a36Sopenharmony_ci	} else {
248162306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
248262306a36Sopenharmony_ci			"No power limit table of the specified band\n");
248362306a36Sopenharmony_ci	}
248462306a36Sopenharmony_ci	return power_limit;
248562306a36Sopenharmony_ci}
248662306a36Sopenharmony_ci
248762306a36Sopenharmony_cistatic s8 _rtl8821ae_phy_get_txpower_by_rate(struct ieee80211_hw *hw,
248862306a36Sopenharmony_ci					u8 band, u8 path, u8 rate)
248962306a36Sopenharmony_ci{
249062306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
249162306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
249262306a36Sopenharmony_ci	u8 shift = 0, rate_section, tx_num;
249362306a36Sopenharmony_ci	s8 tx_pwr_diff = 0;
249462306a36Sopenharmony_ci	s8 limit = 0;
249562306a36Sopenharmony_ci
249662306a36Sopenharmony_ci	rate_section = _rtl8821ae_phy_get_ratesection_intxpower_byrate(path, rate);
249762306a36Sopenharmony_ci	tx_num = RF_TX_NUM_NONIMPLEMENT;
249862306a36Sopenharmony_ci
249962306a36Sopenharmony_ci	if (tx_num == RF_TX_NUM_NONIMPLEMENT) {
250062306a36Sopenharmony_ci		if ((rate >= DESC_RATEMCS8 && rate <= DESC_RATEMCS15) ||
250162306a36Sopenharmony_ci			(rate >= DESC_RATEVHT2SS_MCS2 && rate <= DESC_RATEVHT2SS_MCS9))
250262306a36Sopenharmony_ci			tx_num = RF_2TX;
250362306a36Sopenharmony_ci		else
250462306a36Sopenharmony_ci			tx_num = RF_1TX;
250562306a36Sopenharmony_ci	}
250662306a36Sopenharmony_ci
250762306a36Sopenharmony_ci	switch (rate) {
250862306a36Sopenharmony_ci	case DESC_RATE1M:
250962306a36Sopenharmony_ci	case DESC_RATE6M:
251062306a36Sopenharmony_ci	case DESC_RATE24M:
251162306a36Sopenharmony_ci	case DESC_RATEMCS0:
251262306a36Sopenharmony_ci	case DESC_RATEMCS4:
251362306a36Sopenharmony_ci	case DESC_RATEMCS8:
251462306a36Sopenharmony_ci	case DESC_RATEMCS12:
251562306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS0:
251662306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS4:
251762306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS8:
251862306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS2:
251962306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS6:
252062306a36Sopenharmony_ci		shift = 0;
252162306a36Sopenharmony_ci		break;
252262306a36Sopenharmony_ci	case DESC_RATE2M:
252362306a36Sopenharmony_ci	case DESC_RATE9M:
252462306a36Sopenharmony_ci	case DESC_RATE36M:
252562306a36Sopenharmony_ci	case DESC_RATEMCS1:
252662306a36Sopenharmony_ci	case DESC_RATEMCS5:
252762306a36Sopenharmony_ci	case DESC_RATEMCS9:
252862306a36Sopenharmony_ci	case DESC_RATEMCS13:
252962306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS1:
253062306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS5:
253162306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS9:
253262306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS3:
253362306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS7:
253462306a36Sopenharmony_ci		shift = 8;
253562306a36Sopenharmony_ci		break;
253662306a36Sopenharmony_ci	case DESC_RATE5_5M:
253762306a36Sopenharmony_ci	case DESC_RATE12M:
253862306a36Sopenharmony_ci	case DESC_RATE48M:
253962306a36Sopenharmony_ci	case DESC_RATEMCS2:
254062306a36Sopenharmony_ci	case DESC_RATEMCS6:
254162306a36Sopenharmony_ci	case DESC_RATEMCS10:
254262306a36Sopenharmony_ci	case DESC_RATEMCS14:
254362306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS2:
254462306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS6:
254562306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS0:
254662306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS4:
254762306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS8:
254862306a36Sopenharmony_ci		shift = 16;
254962306a36Sopenharmony_ci		break;
255062306a36Sopenharmony_ci	case DESC_RATE11M:
255162306a36Sopenharmony_ci	case DESC_RATE18M:
255262306a36Sopenharmony_ci	case DESC_RATE54M:
255362306a36Sopenharmony_ci	case DESC_RATEMCS3:
255462306a36Sopenharmony_ci	case DESC_RATEMCS7:
255562306a36Sopenharmony_ci	case DESC_RATEMCS11:
255662306a36Sopenharmony_ci	case DESC_RATEMCS15:
255762306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS3:
255862306a36Sopenharmony_ci	case DESC_RATEVHT1SS_MCS7:
255962306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS1:
256062306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS5:
256162306a36Sopenharmony_ci	case DESC_RATEVHT2SS_MCS9:
256262306a36Sopenharmony_ci		shift = 24;
256362306a36Sopenharmony_ci		break;
256462306a36Sopenharmony_ci	default:
256562306a36Sopenharmony_ci		WARN_ONCE(true, "rtl8821ae: Rate_Section is Illegal\n");
256662306a36Sopenharmony_ci		break;
256762306a36Sopenharmony_ci	}
256862306a36Sopenharmony_ci
256962306a36Sopenharmony_ci	tx_pwr_diff = (u8)(rtlphy->tx_power_by_rate_offset[band][path]
257062306a36Sopenharmony_ci		[tx_num][rate_section] >> shift) & 0xff;
257162306a36Sopenharmony_ci
257262306a36Sopenharmony_ci	/* RegEnableTxPowerLimit == 1 for 8812a & 8821a */
257362306a36Sopenharmony_ci	if (rtlpriv->efuse.eeprom_regulatory != 2) {
257462306a36Sopenharmony_ci		limit = _rtl8812ae_phy_get_txpower_limit(hw, band,
257562306a36Sopenharmony_ci			rtlphy->current_chan_bw, path, rate,
257662306a36Sopenharmony_ci			rtlphy->current_channel);
257762306a36Sopenharmony_ci
257862306a36Sopenharmony_ci		if (rate == DESC_RATEVHT1SS_MCS8 || rate == DESC_RATEVHT1SS_MCS9  ||
257962306a36Sopenharmony_ci			 rate == DESC_RATEVHT2SS_MCS8 || rate == DESC_RATEVHT2SS_MCS9) {
258062306a36Sopenharmony_ci			if (limit < 0) {
258162306a36Sopenharmony_ci				if (tx_pwr_diff < (-limit))
258262306a36Sopenharmony_ci					tx_pwr_diff = -limit;
258362306a36Sopenharmony_ci			}
258462306a36Sopenharmony_ci		} else {
258562306a36Sopenharmony_ci			if (limit < 0)
258662306a36Sopenharmony_ci				tx_pwr_diff = limit;
258762306a36Sopenharmony_ci			else
258862306a36Sopenharmony_ci				tx_pwr_diff = tx_pwr_diff > limit ? limit : tx_pwr_diff;
258962306a36Sopenharmony_ci		}
259062306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
259162306a36Sopenharmony_ci			"Maximum power by rate %d, final power by rate %d\n",
259262306a36Sopenharmony_ci			limit, tx_pwr_diff);
259362306a36Sopenharmony_ci	}
259462306a36Sopenharmony_ci
259562306a36Sopenharmony_ci	return	tx_pwr_diff;
259662306a36Sopenharmony_ci}
259762306a36Sopenharmony_ci
259862306a36Sopenharmony_cistatic u8 _rtl8821ae_get_txpower_index(struct ieee80211_hw *hw, u8 path,
259962306a36Sopenharmony_ci					u8 rate, u8 bandwidth, u8 channel)
260062306a36Sopenharmony_ci{
260162306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
260262306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
260362306a36Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
260462306a36Sopenharmony_ci	u8 index = (channel - 1);
260562306a36Sopenharmony_ci	u8 txpower = 0;
260662306a36Sopenharmony_ci	bool in_24g = false;
260762306a36Sopenharmony_ci	s8 powerdiff_byrate = 0;
260862306a36Sopenharmony_ci
260962306a36Sopenharmony_ci	if (((rtlhal->current_bandtype == BAND_ON_2_4G) &&
261062306a36Sopenharmony_ci	    (channel > 14 || channel < 1)) ||
261162306a36Sopenharmony_ci	    ((rtlhal->current_bandtype == BAND_ON_5G) && (channel <= 14))) {
261262306a36Sopenharmony_ci		index = 0;
261362306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
261462306a36Sopenharmony_ci			"Illegal channel!!\n");
261562306a36Sopenharmony_ci	}
261662306a36Sopenharmony_ci
261762306a36Sopenharmony_ci	in_24g = _rtl8821ae_phy_get_chnl_index(channel, &index);
261862306a36Sopenharmony_ci	if (in_24g) {
261962306a36Sopenharmony_ci		if (RTL8821AE_RX_HAL_IS_CCK_RATE(rate))
262062306a36Sopenharmony_ci			txpower = rtlefuse->txpwrlevel_cck[path][index];
262162306a36Sopenharmony_ci		else if (DESC_RATE6M <= rate)
262262306a36Sopenharmony_ci			txpower = rtlefuse->txpwrlevel_ht40_1s[path][index];
262362306a36Sopenharmony_ci		else
262462306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, "invalid rate\n");
262562306a36Sopenharmony_ci
262662306a36Sopenharmony_ci		if (DESC_RATE6M <= rate && rate <= DESC_RATE54M &&
262762306a36Sopenharmony_ci		    !RTL8821AE_RX_HAL_IS_CCK_RATE(rate))
262862306a36Sopenharmony_ci			txpower += rtlefuse->txpwr_legacyhtdiff[path][TX_1S];
262962306a36Sopenharmony_ci
263062306a36Sopenharmony_ci		if (bandwidth == HT_CHANNEL_WIDTH_20) {
263162306a36Sopenharmony_ci			if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
263262306a36Sopenharmony_ci				(DESC_RATEVHT1SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9))
263362306a36Sopenharmony_ci				txpower += rtlefuse->txpwr_ht20diff[path][TX_1S];
263462306a36Sopenharmony_ci			if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
263562306a36Sopenharmony_ci				(DESC_RATEVHT2SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9))
263662306a36Sopenharmony_ci				txpower += rtlefuse->txpwr_ht20diff[path][TX_2S];
263762306a36Sopenharmony_ci		} else if (bandwidth == HT_CHANNEL_WIDTH_20_40) {
263862306a36Sopenharmony_ci			if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
263962306a36Sopenharmony_ci				(DESC_RATEVHT1SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9))
264062306a36Sopenharmony_ci				txpower += rtlefuse->txpwr_ht40diff[path][TX_1S];
264162306a36Sopenharmony_ci			if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
264262306a36Sopenharmony_ci				(DESC_RATEVHT2SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9))
264362306a36Sopenharmony_ci				txpower += rtlefuse->txpwr_ht40diff[path][TX_2S];
264462306a36Sopenharmony_ci		} else if (bandwidth == HT_CHANNEL_WIDTH_80) {
264562306a36Sopenharmony_ci			if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
264662306a36Sopenharmony_ci			    (DESC_RATEVHT1SS_MCS0 <= rate &&
264762306a36Sopenharmony_ci			     rate <= DESC_RATEVHT2SS_MCS9))
264862306a36Sopenharmony_ci				txpower += rtlefuse->txpwr_ht40diff[path][TX_1S];
264962306a36Sopenharmony_ci			if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
265062306a36Sopenharmony_ci			    (DESC_RATEVHT2SS_MCS0 <= rate &&
265162306a36Sopenharmony_ci			     rate <= DESC_RATEVHT2SS_MCS9))
265262306a36Sopenharmony_ci				txpower += rtlefuse->txpwr_ht40diff[path][TX_2S];
265362306a36Sopenharmony_ci		}
265462306a36Sopenharmony_ci	} else {
265562306a36Sopenharmony_ci		if (DESC_RATE6M <= rate)
265662306a36Sopenharmony_ci			txpower = rtlefuse->txpwr_5g_bw40base[path][index];
265762306a36Sopenharmony_ci		else
265862306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_WARNING,
265962306a36Sopenharmony_ci				"INVALID Rate.\n");
266062306a36Sopenharmony_ci
266162306a36Sopenharmony_ci		if (DESC_RATE6M <= rate && rate <= DESC_RATE54M &&
266262306a36Sopenharmony_ci		    !RTL8821AE_RX_HAL_IS_CCK_RATE(rate))
266362306a36Sopenharmony_ci			txpower += rtlefuse->txpwr_5g_ofdmdiff[path][TX_1S];
266462306a36Sopenharmony_ci
266562306a36Sopenharmony_ci		if (bandwidth == HT_CHANNEL_WIDTH_20) {
266662306a36Sopenharmony_ci			if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
266762306a36Sopenharmony_ci			    (DESC_RATEVHT1SS_MCS0 <= rate &&
266862306a36Sopenharmony_ci			     rate <= DESC_RATEVHT2SS_MCS9))
266962306a36Sopenharmony_ci				txpower += rtlefuse->txpwr_5g_bw20diff[path][TX_1S];
267062306a36Sopenharmony_ci			if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
267162306a36Sopenharmony_ci			    (DESC_RATEVHT2SS_MCS0 <= rate &&
267262306a36Sopenharmony_ci			     rate <= DESC_RATEVHT2SS_MCS9))
267362306a36Sopenharmony_ci				txpower += rtlefuse->txpwr_5g_bw20diff[path][TX_2S];
267462306a36Sopenharmony_ci		} else if (bandwidth == HT_CHANNEL_WIDTH_20_40) {
267562306a36Sopenharmony_ci			if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
267662306a36Sopenharmony_ci			    (DESC_RATEVHT1SS_MCS0 <= rate &&
267762306a36Sopenharmony_ci			     rate <= DESC_RATEVHT2SS_MCS9))
267862306a36Sopenharmony_ci				txpower += rtlefuse->txpwr_5g_bw40diff[path][TX_1S];
267962306a36Sopenharmony_ci			if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
268062306a36Sopenharmony_ci			    (DESC_RATEVHT2SS_MCS0 <= rate &&
268162306a36Sopenharmony_ci			     rate <= DESC_RATEVHT2SS_MCS9))
268262306a36Sopenharmony_ci				txpower += rtlefuse->txpwr_5g_bw40diff[path][TX_2S];
268362306a36Sopenharmony_ci		} else if (bandwidth == HT_CHANNEL_WIDTH_80) {
268462306a36Sopenharmony_ci			u8 i;
268562306a36Sopenharmony_ci
268662306a36Sopenharmony_ci			for (i = 0; i < sizeof(channel5g_80m) / sizeof(u8); ++i)
268762306a36Sopenharmony_ci				if (channel5g_80m[i] == channel)
268862306a36Sopenharmony_ci					index = i;
268962306a36Sopenharmony_ci
269062306a36Sopenharmony_ci			if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
269162306a36Sopenharmony_ci			    (DESC_RATEVHT1SS_MCS0 <= rate &&
269262306a36Sopenharmony_ci			     rate <= DESC_RATEVHT2SS_MCS9))
269362306a36Sopenharmony_ci				txpower = rtlefuse->txpwr_5g_bw80base[path][index]
269462306a36Sopenharmony_ci					+ rtlefuse->txpwr_5g_bw80diff[path][TX_1S];
269562306a36Sopenharmony_ci			if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
269662306a36Sopenharmony_ci			    (DESC_RATEVHT2SS_MCS0 <= rate &&
269762306a36Sopenharmony_ci			     rate <= DESC_RATEVHT2SS_MCS9))
269862306a36Sopenharmony_ci				txpower = rtlefuse->txpwr_5g_bw80base[path][index]
269962306a36Sopenharmony_ci					+ rtlefuse->txpwr_5g_bw80diff[path][TX_1S]
270062306a36Sopenharmony_ci					+ rtlefuse->txpwr_5g_bw80diff[path][TX_2S];
270162306a36Sopenharmony_ci		    }
270262306a36Sopenharmony_ci	}
270362306a36Sopenharmony_ci	if (rtlefuse->eeprom_regulatory != 2)
270462306a36Sopenharmony_ci		powerdiff_byrate =
270562306a36Sopenharmony_ci		  _rtl8821ae_phy_get_txpower_by_rate(hw, (u8)(!in_24g),
270662306a36Sopenharmony_ci						     path, rate);
270762306a36Sopenharmony_ci
270862306a36Sopenharmony_ci	if (rate == DESC_RATEVHT1SS_MCS8 || rate == DESC_RATEVHT1SS_MCS9 ||
270962306a36Sopenharmony_ci	    rate == DESC_RATEVHT2SS_MCS8 || rate == DESC_RATEVHT2SS_MCS9)
271062306a36Sopenharmony_ci		txpower -= powerdiff_byrate;
271162306a36Sopenharmony_ci	else
271262306a36Sopenharmony_ci		txpower += powerdiff_byrate;
271362306a36Sopenharmony_ci
271462306a36Sopenharmony_ci	if (rate > DESC_RATE11M)
271562306a36Sopenharmony_ci		txpower += rtlpriv->dm.remnant_ofdm_swing_idx[path];
271662306a36Sopenharmony_ci	else
271762306a36Sopenharmony_ci		txpower += rtlpriv->dm.remnant_cck_idx;
271862306a36Sopenharmony_ci
271962306a36Sopenharmony_ci	if (txpower > MAX_POWER_INDEX)
272062306a36Sopenharmony_ci		txpower = MAX_POWER_INDEX;
272162306a36Sopenharmony_ci
272262306a36Sopenharmony_ci	return txpower;
272362306a36Sopenharmony_ci}
272462306a36Sopenharmony_ci
272562306a36Sopenharmony_cistatic void _rtl8821ae_phy_set_txpower_index(struct ieee80211_hw *hw,
272662306a36Sopenharmony_ci					     u8 power_index, u8 path, u8 rate)
272762306a36Sopenharmony_ci{
272862306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
272962306a36Sopenharmony_ci
273062306a36Sopenharmony_ci	if (path == RF90_PATH_A) {
273162306a36Sopenharmony_ci		switch (rate) {
273262306a36Sopenharmony_ci		case DESC_RATE1M:
273362306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1,
273462306a36Sopenharmony_ci				      MASKBYTE0, power_index);
273562306a36Sopenharmony_ci			break;
273662306a36Sopenharmony_ci		case DESC_RATE2M:
273762306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1,
273862306a36Sopenharmony_ci				      MASKBYTE1, power_index);
273962306a36Sopenharmony_ci			break;
274062306a36Sopenharmony_ci		case DESC_RATE5_5M:
274162306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1,
274262306a36Sopenharmony_ci				      MASKBYTE2, power_index);
274362306a36Sopenharmony_ci			break;
274462306a36Sopenharmony_ci		case DESC_RATE11M:
274562306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1,
274662306a36Sopenharmony_ci				      MASKBYTE3, power_index);
274762306a36Sopenharmony_ci			break;
274862306a36Sopenharmony_ci		case DESC_RATE6M:
274962306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6,
275062306a36Sopenharmony_ci				      MASKBYTE0, power_index);
275162306a36Sopenharmony_ci			break;
275262306a36Sopenharmony_ci		case DESC_RATE9M:
275362306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6,
275462306a36Sopenharmony_ci				      MASKBYTE1, power_index);
275562306a36Sopenharmony_ci			break;
275662306a36Sopenharmony_ci		case DESC_RATE12M:
275762306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6,
275862306a36Sopenharmony_ci				      MASKBYTE2, power_index);
275962306a36Sopenharmony_ci			break;
276062306a36Sopenharmony_ci		case DESC_RATE18M:
276162306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6,
276262306a36Sopenharmony_ci				      MASKBYTE3, power_index);
276362306a36Sopenharmony_ci			break;
276462306a36Sopenharmony_ci		case DESC_RATE24M:
276562306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24,
276662306a36Sopenharmony_ci				      MASKBYTE0, power_index);
276762306a36Sopenharmony_ci			break;
276862306a36Sopenharmony_ci		case DESC_RATE36M:
276962306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24,
277062306a36Sopenharmony_ci				      MASKBYTE1, power_index);
277162306a36Sopenharmony_ci			break;
277262306a36Sopenharmony_ci		case DESC_RATE48M:
277362306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24,
277462306a36Sopenharmony_ci				      MASKBYTE2, power_index);
277562306a36Sopenharmony_ci			break;
277662306a36Sopenharmony_ci		case DESC_RATE54M:
277762306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24,
277862306a36Sopenharmony_ci				      MASKBYTE3, power_index);
277962306a36Sopenharmony_ci			break;
278062306a36Sopenharmony_ci		case DESC_RATEMCS0:
278162306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
278262306a36Sopenharmony_ci				      MASKBYTE0, power_index);
278362306a36Sopenharmony_ci			break;
278462306a36Sopenharmony_ci		case DESC_RATEMCS1:
278562306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
278662306a36Sopenharmony_ci				      MASKBYTE1, power_index);
278762306a36Sopenharmony_ci			break;
278862306a36Sopenharmony_ci		case DESC_RATEMCS2:
278962306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
279062306a36Sopenharmony_ci				      MASKBYTE2, power_index);
279162306a36Sopenharmony_ci			break;
279262306a36Sopenharmony_ci		case DESC_RATEMCS3:
279362306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
279462306a36Sopenharmony_ci				      MASKBYTE3, power_index);
279562306a36Sopenharmony_ci			break;
279662306a36Sopenharmony_ci		case DESC_RATEMCS4:
279762306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
279862306a36Sopenharmony_ci				      MASKBYTE0, power_index);
279962306a36Sopenharmony_ci			break;
280062306a36Sopenharmony_ci		case DESC_RATEMCS5:
280162306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
280262306a36Sopenharmony_ci				      MASKBYTE1, power_index);
280362306a36Sopenharmony_ci			break;
280462306a36Sopenharmony_ci		case DESC_RATEMCS6:
280562306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
280662306a36Sopenharmony_ci				      MASKBYTE2, power_index);
280762306a36Sopenharmony_ci			break;
280862306a36Sopenharmony_ci		case DESC_RATEMCS7:
280962306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
281062306a36Sopenharmony_ci				      MASKBYTE3, power_index);
281162306a36Sopenharmony_ci			break;
281262306a36Sopenharmony_ci		case DESC_RATEMCS8:
281362306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
281462306a36Sopenharmony_ci				      MASKBYTE0, power_index);
281562306a36Sopenharmony_ci			break;
281662306a36Sopenharmony_ci		case DESC_RATEMCS9:
281762306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
281862306a36Sopenharmony_ci				      MASKBYTE1, power_index);
281962306a36Sopenharmony_ci			break;
282062306a36Sopenharmony_ci		case DESC_RATEMCS10:
282162306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
282262306a36Sopenharmony_ci				      MASKBYTE2, power_index);
282362306a36Sopenharmony_ci			break;
282462306a36Sopenharmony_ci		case DESC_RATEMCS11:
282562306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
282662306a36Sopenharmony_ci				      MASKBYTE3, power_index);
282762306a36Sopenharmony_ci			break;
282862306a36Sopenharmony_ci		case DESC_RATEMCS12:
282962306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
283062306a36Sopenharmony_ci				      MASKBYTE0, power_index);
283162306a36Sopenharmony_ci			break;
283262306a36Sopenharmony_ci		case DESC_RATEMCS13:
283362306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
283462306a36Sopenharmony_ci				      MASKBYTE1, power_index);
283562306a36Sopenharmony_ci			break;
283662306a36Sopenharmony_ci		case DESC_RATEMCS14:
283762306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
283862306a36Sopenharmony_ci				      MASKBYTE2, power_index);
283962306a36Sopenharmony_ci			break;
284062306a36Sopenharmony_ci		case DESC_RATEMCS15:
284162306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
284262306a36Sopenharmony_ci				      MASKBYTE3, power_index);
284362306a36Sopenharmony_ci			break;
284462306a36Sopenharmony_ci		case DESC_RATEVHT1SS_MCS0:
284562306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0,
284662306a36Sopenharmony_ci				      MASKBYTE0, power_index);
284762306a36Sopenharmony_ci			break;
284862306a36Sopenharmony_ci		case DESC_RATEVHT1SS_MCS1:
284962306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0,
285062306a36Sopenharmony_ci				      MASKBYTE1, power_index);
285162306a36Sopenharmony_ci			break;
285262306a36Sopenharmony_ci		case DESC_RATEVHT1SS_MCS2:
285362306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0,
285462306a36Sopenharmony_ci				      MASKBYTE2, power_index);
285562306a36Sopenharmony_ci			break;
285662306a36Sopenharmony_ci		case DESC_RATEVHT1SS_MCS3:
285762306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0,
285862306a36Sopenharmony_ci				      MASKBYTE3, power_index);
285962306a36Sopenharmony_ci			break;
286062306a36Sopenharmony_ci		case DESC_RATEVHT1SS_MCS4:
286162306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4,
286262306a36Sopenharmony_ci				      MASKBYTE0, power_index);
286362306a36Sopenharmony_ci			break;
286462306a36Sopenharmony_ci		case DESC_RATEVHT1SS_MCS5:
286562306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4,
286662306a36Sopenharmony_ci				      MASKBYTE1, power_index);
286762306a36Sopenharmony_ci			break;
286862306a36Sopenharmony_ci		case DESC_RATEVHT1SS_MCS6:
286962306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4,
287062306a36Sopenharmony_ci				      MASKBYTE2, power_index);
287162306a36Sopenharmony_ci			break;
287262306a36Sopenharmony_ci		case DESC_RATEVHT1SS_MCS7:
287362306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4,
287462306a36Sopenharmony_ci				      MASKBYTE3, power_index);
287562306a36Sopenharmony_ci			break;
287662306a36Sopenharmony_ci		case DESC_RATEVHT1SS_MCS8:
287762306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8,
287862306a36Sopenharmony_ci				      MASKBYTE0, power_index);
287962306a36Sopenharmony_ci			break;
288062306a36Sopenharmony_ci		case DESC_RATEVHT1SS_MCS9:
288162306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8,
288262306a36Sopenharmony_ci				      MASKBYTE1, power_index);
288362306a36Sopenharmony_ci			break;
288462306a36Sopenharmony_ci		case DESC_RATEVHT2SS_MCS0:
288562306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8,
288662306a36Sopenharmony_ci				      MASKBYTE2, power_index);
288762306a36Sopenharmony_ci			break;
288862306a36Sopenharmony_ci		case DESC_RATEVHT2SS_MCS1:
288962306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8,
289062306a36Sopenharmony_ci				      MASKBYTE3, power_index);
289162306a36Sopenharmony_ci			break;
289262306a36Sopenharmony_ci		case DESC_RATEVHT2SS_MCS2:
289362306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2,
289462306a36Sopenharmony_ci				      MASKBYTE0, power_index);
289562306a36Sopenharmony_ci			break;
289662306a36Sopenharmony_ci		case DESC_RATEVHT2SS_MCS3:
289762306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2,
289862306a36Sopenharmony_ci				      MASKBYTE1, power_index);
289962306a36Sopenharmony_ci			break;
290062306a36Sopenharmony_ci		case DESC_RATEVHT2SS_MCS4:
290162306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2,
290262306a36Sopenharmony_ci				      MASKBYTE2, power_index);
290362306a36Sopenharmony_ci			break;
290462306a36Sopenharmony_ci		case DESC_RATEVHT2SS_MCS5:
290562306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2,
290662306a36Sopenharmony_ci				      MASKBYTE3, power_index);
290762306a36Sopenharmony_ci			break;
290862306a36Sopenharmony_ci		case DESC_RATEVHT2SS_MCS6:
290962306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6,
291062306a36Sopenharmony_ci				      MASKBYTE0, power_index);
291162306a36Sopenharmony_ci			break;
291262306a36Sopenharmony_ci		case DESC_RATEVHT2SS_MCS7:
291362306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6,
291462306a36Sopenharmony_ci				      MASKBYTE1, power_index);
291562306a36Sopenharmony_ci			break;
291662306a36Sopenharmony_ci		case DESC_RATEVHT2SS_MCS8:
291762306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6,
291862306a36Sopenharmony_ci				      MASKBYTE2, power_index);
291962306a36Sopenharmony_ci			break;
292062306a36Sopenharmony_ci		case DESC_RATEVHT2SS_MCS9:
292162306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6,
292262306a36Sopenharmony_ci				      MASKBYTE3, power_index);
292362306a36Sopenharmony_ci			break;
292462306a36Sopenharmony_ci		default:
292562306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
292662306a36Sopenharmony_ci				"Invalid Rate!!\n");
292762306a36Sopenharmony_ci			break;
292862306a36Sopenharmony_ci		}
292962306a36Sopenharmony_ci	} else if (path == RF90_PATH_B) {
293062306a36Sopenharmony_ci		switch (rate) {
293162306a36Sopenharmony_ci		case DESC_RATE1M:
293262306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1,
293362306a36Sopenharmony_ci				      MASKBYTE0, power_index);
293462306a36Sopenharmony_ci			break;
293562306a36Sopenharmony_ci		case DESC_RATE2M:
293662306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1,
293762306a36Sopenharmony_ci				      MASKBYTE1, power_index);
293862306a36Sopenharmony_ci			break;
293962306a36Sopenharmony_ci		case DESC_RATE5_5M:
294062306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1,
294162306a36Sopenharmony_ci				      MASKBYTE2, power_index);
294262306a36Sopenharmony_ci			break;
294362306a36Sopenharmony_ci		case DESC_RATE11M:
294462306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1,
294562306a36Sopenharmony_ci				      MASKBYTE3, power_index);
294662306a36Sopenharmony_ci			break;
294762306a36Sopenharmony_ci		case DESC_RATE6M:
294862306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6,
294962306a36Sopenharmony_ci				      MASKBYTE0, power_index);
295062306a36Sopenharmony_ci			break;
295162306a36Sopenharmony_ci		case DESC_RATE9M:
295262306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6,
295362306a36Sopenharmony_ci				      MASKBYTE1, power_index);
295462306a36Sopenharmony_ci			break;
295562306a36Sopenharmony_ci		case DESC_RATE12M:
295662306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6,
295762306a36Sopenharmony_ci				      MASKBYTE2, power_index);
295862306a36Sopenharmony_ci			break;
295962306a36Sopenharmony_ci		case DESC_RATE18M:
296062306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6,
296162306a36Sopenharmony_ci				      MASKBYTE3, power_index);
296262306a36Sopenharmony_ci			break;
296362306a36Sopenharmony_ci		case DESC_RATE24M:
296462306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24,
296562306a36Sopenharmony_ci				      MASKBYTE0, power_index);
296662306a36Sopenharmony_ci			break;
296762306a36Sopenharmony_ci		case DESC_RATE36M:
296862306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24,
296962306a36Sopenharmony_ci				      MASKBYTE1, power_index);
297062306a36Sopenharmony_ci			break;
297162306a36Sopenharmony_ci		case DESC_RATE48M:
297262306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24,
297362306a36Sopenharmony_ci				      MASKBYTE2, power_index);
297462306a36Sopenharmony_ci			break;
297562306a36Sopenharmony_ci		case DESC_RATE54M:
297662306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24,
297762306a36Sopenharmony_ci				      MASKBYTE3, power_index);
297862306a36Sopenharmony_ci			break;
297962306a36Sopenharmony_ci		case DESC_RATEMCS0:
298062306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
298162306a36Sopenharmony_ci				      MASKBYTE0, power_index);
298262306a36Sopenharmony_ci			break;
298362306a36Sopenharmony_ci		case DESC_RATEMCS1:
298462306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
298562306a36Sopenharmony_ci				      MASKBYTE1, power_index);
298662306a36Sopenharmony_ci			break;
298762306a36Sopenharmony_ci		case DESC_RATEMCS2:
298862306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
298962306a36Sopenharmony_ci				      MASKBYTE2, power_index);
299062306a36Sopenharmony_ci			break;
299162306a36Sopenharmony_ci		case DESC_RATEMCS3:
299262306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
299362306a36Sopenharmony_ci				      MASKBYTE3, power_index);
299462306a36Sopenharmony_ci			break;
299562306a36Sopenharmony_ci		case DESC_RATEMCS4:
299662306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
299762306a36Sopenharmony_ci				      MASKBYTE0, power_index);
299862306a36Sopenharmony_ci			break;
299962306a36Sopenharmony_ci		case DESC_RATEMCS5:
300062306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
300162306a36Sopenharmony_ci				      MASKBYTE1, power_index);
300262306a36Sopenharmony_ci			break;
300362306a36Sopenharmony_ci		case DESC_RATEMCS6:
300462306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
300562306a36Sopenharmony_ci				      MASKBYTE2, power_index);
300662306a36Sopenharmony_ci			break;
300762306a36Sopenharmony_ci		case DESC_RATEMCS7:
300862306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
300962306a36Sopenharmony_ci				      MASKBYTE3, power_index);
301062306a36Sopenharmony_ci			break;
301162306a36Sopenharmony_ci		case DESC_RATEMCS8:
301262306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
301362306a36Sopenharmony_ci				      MASKBYTE0, power_index);
301462306a36Sopenharmony_ci			break;
301562306a36Sopenharmony_ci		case DESC_RATEMCS9:
301662306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
301762306a36Sopenharmony_ci				      MASKBYTE1, power_index);
301862306a36Sopenharmony_ci			break;
301962306a36Sopenharmony_ci		case DESC_RATEMCS10:
302062306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
302162306a36Sopenharmony_ci				      MASKBYTE2, power_index);
302262306a36Sopenharmony_ci			break;
302362306a36Sopenharmony_ci		case DESC_RATEMCS11:
302462306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
302562306a36Sopenharmony_ci				      MASKBYTE3, power_index);
302662306a36Sopenharmony_ci			break;
302762306a36Sopenharmony_ci		case DESC_RATEMCS12:
302862306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
302962306a36Sopenharmony_ci				      MASKBYTE0, power_index);
303062306a36Sopenharmony_ci			break;
303162306a36Sopenharmony_ci		case DESC_RATEMCS13:
303262306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
303362306a36Sopenharmony_ci				      MASKBYTE1, power_index);
303462306a36Sopenharmony_ci			break;
303562306a36Sopenharmony_ci		case DESC_RATEMCS14:
303662306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
303762306a36Sopenharmony_ci				      MASKBYTE2, power_index);
303862306a36Sopenharmony_ci			break;
303962306a36Sopenharmony_ci		case DESC_RATEMCS15:
304062306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
304162306a36Sopenharmony_ci				      MASKBYTE3, power_index);
304262306a36Sopenharmony_ci			break;
304362306a36Sopenharmony_ci		case DESC_RATEVHT1SS_MCS0:
304462306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0,
304562306a36Sopenharmony_ci				      MASKBYTE0, power_index);
304662306a36Sopenharmony_ci			break;
304762306a36Sopenharmony_ci		case DESC_RATEVHT1SS_MCS1:
304862306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0,
304962306a36Sopenharmony_ci				      MASKBYTE1, power_index);
305062306a36Sopenharmony_ci			break;
305162306a36Sopenharmony_ci		case DESC_RATEVHT1SS_MCS2:
305262306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0,
305362306a36Sopenharmony_ci				      MASKBYTE2, power_index);
305462306a36Sopenharmony_ci			break;
305562306a36Sopenharmony_ci		case DESC_RATEVHT1SS_MCS3:
305662306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0,
305762306a36Sopenharmony_ci				      MASKBYTE3, power_index);
305862306a36Sopenharmony_ci			break;
305962306a36Sopenharmony_ci		case DESC_RATEVHT1SS_MCS4:
306062306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4,
306162306a36Sopenharmony_ci				      MASKBYTE0, power_index);
306262306a36Sopenharmony_ci			break;
306362306a36Sopenharmony_ci		case DESC_RATEVHT1SS_MCS5:
306462306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4,
306562306a36Sopenharmony_ci				      MASKBYTE1, power_index);
306662306a36Sopenharmony_ci			break;
306762306a36Sopenharmony_ci		case DESC_RATEVHT1SS_MCS6:
306862306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4,
306962306a36Sopenharmony_ci				      MASKBYTE2, power_index);
307062306a36Sopenharmony_ci			break;
307162306a36Sopenharmony_ci		case DESC_RATEVHT1SS_MCS7:
307262306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4,
307362306a36Sopenharmony_ci				      MASKBYTE3, power_index);
307462306a36Sopenharmony_ci			break;
307562306a36Sopenharmony_ci		case DESC_RATEVHT1SS_MCS8:
307662306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8,
307762306a36Sopenharmony_ci				      MASKBYTE0, power_index);
307862306a36Sopenharmony_ci			break;
307962306a36Sopenharmony_ci		case DESC_RATEVHT1SS_MCS9:
308062306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8,
308162306a36Sopenharmony_ci				      MASKBYTE1, power_index);
308262306a36Sopenharmony_ci			break;
308362306a36Sopenharmony_ci		case DESC_RATEVHT2SS_MCS0:
308462306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8,
308562306a36Sopenharmony_ci				      MASKBYTE2, power_index);
308662306a36Sopenharmony_ci			break;
308762306a36Sopenharmony_ci		case DESC_RATEVHT2SS_MCS1:
308862306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8,
308962306a36Sopenharmony_ci				      MASKBYTE3, power_index);
309062306a36Sopenharmony_ci			break;
309162306a36Sopenharmony_ci		case DESC_RATEVHT2SS_MCS2:
309262306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2,
309362306a36Sopenharmony_ci				      MASKBYTE0, power_index);
309462306a36Sopenharmony_ci			break;
309562306a36Sopenharmony_ci		case DESC_RATEVHT2SS_MCS3:
309662306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2,
309762306a36Sopenharmony_ci				      MASKBYTE1, power_index);
309862306a36Sopenharmony_ci			break;
309962306a36Sopenharmony_ci		case DESC_RATEVHT2SS_MCS4:
310062306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2,
310162306a36Sopenharmony_ci				      MASKBYTE2, power_index);
310262306a36Sopenharmony_ci			break;
310362306a36Sopenharmony_ci		case DESC_RATEVHT2SS_MCS5:
310462306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2,
310562306a36Sopenharmony_ci				      MASKBYTE3, power_index);
310662306a36Sopenharmony_ci			break;
310762306a36Sopenharmony_ci		case DESC_RATEVHT2SS_MCS6:
310862306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6,
310962306a36Sopenharmony_ci				      MASKBYTE0, power_index);
311062306a36Sopenharmony_ci			break;
311162306a36Sopenharmony_ci		case DESC_RATEVHT2SS_MCS7:
311262306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6,
311362306a36Sopenharmony_ci				      MASKBYTE1, power_index);
311462306a36Sopenharmony_ci			break;
311562306a36Sopenharmony_ci		case DESC_RATEVHT2SS_MCS8:
311662306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6,
311762306a36Sopenharmony_ci				      MASKBYTE2, power_index);
311862306a36Sopenharmony_ci			break;
311962306a36Sopenharmony_ci		case DESC_RATEVHT2SS_MCS9:
312062306a36Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6,
312162306a36Sopenharmony_ci				      MASKBYTE3, power_index);
312262306a36Sopenharmony_ci			break;
312362306a36Sopenharmony_ci		default:
312462306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
312562306a36Sopenharmony_ci				"Invalid Rate!!\n");
312662306a36Sopenharmony_ci			break;
312762306a36Sopenharmony_ci		}
312862306a36Sopenharmony_ci	} else {
312962306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
313062306a36Sopenharmony_ci			"Invalid RFPath!!\n");
313162306a36Sopenharmony_ci	}
313262306a36Sopenharmony_ci}
313362306a36Sopenharmony_ci
313462306a36Sopenharmony_cistatic void _rtl8821ae_phy_set_txpower_level_by_path(struct ieee80211_hw *hw,
313562306a36Sopenharmony_ci						     u8 *array, u8 path,
313662306a36Sopenharmony_ci						     u8 channel, u8 size)
313762306a36Sopenharmony_ci{
313862306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
313962306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
314062306a36Sopenharmony_ci	u8 i;
314162306a36Sopenharmony_ci	u8 power_index;
314262306a36Sopenharmony_ci
314362306a36Sopenharmony_ci	for (i = 0; i < size; i++) {
314462306a36Sopenharmony_ci		power_index =
314562306a36Sopenharmony_ci		  _rtl8821ae_get_txpower_index(hw, path, array[i],
314662306a36Sopenharmony_ci					       rtlphy->current_chan_bw,
314762306a36Sopenharmony_ci					       channel);
314862306a36Sopenharmony_ci		_rtl8821ae_phy_set_txpower_index(hw, power_index, path,
314962306a36Sopenharmony_ci						 array[i]);
315062306a36Sopenharmony_ci	}
315162306a36Sopenharmony_ci}
315262306a36Sopenharmony_ci
315362306a36Sopenharmony_cistatic void _rtl8821ae_phy_txpower_training_by_path(struct ieee80211_hw *hw,
315462306a36Sopenharmony_ci						    u8 bw, u8 channel, u8 path)
315562306a36Sopenharmony_ci{
315662306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
315762306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
315862306a36Sopenharmony_ci
315962306a36Sopenharmony_ci	u8 i;
316062306a36Sopenharmony_ci	u32 power_level, data, offset;
316162306a36Sopenharmony_ci
316262306a36Sopenharmony_ci	if (path >= rtlphy->num_total_rfpath)
316362306a36Sopenharmony_ci		return;
316462306a36Sopenharmony_ci
316562306a36Sopenharmony_ci	data = 0;
316662306a36Sopenharmony_ci	if (path == RF90_PATH_A) {
316762306a36Sopenharmony_ci		power_level =
316862306a36Sopenharmony_ci			_rtl8821ae_get_txpower_index(hw, RF90_PATH_A,
316962306a36Sopenharmony_ci			DESC_RATEMCS7, bw, channel);
317062306a36Sopenharmony_ci		offset =  RA_TXPWRTRAING;
317162306a36Sopenharmony_ci	} else {
317262306a36Sopenharmony_ci		power_level =
317362306a36Sopenharmony_ci			_rtl8821ae_get_txpower_index(hw, RF90_PATH_B,
317462306a36Sopenharmony_ci			DESC_RATEMCS7, bw, channel);
317562306a36Sopenharmony_ci		offset =  RB_TXPWRTRAING;
317662306a36Sopenharmony_ci	}
317762306a36Sopenharmony_ci
317862306a36Sopenharmony_ci	for (i = 0; i < 3; i++) {
317962306a36Sopenharmony_ci		if (i == 0)
318062306a36Sopenharmony_ci			power_level = power_level - 10;
318162306a36Sopenharmony_ci		else if (i == 1)
318262306a36Sopenharmony_ci			power_level = power_level - 8;
318362306a36Sopenharmony_ci		else
318462306a36Sopenharmony_ci			power_level = power_level - 6;
318562306a36Sopenharmony_ci
318662306a36Sopenharmony_ci		data |= (((power_level > 2) ? (power_level) : 2) << (i * 8));
318762306a36Sopenharmony_ci	}
318862306a36Sopenharmony_ci	rtl_set_bbreg(hw, offset, 0xffffff, data);
318962306a36Sopenharmony_ci}
319062306a36Sopenharmony_ci
319162306a36Sopenharmony_civoid rtl8821ae_phy_set_txpower_level_by_path(struct ieee80211_hw *hw,
319262306a36Sopenharmony_ci					     u8 channel, u8 path)
319362306a36Sopenharmony_ci{
319462306a36Sopenharmony_ci	/* struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); */
319562306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
319662306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
319762306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
319862306a36Sopenharmony_ci	u8 cck_rates[]  = {DESC_RATE1M, DESC_RATE2M, DESC_RATE5_5M,
319962306a36Sopenharmony_ci			      DESC_RATE11M};
320062306a36Sopenharmony_ci	u8 sizes_of_cck_retes = 4;
320162306a36Sopenharmony_ci	u8 ofdm_rates[]  = {DESC_RATE6M, DESC_RATE9M, DESC_RATE12M,
320262306a36Sopenharmony_ci				DESC_RATE18M, DESC_RATE24M, DESC_RATE36M,
320362306a36Sopenharmony_ci				DESC_RATE48M, DESC_RATE54M};
320462306a36Sopenharmony_ci	u8 sizes_of_ofdm_retes = 8;
320562306a36Sopenharmony_ci	u8 ht_rates_1t[]  = {DESC_RATEMCS0, DESC_RATEMCS1, DESC_RATEMCS2,
320662306a36Sopenharmony_ci				DESC_RATEMCS3, DESC_RATEMCS4, DESC_RATEMCS5,
320762306a36Sopenharmony_ci				DESC_RATEMCS6, DESC_RATEMCS7};
320862306a36Sopenharmony_ci	u8 sizes_of_ht_retes_1t = 8;
320962306a36Sopenharmony_ci	u8 ht_rates_2t[]  = {DESC_RATEMCS8, DESC_RATEMCS9,
321062306a36Sopenharmony_ci				DESC_RATEMCS10, DESC_RATEMCS11,
321162306a36Sopenharmony_ci				DESC_RATEMCS12, DESC_RATEMCS13,
321262306a36Sopenharmony_ci				DESC_RATEMCS14, DESC_RATEMCS15};
321362306a36Sopenharmony_ci	u8 sizes_of_ht_retes_2t = 8;
321462306a36Sopenharmony_ci	u8 vht_rates_1t[]  = {DESC_RATEVHT1SS_MCS0, DESC_RATEVHT1SS_MCS1,
321562306a36Sopenharmony_ci				DESC_RATEVHT1SS_MCS2, DESC_RATEVHT1SS_MCS3,
321662306a36Sopenharmony_ci				DESC_RATEVHT1SS_MCS4, DESC_RATEVHT1SS_MCS5,
321762306a36Sopenharmony_ci				DESC_RATEVHT1SS_MCS6, DESC_RATEVHT1SS_MCS7,
321862306a36Sopenharmony_ci			     DESC_RATEVHT1SS_MCS8, DESC_RATEVHT1SS_MCS9};
321962306a36Sopenharmony_ci	u8 vht_rates_2t[]  = {DESC_RATEVHT2SS_MCS0, DESC_RATEVHT2SS_MCS1,
322062306a36Sopenharmony_ci				DESC_RATEVHT2SS_MCS2, DESC_RATEVHT2SS_MCS3,
322162306a36Sopenharmony_ci				DESC_RATEVHT2SS_MCS4, DESC_RATEVHT2SS_MCS5,
322262306a36Sopenharmony_ci				DESC_RATEVHT2SS_MCS6, DESC_RATEVHT2SS_MCS7,
322362306a36Sopenharmony_ci				DESC_RATEVHT2SS_MCS8, DESC_RATEVHT2SS_MCS9};
322462306a36Sopenharmony_ci	u8 sizes_of_vht_retes = 10;
322562306a36Sopenharmony_ci
322662306a36Sopenharmony_ci	if (rtlhal->current_bandtype == BAND_ON_2_4G)
322762306a36Sopenharmony_ci		_rtl8821ae_phy_set_txpower_level_by_path(hw, cck_rates, path, channel,
322862306a36Sopenharmony_ci							 sizes_of_cck_retes);
322962306a36Sopenharmony_ci
323062306a36Sopenharmony_ci	_rtl8821ae_phy_set_txpower_level_by_path(hw, ofdm_rates, path, channel,
323162306a36Sopenharmony_ci						 sizes_of_ofdm_retes);
323262306a36Sopenharmony_ci	_rtl8821ae_phy_set_txpower_level_by_path(hw, ht_rates_1t, path, channel,
323362306a36Sopenharmony_ci						 sizes_of_ht_retes_1t);
323462306a36Sopenharmony_ci	_rtl8821ae_phy_set_txpower_level_by_path(hw, vht_rates_1t, path, channel,
323562306a36Sopenharmony_ci						 sizes_of_vht_retes);
323662306a36Sopenharmony_ci
323762306a36Sopenharmony_ci	if (rtlphy->num_total_rfpath >= 2) {
323862306a36Sopenharmony_ci		_rtl8821ae_phy_set_txpower_level_by_path(hw, ht_rates_2t, path,
323962306a36Sopenharmony_ci							 channel,
324062306a36Sopenharmony_ci							 sizes_of_ht_retes_2t);
324162306a36Sopenharmony_ci		_rtl8821ae_phy_set_txpower_level_by_path(hw, vht_rates_2t, path,
324262306a36Sopenharmony_ci							 channel,
324362306a36Sopenharmony_ci							 sizes_of_vht_retes);
324462306a36Sopenharmony_ci	}
324562306a36Sopenharmony_ci
324662306a36Sopenharmony_ci	_rtl8821ae_phy_txpower_training_by_path(hw, rtlphy->current_chan_bw,
324762306a36Sopenharmony_ci						channel, path);
324862306a36Sopenharmony_ci}
324962306a36Sopenharmony_ci
325062306a36Sopenharmony_ci/*just in case, write txpower in DW, to reduce time*/
325162306a36Sopenharmony_civoid rtl8821ae_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
325262306a36Sopenharmony_ci{
325362306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
325462306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
325562306a36Sopenharmony_ci	u8 path = 0;
325662306a36Sopenharmony_ci
325762306a36Sopenharmony_ci	for (path = RF90_PATH_A; path < rtlphy->num_total_rfpath; ++path)
325862306a36Sopenharmony_ci		rtl8821ae_phy_set_txpower_level_by_path(hw, channel, path);
325962306a36Sopenharmony_ci}
326062306a36Sopenharmony_ci
326162306a36Sopenharmony_cistatic long _rtl8821ae_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
326262306a36Sopenharmony_ci					    enum wireless_mode wirelessmode,
326362306a36Sopenharmony_ci					    u8 txpwridx)
326462306a36Sopenharmony_ci{
326562306a36Sopenharmony_ci	long offset;
326662306a36Sopenharmony_ci	long pwrout_dbm;
326762306a36Sopenharmony_ci
326862306a36Sopenharmony_ci	switch (wirelessmode) {
326962306a36Sopenharmony_ci	case WIRELESS_MODE_B:
327062306a36Sopenharmony_ci		offset = -7;
327162306a36Sopenharmony_ci		break;
327262306a36Sopenharmony_ci	case WIRELESS_MODE_G:
327362306a36Sopenharmony_ci	case WIRELESS_MODE_N_24G:
327462306a36Sopenharmony_ci		offset = -8;
327562306a36Sopenharmony_ci		break;
327662306a36Sopenharmony_ci	default:
327762306a36Sopenharmony_ci		offset = -8;
327862306a36Sopenharmony_ci		break;
327962306a36Sopenharmony_ci	}
328062306a36Sopenharmony_ci	pwrout_dbm = txpwridx / 2 + offset;
328162306a36Sopenharmony_ci	return pwrout_dbm;
328262306a36Sopenharmony_ci}
328362306a36Sopenharmony_ci
328462306a36Sopenharmony_civoid rtl8821ae_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
328562306a36Sopenharmony_ci{
328662306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
328762306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
328862306a36Sopenharmony_ci	enum io_type iotype = IO_CMD_PAUSE_BAND0_DM_BY_SCAN;
328962306a36Sopenharmony_ci
329062306a36Sopenharmony_ci	if (!is_hal_stop(rtlhal)) {
329162306a36Sopenharmony_ci		switch (operation) {
329262306a36Sopenharmony_ci		case SCAN_OPT_BACKUP_BAND0:
329362306a36Sopenharmony_ci			iotype = IO_CMD_PAUSE_BAND0_DM_BY_SCAN;
329462306a36Sopenharmony_ci			rtlpriv->cfg->ops->set_hw_reg(hw,
329562306a36Sopenharmony_ci						      HW_VAR_IO_CMD,
329662306a36Sopenharmony_ci						      (u8 *)&iotype);
329762306a36Sopenharmony_ci
329862306a36Sopenharmony_ci			break;
329962306a36Sopenharmony_ci		case SCAN_OPT_BACKUP_BAND1:
330062306a36Sopenharmony_ci			iotype = IO_CMD_PAUSE_BAND1_DM_BY_SCAN;
330162306a36Sopenharmony_ci			rtlpriv->cfg->ops->set_hw_reg(hw,
330262306a36Sopenharmony_ci						      HW_VAR_IO_CMD,
330362306a36Sopenharmony_ci						      (u8 *)&iotype);
330462306a36Sopenharmony_ci
330562306a36Sopenharmony_ci			break;
330662306a36Sopenharmony_ci		case SCAN_OPT_RESTORE:
330762306a36Sopenharmony_ci			iotype = IO_CMD_RESUME_DM_BY_SCAN;
330862306a36Sopenharmony_ci			rtlpriv->cfg->ops->set_hw_reg(hw,
330962306a36Sopenharmony_ci						      HW_VAR_IO_CMD,
331062306a36Sopenharmony_ci						      (u8 *)&iotype);
331162306a36Sopenharmony_ci			break;
331262306a36Sopenharmony_ci		default:
331362306a36Sopenharmony_ci			pr_err("Unknown Scan Backup operation.\n");
331462306a36Sopenharmony_ci			break;
331562306a36Sopenharmony_ci		}
331662306a36Sopenharmony_ci	}
331762306a36Sopenharmony_ci}
331862306a36Sopenharmony_ci
331962306a36Sopenharmony_cistatic void _rtl8821ae_phy_set_reg_bw(struct rtl_priv *rtlpriv, u8 bw)
332062306a36Sopenharmony_ci{
332162306a36Sopenharmony_ci	u16 reg_rf_mode_bw, tmp = 0;
332262306a36Sopenharmony_ci
332362306a36Sopenharmony_ci	reg_rf_mode_bw = rtl_read_word(rtlpriv, REG_TRXPTCL_CTL);
332462306a36Sopenharmony_ci	switch (bw) {
332562306a36Sopenharmony_ci	case HT_CHANNEL_WIDTH_20:
332662306a36Sopenharmony_ci		rtl_write_word(rtlpriv, REG_TRXPTCL_CTL, reg_rf_mode_bw & 0xFE7F);
332762306a36Sopenharmony_ci		break;
332862306a36Sopenharmony_ci	case HT_CHANNEL_WIDTH_20_40:
332962306a36Sopenharmony_ci		tmp = reg_rf_mode_bw | BIT(7);
333062306a36Sopenharmony_ci		rtl_write_word(rtlpriv, REG_TRXPTCL_CTL, tmp & 0xFEFF);
333162306a36Sopenharmony_ci		break;
333262306a36Sopenharmony_ci	case HT_CHANNEL_WIDTH_80:
333362306a36Sopenharmony_ci		tmp = reg_rf_mode_bw | BIT(8);
333462306a36Sopenharmony_ci		rtl_write_word(rtlpriv, REG_TRXPTCL_CTL, tmp & 0xFF7F);
333562306a36Sopenharmony_ci		break;
333662306a36Sopenharmony_ci	default:
333762306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING, "unknown Bandwidth: 0x%x\n", bw);
333862306a36Sopenharmony_ci		break;
333962306a36Sopenharmony_ci	}
334062306a36Sopenharmony_ci}
334162306a36Sopenharmony_ci
334262306a36Sopenharmony_cistatic u8 _rtl8821ae_phy_get_secondary_chnl(struct rtl_priv *rtlpriv)
334362306a36Sopenharmony_ci{
334462306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
334562306a36Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtlpriv);
334662306a36Sopenharmony_ci	u8 sc_set_40 = 0, sc_set_20 = 0;
334762306a36Sopenharmony_ci
334862306a36Sopenharmony_ci	if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80) {
334962306a36Sopenharmony_ci		if (mac->cur_80_prime_sc == PRIME_CHNL_OFFSET_LOWER)
335062306a36Sopenharmony_ci			sc_set_40 = VHT_DATA_SC_40_LOWER_OF_80MHZ;
335162306a36Sopenharmony_ci		else if (mac->cur_80_prime_sc == PRIME_CHNL_OFFSET_UPPER)
335262306a36Sopenharmony_ci			sc_set_40 = VHT_DATA_SC_40_UPPER_OF_80MHZ;
335362306a36Sopenharmony_ci		else
335462306a36Sopenharmony_ci			pr_err("SCMapping: Not Correct Primary40MHz Setting\n");
335562306a36Sopenharmony_ci
335662306a36Sopenharmony_ci		if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_LOWER) &&
335762306a36Sopenharmony_ci			(mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_LOWER))
335862306a36Sopenharmony_ci			sc_set_20 = VHT_DATA_SC_20_LOWEST_OF_80MHZ;
335962306a36Sopenharmony_ci		else if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_UPPER) &&
336062306a36Sopenharmony_ci			(mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_LOWER))
336162306a36Sopenharmony_ci			sc_set_20 = VHT_DATA_SC_20_LOWER_OF_80MHZ;
336262306a36Sopenharmony_ci		else if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_LOWER) &&
336362306a36Sopenharmony_ci			(mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_UPPER))
336462306a36Sopenharmony_ci			sc_set_20 = VHT_DATA_SC_20_UPPER_OF_80MHZ;
336562306a36Sopenharmony_ci		else if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_UPPER) &&
336662306a36Sopenharmony_ci			(mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_UPPER))
336762306a36Sopenharmony_ci			sc_set_20 = VHT_DATA_SC_20_UPPERST_OF_80MHZ;
336862306a36Sopenharmony_ci		else
336962306a36Sopenharmony_ci			pr_err("SCMapping: Not Correct Primary40MHz Setting\n");
337062306a36Sopenharmony_ci	} else if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
337162306a36Sopenharmony_ci		if (mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_UPPER)
337262306a36Sopenharmony_ci			sc_set_20 = VHT_DATA_SC_20_UPPER_OF_80MHZ;
337362306a36Sopenharmony_ci		else if (mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_LOWER)
337462306a36Sopenharmony_ci			sc_set_20 = VHT_DATA_SC_20_LOWER_OF_80MHZ;
337562306a36Sopenharmony_ci		else
337662306a36Sopenharmony_ci			pr_err("SCMapping: Not Correct Primary40MHz Setting\n");
337762306a36Sopenharmony_ci	}
337862306a36Sopenharmony_ci	return (sc_set_40 << 4) | sc_set_20;
337962306a36Sopenharmony_ci}
338062306a36Sopenharmony_ci
338162306a36Sopenharmony_civoid rtl8821ae_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
338262306a36Sopenharmony_ci{
338362306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
338462306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
338562306a36Sopenharmony_ci	u8 sub_chnl = 0;
338662306a36Sopenharmony_ci	u8 l1pk_val = 0;
338762306a36Sopenharmony_ci
338862306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE,
338962306a36Sopenharmony_ci		"Switch to %s bandwidth\n",
339062306a36Sopenharmony_ci		(rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
339162306a36Sopenharmony_ci		 "20MHz" :
339262306a36Sopenharmony_ci		 (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40 ?
339362306a36Sopenharmony_ci		  "40MHz" : "80MHz")));
339462306a36Sopenharmony_ci
339562306a36Sopenharmony_ci	_rtl8821ae_phy_set_reg_bw(rtlpriv, rtlphy->current_chan_bw);
339662306a36Sopenharmony_ci	sub_chnl = _rtl8821ae_phy_get_secondary_chnl(rtlpriv);
339762306a36Sopenharmony_ci	rtl_write_byte(rtlpriv, 0x0483, sub_chnl);
339862306a36Sopenharmony_ci
339962306a36Sopenharmony_ci	switch (rtlphy->current_chan_bw) {
340062306a36Sopenharmony_ci	case HT_CHANNEL_WIDTH_20:
340162306a36Sopenharmony_ci		rtl_set_bbreg(hw, RRFMOD, 0x003003C3, 0x00300200);
340262306a36Sopenharmony_ci		rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 0);
340362306a36Sopenharmony_ci
340462306a36Sopenharmony_ci		if (rtlphy->rf_type == RF_2T2R)
340562306a36Sopenharmony_ci			rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, 7);
340662306a36Sopenharmony_ci		else
340762306a36Sopenharmony_ci			rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, 8);
340862306a36Sopenharmony_ci		break;
340962306a36Sopenharmony_ci	case HT_CHANNEL_WIDTH_20_40:
341062306a36Sopenharmony_ci		rtl_set_bbreg(hw, RRFMOD, 0x003003C3, 0x00300201);
341162306a36Sopenharmony_ci		rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 0);
341262306a36Sopenharmony_ci		rtl_set_bbreg(hw, RRFMOD, 0x3C, sub_chnl);
341362306a36Sopenharmony_ci		rtl_set_bbreg(hw, RCCAONSEC, 0xf0000000, sub_chnl);
341462306a36Sopenharmony_ci
341562306a36Sopenharmony_ci		if (rtlphy->reg_837 & BIT(2))
341662306a36Sopenharmony_ci			l1pk_val = 6;
341762306a36Sopenharmony_ci		else {
341862306a36Sopenharmony_ci			if (rtlphy->rf_type == RF_2T2R)
341962306a36Sopenharmony_ci				l1pk_val = 7;
342062306a36Sopenharmony_ci			else
342162306a36Sopenharmony_ci				l1pk_val = 8;
342262306a36Sopenharmony_ci		}
342362306a36Sopenharmony_ci		/* 0x848[25:22] = 0x6 */
342462306a36Sopenharmony_ci		rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, l1pk_val);
342562306a36Sopenharmony_ci
342662306a36Sopenharmony_ci		if (sub_chnl == VHT_DATA_SC_20_UPPER_OF_80MHZ)
342762306a36Sopenharmony_ci			rtl_set_bbreg(hw, RCCK_SYSTEM, BCCK_SYSTEM, 1);
342862306a36Sopenharmony_ci		else
342962306a36Sopenharmony_ci			rtl_set_bbreg(hw, RCCK_SYSTEM, BCCK_SYSTEM, 0);
343062306a36Sopenharmony_ci		break;
343162306a36Sopenharmony_ci
343262306a36Sopenharmony_ci	case HT_CHANNEL_WIDTH_80:
343362306a36Sopenharmony_ci		 /* 0x8ac[21,20,9:6,1,0]=8'b11100010 */
343462306a36Sopenharmony_ci		rtl_set_bbreg(hw, RRFMOD, 0x003003C3, 0x00300202);
343562306a36Sopenharmony_ci		/* 0x8c4[30] = 1 */
343662306a36Sopenharmony_ci		rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 1);
343762306a36Sopenharmony_ci		rtl_set_bbreg(hw, RRFMOD, 0x3C, sub_chnl);
343862306a36Sopenharmony_ci		rtl_set_bbreg(hw, RCCAONSEC, 0xf0000000, sub_chnl);
343962306a36Sopenharmony_ci
344062306a36Sopenharmony_ci		if (rtlphy->reg_837 & BIT(2))
344162306a36Sopenharmony_ci			l1pk_val = 5;
344262306a36Sopenharmony_ci		else {
344362306a36Sopenharmony_ci			if (rtlphy->rf_type == RF_2T2R)
344462306a36Sopenharmony_ci				l1pk_val = 6;
344562306a36Sopenharmony_ci			else
344662306a36Sopenharmony_ci				l1pk_val = 7;
344762306a36Sopenharmony_ci		}
344862306a36Sopenharmony_ci		rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, l1pk_val);
344962306a36Sopenharmony_ci
345062306a36Sopenharmony_ci		break;
345162306a36Sopenharmony_ci	default:
345262306a36Sopenharmony_ci		pr_err("unknown bandwidth: %#X\n",
345362306a36Sopenharmony_ci		       rtlphy->current_chan_bw);
345462306a36Sopenharmony_ci		break;
345562306a36Sopenharmony_ci	}
345662306a36Sopenharmony_ci
345762306a36Sopenharmony_ci	rtl8812ae_fixspur(hw, rtlphy->current_chan_bw, rtlphy->current_channel);
345862306a36Sopenharmony_ci
345962306a36Sopenharmony_ci	rtl8821ae_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
346062306a36Sopenharmony_ci	rtlphy->set_bwmode_inprogress = false;
346162306a36Sopenharmony_ci
346262306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD, "\n");
346362306a36Sopenharmony_ci}
346462306a36Sopenharmony_ci
346562306a36Sopenharmony_civoid rtl8821ae_phy_set_bw_mode(struct ieee80211_hw *hw,
346662306a36Sopenharmony_ci			    enum nl80211_channel_type ch_type)
346762306a36Sopenharmony_ci{
346862306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
346962306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
347062306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
347162306a36Sopenharmony_ci	u8 tmp_bw = rtlphy->current_chan_bw;
347262306a36Sopenharmony_ci
347362306a36Sopenharmony_ci	if (rtlphy->set_bwmode_inprogress)
347462306a36Sopenharmony_ci		return;
347562306a36Sopenharmony_ci	rtlphy->set_bwmode_inprogress = true;
347662306a36Sopenharmony_ci	if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw)))
347762306a36Sopenharmony_ci		rtl8821ae_phy_set_bw_mode_callback(hw);
347862306a36Sopenharmony_ci	else {
347962306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
348062306a36Sopenharmony_ci			"FALSE driver sleep or unload\n");
348162306a36Sopenharmony_ci		rtlphy->set_bwmode_inprogress = false;
348262306a36Sopenharmony_ci		rtlphy->current_chan_bw = tmp_bw;
348362306a36Sopenharmony_ci	}
348462306a36Sopenharmony_ci}
348562306a36Sopenharmony_ci
348662306a36Sopenharmony_civoid rtl8821ae_phy_sw_chnl_callback(struct ieee80211_hw *hw)
348762306a36Sopenharmony_ci{
348862306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
348962306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
349062306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
349162306a36Sopenharmony_ci	u8 channel = rtlphy->current_channel;
349262306a36Sopenharmony_ci	u8 path;
349362306a36Sopenharmony_ci	u32 data;
349462306a36Sopenharmony_ci
349562306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE,
349662306a36Sopenharmony_ci		"switch to channel%d\n", rtlphy->current_channel);
349762306a36Sopenharmony_ci	if (is_hal_stop(rtlhal))
349862306a36Sopenharmony_ci		return;
349962306a36Sopenharmony_ci
350062306a36Sopenharmony_ci	if (36 <= channel && channel <= 48)
350162306a36Sopenharmony_ci		data = 0x494;
350262306a36Sopenharmony_ci	else if (50 <= channel && channel <= 64)
350362306a36Sopenharmony_ci		data = 0x453;
350462306a36Sopenharmony_ci	else if (100 <= channel && channel <= 116)
350562306a36Sopenharmony_ci		data = 0x452;
350662306a36Sopenharmony_ci	else if (118 <= channel)
350762306a36Sopenharmony_ci		data = 0x412;
350862306a36Sopenharmony_ci	else
350962306a36Sopenharmony_ci		data = 0x96a;
351062306a36Sopenharmony_ci	rtl_set_bbreg(hw, RFC_AREA, 0x1ffe0000, data);
351162306a36Sopenharmony_ci
351262306a36Sopenharmony_ci	for (path = RF90_PATH_A; path < rtlphy->num_total_rfpath; path++) {
351362306a36Sopenharmony_ci		if (36 <= channel && channel <= 64)
351462306a36Sopenharmony_ci			data = 0x101;
351562306a36Sopenharmony_ci		else if (100 <= channel && channel <= 140)
351662306a36Sopenharmony_ci			data = 0x301;
351762306a36Sopenharmony_ci		else if (140 < channel)
351862306a36Sopenharmony_ci			data = 0x501;
351962306a36Sopenharmony_ci		else
352062306a36Sopenharmony_ci			data = 0x000;
352162306a36Sopenharmony_ci		rtl8821ae_phy_set_rf_reg(hw, path, RF_CHNLBW,
352262306a36Sopenharmony_ci			BIT(18)|BIT(17)|BIT(16)|BIT(9)|BIT(8), data);
352362306a36Sopenharmony_ci
352462306a36Sopenharmony_ci		rtl8821ae_phy_set_rf_reg(hw, path, RF_CHNLBW,
352562306a36Sopenharmony_ci			BMASKBYTE0, channel);
352662306a36Sopenharmony_ci
352762306a36Sopenharmony_ci		if (channel > 14) {
352862306a36Sopenharmony_ci			if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
352962306a36Sopenharmony_ci				if (36 <= channel && channel <= 64)
353062306a36Sopenharmony_ci					data = 0x114E9;
353162306a36Sopenharmony_ci				else
353262306a36Sopenharmony_ci					data = 0x110E9;
353362306a36Sopenharmony_ci				rtl8821ae_phy_set_rf_reg(hw, path, RF_APK,
353462306a36Sopenharmony_ci					BRFREGOFFSETMASK, data);
353562306a36Sopenharmony_ci			}
353662306a36Sopenharmony_ci		}
353762306a36Sopenharmony_ci	}
353862306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE, "\n");
353962306a36Sopenharmony_ci}
354062306a36Sopenharmony_ci
354162306a36Sopenharmony_ciu8 rtl8821ae_phy_sw_chnl(struct ieee80211_hw *hw)
354262306a36Sopenharmony_ci{
354362306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
354462306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
354562306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
354662306a36Sopenharmony_ci	u32 timeout = 1000, timecount = 0;
354762306a36Sopenharmony_ci	u8 channel = rtlphy->current_channel;
354862306a36Sopenharmony_ci
354962306a36Sopenharmony_ci	if (rtlphy->sw_chnl_inprogress)
355062306a36Sopenharmony_ci		return 0;
355162306a36Sopenharmony_ci	if (rtlphy->set_bwmode_inprogress)
355262306a36Sopenharmony_ci		return 0;
355362306a36Sopenharmony_ci
355462306a36Sopenharmony_ci	if ((is_hal_stop(rtlhal)) || (RT_CANNOT_IO(hw))) {
355562306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_CHAN, DBG_LOUD,
355662306a36Sopenharmony_ci			"sw_chnl_inprogress false driver sleep or unload\n");
355762306a36Sopenharmony_ci		return 0;
355862306a36Sopenharmony_ci	}
355962306a36Sopenharmony_ci	while (rtlphy->lck_inprogress && timecount < timeout) {
356062306a36Sopenharmony_ci		mdelay(50);
356162306a36Sopenharmony_ci		timecount += 50;
356262306a36Sopenharmony_ci	}
356362306a36Sopenharmony_ci
356462306a36Sopenharmony_ci	if (rtlphy->current_channel > 14 && rtlhal->current_bandtype != BAND_ON_5G)
356562306a36Sopenharmony_ci		rtl8821ae_phy_switch_wirelessband(hw, BAND_ON_5G);
356662306a36Sopenharmony_ci	else if (rtlphy->current_channel <= 14 && rtlhal->current_bandtype != BAND_ON_2_4G)
356762306a36Sopenharmony_ci		rtl8821ae_phy_switch_wirelessband(hw, BAND_ON_2_4G);
356862306a36Sopenharmony_ci
356962306a36Sopenharmony_ci	rtlphy->sw_chnl_inprogress = true;
357062306a36Sopenharmony_ci	if (channel == 0)
357162306a36Sopenharmony_ci		channel = 1;
357262306a36Sopenharmony_ci
357362306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE,
357462306a36Sopenharmony_ci		"switch to channel%d, band type is %d\n",
357562306a36Sopenharmony_ci		rtlphy->current_channel, rtlhal->current_bandtype);
357662306a36Sopenharmony_ci
357762306a36Sopenharmony_ci	rtl8821ae_phy_sw_chnl_callback(hw);
357862306a36Sopenharmony_ci
357962306a36Sopenharmony_ci	rtl8821ae_dm_clear_txpower_tracking_state(hw);
358062306a36Sopenharmony_ci	rtl8821ae_phy_set_txpower_level(hw, rtlphy->current_channel);
358162306a36Sopenharmony_ci
358262306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE, "\n");
358362306a36Sopenharmony_ci	rtlphy->sw_chnl_inprogress = false;
358462306a36Sopenharmony_ci	return 1;
358562306a36Sopenharmony_ci}
358662306a36Sopenharmony_ci
358762306a36Sopenharmony_ciu8 _rtl8812ae_get_right_chnl_place_for_iqk(u8 chnl)
358862306a36Sopenharmony_ci{
358962306a36Sopenharmony_ci	static const u8 channel_all[TARGET_CHNL_NUM_2G_5G_8812] = {
359062306a36Sopenharmony_ci		1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
359162306a36Sopenharmony_ci		14, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54,
359262306a36Sopenharmony_ci		56, 58, 60, 62, 64, 100, 102, 104, 106, 108,
359362306a36Sopenharmony_ci		110, 112, 114, 116, 118, 120, 122, 124, 126,
359462306a36Sopenharmony_ci		128, 130, 132, 134, 136, 138, 140, 149, 151,
359562306a36Sopenharmony_ci		153, 155, 157, 159, 161, 163, 165};
359662306a36Sopenharmony_ci	u8 place;
359762306a36Sopenharmony_ci
359862306a36Sopenharmony_ci	if (chnl > 14) {
359962306a36Sopenharmony_ci		for (place = 14; place < sizeof(channel_all); place++)
360062306a36Sopenharmony_ci			if (channel_all[place] == chnl)
360162306a36Sopenharmony_ci				return place-13;
360262306a36Sopenharmony_ci	}
360362306a36Sopenharmony_ci
360462306a36Sopenharmony_ci	return 0;
360562306a36Sopenharmony_ci}
360662306a36Sopenharmony_ci
360762306a36Sopenharmony_ci#define MACBB_REG_NUM 10
360862306a36Sopenharmony_ci#define AFE_REG_NUM 14
360962306a36Sopenharmony_ci#define RF_REG_NUM 3
361062306a36Sopenharmony_ci
361162306a36Sopenharmony_cistatic void _rtl8821ae_iqk_backup_macbb(struct ieee80211_hw *hw,
361262306a36Sopenharmony_ci					u32 *macbb_backup,
361362306a36Sopenharmony_ci					u32 *backup_macbb_reg, u32 mac_bb_num)
361462306a36Sopenharmony_ci{
361562306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
361662306a36Sopenharmony_ci	u32 i;
361762306a36Sopenharmony_ci
361862306a36Sopenharmony_ci	rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
361962306a36Sopenharmony_ci	/*save MACBB default value*/
362062306a36Sopenharmony_ci	for (i = 0; i < mac_bb_num; i++)
362162306a36Sopenharmony_ci		macbb_backup[i] = rtl_read_dword(rtlpriv, backup_macbb_reg[i]);
362262306a36Sopenharmony_ci
362362306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD, "BackupMacBB Success!!!!\n");
362462306a36Sopenharmony_ci}
362562306a36Sopenharmony_ci
362662306a36Sopenharmony_cistatic void _rtl8821ae_iqk_backup_afe(struct ieee80211_hw *hw, u32 *afe_backup,
362762306a36Sopenharmony_ci				      u32 *backup_afe_REG, u32 afe_num)
362862306a36Sopenharmony_ci{
362962306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
363062306a36Sopenharmony_ci	u32 i;
363162306a36Sopenharmony_ci
363262306a36Sopenharmony_ci	rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
363362306a36Sopenharmony_ci	/*Save AFE Parameters */
363462306a36Sopenharmony_ci	for (i = 0; i < afe_num; i++)
363562306a36Sopenharmony_ci		afe_backup[i] = rtl_read_dword(rtlpriv, backup_afe_REG[i]);
363662306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD, "BackupAFE Success!!!!\n");
363762306a36Sopenharmony_ci}
363862306a36Sopenharmony_ci
363962306a36Sopenharmony_cistatic void _rtl8821ae_iqk_backup_rf(struct ieee80211_hw *hw, u32 *rfa_backup,
364062306a36Sopenharmony_ci				     u32 *rfb_backup, u32 *backup_rf_reg,
364162306a36Sopenharmony_ci				     u32 rf_num)
364262306a36Sopenharmony_ci{
364362306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
364462306a36Sopenharmony_ci	u32 i;
364562306a36Sopenharmony_ci
364662306a36Sopenharmony_ci	rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
364762306a36Sopenharmony_ci	/*Save RF Parameters*/
364862306a36Sopenharmony_ci	for (i = 0; i < rf_num; i++) {
364962306a36Sopenharmony_ci		rfa_backup[i] = rtl_get_rfreg(hw, RF90_PATH_A, backup_rf_reg[i],
365062306a36Sopenharmony_ci					      BMASKDWORD);
365162306a36Sopenharmony_ci		rfb_backup[i] = rtl_get_rfreg(hw, RF90_PATH_B, backup_rf_reg[i],
365262306a36Sopenharmony_ci					      BMASKDWORD);
365362306a36Sopenharmony_ci	}
365462306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD, "BackupRF Success!!!!\n");
365562306a36Sopenharmony_ci}
365662306a36Sopenharmony_ci
365762306a36Sopenharmony_cistatic void _rtl8821ae_iqk_configure_mac(
365862306a36Sopenharmony_ci		struct ieee80211_hw *hw
365962306a36Sopenharmony_ci		)
366062306a36Sopenharmony_ci{
366162306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
366262306a36Sopenharmony_ci	/* ========MAC register setting========*/
366362306a36Sopenharmony_ci	rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
366462306a36Sopenharmony_ci	rtl_write_byte(rtlpriv, 0x522, 0x3f);
366562306a36Sopenharmony_ci	rtl_set_bbreg(hw, 0x550, BIT(11) | BIT(3), 0x0);
366662306a36Sopenharmony_ci	rtl_write_byte(rtlpriv, 0x808, 0x00);		/*RX ante off*/
366762306a36Sopenharmony_ci	rtl_set_bbreg(hw, 0x838, 0xf, 0xc);		/*CCA off*/
366862306a36Sopenharmony_ci}
366962306a36Sopenharmony_ci
367062306a36Sopenharmony_cistatic void _rtl8821ae_iqk_tx_fill_iqc(struct ieee80211_hw *hw,
367162306a36Sopenharmony_ci				       enum radio_path path, u32 tx_x, u32 tx_y)
367262306a36Sopenharmony_ci{
367362306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
367462306a36Sopenharmony_ci	switch (path) {
367562306a36Sopenharmony_ci	case RF90_PATH_A:
367662306a36Sopenharmony_ci		/* [31] = 1 --> Page C1 */
367762306a36Sopenharmony_ci		rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1);
367862306a36Sopenharmony_ci		rtl_write_dword(rtlpriv, 0xc90, 0x00000080);
367962306a36Sopenharmony_ci		rtl_write_dword(rtlpriv, 0xcc4, 0x20040000);
368062306a36Sopenharmony_ci		rtl_write_dword(rtlpriv, 0xcc8, 0x20000000);
368162306a36Sopenharmony_ci		rtl_set_bbreg(hw, 0xccc, 0x000007ff, tx_y);
368262306a36Sopenharmony_ci		rtl_set_bbreg(hw, 0xcd4, 0x000007ff, tx_x);
368362306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
368462306a36Sopenharmony_ci			"TX_X = %x;;TX_Y = %x =====> fill to IQC\n",
368562306a36Sopenharmony_ci			tx_x, tx_y);
368662306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
368762306a36Sopenharmony_ci			"0xcd4 = %x;;0xccc = %x ====>fill to IQC\n",
368862306a36Sopenharmony_ci			rtl_get_bbreg(hw, 0xcd4, 0x000007ff),
368962306a36Sopenharmony_ci			rtl_get_bbreg(hw, 0xccc, 0x000007ff));
369062306a36Sopenharmony_ci		break;
369162306a36Sopenharmony_ci	default:
369262306a36Sopenharmony_ci		break;
369362306a36Sopenharmony_ci	}
369462306a36Sopenharmony_ci}
369562306a36Sopenharmony_ci
369662306a36Sopenharmony_cistatic void _rtl8821ae_iqk_rx_fill_iqc(struct ieee80211_hw *hw,
369762306a36Sopenharmony_ci				       enum radio_path path, u32 rx_x, u32 rx_y)
369862306a36Sopenharmony_ci{
369962306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
370062306a36Sopenharmony_ci	switch (path) {
370162306a36Sopenharmony_ci	case RF90_PATH_A:
370262306a36Sopenharmony_ci		rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
370362306a36Sopenharmony_ci		rtl_set_bbreg(hw, 0xc10, 0x000003ff, rx_x>>1);
370462306a36Sopenharmony_ci		rtl_set_bbreg(hw, 0xc10, 0x03ff0000, rx_y>>1);
370562306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
370662306a36Sopenharmony_ci			"rx_x = %x;;rx_y = %x ====>fill to IQC\n",
370762306a36Sopenharmony_ci			rx_x >> 1, rx_y >> 1);
370862306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
370962306a36Sopenharmony_ci			"0xc10 = %x ====>fill to IQC\n",
371062306a36Sopenharmony_ci			rtl_read_dword(rtlpriv, 0xc10));
371162306a36Sopenharmony_ci		break;
371262306a36Sopenharmony_ci	default:
371362306a36Sopenharmony_ci		break;
371462306a36Sopenharmony_ci	}
371562306a36Sopenharmony_ci}
371662306a36Sopenharmony_ci
371762306a36Sopenharmony_ci#define cal_num 10
371862306a36Sopenharmony_ci
371962306a36Sopenharmony_cistatic void _rtl8821ae_iqk_tx(struct ieee80211_hw *hw, enum radio_path path)
372062306a36Sopenharmony_ci{
372162306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
372262306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
372362306a36Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
372462306a36Sopenharmony_ci
372562306a36Sopenharmony_ci	u32	tx_fail, rx_fail, delay_count, iqk_ready, cal_retry, cal = 0, temp_reg65;
372662306a36Sopenharmony_ci	int	tx_x = 0, tx_y = 0, rx_x = 0, rx_y = 0, tx_average = 0, rx_average = 0;
372762306a36Sopenharmony_ci	int	tx_x0[cal_num], tx_y0[cal_num], tx_x0_rxk[cal_num],
372862306a36Sopenharmony_ci		tx_y0_rxk[cal_num], rx_x0[cal_num], rx_y0[cal_num],
372962306a36Sopenharmony_ci		tx_dt[cal_num], rx_dt[cal_num];
373062306a36Sopenharmony_ci	bool	tx0iqkok = false, rx0iqkok = false;
373162306a36Sopenharmony_ci	bool	vdf_enable = false;
373262306a36Sopenharmony_ci	int	i, k, vdf_y[3], vdf_x[3],
373362306a36Sopenharmony_ci		ii, dx = 0, dy = 0, tx_finish = 0, rx_finish = 0;
373462306a36Sopenharmony_ci
373562306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
373662306a36Sopenharmony_ci		"BandWidth = %d.\n",
373762306a36Sopenharmony_ci		rtlphy->current_chan_bw);
373862306a36Sopenharmony_ci	if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80)
373962306a36Sopenharmony_ci		vdf_enable = true;
374062306a36Sopenharmony_ci
374162306a36Sopenharmony_ci	while (cal < cal_num) {
374262306a36Sopenharmony_ci		switch (path) {
374362306a36Sopenharmony_ci		case RF90_PATH_A:
374462306a36Sopenharmony_ci			temp_reg65 = rtl_get_rfreg(hw, path, 0x65, 0xffffffff);
374562306a36Sopenharmony_ci			/* Path-A LOK */
374662306a36Sopenharmony_ci			rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
374762306a36Sopenharmony_ci			/*========Path-A AFE all on========*/
374862306a36Sopenharmony_ci			/*Port 0 DAC/ADC on*/
374962306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc60, 0x77777777);
375062306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc64, 0x77777777);
375162306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc68, 0x19791979);
375262306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc6c, 0x19791979);
375362306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc70, 0x19791979);
375462306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc74, 0x19791979);
375562306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc78, 0x19791979);
375662306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc7c, 0x19791979);
375762306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc80, 0x19791979);
375862306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc84, 0x19791979);
375962306a36Sopenharmony_ci
376062306a36Sopenharmony_ci			rtl_set_bbreg(hw, 0xc00, 0xf, 0x4); /*hardware 3-wire off*/
376162306a36Sopenharmony_ci
376262306a36Sopenharmony_ci			/* LOK Setting */
376362306a36Sopenharmony_ci			/* ====== LOK ====== */
376462306a36Sopenharmony_ci			/*DAC/ADC sampling rate (160 MHz)*/
376562306a36Sopenharmony_ci			rtl_set_bbreg(hw, 0xc5c, BIT(26) | BIT(25) | BIT(24), 0x7);
376662306a36Sopenharmony_ci
376762306a36Sopenharmony_ci			/* 2. LoK RF Setting (at BW = 20M) */
376862306a36Sopenharmony_ci			rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80002);
376962306a36Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x18, 0x00c00, 0x3);     /* BW 20M */
377062306a36Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x20000);
377162306a36Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0003f);
377262306a36Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xf3fc3);
377362306a36Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d5);
377462306a36Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001);
377562306a36Sopenharmony_ci			rtl_set_bbreg(hw, 0xcb8, 0xf, 0xd);
377662306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
377762306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xb00, 0x03000100);
377862306a36Sopenharmony_ci			rtl_set_bbreg(hw, 0xc94, BIT(0), 0x1);
377962306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0x978, 0x29002000);/* TX (X,Y) */
378062306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0x97c, 0xa9002000);/* RX (X,Y) */
378162306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0x984, 0x00462910);/* [0]:AGC_en, [15]:idac_K_Mask */
378262306a36Sopenharmony_ci
378362306a36Sopenharmony_ci			rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
378462306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc88, 0x821403f4);
378562306a36Sopenharmony_ci
378662306a36Sopenharmony_ci			if (rtlhal->current_bandtype)
378762306a36Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc8c, 0x68163e96);
378862306a36Sopenharmony_ci			else
378962306a36Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc8c, 0x28163e96);
379062306a36Sopenharmony_ci
379162306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc80, 0x18008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
379262306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc84, 0x38008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */
379362306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
379462306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
379562306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
379662306a36Sopenharmony_ci
379762306a36Sopenharmony_ci			mdelay(10); /* Delay 10ms */
379862306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
379962306a36Sopenharmony_ci
380062306a36Sopenharmony_ci			rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
380162306a36Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x58, 0x7fe00, rtl_get_rfreg(hw, path, 0x8, 0xffc00)); /* Load LOK */
380262306a36Sopenharmony_ci
380362306a36Sopenharmony_ci			switch (rtlphy->current_chan_bw) {
380462306a36Sopenharmony_ci			case 1:
380562306a36Sopenharmony_ci				rtl_set_rfreg(hw, path, 0x18, 0x00c00, 0x1);
380662306a36Sopenharmony_ci				break;
380762306a36Sopenharmony_ci			case 2:
380862306a36Sopenharmony_ci				rtl_set_rfreg(hw, path, 0x18, 0x00c00, 0x0);
380962306a36Sopenharmony_ci				break;
381062306a36Sopenharmony_ci			default:
381162306a36Sopenharmony_ci				break;
381262306a36Sopenharmony_ci			}
381362306a36Sopenharmony_ci
381462306a36Sopenharmony_ci			rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
381562306a36Sopenharmony_ci
381662306a36Sopenharmony_ci			/* 3. TX RF Setting */
381762306a36Sopenharmony_ci			rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
381862306a36Sopenharmony_ci			rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
381962306a36Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x20000);
382062306a36Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0003f);
382162306a36Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xf3fc3);
382262306a36Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d5);
382362306a36Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001);
382462306a36Sopenharmony_ci			rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
382562306a36Sopenharmony_ci			/* ODM_SetBBReg(pDM_Odm, 0xcb8, 0xf, 0xd); */
382662306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
382762306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xb00, 0x03000100);
382862306a36Sopenharmony_ci			rtl_set_bbreg(hw, 0xc94, BIT(0), 0x1);
382962306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0x978, 0x29002000);/* TX (X,Y) */
383062306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0x97c, 0xa9002000);/* RX (X,Y) */
383162306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */
383262306a36Sopenharmony_ci
383362306a36Sopenharmony_ci			rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
383462306a36Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc88, 0x821403f1);
383562306a36Sopenharmony_ci			if (rtlhal->current_bandtype)
383662306a36Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc8c, 0x40163e96);
383762306a36Sopenharmony_ci			else
383862306a36Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc8c, 0x00163e96);
383962306a36Sopenharmony_ci
384062306a36Sopenharmony_ci			if (vdf_enable) {
384162306a36Sopenharmony_ci				rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD, "VDF_enable\n");
384262306a36Sopenharmony_ci				for (k = 0; k <= 2; k++) {
384362306a36Sopenharmony_ci					switch (k) {
384462306a36Sopenharmony_ci					case 0:
384562306a36Sopenharmony_ci						rtl_write_dword(rtlpriv, 0xc80, 0x18008c38);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
384662306a36Sopenharmony_ci						rtl_write_dword(rtlpriv, 0xc84, 0x38008c38);/* RX_TONE_idx[9:0], RxK_Mask[29] */
384762306a36Sopenharmony_ci						rtl_set_bbreg(hw, 0xce8, BIT(31), 0x0);
384862306a36Sopenharmony_ci						break;
384962306a36Sopenharmony_ci					case 1:
385062306a36Sopenharmony_ci						rtl_set_bbreg(hw, 0xc80, BIT(28), 0x0);
385162306a36Sopenharmony_ci						rtl_set_bbreg(hw, 0xc84, BIT(28), 0x0);
385262306a36Sopenharmony_ci						rtl_set_bbreg(hw, 0xce8, BIT(31), 0x0);
385362306a36Sopenharmony_ci						break;
385462306a36Sopenharmony_ci					case 2:
385562306a36Sopenharmony_ci						rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
385662306a36Sopenharmony_ci							"vdf_y[1] = %x;;;vdf_y[0] = %x\n", vdf_y[1]>>21 & 0x00007ff, vdf_y[0]>>21 & 0x00007ff);
385762306a36Sopenharmony_ci						rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
385862306a36Sopenharmony_ci							"vdf_x[1] = %x;;;vdf_x[0] = %x\n", vdf_x[1]>>21 & 0x00007ff, vdf_x[0]>>21 & 0x00007ff);
385962306a36Sopenharmony_ci						tx_dt[cal] = (vdf_y[1]>>20)-(vdf_y[0]>>20);
386062306a36Sopenharmony_ci						tx_dt[cal] = ((16*tx_dt[cal])*10000/15708);
386162306a36Sopenharmony_ci						tx_dt[cal] = (tx_dt[cal] >> 1)+(tx_dt[cal] & BIT(0));
386262306a36Sopenharmony_ci						rtl_write_dword(rtlpriv, 0xc80, 0x18008c20);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
386362306a36Sopenharmony_ci						rtl_write_dword(rtlpriv, 0xc84, 0x38008c20);/* RX_TONE_idx[9:0], RxK_Mask[29] */
386462306a36Sopenharmony_ci						rtl_set_bbreg(hw, 0xce8, BIT(31), 0x1);
386562306a36Sopenharmony_ci						rtl_set_bbreg(hw, 0xce8, 0x3fff0000, tx_dt[cal] & 0x00003fff);
386662306a36Sopenharmony_ci						break;
386762306a36Sopenharmony_ci					default:
386862306a36Sopenharmony_ci						break;
386962306a36Sopenharmony_ci					}
387062306a36Sopenharmony_ci					rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
387162306a36Sopenharmony_ci					cal_retry = 0;
387262306a36Sopenharmony_ci					while (1) {
387362306a36Sopenharmony_ci						/* one shot */
387462306a36Sopenharmony_ci						rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
387562306a36Sopenharmony_ci						rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
387662306a36Sopenharmony_ci
387762306a36Sopenharmony_ci						mdelay(10); /* Delay 10ms */
387862306a36Sopenharmony_ci						rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
387962306a36Sopenharmony_ci						delay_count = 0;
388062306a36Sopenharmony_ci						while (1) {
388162306a36Sopenharmony_ci							iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
388262306a36Sopenharmony_ci							if ((~iqk_ready) || (delay_count > 20))
388362306a36Sopenharmony_ci								break;
388462306a36Sopenharmony_ci							else{
388562306a36Sopenharmony_ci								mdelay(1);
388662306a36Sopenharmony_ci								delay_count++;
388762306a36Sopenharmony_ci							}
388862306a36Sopenharmony_ci						}
388962306a36Sopenharmony_ci
389062306a36Sopenharmony_ci						if (delay_count < 20) {							/* If 20ms No Result, then cal_retry++ */
389162306a36Sopenharmony_ci							/* ============TXIQK Check============== */
389262306a36Sopenharmony_ci							tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12));
389362306a36Sopenharmony_ci
389462306a36Sopenharmony_ci							if (~tx_fail) {
389562306a36Sopenharmony_ci								rtl_write_dword(rtlpriv, 0xcb8, 0x02000000);
389662306a36Sopenharmony_ci								vdf_x[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
389762306a36Sopenharmony_ci								rtl_write_dword(rtlpriv, 0xcb8, 0x04000000);
389862306a36Sopenharmony_ci								vdf_y[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
389962306a36Sopenharmony_ci								tx0iqkok = true;
390062306a36Sopenharmony_ci								break;
390162306a36Sopenharmony_ci							} else {
390262306a36Sopenharmony_ci								rtl_set_bbreg(hw, 0xccc, 0x000007ff, 0x0);
390362306a36Sopenharmony_ci								rtl_set_bbreg(hw, 0xcd4, 0x000007ff, 0x200);
390462306a36Sopenharmony_ci								tx0iqkok = false;
390562306a36Sopenharmony_ci								cal_retry++;
390662306a36Sopenharmony_ci								if (cal_retry == 10)
390762306a36Sopenharmony_ci									break;
390862306a36Sopenharmony_ci							}
390962306a36Sopenharmony_ci						} else {
391062306a36Sopenharmony_ci							tx0iqkok = false;
391162306a36Sopenharmony_ci							cal_retry++;
391262306a36Sopenharmony_ci							if (cal_retry == 10)
391362306a36Sopenharmony_ci								break;
391462306a36Sopenharmony_ci						}
391562306a36Sopenharmony_ci					}
391662306a36Sopenharmony_ci				}
391762306a36Sopenharmony_ci				if (k == 3) {
391862306a36Sopenharmony_ci					tx_x0[cal] = vdf_x[k-1];
391962306a36Sopenharmony_ci					tx_y0[cal] = vdf_y[k-1];
392062306a36Sopenharmony_ci				}
392162306a36Sopenharmony_ci			} else {
392262306a36Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc80, 0x18008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
392362306a36Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc84, 0x38008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */
392462306a36Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
392562306a36Sopenharmony_ci				cal_retry = 0;
392662306a36Sopenharmony_ci				while (1) {
392762306a36Sopenharmony_ci					/* one shot */
392862306a36Sopenharmony_ci					rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
392962306a36Sopenharmony_ci					rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
393062306a36Sopenharmony_ci
393162306a36Sopenharmony_ci					mdelay(10); /* Delay 10ms */
393262306a36Sopenharmony_ci					rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
393362306a36Sopenharmony_ci					delay_count = 0;
393462306a36Sopenharmony_ci					while (1) {
393562306a36Sopenharmony_ci						iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
393662306a36Sopenharmony_ci						if ((~iqk_ready) || (delay_count > 20))
393762306a36Sopenharmony_ci							break;
393862306a36Sopenharmony_ci						else{
393962306a36Sopenharmony_ci							mdelay(1);
394062306a36Sopenharmony_ci							delay_count++;
394162306a36Sopenharmony_ci						}
394262306a36Sopenharmony_ci					}
394362306a36Sopenharmony_ci
394462306a36Sopenharmony_ci					if (delay_count < 20) {							/* If 20ms No Result, then cal_retry++ */
394562306a36Sopenharmony_ci						/* ============TXIQK Check============== */
394662306a36Sopenharmony_ci						tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12));
394762306a36Sopenharmony_ci
394862306a36Sopenharmony_ci						if (~tx_fail) {
394962306a36Sopenharmony_ci							rtl_write_dword(rtlpriv, 0xcb8, 0x02000000);
395062306a36Sopenharmony_ci							tx_x0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
395162306a36Sopenharmony_ci							rtl_write_dword(rtlpriv, 0xcb8, 0x04000000);
395262306a36Sopenharmony_ci							tx_y0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
395362306a36Sopenharmony_ci							tx0iqkok = true;
395462306a36Sopenharmony_ci							break;
395562306a36Sopenharmony_ci						} else {
395662306a36Sopenharmony_ci							rtl_set_bbreg(hw, 0xccc, 0x000007ff, 0x0);
395762306a36Sopenharmony_ci							rtl_set_bbreg(hw, 0xcd4, 0x000007ff, 0x200);
395862306a36Sopenharmony_ci							tx0iqkok = false;
395962306a36Sopenharmony_ci							cal_retry++;
396062306a36Sopenharmony_ci							if (cal_retry == 10)
396162306a36Sopenharmony_ci								break;
396262306a36Sopenharmony_ci						}
396362306a36Sopenharmony_ci					} else {
396462306a36Sopenharmony_ci						tx0iqkok = false;
396562306a36Sopenharmony_ci						cal_retry++;
396662306a36Sopenharmony_ci						if (cal_retry == 10)
396762306a36Sopenharmony_ci							break;
396862306a36Sopenharmony_ci					}
396962306a36Sopenharmony_ci				}
397062306a36Sopenharmony_ci			}
397162306a36Sopenharmony_ci
397262306a36Sopenharmony_ci			if (!tx0iqkok)
397362306a36Sopenharmony_ci				break;				/* TXK fail, Don't do RXK */
397462306a36Sopenharmony_ci
397562306a36Sopenharmony_ci			if (vdf_enable == 1) {
397662306a36Sopenharmony_ci				rtl_set_bbreg(hw, 0xce8, BIT(31), 0x0);    /* TX VDF Disable */
397762306a36Sopenharmony_ci				rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD, "RXVDF Start\n");
397862306a36Sopenharmony_ci				for (k = 0; k <= 2; k++) {
397962306a36Sopenharmony_ci					/* ====== RX mode TXK (RXK Step 1) ====== */
398062306a36Sopenharmony_ci					rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
398162306a36Sopenharmony_ci					/* 1. TX RF Setting */
398262306a36Sopenharmony_ci					rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
398362306a36Sopenharmony_ci					rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000);
398462306a36Sopenharmony_ci					rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x00029);
398562306a36Sopenharmony_ci					rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xd7ffb);
398662306a36Sopenharmony_ci					rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, temp_reg65);
398762306a36Sopenharmony_ci					rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001);
398862306a36Sopenharmony_ci					rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
398962306a36Sopenharmony_ci
399062306a36Sopenharmony_ci					rtl_set_bbreg(hw, 0xcb8, 0xf, 0xd);
399162306a36Sopenharmony_ci					rtl_write_dword(rtlpriv, 0x978, 0x29002000);/* TX (X,Y) */
399262306a36Sopenharmony_ci					rtl_write_dword(rtlpriv, 0x97c, 0xa9002000);/* RX (X,Y) */
399362306a36Sopenharmony_ci					rtl_write_dword(rtlpriv, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */
399462306a36Sopenharmony_ci					rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
399562306a36Sopenharmony_ci					rtl_write_dword(rtlpriv, 0xb00, 0x03000100);
399662306a36Sopenharmony_ci					rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
399762306a36Sopenharmony_ci					switch (k) {
399862306a36Sopenharmony_ci					case 0:
399962306a36Sopenharmony_ci						{
400062306a36Sopenharmony_ci							rtl_write_dword(rtlpriv, 0xc80, 0x18008c38);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
400162306a36Sopenharmony_ci							rtl_write_dword(rtlpriv, 0xc84, 0x38008c38);/* RX_TONE_idx[9:0], RxK_Mask[29] */
400262306a36Sopenharmony_ci							rtl_set_bbreg(hw, 0xce8, BIT(30), 0x0);
400362306a36Sopenharmony_ci						}
400462306a36Sopenharmony_ci						break;
400562306a36Sopenharmony_ci					case 1:
400662306a36Sopenharmony_ci						{
400762306a36Sopenharmony_ci							rtl_write_dword(rtlpriv, 0xc80, 0x08008c38);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
400862306a36Sopenharmony_ci							rtl_write_dword(rtlpriv, 0xc84, 0x28008c38);/* RX_TONE_idx[9:0], RxK_Mask[29] */
400962306a36Sopenharmony_ci							rtl_set_bbreg(hw, 0xce8, BIT(30), 0x0);
401062306a36Sopenharmony_ci						}
401162306a36Sopenharmony_ci						break;
401262306a36Sopenharmony_ci					case 2:
401362306a36Sopenharmony_ci						{
401462306a36Sopenharmony_ci							rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
401562306a36Sopenharmony_ci								"VDF_Y[1] = %x;;;VDF_Y[0] = %x\n",
401662306a36Sopenharmony_ci								vdf_y[1] >> 21 & 0x00007ff,
401762306a36Sopenharmony_ci								vdf_y[0] >> 21 & 0x00007ff);
401862306a36Sopenharmony_ci							rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
401962306a36Sopenharmony_ci								"VDF_X[1] = %x;;;VDF_X[0] = %x\n",
402062306a36Sopenharmony_ci								vdf_x[1] >> 21 & 0x00007ff,
402162306a36Sopenharmony_ci								vdf_x[0] >> 21 & 0x00007ff);
402262306a36Sopenharmony_ci							rx_dt[cal] = (vdf_y[1]>>20)-(vdf_y[0]>>20);
402362306a36Sopenharmony_ci							rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD, "Rx_dt = %d\n",
402462306a36Sopenharmony_ci								rx_dt[cal]);
402562306a36Sopenharmony_ci							rx_dt[cal] = ((16*rx_dt[cal])*10000/13823);
402662306a36Sopenharmony_ci							rx_dt[cal] = (rx_dt[cal] >> 1)+(rx_dt[cal] & BIT(0));
402762306a36Sopenharmony_ci							rtl_write_dword(rtlpriv, 0xc80, 0x18008c20);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
402862306a36Sopenharmony_ci							rtl_write_dword(rtlpriv, 0xc84, 0x38008c20);/* RX_TONE_idx[9:0], RxK_Mask[29] */
402962306a36Sopenharmony_ci							rtl_set_bbreg(hw, 0xce8, 0x00003fff, rx_dt[cal] & 0x00003fff);
403062306a36Sopenharmony_ci						}
403162306a36Sopenharmony_ci						break;
403262306a36Sopenharmony_ci					default:
403362306a36Sopenharmony_ci						break;
403462306a36Sopenharmony_ci					}
403562306a36Sopenharmony_ci					rtl_write_dword(rtlpriv, 0xc88, 0x821603e0);
403662306a36Sopenharmony_ci					rtl_write_dword(rtlpriv, 0xc8c, 0x68163e96);
403762306a36Sopenharmony_ci					rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
403862306a36Sopenharmony_ci					cal_retry = 0;
403962306a36Sopenharmony_ci					while (1) {
404062306a36Sopenharmony_ci						/* one shot */
404162306a36Sopenharmony_ci						rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
404262306a36Sopenharmony_ci						rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
404362306a36Sopenharmony_ci
404462306a36Sopenharmony_ci						mdelay(10); /* Delay 10ms */
404562306a36Sopenharmony_ci						rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
404662306a36Sopenharmony_ci						delay_count = 0;
404762306a36Sopenharmony_ci						while (1) {
404862306a36Sopenharmony_ci							iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
404962306a36Sopenharmony_ci							if ((~iqk_ready) || (delay_count > 20))
405062306a36Sopenharmony_ci								break;
405162306a36Sopenharmony_ci							else{
405262306a36Sopenharmony_ci								mdelay(1);
405362306a36Sopenharmony_ci								delay_count++;
405462306a36Sopenharmony_ci							}
405562306a36Sopenharmony_ci						}
405662306a36Sopenharmony_ci
405762306a36Sopenharmony_ci						if (delay_count < 20) {							/* If 20ms No Result, then cal_retry++ */
405862306a36Sopenharmony_ci							/* ============TXIQK Check============== */
405962306a36Sopenharmony_ci							tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12));
406062306a36Sopenharmony_ci
406162306a36Sopenharmony_ci							if (~tx_fail) {
406262306a36Sopenharmony_ci								rtl_write_dword(rtlpriv, 0xcb8, 0x02000000);
406362306a36Sopenharmony_ci								tx_x0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
406462306a36Sopenharmony_ci								rtl_write_dword(rtlpriv, 0xcb8, 0x04000000);
406562306a36Sopenharmony_ci								tx_y0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
406662306a36Sopenharmony_ci								tx0iqkok = true;
406762306a36Sopenharmony_ci								break;
406862306a36Sopenharmony_ci							} else{
406962306a36Sopenharmony_ci								tx0iqkok = false;
407062306a36Sopenharmony_ci								cal_retry++;
407162306a36Sopenharmony_ci								if (cal_retry == 10)
407262306a36Sopenharmony_ci									break;
407362306a36Sopenharmony_ci							}
407462306a36Sopenharmony_ci						} else {
407562306a36Sopenharmony_ci							tx0iqkok = false;
407662306a36Sopenharmony_ci							cal_retry++;
407762306a36Sopenharmony_ci							if (cal_retry == 10)
407862306a36Sopenharmony_ci								break;
407962306a36Sopenharmony_ci						}
408062306a36Sopenharmony_ci					}
408162306a36Sopenharmony_ci
408262306a36Sopenharmony_ci					if (!tx0iqkok) {   /* If RX mode TXK fail, then take TXK Result */
408362306a36Sopenharmony_ci						tx_x0_rxk[cal] = tx_x0[cal];
408462306a36Sopenharmony_ci						tx_y0_rxk[cal] = tx_y0[cal];
408562306a36Sopenharmony_ci						tx0iqkok = true;
408662306a36Sopenharmony_ci						rtl_dbg(rtlpriv,
408762306a36Sopenharmony_ci							COMP_IQK,
408862306a36Sopenharmony_ci							DBG_LOUD,
408962306a36Sopenharmony_ci							"RXK Step 1 fail\n");
409062306a36Sopenharmony_ci					}
409162306a36Sopenharmony_ci
409262306a36Sopenharmony_ci					/* ====== RX IQK ====== */
409362306a36Sopenharmony_ci					rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
409462306a36Sopenharmony_ci					/* 1. RX RF Setting */
409562306a36Sopenharmony_ci					rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
409662306a36Sopenharmony_ci					rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000);
409762306a36Sopenharmony_ci					rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0002f);
409862306a36Sopenharmony_ci					rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xfffbb);
409962306a36Sopenharmony_ci					rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x88001);
410062306a36Sopenharmony_ci					rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d8);
410162306a36Sopenharmony_ci					rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
410262306a36Sopenharmony_ci
410362306a36Sopenharmony_ci					rtl_set_bbreg(hw, 0x978, 0x03FF8000, (tx_x0_rxk[cal])>>21&0x000007ff);
410462306a36Sopenharmony_ci					rtl_set_bbreg(hw, 0x978, 0x000007FF, (tx_y0_rxk[cal])>>21&0x000007ff);
410562306a36Sopenharmony_ci					rtl_set_bbreg(hw, 0x978, BIT(31), 0x1);
410662306a36Sopenharmony_ci					rtl_set_bbreg(hw, 0x97c, BIT(31), 0x0);
410762306a36Sopenharmony_ci					rtl_set_bbreg(hw, 0xcb8, 0xF, 0xe);
410862306a36Sopenharmony_ci					rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
410962306a36Sopenharmony_ci					rtl_write_dword(rtlpriv, 0x984, 0x0046a911);
411062306a36Sopenharmony_ci
411162306a36Sopenharmony_ci					rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
411262306a36Sopenharmony_ci					rtl_set_bbreg(hw, 0xc80, BIT(29), 0x1);
411362306a36Sopenharmony_ci					rtl_set_bbreg(hw, 0xc84, BIT(29), 0x0);
411462306a36Sopenharmony_ci					rtl_write_dword(rtlpriv, 0xc88, 0x02140119);
411562306a36Sopenharmony_ci
411662306a36Sopenharmony_ci					rtl_write_dword(rtlpriv, 0xc8c, 0x28160d00); /* pDM_Odm->SupportInterface == 1 */
411762306a36Sopenharmony_ci
411862306a36Sopenharmony_ci					if (k == 2)
411962306a36Sopenharmony_ci						rtl_set_bbreg(hw, 0xce8, BIT(30), 0x1);  /* RX VDF Enable */
412062306a36Sopenharmony_ci					rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
412162306a36Sopenharmony_ci
412262306a36Sopenharmony_ci					cal_retry = 0;
412362306a36Sopenharmony_ci					while (1) {
412462306a36Sopenharmony_ci						/* one shot */
412562306a36Sopenharmony_ci						rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
412662306a36Sopenharmony_ci						rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
412762306a36Sopenharmony_ci
412862306a36Sopenharmony_ci						mdelay(10); /* Delay 10ms */
412962306a36Sopenharmony_ci						rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
413062306a36Sopenharmony_ci						delay_count = 0;
413162306a36Sopenharmony_ci						while (1) {
413262306a36Sopenharmony_ci							iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
413362306a36Sopenharmony_ci							if ((~iqk_ready) || (delay_count > 20))
413462306a36Sopenharmony_ci								break;
413562306a36Sopenharmony_ci							else{
413662306a36Sopenharmony_ci								mdelay(1);
413762306a36Sopenharmony_ci								delay_count++;
413862306a36Sopenharmony_ci							}
413962306a36Sopenharmony_ci						}
414062306a36Sopenharmony_ci
414162306a36Sopenharmony_ci						if (delay_count < 20) {	/* If 20ms No Result, then cal_retry++ */
414262306a36Sopenharmony_ci							/* ============RXIQK Check============== */
414362306a36Sopenharmony_ci							rx_fail = rtl_get_bbreg(hw, 0xd00, BIT(11));
414462306a36Sopenharmony_ci							if (rx_fail == 0) {
414562306a36Sopenharmony_ci								rtl_write_dword(rtlpriv, 0xcb8, 0x06000000);
414662306a36Sopenharmony_ci								vdf_x[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
414762306a36Sopenharmony_ci								rtl_write_dword(rtlpriv, 0xcb8, 0x08000000);
414862306a36Sopenharmony_ci								vdf_y[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
414962306a36Sopenharmony_ci								rx0iqkok = true;
415062306a36Sopenharmony_ci								break;
415162306a36Sopenharmony_ci							} else {
415262306a36Sopenharmony_ci								rtl_set_bbreg(hw, 0xc10, 0x000003ff, 0x200>>1);
415362306a36Sopenharmony_ci								rtl_set_bbreg(hw, 0xc10, 0x03ff0000, 0x0>>1);
415462306a36Sopenharmony_ci								rx0iqkok = false;
415562306a36Sopenharmony_ci								cal_retry++;
415662306a36Sopenharmony_ci								if (cal_retry == 10)
415762306a36Sopenharmony_ci									break;
415862306a36Sopenharmony_ci
415962306a36Sopenharmony_ci							}
416062306a36Sopenharmony_ci						} else{
416162306a36Sopenharmony_ci							rx0iqkok = false;
416262306a36Sopenharmony_ci							cal_retry++;
416362306a36Sopenharmony_ci							if (cal_retry == 10)
416462306a36Sopenharmony_ci								break;
416562306a36Sopenharmony_ci						}
416662306a36Sopenharmony_ci					}
416762306a36Sopenharmony_ci
416862306a36Sopenharmony_ci				}
416962306a36Sopenharmony_ci				if (k == 3) {
417062306a36Sopenharmony_ci					rx_x0[cal] = vdf_x[k-1];
417162306a36Sopenharmony_ci					rx_y0[cal] = vdf_y[k-1];
417262306a36Sopenharmony_ci				}
417362306a36Sopenharmony_ci				rtl_set_bbreg(hw, 0xce8, BIT(31), 0x1);    /* TX VDF Enable */
417462306a36Sopenharmony_ci			}
417562306a36Sopenharmony_ci
417662306a36Sopenharmony_ci			else{
417762306a36Sopenharmony_ci				/* ====== RX mode TXK (RXK Step 1) ====== */
417862306a36Sopenharmony_ci				rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
417962306a36Sopenharmony_ci				/* 1. TX RF Setting */
418062306a36Sopenharmony_ci				rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
418162306a36Sopenharmony_ci				rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000);
418262306a36Sopenharmony_ci				rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x00029);
418362306a36Sopenharmony_ci				rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xd7ffb);
418462306a36Sopenharmony_ci				rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, temp_reg65);
418562306a36Sopenharmony_ci				rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001);
418662306a36Sopenharmony_ci				rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
418762306a36Sopenharmony_ci				rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
418862306a36Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xb00, 0x03000100);
418962306a36Sopenharmony_ci				rtl_write_dword(rtlpriv, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */
419062306a36Sopenharmony_ci
419162306a36Sopenharmony_ci				rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
419262306a36Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc80, 0x18008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
419362306a36Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc84, 0x38008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */
419462306a36Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc88, 0x821603e0);
419562306a36Sopenharmony_ci				/* ODM_Write4Byte(pDM_Odm, 0xc8c, 0x68163e96); */
419662306a36Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
419762306a36Sopenharmony_ci				cal_retry = 0;
419862306a36Sopenharmony_ci				while (1) {
419962306a36Sopenharmony_ci					/* one shot */
420062306a36Sopenharmony_ci					rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
420162306a36Sopenharmony_ci					rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
420262306a36Sopenharmony_ci
420362306a36Sopenharmony_ci					mdelay(10); /* Delay 10ms */
420462306a36Sopenharmony_ci					rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
420562306a36Sopenharmony_ci					delay_count = 0;
420662306a36Sopenharmony_ci					while (1) {
420762306a36Sopenharmony_ci						iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
420862306a36Sopenharmony_ci						if ((~iqk_ready) || (delay_count > 20))
420962306a36Sopenharmony_ci							break;
421062306a36Sopenharmony_ci						else{
421162306a36Sopenharmony_ci							mdelay(1);
421262306a36Sopenharmony_ci							delay_count++;
421362306a36Sopenharmony_ci						}
421462306a36Sopenharmony_ci					}
421562306a36Sopenharmony_ci
421662306a36Sopenharmony_ci					if (delay_count < 20) {							/* If 20ms No Result, then cal_retry++ */
421762306a36Sopenharmony_ci						/* ============TXIQK Check============== */
421862306a36Sopenharmony_ci						tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12));
421962306a36Sopenharmony_ci
422062306a36Sopenharmony_ci						if (~tx_fail) {
422162306a36Sopenharmony_ci							rtl_write_dword(rtlpriv, 0xcb8, 0x02000000);
422262306a36Sopenharmony_ci							tx_x0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
422362306a36Sopenharmony_ci							rtl_write_dword(rtlpriv, 0xcb8, 0x04000000);
422462306a36Sopenharmony_ci							tx_y0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
422562306a36Sopenharmony_ci							tx0iqkok = true;
422662306a36Sopenharmony_ci							break;
422762306a36Sopenharmony_ci						} else {
422862306a36Sopenharmony_ci							tx0iqkok = false;
422962306a36Sopenharmony_ci							cal_retry++;
423062306a36Sopenharmony_ci							if (cal_retry == 10)
423162306a36Sopenharmony_ci								break;
423262306a36Sopenharmony_ci						}
423362306a36Sopenharmony_ci					} else{
423462306a36Sopenharmony_ci						tx0iqkok = false;
423562306a36Sopenharmony_ci						cal_retry++;
423662306a36Sopenharmony_ci						if (cal_retry == 10)
423762306a36Sopenharmony_ci							break;
423862306a36Sopenharmony_ci					}
423962306a36Sopenharmony_ci				}
424062306a36Sopenharmony_ci
424162306a36Sopenharmony_ci				if (!tx0iqkok) {   /* If RX mode TXK fail, then take TXK Result */
424262306a36Sopenharmony_ci					tx_x0_rxk[cal] = tx_x0[cal];
424362306a36Sopenharmony_ci					tx_y0_rxk[cal] = tx_y0[cal];
424462306a36Sopenharmony_ci					tx0iqkok = true;
424562306a36Sopenharmony_ci					rtl_dbg(rtlpriv, COMP_IQK,
424662306a36Sopenharmony_ci						DBG_LOUD, "1");
424762306a36Sopenharmony_ci				}
424862306a36Sopenharmony_ci
424962306a36Sopenharmony_ci				/* ====== RX IQK ====== */
425062306a36Sopenharmony_ci				rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
425162306a36Sopenharmony_ci				/* 1. RX RF Setting */
425262306a36Sopenharmony_ci				rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
425362306a36Sopenharmony_ci				rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000);
425462306a36Sopenharmony_ci				rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0002f);
425562306a36Sopenharmony_ci				rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xfffbb);
425662306a36Sopenharmony_ci				rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x88001);
425762306a36Sopenharmony_ci				rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d8);
425862306a36Sopenharmony_ci				rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
425962306a36Sopenharmony_ci
426062306a36Sopenharmony_ci				rtl_set_bbreg(hw, 0x978, 0x03FF8000, (tx_x0_rxk[cal])>>21&0x000007ff);
426162306a36Sopenharmony_ci				rtl_set_bbreg(hw, 0x978, 0x000007FF, (tx_y0_rxk[cal])>>21&0x000007ff);
426262306a36Sopenharmony_ci				rtl_set_bbreg(hw, 0x978, BIT(31), 0x1);
426362306a36Sopenharmony_ci				rtl_set_bbreg(hw, 0x97c, BIT(31), 0x0);
426462306a36Sopenharmony_ci				/* ODM_SetBBReg(pDM_Odm, 0xcb8, 0xF, 0xe); */
426562306a36Sopenharmony_ci				rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
426662306a36Sopenharmony_ci				rtl_write_dword(rtlpriv, 0x984, 0x0046a911);
426762306a36Sopenharmony_ci
426862306a36Sopenharmony_ci				rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
426962306a36Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc80, 0x38008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
427062306a36Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc84, 0x18008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */
427162306a36Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc88, 0x02140119);
427262306a36Sopenharmony_ci
427362306a36Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc8c, 0x28160d00); /*pDM_Odm->SupportInterface == 1*/
427462306a36Sopenharmony_ci
427562306a36Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
427662306a36Sopenharmony_ci
427762306a36Sopenharmony_ci				cal_retry = 0;
427862306a36Sopenharmony_ci				while (1) {
427962306a36Sopenharmony_ci					/* one shot */
428062306a36Sopenharmony_ci					rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
428162306a36Sopenharmony_ci					rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
428262306a36Sopenharmony_ci
428362306a36Sopenharmony_ci					mdelay(10); /* Delay 10ms */
428462306a36Sopenharmony_ci					rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
428562306a36Sopenharmony_ci					delay_count = 0;
428662306a36Sopenharmony_ci					while (1) {
428762306a36Sopenharmony_ci						iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
428862306a36Sopenharmony_ci						if ((~iqk_ready) || (delay_count > 20))
428962306a36Sopenharmony_ci							break;
429062306a36Sopenharmony_ci						else{
429162306a36Sopenharmony_ci							mdelay(1);
429262306a36Sopenharmony_ci							delay_count++;
429362306a36Sopenharmony_ci						}
429462306a36Sopenharmony_ci					}
429562306a36Sopenharmony_ci
429662306a36Sopenharmony_ci					if (delay_count < 20) {	/* If 20ms No Result, then cal_retry++ */
429762306a36Sopenharmony_ci						/* ============RXIQK Check============== */
429862306a36Sopenharmony_ci						rx_fail = rtl_get_bbreg(hw, 0xd00, BIT(11));
429962306a36Sopenharmony_ci						if (rx_fail == 0) {
430062306a36Sopenharmony_ci							rtl_write_dword(rtlpriv, 0xcb8, 0x06000000);
430162306a36Sopenharmony_ci							rx_x0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
430262306a36Sopenharmony_ci							rtl_write_dword(rtlpriv, 0xcb8, 0x08000000);
430362306a36Sopenharmony_ci							rx_y0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
430462306a36Sopenharmony_ci							rx0iqkok = true;
430562306a36Sopenharmony_ci							break;
430662306a36Sopenharmony_ci						} else{
430762306a36Sopenharmony_ci							rtl_set_bbreg(hw, 0xc10, 0x000003ff, 0x200>>1);
430862306a36Sopenharmony_ci							rtl_set_bbreg(hw, 0xc10, 0x03ff0000, 0x0>>1);
430962306a36Sopenharmony_ci							rx0iqkok = false;
431062306a36Sopenharmony_ci							cal_retry++;
431162306a36Sopenharmony_ci							if (cal_retry == 10)
431262306a36Sopenharmony_ci								break;
431362306a36Sopenharmony_ci
431462306a36Sopenharmony_ci						}
431562306a36Sopenharmony_ci					} else{
431662306a36Sopenharmony_ci						rx0iqkok = false;
431762306a36Sopenharmony_ci						cal_retry++;
431862306a36Sopenharmony_ci						if (cal_retry == 10)
431962306a36Sopenharmony_ci							break;
432062306a36Sopenharmony_ci					}
432162306a36Sopenharmony_ci				}
432262306a36Sopenharmony_ci			}
432362306a36Sopenharmony_ci
432462306a36Sopenharmony_ci			if (tx0iqkok)
432562306a36Sopenharmony_ci				tx_average++;
432662306a36Sopenharmony_ci			if (rx0iqkok)
432762306a36Sopenharmony_ci				rx_average++;
432862306a36Sopenharmony_ci			rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
432962306a36Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, temp_reg65);
433062306a36Sopenharmony_ci			break;
433162306a36Sopenharmony_ci		default:
433262306a36Sopenharmony_ci			break;
433362306a36Sopenharmony_ci		}
433462306a36Sopenharmony_ci		cal++;
433562306a36Sopenharmony_ci	}
433662306a36Sopenharmony_ci
433762306a36Sopenharmony_ci	/* FillIQK Result */
433862306a36Sopenharmony_ci	switch (path) {
433962306a36Sopenharmony_ci	case RF90_PATH_A:
434062306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
434162306a36Sopenharmony_ci			"========Path_A =======\n");
434262306a36Sopenharmony_ci		if (tx_average == 0)
434362306a36Sopenharmony_ci			break;
434462306a36Sopenharmony_ci
434562306a36Sopenharmony_ci		for (i = 0; i < tx_average; i++) {
434662306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
434762306a36Sopenharmony_ci				"TX_X0_RXK[%d] = %x ;; TX_Y0_RXK[%d] = %x\n", i,
434862306a36Sopenharmony_ci				(tx_x0_rxk[i]) >> 21 & 0x000007ff, i,
434962306a36Sopenharmony_ci				(tx_y0_rxk[i]) >> 21 & 0x000007ff);
435062306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
435162306a36Sopenharmony_ci				"TX_X0[%d] = %x ;; TX_Y0[%d] = %x\n", i,
435262306a36Sopenharmony_ci				(tx_x0[i]) >> 21 & 0x000007ff, i,
435362306a36Sopenharmony_ci				(tx_y0[i]) >> 21 & 0x000007ff);
435462306a36Sopenharmony_ci		}
435562306a36Sopenharmony_ci		for (i = 0; i < tx_average; i++) {
435662306a36Sopenharmony_ci			for (ii = i+1; ii < tx_average; ii++) {
435762306a36Sopenharmony_ci				dx = (tx_x0[i]>>21) - (tx_x0[ii]>>21);
435862306a36Sopenharmony_ci				if (dx < 3 && dx > -3) {
435962306a36Sopenharmony_ci					dy = (tx_y0[i]>>21) - (tx_y0[ii]>>21);
436062306a36Sopenharmony_ci					if (dy < 3 && dy > -3) {
436162306a36Sopenharmony_ci						tx_x = ((tx_x0[i]>>21) + (tx_x0[ii]>>21))/2;
436262306a36Sopenharmony_ci						tx_y = ((tx_y0[i]>>21) + (tx_y0[ii]>>21))/2;
436362306a36Sopenharmony_ci						tx_finish = 1;
436462306a36Sopenharmony_ci						break;
436562306a36Sopenharmony_ci					}
436662306a36Sopenharmony_ci				}
436762306a36Sopenharmony_ci			}
436862306a36Sopenharmony_ci			if (tx_finish == 1)
436962306a36Sopenharmony_ci				break;
437062306a36Sopenharmony_ci		}
437162306a36Sopenharmony_ci
437262306a36Sopenharmony_ci		if (tx_finish == 1)
437362306a36Sopenharmony_ci			_rtl8821ae_iqk_tx_fill_iqc(hw, path, tx_x, tx_y); /* ? */
437462306a36Sopenharmony_ci		else
437562306a36Sopenharmony_ci			_rtl8821ae_iqk_tx_fill_iqc(hw, path, 0x200, 0x0);
437662306a36Sopenharmony_ci
437762306a36Sopenharmony_ci		if (rx_average == 0)
437862306a36Sopenharmony_ci			break;
437962306a36Sopenharmony_ci
438062306a36Sopenharmony_ci		for (i = 0; i < rx_average; i++)
438162306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
438262306a36Sopenharmony_ci				"RX_X0[%d] = %x ;; RX_Y0[%d] = %x\n", i,
438362306a36Sopenharmony_ci				(rx_x0[i])>>21&0x000007ff, i,
438462306a36Sopenharmony_ci				(rx_y0[i])>>21&0x000007ff);
438562306a36Sopenharmony_ci		for (i = 0; i < rx_average; i++) {
438662306a36Sopenharmony_ci			for (ii = i+1; ii < rx_average; ii++) {
438762306a36Sopenharmony_ci				dx = (rx_x0[i]>>21) - (rx_x0[ii]>>21);
438862306a36Sopenharmony_ci				if (dx < 4 && dx > -4) {
438962306a36Sopenharmony_ci					dy = (rx_y0[i]>>21) - (rx_y0[ii]>>21);
439062306a36Sopenharmony_ci					if (dy < 4 && dy > -4) {
439162306a36Sopenharmony_ci						rx_x = ((rx_x0[i]>>21) + (rx_x0[ii]>>21))/2;
439262306a36Sopenharmony_ci						rx_y = ((rx_y0[i]>>21) + (rx_y0[ii]>>21))/2;
439362306a36Sopenharmony_ci						rx_finish = 1;
439462306a36Sopenharmony_ci						break;
439562306a36Sopenharmony_ci					}
439662306a36Sopenharmony_ci				}
439762306a36Sopenharmony_ci			}
439862306a36Sopenharmony_ci			if (rx_finish == 1)
439962306a36Sopenharmony_ci				break;
440062306a36Sopenharmony_ci		}
440162306a36Sopenharmony_ci
440262306a36Sopenharmony_ci		if (rx_finish == 1)
440362306a36Sopenharmony_ci			_rtl8821ae_iqk_rx_fill_iqc(hw, path, rx_x, rx_y);
440462306a36Sopenharmony_ci		else
440562306a36Sopenharmony_ci			_rtl8821ae_iqk_rx_fill_iqc(hw, path, 0x200, 0x0);
440662306a36Sopenharmony_ci		break;
440762306a36Sopenharmony_ci	default:
440862306a36Sopenharmony_ci		break;
440962306a36Sopenharmony_ci	}
441062306a36Sopenharmony_ci}
441162306a36Sopenharmony_ci
441262306a36Sopenharmony_cistatic void _rtl8821ae_iqk_restore_rf(struct ieee80211_hw *hw,
441362306a36Sopenharmony_ci				      enum radio_path path,
441462306a36Sopenharmony_ci				      u32 *backup_rf_reg,
441562306a36Sopenharmony_ci				      u32 *rf_backup, u32 rf_reg_num)
441662306a36Sopenharmony_ci{
441762306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
441862306a36Sopenharmony_ci	u32 i;
441962306a36Sopenharmony_ci
442062306a36Sopenharmony_ci	rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
442162306a36Sopenharmony_ci	for (i = 0; i < RF_REG_NUM; i++)
442262306a36Sopenharmony_ci		rtl_set_rfreg(hw, path, backup_rf_reg[i], RFREG_OFFSET_MASK,
442362306a36Sopenharmony_ci			      rf_backup[i]);
442462306a36Sopenharmony_ci
442562306a36Sopenharmony_ci	switch (path) {
442662306a36Sopenharmony_ci	case RF90_PATH_A:
442762306a36Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
442862306a36Sopenharmony_ci			"RestoreRF Path A Success!!!!\n");
442962306a36Sopenharmony_ci		break;
443062306a36Sopenharmony_ci	default:
443162306a36Sopenharmony_ci			break;
443262306a36Sopenharmony_ci	}
443362306a36Sopenharmony_ci}
443462306a36Sopenharmony_ci
443562306a36Sopenharmony_cistatic void _rtl8821ae_iqk_restore_afe(struct ieee80211_hw *hw,
443662306a36Sopenharmony_ci				       u32 *afe_backup, u32 *backup_afe_reg,
443762306a36Sopenharmony_ci				       u32 afe_num)
443862306a36Sopenharmony_ci{
443962306a36Sopenharmony_ci	u32 i;
444062306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
444162306a36Sopenharmony_ci
444262306a36Sopenharmony_ci	rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
444362306a36Sopenharmony_ci	/* Reload AFE Parameters */
444462306a36Sopenharmony_ci	for (i = 0; i < afe_num; i++)
444562306a36Sopenharmony_ci		rtl_write_dword(rtlpriv, backup_afe_reg[i], afe_backup[i]);
444662306a36Sopenharmony_ci	rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
444762306a36Sopenharmony_ci	rtl_write_dword(rtlpriv, 0xc80, 0x0);
444862306a36Sopenharmony_ci	rtl_write_dword(rtlpriv, 0xc84, 0x0);
444962306a36Sopenharmony_ci	rtl_write_dword(rtlpriv, 0xc88, 0x0);
445062306a36Sopenharmony_ci	rtl_write_dword(rtlpriv, 0xc8c, 0x3c000000);
445162306a36Sopenharmony_ci	rtl_write_dword(rtlpriv, 0xc90, 0x00000080);
445262306a36Sopenharmony_ci	rtl_write_dword(rtlpriv, 0xc94, 0x00000000);
445362306a36Sopenharmony_ci	rtl_write_dword(rtlpriv, 0xcc4, 0x20040000);
445462306a36Sopenharmony_ci	rtl_write_dword(rtlpriv, 0xcc8, 0x20000000);
445562306a36Sopenharmony_ci	rtl_write_dword(rtlpriv, 0xcb8, 0x0);
445662306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD, "RestoreAFE Success!!!!\n");
445762306a36Sopenharmony_ci}
445862306a36Sopenharmony_ci
445962306a36Sopenharmony_cistatic void _rtl8821ae_iqk_restore_macbb(struct ieee80211_hw *hw,
446062306a36Sopenharmony_ci					 u32 *macbb_backup,
446162306a36Sopenharmony_ci					 u32 *backup_macbb_reg,
446262306a36Sopenharmony_ci					 u32 macbb_num)
446362306a36Sopenharmony_ci{
446462306a36Sopenharmony_ci	u32 i;
446562306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
446662306a36Sopenharmony_ci
446762306a36Sopenharmony_ci	rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
446862306a36Sopenharmony_ci	/* Reload MacBB Parameters */
446962306a36Sopenharmony_ci	for (i = 0; i < macbb_num; i++)
447062306a36Sopenharmony_ci		rtl_write_dword(rtlpriv, backup_macbb_reg[i], macbb_backup[i]);
447162306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD, "RestoreMacBB Success!!!!\n");
447262306a36Sopenharmony_ci}
447362306a36Sopenharmony_ci
447462306a36Sopenharmony_ci#undef MACBB_REG_NUM
447562306a36Sopenharmony_ci#undef AFE_REG_NUM
447662306a36Sopenharmony_ci#undef RF_REG_NUM
447762306a36Sopenharmony_ci
447862306a36Sopenharmony_ci#define MACBB_REG_NUM 11
447962306a36Sopenharmony_ci#define AFE_REG_NUM 12
448062306a36Sopenharmony_ci#define RF_REG_NUM 3
448162306a36Sopenharmony_ci
448262306a36Sopenharmony_cistatic void _rtl8821ae_phy_iq_calibrate(struct ieee80211_hw *hw)
448362306a36Sopenharmony_ci{
448462306a36Sopenharmony_ci	u32	macbb_backup[MACBB_REG_NUM];
448562306a36Sopenharmony_ci	u32 afe_backup[AFE_REG_NUM];
448662306a36Sopenharmony_ci	u32 rfa_backup[RF_REG_NUM];
448762306a36Sopenharmony_ci	u32 rfb_backup[RF_REG_NUM];
448862306a36Sopenharmony_ci	u32 backup_macbb_reg[MACBB_REG_NUM] = {
448962306a36Sopenharmony_ci		0xb00, 0x520, 0x550, 0x808, 0x90c, 0xc00, 0xc50,
449062306a36Sopenharmony_ci		0xe00, 0xe50, 0x838, 0x82c
449162306a36Sopenharmony_ci	};
449262306a36Sopenharmony_ci	u32 backup_afe_reg[AFE_REG_NUM] = {
449362306a36Sopenharmony_ci		0xc5c, 0xc60, 0xc64, 0xc68, 0xc6c, 0xc70, 0xc74,
449462306a36Sopenharmony_ci		0xc78, 0xc7c, 0xc80, 0xc84, 0xcb8
449562306a36Sopenharmony_ci	};
449662306a36Sopenharmony_ci	u32	backup_rf_reg[RF_REG_NUM] = {0x65, 0x8f, 0x0};
449762306a36Sopenharmony_ci
449862306a36Sopenharmony_ci	_rtl8821ae_iqk_backup_macbb(hw, macbb_backup, backup_macbb_reg,
449962306a36Sopenharmony_ci				    MACBB_REG_NUM);
450062306a36Sopenharmony_ci	_rtl8821ae_iqk_backup_afe(hw, afe_backup, backup_afe_reg, AFE_REG_NUM);
450162306a36Sopenharmony_ci	_rtl8821ae_iqk_backup_rf(hw, rfa_backup, rfb_backup, backup_rf_reg,
450262306a36Sopenharmony_ci				 RF_REG_NUM);
450362306a36Sopenharmony_ci
450462306a36Sopenharmony_ci	_rtl8821ae_iqk_configure_mac(hw);
450562306a36Sopenharmony_ci	_rtl8821ae_iqk_tx(hw, RF90_PATH_A);
450662306a36Sopenharmony_ci	_rtl8821ae_iqk_restore_rf(hw, RF90_PATH_A, backup_rf_reg, rfa_backup,
450762306a36Sopenharmony_ci				  RF_REG_NUM);
450862306a36Sopenharmony_ci
450962306a36Sopenharmony_ci	_rtl8821ae_iqk_restore_afe(hw, afe_backup, backup_afe_reg, AFE_REG_NUM);
451062306a36Sopenharmony_ci	_rtl8821ae_iqk_restore_macbb(hw, macbb_backup, backup_macbb_reg,
451162306a36Sopenharmony_ci				     MACBB_REG_NUM);
451262306a36Sopenharmony_ci}
451362306a36Sopenharmony_ci
451462306a36Sopenharmony_cistatic void _rtl8821ae_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool main)
451562306a36Sopenharmony_ci{
451662306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
451762306a36Sopenharmony_ci	/* struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); */
451862306a36Sopenharmony_ci	/* struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); */
451962306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "\n");
452062306a36Sopenharmony_ci
452162306a36Sopenharmony_ci	if (main)
452262306a36Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_PINMUX + 4, BIT(29) | BIT(28), 0x1);
452362306a36Sopenharmony_ci	else
452462306a36Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_PINMUX + 4, BIT(29) | BIT(28), 0x2);
452562306a36Sopenharmony_ci}
452662306a36Sopenharmony_ci
452762306a36Sopenharmony_ci#undef IQK_ADDA_REG_NUM
452862306a36Sopenharmony_ci#undef IQK_DELAY_TIME
452962306a36Sopenharmony_ci
453062306a36Sopenharmony_civoid rtl8812ae_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery)
453162306a36Sopenharmony_ci{
453262306a36Sopenharmony_ci}
453362306a36Sopenharmony_ci
453462306a36Sopenharmony_civoid rtl8812ae_do_iqk(struct ieee80211_hw *hw, u8 delta_thermal_index,
453562306a36Sopenharmony_ci		      u8 thermal_value, u8 threshold)
453662306a36Sopenharmony_ci{
453762306a36Sopenharmony_ci	struct rtl_dm	*rtldm = rtl_dm(rtl_priv(hw));
453862306a36Sopenharmony_ci
453962306a36Sopenharmony_ci	rtldm->thermalvalue_iqk = thermal_value;
454062306a36Sopenharmony_ci	rtl8812ae_phy_iq_calibrate(hw, false);
454162306a36Sopenharmony_ci}
454262306a36Sopenharmony_ci
454362306a36Sopenharmony_civoid rtl8821ae_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery)
454462306a36Sopenharmony_ci{
454562306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
454662306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
454762306a36Sopenharmony_ci
454862306a36Sopenharmony_ci	if (!rtlphy->lck_inprogress) {
454962306a36Sopenharmony_ci		spin_lock(&rtlpriv->locks.iqk_lock);
455062306a36Sopenharmony_ci		rtlphy->lck_inprogress = true;
455162306a36Sopenharmony_ci		spin_unlock(&rtlpriv->locks.iqk_lock);
455262306a36Sopenharmony_ci
455362306a36Sopenharmony_ci		_rtl8821ae_phy_iq_calibrate(hw);
455462306a36Sopenharmony_ci
455562306a36Sopenharmony_ci		spin_lock(&rtlpriv->locks.iqk_lock);
455662306a36Sopenharmony_ci		rtlphy->lck_inprogress = false;
455762306a36Sopenharmony_ci		spin_unlock(&rtlpriv->locks.iqk_lock);
455862306a36Sopenharmony_ci	}
455962306a36Sopenharmony_ci}
456062306a36Sopenharmony_ci
456162306a36Sopenharmony_civoid rtl8821ae_reset_iqk_result(struct ieee80211_hw *hw)
456262306a36Sopenharmony_ci{
456362306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
456462306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
456562306a36Sopenharmony_ci	u8 i;
456662306a36Sopenharmony_ci
456762306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
456862306a36Sopenharmony_ci		"rtl8812ae_dm_reset_iqk_result:: settings regs %d default regs %d\n",
456962306a36Sopenharmony_ci		(int)(sizeof(rtlphy->iqk_matrix) /
457062306a36Sopenharmony_ci		sizeof(struct iqk_matrix_regs)),
457162306a36Sopenharmony_ci		IQK_MATRIX_SETTINGS_NUM);
457262306a36Sopenharmony_ci
457362306a36Sopenharmony_ci	for (i = 0; i < IQK_MATRIX_SETTINGS_NUM; i++) {
457462306a36Sopenharmony_ci		rtlphy->iqk_matrix[i].value[0][0] = 0x100;
457562306a36Sopenharmony_ci		rtlphy->iqk_matrix[i].value[0][2] = 0x100;
457662306a36Sopenharmony_ci		rtlphy->iqk_matrix[i].value[0][4] = 0x100;
457762306a36Sopenharmony_ci		rtlphy->iqk_matrix[i].value[0][6] = 0x100;
457862306a36Sopenharmony_ci
457962306a36Sopenharmony_ci		rtlphy->iqk_matrix[i].value[0][1] = 0x0;
458062306a36Sopenharmony_ci		rtlphy->iqk_matrix[i].value[0][3] = 0x0;
458162306a36Sopenharmony_ci		rtlphy->iqk_matrix[i].value[0][5] = 0x0;
458262306a36Sopenharmony_ci		rtlphy->iqk_matrix[i].value[0][7] = 0x0;
458362306a36Sopenharmony_ci
458462306a36Sopenharmony_ci		rtlphy->iqk_matrix[i].iqk_done = false;
458562306a36Sopenharmony_ci	}
458662306a36Sopenharmony_ci}
458762306a36Sopenharmony_ci
458862306a36Sopenharmony_civoid rtl8821ae_do_iqk(struct ieee80211_hw *hw, u8 delta_thermal_index,
458962306a36Sopenharmony_ci		      u8 thermal_value, u8 threshold)
459062306a36Sopenharmony_ci{
459162306a36Sopenharmony_ci	struct rtl_dm	*rtldm = rtl_dm(rtl_priv(hw));
459262306a36Sopenharmony_ci
459362306a36Sopenharmony_ci	rtl8821ae_reset_iqk_result(hw);
459462306a36Sopenharmony_ci
459562306a36Sopenharmony_ci	rtldm->thermalvalue_iqk = thermal_value;
459662306a36Sopenharmony_ci	rtl8821ae_phy_iq_calibrate(hw, false);
459762306a36Sopenharmony_ci}
459862306a36Sopenharmony_ci
459962306a36Sopenharmony_civoid rtl8821ae_phy_lc_calibrate(struct ieee80211_hw *hw)
460062306a36Sopenharmony_ci{
460162306a36Sopenharmony_ci}
460262306a36Sopenharmony_ci
460362306a36Sopenharmony_civoid rtl8821ae_phy_ap_calibrate(struct ieee80211_hw *hw, s8 delta)
460462306a36Sopenharmony_ci{
460562306a36Sopenharmony_ci}
460662306a36Sopenharmony_ci
460762306a36Sopenharmony_civoid rtl8821ae_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain)
460862306a36Sopenharmony_ci{
460962306a36Sopenharmony_ci	_rtl8821ae_phy_set_rfpath_switch(hw, bmain);
461062306a36Sopenharmony_ci}
461162306a36Sopenharmony_ci
461262306a36Sopenharmony_cibool rtl8821ae_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
461362306a36Sopenharmony_ci{
461462306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
461562306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
461662306a36Sopenharmony_ci	bool postprocessing = false;
461762306a36Sopenharmony_ci
461862306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
461962306a36Sopenharmony_ci		"-->IO Cmd(%#x), set_io_inprogress(%d)\n",
462062306a36Sopenharmony_ci		iotype, rtlphy->set_io_inprogress);
462162306a36Sopenharmony_ci	do {
462262306a36Sopenharmony_ci		switch (iotype) {
462362306a36Sopenharmony_ci		case IO_CMD_RESUME_DM_BY_SCAN:
462462306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
462562306a36Sopenharmony_ci				"[IO CMD] Resume DM after scan.\n");
462662306a36Sopenharmony_ci			postprocessing = true;
462762306a36Sopenharmony_ci			break;
462862306a36Sopenharmony_ci		case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
462962306a36Sopenharmony_ci		case IO_CMD_PAUSE_BAND1_DM_BY_SCAN:
463062306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
463162306a36Sopenharmony_ci				"[IO CMD] Pause DM before scan.\n");
463262306a36Sopenharmony_ci			postprocessing = true;
463362306a36Sopenharmony_ci			break;
463462306a36Sopenharmony_ci		default:
463562306a36Sopenharmony_ci			pr_err("switch case %#x not processed\n",
463662306a36Sopenharmony_ci			       iotype);
463762306a36Sopenharmony_ci			break;
463862306a36Sopenharmony_ci		}
463962306a36Sopenharmony_ci	} while (false);
464062306a36Sopenharmony_ci	if (postprocessing && !rtlphy->set_io_inprogress) {
464162306a36Sopenharmony_ci		rtlphy->set_io_inprogress = true;
464262306a36Sopenharmony_ci		rtlphy->current_io_type = iotype;
464362306a36Sopenharmony_ci	} else {
464462306a36Sopenharmony_ci		return false;
464562306a36Sopenharmony_ci	}
464662306a36Sopenharmony_ci	rtl8821ae_phy_set_io(hw);
464762306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE, "IO Type(%#x)\n", iotype);
464862306a36Sopenharmony_ci	return true;
464962306a36Sopenharmony_ci}
465062306a36Sopenharmony_ci
465162306a36Sopenharmony_cistatic void rtl8821ae_phy_set_io(struct ieee80211_hw *hw)
465262306a36Sopenharmony_ci{
465362306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
465462306a36Sopenharmony_ci	struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
465562306a36Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
465662306a36Sopenharmony_ci
465762306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
465862306a36Sopenharmony_ci		"--->Cmd(%#x), set_io_inprogress(%d)\n",
465962306a36Sopenharmony_ci		rtlphy->current_io_type, rtlphy->set_io_inprogress);
466062306a36Sopenharmony_ci	switch (rtlphy->current_io_type) {
466162306a36Sopenharmony_ci	case IO_CMD_RESUME_DM_BY_SCAN:
466262306a36Sopenharmony_ci		if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC)
466362306a36Sopenharmony_ci			_rtl8821ae_resume_tx_beacon(hw);
466462306a36Sopenharmony_ci		rtl8821ae_dm_write_dig(hw, rtlphy->initgain_backup.xaagccore1);
466562306a36Sopenharmony_ci		rtl8821ae_dm_write_cck_cca_thres(hw,
466662306a36Sopenharmony_ci						 rtlphy->initgain_backup.cca);
466762306a36Sopenharmony_ci		break;
466862306a36Sopenharmony_ci	case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
466962306a36Sopenharmony_ci		if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC)
467062306a36Sopenharmony_ci			_rtl8821ae_stop_tx_beacon(hw);
467162306a36Sopenharmony_ci		rtlphy->initgain_backup.xaagccore1 = dm_digtable->cur_igvalue;
467262306a36Sopenharmony_ci		rtl8821ae_dm_write_dig(hw, 0x17);
467362306a36Sopenharmony_ci		rtlphy->initgain_backup.cca = dm_digtable->cur_cck_cca_thres;
467462306a36Sopenharmony_ci		rtl8821ae_dm_write_cck_cca_thres(hw, 0x40);
467562306a36Sopenharmony_ci		break;
467662306a36Sopenharmony_ci	case IO_CMD_PAUSE_BAND1_DM_BY_SCAN:
467762306a36Sopenharmony_ci		break;
467862306a36Sopenharmony_ci	default:
467962306a36Sopenharmony_ci		pr_err("switch case %#x not processed\n",
468062306a36Sopenharmony_ci		       rtlphy->current_io_type);
468162306a36Sopenharmony_ci		break;
468262306a36Sopenharmony_ci	}
468362306a36Sopenharmony_ci	rtlphy->set_io_inprogress = false;
468462306a36Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
468562306a36Sopenharmony_ci		"(%#x)\n", rtlphy->current_io_type);
468662306a36Sopenharmony_ci}
468762306a36Sopenharmony_ci
468862306a36Sopenharmony_cistatic void rtl8821ae_phy_set_rf_on(struct ieee80211_hw *hw)
468962306a36Sopenharmony_ci{
469062306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
469162306a36Sopenharmony_ci
469262306a36Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b);
469362306a36Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
469462306a36Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
469562306a36Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
469662306a36Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
469762306a36Sopenharmony_ci}
469862306a36Sopenharmony_ci
469962306a36Sopenharmony_cistatic bool _rtl8821ae_phy_set_rf_power_state(struct ieee80211_hw *hw,
470062306a36Sopenharmony_ci					      enum rf_pwrstate rfpwr_state)
470162306a36Sopenharmony_ci{
470262306a36Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
470362306a36Sopenharmony_ci	struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
470462306a36Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
470562306a36Sopenharmony_ci	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
470662306a36Sopenharmony_ci	bool bresult = true;
470762306a36Sopenharmony_ci	u8 i, queue_id;
470862306a36Sopenharmony_ci	struct rtl8192_tx_ring *ring = NULL;
470962306a36Sopenharmony_ci
471062306a36Sopenharmony_ci	switch (rfpwr_state) {
471162306a36Sopenharmony_ci	case ERFON:
471262306a36Sopenharmony_ci		if ((ppsc->rfpwr_state == ERFOFF) &&
471362306a36Sopenharmony_ci		    RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
471462306a36Sopenharmony_ci			bool rtstatus = false;
471562306a36Sopenharmony_ci			u32 initializecount = 0;
471662306a36Sopenharmony_ci
471762306a36Sopenharmony_ci			do {
471862306a36Sopenharmony_ci				initializecount++;
471962306a36Sopenharmony_ci				rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
472062306a36Sopenharmony_ci					"IPS Set eRf nic enable\n");
472162306a36Sopenharmony_ci				rtstatus = rtl_ps_enable_nic(hw);
472262306a36Sopenharmony_ci			} while (!rtstatus && (initializecount < 10));
472362306a36Sopenharmony_ci			RT_CLEAR_PS_LEVEL(ppsc,
472462306a36Sopenharmony_ci					  RT_RF_OFF_LEVL_HALT_NIC);
472562306a36Sopenharmony_ci		} else {
472662306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
472762306a36Sopenharmony_ci				"Set ERFON slept:%d ms\n",
472862306a36Sopenharmony_ci				jiffies_to_msecs(jiffies -
472962306a36Sopenharmony_ci						 ppsc->last_sleep_jiffies));
473062306a36Sopenharmony_ci			ppsc->last_awake_jiffies = jiffies;
473162306a36Sopenharmony_ci			rtl8821ae_phy_set_rf_on(hw);
473262306a36Sopenharmony_ci		}
473362306a36Sopenharmony_ci		if (mac->link_state == MAC80211_LINKED) {
473462306a36Sopenharmony_ci			rtlpriv->cfg->ops->led_control(hw,
473562306a36Sopenharmony_ci						       LED_CTL_LINK);
473662306a36Sopenharmony_ci		} else {
473762306a36Sopenharmony_ci			rtlpriv->cfg->ops->led_control(hw,
473862306a36Sopenharmony_ci						       LED_CTL_NO_LINK);
473962306a36Sopenharmony_ci		}
474062306a36Sopenharmony_ci		break;
474162306a36Sopenharmony_ci	case ERFOFF:
474262306a36Sopenharmony_ci		for (queue_id = 0, i = 0;
474362306a36Sopenharmony_ci		     queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
474462306a36Sopenharmony_ci			ring = &pcipriv->dev.tx_ring[queue_id];
474562306a36Sopenharmony_ci			if (queue_id == BEACON_QUEUE ||
474662306a36Sopenharmony_ci			    skb_queue_len(&ring->queue) == 0) {
474762306a36Sopenharmony_ci				queue_id++;
474862306a36Sopenharmony_ci				continue;
474962306a36Sopenharmony_ci			} else {
475062306a36Sopenharmony_ci				rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
475162306a36Sopenharmony_ci					"eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
475262306a36Sopenharmony_ci					(i + 1), queue_id,
475362306a36Sopenharmony_ci					skb_queue_len(&ring->queue));
475462306a36Sopenharmony_ci
475562306a36Sopenharmony_ci				udelay(10);
475662306a36Sopenharmony_ci				i++;
475762306a36Sopenharmony_ci			}
475862306a36Sopenharmony_ci			if (i >= MAX_DOZE_WAITING_TIMES_9x) {
475962306a36Sopenharmony_ci				rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
476062306a36Sopenharmony_ci					"\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
476162306a36Sopenharmony_ci					MAX_DOZE_WAITING_TIMES_9x,
476262306a36Sopenharmony_ci					queue_id,
476362306a36Sopenharmony_ci					skb_queue_len(&ring->queue));
476462306a36Sopenharmony_ci				break;
476562306a36Sopenharmony_ci			}
476662306a36Sopenharmony_ci		}
476762306a36Sopenharmony_ci
476862306a36Sopenharmony_ci		if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
476962306a36Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
477062306a36Sopenharmony_ci				"IPS Set eRf nic disable\n");
477162306a36Sopenharmony_ci			rtl_ps_disable_nic(hw);
477262306a36Sopenharmony_ci			RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
477362306a36Sopenharmony_ci		} else {
477462306a36Sopenharmony_ci			if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) {
477562306a36Sopenharmony_ci				rtlpriv->cfg->ops->led_control(hw,
477662306a36Sopenharmony_ci							       LED_CTL_NO_LINK);
477762306a36Sopenharmony_ci			} else {
477862306a36Sopenharmony_ci				rtlpriv->cfg->ops->led_control(hw,
477962306a36Sopenharmony_ci							       LED_CTL_POWER_OFF);
478062306a36Sopenharmony_ci			}
478162306a36Sopenharmony_ci		}
478262306a36Sopenharmony_ci		break;
478362306a36Sopenharmony_ci	default:
478462306a36Sopenharmony_ci		pr_err("switch case %#x not processed\n",
478562306a36Sopenharmony_ci		       rfpwr_state);
478662306a36Sopenharmony_ci		bresult = false;
478762306a36Sopenharmony_ci		break;
478862306a36Sopenharmony_ci	}
478962306a36Sopenharmony_ci	if (bresult)
479062306a36Sopenharmony_ci		ppsc->rfpwr_state = rfpwr_state;
479162306a36Sopenharmony_ci	return bresult;
479262306a36Sopenharmony_ci}
479362306a36Sopenharmony_ci
479462306a36Sopenharmony_cibool rtl8821ae_phy_set_rf_power_state(struct ieee80211_hw *hw,
479562306a36Sopenharmony_ci				      enum rf_pwrstate rfpwr_state)
479662306a36Sopenharmony_ci{
479762306a36Sopenharmony_ci	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
479862306a36Sopenharmony_ci
479962306a36Sopenharmony_ci	bool bresult = false;
480062306a36Sopenharmony_ci
480162306a36Sopenharmony_ci	if (rfpwr_state == ppsc->rfpwr_state)
480262306a36Sopenharmony_ci		return bresult;
480362306a36Sopenharmony_ci	bresult = _rtl8821ae_phy_set_rf_power_state(hw, rfpwr_state);
480462306a36Sopenharmony_ci	return bresult;
480562306a36Sopenharmony_ci}
4806