18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci/* Copyright(c) 2009-2010  Realtek Corporation.*/
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci#include "../wifi.h"
58c2ecf20Sopenharmony_ci#include "../pci.h"
68c2ecf20Sopenharmony_ci#include "../ps.h"
78c2ecf20Sopenharmony_ci#include "reg.h"
88c2ecf20Sopenharmony_ci#include "def.h"
98c2ecf20Sopenharmony_ci#include "phy.h"
108c2ecf20Sopenharmony_ci#include "rf.h"
118c2ecf20Sopenharmony_ci#include "dm.h"
128c2ecf20Sopenharmony_ci#include "table.h"
138c2ecf20Sopenharmony_ci#include "trx.h"
148c2ecf20Sopenharmony_ci#include "../btcoexist/halbt_precomp.h"
158c2ecf20Sopenharmony_ci#include "hw.h"
168c2ecf20Sopenharmony_ci#include "../efuse.h"
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci#define READ_NEXT_PAIR(array_table, v1, v2, i) \
198c2ecf20Sopenharmony_ci	do { \
208c2ecf20Sopenharmony_ci		i += 2; \
218c2ecf20Sopenharmony_ci		v1 = array_table[i]; \
228c2ecf20Sopenharmony_ci		v2 = array_table[i+1]; \
238c2ecf20Sopenharmony_ci	} while (0)
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_cistatic u32 _rtl8821ae_phy_rf_serial_read(struct ieee80211_hw *hw,
268c2ecf20Sopenharmony_ci					 enum radio_path rfpath, u32 offset);
278c2ecf20Sopenharmony_cistatic void _rtl8821ae_phy_rf_serial_write(struct ieee80211_hw *hw,
288c2ecf20Sopenharmony_ci					   enum radio_path rfpath, u32 offset,
298c2ecf20Sopenharmony_ci					   u32 data);
308c2ecf20Sopenharmony_cistatic u32 _rtl8821ae_phy_calculate_bit_shift(u32 bitmask)
318c2ecf20Sopenharmony_ci{
328c2ecf20Sopenharmony_ci	if (WARN_ON_ONCE(!bitmask))
338c2ecf20Sopenharmony_ci		return 0;
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci	return __ffs(bitmask);
368c2ecf20Sopenharmony_ci}
378c2ecf20Sopenharmony_cistatic bool _rtl8821ae_phy_bb8821a_config_parafile(struct ieee80211_hw *hw);
388c2ecf20Sopenharmony_ci/*static bool _rtl8812ae_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);*/
398c2ecf20Sopenharmony_cistatic bool _rtl8821ae_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);
408c2ecf20Sopenharmony_cistatic bool _rtl8821ae_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
418c2ecf20Sopenharmony_ci						     u8 configtype);
428c2ecf20Sopenharmony_cistatic bool _rtl8821ae_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
438c2ecf20Sopenharmony_ci						       u8 configtype);
448c2ecf20Sopenharmony_cistatic void phy_init_bb_rf_register_definition(struct ieee80211_hw *hw);
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_cistatic long _rtl8821ae_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
478c2ecf20Sopenharmony_ci					    enum wireless_mode wirelessmode,
488c2ecf20Sopenharmony_ci					    u8 txpwridx);
498c2ecf20Sopenharmony_cistatic void rtl8821ae_phy_set_rf_on(struct ieee80211_hw *hw);
508c2ecf20Sopenharmony_cistatic void rtl8821ae_phy_set_io(struct ieee80211_hw *hw);
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_cistatic void rtl8812ae_fixspur(struct ieee80211_hw *hw,
538c2ecf20Sopenharmony_ci			      enum ht_channel_width band_width, u8 channel)
548c2ecf20Sopenharmony_ci{
558c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci	/*C cut Item12 ADC FIFO CLOCK*/
588c2ecf20Sopenharmony_ci	if (IS_VENDOR_8812A_C_CUT(rtlhal->version)) {
598c2ecf20Sopenharmony_ci		if (band_width == HT_CHANNEL_WIDTH_20_40 && channel == 11)
608c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RRFMOD, 0xC00, 0x3);
618c2ecf20Sopenharmony_ci			/* 0x8AC[11:10] = 2'b11*/
628c2ecf20Sopenharmony_ci		else
638c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RRFMOD, 0xC00, 0x2);
648c2ecf20Sopenharmony_ci			/* 0x8AC[11:10] = 2'b10*/
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci		/* <20120914, Kordan> A workarould to resolve
678c2ecf20Sopenharmony_ci		 * 2480Mhz spur by setting ADC clock as 160M. (Asked by Binson)
688c2ecf20Sopenharmony_ci		 */
698c2ecf20Sopenharmony_ci		if (band_width == HT_CHANNEL_WIDTH_20 &&
708c2ecf20Sopenharmony_ci		    (channel == 13 || channel == 14)) {
718c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RRFMOD, 0x300, 0x3);
728c2ecf20Sopenharmony_ci			/*0x8AC[9:8] = 2'b11*/
738c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 1);
748c2ecf20Sopenharmony_ci			/* 0x8C4[30] = 1*/
758c2ecf20Sopenharmony_ci		} else if (band_width == HT_CHANNEL_WIDTH_20_40 &&
768c2ecf20Sopenharmony_ci			   channel == 11) {
778c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 1);
788c2ecf20Sopenharmony_ci			/*0x8C4[30] = 1*/
798c2ecf20Sopenharmony_ci		} else if (band_width != HT_CHANNEL_WIDTH_80) {
808c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RRFMOD, 0x300, 0x2);
818c2ecf20Sopenharmony_ci			/*0x8AC[9:8] = 2'b10*/
828c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 0);
838c2ecf20Sopenharmony_ci			/*0x8C4[30] = 0*/
848c2ecf20Sopenharmony_ci		}
858c2ecf20Sopenharmony_ci	} else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
868c2ecf20Sopenharmony_ci		/* <20120914, Kordan> A workarould to resolve
878c2ecf20Sopenharmony_ci		 * 2480Mhz spur by setting ADC clock as 160M.
888c2ecf20Sopenharmony_ci		 */
898c2ecf20Sopenharmony_ci		if (band_width == HT_CHANNEL_WIDTH_20 &&
908c2ecf20Sopenharmony_ci		    (channel == 13 || channel == 14))
918c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RRFMOD, 0x300, 0x3);
928c2ecf20Sopenharmony_ci			/*0x8AC[9:8] = 11*/
938c2ecf20Sopenharmony_ci		else if (channel  <= 14) /*2.4G only*/
948c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RRFMOD, 0x300, 0x2);
958c2ecf20Sopenharmony_ci			/*0x8AC[9:8] = 10*/
968c2ecf20Sopenharmony_ci	}
978c2ecf20Sopenharmony_ci}
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_ciu32 rtl8821ae_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr,
1008c2ecf20Sopenharmony_ci			       u32 bitmask)
1018c2ecf20Sopenharmony_ci{
1028c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
1038c2ecf20Sopenharmony_ci	u32 returnvalue, originalvalue, bitshift;
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
1068c2ecf20Sopenharmony_ci		"regaddr(%#x), bitmask(%#x)\n",
1078c2ecf20Sopenharmony_ci		regaddr, bitmask);
1088c2ecf20Sopenharmony_ci	originalvalue = rtl_read_dword(rtlpriv, regaddr);
1098c2ecf20Sopenharmony_ci	bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask);
1108c2ecf20Sopenharmony_ci	returnvalue = (originalvalue & bitmask) >> bitshift;
1118c2ecf20Sopenharmony_ci
1128c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
1138c2ecf20Sopenharmony_ci		"BBR MASK=0x%x Addr[0x%x]=0x%x\n",
1148c2ecf20Sopenharmony_ci		bitmask, regaddr, originalvalue);
1158c2ecf20Sopenharmony_ci	return returnvalue;
1168c2ecf20Sopenharmony_ci}
1178c2ecf20Sopenharmony_ci
1188c2ecf20Sopenharmony_civoid rtl8821ae_phy_set_bb_reg(struct ieee80211_hw *hw,
1198c2ecf20Sopenharmony_ci			      u32 regaddr, u32 bitmask, u32 data)
1208c2ecf20Sopenharmony_ci{
1218c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
1228c2ecf20Sopenharmony_ci	u32 originalvalue, bitshift;
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
1258c2ecf20Sopenharmony_ci		"regaddr(%#x), bitmask(%#x), data(%#x)\n",
1268c2ecf20Sopenharmony_ci		regaddr, bitmask, data);
1278c2ecf20Sopenharmony_ci
1288c2ecf20Sopenharmony_ci	if (bitmask != MASKDWORD) {
1298c2ecf20Sopenharmony_ci		originalvalue = rtl_read_dword(rtlpriv, regaddr);
1308c2ecf20Sopenharmony_ci		bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask);
1318c2ecf20Sopenharmony_ci		data = ((originalvalue & (~bitmask)) |
1328c2ecf20Sopenharmony_ci			((data << bitshift) & bitmask));
1338c2ecf20Sopenharmony_ci	}
1348c2ecf20Sopenharmony_ci
1358c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, regaddr, data);
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
1388c2ecf20Sopenharmony_ci		"regaddr(%#x), bitmask(%#x), data(%#x)\n",
1398c2ecf20Sopenharmony_ci		regaddr, bitmask, data);
1408c2ecf20Sopenharmony_ci}
1418c2ecf20Sopenharmony_ci
1428c2ecf20Sopenharmony_ciu32 rtl8821ae_phy_query_rf_reg(struct ieee80211_hw *hw,
1438c2ecf20Sopenharmony_ci			       enum radio_path rfpath, u32 regaddr,
1448c2ecf20Sopenharmony_ci			       u32 bitmask)
1458c2ecf20Sopenharmony_ci{
1468c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
1478c2ecf20Sopenharmony_ci	u32 original_value, readback_value, bitshift;
1488c2ecf20Sopenharmony_ci
1498c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
1508c2ecf20Sopenharmony_ci		"regaddr(%#x), rfpath(%#x), bitmask(%#x)\n",
1518c2ecf20Sopenharmony_ci		regaddr, rfpath, bitmask);
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_ci	spin_lock(&rtlpriv->locks.rf_lock);
1548c2ecf20Sopenharmony_ci
1558c2ecf20Sopenharmony_ci	original_value = _rtl8821ae_phy_rf_serial_read(hw, rfpath, regaddr);
1568c2ecf20Sopenharmony_ci	bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask);
1578c2ecf20Sopenharmony_ci	readback_value = (original_value & bitmask) >> bitshift;
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_ci	spin_unlock(&rtlpriv->locks.rf_lock);
1608c2ecf20Sopenharmony_ci
1618c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
1628c2ecf20Sopenharmony_ci		"regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n",
1638c2ecf20Sopenharmony_ci		regaddr, rfpath, bitmask, original_value);
1648c2ecf20Sopenharmony_ci
1658c2ecf20Sopenharmony_ci	return readback_value;
1668c2ecf20Sopenharmony_ci}
1678c2ecf20Sopenharmony_ci
1688c2ecf20Sopenharmony_civoid rtl8821ae_phy_set_rf_reg(struct ieee80211_hw *hw,
1698c2ecf20Sopenharmony_ci			   enum radio_path rfpath,
1708c2ecf20Sopenharmony_ci			   u32 regaddr, u32 bitmask, u32 data)
1718c2ecf20Sopenharmony_ci{
1728c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
1738c2ecf20Sopenharmony_ci	u32 original_value, bitshift;
1748c2ecf20Sopenharmony_ci
1758c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
1768c2ecf20Sopenharmony_ci		"regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
1778c2ecf20Sopenharmony_ci		regaddr, bitmask, data, rfpath);
1788c2ecf20Sopenharmony_ci
1798c2ecf20Sopenharmony_ci	spin_lock(&rtlpriv->locks.rf_lock);
1808c2ecf20Sopenharmony_ci
1818c2ecf20Sopenharmony_ci	if (bitmask != RFREG_OFFSET_MASK) {
1828c2ecf20Sopenharmony_ci		original_value =
1838c2ecf20Sopenharmony_ci		   _rtl8821ae_phy_rf_serial_read(hw, rfpath, regaddr);
1848c2ecf20Sopenharmony_ci		bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask);
1858c2ecf20Sopenharmony_ci		data = ((original_value & (~bitmask)) | (data << bitshift));
1868c2ecf20Sopenharmony_ci	}
1878c2ecf20Sopenharmony_ci
1888c2ecf20Sopenharmony_ci	_rtl8821ae_phy_rf_serial_write(hw, rfpath, regaddr, data);
1898c2ecf20Sopenharmony_ci
1908c2ecf20Sopenharmony_ci	spin_unlock(&rtlpriv->locks.rf_lock);
1918c2ecf20Sopenharmony_ci
1928c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
1938c2ecf20Sopenharmony_ci		"regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
1948c2ecf20Sopenharmony_ci		 regaddr, bitmask, data, rfpath);
1958c2ecf20Sopenharmony_ci}
1968c2ecf20Sopenharmony_ci
1978c2ecf20Sopenharmony_cistatic u32 _rtl8821ae_phy_rf_serial_read(struct ieee80211_hw *hw,
1988c2ecf20Sopenharmony_ci					 enum radio_path rfpath, u32 offset)
1998c2ecf20Sopenharmony_ci{
2008c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2018c2ecf20Sopenharmony_ci	bool is_pi_mode = false;
2028c2ecf20Sopenharmony_ci	u32 retvalue = 0;
2038c2ecf20Sopenharmony_ci
2048c2ecf20Sopenharmony_ci	/* 2009/06/17 MH We can not execute IO for power
2058c2ecf20Sopenharmony_ci	save or other accident mode.*/
2068c2ecf20Sopenharmony_ci	if (RT_CANNOT_IO(hw)) {
2078c2ecf20Sopenharmony_ci		pr_err("return all one\n");
2088c2ecf20Sopenharmony_ci		return 0xFFFFFFFF;
2098c2ecf20Sopenharmony_ci	}
2108c2ecf20Sopenharmony_ci	/* <20120809, Kordan> CCA OFF(when entering),
2118c2ecf20Sopenharmony_ci		asked by James to avoid reading the wrong value.
2128c2ecf20Sopenharmony_ci	    <20120828, Kordan> Toggling CCA would affect RF 0x0, skip it!*/
2138c2ecf20Sopenharmony_ci	if (offset != 0x0 &&
2148c2ecf20Sopenharmony_ci	    !((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) ||
2158c2ecf20Sopenharmony_ci	    (IS_VENDOR_8812A_C_CUT(rtlhal->version))))
2168c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RCCAONSEC, 0x8, 1);
2178c2ecf20Sopenharmony_ci	offset &= 0xff;
2188c2ecf20Sopenharmony_ci
2198c2ecf20Sopenharmony_ci	if (rfpath == RF90_PATH_A)
2208c2ecf20Sopenharmony_ci		is_pi_mode = (bool)rtl_get_bbreg(hw, 0xC00, 0x4);
2218c2ecf20Sopenharmony_ci	else if (rfpath == RF90_PATH_B)
2228c2ecf20Sopenharmony_ci		is_pi_mode = (bool)rtl_get_bbreg(hw, 0xE00, 0x4);
2238c2ecf20Sopenharmony_ci
2248c2ecf20Sopenharmony_ci	rtl_set_bbreg(hw, RHSSIREAD_8821AE, 0xff, offset);
2258c2ecf20Sopenharmony_ci
2268c2ecf20Sopenharmony_ci	if ((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) ||
2278c2ecf20Sopenharmony_ci	    (IS_VENDOR_8812A_C_CUT(rtlhal->version)))
2288c2ecf20Sopenharmony_ci		udelay(20);
2298c2ecf20Sopenharmony_ci
2308c2ecf20Sopenharmony_ci	if (is_pi_mode) {
2318c2ecf20Sopenharmony_ci		if (rfpath == RF90_PATH_A)
2328c2ecf20Sopenharmony_ci			retvalue =
2338c2ecf20Sopenharmony_ci			  rtl_get_bbreg(hw, RA_PIREAD_8821A, BLSSIREADBACKDATA);
2348c2ecf20Sopenharmony_ci		else if (rfpath == RF90_PATH_B)
2358c2ecf20Sopenharmony_ci			retvalue =
2368c2ecf20Sopenharmony_ci			  rtl_get_bbreg(hw, RB_PIREAD_8821A, BLSSIREADBACKDATA);
2378c2ecf20Sopenharmony_ci	} else {
2388c2ecf20Sopenharmony_ci		if (rfpath == RF90_PATH_A)
2398c2ecf20Sopenharmony_ci			retvalue =
2408c2ecf20Sopenharmony_ci			  rtl_get_bbreg(hw, RA_SIREAD_8821A, BLSSIREADBACKDATA);
2418c2ecf20Sopenharmony_ci		else if (rfpath == RF90_PATH_B)
2428c2ecf20Sopenharmony_ci			retvalue =
2438c2ecf20Sopenharmony_ci			  rtl_get_bbreg(hw, RB_SIREAD_8821A, BLSSIREADBACKDATA);
2448c2ecf20Sopenharmony_ci	}
2458c2ecf20Sopenharmony_ci
2468c2ecf20Sopenharmony_ci	/*<20120809, Kordan> CCA ON(when exiting),
2478c2ecf20Sopenharmony_ci	 * asked by James to avoid reading the wrong value.
2488c2ecf20Sopenharmony_ci	 *   <20120828, Kordan> Toggling CCA would affect RF 0x0, skip it!
2498c2ecf20Sopenharmony_ci	 */
2508c2ecf20Sopenharmony_ci	if (offset != 0x0 &&
2518c2ecf20Sopenharmony_ci	    !((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) ||
2528c2ecf20Sopenharmony_ci	    (IS_VENDOR_8812A_C_CUT(rtlhal->version))))
2538c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RCCAONSEC, 0x8, 0);
2548c2ecf20Sopenharmony_ci	return retvalue;
2558c2ecf20Sopenharmony_ci}
2568c2ecf20Sopenharmony_ci
2578c2ecf20Sopenharmony_cistatic void _rtl8821ae_phy_rf_serial_write(struct ieee80211_hw *hw,
2588c2ecf20Sopenharmony_ci					   enum radio_path rfpath, u32 offset,
2598c2ecf20Sopenharmony_ci					   u32 data)
2608c2ecf20Sopenharmony_ci{
2618c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
2628c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
2638c2ecf20Sopenharmony_ci	struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
2648c2ecf20Sopenharmony_ci	u32 data_and_addr;
2658c2ecf20Sopenharmony_ci	u32 newoffset;
2668c2ecf20Sopenharmony_ci
2678c2ecf20Sopenharmony_ci	if (RT_CANNOT_IO(hw)) {
2688c2ecf20Sopenharmony_ci		pr_err("stop\n");
2698c2ecf20Sopenharmony_ci		return;
2708c2ecf20Sopenharmony_ci	}
2718c2ecf20Sopenharmony_ci	offset &= 0xff;
2728c2ecf20Sopenharmony_ci	newoffset = offset;
2738c2ecf20Sopenharmony_ci	data_and_addr = ((newoffset << 20) |
2748c2ecf20Sopenharmony_ci			 (data & 0x000fffff)) & 0x0fffffff;
2758c2ecf20Sopenharmony_ci	rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr);
2768c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
2778c2ecf20Sopenharmony_ci		"RFW-%d Addr[0x%x]=0x%x\n",
2788c2ecf20Sopenharmony_ci		rfpath, pphyreg->rf3wire_offset, data_and_addr);
2798c2ecf20Sopenharmony_ci}
2808c2ecf20Sopenharmony_ci
2818c2ecf20Sopenharmony_cibool rtl8821ae_phy_mac_config(struct ieee80211_hw *hw)
2828c2ecf20Sopenharmony_ci{
2838c2ecf20Sopenharmony_ci	bool rtstatus = 0;
2848c2ecf20Sopenharmony_ci
2858c2ecf20Sopenharmony_ci	rtstatus = _rtl8821ae_phy_config_mac_with_headerfile(hw);
2868c2ecf20Sopenharmony_ci
2878c2ecf20Sopenharmony_ci	return rtstatus;
2888c2ecf20Sopenharmony_ci}
2898c2ecf20Sopenharmony_ci
2908c2ecf20Sopenharmony_cibool rtl8821ae_phy_bb_config(struct ieee80211_hw *hw)
2918c2ecf20Sopenharmony_ci{
2928c2ecf20Sopenharmony_ci	bool rtstatus = true;
2938c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
2948c2ecf20Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2958c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
2968c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2978c2ecf20Sopenharmony_ci	u8 regval;
2988c2ecf20Sopenharmony_ci	u8 crystal_cap;
2998c2ecf20Sopenharmony_ci
3008c2ecf20Sopenharmony_ci	phy_init_bb_rf_register_definition(hw);
3018c2ecf20Sopenharmony_ci
3028c2ecf20Sopenharmony_ci	regval = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN);
3038c2ecf20Sopenharmony_ci	regval |= FEN_PCIEA;
3048c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, regval);
3058c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN,
3068c2ecf20Sopenharmony_ci		       regval | FEN_BB_GLB_RSTN | FEN_BBRSTB);
3078c2ecf20Sopenharmony_ci
3088c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x7);
3098c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_OPT_CTRL + 2, 0x7);
3108c2ecf20Sopenharmony_ci
3118c2ecf20Sopenharmony_ci	rtstatus = _rtl8821ae_phy_bb8821a_config_parafile(hw);
3128c2ecf20Sopenharmony_ci
3138c2ecf20Sopenharmony_ci	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
3148c2ecf20Sopenharmony_ci		crystal_cap = rtlefuse->crystalcap & 0x3F;
3158c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, REG_MAC_PHY_CTRL, 0x7FF80000,
3168c2ecf20Sopenharmony_ci			      (crystal_cap | (crystal_cap << 6)));
3178c2ecf20Sopenharmony_ci	} else {
3188c2ecf20Sopenharmony_ci		crystal_cap = rtlefuse->crystalcap & 0x3F;
3198c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, REG_MAC_PHY_CTRL, 0xFFF000,
3208c2ecf20Sopenharmony_ci			      (crystal_cap | (crystal_cap << 6)));
3218c2ecf20Sopenharmony_ci	}
3228c2ecf20Sopenharmony_ci	rtlphy->reg_837 = rtl_read_byte(rtlpriv, 0x837);
3238c2ecf20Sopenharmony_ci
3248c2ecf20Sopenharmony_ci	return rtstatus;
3258c2ecf20Sopenharmony_ci}
3268c2ecf20Sopenharmony_ci
3278c2ecf20Sopenharmony_cibool rtl8821ae_phy_rf_config(struct ieee80211_hw *hw)
3288c2ecf20Sopenharmony_ci{
3298c2ecf20Sopenharmony_ci	return rtl8821ae_phy_rf6052_config(hw);
3308c2ecf20Sopenharmony_ci}
3318c2ecf20Sopenharmony_ci
3328c2ecf20Sopenharmony_cistatic void _rtl8812ae_phy_set_rfe_reg_24g(struct ieee80211_hw *hw)
3338c2ecf20Sopenharmony_ci{
3348c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
3358c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3368c2ecf20Sopenharmony_ci	u8 tmp;
3378c2ecf20Sopenharmony_ci
3388c2ecf20Sopenharmony_ci	switch (rtlhal->rfe_type) {
3398c2ecf20Sopenharmony_ci	case 3:
3408c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x54337770);
3418c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x54337770);
3428c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x010);
3438c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010);
3448c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, 0x900, 0x00000303, 0x1);
3458c2ecf20Sopenharmony_ci		break;
3468c2ecf20Sopenharmony_ci	case 4:
3478c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x77777777);
3488c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77777777);
3498c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x001);
3508c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x001);
3518c2ecf20Sopenharmony_ci		break;
3528c2ecf20Sopenharmony_ci	case 5:
3538c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, RA_RFE_PINMUX + 2, 0x77);
3548c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77777777);
3558c2ecf20Sopenharmony_ci		tmp = rtl_read_byte(rtlpriv, RA_RFE_INV + 3);
3568c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, RA_RFE_INV + 3, tmp & ~0x1);
3578c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000);
3588c2ecf20Sopenharmony_ci		break;
3598c2ecf20Sopenharmony_ci	case 1:
3608c2ecf20Sopenharmony_ci		if (rtlpriv->btcoexist.bt_coexistence) {
3618c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xffffff, 0x777777);
3628c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD,
3638c2ecf20Sopenharmony_ci				      0x77777777);
3648c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RA_RFE_INV, 0x33f00000, 0x000);
3658c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000);
3668c2ecf20Sopenharmony_ci			break;
3678c2ecf20Sopenharmony_ci		}
3688c2ecf20Sopenharmony_ci		fallthrough;
3698c2ecf20Sopenharmony_ci	case 0:
3708c2ecf20Sopenharmony_ci	case 2:
3718c2ecf20Sopenharmony_ci	default:
3728c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x77777777);
3738c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77777777);
3748c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x000);
3758c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000);
3768c2ecf20Sopenharmony_ci		break;
3778c2ecf20Sopenharmony_ci	}
3788c2ecf20Sopenharmony_ci}
3798c2ecf20Sopenharmony_ci
3808c2ecf20Sopenharmony_cistatic void _rtl8812ae_phy_set_rfe_reg_5g(struct ieee80211_hw *hw)
3818c2ecf20Sopenharmony_ci{
3828c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
3838c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3848c2ecf20Sopenharmony_ci	u8 tmp;
3858c2ecf20Sopenharmony_ci
3868c2ecf20Sopenharmony_ci	switch (rtlhal->rfe_type) {
3878c2ecf20Sopenharmony_ci	case 0:
3888c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x77337717);
3898c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77337717);
3908c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x010);
3918c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010);
3928c2ecf20Sopenharmony_ci		break;
3938c2ecf20Sopenharmony_ci	case 1:
3948c2ecf20Sopenharmony_ci		if (rtlpriv->btcoexist.bt_coexistence) {
3958c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xffffff, 0x337717);
3968c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD,
3978c2ecf20Sopenharmony_ci				      0x77337717);
3988c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RA_RFE_INV, 0x33f00000, 0x000);
3998c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000);
4008c2ecf20Sopenharmony_ci		} else {
4018c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD,
4028c2ecf20Sopenharmony_ci				      0x77337717);
4038c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD,
4048c2ecf20Sopenharmony_ci				      0x77337717);
4058c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x000);
4068c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000);
4078c2ecf20Sopenharmony_ci		}
4088c2ecf20Sopenharmony_ci		break;
4098c2ecf20Sopenharmony_ci	case 3:
4108c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x54337717);
4118c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x54337717);
4128c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x010);
4138c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010);
4148c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, 0x900, 0x00000303, 0x1);
4158c2ecf20Sopenharmony_ci		break;
4168c2ecf20Sopenharmony_ci	case 5:
4178c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, RA_RFE_PINMUX + 2, 0x33);
4188c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77337777);
4198c2ecf20Sopenharmony_ci		tmp = rtl_read_byte(rtlpriv, RA_RFE_INV + 3);
4208c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, RA_RFE_INV + 3, tmp | 0x1);
4218c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010);
4228c2ecf20Sopenharmony_ci		break;
4238c2ecf20Sopenharmony_ci	case 2:
4248c2ecf20Sopenharmony_ci	case 4:
4258c2ecf20Sopenharmony_ci	default:
4268c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x77337777);
4278c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77337777);
4288c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x010);
4298c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010);
4308c2ecf20Sopenharmony_ci		break;
4318c2ecf20Sopenharmony_ci	}
4328c2ecf20Sopenharmony_ci}
4338c2ecf20Sopenharmony_ci
4348c2ecf20Sopenharmony_ciu32 phy_get_tx_swing_8812A(struct ieee80211_hw *hw, u8	band,
4358c2ecf20Sopenharmony_ci			   u8 rf_path)
4368c2ecf20Sopenharmony_ci{
4378c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
4388c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
4398c2ecf20Sopenharmony_ci	struct rtl_dm *rtldm = rtl_dm(rtlpriv);
4408c2ecf20Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
4418c2ecf20Sopenharmony_ci	s8 reg_swing_2g = -1;/* 0xff; */
4428c2ecf20Sopenharmony_ci	s8 reg_swing_5g = -1;/* 0xff; */
4438c2ecf20Sopenharmony_ci	s8 swing_2g = -1 * reg_swing_2g;
4448c2ecf20Sopenharmony_ci	s8 swing_5g = -1 * reg_swing_5g;
4458c2ecf20Sopenharmony_ci	u32  out = 0x200;
4468c2ecf20Sopenharmony_ci	const s8 auto_temp = -1;
4478c2ecf20Sopenharmony_ci
4488c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
4498c2ecf20Sopenharmony_ci		"===> PHY_GetTXBBSwing_8812A, bbSwing_2G: %d, bbSwing_5G: %d,autoload_failflag=%d.\n",
4508c2ecf20Sopenharmony_ci		(int)swing_2g, (int)swing_5g,
4518c2ecf20Sopenharmony_ci		(int)rtlefuse->autoload_failflag);
4528c2ecf20Sopenharmony_ci
4538c2ecf20Sopenharmony_ci	if (rtlefuse->autoload_failflag) {
4548c2ecf20Sopenharmony_ci		if (band == BAND_ON_2_4G) {
4558c2ecf20Sopenharmony_ci			rtldm->swing_diff_2g = swing_2g;
4568c2ecf20Sopenharmony_ci			if (swing_2g == 0) {
4578c2ecf20Sopenharmony_ci				out = 0x200; /* 0 dB */
4588c2ecf20Sopenharmony_ci			} else if (swing_2g == -3) {
4598c2ecf20Sopenharmony_ci				out = 0x16A; /* -3 dB */
4608c2ecf20Sopenharmony_ci			} else if (swing_2g == -6) {
4618c2ecf20Sopenharmony_ci				out = 0x101; /* -6 dB */
4628c2ecf20Sopenharmony_ci			} else if (swing_2g == -9) {
4638c2ecf20Sopenharmony_ci				out = 0x0B6; /* -9 dB */
4648c2ecf20Sopenharmony_ci			} else {
4658c2ecf20Sopenharmony_ci				rtldm->swing_diff_2g = 0;
4668c2ecf20Sopenharmony_ci				out = 0x200;
4678c2ecf20Sopenharmony_ci			}
4688c2ecf20Sopenharmony_ci		} else if (band == BAND_ON_5G) {
4698c2ecf20Sopenharmony_ci			rtldm->swing_diff_5g = swing_5g;
4708c2ecf20Sopenharmony_ci			if (swing_5g == 0) {
4718c2ecf20Sopenharmony_ci				out = 0x200; /* 0 dB */
4728c2ecf20Sopenharmony_ci			} else if (swing_5g == -3) {
4738c2ecf20Sopenharmony_ci				out = 0x16A; /* -3 dB */
4748c2ecf20Sopenharmony_ci			} else if (swing_5g == -6) {
4758c2ecf20Sopenharmony_ci				out = 0x101; /* -6 dB */
4768c2ecf20Sopenharmony_ci			} else if (swing_5g == -9) {
4778c2ecf20Sopenharmony_ci				out = 0x0B6; /* -9 dB */
4788c2ecf20Sopenharmony_ci			} else {
4798c2ecf20Sopenharmony_ci				if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
4808c2ecf20Sopenharmony_ci					rtldm->swing_diff_5g = -3;
4818c2ecf20Sopenharmony_ci					out = 0x16A;
4828c2ecf20Sopenharmony_ci				} else {
4838c2ecf20Sopenharmony_ci					rtldm->swing_diff_5g = 0;
4848c2ecf20Sopenharmony_ci					out = 0x200;
4858c2ecf20Sopenharmony_ci				}
4868c2ecf20Sopenharmony_ci			}
4878c2ecf20Sopenharmony_ci		} else {
4888c2ecf20Sopenharmony_ci			rtldm->swing_diff_2g = -3;
4898c2ecf20Sopenharmony_ci			rtldm->swing_diff_5g = -3;
4908c2ecf20Sopenharmony_ci			out = 0x16A; /* -3 dB */
4918c2ecf20Sopenharmony_ci		}
4928c2ecf20Sopenharmony_ci	} else {
4938c2ecf20Sopenharmony_ci		u32 swing = 0, swing_a = 0, swing_b = 0;
4948c2ecf20Sopenharmony_ci
4958c2ecf20Sopenharmony_ci		if (band == BAND_ON_2_4G) {
4968c2ecf20Sopenharmony_ci			if (reg_swing_2g == auto_temp) {
4978c2ecf20Sopenharmony_ci				efuse_shadow_read(hw, 1, 0xC6, (u32 *)&swing);
4988c2ecf20Sopenharmony_ci				swing = (swing == 0xFF) ? 0x00 : swing;
4998c2ecf20Sopenharmony_ci			} else if (swing_2g ==  0) {
5008c2ecf20Sopenharmony_ci				swing = 0x00; /* 0 dB */
5018c2ecf20Sopenharmony_ci			} else if (swing_2g == -3) {
5028c2ecf20Sopenharmony_ci				swing = 0x05; /* -3 dB */
5038c2ecf20Sopenharmony_ci			} else if (swing_2g == -6) {
5048c2ecf20Sopenharmony_ci				swing = 0x0A; /* -6 dB */
5058c2ecf20Sopenharmony_ci			} else if (swing_2g == -9) {
5068c2ecf20Sopenharmony_ci				swing = 0xFF; /* -9 dB */
5078c2ecf20Sopenharmony_ci			} else {
5088c2ecf20Sopenharmony_ci				swing = 0x00;
5098c2ecf20Sopenharmony_ci			}
5108c2ecf20Sopenharmony_ci		} else {
5118c2ecf20Sopenharmony_ci			if (reg_swing_5g == auto_temp) {
5128c2ecf20Sopenharmony_ci				efuse_shadow_read(hw, 1, 0xC7, (u32 *)&swing);
5138c2ecf20Sopenharmony_ci				swing = (swing == 0xFF) ? 0x00 : swing;
5148c2ecf20Sopenharmony_ci			} else if (swing_5g ==  0) {
5158c2ecf20Sopenharmony_ci				swing = 0x00; /* 0 dB */
5168c2ecf20Sopenharmony_ci			} else if (swing_5g == -3) {
5178c2ecf20Sopenharmony_ci				swing = 0x05; /* -3 dB */
5188c2ecf20Sopenharmony_ci			} else if (swing_5g == -6) {
5198c2ecf20Sopenharmony_ci				swing = 0x0A; /* -6 dB */
5208c2ecf20Sopenharmony_ci			} else if (swing_5g == -9) {
5218c2ecf20Sopenharmony_ci				swing = 0xFF; /* -9 dB */
5228c2ecf20Sopenharmony_ci			} else {
5238c2ecf20Sopenharmony_ci				swing = 0x00;
5248c2ecf20Sopenharmony_ci			}
5258c2ecf20Sopenharmony_ci		}
5268c2ecf20Sopenharmony_ci
5278c2ecf20Sopenharmony_ci		swing_a = (swing & 0x3) >> 0; /* 0xC6/C7[1:0] */
5288c2ecf20Sopenharmony_ci		swing_b = (swing & 0xC) >> 2; /* 0xC6/C7[3:2] */
5298c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
5308c2ecf20Sopenharmony_ci			"===> PHY_GetTXBBSwing_8812A, swingA: 0x%X, swingB: 0x%X\n",
5318c2ecf20Sopenharmony_ci			swing_a, swing_b);
5328c2ecf20Sopenharmony_ci
5338c2ecf20Sopenharmony_ci		/* 3 Path-A */
5348c2ecf20Sopenharmony_ci		if (swing_a == 0x0) {
5358c2ecf20Sopenharmony_ci			if (band == BAND_ON_2_4G)
5368c2ecf20Sopenharmony_ci				rtldm->swing_diff_2g = 0;
5378c2ecf20Sopenharmony_ci			else
5388c2ecf20Sopenharmony_ci				rtldm->swing_diff_5g = 0;
5398c2ecf20Sopenharmony_ci			out = 0x200; /* 0 dB */
5408c2ecf20Sopenharmony_ci		} else if (swing_a == 0x1) {
5418c2ecf20Sopenharmony_ci			if (band == BAND_ON_2_4G)
5428c2ecf20Sopenharmony_ci				rtldm->swing_diff_2g = -3;
5438c2ecf20Sopenharmony_ci			else
5448c2ecf20Sopenharmony_ci				rtldm->swing_diff_5g = -3;
5458c2ecf20Sopenharmony_ci			out = 0x16A; /* -3 dB */
5468c2ecf20Sopenharmony_ci		} else if (swing_a == 0x2) {
5478c2ecf20Sopenharmony_ci			if (band == BAND_ON_2_4G)
5488c2ecf20Sopenharmony_ci				rtldm->swing_diff_2g = -6;
5498c2ecf20Sopenharmony_ci			else
5508c2ecf20Sopenharmony_ci				rtldm->swing_diff_5g = -6;
5518c2ecf20Sopenharmony_ci			out = 0x101; /* -6 dB */
5528c2ecf20Sopenharmony_ci		} else if (swing_a == 0x3) {
5538c2ecf20Sopenharmony_ci			if (band == BAND_ON_2_4G)
5548c2ecf20Sopenharmony_ci				rtldm->swing_diff_2g = -9;
5558c2ecf20Sopenharmony_ci			else
5568c2ecf20Sopenharmony_ci				rtldm->swing_diff_5g = -9;
5578c2ecf20Sopenharmony_ci			out = 0x0B6; /* -9 dB */
5588c2ecf20Sopenharmony_ci		}
5598c2ecf20Sopenharmony_ci		/* 3 Path-B */
5608c2ecf20Sopenharmony_ci		if (swing_b == 0x0) {
5618c2ecf20Sopenharmony_ci			if (band == BAND_ON_2_4G)
5628c2ecf20Sopenharmony_ci				rtldm->swing_diff_2g = 0;
5638c2ecf20Sopenharmony_ci			else
5648c2ecf20Sopenharmony_ci				rtldm->swing_diff_5g = 0;
5658c2ecf20Sopenharmony_ci			out = 0x200; /* 0 dB */
5668c2ecf20Sopenharmony_ci		} else if (swing_b == 0x1) {
5678c2ecf20Sopenharmony_ci			if (band == BAND_ON_2_4G)
5688c2ecf20Sopenharmony_ci				rtldm->swing_diff_2g = -3;
5698c2ecf20Sopenharmony_ci			else
5708c2ecf20Sopenharmony_ci				rtldm->swing_diff_5g = -3;
5718c2ecf20Sopenharmony_ci			out = 0x16A; /* -3 dB */
5728c2ecf20Sopenharmony_ci		} else if (swing_b == 0x2) {
5738c2ecf20Sopenharmony_ci			if (band == BAND_ON_2_4G)
5748c2ecf20Sopenharmony_ci				rtldm->swing_diff_2g = -6;
5758c2ecf20Sopenharmony_ci			else
5768c2ecf20Sopenharmony_ci				rtldm->swing_diff_5g = -6;
5778c2ecf20Sopenharmony_ci			out = 0x101; /* -6 dB */
5788c2ecf20Sopenharmony_ci		} else if (swing_b == 0x3) {
5798c2ecf20Sopenharmony_ci			if (band == BAND_ON_2_4G)
5808c2ecf20Sopenharmony_ci				rtldm->swing_diff_2g = -9;
5818c2ecf20Sopenharmony_ci			else
5828c2ecf20Sopenharmony_ci				rtldm->swing_diff_5g = -9;
5838c2ecf20Sopenharmony_ci			out = 0x0B6; /* -9 dB */
5848c2ecf20Sopenharmony_ci		}
5858c2ecf20Sopenharmony_ci	}
5868c2ecf20Sopenharmony_ci
5878c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
5888c2ecf20Sopenharmony_ci		"<=== PHY_GetTXBBSwing_8812A, out = 0x%X\n", out);
5898c2ecf20Sopenharmony_ci	return out;
5908c2ecf20Sopenharmony_ci}
5918c2ecf20Sopenharmony_ci
5928c2ecf20Sopenharmony_civoid rtl8821ae_phy_switch_wirelessband(struct ieee80211_hw *hw, u8 band)
5938c2ecf20Sopenharmony_ci{
5948c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
5958c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
5968c2ecf20Sopenharmony_ci	struct rtl_dm *rtldm = rtl_dm(rtlpriv);
5978c2ecf20Sopenharmony_ci	u8 current_band = rtlhal->current_bandtype;
5988c2ecf20Sopenharmony_ci	u32 txpath, rxpath;
5998c2ecf20Sopenharmony_ci	s8 bb_diff_between_band;
6008c2ecf20Sopenharmony_ci
6018c2ecf20Sopenharmony_ci	txpath = rtl8821ae_phy_query_bb_reg(hw, RTXPATH, 0xf0);
6028c2ecf20Sopenharmony_ci	rxpath = rtl8821ae_phy_query_bb_reg(hw, RCCK_RX, 0x0f000000);
6038c2ecf20Sopenharmony_ci	rtlhal->current_bandtype = (enum band_type) band;
6048c2ecf20Sopenharmony_ci	/* reconfig BB/RF according to wireless mode */
6058c2ecf20Sopenharmony_ci	if (rtlhal->current_bandtype == BAND_ON_2_4G) {
6068c2ecf20Sopenharmony_ci		/* BB & RF Config */
6078c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, ROFDMCCKEN, BOFDMEN|BCCKEN, 0x03);
6088c2ecf20Sopenharmony_ci
6098c2ecf20Sopenharmony_ci		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
6108c2ecf20Sopenharmony_ci			/* 0xCB0[15:12] = 0x7 (LNA_On)*/
6118c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF000, 0x7);
6128c2ecf20Sopenharmony_ci			/* 0xCB0[7:4] = 0x7 (PAPE_A)*/
6138c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF0, 0x7);
6148c2ecf20Sopenharmony_ci		}
6158c2ecf20Sopenharmony_ci
6168c2ecf20Sopenharmony_ci		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
6178c2ecf20Sopenharmony_ci			/*0x834[1:0] = 0x1*/
6188c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, 0x834, 0x3, 0x1);
6198c2ecf20Sopenharmony_ci		}
6208c2ecf20Sopenharmony_ci
6218c2ecf20Sopenharmony_ci		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
6228c2ecf20Sopenharmony_ci			/* 0xC1C[11:8] = 0 */
6238c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RA_TXSCALE, 0xF00, 0);
6248c2ecf20Sopenharmony_ci		} else {
6258c2ecf20Sopenharmony_ci			/* 0x82C[1:0] = 2b'00 */
6268c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, 0x82c, 0x3, 0);
6278c2ecf20Sopenharmony_ci		}
6288c2ecf20Sopenharmony_ci
6298c2ecf20Sopenharmony_ci		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
6308c2ecf20Sopenharmony_ci			_rtl8812ae_phy_set_rfe_reg_24g(hw);
6318c2ecf20Sopenharmony_ci
6328c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RTXPATH, 0xf0, 0x1);
6338c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RCCK_RX, 0x0f000000, 0x1);
6348c2ecf20Sopenharmony_ci
6358c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_CCK_CHECK, 0x0);
6368c2ecf20Sopenharmony_ci	} else {/* 5G band */
6378c2ecf20Sopenharmony_ci		u16 count, reg_41a;
6388c2ecf20Sopenharmony_ci
6398c2ecf20Sopenharmony_ci		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
6408c2ecf20Sopenharmony_ci			/*0xCB0[15:12] = 0x5 (LNA_On)*/
6418c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF000, 0x5);
6428c2ecf20Sopenharmony_ci			/*0xCB0[7:4] = 0x4 (PAPE_A)*/
6438c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF0, 0x4);
6448c2ecf20Sopenharmony_ci		}
6458c2ecf20Sopenharmony_ci		/*CCK_CHECK_en*/
6468c2ecf20Sopenharmony_ci		rtl_write_byte(rtlpriv, REG_CCK_CHECK, 0x80);
6478c2ecf20Sopenharmony_ci
6488c2ecf20Sopenharmony_ci		count = 0;
6498c2ecf20Sopenharmony_ci		reg_41a = rtl_read_word(rtlpriv, REG_TXPKT_EMPTY);
6508c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
6518c2ecf20Sopenharmony_ci			"Reg41A value %d\n", reg_41a);
6528c2ecf20Sopenharmony_ci		reg_41a &= 0x30;
6538c2ecf20Sopenharmony_ci		while ((reg_41a != 0x30) && (count < 50)) {
6548c2ecf20Sopenharmony_ci			udelay(50);
6558c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD, "Delay 50us\n");
6568c2ecf20Sopenharmony_ci
6578c2ecf20Sopenharmony_ci			reg_41a = rtl_read_word(rtlpriv, REG_TXPKT_EMPTY);
6588c2ecf20Sopenharmony_ci			reg_41a &= 0x30;
6598c2ecf20Sopenharmony_ci			count++;
6608c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
6618c2ecf20Sopenharmony_ci				"Reg41A value %d\n", reg_41a);
6628c2ecf20Sopenharmony_ci		}
6638c2ecf20Sopenharmony_ci		if (count != 0)
6648c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD,
6658c2ecf20Sopenharmony_ci				"PHY_SwitchWirelessBand8812(): Switch to 5G Band. Count = %d reg41A=0x%x\n",
6668c2ecf20Sopenharmony_ci				count, reg_41a);
6678c2ecf20Sopenharmony_ci
6688c2ecf20Sopenharmony_ci		/* 2012/02/01, Sinda add registry to switch workaround
6698c2ecf20Sopenharmony_ci		without long-run verification for scan issue. */
6708c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, ROFDMCCKEN, BOFDMEN|BCCKEN, 0x03);
6718c2ecf20Sopenharmony_ci
6728c2ecf20Sopenharmony_ci		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
6738c2ecf20Sopenharmony_ci			/*0x834[1:0] = 0x2*/
6748c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, 0x834, 0x3, 0x2);
6758c2ecf20Sopenharmony_ci		}
6768c2ecf20Sopenharmony_ci
6778c2ecf20Sopenharmony_ci		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
6788c2ecf20Sopenharmony_ci			/* AGC table select */
6798c2ecf20Sopenharmony_ci			/* 0xC1C[11:8] = 1*/
6808c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RA_TXSCALE, 0xF00, 1);
6818c2ecf20Sopenharmony_ci		} else
6828c2ecf20Sopenharmony_ci			/* 0x82C[1:0] = 2'b00 */
6838c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, 0x82c, 0x3, 1);
6848c2ecf20Sopenharmony_ci
6858c2ecf20Sopenharmony_ci		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
6868c2ecf20Sopenharmony_ci			_rtl8812ae_phy_set_rfe_reg_5g(hw);
6878c2ecf20Sopenharmony_ci
6888c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RTXPATH, 0xf0, 0);
6898c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RCCK_RX, 0x0f000000, 0xf);
6908c2ecf20Sopenharmony_ci
6918c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
6928c2ecf20Sopenharmony_ci			"==>PHY_SwitchWirelessBand8812() BAND_ON_5G settings OFDM index 0x%x\n",
6938c2ecf20Sopenharmony_ci			rtlpriv->dm.ofdm_index[RF90_PATH_A]);
6948c2ecf20Sopenharmony_ci	}
6958c2ecf20Sopenharmony_ci
6968c2ecf20Sopenharmony_ci	if ((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) ||
6978c2ecf20Sopenharmony_ci	    (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)) {
6988c2ecf20Sopenharmony_ci		/* 0xC1C[31:21] */
6998c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RA_TXSCALE, 0xFFE00000,
7008c2ecf20Sopenharmony_ci			      phy_get_tx_swing_8812A(hw, band, RF90_PATH_A));
7018c2ecf20Sopenharmony_ci		/* 0xE1C[31:21] */
7028c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RB_TXSCALE, 0xFFE00000,
7038c2ecf20Sopenharmony_ci			      phy_get_tx_swing_8812A(hw, band, RF90_PATH_B));
7048c2ecf20Sopenharmony_ci
7058c2ecf20Sopenharmony_ci		/* <20121005, Kordan> When TxPowerTrack is ON,
7068c2ecf20Sopenharmony_ci		 *	we should take care of the change of BB swing.
7078c2ecf20Sopenharmony_ci		 *   That is, reset all info to trigger Tx power tracking.
7088c2ecf20Sopenharmony_ci		 */
7098c2ecf20Sopenharmony_ci		if (band != current_band) {
7108c2ecf20Sopenharmony_ci			bb_diff_between_band =
7118c2ecf20Sopenharmony_ci				(rtldm->swing_diff_2g - rtldm->swing_diff_5g);
7128c2ecf20Sopenharmony_ci			bb_diff_between_band = (band == BAND_ON_2_4G) ?
7138c2ecf20Sopenharmony_ci						bb_diff_between_band :
7148c2ecf20Sopenharmony_ci						(-1 * bb_diff_between_band);
7158c2ecf20Sopenharmony_ci			rtldm->default_ofdm_index += bb_diff_between_band * 2;
7168c2ecf20Sopenharmony_ci		}
7178c2ecf20Sopenharmony_ci		rtl8821ae_dm_clear_txpower_tracking_state(hw);
7188c2ecf20Sopenharmony_ci	}
7198c2ecf20Sopenharmony_ci
7208c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE,
7218c2ecf20Sopenharmony_ci		"<==%s():Switch Band OK.\n", __func__);
7228c2ecf20Sopenharmony_ci	return;
7238c2ecf20Sopenharmony_ci}
7248c2ecf20Sopenharmony_ci
7258c2ecf20Sopenharmony_cistatic bool _rtl8821ae_check_positive(struct ieee80211_hw *hw,
7268c2ecf20Sopenharmony_ci				      const u32 condition1,
7278c2ecf20Sopenharmony_ci				      const u32 condition2)
7288c2ecf20Sopenharmony_ci{
7298c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
7308c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
7318c2ecf20Sopenharmony_ci	u32 cut_ver = ((rtlhal->version & CHIP_VER_RTL_MASK)
7328c2ecf20Sopenharmony_ci					>> CHIP_VER_RTL_SHIFT);
7338c2ecf20Sopenharmony_ci	u32 intf = (rtlhal->interface == INTF_USB ? BIT(1) : BIT(0));
7348c2ecf20Sopenharmony_ci
7358c2ecf20Sopenharmony_ci	u8  board_type = ((rtlhal->board_type & BIT(4)) >> 4) << 0 | /* _GLNA */
7368c2ecf20Sopenharmony_ci			 ((rtlhal->board_type & BIT(3)) >> 3) << 1 | /* _GPA  */
7378c2ecf20Sopenharmony_ci			 ((rtlhal->board_type & BIT(7)) >> 7) << 2 | /* _ALNA */
7388c2ecf20Sopenharmony_ci			 ((rtlhal->board_type & BIT(6)) >> 6) << 3 | /* _APA  */
7398c2ecf20Sopenharmony_ci			 ((rtlhal->board_type & BIT(2)) >> 2) << 4;  /* _BT   */
7408c2ecf20Sopenharmony_ci
7418c2ecf20Sopenharmony_ci	u32 cond1 = condition1, cond2 = condition2;
7428c2ecf20Sopenharmony_ci	u32 driver1 = cut_ver << 24 |	/* CUT ver */
7438c2ecf20Sopenharmony_ci		      0 << 20 |			/* interface 2/2 */
7448c2ecf20Sopenharmony_ci		      0x04 << 16 |		/* platform */
7458c2ecf20Sopenharmony_ci		      rtlhal->package_type << 12 |
7468c2ecf20Sopenharmony_ci		      intf << 8 |			/* interface 1/2 */
7478c2ecf20Sopenharmony_ci		      board_type;
7488c2ecf20Sopenharmony_ci
7498c2ecf20Sopenharmony_ci	u32 driver2 = rtlhal->type_glna <<  0 |
7508c2ecf20Sopenharmony_ci		      rtlhal->type_gpa  <<  8 |
7518c2ecf20Sopenharmony_ci		      rtlhal->type_alna << 16 |
7528c2ecf20Sopenharmony_ci		      rtlhal->type_apa  << 24;
7538c2ecf20Sopenharmony_ci
7548c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
7558c2ecf20Sopenharmony_ci		"===> [8812A] CheckPositive (cond1, cond2) = (0x%X 0x%X)\n",
7568c2ecf20Sopenharmony_ci		cond1, cond2);
7578c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
7588c2ecf20Sopenharmony_ci		"===> [8812A] CheckPositive (driver1, driver2) = (0x%X 0x%X)\n",
7598c2ecf20Sopenharmony_ci		driver1, driver2);
7608c2ecf20Sopenharmony_ci
7618c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
7628c2ecf20Sopenharmony_ci		"	(Platform, Interface) = (0x%X, 0x%X)\n", 0x04, intf);
7638c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
7648c2ecf20Sopenharmony_ci		"	(Board, Package) = (0x%X, 0x%X)\n",
7658c2ecf20Sopenharmony_ci		rtlhal->board_type, rtlhal->package_type);
7668c2ecf20Sopenharmony_ci
7678c2ecf20Sopenharmony_ci	/*============== Value Defined Check ===============*/
7688c2ecf20Sopenharmony_ci	/*QFN Type [15:12] and Cut Version [27:24] need to do value check*/
7698c2ecf20Sopenharmony_ci
7708c2ecf20Sopenharmony_ci	if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) !=
7718c2ecf20Sopenharmony_ci		(driver1 & 0x0000F000)))
7728c2ecf20Sopenharmony_ci		return false;
7738c2ecf20Sopenharmony_ci	if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) !=
7748c2ecf20Sopenharmony_ci		(driver1 & 0x0F000000)))
7758c2ecf20Sopenharmony_ci		return false;
7768c2ecf20Sopenharmony_ci
7778c2ecf20Sopenharmony_ci	/*=============== Bit Defined Check ================*/
7788c2ecf20Sopenharmony_ci	/* We don't care [31:28] */
7798c2ecf20Sopenharmony_ci
7808c2ecf20Sopenharmony_ci	cond1   &= 0x00FF0FFF;
7818c2ecf20Sopenharmony_ci	driver1 &= 0x00FF0FFF;
7828c2ecf20Sopenharmony_ci
7838c2ecf20Sopenharmony_ci	if ((cond1 & driver1) == cond1) {
7848c2ecf20Sopenharmony_ci		u32 mask = 0;
7858c2ecf20Sopenharmony_ci
7868c2ecf20Sopenharmony_ci		if ((cond1 & 0x0F) == 0) /* BoardType is DONTCARE*/
7878c2ecf20Sopenharmony_ci			return true;
7888c2ecf20Sopenharmony_ci
7898c2ecf20Sopenharmony_ci		if ((cond1 & BIT(0)) != 0) /*GLNA*/
7908c2ecf20Sopenharmony_ci			mask |= 0x000000FF;
7918c2ecf20Sopenharmony_ci		if ((cond1 & BIT(1)) != 0) /*GPA*/
7928c2ecf20Sopenharmony_ci			mask |= 0x0000FF00;
7938c2ecf20Sopenharmony_ci		if ((cond1 & BIT(2)) != 0) /*ALNA*/
7948c2ecf20Sopenharmony_ci			mask |= 0x00FF0000;
7958c2ecf20Sopenharmony_ci		if ((cond1 & BIT(3)) != 0) /*APA*/
7968c2ecf20Sopenharmony_ci			mask |= 0xFF000000;
7978c2ecf20Sopenharmony_ci
7988c2ecf20Sopenharmony_ci		/* BoardType of each RF path is matched*/
7998c2ecf20Sopenharmony_ci		if ((cond2 & mask) == (driver2 & mask))
8008c2ecf20Sopenharmony_ci			return true;
8018c2ecf20Sopenharmony_ci		else
8028c2ecf20Sopenharmony_ci			return false;
8038c2ecf20Sopenharmony_ci	} else
8048c2ecf20Sopenharmony_ci		return false;
8058c2ecf20Sopenharmony_ci}
8068c2ecf20Sopenharmony_ci
8078c2ecf20Sopenharmony_cistatic bool _rtl8821ae_check_condition(struct ieee80211_hw *hw,
8088c2ecf20Sopenharmony_ci				       const u32 condition)
8098c2ecf20Sopenharmony_ci{
8108c2ecf20Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
8118c2ecf20Sopenharmony_ci	u32 _board = rtlefuse->board_type; /*need efuse define*/
8128c2ecf20Sopenharmony_ci	u32 _interface = 0x01; /* ODM_ITRF_PCIE */
8138c2ecf20Sopenharmony_ci	u32 _platform = 0x08;/* ODM_WIN */
8148c2ecf20Sopenharmony_ci	u32 cond = condition;
8158c2ecf20Sopenharmony_ci
8168c2ecf20Sopenharmony_ci	if (condition == 0xCDCDCDCD)
8178c2ecf20Sopenharmony_ci		return true;
8188c2ecf20Sopenharmony_ci
8198c2ecf20Sopenharmony_ci	cond = condition & 0xFF;
8208c2ecf20Sopenharmony_ci	if ((_board != cond) && cond != 0xFF)
8218c2ecf20Sopenharmony_ci		return false;
8228c2ecf20Sopenharmony_ci
8238c2ecf20Sopenharmony_ci	cond = condition & 0xFF00;
8248c2ecf20Sopenharmony_ci	cond = cond >> 8;
8258c2ecf20Sopenharmony_ci	if ((_interface & cond) == 0 && cond != 0x07)
8268c2ecf20Sopenharmony_ci		return false;
8278c2ecf20Sopenharmony_ci
8288c2ecf20Sopenharmony_ci	cond = condition & 0xFF0000;
8298c2ecf20Sopenharmony_ci	cond = cond >> 16;
8308c2ecf20Sopenharmony_ci	if ((_platform & cond) == 0 && cond != 0x0F)
8318c2ecf20Sopenharmony_ci		return false;
8328c2ecf20Sopenharmony_ci	return true;
8338c2ecf20Sopenharmony_ci}
8348c2ecf20Sopenharmony_ci
8358c2ecf20Sopenharmony_cistatic void _rtl8821ae_config_rf_reg(struct ieee80211_hw *hw,
8368c2ecf20Sopenharmony_ci				     u32 addr, u32 data,
8378c2ecf20Sopenharmony_ci				     enum radio_path rfpath, u32 regaddr)
8388c2ecf20Sopenharmony_ci{
8398c2ecf20Sopenharmony_ci	if (addr == 0xfe || addr == 0xffe) {
8408c2ecf20Sopenharmony_ci		/* In order not to disturb BT music when
8418c2ecf20Sopenharmony_ci		 * wifi init.(1ant NIC only)
8428c2ecf20Sopenharmony_ci		 */
8438c2ecf20Sopenharmony_ci		mdelay(50);
8448c2ecf20Sopenharmony_ci	} else {
8458c2ecf20Sopenharmony_ci		rtl_set_rfreg(hw, rfpath, regaddr, RFREG_OFFSET_MASK, data);
8468c2ecf20Sopenharmony_ci		udelay(1);
8478c2ecf20Sopenharmony_ci	}
8488c2ecf20Sopenharmony_ci}
8498c2ecf20Sopenharmony_ci
8508c2ecf20Sopenharmony_cistatic void _rtl8821ae_config_rf_radio_a(struct ieee80211_hw *hw,
8518c2ecf20Sopenharmony_ci					 u32 addr, u32 data)
8528c2ecf20Sopenharmony_ci{
8538c2ecf20Sopenharmony_ci	u32 content = 0x1000; /*RF Content: radio_a_txt*/
8548c2ecf20Sopenharmony_ci	u32 maskforphyset = (u32)(content & 0xE000);
8558c2ecf20Sopenharmony_ci
8568c2ecf20Sopenharmony_ci	_rtl8821ae_config_rf_reg(hw, addr, data,
8578c2ecf20Sopenharmony_ci				 RF90_PATH_A, addr | maskforphyset);
8588c2ecf20Sopenharmony_ci}
8598c2ecf20Sopenharmony_ci
8608c2ecf20Sopenharmony_cistatic void _rtl8821ae_config_rf_radio_b(struct ieee80211_hw *hw,
8618c2ecf20Sopenharmony_ci					 u32 addr, u32 data)
8628c2ecf20Sopenharmony_ci{
8638c2ecf20Sopenharmony_ci	u32 content = 0x1001; /*RF Content: radio_b_txt*/
8648c2ecf20Sopenharmony_ci	u32 maskforphyset = (u32)(content & 0xE000);
8658c2ecf20Sopenharmony_ci
8668c2ecf20Sopenharmony_ci	_rtl8821ae_config_rf_reg(hw, addr, data,
8678c2ecf20Sopenharmony_ci				 RF90_PATH_B, addr | maskforphyset);
8688c2ecf20Sopenharmony_ci}
8698c2ecf20Sopenharmony_ci
8708c2ecf20Sopenharmony_cistatic void _rtl8821ae_config_bb_reg(struct ieee80211_hw *hw,
8718c2ecf20Sopenharmony_ci				     u32 addr, u32 data)
8728c2ecf20Sopenharmony_ci{
8738c2ecf20Sopenharmony_ci	if (addr == 0xfe)
8748c2ecf20Sopenharmony_ci		mdelay(50);
8758c2ecf20Sopenharmony_ci	else if (addr == 0xfd)
8768c2ecf20Sopenharmony_ci		mdelay(5);
8778c2ecf20Sopenharmony_ci	else if (addr == 0xfc)
8788c2ecf20Sopenharmony_ci		mdelay(1);
8798c2ecf20Sopenharmony_ci	else if (addr == 0xfb)
8808c2ecf20Sopenharmony_ci		udelay(50);
8818c2ecf20Sopenharmony_ci	else if (addr == 0xfa)
8828c2ecf20Sopenharmony_ci		udelay(5);
8838c2ecf20Sopenharmony_ci	else if (addr == 0xf9)
8848c2ecf20Sopenharmony_ci		udelay(1);
8858c2ecf20Sopenharmony_ci	else
8868c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, addr, MASKDWORD, data);
8878c2ecf20Sopenharmony_ci
8888c2ecf20Sopenharmony_ci	udelay(1);
8898c2ecf20Sopenharmony_ci}
8908c2ecf20Sopenharmony_ci
8918c2ecf20Sopenharmony_cistatic void _rtl8821ae_phy_init_tx_power_by_rate(struct ieee80211_hw *hw)
8928c2ecf20Sopenharmony_ci{
8938c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
8948c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
8958c2ecf20Sopenharmony_ci	u8 band, rfpath, txnum, rate_section;
8968c2ecf20Sopenharmony_ci
8978c2ecf20Sopenharmony_ci	for (band = BAND_ON_2_4G; band <= BAND_ON_5G; ++band)
8988c2ecf20Sopenharmony_ci		for (rfpath = 0; rfpath < TX_PWR_BY_RATE_NUM_RF; ++rfpath)
8998c2ecf20Sopenharmony_ci			for (txnum = 0; txnum < TX_PWR_BY_RATE_NUM_RF; ++txnum)
9008c2ecf20Sopenharmony_ci				for (rate_section = 0;
9018c2ecf20Sopenharmony_ci				     rate_section < TX_PWR_BY_RATE_NUM_SECTION;
9028c2ecf20Sopenharmony_ci				     ++rate_section)
9038c2ecf20Sopenharmony_ci					rtlphy->tx_power_by_rate_offset[band]
9048c2ecf20Sopenharmony_ci					    [rfpath][txnum][rate_section] = 0;
9058c2ecf20Sopenharmony_ci}
9068c2ecf20Sopenharmony_ci
9078c2ecf20Sopenharmony_cistatic void _rtl8821ae_phy_set_txpower_by_rate_base(struct ieee80211_hw *hw,
9088c2ecf20Sopenharmony_ci					  u8 band, u8 path,
9098c2ecf20Sopenharmony_ci					  u8 rate_section,
9108c2ecf20Sopenharmony_ci					  u8 txnum, u8 value)
9118c2ecf20Sopenharmony_ci{
9128c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
9138c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
9148c2ecf20Sopenharmony_ci
9158c2ecf20Sopenharmony_ci	if (path > RF90_PATH_D) {
9168c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
9178c2ecf20Sopenharmony_ci			"Invalid Rf Path %d in phy_SetTxPowerByRatBase()\n", path);
9188c2ecf20Sopenharmony_ci		return;
9198c2ecf20Sopenharmony_ci	}
9208c2ecf20Sopenharmony_ci
9218c2ecf20Sopenharmony_ci	if (band == BAND_ON_2_4G) {
9228c2ecf20Sopenharmony_ci		switch (rate_section) {
9238c2ecf20Sopenharmony_ci		case CCK:
9248c2ecf20Sopenharmony_ci			rtlphy->txpwr_by_rate_base_24g[path][txnum][0] = value;
9258c2ecf20Sopenharmony_ci			break;
9268c2ecf20Sopenharmony_ci		case OFDM:
9278c2ecf20Sopenharmony_ci			rtlphy->txpwr_by_rate_base_24g[path][txnum][1] = value;
9288c2ecf20Sopenharmony_ci			break;
9298c2ecf20Sopenharmony_ci		case HT_MCS0_MCS7:
9308c2ecf20Sopenharmony_ci			rtlphy->txpwr_by_rate_base_24g[path][txnum][2] = value;
9318c2ecf20Sopenharmony_ci			break;
9328c2ecf20Sopenharmony_ci		case HT_MCS8_MCS15:
9338c2ecf20Sopenharmony_ci			rtlphy->txpwr_by_rate_base_24g[path][txnum][3] = value;
9348c2ecf20Sopenharmony_ci			break;
9358c2ecf20Sopenharmony_ci		case VHT_1SSMCS0_1SSMCS9:
9368c2ecf20Sopenharmony_ci			rtlphy->txpwr_by_rate_base_24g[path][txnum][4] = value;
9378c2ecf20Sopenharmony_ci			break;
9388c2ecf20Sopenharmony_ci		case VHT_2SSMCS0_2SSMCS9:
9398c2ecf20Sopenharmony_ci			rtlphy->txpwr_by_rate_base_24g[path][txnum][5] = value;
9408c2ecf20Sopenharmony_ci			break;
9418c2ecf20Sopenharmony_ci		default:
9428c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
9438c2ecf20Sopenharmony_ci				"Invalid RateSection %d in Band 2.4G,Rf Path %d, %dTx in PHY_SetTxPowerByRateBase()\n",
9448c2ecf20Sopenharmony_ci				rate_section, path, txnum);
9458c2ecf20Sopenharmony_ci			break;
9468c2ecf20Sopenharmony_ci		}
9478c2ecf20Sopenharmony_ci	} else if (band == BAND_ON_5G) {
9488c2ecf20Sopenharmony_ci		switch (rate_section) {
9498c2ecf20Sopenharmony_ci		case OFDM:
9508c2ecf20Sopenharmony_ci			rtlphy->txpwr_by_rate_base_5g[path][txnum][0] = value;
9518c2ecf20Sopenharmony_ci			break;
9528c2ecf20Sopenharmony_ci		case HT_MCS0_MCS7:
9538c2ecf20Sopenharmony_ci			rtlphy->txpwr_by_rate_base_5g[path][txnum][1] = value;
9548c2ecf20Sopenharmony_ci			break;
9558c2ecf20Sopenharmony_ci		case HT_MCS8_MCS15:
9568c2ecf20Sopenharmony_ci			rtlphy->txpwr_by_rate_base_5g[path][txnum][2] = value;
9578c2ecf20Sopenharmony_ci			break;
9588c2ecf20Sopenharmony_ci		case VHT_1SSMCS0_1SSMCS9:
9598c2ecf20Sopenharmony_ci			rtlphy->txpwr_by_rate_base_5g[path][txnum][3] = value;
9608c2ecf20Sopenharmony_ci			break;
9618c2ecf20Sopenharmony_ci		case VHT_2SSMCS0_2SSMCS9:
9628c2ecf20Sopenharmony_ci			rtlphy->txpwr_by_rate_base_5g[path][txnum][4] = value;
9638c2ecf20Sopenharmony_ci			break;
9648c2ecf20Sopenharmony_ci		default:
9658c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
9668c2ecf20Sopenharmony_ci				"Invalid RateSection %d in Band 5G, Rf Path %d, %dTx in PHY_SetTxPowerByRateBase()\n",
9678c2ecf20Sopenharmony_ci				rate_section, path, txnum);
9688c2ecf20Sopenharmony_ci			break;
9698c2ecf20Sopenharmony_ci		}
9708c2ecf20Sopenharmony_ci	} else {
9718c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
9728c2ecf20Sopenharmony_ci			"Invalid Band %d in PHY_SetTxPowerByRateBase()\n", band);
9738c2ecf20Sopenharmony_ci	}
9748c2ecf20Sopenharmony_ci}
9758c2ecf20Sopenharmony_ci
9768c2ecf20Sopenharmony_cistatic u8 _rtl8821ae_phy_get_txpower_by_rate_base(struct ieee80211_hw *hw,
9778c2ecf20Sopenharmony_ci						  u8 band, u8 path,
9788c2ecf20Sopenharmony_ci						  u8 txnum, u8 rate_section)
9798c2ecf20Sopenharmony_ci{
9808c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
9818c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
9828c2ecf20Sopenharmony_ci	u8 value = 0;
9838c2ecf20Sopenharmony_ci
9848c2ecf20Sopenharmony_ci	if (path > RF90_PATH_D) {
9858c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
9868c2ecf20Sopenharmony_ci			"Invalid Rf Path %d in PHY_GetTxPowerByRateBase()\n",
9878c2ecf20Sopenharmony_ci			path);
9888c2ecf20Sopenharmony_ci		return 0;
9898c2ecf20Sopenharmony_ci	}
9908c2ecf20Sopenharmony_ci
9918c2ecf20Sopenharmony_ci	if (band == BAND_ON_2_4G) {
9928c2ecf20Sopenharmony_ci		switch (rate_section) {
9938c2ecf20Sopenharmony_ci		case CCK:
9948c2ecf20Sopenharmony_ci			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][0];
9958c2ecf20Sopenharmony_ci			break;
9968c2ecf20Sopenharmony_ci		case OFDM:
9978c2ecf20Sopenharmony_ci			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][1];
9988c2ecf20Sopenharmony_ci			break;
9998c2ecf20Sopenharmony_ci		case HT_MCS0_MCS7:
10008c2ecf20Sopenharmony_ci			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][2];
10018c2ecf20Sopenharmony_ci			break;
10028c2ecf20Sopenharmony_ci		case HT_MCS8_MCS15:
10038c2ecf20Sopenharmony_ci			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][3];
10048c2ecf20Sopenharmony_ci			break;
10058c2ecf20Sopenharmony_ci		case VHT_1SSMCS0_1SSMCS9:
10068c2ecf20Sopenharmony_ci			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][4];
10078c2ecf20Sopenharmony_ci			break;
10088c2ecf20Sopenharmony_ci		case VHT_2SSMCS0_2SSMCS9:
10098c2ecf20Sopenharmony_ci			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][5];
10108c2ecf20Sopenharmony_ci			break;
10118c2ecf20Sopenharmony_ci		default:
10128c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
10138c2ecf20Sopenharmony_ci				"Invalid RateSection %d in Band 2.4G, Rf Path %d, %dTx in PHY_GetTxPowerByRateBase()\n",
10148c2ecf20Sopenharmony_ci				rate_section, path, txnum);
10158c2ecf20Sopenharmony_ci			break;
10168c2ecf20Sopenharmony_ci		}
10178c2ecf20Sopenharmony_ci	} else if (band == BAND_ON_5G) {
10188c2ecf20Sopenharmony_ci		switch (rate_section) {
10198c2ecf20Sopenharmony_ci		case OFDM:
10208c2ecf20Sopenharmony_ci			value = rtlphy->txpwr_by_rate_base_5g[path][txnum][0];
10218c2ecf20Sopenharmony_ci			break;
10228c2ecf20Sopenharmony_ci		case HT_MCS0_MCS7:
10238c2ecf20Sopenharmony_ci			value = rtlphy->txpwr_by_rate_base_5g[path][txnum][1];
10248c2ecf20Sopenharmony_ci			break;
10258c2ecf20Sopenharmony_ci		case HT_MCS8_MCS15:
10268c2ecf20Sopenharmony_ci			value = rtlphy->txpwr_by_rate_base_5g[path][txnum][2];
10278c2ecf20Sopenharmony_ci			break;
10288c2ecf20Sopenharmony_ci		case VHT_1SSMCS0_1SSMCS9:
10298c2ecf20Sopenharmony_ci			value = rtlphy->txpwr_by_rate_base_5g[path][txnum][3];
10308c2ecf20Sopenharmony_ci			break;
10318c2ecf20Sopenharmony_ci		case VHT_2SSMCS0_2SSMCS9:
10328c2ecf20Sopenharmony_ci			value = rtlphy->txpwr_by_rate_base_5g[path][txnum][4];
10338c2ecf20Sopenharmony_ci			break;
10348c2ecf20Sopenharmony_ci		default:
10358c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
10368c2ecf20Sopenharmony_ci				"Invalid RateSection %d in Band 5G, Rf Path %d, %dTx in PHY_GetTxPowerByRateBase()\n",
10378c2ecf20Sopenharmony_ci				rate_section, path, txnum);
10388c2ecf20Sopenharmony_ci			break;
10398c2ecf20Sopenharmony_ci		}
10408c2ecf20Sopenharmony_ci	} else {
10418c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
10428c2ecf20Sopenharmony_ci			"Invalid Band %d in PHY_GetTxPowerByRateBase()\n", band);
10438c2ecf20Sopenharmony_ci	}
10448c2ecf20Sopenharmony_ci
10458c2ecf20Sopenharmony_ci	return value;
10468c2ecf20Sopenharmony_ci}
10478c2ecf20Sopenharmony_ci
10488c2ecf20Sopenharmony_cistatic void _rtl8821ae_phy_store_txpower_by_rate_base(struct ieee80211_hw *hw)
10498c2ecf20Sopenharmony_ci{
10508c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
10518c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
10528c2ecf20Sopenharmony_ci	u16 rawvalue = 0;
10538c2ecf20Sopenharmony_ci	u8 base = 0, path = 0;
10548c2ecf20Sopenharmony_ci
10558c2ecf20Sopenharmony_ci	for (path = RF90_PATH_A; path <= RF90_PATH_B; ++path) {
10568c2ecf20Sopenharmony_ci		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][0] >> 24) & 0xFF;
10578c2ecf20Sopenharmony_ci		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
10588c2ecf20Sopenharmony_ci		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, CCK, RF_1TX, base);
10598c2ecf20Sopenharmony_ci
10608c2ecf20Sopenharmony_ci		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][2] >> 24) & 0xFF;
10618c2ecf20Sopenharmony_ci		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
10628c2ecf20Sopenharmony_ci		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, OFDM, RF_1TX, base);
10638c2ecf20Sopenharmony_ci
10648c2ecf20Sopenharmony_ci		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][4] >> 24) & 0xFF;
10658c2ecf20Sopenharmony_ci		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
10668c2ecf20Sopenharmony_ci		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, HT_MCS0_MCS7, RF_1TX, base);
10678c2ecf20Sopenharmony_ci
10688c2ecf20Sopenharmony_ci		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_2TX][6] >> 24) & 0xFF;
10698c2ecf20Sopenharmony_ci		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
10708c2ecf20Sopenharmony_ci		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, HT_MCS8_MCS15, RF_2TX, base);
10718c2ecf20Sopenharmony_ci
10728c2ecf20Sopenharmony_ci		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][8] >> 24) & 0xFF;
10738c2ecf20Sopenharmony_ci		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
10748c2ecf20Sopenharmony_ci		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, VHT_1SSMCS0_1SSMCS9, RF_1TX, base);
10758c2ecf20Sopenharmony_ci
10768c2ecf20Sopenharmony_ci		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_2TX][11] >> 8) & 0xFF;
10778c2ecf20Sopenharmony_ci		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
10788c2ecf20Sopenharmony_ci		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, VHT_2SSMCS0_2SSMCS9, RF_2TX, base);
10798c2ecf20Sopenharmony_ci
10808c2ecf20Sopenharmony_ci		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_1TX][2] >> 24) & 0xFF;
10818c2ecf20Sopenharmony_ci		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
10828c2ecf20Sopenharmony_ci		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, OFDM, RF_1TX, base);
10838c2ecf20Sopenharmony_ci
10848c2ecf20Sopenharmony_ci		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_1TX][4] >> 24) & 0xFF;
10858c2ecf20Sopenharmony_ci		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
10868c2ecf20Sopenharmony_ci		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, HT_MCS0_MCS7, RF_1TX, base);
10878c2ecf20Sopenharmony_ci
10888c2ecf20Sopenharmony_ci		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_2TX][6] >> 24) & 0xFF;
10898c2ecf20Sopenharmony_ci		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
10908c2ecf20Sopenharmony_ci		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, HT_MCS8_MCS15, RF_2TX, base);
10918c2ecf20Sopenharmony_ci
10928c2ecf20Sopenharmony_ci		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_1TX][8] >> 24) & 0xFF;
10938c2ecf20Sopenharmony_ci		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
10948c2ecf20Sopenharmony_ci		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, VHT_1SSMCS0_1SSMCS9, RF_1TX, base);
10958c2ecf20Sopenharmony_ci
10968c2ecf20Sopenharmony_ci		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_2TX][11] >> 8) & 0xFF;
10978c2ecf20Sopenharmony_ci		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
10988c2ecf20Sopenharmony_ci		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, VHT_2SSMCS0_2SSMCS9, RF_2TX, base);
10998c2ecf20Sopenharmony_ci	}
11008c2ecf20Sopenharmony_ci}
11018c2ecf20Sopenharmony_ci
11028c2ecf20Sopenharmony_cistatic void _phy_convert_txpower_dbm_to_relative_value(u32 *data, u8 start,
11038c2ecf20Sopenharmony_ci						u8 end, u8 base_val)
11048c2ecf20Sopenharmony_ci{
11058c2ecf20Sopenharmony_ci	int i;
11068c2ecf20Sopenharmony_ci	u8 temp_value = 0;
11078c2ecf20Sopenharmony_ci	u32 temp_data = 0;
11088c2ecf20Sopenharmony_ci
11098c2ecf20Sopenharmony_ci	for (i = 3; i >= 0; --i) {
11108c2ecf20Sopenharmony_ci		if (i >= start && i <= end) {
11118c2ecf20Sopenharmony_ci			/* Get the exact value */
11128c2ecf20Sopenharmony_ci			temp_value = (u8)(*data >> (i * 8)) & 0xF;
11138c2ecf20Sopenharmony_ci			temp_value += ((u8)((*data >> (i * 8 + 4)) & 0xF)) * 10;
11148c2ecf20Sopenharmony_ci
11158c2ecf20Sopenharmony_ci			/* Change the value to a relative value */
11168c2ecf20Sopenharmony_ci			temp_value = (temp_value > base_val) ? temp_value -
11178c2ecf20Sopenharmony_ci					base_val : base_val - temp_value;
11188c2ecf20Sopenharmony_ci		} else {
11198c2ecf20Sopenharmony_ci			temp_value = (u8)(*data >> (i * 8)) & 0xFF;
11208c2ecf20Sopenharmony_ci		}
11218c2ecf20Sopenharmony_ci		temp_data <<= 8;
11228c2ecf20Sopenharmony_ci		temp_data |= temp_value;
11238c2ecf20Sopenharmony_ci	}
11248c2ecf20Sopenharmony_ci	*data = temp_data;
11258c2ecf20Sopenharmony_ci}
11268c2ecf20Sopenharmony_ci
11278c2ecf20Sopenharmony_cistatic void _rtl8812ae_phy_cross_reference_ht_and_vht_txpower_limit(struct ieee80211_hw *hw)
11288c2ecf20Sopenharmony_ci{
11298c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
11308c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
11318c2ecf20Sopenharmony_ci	u8 regulation, bw, channel, rate_section;
11328c2ecf20Sopenharmony_ci	s8 temp_pwrlmt = 0;
11338c2ecf20Sopenharmony_ci
11348c2ecf20Sopenharmony_ci	for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {
11358c2ecf20Sopenharmony_ci		for (bw = 0; bw < MAX_5G_BANDWIDTH_NUM; ++bw) {
11368c2ecf20Sopenharmony_ci			for (channel = 0; channel < CHANNEL_MAX_NUMBER_5G; ++channel) {
11378c2ecf20Sopenharmony_ci				for (rate_section = 0; rate_section < MAX_RATE_SECTION_NUM; ++rate_section) {
11388c2ecf20Sopenharmony_ci					temp_pwrlmt = rtlphy->txpwr_limit_5g[regulation]
11398c2ecf20Sopenharmony_ci						[bw][rate_section][channel][RF90_PATH_A];
11408c2ecf20Sopenharmony_ci					if (temp_pwrlmt == MAX_POWER_INDEX) {
11418c2ecf20Sopenharmony_ci						if (bw == 0 || bw == 1) { /*5G 20M 40M VHT and HT can cross reference*/
11428c2ecf20Sopenharmony_ci							rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
11438c2ecf20Sopenharmony_ci								"No power limit table of the specified band %d, bandwidth %d, ratesection %d, channel %d, rf path %d\n",
11448c2ecf20Sopenharmony_ci								1, bw, rate_section, channel, RF90_PATH_A);
11458c2ecf20Sopenharmony_ci							if (rate_section == 2) {
11468c2ecf20Sopenharmony_ci								rtlphy->txpwr_limit_5g[regulation][bw][2][channel][RF90_PATH_A] =
11478c2ecf20Sopenharmony_ci									rtlphy->txpwr_limit_5g[regulation][bw][4][channel][RF90_PATH_A];
11488c2ecf20Sopenharmony_ci							} else if (rate_section == 4) {
11498c2ecf20Sopenharmony_ci								rtlphy->txpwr_limit_5g[regulation][bw][4][channel][RF90_PATH_A] =
11508c2ecf20Sopenharmony_ci									rtlphy->txpwr_limit_5g[regulation][bw][2][channel][RF90_PATH_A];
11518c2ecf20Sopenharmony_ci							} else if (rate_section == 3) {
11528c2ecf20Sopenharmony_ci								rtlphy->txpwr_limit_5g[regulation][bw][3][channel][RF90_PATH_A] =
11538c2ecf20Sopenharmony_ci									rtlphy->txpwr_limit_5g[regulation][bw][5][channel][RF90_PATH_A];
11548c2ecf20Sopenharmony_ci							} else if (rate_section == 5) {
11558c2ecf20Sopenharmony_ci								rtlphy->txpwr_limit_5g[regulation][bw][5][channel][RF90_PATH_A] =
11568c2ecf20Sopenharmony_ci									rtlphy->txpwr_limit_5g[regulation][bw][3][channel][RF90_PATH_A];
11578c2ecf20Sopenharmony_ci							}
11588c2ecf20Sopenharmony_ci
11598c2ecf20Sopenharmony_ci							rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
11608c2ecf20Sopenharmony_ci								"use other value %d\n",
11618c2ecf20Sopenharmony_ci								temp_pwrlmt);
11628c2ecf20Sopenharmony_ci						}
11638c2ecf20Sopenharmony_ci					}
11648c2ecf20Sopenharmony_ci				}
11658c2ecf20Sopenharmony_ci			}
11668c2ecf20Sopenharmony_ci		}
11678c2ecf20Sopenharmony_ci	}
11688c2ecf20Sopenharmony_ci}
11698c2ecf20Sopenharmony_ci
11708c2ecf20Sopenharmony_cistatic u8 _rtl8812ae_phy_get_txpower_by_rate_base_index(struct ieee80211_hw *hw,
11718c2ecf20Sopenharmony_ci						   enum band_type band, u8 rate)
11728c2ecf20Sopenharmony_ci{
11738c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
11748c2ecf20Sopenharmony_ci	u8 index = 0;
11758c2ecf20Sopenharmony_ci	if (band == BAND_ON_2_4G) {
11768c2ecf20Sopenharmony_ci		switch (rate) {
11778c2ecf20Sopenharmony_ci		case MGN_1M:
11788c2ecf20Sopenharmony_ci		case MGN_2M:
11798c2ecf20Sopenharmony_ci		case MGN_5_5M:
11808c2ecf20Sopenharmony_ci		case MGN_11M:
11818c2ecf20Sopenharmony_ci			index = 0;
11828c2ecf20Sopenharmony_ci			break;
11838c2ecf20Sopenharmony_ci
11848c2ecf20Sopenharmony_ci		case MGN_6M:
11858c2ecf20Sopenharmony_ci		case MGN_9M:
11868c2ecf20Sopenharmony_ci		case MGN_12M:
11878c2ecf20Sopenharmony_ci		case MGN_18M:
11888c2ecf20Sopenharmony_ci		case MGN_24M:
11898c2ecf20Sopenharmony_ci		case MGN_36M:
11908c2ecf20Sopenharmony_ci		case MGN_48M:
11918c2ecf20Sopenharmony_ci		case MGN_54M:
11928c2ecf20Sopenharmony_ci			index = 1;
11938c2ecf20Sopenharmony_ci			break;
11948c2ecf20Sopenharmony_ci
11958c2ecf20Sopenharmony_ci		case MGN_MCS0:
11968c2ecf20Sopenharmony_ci		case MGN_MCS1:
11978c2ecf20Sopenharmony_ci		case MGN_MCS2:
11988c2ecf20Sopenharmony_ci		case MGN_MCS3:
11998c2ecf20Sopenharmony_ci		case MGN_MCS4:
12008c2ecf20Sopenharmony_ci		case MGN_MCS5:
12018c2ecf20Sopenharmony_ci		case MGN_MCS6:
12028c2ecf20Sopenharmony_ci		case MGN_MCS7:
12038c2ecf20Sopenharmony_ci			index = 2;
12048c2ecf20Sopenharmony_ci			break;
12058c2ecf20Sopenharmony_ci
12068c2ecf20Sopenharmony_ci		case MGN_MCS8:
12078c2ecf20Sopenharmony_ci		case MGN_MCS9:
12088c2ecf20Sopenharmony_ci		case MGN_MCS10:
12098c2ecf20Sopenharmony_ci		case MGN_MCS11:
12108c2ecf20Sopenharmony_ci		case MGN_MCS12:
12118c2ecf20Sopenharmony_ci		case MGN_MCS13:
12128c2ecf20Sopenharmony_ci		case MGN_MCS14:
12138c2ecf20Sopenharmony_ci		case MGN_MCS15:
12148c2ecf20Sopenharmony_ci			index = 3;
12158c2ecf20Sopenharmony_ci			break;
12168c2ecf20Sopenharmony_ci
12178c2ecf20Sopenharmony_ci		default:
12188c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
12198c2ecf20Sopenharmony_ci				"Wrong rate 0x%x to obtain index in 2.4G in PHY_GetTxPowerByRateBaseIndex()\n",
12208c2ecf20Sopenharmony_ci				rate);
12218c2ecf20Sopenharmony_ci			break;
12228c2ecf20Sopenharmony_ci		}
12238c2ecf20Sopenharmony_ci	} else if (band == BAND_ON_5G) {
12248c2ecf20Sopenharmony_ci		switch (rate) {
12258c2ecf20Sopenharmony_ci		case MGN_6M:
12268c2ecf20Sopenharmony_ci		case MGN_9M:
12278c2ecf20Sopenharmony_ci		case MGN_12M:
12288c2ecf20Sopenharmony_ci		case MGN_18M:
12298c2ecf20Sopenharmony_ci		case MGN_24M:
12308c2ecf20Sopenharmony_ci		case MGN_36M:
12318c2ecf20Sopenharmony_ci		case MGN_48M:
12328c2ecf20Sopenharmony_ci		case MGN_54M:
12338c2ecf20Sopenharmony_ci			index = 0;
12348c2ecf20Sopenharmony_ci			break;
12358c2ecf20Sopenharmony_ci
12368c2ecf20Sopenharmony_ci		case MGN_MCS0:
12378c2ecf20Sopenharmony_ci		case MGN_MCS1:
12388c2ecf20Sopenharmony_ci		case MGN_MCS2:
12398c2ecf20Sopenharmony_ci		case MGN_MCS3:
12408c2ecf20Sopenharmony_ci		case MGN_MCS4:
12418c2ecf20Sopenharmony_ci		case MGN_MCS5:
12428c2ecf20Sopenharmony_ci		case MGN_MCS6:
12438c2ecf20Sopenharmony_ci		case MGN_MCS7:
12448c2ecf20Sopenharmony_ci			index = 1;
12458c2ecf20Sopenharmony_ci			break;
12468c2ecf20Sopenharmony_ci
12478c2ecf20Sopenharmony_ci		case MGN_MCS8:
12488c2ecf20Sopenharmony_ci		case MGN_MCS9:
12498c2ecf20Sopenharmony_ci		case MGN_MCS10:
12508c2ecf20Sopenharmony_ci		case MGN_MCS11:
12518c2ecf20Sopenharmony_ci		case MGN_MCS12:
12528c2ecf20Sopenharmony_ci		case MGN_MCS13:
12538c2ecf20Sopenharmony_ci		case MGN_MCS14:
12548c2ecf20Sopenharmony_ci		case MGN_MCS15:
12558c2ecf20Sopenharmony_ci			index = 2;
12568c2ecf20Sopenharmony_ci			break;
12578c2ecf20Sopenharmony_ci
12588c2ecf20Sopenharmony_ci		case MGN_VHT1SS_MCS0:
12598c2ecf20Sopenharmony_ci		case MGN_VHT1SS_MCS1:
12608c2ecf20Sopenharmony_ci		case MGN_VHT1SS_MCS2:
12618c2ecf20Sopenharmony_ci		case MGN_VHT1SS_MCS3:
12628c2ecf20Sopenharmony_ci		case MGN_VHT1SS_MCS4:
12638c2ecf20Sopenharmony_ci		case MGN_VHT1SS_MCS5:
12648c2ecf20Sopenharmony_ci		case MGN_VHT1SS_MCS6:
12658c2ecf20Sopenharmony_ci		case MGN_VHT1SS_MCS7:
12668c2ecf20Sopenharmony_ci		case MGN_VHT1SS_MCS8:
12678c2ecf20Sopenharmony_ci		case MGN_VHT1SS_MCS9:
12688c2ecf20Sopenharmony_ci			index = 3;
12698c2ecf20Sopenharmony_ci			break;
12708c2ecf20Sopenharmony_ci
12718c2ecf20Sopenharmony_ci		case MGN_VHT2SS_MCS0:
12728c2ecf20Sopenharmony_ci		case MGN_VHT2SS_MCS1:
12738c2ecf20Sopenharmony_ci		case MGN_VHT2SS_MCS2:
12748c2ecf20Sopenharmony_ci		case MGN_VHT2SS_MCS3:
12758c2ecf20Sopenharmony_ci		case MGN_VHT2SS_MCS4:
12768c2ecf20Sopenharmony_ci		case MGN_VHT2SS_MCS5:
12778c2ecf20Sopenharmony_ci		case MGN_VHT2SS_MCS6:
12788c2ecf20Sopenharmony_ci		case MGN_VHT2SS_MCS7:
12798c2ecf20Sopenharmony_ci		case MGN_VHT2SS_MCS8:
12808c2ecf20Sopenharmony_ci		case MGN_VHT2SS_MCS9:
12818c2ecf20Sopenharmony_ci			index = 4;
12828c2ecf20Sopenharmony_ci			break;
12838c2ecf20Sopenharmony_ci
12848c2ecf20Sopenharmony_ci		default:
12858c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
12868c2ecf20Sopenharmony_ci				"Wrong rate 0x%x to obtain index in 5G in PHY_GetTxPowerByRateBaseIndex()\n",
12878c2ecf20Sopenharmony_ci				rate);
12888c2ecf20Sopenharmony_ci			break;
12898c2ecf20Sopenharmony_ci		}
12908c2ecf20Sopenharmony_ci	}
12918c2ecf20Sopenharmony_ci
12928c2ecf20Sopenharmony_ci	return index;
12938c2ecf20Sopenharmony_ci}
12948c2ecf20Sopenharmony_ci
12958c2ecf20Sopenharmony_cistatic void _rtl8812ae_phy_convert_txpower_limit_to_power_index(struct ieee80211_hw *hw)
12968c2ecf20Sopenharmony_ci{
12978c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
12988c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
12998c2ecf20Sopenharmony_ci	u8 bw40_pwr_base_dbm2_4G, bw40_pwr_base_dbm5G;
13008c2ecf20Sopenharmony_ci	u8 regulation, bw, channel, rate_section;
13018c2ecf20Sopenharmony_ci	u8 base_index2_4G = 0;
13028c2ecf20Sopenharmony_ci	u8 base_index5G = 0;
13038c2ecf20Sopenharmony_ci	s8 temp_value = 0, temp_pwrlmt = 0;
13048c2ecf20Sopenharmony_ci	u8 rf_path = 0;
13058c2ecf20Sopenharmony_ci
13068c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
13078c2ecf20Sopenharmony_ci		"=====> _rtl8812ae_phy_convert_txpower_limit_to_power_index()\n");
13088c2ecf20Sopenharmony_ci
13098c2ecf20Sopenharmony_ci	_rtl8812ae_phy_cross_reference_ht_and_vht_txpower_limit(hw);
13108c2ecf20Sopenharmony_ci
13118c2ecf20Sopenharmony_ci	for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {
13128c2ecf20Sopenharmony_ci		for (bw = 0; bw < MAX_2_4G_BANDWIDTH_NUM; ++bw) {
13138c2ecf20Sopenharmony_ci			for (channel = 0; channel < CHANNEL_MAX_NUMBER_2G; ++channel) {
13148c2ecf20Sopenharmony_ci				for (rate_section = 0; rate_section < MAX_RATE_SECTION_NUM; ++rate_section) {
13158c2ecf20Sopenharmony_ci					/* obtain the base dBm values in 2.4G band
13168c2ecf20Sopenharmony_ci					 CCK => 11M, OFDM => 54M, HT 1T => MCS7, HT 2T => MCS15*/
13178c2ecf20Sopenharmony_ci					if (rate_section == 0) { /*CCK*/
13188c2ecf20Sopenharmony_ci						base_index2_4G =
13198c2ecf20Sopenharmony_ci							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
13208c2ecf20Sopenharmony_ci							BAND_ON_2_4G, MGN_11M);
13218c2ecf20Sopenharmony_ci					} else if (rate_section == 1) { /*OFDM*/
13228c2ecf20Sopenharmony_ci						base_index2_4G =
13238c2ecf20Sopenharmony_ci							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
13248c2ecf20Sopenharmony_ci							BAND_ON_2_4G, MGN_54M);
13258c2ecf20Sopenharmony_ci					} else if (rate_section == 2) { /*HT IT*/
13268c2ecf20Sopenharmony_ci						base_index2_4G =
13278c2ecf20Sopenharmony_ci							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
13288c2ecf20Sopenharmony_ci							BAND_ON_2_4G, MGN_MCS7);
13298c2ecf20Sopenharmony_ci					} else if (rate_section == 3) { /*HT 2T*/
13308c2ecf20Sopenharmony_ci						base_index2_4G =
13318c2ecf20Sopenharmony_ci							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
13328c2ecf20Sopenharmony_ci							BAND_ON_2_4G, MGN_MCS15);
13338c2ecf20Sopenharmony_ci					}
13348c2ecf20Sopenharmony_ci
13358c2ecf20Sopenharmony_ci					temp_pwrlmt = rtlphy->txpwr_limit_2_4g[regulation]
13368c2ecf20Sopenharmony_ci						[bw][rate_section][channel][RF90_PATH_A];
13378c2ecf20Sopenharmony_ci
13388c2ecf20Sopenharmony_ci					for (rf_path = RF90_PATH_A;
13398c2ecf20Sopenharmony_ci						rf_path < MAX_RF_PATH_NUM;
13408c2ecf20Sopenharmony_ci						++rf_path) {
13418c2ecf20Sopenharmony_ci						if (rate_section == 3)
13428c2ecf20Sopenharmony_ci							bw40_pwr_base_dbm2_4G =
13438c2ecf20Sopenharmony_ci							rtlphy->txpwr_by_rate_base_24g[rf_path][RF_2TX][base_index2_4G];
13448c2ecf20Sopenharmony_ci						else
13458c2ecf20Sopenharmony_ci							bw40_pwr_base_dbm2_4G =
13468c2ecf20Sopenharmony_ci							rtlphy->txpwr_by_rate_base_24g[rf_path][RF_1TX][base_index2_4G];
13478c2ecf20Sopenharmony_ci
13488c2ecf20Sopenharmony_ci						if (temp_pwrlmt != MAX_POWER_INDEX) {
13498c2ecf20Sopenharmony_ci							temp_value = temp_pwrlmt - bw40_pwr_base_dbm2_4G;
13508c2ecf20Sopenharmony_ci							rtlphy->txpwr_limit_2_4g[regulation]
13518c2ecf20Sopenharmony_ci								[bw][rate_section][channel][rf_path] =
13528c2ecf20Sopenharmony_ci								temp_value;
13538c2ecf20Sopenharmony_ci						}
13548c2ecf20Sopenharmony_ci
13558c2ecf20Sopenharmony_ci						rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
13568c2ecf20Sopenharmony_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",
13578c2ecf20Sopenharmony_ci							regulation, bw, rate_section, channel,
13588c2ecf20Sopenharmony_ci							rtlphy->txpwr_limit_2_4g[regulation][bw]
13598c2ecf20Sopenharmony_ci							[rate_section][channel][rf_path], (temp_pwrlmt == 63)
13608c2ecf20Sopenharmony_ci							? 0 : temp_pwrlmt/2, channel, rf_path,
13618c2ecf20Sopenharmony_ci							bw40_pwr_base_dbm2_4G);
13628c2ecf20Sopenharmony_ci					}
13638c2ecf20Sopenharmony_ci				}
13648c2ecf20Sopenharmony_ci			}
13658c2ecf20Sopenharmony_ci		}
13668c2ecf20Sopenharmony_ci	}
13678c2ecf20Sopenharmony_ci	for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {
13688c2ecf20Sopenharmony_ci		for (bw = 0; bw < MAX_5G_BANDWIDTH_NUM; ++bw) {
13698c2ecf20Sopenharmony_ci			for (channel = 0; channel < CHANNEL_MAX_NUMBER_5G; ++channel) {
13708c2ecf20Sopenharmony_ci				for (rate_section = 0; rate_section < MAX_RATE_SECTION_NUM; ++rate_section) {
13718c2ecf20Sopenharmony_ci					/* obtain the base dBm values in 5G band
13728c2ecf20Sopenharmony_ci					 OFDM => 54M, HT 1T => MCS7, HT 2T => MCS15,
13738c2ecf20Sopenharmony_ci					VHT => 1SSMCS7, VHT 2T => 2SSMCS7*/
13748c2ecf20Sopenharmony_ci					if (rate_section == 1) { /*OFDM*/
13758c2ecf20Sopenharmony_ci						base_index5G =
13768c2ecf20Sopenharmony_ci							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
13778c2ecf20Sopenharmony_ci							BAND_ON_5G, MGN_54M);
13788c2ecf20Sopenharmony_ci					} else if (rate_section == 2) { /*HT 1T*/
13798c2ecf20Sopenharmony_ci						base_index5G =
13808c2ecf20Sopenharmony_ci							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
13818c2ecf20Sopenharmony_ci							BAND_ON_5G, MGN_MCS7);
13828c2ecf20Sopenharmony_ci					} else if (rate_section == 3) { /*HT 2T*/
13838c2ecf20Sopenharmony_ci						base_index5G =
13848c2ecf20Sopenharmony_ci							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
13858c2ecf20Sopenharmony_ci							BAND_ON_5G, MGN_MCS15);
13868c2ecf20Sopenharmony_ci					} else if (rate_section == 4) { /*VHT 1T*/
13878c2ecf20Sopenharmony_ci						base_index5G =
13888c2ecf20Sopenharmony_ci							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
13898c2ecf20Sopenharmony_ci							BAND_ON_5G, MGN_VHT1SS_MCS7);
13908c2ecf20Sopenharmony_ci					} else if (rate_section == 5) { /*VHT 2T*/
13918c2ecf20Sopenharmony_ci						base_index5G =
13928c2ecf20Sopenharmony_ci							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
13938c2ecf20Sopenharmony_ci							BAND_ON_5G, MGN_VHT2SS_MCS7);
13948c2ecf20Sopenharmony_ci					}
13958c2ecf20Sopenharmony_ci
13968c2ecf20Sopenharmony_ci					temp_pwrlmt = rtlphy->txpwr_limit_5g[regulation]
13978c2ecf20Sopenharmony_ci						[bw][rate_section][channel]
13988c2ecf20Sopenharmony_ci						[RF90_PATH_A];
13998c2ecf20Sopenharmony_ci
14008c2ecf20Sopenharmony_ci					for (rf_path = RF90_PATH_A;
14018c2ecf20Sopenharmony_ci					     rf_path < MAX_RF_PATH_NUM;
14028c2ecf20Sopenharmony_ci					     ++rf_path) {
14038c2ecf20Sopenharmony_ci						if (rate_section == 3 || rate_section == 5)
14048c2ecf20Sopenharmony_ci							bw40_pwr_base_dbm5G =
14058c2ecf20Sopenharmony_ci							rtlphy->txpwr_by_rate_base_5g[rf_path]
14068c2ecf20Sopenharmony_ci							[RF_2TX][base_index5G];
14078c2ecf20Sopenharmony_ci						else
14088c2ecf20Sopenharmony_ci							bw40_pwr_base_dbm5G =
14098c2ecf20Sopenharmony_ci							rtlphy->txpwr_by_rate_base_5g[rf_path]
14108c2ecf20Sopenharmony_ci							[RF_1TX][base_index5G];
14118c2ecf20Sopenharmony_ci
14128c2ecf20Sopenharmony_ci						if (temp_pwrlmt != MAX_POWER_INDEX) {
14138c2ecf20Sopenharmony_ci							temp_value =
14148c2ecf20Sopenharmony_ci								temp_pwrlmt - bw40_pwr_base_dbm5G;
14158c2ecf20Sopenharmony_ci							rtlphy->txpwr_limit_5g[regulation]
14168c2ecf20Sopenharmony_ci								[bw][rate_section][channel]
14178c2ecf20Sopenharmony_ci								[rf_path] = temp_value;
14188c2ecf20Sopenharmony_ci						}
14198c2ecf20Sopenharmony_ci
14208c2ecf20Sopenharmony_ci						rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
14218c2ecf20Sopenharmony_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",
14228c2ecf20Sopenharmony_ci							regulation, bw, rate_section,
14238c2ecf20Sopenharmony_ci							channel, rtlphy->txpwr_limit_5g[regulation]
14248c2ecf20Sopenharmony_ci							[bw][rate_section][channel][rf_path],
14258c2ecf20Sopenharmony_ci							temp_pwrlmt, channel, rf_path, bw40_pwr_base_dbm5G);
14268c2ecf20Sopenharmony_ci					}
14278c2ecf20Sopenharmony_ci				}
14288c2ecf20Sopenharmony_ci			}
14298c2ecf20Sopenharmony_ci		}
14308c2ecf20Sopenharmony_ci	}
14318c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
14328c2ecf20Sopenharmony_ci		"<===== %s()\n", __func__);
14338c2ecf20Sopenharmony_ci}
14348c2ecf20Sopenharmony_ci
14358c2ecf20Sopenharmony_cistatic void _rtl8821ae_phy_init_txpower_limit(struct ieee80211_hw *hw)
14368c2ecf20Sopenharmony_ci{
14378c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
14388c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
14398c2ecf20Sopenharmony_ci	u8 i, j, k, l, m;
14408c2ecf20Sopenharmony_ci
14418c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
14428c2ecf20Sopenharmony_ci		"=====>`%s()!\n", __func__);
14438c2ecf20Sopenharmony_ci
14448c2ecf20Sopenharmony_ci	for (i = 0; i < MAX_REGULATION_NUM; ++i) {
14458c2ecf20Sopenharmony_ci		for (j = 0; j < MAX_2_4G_BANDWIDTH_NUM; ++j)
14468c2ecf20Sopenharmony_ci			for (k = 0; k < MAX_RATE_SECTION_NUM; ++k)
14478c2ecf20Sopenharmony_ci				for (m = 0; m < CHANNEL_MAX_NUMBER_2G; ++m)
14488c2ecf20Sopenharmony_ci					for (l = 0; l < MAX_RF_PATH_NUM; ++l)
14498c2ecf20Sopenharmony_ci						rtlphy->txpwr_limit_2_4g
14508c2ecf20Sopenharmony_ci								[i][j][k][m][l]
14518c2ecf20Sopenharmony_ci							= MAX_POWER_INDEX;
14528c2ecf20Sopenharmony_ci	}
14538c2ecf20Sopenharmony_ci	for (i = 0; i < MAX_REGULATION_NUM; ++i) {
14548c2ecf20Sopenharmony_ci		for (j = 0; j < MAX_5G_BANDWIDTH_NUM; ++j)
14558c2ecf20Sopenharmony_ci			for (k = 0; k < MAX_RATE_SECTION_NUM; ++k)
14568c2ecf20Sopenharmony_ci				for (m = 0; m < CHANNEL_MAX_NUMBER_5G; ++m)
14578c2ecf20Sopenharmony_ci					for (l = 0; l < MAX_RF_PATH_NUM; ++l)
14588c2ecf20Sopenharmony_ci						rtlphy->txpwr_limit_5g
14598c2ecf20Sopenharmony_ci								[i][j][k][m][l]
14608c2ecf20Sopenharmony_ci							= MAX_POWER_INDEX;
14618c2ecf20Sopenharmony_ci	}
14628c2ecf20Sopenharmony_ci
14638c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
14648c2ecf20Sopenharmony_ci		"<===== %s()!\n", __func__);
14658c2ecf20Sopenharmony_ci}
14668c2ecf20Sopenharmony_ci
14678c2ecf20Sopenharmony_cistatic void _rtl8821ae_phy_convert_txpower_dbm_to_relative_value(struct ieee80211_hw *hw)
14688c2ecf20Sopenharmony_ci{
14698c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
14708c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
14718c2ecf20Sopenharmony_ci	u8 base = 0, rfpath = 0;
14728c2ecf20Sopenharmony_ci
14738c2ecf20Sopenharmony_ci	for (rfpath = RF90_PATH_A; rfpath <= RF90_PATH_B; ++rfpath) {
14748c2ecf20Sopenharmony_ci		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath, RF_1TX, CCK);
14758c2ecf20Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
14768c2ecf20Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][0],
14778c2ecf20Sopenharmony_ci			0, 3, base);
14788c2ecf20Sopenharmony_ci
14798c2ecf20Sopenharmony_ci		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath, RF_1TX, OFDM);
14808c2ecf20Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
14818c2ecf20Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][1],
14828c2ecf20Sopenharmony_ci			0, 3, base);
14838c2ecf20Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
14848c2ecf20Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][2],
14858c2ecf20Sopenharmony_ci			0, 3, base);
14868c2ecf20Sopenharmony_ci
14878c2ecf20Sopenharmony_ci		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath, RF_1TX, HT_MCS0_MCS7);
14888c2ecf20Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
14898c2ecf20Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][3],
14908c2ecf20Sopenharmony_ci			0, 3, base);
14918c2ecf20Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
14928c2ecf20Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][4],
14938c2ecf20Sopenharmony_ci			0, 3, base);
14948c2ecf20Sopenharmony_ci
14958c2ecf20Sopenharmony_ci		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath, RF_2TX, HT_MCS8_MCS15);
14968c2ecf20Sopenharmony_ci
14978c2ecf20Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
14988c2ecf20Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_2TX][5],
14998c2ecf20Sopenharmony_ci			0, 3, base);
15008c2ecf20Sopenharmony_ci
15018c2ecf20Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
15028c2ecf20Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_2TX][6],
15038c2ecf20Sopenharmony_ci			0, 3, base);
15048c2ecf20Sopenharmony_ci
15058c2ecf20Sopenharmony_ci		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath, RF_1TX, VHT_1SSMCS0_1SSMCS9);
15068c2ecf20Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
15078c2ecf20Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][7],
15088c2ecf20Sopenharmony_ci			0, 3, base);
15098c2ecf20Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
15108c2ecf20Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][8],
15118c2ecf20Sopenharmony_ci			0, 3, base);
15128c2ecf20Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
15138c2ecf20Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][9],
15148c2ecf20Sopenharmony_ci			0, 1, base);
15158c2ecf20Sopenharmony_ci
15168c2ecf20Sopenharmony_ci		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath, RF_2TX, VHT_2SSMCS0_2SSMCS9);
15178c2ecf20Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
15188c2ecf20Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][9],
15198c2ecf20Sopenharmony_ci			2, 3, base);
15208c2ecf20Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
15218c2ecf20Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_2TX][10],
15228c2ecf20Sopenharmony_ci			0, 3, base);
15238c2ecf20Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
15248c2ecf20Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_2TX][11],
15258c2ecf20Sopenharmony_ci			0, 3, base);
15268c2ecf20Sopenharmony_ci
15278c2ecf20Sopenharmony_ci		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfpath, RF_1TX, OFDM);
15288c2ecf20Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
15298c2ecf20Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][1],
15308c2ecf20Sopenharmony_ci			0, 3, base);
15318c2ecf20Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
15328c2ecf20Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][2],
15338c2ecf20Sopenharmony_ci			0, 3, base);
15348c2ecf20Sopenharmony_ci
15358c2ecf20Sopenharmony_ci		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfpath, RF_1TX, HT_MCS0_MCS7);
15368c2ecf20Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
15378c2ecf20Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][3],
15388c2ecf20Sopenharmony_ci			0, 3, base);
15398c2ecf20Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
15408c2ecf20Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][4],
15418c2ecf20Sopenharmony_ci			0, 3, base);
15428c2ecf20Sopenharmony_ci
15438c2ecf20Sopenharmony_ci		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfpath, RF_2TX, HT_MCS8_MCS15);
15448c2ecf20Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
15458c2ecf20Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_2TX][5],
15468c2ecf20Sopenharmony_ci			0, 3, base);
15478c2ecf20Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
15488c2ecf20Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_2TX][6],
15498c2ecf20Sopenharmony_ci			0, 3, base);
15508c2ecf20Sopenharmony_ci
15518c2ecf20Sopenharmony_ci		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfpath, RF_1TX, VHT_1SSMCS0_1SSMCS9);
15528c2ecf20Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
15538c2ecf20Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][7],
15548c2ecf20Sopenharmony_ci			0, 3, base);
15558c2ecf20Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
15568c2ecf20Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][8],
15578c2ecf20Sopenharmony_ci			0, 3, base);
15588c2ecf20Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
15598c2ecf20Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][9],
15608c2ecf20Sopenharmony_ci			0, 1, base);
15618c2ecf20Sopenharmony_ci
15628c2ecf20Sopenharmony_ci		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfpath, RF_2TX, VHT_2SSMCS0_2SSMCS9);
15638c2ecf20Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
15648c2ecf20Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][9],
15658c2ecf20Sopenharmony_ci			2, 3, base);
15668c2ecf20Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
15678c2ecf20Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_2TX][10],
15688c2ecf20Sopenharmony_ci			0, 3, base);
15698c2ecf20Sopenharmony_ci		_phy_convert_txpower_dbm_to_relative_value(
15708c2ecf20Sopenharmony_ci			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_2TX][11],
15718c2ecf20Sopenharmony_ci			0, 3, base);
15728c2ecf20Sopenharmony_ci	}
15738c2ecf20Sopenharmony_ci
15748c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_POWER, DBG_TRACE,
15758c2ecf20Sopenharmony_ci		"<===_rtl8821ae_phy_convert_txpower_dbm_to_relative_value()\n");
15768c2ecf20Sopenharmony_ci}
15778c2ecf20Sopenharmony_ci
15788c2ecf20Sopenharmony_cistatic void _rtl8821ae_phy_txpower_by_rate_configuration(struct ieee80211_hw *hw)
15798c2ecf20Sopenharmony_ci{
15808c2ecf20Sopenharmony_ci	_rtl8821ae_phy_store_txpower_by_rate_base(hw);
15818c2ecf20Sopenharmony_ci	_rtl8821ae_phy_convert_txpower_dbm_to_relative_value(hw);
15828c2ecf20Sopenharmony_ci}
15838c2ecf20Sopenharmony_ci
15848c2ecf20Sopenharmony_ci/* string is in decimal */
15858c2ecf20Sopenharmony_cistatic bool _rtl8812ae_get_integer_from_string(const char *str, u8 *pint)
15868c2ecf20Sopenharmony_ci{
15878c2ecf20Sopenharmony_ci	u16 i = 0;
15888c2ecf20Sopenharmony_ci	*pint = 0;
15898c2ecf20Sopenharmony_ci
15908c2ecf20Sopenharmony_ci	while (str[i] != '\0') {
15918c2ecf20Sopenharmony_ci		if (str[i] >= '0' && str[i] <= '9') {
15928c2ecf20Sopenharmony_ci			*pint *= 10;
15938c2ecf20Sopenharmony_ci			*pint += (str[i] - '0');
15948c2ecf20Sopenharmony_ci		} else {
15958c2ecf20Sopenharmony_ci			return false;
15968c2ecf20Sopenharmony_ci		}
15978c2ecf20Sopenharmony_ci		++i;
15988c2ecf20Sopenharmony_ci	}
15998c2ecf20Sopenharmony_ci
16008c2ecf20Sopenharmony_ci	return true;
16018c2ecf20Sopenharmony_ci}
16028c2ecf20Sopenharmony_ci
16038c2ecf20Sopenharmony_cistatic s8 _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(struct ieee80211_hw *hw,
16048c2ecf20Sopenharmony_ci					      u8 band, u8 channel)
16058c2ecf20Sopenharmony_ci{
16068c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
16078c2ecf20Sopenharmony_ci	s8 channel_index = -1;
16088c2ecf20Sopenharmony_ci	u8  i = 0;
16098c2ecf20Sopenharmony_ci
16108c2ecf20Sopenharmony_ci	if (band == BAND_ON_2_4G)
16118c2ecf20Sopenharmony_ci		channel_index = channel - 1;
16128c2ecf20Sopenharmony_ci	else if (band == BAND_ON_5G) {
16138c2ecf20Sopenharmony_ci		for (i = 0; i < sizeof(channel5g)/sizeof(u8); ++i) {
16148c2ecf20Sopenharmony_ci			if (channel5g[i] == channel)
16158c2ecf20Sopenharmony_ci				channel_index = i;
16168c2ecf20Sopenharmony_ci		}
16178c2ecf20Sopenharmony_ci	} else
16188c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, "Invalid Band %d in %s\n",
16198c2ecf20Sopenharmony_ci			band,  __func__);
16208c2ecf20Sopenharmony_ci
16218c2ecf20Sopenharmony_ci	if (channel_index == -1)
16228c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
16238c2ecf20Sopenharmony_ci			"Invalid Channel %d of Band %d in %s\n", channel,
16248c2ecf20Sopenharmony_ci			band, __func__);
16258c2ecf20Sopenharmony_ci
16268c2ecf20Sopenharmony_ci	return channel_index;
16278c2ecf20Sopenharmony_ci}
16288c2ecf20Sopenharmony_ci
16298c2ecf20Sopenharmony_cistatic void _rtl8812ae_phy_set_txpower_limit(struct ieee80211_hw *hw,
16308c2ecf20Sopenharmony_ci				      const char *pregulation,
16318c2ecf20Sopenharmony_ci				      const char *pband, const char *pbandwidth,
16328c2ecf20Sopenharmony_ci				      const char *prate_section, const char *prf_path,
16338c2ecf20Sopenharmony_ci				      const char *pchannel, const char *ppower_limit)
16348c2ecf20Sopenharmony_ci{
16358c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
16368c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
16378c2ecf20Sopenharmony_ci	u8 regulation = 0, bandwidth = 0, rate_section = 0, channel;
16388c2ecf20Sopenharmony_ci	u8 channel_index;
16398c2ecf20Sopenharmony_ci	s8 power_limit = 0, prev_power_limit, ret;
16408c2ecf20Sopenharmony_ci
16418c2ecf20Sopenharmony_ci	if (!_rtl8812ae_get_integer_from_string(pchannel, &channel) ||
16428c2ecf20Sopenharmony_ci	    !_rtl8812ae_get_integer_from_string(ppower_limit,
16438c2ecf20Sopenharmony_ci						&power_limit)) {
16448c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
16458c2ecf20Sopenharmony_ci			"Illegal index of pwr_lmt table [chnl %d][val %d]\n",
16468c2ecf20Sopenharmony_ci			channel, power_limit);
16478c2ecf20Sopenharmony_ci	}
16488c2ecf20Sopenharmony_ci
16498c2ecf20Sopenharmony_ci	power_limit = power_limit > MAX_POWER_INDEX ?
16508c2ecf20Sopenharmony_ci		      MAX_POWER_INDEX : power_limit;
16518c2ecf20Sopenharmony_ci
16528c2ecf20Sopenharmony_ci	if (strcmp(pregulation, "FCC") == 0)
16538c2ecf20Sopenharmony_ci		regulation = 0;
16548c2ecf20Sopenharmony_ci	else if (strcmp(pregulation, "MKK") == 0)
16558c2ecf20Sopenharmony_ci		regulation = 1;
16568c2ecf20Sopenharmony_ci	else if (strcmp(pregulation, "ETSI") == 0)
16578c2ecf20Sopenharmony_ci		regulation = 2;
16588c2ecf20Sopenharmony_ci	else if (strcmp(pregulation, "WW13") == 0)
16598c2ecf20Sopenharmony_ci		regulation = 3;
16608c2ecf20Sopenharmony_ci
16618c2ecf20Sopenharmony_ci	if (strcmp(prate_section, "CCK") == 0)
16628c2ecf20Sopenharmony_ci		rate_section = 0;
16638c2ecf20Sopenharmony_ci	else if (strcmp(prate_section, "OFDM") == 0)
16648c2ecf20Sopenharmony_ci		rate_section = 1;
16658c2ecf20Sopenharmony_ci	else if (strcmp(prate_section, "HT") == 0 &&
16668c2ecf20Sopenharmony_ci		 strcmp(prf_path, "1T") == 0)
16678c2ecf20Sopenharmony_ci		rate_section = 2;
16688c2ecf20Sopenharmony_ci	else if (strcmp(prate_section, "HT") == 0 &&
16698c2ecf20Sopenharmony_ci		 strcmp(prf_path, "2T") == 0)
16708c2ecf20Sopenharmony_ci		rate_section = 3;
16718c2ecf20Sopenharmony_ci	else if (strcmp(prate_section, "VHT") == 0 &&
16728c2ecf20Sopenharmony_ci		 strcmp(prf_path, "1T") == 0)
16738c2ecf20Sopenharmony_ci		rate_section = 4;
16748c2ecf20Sopenharmony_ci	else if (strcmp(prate_section, "VHT") == 0 &&
16758c2ecf20Sopenharmony_ci		 strcmp(prf_path, "2T") == 0)
16768c2ecf20Sopenharmony_ci		rate_section = 5;
16778c2ecf20Sopenharmony_ci
16788c2ecf20Sopenharmony_ci	if (strcmp(pbandwidth, "20M") == 0)
16798c2ecf20Sopenharmony_ci		bandwidth = 0;
16808c2ecf20Sopenharmony_ci	else if (strcmp(pbandwidth, "40M") == 0)
16818c2ecf20Sopenharmony_ci		bandwidth = 1;
16828c2ecf20Sopenharmony_ci	else if (strcmp(pbandwidth, "80M") == 0)
16838c2ecf20Sopenharmony_ci		bandwidth = 2;
16848c2ecf20Sopenharmony_ci	else if (strcmp(pbandwidth, "160M") == 0)
16858c2ecf20Sopenharmony_ci		bandwidth = 3;
16868c2ecf20Sopenharmony_ci
16878c2ecf20Sopenharmony_ci	if (strcmp(pband, "2.4G") == 0) {
16888c2ecf20Sopenharmony_ci		ret = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw,
16898c2ecf20Sopenharmony_ci							       BAND_ON_2_4G,
16908c2ecf20Sopenharmony_ci							       channel);
16918c2ecf20Sopenharmony_ci
16928c2ecf20Sopenharmony_ci		if (ret == -1)
16938c2ecf20Sopenharmony_ci			return;
16948c2ecf20Sopenharmony_ci
16958c2ecf20Sopenharmony_ci		channel_index = ret;
16968c2ecf20Sopenharmony_ci
16978c2ecf20Sopenharmony_ci		prev_power_limit = rtlphy->txpwr_limit_2_4g[regulation]
16988c2ecf20Sopenharmony_ci						[bandwidth][rate_section]
16998c2ecf20Sopenharmony_ci						[channel_index][RF90_PATH_A];
17008c2ecf20Sopenharmony_ci
17018c2ecf20Sopenharmony_ci		if (power_limit < prev_power_limit)
17028c2ecf20Sopenharmony_ci			rtlphy->txpwr_limit_2_4g[regulation][bandwidth]
17038c2ecf20Sopenharmony_ci				[rate_section][channel_index][RF90_PATH_A] =
17048c2ecf20Sopenharmony_ci								   power_limit;
17058c2ecf20Sopenharmony_ci
17068c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
17078c2ecf20Sopenharmony_ci			"2.4G [regula %d][bw %d][sec %d][chnl %d][val %d]\n",
17088c2ecf20Sopenharmony_ci			regulation, bandwidth, rate_section, channel_index,
17098c2ecf20Sopenharmony_ci			rtlphy->txpwr_limit_2_4g[regulation][bandwidth]
17108c2ecf20Sopenharmony_ci				[rate_section][channel_index][RF90_PATH_A]);
17118c2ecf20Sopenharmony_ci	} else if (strcmp(pband, "5G") == 0) {
17128c2ecf20Sopenharmony_ci		ret = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw,
17138c2ecf20Sopenharmony_ci							       BAND_ON_5G,
17148c2ecf20Sopenharmony_ci							       channel);
17158c2ecf20Sopenharmony_ci
17168c2ecf20Sopenharmony_ci		if (ret == -1)
17178c2ecf20Sopenharmony_ci			return;
17188c2ecf20Sopenharmony_ci
17198c2ecf20Sopenharmony_ci		channel_index = ret;
17208c2ecf20Sopenharmony_ci
17218c2ecf20Sopenharmony_ci		prev_power_limit = rtlphy->txpwr_limit_5g[regulation][bandwidth]
17228c2ecf20Sopenharmony_ci						[rate_section][channel_index]
17238c2ecf20Sopenharmony_ci						[RF90_PATH_A];
17248c2ecf20Sopenharmony_ci
17258c2ecf20Sopenharmony_ci		if (power_limit < prev_power_limit)
17268c2ecf20Sopenharmony_ci			rtlphy->txpwr_limit_5g[regulation][bandwidth]
17278c2ecf20Sopenharmony_ci			[rate_section][channel_index][RF90_PATH_A] = power_limit;
17288c2ecf20Sopenharmony_ci
17298c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
17308c2ecf20Sopenharmony_ci			"5G: [regul %d][bw %d][sec %d][chnl %d][val %d]\n",
17318c2ecf20Sopenharmony_ci			regulation, bandwidth, rate_section, channel,
17328c2ecf20Sopenharmony_ci			rtlphy->txpwr_limit_5g[regulation][bandwidth]
17338c2ecf20Sopenharmony_ci				[rate_section][channel_index][RF90_PATH_A]);
17348c2ecf20Sopenharmony_ci	} else {
17358c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
17368c2ecf20Sopenharmony_ci			"Cannot recognize the band info in %s\n", pband);
17378c2ecf20Sopenharmony_ci		return;
17388c2ecf20Sopenharmony_ci	}
17398c2ecf20Sopenharmony_ci}
17408c2ecf20Sopenharmony_ci
17418c2ecf20Sopenharmony_cistatic void _rtl8812ae_phy_config_bb_txpwr_lmt(struct ieee80211_hw *hw,
17428c2ecf20Sopenharmony_ci					  const char *regulation, const char *band,
17438c2ecf20Sopenharmony_ci					  const char *bandwidth, const char *rate_section,
17448c2ecf20Sopenharmony_ci					  const char *rf_path, const char *channel,
17458c2ecf20Sopenharmony_ci					  const char *power_limit)
17468c2ecf20Sopenharmony_ci{
17478c2ecf20Sopenharmony_ci	_rtl8812ae_phy_set_txpower_limit(hw, regulation, band, bandwidth,
17488c2ecf20Sopenharmony_ci					 rate_section, rf_path, channel,
17498c2ecf20Sopenharmony_ci					 power_limit);
17508c2ecf20Sopenharmony_ci}
17518c2ecf20Sopenharmony_ci
17528c2ecf20Sopenharmony_cistatic void _rtl8821ae_phy_read_and_config_txpwr_lmt(struct ieee80211_hw *hw)
17538c2ecf20Sopenharmony_ci{
17548c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
17558c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
17568c2ecf20Sopenharmony_ci	u32 i = 0;
17578c2ecf20Sopenharmony_ci	u32 array_len;
17588c2ecf20Sopenharmony_ci	const char **array;
17598c2ecf20Sopenharmony_ci
17608c2ecf20Sopenharmony_ci	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
17618c2ecf20Sopenharmony_ci		array_len = RTL8812AE_TXPWR_LMT_ARRAY_LEN;
17628c2ecf20Sopenharmony_ci		array = RTL8812AE_TXPWR_LMT;
17638c2ecf20Sopenharmony_ci	} else {
17648c2ecf20Sopenharmony_ci		array_len = RTL8821AE_TXPWR_LMT_ARRAY_LEN;
17658c2ecf20Sopenharmony_ci		array = RTL8821AE_TXPWR_LMT;
17668c2ecf20Sopenharmony_ci	}
17678c2ecf20Sopenharmony_ci
17688c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "\n");
17698c2ecf20Sopenharmony_ci
17708c2ecf20Sopenharmony_ci	for (i = 0; i < array_len; i += 7) {
17718c2ecf20Sopenharmony_ci		const char *regulation = array[i];
17728c2ecf20Sopenharmony_ci		const char *band = array[i+1];
17738c2ecf20Sopenharmony_ci		const char *bandwidth = array[i+2];
17748c2ecf20Sopenharmony_ci		const char *rate = array[i+3];
17758c2ecf20Sopenharmony_ci		const char *rf_path = array[i+4];
17768c2ecf20Sopenharmony_ci		const char *chnl = array[i+5];
17778c2ecf20Sopenharmony_ci		const char *val = array[i+6];
17788c2ecf20Sopenharmony_ci
17798c2ecf20Sopenharmony_ci		_rtl8812ae_phy_config_bb_txpwr_lmt(hw, regulation, band,
17808c2ecf20Sopenharmony_ci						   bandwidth, rate, rf_path,
17818c2ecf20Sopenharmony_ci						   chnl, val);
17828c2ecf20Sopenharmony_ci	}
17838c2ecf20Sopenharmony_ci}
17848c2ecf20Sopenharmony_ci
17858c2ecf20Sopenharmony_cistatic bool _rtl8821ae_phy_bb8821a_config_parafile(struct ieee80211_hw *hw)
17868c2ecf20Sopenharmony_ci{
17878c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
17888c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
17898c2ecf20Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
17908c2ecf20Sopenharmony_ci	bool rtstatus;
17918c2ecf20Sopenharmony_ci
17928c2ecf20Sopenharmony_ci	_rtl8821ae_phy_init_txpower_limit(hw);
17938c2ecf20Sopenharmony_ci
17948c2ecf20Sopenharmony_ci	/* RegEnableTxPowerLimit == 1 for 8812a & 8821a */
17958c2ecf20Sopenharmony_ci	if (rtlefuse->eeprom_regulatory != 2)
17968c2ecf20Sopenharmony_ci		_rtl8821ae_phy_read_and_config_txpwr_lmt(hw);
17978c2ecf20Sopenharmony_ci
17988c2ecf20Sopenharmony_ci	rtstatus = _rtl8821ae_phy_config_bb_with_headerfile(hw,
17998c2ecf20Sopenharmony_ci						       BASEBAND_CONFIG_PHY_REG);
18008c2ecf20Sopenharmony_ci	if (!rtstatus) {
18018c2ecf20Sopenharmony_ci		pr_err("Write BB Reg Fail!!\n");
18028c2ecf20Sopenharmony_ci		return false;
18038c2ecf20Sopenharmony_ci	}
18048c2ecf20Sopenharmony_ci	_rtl8821ae_phy_init_tx_power_by_rate(hw);
18058c2ecf20Sopenharmony_ci	if (rtlefuse->autoload_failflag == false) {
18068c2ecf20Sopenharmony_ci		rtstatus = _rtl8821ae_phy_config_bb_with_pgheaderfile(hw,
18078c2ecf20Sopenharmony_ci						    BASEBAND_CONFIG_PHY_REG);
18088c2ecf20Sopenharmony_ci	}
18098c2ecf20Sopenharmony_ci	if (!rtstatus) {
18108c2ecf20Sopenharmony_ci		pr_err("BB_PG Reg Fail!!\n");
18118c2ecf20Sopenharmony_ci		return false;
18128c2ecf20Sopenharmony_ci	}
18138c2ecf20Sopenharmony_ci
18148c2ecf20Sopenharmony_ci	_rtl8821ae_phy_txpower_by_rate_configuration(hw);
18158c2ecf20Sopenharmony_ci
18168c2ecf20Sopenharmony_ci	/* RegEnableTxPowerLimit == 1 for 8812a & 8821a */
18178c2ecf20Sopenharmony_ci	if (rtlefuse->eeprom_regulatory != 2)
18188c2ecf20Sopenharmony_ci		_rtl8812ae_phy_convert_txpower_limit_to_power_index(hw);
18198c2ecf20Sopenharmony_ci
18208c2ecf20Sopenharmony_ci	rtstatus = _rtl8821ae_phy_config_bb_with_headerfile(hw,
18218c2ecf20Sopenharmony_ci						BASEBAND_CONFIG_AGC_TAB);
18228c2ecf20Sopenharmony_ci
18238c2ecf20Sopenharmony_ci	if (!rtstatus) {
18248c2ecf20Sopenharmony_ci		pr_err("AGC Table Fail\n");
18258c2ecf20Sopenharmony_ci		return false;
18268c2ecf20Sopenharmony_ci	}
18278c2ecf20Sopenharmony_ci	rtlphy->cck_high_power = (bool)(rtl_get_bbreg(hw,
18288c2ecf20Sopenharmony_ci			RFPGA0_XA_HSSIPARAMETER2, 0x200));
18298c2ecf20Sopenharmony_ci	return true;
18308c2ecf20Sopenharmony_ci}
18318c2ecf20Sopenharmony_ci
18328c2ecf20Sopenharmony_cistatic bool
18338c2ecf20Sopenharmony_ci__rtl8821ae_phy_config_with_headerfile(struct ieee80211_hw *hw,
18348c2ecf20Sopenharmony_ci				       u32 *array_table, u16 arraylen,
18358c2ecf20Sopenharmony_ci				       void (*set_reg)(struct ieee80211_hw *hw,
18368c2ecf20Sopenharmony_ci						       u32 regaddr, u32 data))
18378c2ecf20Sopenharmony_ci{
18388c2ecf20Sopenharmony_ci	#define COND_ELSE  2
18398c2ecf20Sopenharmony_ci	#define COND_ENDIF 3
18408c2ecf20Sopenharmony_ci
18418c2ecf20Sopenharmony_ci	int i = 0;
18428c2ecf20Sopenharmony_ci	u8 cond;
18438c2ecf20Sopenharmony_ci	bool matched = true, skipped = false;
18448c2ecf20Sopenharmony_ci
18458c2ecf20Sopenharmony_ci	while ((i + 1) < arraylen) {
18468c2ecf20Sopenharmony_ci		u32 v1 = array_table[i];
18478c2ecf20Sopenharmony_ci		u32 v2 = array_table[i + 1];
18488c2ecf20Sopenharmony_ci
18498c2ecf20Sopenharmony_ci		if (v1 & (BIT(31) | BIT(30))) {/*positive & negative condition*/
18508c2ecf20Sopenharmony_ci			if (v1 & BIT(31)) {/* positive condition*/
18518c2ecf20Sopenharmony_ci				cond  = (u8)((v1 & (BIT(29) | BIT(28))) >> 28);
18528c2ecf20Sopenharmony_ci				if (cond == COND_ENDIF) {/*end*/
18538c2ecf20Sopenharmony_ci					matched = true;
18548c2ecf20Sopenharmony_ci					skipped = false;
18558c2ecf20Sopenharmony_ci				} else if (cond == COND_ELSE) /*else*/
18568c2ecf20Sopenharmony_ci					matched = skipped ? false : true;
18578c2ecf20Sopenharmony_ci				else {/*if , else if*/
18588c2ecf20Sopenharmony_ci					if (skipped) {
18598c2ecf20Sopenharmony_ci						matched = false;
18608c2ecf20Sopenharmony_ci					} else {
18618c2ecf20Sopenharmony_ci						if (_rtl8821ae_check_positive(
18628c2ecf20Sopenharmony_ci								hw, v1, v2)) {
18638c2ecf20Sopenharmony_ci							matched = true;
18648c2ecf20Sopenharmony_ci							skipped = true;
18658c2ecf20Sopenharmony_ci						} else {
18668c2ecf20Sopenharmony_ci							matched = false;
18678c2ecf20Sopenharmony_ci							skipped = false;
18688c2ecf20Sopenharmony_ci						}
18698c2ecf20Sopenharmony_ci					}
18708c2ecf20Sopenharmony_ci				}
18718c2ecf20Sopenharmony_ci			} else if (v1 & BIT(30)) { /*negative condition*/
18728c2ecf20Sopenharmony_ci			/*do nothing*/
18738c2ecf20Sopenharmony_ci			}
18748c2ecf20Sopenharmony_ci		} else {
18758c2ecf20Sopenharmony_ci			if (matched)
18768c2ecf20Sopenharmony_ci				set_reg(hw, v1, v2);
18778c2ecf20Sopenharmony_ci		}
18788c2ecf20Sopenharmony_ci		i = i + 2;
18798c2ecf20Sopenharmony_ci	}
18808c2ecf20Sopenharmony_ci
18818c2ecf20Sopenharmony_ci	return true;
18828c2ecf20Sopenharmony_ci}
18838c2ecf20Sopenharmony_ci
18848c2ecf20Sopenharmony_cistatic bool _rtl8821ae_phy_config_mac_with_headerfile(struct ieee80211_hw *hw)
18858c2ecf20Sopenharmony_ci{
18868c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
18878c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
18888c2ecf20Sopenharmony_ci	u32 arraylength;
18898c2ecf20Sopenharmony_ci	u32 *ptrarray;
18908c2ecf20Sopenharmony_ci
18918c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "Read MAC_REG_Array\n");
18928c2ecf20Sopenharmony_ci	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
18938c2ecf20Sopenharmony_ci		arraylength = RTL8821AE_MAC_1T_ARRAYLEN;
18948c2ecf20Sopenharmony_ci		ptrarray = RTL8821AE_MAC_REG_ARRAY;
18958c2ecf20Sopenharmony_ci	} else {
18968c2ecf20Sopenharmony_ci		arraylength = RTL8812AE_MAC_1T_ARRAYLEN;
18978c2ecf20Sopenharmony_ci		ptrarray = RTL8812AE_MAC_REG_ARRAY;
18988c2ecf20Sopenharmony_ci	}
18998c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
19008c2ecf20Sopenharmony_ci		"Img: MAC_REG_ARRAY LEN %d\n", arraylength);
19018c2ecf20Sopenharmony_ci
19028c2ecf20Sopenharmony_ci	return __rtl8821ae_phy_config_with_headerfile(hw,
19038c2ecf20Sopenharmony_ci			ptrarray, arraylength, rtl_write_byte_with_val32);
19048c2ecf20Sopenharmony_ci}
19058c2ecf20Sopenharmony_ci
19068c2ecf20Sopenharmony_cistatic bool _rtl8821ae_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
19078c2ecf20Sopenharmony_ci						     u8 configtype)
19088c2ecf20Sopenharmony_ci{
19098c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
19108c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
19118c2ecf20Sopenharmony_ci	u32 *array_table;
19128c2ecf20Sopenharmony_ci	u16 arraylen;
19138c2ecf20Sopenharmony_ci
19148c2ecf20Sopenharmony_ci	if (configtype == BASEBAND_CONFIG_PHY_REG) {
19158c2ecf20Sopenharmony_ci		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
19168c2ecf20Sopenharmony_ci			arraylen = RTL8812AE_PHY_REG_1TARRAYLEN;
19178c2ecf20Sopenharmony_ci			array_table = RTL8812AE_PHY_REG_ARRAY;
19188c2ecf20Sopenharmony_ci		} else {
19198c2ecf20Sopenharmony_ci			arraylen = RTL8821AE_PHY_REG_1TARRAYLEN;
19208c2ecf20Sopenharmony_ci			array_table = RTL8821AE_PHY_REG_ARRAY;
19218c2ecf20Sopenharmony_ci		}
19228c2ecf20Sopenharmony_ci
19238c2ecf20Sopenharmony_ci		return __rtl8821ae_phy_config_with_headerfile(hw,
19248c2ecf20Sopenharmony_ci				array_table, arraylen,
19258c2ecf20Sopenharmony_ci				_rtl8821ae_config_bb_reg);
19268c2ecf20Sopenharmony_ci	} else if (configtype == BASEBAND_CONFIG_AGC_TAB) {
19278c2ecf20Sopenharmony_ci		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
19288c2ecf20Sopenharmony_ci			arraylen = RTL8812AE_AGC_TAB_1TARRAYLEN;
19298c2ecf20Sopenharmony_ci			array_table = RTL8812AE_AGC_TAB_ARRAY;
19308c2ecf20Sopenharmony_ci		} else {
19318c2ecf20Sopenharmony_ci			arraylen = RTL8821AE_AGC_TAB_1TARRAYLEN;
19328c2ecf20Sopenharmony_ci			array_table = RTL8821AE_AGC_TAB_ARRAY;
19338c2ecf20Sopenharmony_ci		}
19348c2ecf20Sopenharmony_ci
19358c2ecf20Sopenharmony_ci		return __rtl8821ae_phy_config_with_headerfile(hw,
19368c2ecf20Sopenharmony_ci				array_table, arraylen,
19378c2ecf20Sopenharmony_ci				rtl_set_bbreg_with_dwmask);
19388c2ecf20Sopenharmony_ci	}
19398c2ecf20Sopenharmony_ci	return true;
19408c2ecf20Sopenharmony_ci}
19418c2ecf20Sopenharmony_ci
19428c2ecf20Sopenharmony_cistatic u8 _rtl8821ae_get_rate_section_index(u32 regaddr)
19438c2ecf20Sopenharmony_ci{
19448c2ecf20Sopenharmony_ci	u8 index = 0;
19458c2ecf20Sopenharmony_ci	regaddr &= 0xFFF;
19468c2ecf20Sopenharmony_ci	if (regaddr >= 0xC20 && regaddr <= 0xC4C)
19478c2ecf20Sopenharmony_ci		index = (u8)((regaddr - 0xC20) / 4);
19488c2ecf20Sopenharmony_ci	else if (regaddr >= 0xE20 && regaddr <= 0xE4C)
19498c2ecf20Sopenharmony_ci		index = (u8)((regaddr - 0xE20) / 4);
19508c2ecf20Sopenharmony_ci	else
19518c2ecf20Sopenharmony_ci		WARN_ONCE(true,
19528c2ecf20Sopenharmony_ci			  "rtl8821ae: Invalid RegAddr 0x%x\n", regaddr);
19538c2ecf20Sopenharmony_ci	return index;
19548c2ecf20Sopenharmony_ci}
19558c2ecf20Sopenharmony_ci
19568c2ecf20Sopenharmony_cistatic void _rtl8821ae_store_tx_power_by_rate(struct ieee80211_hw *hw,
19578c2ecf20Sopenharmony_ci					      u32 band, u32 rfpath,
19588c2ecf20Sopenharmony_ci					      u32 txnum, u32 regaddr,
19598c2ecf20Sopenharmony_ci					      u32 bitmask, u32 data)
19608c2ecf20Sopenharmony_ci{
19618c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
19628c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
19638c2ecf20Sopenharmony_ci	u8 rate_section = _rtl8821ae_get_rate_section_index(regaddr);
19648c2ecf20Sopenharmony_ci
19658c2ecf20Sopenharmony_ci	if (band != BAND_ON_2_4G && band != BAND_ON_5G) {
19668c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid Band %d\n", band);
19678c2ecf20Sopenharmony_ci		band = BAND_ON_2_4G;
19688c2ecf20Sopenharmony_ci	}
19698c2ecf20Sopenharmony_ci	if (rfpath >= MAX_RF_PATH) {
19708c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid RfPath %d\n", rfpath);
19718c2ecf20Sopenharmony_ci		rfpath = MAX_RF_PATH - 1;
19728c2ecf20Sopenharmony_ci	}
19738c2ecf20Sopenharmony_ci	if (txnum >= MAX_RF_PATH) {
19748c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid TxNum %d\n", txnum);
19758c2ecf20Sopenharmony_ci		txnum = MAX_RF_PATH - 1;
19768c2ecf20Sopenharmony_ci	}
19778c2ecf20Sopenharmony_ci	rtlphy->tx_power_by_rate_offset[band][rfpath][txnum][rate_section] = data;
19788c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
19798c2ecf20Sopenharmony_ci		"TxPwrByRateOffset[Band %d][RfPath %d][TxNum %d][RateSection %d] = 0x%x\n",
19808c2ecf20Sopenharmony_ci		band, rfpath, txnum, rate_section,
19818c2ecf20Sopenharmony_ci		rtlphy->tx_power_by_rate_offset[band][rfpath][txnum][rate_section]);
19828c2ecf20Sopenharmony_ci}
19838c2ecf20Sopenharmony_ci
19848c2ecf20Sopenharmony_cistatic bool _rtl8821ae_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
19858c2ecf20Sopenharmony_ci							u8 configtype)
19868c2ecf20Sopenharmony_ci{
19878c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
19888c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
19898c2ecf20Sopenharmony_ci	int i;
19908c2ecf20Sopenharmony_ci	u32 *array;
19918c2ecf20Sopenharmony_ci	u16 arraylen;
19928c2ecf20Sopenharmony_ci	u32 v1, v2, v3, v4, v5, v6;
19938c2ecf20Sopenharmony_ci
19948c2ecf20Sopenharmony_ci	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
19958c2ecf20Sopenharmony_ci		arraylen = RTL8812AE_PHY_REG_ARRAY_PGLEN;
19968c2ecf20Sopenharmony_ci		array = RTL8812AE_PHY_REG_ARRAY_PG;
19978c2ecf20Sopenharmony_ci	} else {
19988c2ecf20Sopenharmony_ci		arraylen = RTL8821AE_PHY_REG_ARRAY_PGLEN;
19998c2ecf20Sopenharmony_ci		array = RTL8821AE_PHY_REG_ARRAY_PG;
20008c2ecf20Sopenharmony_ci	}
20018c2ecf20Sopenharmony_ci
20028c2ecf20Sopenharmony_ci	if (configtype != BASEBAND_CONFIG_PHY_REG) {
20038c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_SEND, DBG_TRACE,
20048c2ecf20Sopenharmony_ci			"configtype != BaseBand_Config_PHY_REG\n");
20058c2ecf20Sopenharmony_ci		return true;
20068c2ecf20Sopenharmony_ci	}
20078c2ecf20Sopenharmony_ci	for (i = 0; i < arraylen; i += 6) {
20088c2ecf20Sopenharmony_ci		v1 = array[i];
20098c2ecf20Sopenharmony_ci		v2 = array[i+1];
20108c2ecf20Sopenharmony_ci		v3 = array[i+2];
20118c2ecf20Sopenharmony_ci		v4 = array[i+3];
20128c2ecf20Sopenharmony_ci		v5 = array[i+4];
20138c2ecf20Sopenharmony_ci		v6 = array[i+5];
20148c2ecf20Sopenharmony_ci
20158c2ecf20Sopenharmony_ci		if (v1 < 0xCDCDCDCD) {
20168c2ecf20Sopenharmony_ci			if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE &&
20178c2ecf20Sopenharmony_ci				(v4 == 0xfe || v4 == 0xffe)) {
20188c2ecf20Sopenharmony_ci				msleep(50);
20198c2ecf20Sopenharmony_ci				continue;
20208c2ecf20Sopenharmony_ci			}
20218c2ecf20Sopenharmony_ci
20228c2ecf20Sopenharmony_ci			if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
20238c2ecf20Sopenharmony_ci				if (v4 == 0xfe)
20248c2ecf20Sopenharmony_ci					msleep(50);
20258c2ecf20Sopenharmony_ci				else if (v4 == 0xfd)
20268c2ecf20Sopenharmony_ci					mdelay(5);
20278c2ecf20Sopenharmony_ci				else if (v4 == 0xfc)
20288c2ecf20Sopenharmony_ci					mdelay(1);
20298c2ecf20Sopenharmony_ci				else if (v4 == 0xfb)
20308c2ecf20Sopenharmony_ci					udelay(50);
20318c2ecf20Sopenharmony_ci				else if (v4 == 0xfa)
20328c2ecf20Sopenharmony_ci					udelay(5);
20338c2ecf20Sopenharmony_ci				else if (v4 == 0xf9)
20348c2ecf20Sopenharmony_ci					udelay(1);
20358c2ecf20Sopenharmony_ci			}
20368c2ecf20Sopenharmony_ci			_rtl8821ae_store_tx_power_by_rate(hw, v1, v2, v3,
20378c2ecf20Sopenharmony_ci							  v4, v5, v6);
20388c2ecf20Sopenharmony_ci			continue;
20398c2ecf20Sopenharmony_ci		} else {
20408c2ecf20Sopenharmony_ci			 /*don't need the hw_body*/
20418c2ecf20Sopenharmony_ci			if (!_rtl8821ae_check_condition(hw, v1)) {
20428c2ecf20Sopenharmony_ci				i += 2; /* skip the pair of expression*/
20438c2ecf20Sopenharmony_ci				v1 = array[i];
20448c2ecf20Sopenharmony_ci				v2 = array[i+1];
20458c2ecf20Sopenharmony_ci				v3 = array[i+2];
20468c2ecf20Sopenharmony_ci				while (v2 != 0xDEAD) {
20478c2ecf20Sopenharmony_ci					i += 3;
20488c2ecf20Sopenharmony_ci					v1 = array[i];
20498c2ecf20Sopenharmony_ci					v2 = array[i+1];
20508c2ecf20Sopenharmony_ci					v3 = array[i+2];
20518c2ecf20Sopenharmony_ci				}
20528c2ecf20Sopenharmony_ci			}
20538c2ecf20Sopenharmony_ci		}
20548c2ecf20Sopenharmony_ci	}
20558c2ecf20Sopenharmony_ci
20568c2ecf20Sopenharmony_ci	return true;
20578c2ecf20Sopenharmony_ci}
20588c2ecf20Sopenharmony_ci
20598c2ecf20Sopenharmony_cibool rtl8812ae_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
20608c2ecf20Sopenharmony_ci					     enum radio_path rfpath)
20618c2ecf20Sopenharmony_ci{
20628c2ecf20Sopenharmony_ci	u32 *radioa_array_table_a, *radioa_array_table_b;
20638c2ecf20Sopenharmony_ci	u16 radioa_arraylen_a, radioa_arraylen_b;
20648c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
20658c2ecf20Sopenharmony_ci
20668c2ecf20Sopenharmony_ci	radioa_arraylen_a = RTL8812AE_RADIOA_1TARRAYLEN;
20678c2ecf20Sopenharmony_ci	radioa_array_table_a = RTL8812AE_RADIOA_ARRAY;
20688c2ecf20Sopenharmony_ci	radioa_arraylen_b = RTL8812AE_RADIOB_1TARRAYLEN;
20698c2ecf20Sopenharmony_ci	radioa_array_table_b = RTL8812AE_RADIOB_ARRAY;
20708c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
20718c2ecf20Sopenharmony_ci		"Radio_A:RTL8821AE_RADIOA_ARRAY %d\n", radioa_arraylen_a);
20728c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath);
20738c2ecf20Sopenharmony_ci	switch (rfpath) {
20748c2ecf20Sopenharmony_ci	case RF90_PATH_A:
20758c2ecf20Sopenharmony_ci		return __rtl8821ae_phy_config_with_headerfile(hw,
20768c2ecf20Sopenharmony_ci				radioa_array_table_a, radioa_arraylen_a,
20778c2ecf20Sopenharmony_ci				_rtl8821ae_config_rf_radio_a);
20788c2ecf20Sopenharmony_ci		break;
20798c2ecf20Sopenharmony_ci	case RF90_PATH_B:
20808c2ecf20Sopenharmony_ci		return __rtl8821ae_phy_config_with_headerfile(hw,
20818c2ecf20Sopenharmony_ci				radioa_array_table_b, radioa_arraylen_b,
20828c2ecf20Sopenharmony_ci				_rtl8821ae_config_rf_radio_b);
20838c2ecf20Sopenharmony_ci		break;
20848c2ecf20Sopenharmony_ci	case RF90_PATH_C:
20858c2ecf20Sopenharmony_ci	case RF90_PATH_D:
20868c2ecf20Sopenharmony_ci		pr_err("switch case %#x not processed\n", rfpath);
20878c2ecf20Sopenharmony_ci		break;
20888c2ecf20Sopenharmony_ci	}
20898c2ecf20Sopenharmony_ci	return true;
20908c2ecf20Sopenharmony_ci}
20918c2ecf20Sopenharmony_ci
20928c2ecf20Sopenharmony_cibool rtl8821ae_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
20938c2ecf20Sopenharmony_ci						enum radio_path rfpath)
20948c2ecf20Sopenharmony_ci{
20958c2ecf20Sopenharmony_ci	u32 *radioa_array_table;
20968c2ecf20Sopenharmony_ci	u16 radioa_arraylen;
20978c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
20988c2ecf20Sopenharmony_ci
20998c2ecf20Sopenharmony_ci	radioa_arraylen = RTL8821AE_RADIOA_1TARRAYLEN;
21008c2ecf20Sopenharmony_ci	radioa_array_table = RTL8821AE_RADIOA_ARRAY;
21018c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
21028c2ecf20Sopenharmony_ci		"Radio_A:RTL8821AE_RADIOA_ARRAY %d\n", radioa_arraylen);
21038c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath);
21048c2ecf20Sopenharmony_ci	switch (rfpath) {
21058c2ecf20Sopenharmony_ci	case RF90_PATH_A:
21068c2ecf20Sopenharmony_ci		return __rtl8821ae_phy_config_with_headerfile(hw,
21078c2ecf20Sopenharmony_ci			radioa_array_table, radioa_arraylen,
21088c2ecf20Sopenharmony_ci			_rtl8821ae_config_rf_radio_a);
21098c2ecf20Sopenharmony_ci		break;
21108c2ecf20Sopenharmony_ci
21118c2ecf20Sopenharmony_ci	case RF90_PATH_B:
21128c2ecf20Sopenharmony_ci	case RF90_PATH_C:
21138c2ecf20Sopenharmony_ci	case RF90_PATH_D:
21148c2ecf20Sopenharmony_ci		pr_err("switch case %#x not processed\n", rfpath);
21158c2ecf20Sopenharmony_ci		break;
21168c2ecf20Sopenharmony_ci	}
21178c2ecf20Sopenharmony_ci	return true;
21188c2ecf20Sopenharmony_ci}
21198c2ecf20Sopenharmony_ci
21208c2ecf20Sopenharmony_civoid rtl8821ae_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
21218c2ecf20Sopenharmony_ci{
21228c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
21238c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
21248c2ecf20Sopenharmony_ci
21258c2ecf20Sopenharmony_ci	rtlphy->default_initialgain[0] =
21268c2ecf20Sopenharmony_ci	    (u8)rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
21278c2ecf20Sopenharmony_ci	rtlphy->default_initialgain[1] =
21288c2ecf20Sopenharmony_ci	    (u8)rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0);
21298c2ecf20Sopenharmony_ci	rtlphy->default_initialgain[2] =
21308c2ecf20Sopenharmony_ci	    (u8)rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0);
21318c2ecf20Sopenharmony_ci	rtlphy->default_initialgain[3] =
21328c2ecf20Sopenharmony_ci	    (u8)rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0);
21338c2ecf20Sopenharmony_ci
21348c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
21358c2ecf20Sopenharmony_ci		"Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n",
21368c2ecf20Sopenharmony_ci		rtlphy->default_initialgain[0],
21378c2ecf20Sopenharmony_ci		rtlphy->default_initialgain[1],
21388c2ecf20Sopenharmony_ci		rtlphy->default_initialgain[2],
21398c2ecf20Sopenharmony_ci		rtlphy->default_initialgain[3]);
21408c2ecf20Sopenharmony_ci
21418c2ecf20Sopenharmony_ci	rtlphy->framesync = (u8)rtl_get_bbreg(hw,
21428c2ecf20Sopenharmony_ci					       ROFDM0_RXDETECTOR3, MASKBYTE0);
21438c2ecf20Sopenharmony_ci	rtlphy->framesync_c34 = rtl_get_bbreg(hw,
21448c2ecf20Sopenharmony_ci					      ROFDM0_RXDETECTOR2, MASKDWORD);
21458c2ecf20Sopenharmony_ci
21468c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
21478c2ecf20Sopenharmony_ci		"Default framesync (0x%x) = 0x%x\n",
21488c2ecf20Sopenharmony_ci		ROFDM0_RXDETECTOR3, rtlphy->framesync);
21498c2ecf20Sopenharmony_ci}
21508c2ecf20Sopenharmony_ci
21518c2ecf20Sopenharmony_cistatic void phy_init_bb_rf_register_definition(struct ieee80211_hw *hw)
21528c2ecf20Sopenharmony_ci{
21538c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
21548c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
21558c2ecf20Sopenharmony_ci
21568c2ecf20Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_A].rfintfs = RFPGA0_XAB_RFINTERFACESW;
21578c2ecf20Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_B].rfintfs = RFPGA0_XAB_RFINTERFACESW;
21588c2ecf20Sopenharmony_ci
21598c2ecf20Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_A].rfintfo = RFPGA0_XA_RFINTERFACEOE;
21608c2ecf20Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_B].rfintfo = RFPGA0_XB_RFINTERFACEOE;
21618c2ecf20Sopenharmony_ci
21628c2ecf20Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_A].rfintfe = RFPGA0_XA_RFINTERFACEOE;
21638c2ecf20Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE;
21648c2ecf20Sopenharmony_ci
21658c2ecf20Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset = RA_LSSIWRITE_8821A;
21668c2ecf20Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset = RB_LSSIWRITE_8821A;
21678c2ecf20Sopenharmony_ci
21688c2ecf20Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para2 = RHSSIREAD_8821AE;
21698c2ecf20Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para2 = RHSSIREAD_8821AE;
21708c2ecf20Sopenharmony_ci
21718c2ecf20Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_A].rf_rb = RA_SIREAD_8821A;
21728c2ecf20Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_B].rf_rb = RB_SIREAD_8821A;
21738c2ecf20Sopenharmony_ci
21748c2ecf20Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_A].rf_rbpi = RA_PIREAD_8821A;
21758c2ecf20Sopenharmony_ci	rtlphy->phyreg_def[RF90_PATH_B].rf_rbpi = RB_PIREAD_8821A;
21768c2ecf20Sopenharmony_ci}
21778c2ecf20Sopenharmony_ci
21788c2ecf20Sopenharmony_civoid rtl8821ae_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel)
21798c2ecf20Sopenharmony_ci{
21808c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
21818c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
21828c2ecf20Sopenharmony_ci	u8 txpwr_level;
21838c2ecf20Sopenharmony_ci	long txpwr_dbm;
21848c2ecf20Sopenharmony_ci
21858c2ecf20Sopenharmony_ci	txpwr_level = rtlphy->cur_cck_txpwridx;
21868c2ecf20Sopenharmony_ci	txpwr_dbm = _rtl8821ae_phy_txpwr_idx_to_dbm(hw,
21878c2ecf20Sopenharmony_ci						 WIRELESS_MODE_B, txpwr_level);
21888c2ecf20Sopenharmony_ci	txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
21898c2ecf20Sopenharmony_ci	if (_rtl8821ae_phy_txpwr_idx_to_dbm(hw,
21908c2ecf20Sopenharmony_ci					 WIRELESS_MODE_G,
21918c2ecf20Sopenharmony_ci					 txpwr_level) > txpwr_dbm)
21928c2ecf20Sopenharmony_ci		txpwr_dbm =
21938c2ecf20Sopenharmony_ci		    _rtl8821ae_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G,
21948c2ecf20Sopenharmony_ci						 txpwr_level);
21958c2ecf20Sopenharmony_ci	txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
21968c2ecf20Sopenharmony_ci	if (_rtl8821ae_phy_txpwr_idx_to_dbm(hw,
21978c2ecf20Sopenharmony_ci					 WIRELESS_MODE_N_24G,
21988c2ecf20Sopenharmony_ci					 txpwr_level) > txpwr_dbm)
21998c2ecf20Sopenharmony_ci		txpwr_dbm =
22008c2ecf20Sopenharmony_ci		    _rtl8821ae_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_N_24G,
22018c2ecf20Sopenharmony_ci						 txpwr_level);
22028c2ecf20Sopenharmony_ci	*powerlevel = txpwr_dbm;
22038c2ecf20Sopenharmony_ci}
22048c2ecf20Sopenharmony_ci
22058c2ecf20Sopenharmony_cistatic bool _rtl8821ae_phy_get_chnl_index(u8 channel, u8 *chnl_index)
22068c2ecf20Sopenharmony_ci{
22078c2ecf20Sopenharmony_ci	u8 i = 0;
22088c2ecf20Sopenharmony_ci	bool in_24g = true;
22098c2ecf20Sopenharmony_ci
22108c2ecf20Sopenharmony_ci	if (channel <= 14) {
22118c2ecf20Sopenharmony_ci		in_24g = true;
22128c2ecf20Sopenharmony_ci		*chnl_index = channel - 1;
22138c2ecf20Sopenharmony_ci	} else {
22148c2ecf20Sopenharmony_ci		in_24g = false;
22158c2ecf20Sopenharmony_ci
22168c2ecf20Sopenharmony_ci		for (i = 0; i < CHANNEL_MAX_NUMBER_5G; ++i) {
22178c2ecf20Sopenharmony_ci			if (channel5g[i] == channel) {
22188c2ecf20Sopenharmony_ci				*chnl_index = i;
22198c2ecf20Sopenharmony_ci				return in_24g;
22208c2ecf20Sopenharmony_ci			}
22218c2ecf20Sopenharmony_ci		}
22228c2ecf20Sopenharmony_ci	}
22238c2ecf20Sopenharmony_ci	return in_24g;
22248c2ecf20Sopenharmony_ci}
22258c2ecf20Sopenharmony_ci
22268c2ecf20Sopenharmony_cistatic s8 _rtl8821ae_phy_get_ratesection_intxpower_byrate(u8 path, u8 rate)
22278c2ecf20Sopenharmony_ci{
22288c2ecf20Sopenharmony_ci	s8 rate_section = 0;
22298c2ecf20Sopenharmony_ci	switch (rate) {
22308c2ecf20Sopenharmony_ci	case DESC_RATE1M:
22318c2ecf20Sopenharmony_ci	case DESC_RATE2M:
22328c2ecf20Sopenharmony_ci	case DESC_RATE5_5M:
22338c2ecf20Sopenharmony_ci	case DESC_RATE11M:
22348c2ecf20Sopenharmony_ci		rate_section = 0;
22358c2ecf20Sopenharmony_ci		break;
22368c2ecf20Sopenharmony_ci	case DESC_RATE6M:
22378c2ecf20Sopenharmony_ci	case DESC_RATE9M:
22388c2ecf20Sopenharmony_ci	case DESC_RATE12M:
22398c2ecf20Sopenharmony_ci	case DESC_RATE18M:
22408c2ecf20Sopenharmony_ci		rate_section = 1;
22418c2ecf20Sopenharmony_ci		break;
22428c2ecf20Sopenharmony_ci	case DESC_RATE24M:
22438c2ecf20Sopenharmony_ci	case DESC_RATE36M:
22448c2ecf20Sopenharmony_ci	case DESC_RATE48M:
22458c2ecf20Sopenharmony_ci	case DESC_RATE54M:
22468c2ecf20Sopenharmony_ci		rate_section = 2;
22478c2ecf20Sopenharmony_ci		break;
22488c2ecf20Sopenharmony_ci	case DESC_RATEMCS0:
22498c2ecf20Sopenharmony_ci	case DESC_RATEMCS1:
22508c2ecf20Sopenharmony_ci	case DESC_RATEMCS2:
22518c2ecf20Sopenharmony_ci	case DESC_RATEMCS3:
22528c2ecf20Sopenharmony_ci		rate_section = 3;
22538c2ecf20Sopenharmony_ci		break;
22548c2ecf20Sopenharmony_ci	case DESC_RATEMCS4:
22558c2ecf20Sopenharmony_ci	case DESC_RATEMCS5:
22568c2ecf20Sopenharmony_ci	case DESC_RATEMCS6:
22578c2ecf20Sopenharmony_ci	case DESC_RATEMCS7:
22588c2ecf20Sopenharmony_ci		rate_section = 4;
22598c2ecf20Sopenharmony_ci		break;
22608c2ecf20Sopenharmony_ci	case DESC_RATEMCS8:
22618c2ecf20Sopenharmony_ci	case DESC_RATEMCS9:
22628c2ecf20Sopenharmony_ci	case DESC_RATEMCS10:
22638c2ecf20Sopenharmony_ci	case DESC_RATEMCS11:
22648c2ecf20Sopenharmony_ci		rate_section = 5;
22658c2ecf20Sopenharmony_ci		break;
22668c2ecf20Sopenharmony_ci	case DESC_RATEMCS12:
22678c2ecf20Sopenharmony_ci	case DESC_RATEMCS13:
22688c2ecf20Sopenharmony_ci	case DESC_RATEMCS14:
22698c2ecf20Sopenharmony_ci	case DESC_RATEMCS15:
22708c2ecf20Sopenharmony_ci		rate_section = 6;
22718c2ecf20Sopenharmony_ci		break;
22728c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS0:
22738c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS1:
22748c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS2:
22758c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS3:
22768c2ecf20Sopenharmony_ci		rate_section = 7;
22778c2ecf20Sopenharmony_ci		break;
22788c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS4:
22798c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS5:
22808c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS6:
22818c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS7:
22828c2ecf20Sopenharmony_ci		rate_section = 8;
22838c2ecf20Sopenharmony_ci		break;
22848c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS8:
22858c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS9:
22868c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS0:
22878c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS1:
22888c2ecf20Sopenharmony_ci		rate_section = 9;
22898c2ecf20Sopenharmony_ci		break;
22908c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS2:
22918c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS3:
22928c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS4:
22938c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS5:
22948c2ecf20Sopenharmony_ci		rate_section = 10;
22958c2ecf20Sopenharmony_ci		break;
22968c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS6:
22978c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS7:
22988c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS8:
22998c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS9:
23008c2ecf20Sopenharmony_ci		rate_section = 11;
23018c2ecf20Sopenharmony_ci		break;
23028c2ecf20Sopenharmony_ci	default:
23038c2ecf20Sopenharmony_ci		WARN_ONCE(true, "rtl8821ae: Rate_Section is Illegal\n");
23048c2ecf20Sopenharmony_ci		break;
23058c2ecf20Sopenharmony_ci	}
23068c2ecf20Sopenharmony_ci
23078c2ecf20Sopenharmony_ci	return rate_section;
23088c2ecf20Sopenharmony_ci}
23098c2ecf20Sopenharmony_ci
23108c2ecf20Sopenharmony_cistatic s8 _rtl8812ae_phy_get_world_wide_limit(s8  *limit_table)
23118c2ecf20Sopenharmony_ci{
23128c2ecf20Sopenharmony_ci	s8 min = limit_table[0];
23138c2ecf20Sopenharmony_ci	u8 i = 0;
23148c2ecf20Sopenharmony_ci
23158c2ecf20Sopenharmony_ci	for (i = 0; i < MAX_REGULATION_NUM; ++i) {
23168c2ecf20Sopenharmony_ci		if (limit_table[i] < min)
23178c2ecf20Sopenharmony_ci			min = limit_table[i];
23188c2ecf20Sopenharmony_ci	}
23198c2ecf20Sopenharmony_ci	return min;
23208c2ecf20Sopenharmony_ci}
23218c2ecf20Sopenharmony_ci
23228c2ecf20Sopenharmony_cistatic s8 _rtl8812ae_phy_get_txpower_limit(struct ieee80211_hw *hw,
23238c2ecf20Sopenharmony_ci					     u8 band,
23248c2ecf20Sopenharmony_ci					     enum ht_channel_width bandwidth,
23258c2ecf20Sopenharmony_ci					     enum radio_path rf_path,
23268c2ecf20Sopenharmony_ci					     u8 rate, u8 channel)
23278c2ecf20Sopenharmony_ci{
23288c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
23298c2ecf20Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtlpriv);
23308c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
23318c2ecf20Sopenharmony_ci	short band_temp = -1, regulation = -1, bandwidth_temp = -1,
23328c2ecf20Sopenharmony_ci		 rate_section = -1, channel_temp = -1;
23338c2ecf20Sopenharmony_ci	u16 regu, bdwidth, sec, chnl;
23348c2ecf20Sopenharmony_ci	s8 power_limit = MAX_POWER_INDEX;
23358c2ecf20Sopenharmony_ci
23368c2ecf20Sopenharmony_ci	if (rtlefuse->eeprom_regulatory == 2)
23378c2ecf20Sopenharmony_ci		return MAX_POWER_INDEX;
23388c2ecf20Sopenharmony_ci
23398c2ecf20Sopenharmony_ci	regulation = TXPWR_LMT_WW;
23408c2ecf20Sopenharmony_ci
23418c2ecf20Sopenharmony_ci	if (band == BAND_ON_2_4G)
23428c2ecf20Sopenharmony_ci		band_temp = 0;
23438c2ecf20Sopenharmony_ci	else if (band == BAND_ON_5G)
23448c2ecf20Sopenharmony_ci		band_temp = 1;
23458c2ecf20Sopenharmony_ci
23468c2ecf20Sopenharmony_ci	if (bandwidth == HT_CHANNEL_WIDTH_20)
23478c2ecf20Sopenharmony_ci		bandwidth_temp = 0;
23488c2ecf20Sopenharmony_ci	else if (bandwidth == HT_CHANNEL_WIDTH_20_40)
23498c2ecf20Sopenharmony_ci		bandwidth_temp = 1;
23508c2ecf20Sopenharmony_ci	else if (bandwidth == HT_CHANNEL_WIDTH_80)
23518c2ecf20Sopenharmony_ci		bandwidth_temp = 2;
23528c2ecf20Sopenharmony_ci
23538c2ecf20Sopenharmony_ci	switch (rate) {
23548c2ecf20Sopenharmony_ci	case DESC_RATE1M:
23558c2ecf20Sopenharmony_ci	case DESC_RATE2M:
23568c2ecf20Sopenharmony_ci	case DESC_RATE5_5M:
23578c2ecf20Sopenharmony_ci	case DESC_RATE11M:
23588c2ecf20Sopenharmony_ci		rate_section = 0;
23598c2ecf20Sopenharmony_ci		break;
23608c2ecf20Sopenharmony_ci	case DESC_RATE6M:
23618c2ecf20Sopenharmony_ci	case DESC_RATE9M:
23628c2ecf20Sopenharmony_ci	case DESC_RATE12M:
23638c2ecf20Sopenharmony_ci	case DESC_RATE18M:
23648c2ecf20Sopenharmony_ci	case DESC_RATE24M:
23658c2ecf20Sopenharmony_ci	case DESC_RATE36M:
23668c2ecf20Sopenharmony_ci	case DESC_RATE48M:
23678c2ecf20Sopenharmony_ci	case DESC_RATE54M:
23688c2ecf20Sopenharmony_ci		rate_section = 1;
23698c2ecf20Sopenharmony_ci		break;
23708c2ecf20Sopenharmony_ci	case DESC_RATEMCS0:
23718c2ecf20Sopenharmony_ci	case DESC_RATEMCS1:
23728c2ecf20Sopenharmony_ci	case DESC_RATEMCS2:
23738c2ecf20Sopenharmony_ci	case DESC_RATEMCS3:
23748c2ecf20Sopenharmony_ci	case DESC_RATEMCS4:
23758c2ecf20Sopenharmony_ci	case DESC_RATEMCS5:
23768c2ecf20Sopenharmony_ci	case DESC_RATEMCS6:
23778c2ecf20Sopenharmony_ci	case DESC_RATEMCS7:
23788c2ecf20Sopenharmony_ci		rate_section = 2;
23798c2ecf20Sopenharmony_ci		break;
23808c2ecf20Sopenharmony_ci	case DESC_RATEMCS8:
23818c2ecf20Sopenharmony_ci	case DESC_RATEMCS9:
23828c2ecf20Sopenharmony_ci	case DESC_RATEMCS10:
23838c2ecf20Sopenharmony_ci	case DESC_RATEMCS11:
23848c2ecf20Sopenharmony_ci	case DESC_RATEMCS12:
23858c2ecf20Sopenharmony_ci	case DESC_RATEMCS13:
23868c2ecf20Sopenharmony_ci	case DESC_RATEMCS14:
23878c2ecf20Sopenharmony_ci	case DESC_RATEMCS15:
23888c2ecf20Sopenharmony_ci		rate_section = 3;
23898c2ecf20Sopenharmony_ci		break;
23908c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS0:
23918c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS1:
23928c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS2:
23938c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS3:
23948c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS4:
23958c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS5:
23968c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS6:
23978c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS7:
23988c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS8:
23998c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS9:
24008c2ecf20Sopenharmony_ci		rate_section = 4;
24018c2ecf20Sopenharmony_ci		break;
24028c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS0:
24038c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS1:
24048c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS2:
24058c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS3:
24068c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS4:
24078c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS5:
24088c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS6:
24098c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS7:
24108c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS8:
24118c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS9:
24128c2ecf20Sopenharmony_ci		rate_section = 5;
24138c2ecf20Sopenharmony_ci		break;
24148c2ecf20Sopenharmony_ci	default:
24158c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
24168c2ecf20Sopenharmony_ci			"Wrong rate 0x%x\n", rate);
24178c2ecf20Sopenharmony_ci		break;
24188c2ecf20Sopenharmony_ci	}
24198c2ecf20Sopenharmony_ci
24208c2ecf20Sopenharmony_ci	if (band_temp == BAND_ON_5G  && rate_section == 0)
24218c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
24228c2ecf20Sopenharmony_ci			"Wrong rate 0x%x: No CCK in 5G Band\n", rate);
24238c2ecf20Sopenharmony_ci
24248c2ecf20Sopenharmony_ci	/*workaround for wrong index combination to obtain tx power limit,
24258c2ecf20Sopenharmony_ci	  OFDM only exists in BW 20M*/
24268c2ecf20Sopenharmony_ci	if (rate_section == 1)
24278c2ecf20Sopenharmony_ci		bandwidth_temp = 0;
24288c2ecf20Sopenharmony_ci
24298c2ecf20Sopenharmony_ci	/*workaround for wrong index combination to obtain tx power limit,
24308c2ecf20Sopenharmony_ci	 *HT on 80M will reference to HT on 40M
24318c2ecf20Sopenharmony_ci	 */
24328c2ecf20Sopenharmony_ci	if ((rate_section == 2 || rate_section == 3) && band == BAND_ON_5G &&
24338c2ecf20Sopenharmony_ci	    bandwidth_temp == 2)
24348c2ecf20Sopenharmony_ci		bandwidth_temp = 1;
24358c2ecf20Sopenharmony_ci
24368c2ecf20Sopenharmony_ci	if (band == BAND_ON_2_4G)
24378c2ecf20Sopenharmony_ci		channel_temp = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw,
24388c2ecf20Sopenharmony_ci		BAND_ON_2_4G, channel);
24398c2ecf20Sopenharmony_ci	else if (band == BAND_ON_5G)
24408c2ecf20Sopenharmony_ci		channel_temp = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw,
24418c2ecf20Sopenharmony_ci		BAND_ON_5G, channel);
24428c2ecf20Sopenharmony_ci	else if (band == BAND_ON_BOTH)
24438c2ecf20Sopenharmony_ci		;/* BAND_ON_BOTH don't care temporarily */
24448c2ecf20Sopenharmony_ci
24458c2ecf20Sopenharmony_ci	if (band_temp == -1 || regulation == -1 || bandwidth_temp == -1 ||
24468c2ecf20Sopenharmony_ci		rate_section == -1 || channel_temp == -1) {
24478c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
24488c2ecf20Sopenharmony_ci			"Wrong index value to access power limit table [band %d][regulation %d][bandwidth %d][rf_path %d][rate_section %d][chnl %d]\n",
24498c2ecf20Sopenharmony_ci			band_temp, regulation, bandwidth_temp, rf_path,
24508c2ecf20Sopenharmony_ci			rate_section, channel_temp);
24518c2ecf20Sopenharmony_ci		return MAX_POWER_INDEX;
24528c2ecf20Sopenharmony_ci	}
24538c2ecf20Sopenharmony_ci
24548c2ecf20Sopenharmony_ci	regu = regulation;
24558c2ecf20Sopenharmony_ci	bdwidth = bandwidth_temp;
24568c2ecf20Sopenharmony_ci	sec = rate_section;
24578c2ecf20Sopenharmony_ci	chnl = channel_temp;
24588c2ecf20Sopenharmony_ci
24598c2ecf20Sopenharmony_ci	if (band == BAND_ON_2_4G) {
24608c2ecf20Sopenharmony_ci		s8 limits[10] = {0};
24618c2ecf20Sopenharmony_ci		u8 i;
24628c2ecf20Sopenharmony_ci
24638c2ecf20Sopenharmony_ci		for (i = 0; i < 4; ++i)
24648c2ecf20Sopenharmony_ci			limits[i] = rtlphy->txpwr_limit_2_4g[i][bdwidth]
24658c2ecf20Sopenharmony_ci			[sec][chnl][rf_path];
24668c2ecf20Sopenharmony_ci
24678c2ecf20Sopenharmony_ci		power_limit = (regulation == TXPWR_LMT_WW) ?
24688c2ecf20Sopenharmony_ci			_rtl8812ae_phy_get_world_wide_limit(limits) :
24698c2ecf20Sopenharmony_ci			rtlphy->txpwr_limit_2_4g[regu][bdwidth]
24708c2ecf20Sopenharmony_ci					[sec][chnl][rf_path];
24718c2ecf20Sopenharmony_ci	} else if (band == BAND_ON_5G) {
24728c2ecf20Sopenharmony_ci		s8 limits[10] = {0};
24738c2ecf20Sopenharmony_ci		u8 i;
24748c2ecf20Sopenharmony_ci
24758c2ecf20Sopenharmony_ci		for (i = 0; i < MAX_REGULATION_NUM; ++i)
24768c2ecf20Sopenharmony_ci			limits[i] = rtlphy->txpwr_limit_5g[i][bdwidth]
24778c2ecf20Sopenharmony_ci			[sec][chnl][rf_path];
24788c2ecf20Sopenharmony_ci
24798c2ecf20Sopenharmony_ci		power_limit = (regulation == TXPWR_LMT_WW) ?
24808c2ecf20Sopenharmony_ci			_rtl8812ae_phy_get_world_wide_limit(limits) :
24818c2ecf20Sopenharmony_ci			rtlphy->txpwr_limit_5g[regu][chnl]
24828c2ecf20Sopenharmony_ci			[sec][chnl][rf_path];
24838c2ecf20Sopenharmony_ci	} else {
24848c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
24858c2ecf20Sopenharmony_ci			"No power limit table of the specified band\n");
24868c2ecf20Sopenharmony_ci	}
24878c2ecf20Sopenharmony_ci	return power_limit;
24888c2ecf20Sopenharmony_ci}
24898c2ecf20Sopenharmony_ci
24908c2ecf20Sopenharmony_cistatic s8 _rtl8821ae_phy_get_txpower_by_rate(struct ieee80211_hw *hw,
24918c2ecf20Sopenharmony_ci					u8 band, u8 path, u8 rate)
24928c2ecf20Sopenharmony_ci{
24938c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
24948c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
24958c2ecf20Sopenharmony_ci	u8 shift = 0, rate_section, tx_num;
24968c2ecf20Sopenharmony_ci	s8 tx_pwr_diff = 0;
24978c2ecf20Sopenharmony_ci	s8 limit = 0;
24988c2ecf20Sopenharmony_ci
24998c2ecf20Sopenharmony_ci	rate_section = _rtl8821ae_phy_get_ratesection_intxpower_byrate(path, rate);
25008c2ecf20Sopenharmony_ci	tx_num = RF_TX_NUM_NONIMPLEMENT;
25018c2ecf20Sopenharmony_ci
25028c2ecf20Sopenharmony_ci	if (tx_num == RF_TX_NUM_NONIMPLEMENT) {
25038c2ecf20Sopenharmony_ci		if ((rate >= DESC_RATEMCS8 && rate <= DESC_RATEMCS15) ||
25048c2ecf20Sopenharmony_ci			(rate >= DESC_RATEVHT2SS_MCS2 && rate <= DESC_RATEVHT2SS_MCS9))
25058c2ecf20Sopenharmony_ci			tx_num = RF_2TX;
25068c2ecf20Sopenharmony_ci		else
25078c2ecf20Sopenharmony_ci			tx_num = RF_1TX;
25088c2ecf20Sopenharmony_ci	}
25098c2ecf20Sopenharmony_ci
25108c2ecf20Sopenharmony_ci	switch (rate) {
25118c2ecf20Sopenharmony_ci	case DESC_RATE1M:
25128c2ecf20Sopenharmony_ci	case DESC_RATE6M:
25138c2ecf20Sopenharmony_ci	case DESC_RATE24M:
25148c2ecf20Sopenharmony_ci	case DESC_RATEMCS0:
25158c2ecf20Sopenharmony_ci	case DESC_RATEMCS4:
25168c2ecf20Sopenharmony_ci	case DESC_RATEMCS8:
25178c2ecf20Sopenharmony_ci	case DESC_RATEMCS12:
25188c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS0:
25198c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS4:
25208c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS8:
25218c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS2:
25228c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS6:
25238c2ecf20Sopenharmony_ci		shift = 0;
25248c2ecf20Sopenharmony_ci		break;
25258c2ecf20Sopenharmony_ci	case DESC_RATE2M:
25268c2ecf20Sopenharmony_ci	case DESC_RATE9M:
25278c2ecf20Sopenharmony_ci	case DESC_RATE36M:
25288c2ecf20Sopenharmony_ci	case DESC_RATEMCS1:
25298c2ecf20Sopenharmony_ci	case DESC_RATEMCS5:
25308c2ecf20Sopenharmony_ci	case DESC_RATEMCS9:
25318c2ecf20Sopenharmony_ci	case DESC_RATEMCS13:
25328c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS1:
25338c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS5:
25348c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS9:
25358c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS3:
25368c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS7:
25378c2ecf20Sopenharmony_ci		shift = 8;
25388c2ecf20Sopenharmony_ci		break;
25398c2ecf20Sopenharmony_ci	case DESC_RATE5_5M:
25408c2ecf20Sopenharmony_ci	case DESC_RATE12M:
25418c2ecf20Sopenharmony_ci	case DESC_RATE48M:
25428c2ecf20Sopenharmony_ci	case DESC_RATEMCS2:
25438c2ecf20Sopenharmony_ci	case DESC_RATEMCS6:
25448c2ecf20Sopenharmony_ci	case DESC_RATEMCS10:
25458c2ecf20Sopenharmony_ci	case DESC_RATEMCS14:
25468c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS2:
25478c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS6:
25488c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS0:
25498c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS4:
25508c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS8:
25518c2ecf20Sopenharmony_ci		shift = 16;
25528c2ecf20Sopenharmony_ci		break;
25538c2ecf20Sopenharmony_ci	case DESC_RATE11M:
25548c2ecf20Sopenharmony_ci	case DESC_RATE18M:
25558c2ecf20Sopenharmony_ci	case DESC_RATE54M:
25568c2ecf20Sopenharmony_ci	case DESC_RATEMCS3:
25578c2ecf20Sopenharmony_ci	case DESC_RATEMCS7:
25588c2ecf20Sopenharmony_ci	case DESC_RATEMCS11:
25598c2ecf20Sopenharmony_ci	case DESC_RATEMCS15:
25608c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS3:
25618c2ecf20Sopenharmony_ci	case DESC_RATEVHT1SS_MCS7:
25628c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS1:
25638c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS5:
25648c2ecf20Sopenharmony_ci	case DESC_RATEVHT2SS_MCS9:
25658c2ecf20Sopenharmony_ci		shift = 24;
25668c2ecf20Sopenharmony_ci		break;
25678c2ecf20Sopenharmony_ci	default:
25688c2ecf20Sopenharmony_ci		WARN_ONCE(true, "rtl8821ae: Rate_Section is Illegal\n");
25698c2ecf20Sopenharmony_ci		break;
25708c2ecf20Sopenharmony_ci	}
25718c2ecf20Sopenharmony_ci
25728c2ecf20Sopenharmony_ci	tx_pwr_diff = (u8)(rtlphy->tx_power_by_rate_offset[band][path]
25738c2ecf20Sopenharmony_ci		[tx_num][rate_section] >> shift) & 0xff;
25748c2ecf20Sopenharmony_ci
25758c2ecf20Sopenharmony_ci	/* RegEnableTxPowerLimit == 1 for 8812a & 8821a */
25768c2ecf20Sopenharmony_ci	if (rtlpriv->efuse.eeprom_regulatory != 2) {
25778c2ecf20Sopenharmony_ci		limit = _rtl8812ae_phy_get_txpower_limit(hw, band,
25788c2ecf20Sopenharmony_ci			rtlphy->current_chan_bw, path, rate,
25798c2ecf20Sopenharmony_ci			rtlphy->current_channel);
25808c2ecf20Sopenharmony_ci
25818c2ecf20Sopenharmony_ci		if (rate == DESC_RATEVHT1SS_MCS8 || rate == DESC_RATEVHT1SS_MCS9  ||
25828c2ecf20Sopenharmony_ci			 rate == DESC_RATEVHT2SS_MCS8 || rate == DESC_RATEVHT2SS_MCS9) {
25838c2ecf20Sopenharmony_ci			if (limit < 0) {
25848c2ecf20Sopenharmony_ci				if (tx_pwr_diff < (-limit))
25858c2ecf20Sopenharmony_ci					tx_pwr_diff = -limit;
25868c2ecf20Sopenharmony_ci			}
25878c2ecf20Sopenharmony_ci		} else {
25888c2ecf20Sopenharmony_ci			if (limit < 0)
25898c2ecf20Sopenharmony_ci				tx_pwr_diff = limit;
25908c2ecf20Sopenharmony_ci			else
25918c2ecf20Sopenharmony_ci				tx_pwr_diff = tx_pwr_diff > limit ? limit : tx_pwr_diff;
25928c2ecf20Sopenharmony_ci		}
25938c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
25948c2ecf20Sopenharmony_ci			"Maximum power by rate %d, final power by rate %d\n",
25958c2ecf20Sopenharmony_ci			limit, tx_pwr_diff);
25968c2ecf20Sopenharmony_ci	}
25978c2ecf20Sopenharmony_ci
25988c2ecf20Sopenharmony_ci	return	tx_pwr_diff;
25998c2ecf20Sopenharmony_ci}
26008c2ecf20Sopenharmony_ci
26018c2ecf20Sopenharmony_cistatic u8 _rtl8821ae_get_txpower_index(struct ieee80211_hw *hw, u8 path,
26028c2ecf20Sopenharmony_ci					u8 rate, u8 bandwidth, u8 channel)
26038c2ecf20Sopenharmony_ci{
26048c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
26058c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
26068c2ecf20Sopenharmony_ci	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
26078c2ecf20Sopenharmony_ci	u8 index = (channel - 1);
26088c2ecf20Sopenharmony_ci	u8 txpower = 0;
26098c2ecf20Sopenharmony_ci	bool in_24g = false;
26108c2ecf20Sopenharmony_ci	s8 powerdiff_byrate = 0;
26118c2ecf20Sopenharmony_ci
26128c2ecf20Sopenharmony_ci	if (((rtlhal->current_bandtype == BAND_ON_2_4G) &&
26138c2ecf20Sopenharmony_ci	    (channel > 14 || channel < 1)) ||
26148c2ecf20Sopenharmony_ci	    ((rtlhal->current_bandtype == BAND_ON_5G) && (channel <= 14))) {
26158c2ecf20Sopenharmony_ci		index = 0;
26168c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
26178c2ecf20Sopenharmony_ci			"Illegal channel!!\n");
26188c2ecf20Sopenharmony_ci	}
26198c2ecf20Sopenharmony_ci
26208c2ecf20Sopenharmony_ci	in_24g = _rtl8821ae_phy_get_chnl_index(channel, &index);
26218c2ecf20Sopenharmony_ci	if (in_24g) {
26228c2ecf20Sopenharmony_ci		if (RTL8821AE_RX_HAL_IS_CCK_RATE(rate))
26238c2ecf20Sopenharmony_ci			txpower = rtlefuse->txpwrlevel_cck[path][index];
26248c2ecf20Sopenharmony_ci		else if (DESC_RATE6M <= rate)
26258c2ecf20Sopenharmony_ci			txpower = rtlefuse->txpwrlevel_ht40_1s[path][index];
26268c2ecf20Sopenharmony_ci		else
26278c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, "invalid rate\n");
26288c2ecf20Sopenharmony_ci
26298c2ecf20Sopenharmony_ci		if (DESC_RATE6M <= rate && rate <= DESC_RATE54M &&
26308c2ecf20Sopenharmony_ci		    !RTL8821AE_RX_HAL_IS_CCK_RATE(rate))
26318c2ecf20Sopenharmony_ci			txpower += rtlefuse->txpwr_legacyhtdiff[path][TX_1S];
26328c2ecf20Sopenharmony_ci
26338c2ecf20Sopenharmony_ci		if (bandwidth == HT_CHANNEL_WIDTH_20) {
26348c2ecf20Sopenharmony_ci			if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
26358c2ecf20Sopenharmony_ci				(DESC_RATEVHT1SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9))
26368c2ecf20Sopenharmony_ci				txpower += rtlefuse->txpwr_ht20diff[path][TX_1S];
26378c2ecf20Sopenharmony_ci			if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
26388c2ecf20Sopenharmony_ci				(DESC_RATEVHT2SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9))
26398c2ecf20Sopenharmony_ci				txpower += rtlefuse->txpwr_ht20diff[path][TX_2S];
26408c2ecf20Sopenharmony_ci		} else if (bandwidth == HT_CHANNEL_WIDTH_20_40) {
26418c2ecf20Sopenharmony_ci			if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
26428c2ecf20Sopenharmony_ci				(DESC_RATEVHT1SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9))
26438c2ecf20Sopenharmony_ci				txpower += rtlefuse->txpwr_ht40diff[path][TX_1S];
26448c2ecf20Sopenharmony_ci			if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
26458c2ecf20Sopenharmony_ci				(DESC_RATEVHT2SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9))
26468c2ecf20Sopenharmony_ci				txpower += rtlefuse->txpwr_ht40diff[path][TX_2S];
26478c2ecf20Sopenharmony_ci		} else if (bandwidth == HT_CHANNEL_WIDTH_80) {
26488c2ecf20Sopenharmony_ci			if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
26498c2ecf20Sopenharmony_ci			    (DESC_RATEVHT1SS_MCS0 <= rate &&
26508c2ecf20Sopenharmony_ci			     rate <= DESC_RATEVHT2SS_MCS9))
26518c2ecf20Sopenharmony_ci				txpower += rtlefuse->txpwr_ht40diff[path][TX_1S];
26528c2ecf20Sopenharmony_ci			if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
26538c2ecf20Sopenharmony_ci			    (DESC_RATEVHT2SS_MCS0 <= rate &&
26548c2ecf20Sopenharmony_ci			     rate <= DESC_RATEVHT2SS_MCS9))
26558c2ecf20Sopenharmony_ci				txpower += rtlefuse->txpwr_ht40diff[path][TX_2S];
26568c2ecf20Sopenharmony_ci		}
26578c2ecf20Sopenharmony_ci	} else {
26588c2ecf20Sopenharmony_ci		if (DESC_RATE6M <= rate)
26598c2ecf20Sopenharmony_ci			txpower = rtlefuse->txpwr_5g_bw40base[path][index];
26608c2ecf20Sopenharmony_ci		else
26618c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_WARNING,
26628c2ecf20Sopenharmony_ci				"INVALID Rate.\n");
26638c2ecf20Sopenharmony_ci
26648c2ecf20Sopenharmony_ci		if (DESC_RATE6M <= rate && rate <= DESC_RATE54M &&
26658c2ecf20Sopenharmony_ci		    !RTL8821AE_RX_HAL_IS_CCK_RATE(rate))
26668c2ecf20Sopenharmony_ci			txpower += rtlefuse->txpwr_5g_ofdmdiff[path][TX_1S];
26678c2ecf20Sopenharmony_ci
26688c2ecf20Sopenharmony_ci		if (bandwidth == HT_CHANNEL_WIDTH_20) {
26698c2ecf20Sopenharmony_ci			if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
26708c2ecf20Sopenharmony_ci			    (DESC_RATEVHT1SS_MCS0 <= rate &&
26718c2ecf20Sopenharmony_ci			     rate <= DESC_RATEVHT2SS_MCS9))
26728c2ecf20Sopenharmony_ci				txpower += rtlefuse->txpwr_5g_bw20diff[path][TX_1S];
26738c2ecf20Sopenharmony_ci			if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
26748c2ecf20Sopenharmony_ci			    (DESC_RATEVHT2SS_MCS0 <= rate &&
26758c2ecf20Sopenharmony_ci			     rate <= DESC_RATEVHT2SS_MCS9))
26768c2ecf20Sopenharmony_ci				txpower += rtlefuse->txpwr_5g_bw20diff[path][TX_2S];
26778c2ecf20Sopenharmony_ci		} else if (bandwidth == HT_CHANNEL_WIDTH_20_40) {
26788c2ecf20Sopenharmony_ci			if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
26798c2ecf20Sopenharmony_ci			    (DESC_RATEVHT1SS_MCS0 <= rate &&
26808c2ecf20Sopenharmony_ci			     rate <= DESC_RATEVHT2SS_MCS9))
26818c2ecf20Sopenharmony_ci				txpower += rtlefuse->txpwr_5g_bw40diff[path][TX_1S];
26828c2ecf20Sopenharmony_ci			if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
26838c2ecf20Sopenharmony_ci			    (DESC_RATEVHT2SS_MCS0 <= rate &&
26848c2ecf20Sopenharmony_ci			     rate <= DESC_RATEVHT2SS_MCS9))
26858c2ecf20Sopenharmony_ci				txpower += rtlefuse->txpwr_5g_bw40diff[path][TX_2S];
26868c2ecf20Sopenharmony_ci		} else if (bandwidth == HT_CHANNEL_WIDTH_80) {
26878c2ecf20Sopenharmony_ci			u8 i;
26888c2ecf20Sopenharmony_ci
26898c2ecf20Sopenharmony_ci			for (i = 0; i < sizeof(channel5g_80m) / sizeof(u8); ++i)
26908c2ecf20Sopenharmony_ci				if (channel5g_80m[i] == channel)
26918c2ecf20Sopenharmony_ci					index = i;
26928c2ecf20Sopenharmony_ci
26938c2ecf20Sopenharmony_ci			if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
26948c2ecf20Sopenharmony_ci			    (DESC_RATEVHT1SS_MCS0 <= rate &&
26958c2ecf20Sopenharmony_ci			     rate <= DESC_RATEVHT2SS_MCS9))
26968c2ecf20Sopenharmony_ci				txpower = rtlefuse->txpwr_5g_bw80base[path][index]
26978c2ecf20Sopenharmony_ci					+ rtlefuse->txpwr_5g_bw80diff[path][TX_1S];
26988c2ecf20Sopenharmony_ci			if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
26998c2ecf20Sopenharmony_ci			    (DESC_RATEVHT2SS_MCS0 <= rate &&
27008c2ecf20Sopenharmony_ci			     rate <= DESC_RATEVHT2SS_MCS9))
27018c2ecf20Sopenharmony_ci				txpower = rtlefuse->txpwr_5g_bw80base[path][index]
27028c2ecf20Sopenharmony_ci					+ rtlefuse->txpwr_5g_bw80diff[path][TX_1S]
27038c2ecf20Sopenharmony_ci					+ rtlefuse->txpwr_5g_bw80diff[path][TX_2S];
27048c2ecf20Sopenharmony_ci		    }
27058c2ecf20Sopenharmony_ci	}
27068c2ecf20Sopenharmony_ci	if (rtlefuse->eeprom_regulatory != 2)
27078c2ecf20Sopenharmony_ci		powerdiff_byrate =
27088c2ecf20Sopenharmony_ci		  _rtl8821ae_phy_get_txpower_by_rate(hw, (u8)(!in_24g),
27098c2ecf20Sopenharmony_ci						     path, rate);
27108c2ecf20Sopenharmony_ci
27118c2ecf20Sopenharmony_ci	if (rate == DESC_RATEVHT1SS_MCS8 || rate == DESC_RATEVHT1SS_MCS9 ||
27128c2ecf20Sopenharmony_ci	    rate == DESC_RATEVHT2SS_MCS8 || rate == DESC_RATEVHT2SS_MCS9)
27138c2ecf20Sopenharmony_ci		txpower -= powerdiff_byrate;
27148c2ecf20Sopenharmony_ci	else
27158c2ecf20Sopenharmony_ci		txpower += powerdiff_byrate;
27168c2ecf20Sopenharmony_ci
27178c2ecf20Sopenharmony_ci	if (rate > DESC_RATE11M)
27188c2ecf20Sopenharmony_ci		txpower += rtlpriv->dm.remnant_ofdm_swing_idx[path];
27198c2ecf20Sopenharmony_ci	else
27208c2ecf20Sopenharmony_ci		txpower += rtlpriv->dm.remnant_cck_idx;
27218c2ecf20Sopenharmony_ci
27228c2ecf20Sopenharmony_ci	if (txpower > MAX_POWER_INDEX)
27238c2ecf20Sopenharmony_ci		txpower = MAX_POWER_INDEX;
27248c2ecf20Sopenharmony_ci
27258c2ecf20Sopenharmony_ci	return txpower;
27268c2ecf20Sopenharmony_ci}
27278c2ecf20Sopenharmony_ci
27288c2ecf20Sopenharmony_cistatic void _rtl8821ae_phy_set_txpower_index(struct ieee80211_hw *hw,
27298c2ecf20Sopenharmony_ci					     u8 power_index, u8 path, u8 rate)
27308c2ecf20Sopenharmony_ci{
27318c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
27328c2ecf20Sopenharmony_ci
27338c2ecf20Sopenharmony_ci	if (path == RF90_PATH_A) {
27348c2ecf20Sopenharmony_ci		switch (rate) {
27358c2ecf20Sopenharmony_ci		case DESC_RATE1M:
27368c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1,
27378c2ecf20Sopenharmony_ci				      MASKBYTE0, power_index);
27388c2ecf20Sopenharmony_ci			break;
27398c2ecf20Sopenharmony_ci		case DESC_RATE2M:
27408c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1,
27418c2ecf20Sopenharmony_ci				      MASKBYTE1, power_index);
27428c2ecf20Sopenharmony_ci			break;
27438c2ecf20Sopenharmony_ci		case DESC_RATE5_5M:
27448c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1,
27458c2ecf20Sopenharmony_ci				      MASKBYTE2, power_index);
27468c2ecf20Sopenharmony_ci			break;
27478c2ecf20Sopenharmony_ci		case DESC_RATE11M:
27488c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1,
27498c2ecf20Sopenharmony_ci				      MASKBYTE3, power_index);
27508c2ecf20Sopenharmony_ci			break;
27518c2ecf20Sopenharmony_ci		case DESC_RATE6M:
27528c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6,
27538c2ecf20Sopenharmony_ci				      MASKBYTE0, power_index);
27548c2ecf20Sopenharmony_ci			break;
27558c2ecf20Sopenharmony_ci		case DESC_RATE9M:
27568c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6,
27578c2ecf20Sopenharmony_ci				      MASKBYTE1, power_index);
27588c2ecf20Sopenharmony_ci			break;
27598c2ecf20Sopenharmony_ci		case DESC_RATE12M:
27608c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6,
27618c2ecf20Sopenharmony_ci				      MASKBYTE2, power_index);
27628c2ecf20Sopenharmony_ci			break;
27638c2ecf20Sopenharmony_ci		case DESC_RATE18M:
27648c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6,
27658c2ecf20Sopenharmony_ci				      MASKBYTE3, power_index);
27668c2ecf20Sopenharmony_ci			break;
27678c2ecf20Sopenharmony_ci		case DESC_RATE24M:
27688c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24,
27698c2ecf20Sopenharmony_ci				      MASKBYTE0, power_index);
27708c2ecf20Sopenharmony_ci			break;
27718c2ecf20Sopenharmony_ci		case DESC_RATE36M:
27728c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24,
27738c2ecf20Sopenharmony_ci				      MASKBYTE1, power_index);
27748c2ecf20Sopenharmony_ci			break;
27758c2ecf20Sopenharmony_ci		case DESC_RATE48M:
27768c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24,
27778c2ecf20Sopenharmony_ci				      MASKBYTE2, power_index);
27788c2ecf20Sopenharmony_ci			break;
27798c2ecf20Sopenharmony_ci		case DESC_RATE54M:
27808c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24,
27818c2ecf20Sopenharmony_ci				      MASKBYTE3, power_index);
27828c2ecf20Sopenharmony_ci			break;
27838c2ecf20Sopenharmony_ci		case DESC_RATEMCS0:
27848c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
27858c2ecf20Sopenharmony_ci				      MASKBYTE0, power_index);
27868c2ecf20Sopenharmony_ci			break;
27878c2ecf20Sopenharmony_ci		case DESC_RATEMCS1:
27888c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
27898c2ecf20Sopenharmony_ci				      MASKBYTE1, power_index);
27908c2ecf20Sopenharmony_ci			break;
27918c2ecf20Sopenharmony_ci		case DESC_RATEMCS2:
27928c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
27938c2ecf20Sopenharmony_ci				      MASKBYTE2, power_index);
27948c2ecf20Sopenharmony_ci			break;
27958c2ecf20Sopenharmony_ci		case DESC_RATEMCS3:
27968c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
27978c2ecf20Sopenharmony_ci				      MASKBYTE3, power_index);
27988c2ecf20Sopenharmony_ci			break;
27998c2ecf20Sopenharmony_ci		case DESC_RATEMCS4:
28008c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
28018c2ecf20Sopenharmony_ci				      MASKBYTE0, power_index);
28028c2ecf20Sopenharmony_ci			break;
28038c2ecf20Sopenharmony_ci		case DESC_RATEMCS5:
28048c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
28058c2ecf20Sopenharmony_ci				      MASKBYTE1, power_index);
28068c2ecf20Sopenharmony_ci			break;
28078c2ecf20Sopenharmony_ci		case DESC_RATEMCS6:
28088c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
28098c2ecf20Sopenharmony_ci				      MASKBYTE2, power_index);
28108c2ecf20Sopenharmony_ci			break;
28118c2ecf20Sopenharmony_ci		case DESC_RATEMCS7:
28128c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
28138c2ecf20Sopenharmony_ci				      MASKBYTE3, power_index);
28148c2ecf20Sopenharmony_ci			break;
28158c2ecf20Sopenharmony_ci		case DESC_RATEMCS8:
28168c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
28178c2ecf20Sopenharmony_ci				      MASKBYTE0, power_index);
28188c2ecf20Sopenharmony_ci			break;
28198c2ecf20Sopenharmony_ci		case DESC_RATEMCS9:
28208c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
28218c2ecf20Sopenharmony_ci				      MASKBYTE1, power_index);
28228c2ecf20Sopenharmony_ci			break;
28238c2ecf20Sopenharmony_ci		case DESC_RATEMCS10:
28248c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
28258c2ecf20Sopenharmony_ci				      MASKBYTE2, power_index);
28268c2ecf20Sopenharmony_ci			break;
28278c2ecf20Sopenharmony_ci		case DESC_RATEMCS11:
28288c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
28298c2ecf20Sopenharmony_ci				      MASKBYTE3, power_index);
28308c2ecf20Sopenharmony_ci			break;
28318c2ecf20Sopenharmony_ci		case DESC_RATEMCS12:
28328c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
28338c2ecf20Sopenharmony_ci				      MASKBYTE0, power_index);
28348c2ecf20Sopenharmony_ci			break;
28358c2ecf20Sopenharmony_ci		case DESC_RATEMCS13:
28368c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
28378c2ecf20Sopenharmony_ci				      MASKBYTE1, power_index);
28388c2ecf20Sopenharmony_ci			break;
28398c2ecf20Sopenharmony_ci		case DESC_RATEMCS14:
28408c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
28418c2ecf20Sopenharmony_ci				      MASKBYTE2, power_index);
28428c2ecf20Sopenharmony_ci			break;
28438c2ecf20Sopenharmony_ci		case DESC_RATEMCS15:
28448c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
28458c2ecf20Sopenharmony_ci				      MASKBYTE3, power_index);
28468c2ecf20Sopenharmony_ci			break;
28478c2ecf20Sopenharmony_ci		case DESC_RATEVHT1SS_MCS0:
28488c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0,
28498c2ecf20Sopenharmony_ci				      MASKBYTE0, power_index);
28508c2ecf20Sopenharmony_ci			break;
28518c2ecf20Sopenharmony_ci		case DESC_RATEVHT1SS_MCS1:
28528c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0,
28538c2ecf20Sopenharmony_ci				      MASKBYTE1, power_index);
28548c2ecf20Sopenharmony_ci			break;
28558c2ecf20Sopenharmony_ci		case DESC_RATEVHT1SS_MCS2:
28568c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0,
28578c2ecf20Sopenharmony_ci				      MASKBYTE2, power_index);
28588c2ecf20Sopenharmony_ci			break;
28598c2ecf20Sopenharmony_ci		case DESC_RATEVHT1SS_MCS3:
28608c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0,
28618c2ecf20Sopenharmony_ci				      MASKBYTE3, power_index);
28628c2ecf20Sopenharmony_ci			break;
28638c2ecf20Sopenharmony_ci		case DESC_RATEVHT1SS_MCS4:
28648c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4,
28658c2ecf20Sopenharmony_ci				      MASKBYTE0, power_index);
28668c2ecf20Sopenharmony_ci			break;
28678c2ecf20Sopenharmony_ci		case DESC_RATEVHT1SS_MCS5:
28688c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4,
28698c2ecf20Sopenharmony_ci				      MASKBYTE1, power_index);
28708c2ecf20Sopenharmony_ci			break;
28718c2ecf20Sopenharmony_ci		case DESC_RATEVHT1SS_MCS6:
28728c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4,
28738c2ecf20Sopenharmony_ci				      MASKBYTE2, power_index);
28748c2ecf20Sopenharmony_ci			break;
28758c2ecf20Sopenharmony_ci		case DESC_RATEVHT1SS_MCS7:
28768c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4,
28778c2ecf20Sopenharmony_ci				      MASKBYTE3, power_index);
28788c2ecf20Sopenharmony_ci			break;
28798c2ecf20Sopenharmony_ci		case DESC_RATEVHT1SS_MCS8:
28808c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8,
28818c2ecf20Sopenharmony_ci				      MASKBYTE0, power_index);
28828c2ecf20Sopenharmony_ci			break;
28838c2ecf20Sopenharmony_ci		case DESC_RATEVHT1SS_MCS9:
28848c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8,
28858c2ecf20Sopenharmony_ci				      MASKBYTE1, power_index);
28868c2ecf20Sopenharmony_ci			break;
28878c2ecf20Sopenharmony_ci		case DESC_RATEVHT2SS_MCS0:
28888c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8,
28898c2ecf20Sopenharmony_ci				      MASKBYTE2, power_index);
28908c2ecf20Sopenharmony_ci			break;
28918c2ecf20Sopenharmony_ci		case DESC_RATEVHT2SS_MCS1:
28928c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8,
28938c2ecf20Sopenharmony_ci				      MASKBYTE3, power_index);
28948c2ecf20Sopenharmony_ci			break;
28958c2ecf20Sopenharmony_ci		case DESC_RATEVHT2SS_MCS2:
28968c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2,
28978c2ecf20Sopenharmony_ci				      MASKBYTE0, power_index);
28988c2ecf20Sopenharmony_ci			break;
28998c2ecf20Sopenharmony_ci		case DESC_RATEVHT2SS_MCS3:
29008c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2,
29018c2ecf20Sopenharmony_ci				      MASKBYTE1, power_index);
29028c2ecf20Sopenharmony_ci			break;
29038c2ecf20Sopenharmony_ci		case DESC_RATEVHT2SS_MCS4:
29048c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2,
29058c2ecf20Sopenharmony_ci				      MASKBYTE2, power_index);
29068c2ecf20Sopenharmony_ci			break;
29078c2ecf20Sopenharmony_ci		case DESC_RATEVHT2SS_MCS5:
29088c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2,
29098c2ecf20Sopenharmony_ci				      MASKBYTE3, power_index);
29108c2ecf20Sopenharmony_ci			break;
29118c2ecf20Sopenharmony_ci		case DESC_RATEVHT2SS_MCS6:
29128c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6,
29138c2ecf20Sopenharmony_ci				      MASKBYTE0, power_index);
29148c2ecf20Sopenharmony_ci			break;
29158c2ecf20Sopenharmony_ci		case DESC_RATEVHT2SS_MCS7:
29168c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6,
29178c2ecf20Sopenharmony_ci				      MASKBYTE1, power_index);
29188c2ecf20Sopenharmony_ci			break;
29198c2ecf20Sopenharmony_ci		case DESC_RATEVHT2SS_MCS8:
29208c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6,
29218c2ecf20Sopenharmony_ci				      MASKBYTE2, power_index);
29228c2ecf20Sopenharmony_ci			break;
29238c2ecf20Sopenharmony_ci		case DESC_RATEVHT2SS_MCS9:
29248c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6,
29258c2ecf20Sopenharmony_ci				      MASKBYTE3, power_index);
29268c2ecf20Sopenharmony_ci			break;
29278c2ecf20Sopenharmony_ci		default:
29288c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
29298c2ecf20Sopenharmony_ci				"Invalid Rate!!\n");
29308c2ecf20Sopenharmony_ci			break;
29318c2ecf20Sopenharmony_ci		}
29328c2ecf20Sopenharmony_ci	} else if (path == RF90_PATH_B) {
29338c2ecf20Sopenharmony_ci		switch (rate) {
29348c2ecf20Sopenharmony_ci		case DESC_RATE1M:
29358c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1,
29368c2ecf20Sopenharmony_ci				      MASKBYTE0, power_index);
29378c2ecf20Sopenharmony_ci			break;
29388c2ecf20Sopenharmony_ci		case DESC_RATE2M:
29398c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1,
29408c2ecf20Sopenharmony_ci				      MASKBYTE1, power_index);
29418c2ecf20Sopenharmony_ci			break;
29428c2ecf20Sopenharmony_ci		case DESC_RATE5_5M:
29438c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1,
29448c2ecf20Sopenharmony_ci				      MASKBYTE2, power_index);
29458c2ecf20Sopenharmony_ci			break;
29468c2ecf20Sopenharmony_ci		case DESC_RATE11M:
29478c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1,
29488c2ecf20Sopenharmony_ci				      MASKBYTE3, power_index);
29498c2ecf20Sopenharmony_ci			break;
29508c2ecf20Sopenharmony_ci		case DESC_RATE6M:
29518c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6,
29528c2ecf20Sopenharmony_ci				      MASKBYTE0, power_index);
29538c2ecf20Sopenharmony_ci			break;
29548c2ecf20Sopenharmony_ci		case DESC_RATE9M:
29558c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6,
29568c2ecf20Sopenharmony_ci				      MASKBYTE1, power_index);
29578c2ecf20Sopenharmony_ci			break;
29588c2ecf20Sopenharmony_ci		case DESC_RATE12M:
29598c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6,
29608c2ecf20Sopenharmony_ci				      MASKBYTE2, power_index);
29618c2ecf20Sopenharmony_ci			break;
29628c2ecf20Sopenharmony_ci		case DESC_RATE18M:
29638c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6,
29648c2ecf20Sopenharmony_ci				      MASKBYTE3, power_index);
29658c2ecf20Sopenharmony_ci			break;
29668c2ecf20Sopenharmony_ci		case DESC_RATE24M:
29678c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24,
29688c2ecf20Sopenharmony_ci				      MASKBYTE0, power_index);
29698c2ecf20Sopenharmony_ci			break;
29708c2ecf20Sopenharmony_ci		case DESC_RATE36M:
29718c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24,
29728c2ecf20Sopenharmony_ci				      MASKBYTE1, power_index);
29738c2ecf20Sopenharmony_ci			break;
29748c2ecf20Sopenharmony_ci		case DESC_RATE48M:
29758c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24,
29768c2ecf20Sopenharmony_ci				      MASKBYTE2, power_index);
29778c2ecf20Sopenharmony_ci			break;
29788c2ecf20Sopenharmony_ci		case DESC_RATE54M:
29798c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24,
29808c2ecf20Sopenharmony_ci				      MASKBYTE3, power_index);
29818c2ecf20Sopenharmony_ci			break;
29828c2ecf20Sopenharmony_ci		case DESC_RATEMCS0:
29838c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
29848c2ecf20Sopenharmony_ci				      MASKBYTE0, power_index);
29858c2ecf20Sopenharmony_ci			break;
29868c2ecf20Sopenharmony_ci		case DESC_RATEMCS1:
29878c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
29888c2ecf20Sopenharmony_ci				      MASKBYTE1, power_index);
29898c2ecf20Sopenharmony_ci			break;
29908c2ecf20Sopenharmony_ci		case DESC_RATEMCS2:
29918c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
29928c2ecf20Sopenharmony_ci				      MASKBYTE2, power_index);
29938c2ecf20Sopenharmony_ci			break;
29948c2ecf20Sopenharmony_ci		case DESC_RATEMCS3:
29958c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
29968c2ecf20Sopenharmony_ci				      MASKBYTE3, power_index);
29978c2ecf20Sopenharmony_ci			break;
29988c2ecf20Sopenharmony_ci		case DESC_RATEMCS4:
29998c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
30008c2ecf20Sopenharmony_ci				      MASKBYTE0, power_index);
30018c2ecf20Sopenharmony_ci			break;
30028c2ecf20Sopenharmony_ci		case DESC_RATEMCS5:
30038c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
30048c2ecf20Sopenharmony_ci				      MASKBYTE1, power_index);
30058c2ecf20Sopenharmony_ci			break;
30068c2ecf20Sopenharmony_ci		case DESC_RATEMCS6:
30078c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
30088c2ecf20Sopenharmony_ci				      MASKBYTE2, power_index);
30098c2ecf20Sopenharmony_ci			break;
30108c2ecf20Sopenharmony_ci		case DESC_RATEMCS7:
30118c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
30128c2ecf20Sopenharmony_ci				      MASKBYTE3, power_index);
30138c2ecf20Sopenharmony_ci			break;
30148c2ecf20Sopenharmony_ci		case DESC_RATEMCS8:
30158c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
30168c2ecf20Sopenharmony_ci				      MASKBYTE0, power_index);
30178c2ecf20Sopenharmony_ci			break;
30188c2ecf20Sopenharmony_ci		case DESC_RATEMCS9:
30198c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
30208c2ecf20Sopenharmony_ci				      MASKBYTE1, power_index);
30218c2ecf20Sopenharmony_ci			break;
30228c2ecf20Sopenharmony_ci		case DESC_RATEMCS10:
30238c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
30248c2ecf20Sopenharmony_ci				      MASKBYTE2, power_index);
30258c2ecf20Sopenharmony_ci			break;
30268c2ecf20Sopenharmony_ci		case DESC_RATEMCS11:
30278c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
30288c2ecf20Sopenharmony_ci				      MASKBYTE3, power_index);
30298c2ecf20Sopenharmony_ci			break;
30308c2ecf20Sopenharmony_ci		case DESC_RATEMCS12:
30318c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
30328c2ecf20Sopenharmony_ci				      MASKBYTE0, power_index);
30338c2ecf20Sopenharmony_ci			break;
30348c2ecf20Sopenharmony_ci		case DESC_RATEMCS13:
30358c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
30368c2ecf20Sopenharmony_ci				      MASKBYTE1, power_index);
30378c2ecf20Sopenharmony_ci			break;
30388c2ecf20Sopenharmony_ci		case DESC_RATEMCS14:
30398c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
30408c2ecf20Sopenharmony_ci				      MASKBYTE2, power_index);
30418c2ecf20Sopenharmony_ci			break;
30428c2ecf20Sopenharmony_ci		case DESC_RATEMCS15:
30438c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
30448c2ecf20Sopenharmony_ci				      MASKBYTE3, power_index);
30458c2ecf20Sopenharmony_ci			break;
30468c2ecf20Sopenharmony_ci		case DESC_RATEVHT1SS_MCS0:
30478c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0,
30488c2ecf20Sopenharmony_ci				      MASKBYTE0, power_index);
30498c2ecf20Sopenharmony_ci			break;
30508c2ecf20Sopenharmony_ci		case DESC_RATEVHT1SS_MCS1:
30518c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0,
30528c2ecf20Sopenharmony_ci				      MASKBYTE1, power_index);
30538c2ecf20Sopenharmony_ci			break;
30548c2ecf20Sopenharmony_ci		case DESC_RATEVHT1SS_MCS2:
30558c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0,
30568c2ecf20Sopenharmony_ci				      MASKBYTE2, power_index);
30578c2ecf20Sopenharmony_ci			break;
30588c2ecf20Sopenharmony_ci		case DESC_RATEVHT1SS_MCS3:
30598c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0,
30608c2ecf20Sopenharmony_ci				      MASKBYTE3, power_index);
30618c2ecf20Sopenharmony_ci			break;
30628c2ecf20Sopenharmony_ci		case DESC_RATEVHT1SS_MCS4:
30638c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4,
30648c2ecf20Sopenharmony_ci				      MASKBYTE0, power_index);
30658c2ecf20Sopenharmony_ci			break;
30668c2ecf20Sopenharmony_ci		case DESC_RATEVHT1SS_MCS5:
30678c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4,
30688c2ecf20Sopenharmony_ci				      MASKBYTE1, power_index);
30698c2ecf20Sopenharmony_ci			break;
30708c2ecf20Sopenharmony_ci		case DESC_RATEVHT1SS_MCS6:
30718c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4,
30728c2ecf20Sopenharmony_ci				      MASKBYTE2, power_index);
30738c2ecf20Sopenharmony_ci			break;
30748c2ecf20Sopenharmony_ci		case DESC_RATEVHT1SS_MCS7:
30758c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4,
30768c2ecf20Sopenharmony_ci				      MASKBYTE3, power_index);
30778c2ecf20Sopenharmony_ci			break;
30788c2ecf20Sopenharmony_ci		case DESC_RATEVHT1SS_MCS8:
30798c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8,
30808c2ecf20Sopenharmony_ci				      MASKBYTE0, power_index);
30818c2ecf20Sopenharmony_ci			break;
30828c2ecf20Sopenharmony_ci		case DESC_RATEVHT1SS_MCS9:
30838c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8,
30848c2ecf20Sopenharmony_ci				      MASKBYTE1, power_index);
30858c2ecf20Sopenharmony_ci			break;
30868c2ecf20Sopenharmony_ci		case DESC_RATEVHT2SS_MCS0:
30878c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8,
30888c2ecf20Sopenharmony_ci				      MASKBYTE2, power_index);
30898c2ecf20Sopenharmony_ci			break;
30908c2ecf20Sopenharmony_ci		case DESC_RATEVHT2SS_MCS1:
30918c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8,
30928c2ecf20Sopenharmony_ci				      MASKBYTE3, power_index);
30938c2ecf20Sopenharmony_ci			break;
30948c2ecf20Sopenharmony_ci		case DESC_RATEVHT2SS_MCS2:
30958c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2,
30968c2ecf20Sopenharmony_ci				      MASKBYTE0, power_index);
30978c2ecf20Sopenharmony_ci			break;
30988c2ecf20Sopenharmony_ci		case DESC_RATEVHT2SS_MCS3:
30998c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2,
31008c2ecf20Sopenharmony_ci				      MASKBYTE1, power_index);
31018c2ecf20Sopenharmony_ci			break;
31028c2ecf20Sopenharmony_ci		case DESC_RATEVHT2SS_MCS4:
31038c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2,
31048c2ecf20Sopenharmony_ci				      MASKBYTE2, power_index);
31058c2ecf20Sopenharmony_ci			break;
31068c2ecf20Sopenharmony_ci		case DESC_RATEVHT2SS_MCS5:
31078c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2,
31088c2ecf20Sopenharmony_ci				      MASKBYTE3, power_index);
31098c2ecf20Sopenharmony_ci			break;
31108c2ecf20Sopenharmony_ci		case DESC_RATEVHT2SS_MCS6:
31118c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6,
31128c2ecf20Sopenharmony_ci				      MASKBYTE0, power_index);
31138c2ecf20Sopenharmony_ci			break;
31148c2ecf20Sopenharmony_ci		case DESC_RATEVHT2SS_MCS7:
31158c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6,
31168c2ecf20Sopenharmony_ci				      MASKBYTE1, power_index);
31178c2ecf20Sopenharmony_ci			break;
31188c2ecf20Sopenharmony_ci		case DESC_RATEVHT2SS_MCS8:
31198c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6,
31208c2ecf20Sopenharmony_ci				      MASKBYTE2, power_index);
31218c2ecf20Sopenharmony_ci			break;
31228c2ecf20Sopenharmony_ci		case DESC_RATEVHT2SS_MCS9:
31238c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6,
31248c2ecf20Sopenharmony_ci				      MASKBYTE3, power_index);
31258c2ecf20Sopenharmony_ci			break;
31268c2ecf20Sopenharmony_ci		default:
31278c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
31288c2ecf20Sopenharmony_ci				"Invalid Rate!!\n");
31298c2ecf20Sopenharmony_ci			break;
31308c2ecf20Sopenharmony_ci		}
31318c2ecf20Sopenharmony_ci	} else {
31328c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
31338c2ecf20Sopenharmony_ci			"Invalid RFPath!!\n");
31348c2ecf20Sopenharmony_ci	}
31358c2ecf20Sopenharmony_ci}
31368c2ecf20Sopenharmony_ci
31378c2ecf20Sopenharmony_cistatic void _rtl8821ae_phy_set_txpower_level_by_path(struct ieee80211_hw *hw,
31388c2ecf20Sopenharmony_ci						     u8 *array, u8 path,
31398c2ecf20Sopenharmony_ci						     u8 channel, u8 size)
31408c2ecf20Sopenharmony_ci{
31418c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
31428c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
31438c2ecf20Sopenharmony_ci	u8 i;
31448c2ecf20Sopenharmony_ci	u8 power_index;
31458c2ecf20Sopenharmony_ci
31468c2ecf20Sopenharmony_ci	for (i = 0; i < size; i++) {
31478c2ecf20Sopenharmony_ci		power_index =
31488c2ecf20Sopenharmony_ci		  _rtl8821ae_get_txpower_index(hw, path, array[i],
31498c2ecf20Sopenharmony_ci					       rtlphy->current_chan_bw,
31508c2ecf20Sopenharmony_ci					       channel);
31518c2ecf20Sopenharmony_ci		_rtl8821ae_phy_set_txpower_index(hw, power_index, path,
31528c2ecf20Sopenharmony_ci						 array[i]);
31538c2ecf20Sopenharmony_ci	}
31548c2ecf20Sopenharmony_ci}
31558c2ecf20Sopenharmony_ci
31568c2ecf20Sopenharmony_cistatic void _rtl8821ae_phy_txpower_training_by_path(struct ieee80211_hw *hw,
31578c2ecf20Sopenharmony_ci						    u8 bw, u8 channel, u8 path)
31588c2ecf20Sopenharmony_ci{
31598c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
31608c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
31618c2ecf20Sopenharmony_ci
31628c2ecf20Sopenharmony_ci	u8 i;
31638c2ecf20Sopenharmony_ci	u32 power_level, data, offset;
31648c2ecf20Sopenharmony_ci
31658c2ecf20Sopenharmony_ci	if (path >= rtlphy->num_total_rfpath)
31668c2ecf20Sopenharmony_ci		return;
31678c2ecf20Sopenharmony_ci
31688c2ecf20Sopenharmony_ci	data = 0;
31698c2ecf20Sopenharmony_ci	if (path == RF90_PATH_A) {
31708c2ecf20Sopenharmony_ci		power_level =
31718c2ecf20Sopenharmony_ci			_rtl8821ae_get_txpower_index(hw, RF90_PATH_A,
31728c2ecf20Sopenharmony_ci			DESC_RATEMCS7, bw, channel);
31738c2ecf20Sopenharmony_ci		offset =  RA_TXPWRTRAING;
31748c2ecf20Sopenharmony_ci	} else {
31758c2ecf20Sopenharmony_ci		power_level =
31768c2ecf20Sopenharmony_ci			_rtl8821ae_get_txpower_index(hw, RF90_PATH_B,
31778c2ecf20Sopenharmony_ci			DESC_RATEMCS7, bw, channel);
31788c2ecf20Sopenharmony_ci		offset =  RB_TXPWRTRAING;
31798c2ecf20Sopenharmony_ci	}
31808c2ecf20Sopenharmony_ci
31818c2ecf20Sopenharmony_ci	for (i = 0; i < 3; i++) {
31828c2ecf20Sopenharmony_ci		if (i == 0)
31838c2ecf20Sopenharmony_ci			power_level = power_level - 10;
31848c2ecf20Sopenharmony_ci		else if (i == 1)
31858c2ecf20Sopenharmony_ci			power_level = power_level - 8;
31868c2ecf20Sopenharmony_ci		else
31878c2ecf20Sopenharmony_ci			power_level = power_level - 6;
31888c2ecf20Sopenharmony_ci
31898c2ecf20Sopenharmony_ci		data |= (((power_level > 2) ? (power_level) : 2) << (i * 8));
31908c2ecf20Sopenharmony_ci	}
31918c2ecf20Sopenharmony_ci	rtl_set_bbreg(hw, offset, 0xffffff, data);
31928c2ecf20Sopenharmony_ci}
31938c2ecf20Sopenharmony_ci
31948c2ecf20Sopenharmony_civoid rtl8821ae_phy_set_txpower_level_by_path(struct ieee80211_hw *hw,
31958c2ecf20Sopenharmony_ci					     u8 channel, u8 path)
31968c2ecf20Sopenharmony_ci{
31978c2ecf20Sopenharmony_ci	/* struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); */
31988c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
31998c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
32008c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
32018c2ecf20Sopenharmony_ci	u8 cck_rates[]  = {DESC_RATE1M, DESC_RATE2M, DESC_RATE5_5M,
32028c2ecf20Sopenharmony_ci			      DESC_RATE11M};
32038c2ecf20Sopenharmony_ci	u8 sizes_of_cck_retes = 4;
32048c2ecf20Sopenharmony_ci	u8 ofdm_rates[]  = {DESC_RATE6M, DESC_RATE9M, DESC_RATE12M,
32058c2ecf20Sopenharmony_ci				DESC_RATE18M, DESC_RATE24M, DESC_RATE36M,
32068c2ecf20Sopenharmony_ci				DESC_RATE48M, DESC_RATE54M};
32078c2ecf20Sopenharmony_ci	u8 sizes_of_ofdm_retes = 8;
32088c2ecf20Sopenharmony_ci	u8 ht_rates_1t[]  = {DESC_RATEMCS0, DESC_RATEMCS1, DESC_RATEMCS2,
32098c2ecf20Sopenharmony_ci				DESC_RATEMCS3, DESC_RATEMCS4, DESC_RATEMCS5,
32108c2ecf20Sopenharmony_ci				DESC_RATEMCS6, DESC_RATEMCS7};
32118c2ecf20Sopenharmony_ci	u8 sizes_of_ht_retes_1t = 8;
32128c2ecf20Sopenharmony_ci	u8 ht_rates_2t[]  = {DESC_RATEMCS8, DESC_RATEMCS9,
32138c2ecf20Sopenharmony_ci				DESC_RATEMCS10, DESC_RATEMCS11,
32148c2ecf20Sopenharmony_ci				DESC_RATEMCS12, DESC_RATEMCS13,
32158c2ecf20Sopenharmony_ci				DESC_RATEMCS14, DESC_RATEMCS15};
32168c2ecf20Sopenharmony_ci	u8 sizes_of_ht_retes_2t = 8;
32178c2ecf20Sopenharmony_ci	u8 vht_rates_1t[]  = {DESC_RATEVHT1SS_MCS0, DESC_RATEVHT1SS_MCS1,
32188c2ecf20Sopenharmony_ci				DESC_RATEVHT1SS_MCS2, DESC_RATEVHT1SS_MCS3,
32198c2ecf20Sopenharmony_ci				DESC_RATEVHT1SS_MCS4, DESC_RATEVHT1SS_MCS5,
32208c2ecf20Sopenharmony_ci				DESC_RATEVHT1SS_MCS6, DESC_RATEVHT1SS_MCS7,
32218c2ecf20Sopenharmony_ci			     DESC_RATEVHT1SS_MCS8, DESC_RATEVHT1SS_MCS9};
32228c2ecf20Sopenharmony_ci	u8 vht_rates_2t[]  = {DESC_RATEVHT2SS_MCS0, DESC_RATEVHT2SS_MCS1,
32238c2ecf20Sopenharmony_ci				DESC_RATEVHT2SS_MCS2, DESC_RATEVHT2SS_MCS3,
32248c2ecf20Sopenharmony_ci				DESC_RATEVHT2SS_MCS4, DESC_RATEVHT2SS_MCS5,
32258c2ecf20Sopenharmony_ci				DESC_RATEVHT2SS_MCS6, DESC_RATEVHT2SS_MCS7,
32268c2ecf20Sopenharmony_ci				DESC_RATEVHT2SS_MCS8, DESC_RATEVHT2SS_MCS9};
32278c2ecf20Sopenharmony_ci	u8 sizes_of_vht_retes = 10;
32288c2ecf20Sopenharmony_ci
32298c2ecf20Sopenharmony_ci	if (rtlhal->current_bandtype == BAND_ON_2_4G)
32308c2ecf20Sopenharmony_ci		_rtl8821ae_phy_set_txpower_level_by_path(hw, cck_rates, path, channel,
32318c2ecf20Sopenharmony_ci							 sizes_of_cck_retes);
32328c2ecf20Sopenharmony_ci
32338c2ecf20Sopenharmony_ci	_rtl8821ae_phy_set_txpower_level_by_path(hw, ofdm_rates, path, channel,
32348c2ecf20Sopenharmony_ci						 sizes_of_ofdm_retes);
32358c2ecf20Sopenharmony_ci	_rtl8821ae_phy_set_txpower_level_by_path(hw, ht_rates_1t, path, channel,
32368c2ecf20Sopenharmony_ci						 sizes_of_ht_retes_1t);
32378c2ecf20Sopenharmony_ci	_rtl8821ae_phy_set_txpower_level_by_path(hw, vht_rates_1t, path, channel,
32388c2ecf20Sopenharmony_ci						 sizes_of_vht_retes);
32398c2ecf20Sopenharmony_ci
32408c2ecf20Sopenharmony_ci	if (rtlphy->num_total_rfpath >= 2) {
32418c2ecf20Sopenharmony_ci		_rtl8821ae_phy_set_txpower_level_by_path(hw, ht_rates_2t, path,
32428c2ecf20Sopenharmony_ci							 channel,
32438c2ecf20Sopenharmony_ci							 sizes_of_ht_retes_2t);
32448c2ecf20Sopenharmony_ci		_rtl8821ae_phy_set_txpower_level_by_path(hw, vht_rates_2t, path,
32458c2ecf20Sopenharmony_ci							 channel,
32468c2ecf20Sopenharmony_ci							 sizes_of_vht_retes);
32478c2ecf20Sopenharmony_ci	}
32488c2ecf20Sopenharmony_ci
32498c2ecf20Sopenharmony_ci	_rtl8821ae_phy_txpower_training_by_path(hw, rtlphy->current_chan_bw,
32508c2ecf20Sopenharmony_ci						channel, path);
32518c2ecf20Sopenharmony_ci}
32528c2ecf20Sopenharmony_ci
32538c2ecf20Sopenharmony_ci/*just in case, write txpower in DW, to reduce time*/
32548c2ecf20Sopenharmony_civoid rtl8821ae_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
32558c2ecf20Sopenharmony_ci{
32568c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
32578c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
32588c2ecf20Sopenharmony_ci	u8 path = 0;
32598c2ecf20Sopenharmony_ci
32608c2ecf20Sopenharmony_ci	for (path = RF90_PATH_A; path < rtlphy->num_total_rfpath; ++path)
32618c2ecf20Sopenharmony_ci		rtl8821ae_phy_set_txpower_level_by_path(hw, channel, path);
32628c2ecf20Sopenharmony_ci}
32638c2ecf20Sopenharmony_ci
32648c2ecf20Sopenharmony_cistatic long _rtl8821ae_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
32658c2ecf20Sopenharmony_ci					    enum wireless_mode wirelessmode,
32668c2ecf20Sopenharmony_ci					    u8 txpwridx)
32678c2ecf20Sopenharmony_ci{
32688c2ecf20Sopenharmony_ci	long offset;
32698c2ecf20Sopenharmony_ci	long pwrout_dbm;
32708c2ecf20Sopenharmony_ci
32718c2ecf20Sopenharmony_ci	switch (wirelessmode) {
32728c2ecf20Sopenharmony_ci	case WIRELESS_MODE_B:
32738c2ecf20Sopenharmony_ci		offset = -7;
32748c2ecf20Sopenharmony_ci		break;
32758c2ecf20Sopenharmony_ci	case WIRELESS_MODE_G:
32768c2ecf20Sopenharmony_ci	case WIRELESS_MODE_N_24G:
32778c2ecf20Sopenharmony_ci		offset = -8;
32788c2ecf20Sopenharmony_ci		break;
32798c2ecf20Sopenharmony_ci	default:
32808c2ecf20Sopenharmony_ci		offset = -8;
32818c2ecf20Sopenharmony_ci		break;
32828c2ecf20Sopenharmony_ci	}
32838c2ecf20Sopenharmony_ci	pwrout_dbm = txpwridx / 2 + offset;
32848c2ecf20Sopenharmony_ci	return pwrout_dbm;
32858c2ecf20Sopenharmony_ci}
32868c2ecf20Sopenharmony_ci
32878c2ecf20Sopenharmony_civoid rtl8821ae_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
32888c2ecf20Sopenharmony_ci{
32898c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
32908c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
32918c2ecf20Sopenharmony_ci	enum io_type iotype = IO_CMD_PAUSE_BAND0_DM_BY_SCAN;
32928c2ecf20Sopenharmony_ci
32938c2ecf20Sopenharmony_ci	if (!is_hal_stop(rtlhal)) {
32948c2ecf20Sopenharmony_ci		switch (operation) {
32958c2ecf20Sopenharmony_ci		case SCAN_OPT_BACKUP_BAND0:
32968c2ecf20Sopenharmony_ci			iotype = IO_CMD_PAUSE_BAND0_DM_BY_SCAN;
32978c2ecf20Sopenharmony_ci			rtlpriv->cfg->ops->set_hw_reg(hw,
32988c2ecf20Sopenharmony_ci						      HW_VAR_IO_CMD,
32998c2ecf20Sopenharmony_ci						      (u8 *)&iotype);
33008c2ecf20Sopenharmony_ci
33018c2ecf20Sopenharmony_ci			break;
33028c2ecf20Sopenharmony_ci		case SCAN_OPT_BACKUP_BAND1:
33038c2ecf20Sopenharmony_ci			iotype = IO_CMD_PAUSE_BAND1_DM_BY_SCAN;
33048c2ecf20Sopenharmony_ci			rtlpriv->cfg->ops->set_hw_reg(hw,
33058c2ecf20Sopenharmony_ci						      HW_VAR_IO_CMD,
33068c2ecf20Sopenharmony_ci						      (u8 *)&iotype);
33078c2ecf20Sopenharmony_ci
33088c2ecf20Sopenharmony_ci			break;
33098c2ecf20Sopenharmony_ci		case SCAN_OPT_RESTORE:
33108c2ecf20Sopenharmony_ci			iotype = IO_CMD_RESUME_DM_BY_SCAN;
33118c2ecf20Sopenharmony_ci			rtlpriv->cfg->ops->set_hw_reg(hw,
33128c2ecf20Sopenharmony_ci						      HW_VAR_IO_CMD,
33138c2ecf20Sopenharmony_ci						      (u8 *)&iotype);
33148c2ecf20Sopenharmony_ci			break;
33158c2ecf20Sopenharmony_ci		default:
33168c2ecf20Sopenharmony_ci			pr_err("Unknown Scan Backup operation.\n");
33178c2ecf20Sopenharmony_ci			break;
33188c2ecf20Sopenharmony_ci		}
33198c2ecf20Sopenharmony_ci	}
33208c2ecf20Sopenharmony_ci}
33218c2ecf20Sopenharmony_ci
33228c2ecf20Sopenharmony_cistatic void _rtl8821ae_phy_set_reg_bw(struct rtl_priv *rtlpriv, u8 bw)
33238c2ecf20Sopenharmony_ci{
33248c2ecf20Sopenharmony_ci	u16 reg_rf_mode_bw, tmp = 0;
33258c2ecf20Sopenharmony_ci
33268c2ecf20Sopenharmony_ci	reg_rf_mode_bw = rtl_read_word(rtlpriv, REG_TRXPTCL_CTL);
33278c2ecf20Sopenharmony_ci	switch (bw) {
33288c2ecf20Sopenharmony_ci	case HT_CHANNEL_WIDTH_20:
33298c2ecf20Sopenharmony_ci		rtl_write_word(rtlpriv, REG_TRXPTCL_CTL, reg_rf_mode_bw & 0xFE7F);
33308c2ecf20Sopenharmony_ci		break;
33318c2ecf20Sopenharmony_ci	case HT_CHANNEL_WIDTH_20_40:
33328c2ecf20Sopenharmony_ci		tmp = reg_rf_mode_bw | BIT(7);
33338c2ecf20Sopenharmony_ci		rtl_write_word(rtlpriv, REG_TRXPTCL_CTL, tmp & 0xFEFF);
33348c2ecf20Sopenharmony_ci		break;
33358c2ecf20Sopenharmony_ci	case HT_CHANNEL_WIDTH_80:
33368c2ecf20Sopenharmony_ci		tmp = reg_rf_mode_bw | BIT(8);
33378c2ecf20Sopenharmony_ci		rtl_write_word(rtlpriv, REG_TRXPTCL_CTL, tmp & 0xFF7F);
33388c2ecf20Sopenharmony_ci		break;
33398c2ecf20Sopenharmony_ci	default:
33408c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING, "unknown Bandwidth: 0x%x\n", bw);
33418c2ecf20Sopenharmony_ci		break;
33428c2ecf20Sopenharmony_ci	}
33438c2ecf20Sopenharmony_ci}
33448c2ecf20Sopenharmony_ci
33458c2ecf20Sopenharmony_cistatic u8 _rtl8821ae_phy_get_secondary_chnl(struct rtl_priv *rtlpriv)
33468c2ecf20Sopenharmony_ci{
33478c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
33488c2ecf20Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtlpriv);
33498c2ecf20Sopenharmony_ci	u8 sc_set_40 = 0, sc_set_20 = 0;
33508c2ecf20Sopenharmony_ci
33518c2ecf20Sopenharmony_ci	if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80) {
33528c2ecf20Sopenharmony_ci		if (mac->cur_80_prime_sc == PRIME_CHNL_OFFSET_LOWER)
33538c2ecf20Sopenharmony_ci			sc_set_40 = VHT_DATA_SC_40_LOWER_OF_80MHZ;
33548c2ecf20Sopenharmony_ci		else if (mac->cur_80_prime_sc == PRIME_CHNL_OFFSET_UPPER)
33558c2ecf20Sopenharmony_ci			sc_set_40 = VHT_DATA_SC_40_UPPER_OF_80MHZ;
33568c2ecf20Sopenharmony_ci		else
33578c2ecf20Sopenharmony_ci			pr_err("SCMapping: Not Correct Primary40MHz Setting\n");
33588c2ecf20Sopenharmony_ci
33598c2ecf20Sopenharmony_ci		if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_LOWER) &&
33608c2ecf20Sopenharmony_ci			(mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_LOWER))
33618c2ecf20Sopenharmony_ci			sc_set_20 = VHT_DATA_SC_20_LOWEST_OF_80MHZ;
33628c2ecf20Sopenharmony_ci		else if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_UPPER) &&
33638c2ecf20Sopenharmony_ci			(mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_LOWER))
33648c2ecf20Sopenharmony_ci			sc_set_20 = VHT_DATA_SC_20_LOWER_OF_80MHZ;
33658c2ecf20Sopenharmony_ci		else if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_LOWER) &&
33668c2ecf20Sopenharmony_ci			(mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_UPPER))
33678c2ecf20Sopenharmony_ci			sc_set_20 = VHT_DATA_SC_20_UPPER_OF_80MHZ;
33688c2ecf20Sopenharmony_ci		else if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_UPPER) &&
33698c2ecf20Sopenharmony_ci			(mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_UPPER))
33708c2ecf20Sopenharmony_ci			sc_set_20 = VHT_DATA_SC_20_UPPERST_OF_80MHZ;
33718c2ecf20Sopenharmony_ci		else
33728c2ecf20Sopenharmony_ci			pr_err("SCMapping: Not Correct Primary40MHz Setting\n");
33738c2ecf20Sopenharmony_ci	} else if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
33748c2ecf20Sopenharmony_ci		if (mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_UPPER)
33758c2ecf20Sopenharmony_ci			sc_set_20 = VHT_DATA_SC_20_UPPER_OF_80MHZ;
33768c2ecf20Sopenharmony_ci		else if (mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_LOWER)
33778c2ecf20Sopenharmony_ci			sc_set_20 = VHT_DATA_SC_20_LOWER_OF_80MHZ;
33788c2ecf20Sopenharmony_ci		else
33798c2ecf20Sopenharmony_ci			pr_err("SCMapping: Not Correct Primary40MHz Setting\n");
33808c2ecf20Sopenharmony_ci	}
33818c2ecf20Sopenharmony_ci	return (sc_set_40 << 4) | sc_set_20;
33828c2ecf20Sopenharmony_ci}
33838c2ecf20Sopenharmony_ci
33848c2ecf20Sopenharmony_civoid rtl8821ae_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
33858c2ecf20Sopenharmony_ci{
33868c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
33878c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
33888c2ecf20Sopenharmony_ci	u8 sub_chnl = 0;
33898c2ecf20Sopenharmony_ci	u8 l1pk_val = 0;
33908c2ecf20Sopenharmony_ci
33918c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE,
33928c2ecf20Sopenharmony_ci		"Switch to %s bandwidth\n",
33938c2ecf20Sopenharmony_ci		(rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
33948c2ecf20Sopenharmony_ci		 "20MHz" :
33958c2ecf20Sopenharmony_ci		 (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40 ?
33968c2ecf20Sopenharmony_ci		  "40MHz" : "80MHz")));
33978c2ecf20Sopenharmony_ci
33988c2ecf20Sopenharmony_ci	_rtl8821ae_phy_set_reg_bw(rtlpriv, rtlphy->current_chan_bw);
33998c2ecf20Sopenharmony_ci	sub_chnl = _rtl8821ae_phy_get_secondary_chnl(rtlpriv);
34008c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, 0x0483, sub_chnl);
34018c2ecf20Sopenharmony_ci
34028c2ecf20Sopenharmony_ci	switch (rtlphy->current_chan_bw) {
34038c2ecf20Sopenharmony_ci	case HT_CHANNEL_WIDTH_20:
34048c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RRFMOD, 0x003003C3, 0x00300200);
34058c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 0);
34068c2ecf20Sopenharmony_ci
34078c2ecf20Sopenharmony_ci		if (rtlphy->rf_type == RF_2T2R)
34088c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, 7);
34098c2ecf20Sopenharmony_ci		else
34108c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, 8);
34118c2ecf20Sopenharmony_ci		break;
34128c2ecf20Sopenharmony_ci	case HT_CHANNEL_WIDTH_20_40:
34138c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RRFMOD, 0x003003C3, 0x00300201);
34148c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 0);
34158c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RRFMOD, 0x3C, sub_chnl);
34168c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RCCAONSEC, 0xf0000000, sub_chnl);
34178c2ecf20Sopenharmony_ci
34188c2ecf20Sopenharmony_ci		if (rtlphy->reg_837 & BIT(2))
34198c2ecf20Sopenharmony_ci			l1pk_val = 6;
34208c2ecf20Sopenharmony_ci		else {
34218c2ecf20Sopenharmony_ci			if (rtlphy->rf_type == RF_2T2R)
34228c2ecf20Sopenharmony_ci				l1pk_val = 7;
34238c2ecf20Sopenharmony_ci			else
34248c2ecf20Sopenharmony_ci				l1pk_val = 8;
34258c2ecf20Sopenharmony_ci		}
34268c2ecf20Sopenharmony_ci		/* 0x848[25:22] = 0x6 */
34278c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, l1pk_val);
34288c2ecf20Sopenharmony_ci
34298c2ecf20Sopenharmony_ci		if (sub_chnl == VHT_DATA_SC_20_UPPER_OF_80MHZ)
34308c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RCCK_SYSTEM, BCCK_SYSTEM, 1);
34318c2ecf20Sopenharmony_ci		else
34328c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, RCCK_SYSTEM, BCCK_SYSTEM, 0);
34338c2ecf20Sopenharmony_ci		break;
34348c2ecf20Sopenharmony_ci
34358c2ecf20Sopenharmony_ci	case HT_CHANNEL_WIDTH_80:
34368c2ecf20Sopenharmony_ci		 /* 0x8ac[21,20,9:6,1,0]=8'b11100010 */
34378c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RRFMOD, 0x003003C3, 0x00300202);
34388c2ecf20Sopenharmony_ci		/* 0x8c4[30] = 1 */
34398c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 1);
34408c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RRFMOD, 0x3C, sub_chnl);
34418c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RCCAONSEC, 0xf0000000, sub_chnl);
34428c2ecf20Sopenharmony_ci
34438c2ecf20Sopenharmony_ci		if (rtlphy->reg_837 & BIT(2))
34448c2ecf20Sopenharmony_ci			l1pk_val = 5;
34458c2ecf20Sopenharmony_ci		else {
34468c2ecf20Sopenharmony_ci			if (rtlphy->rf_type == RF_2T2R)
34478c2ecf20Sopenharmony_ci				l1pk_val = 6;
34488c2ecf20Sopenharmony_ci			else
34498c2ecf20Sopenharmony_ci				l1pk_val = 7;
34508c2ecf20Sopenharmony_ci		}
34518c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, l1pk_val);
34528c2ecf20Sopenharmony_ci
34538c2ecf20Sopenharmony_ci		break;
34548c2ecf20Sopenharmony_ci	default:
34558c2ecf20Sopenharmony_ci		pr_err("unknown bandwidth: %#X\n",
34568c2ecf20Sopenharmony_ci		       rtlphy->current_chan_bw);
34578c2ecf20Sopenharmony_ci		break;
34588c2ecf20Sopenharmony_ci	}
34598c2ecf20Sopenharmony_ci
34608c2ecf20Sopenharmony_ci	rtl8812ae_fixspur(hw, rtlphy->current_chan_bw, rtlphy->current_channel);
34618c2ecf20Sopenharmony_ci
34628c2ecf20Sopenharmony_ci	rtl8821ae_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
34638c2ecf20Sopenharmony_ci	rtlphy->set_bwmode_inprogress = false;
34648c2ecf20Sopenharmony_ci
34658c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD, "\n");
34668c2ecf20Sopenharmony_ci}
34678c2ecf20Sopenharmony_ci
34688c2ecf20Sopenharmony_civoid rtl8821ae_phy_set_bw_mode(struct ieee80211_hw *hw,
34698c2ecf20Sopenharmony_ci			    enum nl80211_channel_type ch_type)
34708c2ecf20Sopenharmony_ci{
34718c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
34728c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
34738c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
34748c2ecf20Sopenharmony_ci	u8 tmp_bw = rtlphy->current_chan_bw;
34758c2ecf20Sopenharmony_ci
34768c2ecf20Sopenharmony_ci	if (rtlphy->set_bwmode_inprogress)
34778c2ecf20Sopenharmony_ci		return;
34788c2ecf20Sopenharmony_ci	rtlphy->set_bwmode_inprogress = true;
34798c2ecf20Sopenharmony_ci	if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw)))
34808c2ecf20Sopenharmony_ci		rtl8821ae_phy_set_bw_mode_callback(hw);
34818c2ecf20Sopenharmony_ci	else {
34828c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
34838c2ecf20Sopenharmony_ci			"FALSE driver sleep or unload\n");
34848c2ecf20Sopenharmony_ci		rtlphy->set_bwmode_inprogress = false;
34858c2ecf20Sopenharmony_ci		rtlphy->current_chan_bw = tmp_bw;
34868c2ecf20Sopenharmony_ci	}
34878c2ecf20Sopenharmony_ci}
34888c2ecf20Sopenharmony_ci
34898c2ecf20Sopenharmony_civoid rtl8821ae_phy_sw_chnl_callback(struct ieee80211_hw *hw)
34908c2ecf20Sopenharmony_ci{
34918c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
34928c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
34938c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
34948c2ecf20Sopenharmony_ci	u8 channel = rtlphy->current_channel;
34958c2ecf20Sopenharmony_ci	u8 path;
34968c2ecf20Sopenharmony_ci	u32 data;
34978c2ecf20Sopenharmony_ci
34988c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE,
34998c2ecf20Sopenharmony_ci		"switch to channel%d\n", rtlphy->current_channel);
35008c2ecf20Sopenharmony_ci	if (is_hal_stop(rtlhal))
35018c2ecf20Sopenharmony_ci		return;
35028c2ecf20Sopenharmony_ci
35038c2ecf20Sopenharmony_ci	if (36 <= channel && channel <= 48)
35048c2ecf20Sopenharmony_ci		data = 0x494;
35058c2ecf20Sopenharmony_ci	else if (50 <= channel && channel <= 64)
35068c2ecf20Sopenharmony_ci		data = 0x453;
35078c2ecf20Sopenharmony_ci	else if (100 <= channel && channel <= 116)
35088c2ecf20Sopenharmony_ci		data = 0x452;
35098c2ecf20Sopenharmony_ci	else if (118 <= channel)
35108c2ecf20Sopenharmony_ci		data = 0x412;
35118c2ecf20Sopenharmony_ci	else
35128c2ecf20Sopenharmony_ci		data = 0x96a;
35138c2ecf20Sopenharmony_ci	rtl_set_bbreg(hw, RFC_AREA, 0x1ffe0000, data);
35148c2ecf20Sopenharmony_ci
35158c2ecf20Sopenharmony_ci	for (path = RF90_PATH_A; path < rtlphy->num_total_rfpath; path++) {
35168c2ecf20Sopenharmony_ci		if (36 <= channel && channel <= 64)
35178c2ecf20Sopenharmony_ci			data = 0x101;
35188c2ecf20Sopenharmony_ci		else if (100 <= channel && channel <= 140)
35198c2ecf20Sopenharmony_ci			data = 0x301;
35208c2ecf20Sopenharmony_ci		else if (140 < channel)
35218c2ecf20Sopenharmony_ci			data = 0x501;
35228c2ecf20Sopenharmony_ci		else
35238c2ecf20Sopenharmony_ci			data = 0x000;
35248c2ecf20Sopenharmony_ci		rtl8821ae_phy_set_rf_reg(hw, path, RF_CHNLBW,
35258c2ecf20Sopenharmony_ci			BIT(18)|BIT(17)|BIT(16)|BIT(9)|BIT(8), data);
35268c2ecf20Sopenharmony_ci
35278c2ecf20Sopenharmony_ci		rtl8821ae_phy_set_rf_reg(hw, path, RF_CHNLBW,
35288c2ecf20Sopenharmony_ci			BMASKBYTE0, channel);
35298c2ecf20Sopenharmony_ci
35308c2ecf20Sopenharmony_ci		if (channel > 14) {
35318c2ecf20Sopenharmony_ci			if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
35328c2ecf20Sopenharmony_ci				if (36 <= channel && channel <= 64)
35338c2ecf20Sopenharmony_ci					data = 0x114E9;
35348c2ecf20Sopenharmony_ci				else
35358c2ecf20Sopenharmony_ci					data = 0x110E9;
35368c2ecf20Sopenharmony_ci				rtl8821ae_phy_set_rf_reg(hw, path, RF_APK,
35378c2ecf20Sopenharmony_ci					BRFREGOFFSETMASK, data);
35388c2ecf20Sopenharmony_ci			}
35398c2ecf20Sopenharmony_ci		}
35408c2ecf20Sopenharmony_ci	}
35418c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE, "\n");
35428c2ecf20Sopenharmony_ci}
35438c2ecf20Sopenharmony_ci
35448c2ecf20Sopenharmony_ciu8 rtl8821ae_phy_sw_chnl(struct ieee80211_hw *hw)
35458c2ecf20Sopenharmony_ci{
35468c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
35478c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
35488c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
35498c2ecf20Sopenharmony_ci	u32 timeout = 1000, timecount = 0;
35508c2ecf20Sopenharmony_ci	u8 channel = rtlphy->current_channel;
35518c2ecf20Sopenharmony_ci
35528c2ecf20Sopenharmony_ci	if (rtlphy->sw_chnl_inprogress)
35538c2ecf20Sopenharmony_ci		return 0;
35548c2ecf20Sopenharmony_ci	if (rtlphy->set_bwmode_inprogress)
35558c2ecf20Sopenharmony_ci		return 0;
35568c2ecf20Sopenharmony_ci
35578c2ecf20Sopenharmony_ci	if ((is_hal_stop(rtlhal)) || (RT_CANNOT_IO(hw))) {
35588c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_CHAN, DBG_LOUD,
35598c2ecf20Sopenharmony_ci			"sw_chnl_inprogress false driver sleep or unload\n");
35608c2ecf20Sopenharmony_ci		return 0;
35618c2ecf20Sopenharmony_ci	}
35628c2ecf20Sopenharmony_ci	while (rtlphy->lck_inprogress && timecount < timeout) {
35638c2ecf20Sopenharmony_ci		mdelay(50);
35648c2ecf20Sopenharmony_ci		timecount += 50;
35658c2ecf20Sopenharmony_ci	}
35668c2ecf20Sopenharmony_ci
35678c2ecf20Sopenharmony_ci	if (rtlphy->current_channel > 14 && rtlhal->current_bandtype != BAND_ON_5G)
35688c2ecf20Sopenharmony_ci		rtl8821ae_phy_switch_wirelessband(hw, BAND_ON_5G);
35698c2ecf20Sopenharmony_ci	else if (rtlphy->current_channel <= 14 && rtlhal->current_bandtype != BAND_ON_2_4G)
35708c2ecf20Sopenharmony_ci		rtl8821ae_phy_switch_wirelessband(hw, BAND_ON_2_4G);
35718c2ecf20Sopenharmony_ci
35728c2ecf20Sopenharmony_ci	rtlphy->sw_chnl_inprogress = true;
35738c2ecf20Sopenharmony_ci	if (channel == 0)
35748c2ecf20Sopenharmony_ci		channel = 1;
35758c2ecf20Sopenharmony_ci
35768c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE,
35778c2ecf20Sopenharmony_ci		"switch to channel%d, band type is %d\n",
35788c2ecf20Sopenharmony_ci		rtlphy->current_channel, rtlhal->current_bandtype);
35798c2ecf20Sopenharmony_ci
35808c2ecf20Sopenharmony_ci	rtl8821ae_phy_sw_chnl_callback(hw);
35818c2ecf20Sopenharmony_ci
35828c2ecf20Sopenharmony_ci	rtl8821ae_dm_clear_txpower_tracking_state(hw);
35838c2ecf20Sopenharmony_ci	rtl8821ae_phy_set_txpower_level(hw, rtlphy->current_channel);
35848c2ecf20Sopenharmony_ci
35858c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE, "\n");
35868c2ecf20Sopenharmony_ci	rtlphy->sw_chnl_inprogress = false;
35878c2ecf20Sopenharmony_ci	return 1;
35888c2ecf20Sopenharmony_ci}
35898c2ecf20Sopenharmony_ci
35908c2ecf20Sopenharmony_ciu8 _rtl8812ae_get_right_chnl_place_for_iqk(u8 chnl)
35918c2ecf20Sopenharmony_ci{
35928c2ecf20Sopenharmony_ci	static const u8 channel_all[TARGET_CHNL_NUM_2G_5G_8812] = {
35938c2ecf20Sopenharmony_ci		1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
35948c2ecf20Sopenharmony_ci		14, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54,
35958c2ecf20Sopenharmony_ci		56, 58, 60, 62, 64, 100, 102, 104, 106, 108,
35968c2ecf20Sopenharmony_ci		110, 112, 114, 116, 118, 120, 122, 124, 126,
35978c2ecf20Sopenharmony_ci		128, 130, 132, 134, 136, 138, 140, 149, 151,
35988c2ecf20Sopenharmony_ci		153, 155, 157, 159, 161, 163, 165};
35998c2ecf20Sopenharmony_ci	u8 place;
36008c2ecf20Sopenharmony_ci
36018c2ecf20Sopenharmony_ci	if (chnl > 14) {
36028c2ecf20Sopenharmony_ci		for (place = 14; place < sizeof(channel_all); place++)
36038c2ecf20Sopenharmony_ci			if (channel_all[place] == chnl)
36048c2ecf20Sopenharmony_ci				return place-13;
36058c2ecf20Sopenharmony_ci	}
36068c2ecf20Sopenharmony_ci
36078c2ecf20Sopenharmony_ci	return 0;
36088c2ecf20Sopenharmony_ci}
36098c2ecf20Sopenharmony_ci
36108c2ecf20Sopenharmony_ci#define MACBB_REG_NUM 10
36118c2ecf20Sopenharmony_ci#define AFE_REG_NUM 14
36128c2ecf20Sopenharmony_ci#define RF_REG_NUM 3
36138c2ecf20Sopenharmony_ci
36148c2ecf20Sopenharmony_cistatic void _rtl8821ae_iqk_backup_macbb(struct ieee80211_hw *hw,
36158c2ecf20Sopenharmony_ci					u32 *macbb_backup,
36168c2ecf20Sopenharmony_ci					u32 *backup_macbb_reg, u32 mac_bb_num)
36178c2ecf20Sopenharmony_ci{
36188c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
36198c2ecf20Sopenharmony_ci	u32 i;
36208c2ecf20Sopenharmony_ci
36218c2ecf20Sopenharmony_ci	rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
36228c2ecf20Sopenharmony_ci	/*save MACBB default value*/
36238c2ecf20Sopenharmony_ci	for (i = 0; i < mac_bb_num; i++)
36248c2ecf20Sopenharmony_ci		macbb_backup[i] = rtl_read_dword(rtlpriv, backup_macbb_reg[i]);
36258c2ecf20Sopenharmony_ci
36268c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD, "BackupMacBB Success!!!!\n");
36278c2ecf20Sopenharmony_ci}
36288c2ecf20Sopenharmony_ci
36298c2ecf20Sopenharmony_cistatic void _rtl8821ae_iqk_backup_afe(struct ieee80211_hw *hw, u32 *afe_backup,
36308c2ecf20Sopenharmony_ci				      u32 *backup_afe_REG, u32 afe_num)
36318c2ecf20Sopenharmony_ci{
36328c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
36338c2ecf20Sopenharmony_ci	u32 i;
36348c2ecf20Sopenharmony_ci
36358c2ecf20Sopenharmony_ci	rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
36368c2ecf20Sopenharmony_ci	/*Save AFE Parameters */
36378c2ecf20Sopenharmony_ci	for (i = 0; i < afe_num; i++)
36388c2ecf20Sopenharmony_ci		afe_backup[i] = rtl_read_dword(rtlpriv, backup_afe_REG[i]);
36398c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD, "BackupAFE Success!!!!\n");
36408c2ecf20Sopenharmony_ci}
36418c2ecf20Sopenharmony_ci
36428c2ecf20Sopenharmony_cistatic void _rtl8821ae_iqk_backup_rf(struct ieee80211_hw *hw, u32 *rfa_backup,
36438c2ecf20Sopenharmony_ci				     u32 *rfb_backup, u32 *backup_rf_reg,
36448c2ecf20Sopenharmony_ci				     u32 rf_num)
36458c2ecf20Sopenharmony_ci{
36468c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
36478c2ecf20Sopenharmony_ci	u32 i;
36488c2ecf20Sopenharmony_ci
36498c2ecf20Sopenharmony_ci	rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
36508c2ecf20Sopenharmony_ci	/*Save RF Parameters*/
36518c2ecf20Sopenharmony_ci	for (i = 0; i < rf_num; i++) {
36528c2ecf20Sopenharmony_ci		rfa_backup[i] = rtl_get_rfreg(hw, RF90_PATH_A, backup_rf_reg[i],
36538c2ecf20Sopenharmony_ci					      BMASKDWORD);
36548c2ecf20Sopenharmony_ci		rfb_backup[i] = rtl_get_rfreg(hw, RF90_PATH_B, backup_rf_reg[i],
36558c2ecf20Sopenharmony_ci					      BMASKDWORD);
36568c2ecf20Sopenharmony_ci	}
36578c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD, "BackupRF Success!!!!\n");
36588c2ecf20Sopenharmony_ci}
36598c2ecf20Sopenharmony_ci
36608c2ecf20Sopenharmony_cistatic void _rtl8821ae_iqk_configure_mac(
36618c2ecf20Sopenharmony_ci		struct ieee80211_hw *hw
36628c2ecf20Sopenharmony_ci		)
36638c2ecf20Sopenharmony_ci{
36648c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
36658c2ecf20Sopenharmony_ci	/* ========MAC register setting========*/
36668c2ecf20Sopenharmony_ci	rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
36678c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, 0x522, 0x3f);
36688c2ecf20Sopenharmony_ci	rtl_set_bbreg(hw, 0x550, BIT(11) | BIT(3), 0x0);
36698c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, 0x808, 0x00);		/*RX ante off*/
36708c2ecf20Sopenharmony_ci	rtl_set_bbreg(hw, 0x838, 0xf, 0xc);		/*CCA off*/
36718c2ecf20Sopenharmony_ci}
36728c2ecf20Sopenharmony_ci
36738c2ecf20Sopenharmony_cistatic void _rtl8821ae_iqk_tx_fill_iqc(struct ieee80211_hw *hw,
36748c2ecf20Sopenharmony_ci				       enum radio_path path, u32 tx_x, u32 tx_y)
36758c2ecf20Sopenharmony_ci{
36768c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
36778c2ecf20Sopenharmony_ci	switch (path) {
36788c2ecf20Sopenharmony_ci	case RF90_PATH_A:
36798c2ecf20Sopenharmony_ci		/* [31] = 1 --> Page C1 */
36808c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1);
36818c2ecf20Sopenharmony_ci		rtl_write_dword(rtlpriv, 0xc90, 0x00000080);
36828c2ecf20Sopenharmony_ci		rtl_write_dword(rtlpriv, 0xcc4, 0x20040000);
36838c2ecf20Sopenharmony_ci		rtl_write_dword(rtlpriv, 0xcc8, 0x20000000);
36848c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, 0xccc, 0x000007ff, tx_y);
36858c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, 0xcd4, 0x000007ff, tx_x);
36868c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
36878c2ecf20Sopenharmony_ci			"TX_X = %x;;TX_Y = %x =====> fill to IQC\n",
36888c2ecf20Sopenharmony_ci			tx_x, tx_y);
36898c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
36908c2ecf20Sopenharmony_ci			"0xcd4 = %x;;0xccc = %x ====>fill to IQC\n",
36918c2ecf20Sopenharmony_ci			rtl_get_bbreg(hw, 0xcd4, 0x000007ff),
36928c2ecf20Sopenharmony_ci			rtl_get_bbreg(hw, 0xccc, 0x000007ff));
36938c2ecf20Sopenharmony_ci		break;
36948c2ecf20Sopenharmony_ci	default:
36958c2ecf20Sopenharmony_ci		break;
36968c2ecf20Sopenharmony_ci	}
36978c2ecf20Sopenharmony_ci}
36988c2ecf20Sopenharmony_ci
36998c2ecf20Sopenharmony_cistatic void _rtl8821ae_iqk_rx_fill_iqc(struct ieee80211_hw *hw,
37008c2ecf20Sopenharmony_ci				       enum radio_path path, u32 rx_x, u32 rx_y)
37018c2ecf20Sopenharmony_ci{
37028c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
37038c2ecf20Sopenharmony_ci	switch (path) {
37048c2ecf20Sopenharmony_ci	case RF90_PATH_A:
37058c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
37068c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, 0xc10, 0x000003ff, rx_x>>1);
37078c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, 0xc10, 0x03ff0000, rx_y>>1);
37088c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
37098c2ecf20Sopenharmony_ci			"rx_x = %x;;rx_y = %x ====>fill to IQC\n",
37108c2ecf20Sopenharmony_ci			rx_x >> 1, rx_y >> 1);
37118c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
37128c2ecf20Sopenharmony_ci			"0xc10 = %x ====>fill to IQC\n",
37138c2ecf20Sopenharmony_ci			rtl_read_dword(rtlpriv, 0xc10));
37148c2ecf20Sopenharmony_ci		break;
37158c2ecf20Sopenharmony_ci	default:
37168c2ecf20Sopenharmony_ci		break;
37178c2ecf20Sopenharmony_ci	}
37188c2ecf20Sopenharmony_ci}
37198c2ecf20Sopenharmony_ci
37208c2ecf20Sopenharmony_ci#define cal_num 10
37218c2ecf20Sopenharmony_ci
37228c2ecf20Sopenharmony_cistatic void _rtl8821ae_iqk_tx(struct ieee80211_hw *hw, enum radio_path path)
37238c2ecf20Sopenharmony_ci{
37248c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
37258c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
37268c2ecf20Sopenharmony_ci	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
37278c2ecf20Sopenharmony_ci
37288c2ecf20Sopenharmony_ci	u32	tx_fail, rx_fail, delay_count, iqk_ready, cal_retry, cal = 0, temp_reg65;
37298c2ecf20Sopenharmony_ci	int	tx_x = 0, tx_y = 0, rx_x = 0, rx_y = 0, tx_average = 0, rx_average = 0;
37308c2ecf20Sopenharmony_ci	int	tx_x0[cal_num], tx_y0[cal_num], tx_x0_rxk[cal_num],
37318c2ecf20Sopenharmony_ci		tx_y0_rxk[cal_num], rx_x0[cal_num], rx_y0[cal_num],
37328c2ecf20Sopenharmony_ci		tx_dt[cal_num], rx_dt[cal_num];
37338c2ecf20Sopenharmony_ci	bool	tx0iqkok = false, rx0iqkok = false;
37348c2ecf20Sopenharmony_ci	bool	vdf_enable = false;
37358c2ecf20Sopenharmony_ci	int	i, k, vdf_y[3], vdf_x[3],
37368c2ecf20Sopenharmony_ci		ii, dx = 0, dy = 0, tx_finish = 0, rx_finish = 0;
37378c2ecf20Sopenharmony_ci
37388c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
37398c2ecf20Sopenharmony_ci		"BandWidth = %d.\n",
37408c2ecf20Sopenharmony_ci		rtlphy->current_chan_bw);
37418c2ecf20Sopenharmony_ci	if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80)
37428c2ecf20Sopenharmony_ci		vdf_enable = true;
37438c2ecf20Sopenharmony_ci
37448c2ecf20Sopenharmony_ci	while (cal < cal_num) {
37458c2ecf20Sopenharmony_ci		switch (path) {
37468c2ecf20Sopenharmony_ci		case RF90_PATH_A:
37478c2ecf20Sopenharmony_ci			temp_reg65 = rtl_get_rfreg(hw, path, 0x65, 0xffffffff);
37488c2ecf20Sopenharmony_ci			/* Path-A LOK */
37498c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
37508c2ecf20Sopenharmony_ci			/*========Path-A AFE all on========*/
37518c2ecf20Sopenharmony_ci			/*Port 0 DAC/ADC on*/
37528c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc60, 0x77777777);
37538c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc64, 0x77777777);
37548c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc68, 0x19791979);
37558c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc6c, 0x19791979);
37568c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc70, 0x19791979);
37578c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc74, 0x19791979);
37588c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc78, 0x19791979);
37598c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc7c, 0x19791979);
37608c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc80, 0x19791979);
37618c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc84, 0x19791979);
37628c2ecf20Sopenharmony_ci
37638c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, 0xc00, 0xf, 0x4); /*hardware 3-wire off*/
37648c2ecf20Sopenharmony_ci
37658c2ecf20Sopenharmony_ci			/* LOK Setting */
37668c2ecf20Sopenharmony_ci			/* ====== LOK ====== */
37678c2ecf20Sopenharmony_ci			/*DAC/ADC sampling rate (160 MHz)*/
37688c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, 0xc5c, BIT(26) | BIT(25) | BIT(24), 0x7);
37698c2ecf20Sopenharmony_ci
37708c2ecf20Sopenharmony_ci			/* 2. LoK RF Setting (at BW = 20M) */
37718c2ecf20Sopenharmony_ci			rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80002);
37728c2ecf20Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x18, 0x00c00, 0x3);     /* BW 20M */
37738c2ecf20Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x20000);
37748c2ecf20Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0003f);
37758c2ecf20Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xf3fc3);
37768c2ecf20Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d5);
37778c2ecf20Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001);
37788c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, 0xcb8, 0xf, 0xd);
37798c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
37808c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xb00, 0x03000100);
37818c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, 0xc94, BIT(0), 0x1);
37828c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0x978, 0x29002000);/* TX (X,Y) */
37838c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0x97c, 0xa9002000);/* RX (X,Y) */
37848c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0x984, 0x00462910);/* [0]:AGC_en, [15]:idac_K_Mask */
37858c2ecf20Sopenharmony_ci
37868c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
37878c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc88, 0x821403f4);
37888c2ecf20Sopenharmony_ci
37898c2ecf20Sopenharmony_ci			if (rtlhal->current_bandtype)
37908c2ecf20Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc8c, 0x68163e96);
37918c2ecf20Sopenharmony_ci			else
37928c2ecf20Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc8c, 0x28163e96);
37938c2ecf20Sopenharmony_ci
37948c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc80, 0x18008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
37958c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc84, 0x38008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */
37968c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
37978c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
37988c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
37998c2ecf20Sopenharmony_ci
38008c2ecf20Sopenharmony_ci			mdelay(10); /* Delay 10ms */
38018c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
38028c2ecf20Sopenharmony_ci
38038c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
38048c2ecf20Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x58, 0x7fe00, rtl_get_rfreg(hw, path, 0x8, 0xffc00)); /* Load LOK */
38058c2ecf20Sopenharmony_ci
38068c2ecf20Sopenharmony_ci			switch (rtlphy->current_chan_bw) {
38078c2ecf20Sopenharmony_ci			case 1:
38088c2ecf20Sopenharmony_ci				rtl_set_rfreg(hw, path, 0x18, 0x00c00, 0x1);
38098c2ecf20Sopenharmony_ci				break;
38108c2ecf20Sopenharmony_ci			case 2:
38118c2ecf20Sopenharmony_ci				rtl_set_rfreg(hw, path, 0x18, 0x00c00, 0x0);
38128c2ecf20Sopenharmony_ci				break;
38138c2ecf20Sopenharmony_ci			default:
38148c2ecf20Sopenharmony_ci				break;
38158c2ecf20Sopenharmony_ci			}
38168c2ecf20Sopenharmony_ci
38178c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
38188c2ecf20Sopenharmony_ci
38198c2ecf20Sopenharmony_ci			/* 3. TX RF Setting */
38208c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
38218c2ecf20Sopenharmony_ci			rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
38228c2ecf20Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x20000);
38238c2ecf20Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0003f);
38248c2ecf20Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xf3fc3);
38258c2ecf20Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d5);
38268c2ecf20Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001);
38278c2ecf20Sopenharmony_ci			rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
38288c2ecf20Sopenharmony_ci			/* ODM_SetBBReg(pDM_Odm, 0xcb8, 0xf, 0xd); */
38298c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
38308c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xb00, 0x03000100);
38318c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, 0xc94, BIT(0), 0x1);
38328c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0x978, 0x29002000);/* TX (X,Y) */
38338c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0x97c, 0xa9002000);/* RX (X,Y) */
38348c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */
38358c2ecf20Sopenharmony_ci
38368c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
38378c2ecf20Sopenharmony_ci			rtl_write_dword(rtlpriv, 0xc88, 0x821403f1);
38388c2ecf20Sopenharmony_ci			if (rtlhal->current_bandtype)
38398c2ecf20Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc8c, 0x40163e96);
38408c2ecf20Sopenharmony_ci			else
38418c2ecf20Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc8c, 0x00163e96);
38428c2ecf20Sopenharmony_ci
38438c2ecf20Sopenharmony_ci			if (vdf_enable == 1) {
38448c2ecf20Sopenharmony_ci				rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD, "VDF_enable\n");
38458c2ecf20Sopenharmony_ci				for (k = 0; k <= 2; k++) {
38468c2ecf20Sopenharmony_ci					switch (k) {
38478c2ecf20Sopenharmony_ci					case 0:
38488c2ecf20Sopenharmony_ci						rtl_write_dword(rtlpriv, 0xc80, 0x18008c38);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
38498c2ecf20Sopenharmony_ci						rtl_write_dword(rtlpriv, 0xc84, 0x38008c38);/* RX_TONE_idx[9:0], RxK_Mask[29] */
38508c2ecf20Sopenharmony_ci						rtl_set_bbreg(hw, 0xce8, BIT(31), 0x0);
38518c2ecf20Sopenharmony_ci						break;
38528c2ecf20Sopenharmony_ci					case 1:
38538c2ecf20Sopenharmony_ci						rtl_set_bbreg(hw, 0xc80, BIT(28), 0x0);
38548c2ecf20Sopenharmony_ci						rtl_set_bbreg(hw, 0xc84, BIT(28), 0x0);
38558c2ecf20Sopenharmony_ci						rtl_set_bbreg(hw, 0xce8, BIT(31), 0x0);
38568c2ecf20Sopenharmony_ci						break;
38578c2ecf20Sopenharmony_ci					case 2:
38588c2ecf20Sopenharmony_ci						rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
38598c2ecf20Sopenharmony_ci							"vdf_y[1] = %x;;;vdf_y[0] = %x\n", vdf_y[1]>>21 & 0x00007ff, vdf_y[0]>>21 & 0x00007ff);
38608c2ecf20Sopenharmony_ci						rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
38618c2ecf20Sopenharmony_ci							"vdf_x[1] = %x;;;vdf_x[0] = %x\n", vdf_x[1]>>21 & 0x00007ff, vdf_x[0]>>21 & 0x00007ff);
38628c2ecf20Sopenharmony_ci						tx_dt[cal] = (vdf_y[1]>>20)-(vdf_y[0]>>20);
38638c2ecf20Sopenharmony_ci						tx_dt[cal] = ((16*tx_dt[cal])*10000/15708);
38648c2ecf20Sopenharmony_ci						tx_dt[cal] = (tx_dt[cal] >> 1)+(tx_dt[cal] & BIT(0));
38658c2ecf20Sopenharmony_ci						rtl_write_dword(rtlpriv, 0xc80, 0x18008c20);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
38668c2ecf20Sopenharmony_ci						rtl_write_dword(rtlpriv, 0xc84, 0x38008c20);/* RX_TONE_idx[9:0], RxK_Mask[29] */
38678c2ecf20Sopenharmony_ci						rtl_set_bbreg(hw, 0xce8, BIT(31), 0x1);
38688c2ecf20Sopenharmony_ci						rtl_set_bbreg(hw, 0xce8, 0x3fff0000, tx_dt[cal] & 0x00003fff);
38698c2ecf20Sopenharmony_ci						break;
38708c2ecf20Sopenharmony_ci					default:
38718c2ecf20Sopenharmony_ci						break;
38728c2ecf20Sopenharmony_ci					}
38738c2ecf20Sopenharmony_ci					rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
38748c2ecf20Sopenharmony_ci					cal_retry = 0;
38758c2ecf20Sopenharmony_ci					while (1) {
38768c2ecf20Sopenharmony_ci						/* one shot */
38778c2ecf20Sopenharmony_ci						rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
38788c2ecf20Sopenharmony_ci						rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
38798c2ecf20Sopenharmony_ci
38808c2ecf20Sopenharmony_ci						mdelay(10); /* Delay 10ms */
38818c2ecf20Sopenharmony_ci						rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
38828c2ecf20Sopenharmony_ci						delay_count = 0;
38838c2ecf20Sopenharmony_ci						while (1) {
38848c2ecf20Sopenharmony_ci							iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
38858c2ecf20Sopenharmony_ci							if ((~iqk_ready) || (delay_count > 20))
38868c2ecf20Sopenharmony_ci								break;
38878c2ecf20Sopenharmony_ci							else{
38888c2ecf20Sopenharmony_ci								mdelay(1);
38898c2ecf20Sopenharmony_ci								delay_count++;
38908c2ecf20Sopenharmony_ci							}
38918c2ecf20Sopenharmony_ci						}
38928c2ecf20Sopenharmony_ci
38938c2ecf20Sopenharmony_ci						if (delay_count < 20) {							/* If 20ms No Result, then cal_retry++ */
38948c2ecf20Sopenharmony_ci							/* ============TXIQK Check============== */
38958c2ecf20Sopenharmony_ci							tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12));
38968c2ecf20Sopenharmony_ci
38978c2ecf20Sopenharmony_ci							if (~tx_fail) {
38988c2ecf20Sopenharmony_ci								rtl_write_dword(rtlpriv, 0xcb8, 0x02000000);
38998c2ecf20Sopenharmony_ci								vdf_x[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
39008c2ecf20Sopenharmony_ci								rtl_write_dword(rtlpriv, 0xcb8, 0x04000000);
39018c2ecf20Sopenharmony_ci								vdf_y[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
39028c2ecf20Sopenharmony_ci								tx0iqkok = true;
39038c2ecf20Sopenharmony_ci								break;
39048c2ecf20Sopenharmony_ci							} else {
39058c2ecf20Sopenharmony_ci								rtl_set_bbreg(hw, 0xccc, 0x000007ff, 0x0);
39068c2ecf20Sopenharmony_ci								rtl_set_bbreg(hw, 0xcd4, 0x000007ff, 0x200);
39078c2ecf20Sopenharmony_ci								tx0iqkok = false;
39088c2ecf20Sopenharmony_ci								cal_retry++;
39098c2ecf20Sopenharmony_ci								if (cal_retry == 10)
39108c2ecf20Sopenharmony_ci									break;
39118c2ecf20Sopenharmony_ci							}
39128c2ecf20Sopenharmony_ci						} else {
39138c2ecf20Sopenharmony_ci							tx0iqkok = false;
39148c2ecf20Sopenharmony_ci							cal_retry++;
39158c2ecf20Sopenharmony_ci							if (cal_retry == 10)
39168c2ecf20Sopenharmony_ci								break;
39178c2ecf20Sopenharmony_ci						}
39188c2ecf20Sopenharmony_ci					}
39198c2ecf20Sopenharmony_ci				}
39208c2ecf20Sopenharmony_ci				if (k == 3) {
39218c2ecf20Sopenharmony_ci					tx_x0[cal] = vdf_x[k-1];
39228c2ecf20Sopenharmony_ci					tx_y0[cal] = vdf_y[k-1];
39238c2ecf20Sopenharmony_ci				}
39248c2ecf20Sopenharmony_ci			} else {
39258c2ecf20Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc80, 0x18008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
39268c2ecf20Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc84, 0x38008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */
39278c2ecf20Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
39288c2ecf20Sopenharmony_ci				cal_retry = 0;
39298c2ecf20Sopenharmony_ci				while (1) {
39308c2ecf20Sopenharmony_ci					/* one shot */
39318c2ecf20Sopenharmony_ci					rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
39328c2ecf20Sopenharmony_ci					rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
39338c2ecf20Sopenharmony_ci
39348c2ecf20Sopenharmony_ci					mdelay(10); /* Delay 10ms */
39358c2ecf20Sopenharmony_ci					rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
39368c2ecf20Sopenharmony_ci					delay_count = 0;
39378c2ecf20Sopenharmony_ci					while (1) {
39388c2ecf20Sopenharmony_ci						iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
39398c2ecf20Sopenharmony_ci						if ((~iqk_ready) || (delay_count > 20))
39408c2ecf20Sopenharmony_ci							break;
39418c2ecf20Sopenharmony_ci						else{
39428c2ecf20Sopenharmony_ci							mdelay(1);
39438c2ecf20Sopenharmony_ci							delay_count++;
39448c2ecf20Sopenharmony_ci						}
39458c2ecf20Sopenharmony_ci					}
39468c2ecf20Sopenharmony_ci
39478c2ecf20Sopenharmony_ci					if (delay_count < 20) {							/* If 20ms No Result, then cal_retry++ */
39488c2ecf20Sopenharmony_ci						/* ============TXIQK Check============== */
39498c2ecf20Sopenharmony_ci						tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12));
39508c2ecf20Sopenharmony_ci
39518c2ecf20Sopenharmony_ci						if (~tx_fail) {
39528c2ecf20Sopenharmony_ci							rtl_write_dword(rtlpriv, 0xcb8, 0x02000000);
39538c2ecf20Sopenharmony_ci							tx_x0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
39548c2ecf20Sopenharmony_ci							rtl_write_dword(rtlpriv, 0xcb8, 0x04000000);
39558c2ecf20Sopenharmony_ci							tx_y0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
39568c2ecf20Sopenharmony_ci							tx0iqkok = true;
39578c2ecf20Sopenharmony_ci							break;
39588c2ecf20Sopenharmony_ci						} else {
39598c2ecf20Sopenharmony_ci							rtl_set_bbreg(hw, 0xccc, 0x000007ff, 0x0);
39608c2ecf20Sopenharmony_ci							rtl_set_bbreg(hw, 0xcd4, 0x000007ff, 0x200);
39618c2ecf20Sopenharmony_ci							tx0iqkok = false;
39628c2ecf20Sopenharmony_ci							cal_retry++;
39638c2ecf20Sopenharmony_ci							if (cal_retry == 10)
39648c2ecf20Sopenharmony_ci								break;
39658c2ecf20Sopenharmony_ci						}
39668c2ecf20Sopenharmony_ci					} else {
39678c2ecf20Sopenharmony_ci						tx0iqkok = false;
39688c2ecf20Sopenharmony_ci						cal_retry++;
39698c2ecf20Sopenharmony_ci						if (cal_retry == 10)
39708c2ecf20Sopenharmony_ci							break;
39718c2ecf20Sopenharmony_ci					}
39728c2ecf20Sopenharmony_ci				}
39738c2ecf20Sopenharmony_ci			}
39748c2ecf20Sopenharmony_ci
39758c2ecf20Sopenharmony_ci			if (tx0iqkok == false)
39768c2ecf20Sopenharmony_ci				break;				/* TXK fail, Don't do RXK */
39778c2ecf20Sopenharmony_ci
39788c2ecf20Sopenharmony_ci			if (vdf_enable == 1) {
39798c2ecf20Sopenharmony_ci				rtl_set_bbreg(hw, 0xce8, BIT(31), 0x0);    /* TX VDF Disable */
39808c2ecf20Sopenharmony_ci				rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD, "RXVDF Start\n");
39818c2ecf20Sopenharmony_ci				for (k = 0; k <= 2; k++) {
39828c2ecf20Sopenharmony_ci					/* ====== RX mode TXK (RXK Step 1) ====== */
39838c2ecf20Sopenharmony_ci					rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
39848c2ecf20Sopenharmony_ci					/* 1. TX RF Setting */
39858c2ecf20Sopenharmony_ci					rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
39868c2ecf20Sopenharmony_ci					rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000);
39878c2ecf20Sopenharmony_ci					rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x00029);
39888c2ecf20Sopenharmony_ci					rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xd7ffb);
39898c2ecf20Sopenharmony_ci					rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, temp_reg65);
39908c2ecf20Sopenharmony_ci					rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001);
39918c2ecf20Sopenharmony_ci					rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
39928c2ecf20Sopenharmony_ci
39938c2ecf20Sopenharmony_ci					rtl_set_bbreg(hw, 0xcb8, 0xf, 0xd);
39948c2ecf20Sopenharmony_ci					rtl_write_dword(rtlpriv, 0x978, 0x29002000);/* TX (X,Y) */
39958c2ecf20Sopenharmony_ci					rtl_write_dword(rtlpriv, 0x97c, 0xa9002000);/* RX (X,Y) */
39968c2ecf20Sopenharmony_ci					rtl_write_dword(rtlpriv, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */
39978c2ecf20Sopenharmony_ci					rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
39988c2ecf20Sopenharmony_ci					rtl_write_dword(rtlpriv, 0xb00, 0x03000100);
39998c2ecf20Sopenharmony_ci					rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
40008c2ecf20Sopenharmony_ci					switch (k) {
40018c2ecf20Sopenharmony_ci					case 0:
40028c2ecf20Sopenharmony_ci						{
40038c2ecf20Sopenharmony_ci							rtl_write_dword(rtlpriv, 0xc80, 0x18008c38);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
40048c2ecf20Sopenharmony_ci							rtl_write_dword(rtlpriv, 0xc84, 0x38008c38);/* RX_TONE_idx[9:0], RxK_Mask[29] */
40058c2ecf20Sopenharmony_ci							rtl_set_bbreg(hw, 0xce8, BIT(30), 0x0);
40068c2ecf20Sopenharmony_ci						}
40078c2ecf20Sopenharmony_ci						break;
40088c2ecf20Sopenharmony_ci					case 1:
40098c2ecf20Sopenharmony_ci						{
40108c2ecf20Sopenharmony_ci							rtl_write_dword(rtlpriv, 0xc80, 0x08008c38);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
40118c2ecf20Sopenharmony_ci							rtl_write_dword(rtlpriv, 0xc84, 0x28008c38);/* RX_TONE_idx[9:0], RxK_Mask[29] */
40128c2ecf20Sopenharmony_ci							rtl_set_bbreg(hw, 0xce8, BIT(30), 0x0);
40138c2ecf20Sopenharmony_ci						}
40148c2ecf20Sopenharmony_ci						break;
40158c2ecf20Sopenharmony_ci					case 2:
40168c2ecf20Sopenharmony_ci						{
40178c2ecf20Sopenharmony_ci							rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
40188c2ecf20Sopenharmony_ci								"VDF_Y[1] = %x;;;VDF_Y[0] = %x\n",
40198c2ecf20Sopenharmony_ci								vdf_y[1] >> 21 & 0x00007ff,
40208c2ecf20Sopenharmony_ci								vdf_y[0] >> 21 & 0x00007ff);
40218c2ecf20Sopenharmony_ci							rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
40228c2ecf20Sopenharmony_ci								"VDF_X[1] = %x;;;VDF_X[0] = %x\n",
40238c2ecf20Sopenharmony_ci								vdf_x[1] >> 21 & 0x00007ff,
40248c2ecf20Sopenharmony_ci								vdf_x[0] >> 21 & 0x00007ff);
40258c2ecf20Sopenharmony_ci							rx_dt[cal] = (vdf_y[1]>>20)-(vdf_y[0]>>20);
40268c2ecf20Sopenharmony_ci							rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD, "Rx_dt = %d\n",
40278c2ecf20Sopenharmony_ci								rx_dt[cal]);
40288c2ecf20Sopenharmony_ci							rx_dt[cal] = ((16*rx_dt[cal])*10000/13823);
40298c2ecf20Sopenharmony_ci							rx_dt[cal] = (rx_dt[cal] >> 1)+(rx_dt[cal] & BIT(0));
40308c2ecf20Sopenharmony_ci							rtl_write_dword(rtlpriv, 0xc80, 0x18008c20);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
40318c2ecf20Sopenharmony_ci							rtl_write_dword(rtlpriv, 0xc84, 0x38008c20);/* RX_TONE_idx[9:0], RxK_Mask[29] */
40328c2ecf20Sopenharmony_ci							rtl_set_bbreg(hw, 0xce8, 0x00003fff, rx_dt[cal] & 0x00003fff);
40338c2ecf20Sopenharmony_ci						}
40348c2ecf20Sopenharmony_ci						break;
40358c2ecf20Sopenharmony_ci					default:
40368c2ecf20Sopenharmony_ci						break;
40378c2ecf20Sopenharmony_ci					}
40388c2ecf20Sopenharmony_ci					rtl_write_dword(rtlpriv, 0xc88, 0x821603e0);
40398c2ecf20Sopenharmony_ci					rtl_write_dword(rtlpriv, 0xc8c, 0x68163e96);
40408c2ecf20Sopenharmony_ci					rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
40418c2ecf20Sopenharmony_ci					cal_retry = 0;
40428c2ecf20Sopenharmony_ci					while (1) {
40438c2ecf20Sopenharmony_ci						/* one shot */
40448c2ecf20Sopenharmony_ci						rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
40458c2ecf20Sopenharmony_ci						rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
40468c2ecf20Sopenharmony_ci
40478c2ecf20Sopenharmony_ci						mdelay(10); /* Delay 10ms */
40488c2ecf20Sopenharmony_ci						rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
40498c2ecf20Sopenharmony_ci						delay_count = 0;
40508c2ecf20Sopenharmony_ci						while (1) {
40518c2ecf20Sopenharmony_ci							iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
40528c2ecf20Sopenharmony_ci							if ((~iqk_ready) || (delay_count > 20))
40538c2ecf20Sopenharmony_ci								break;
40548c2ecf20Sopenharmony_ci							else{
40558c2ecf20Sopenharmony_ci								mdelay(1);
40568c2ecf20Sopenharmony_ci								delay_count++;
40578c2ecf20Sopenharmony_ci							}
40588c2ecf20Sopenharmony_ci						}
40598c2ecf20Sopenharmony_ci
40608c2ecf20Sopenharmony_ci						if (delay_count < 20) {							/* If 20ms No Result, then cal_retry++ */
40618c2ecf20Sopenharmony_ci							/* ============TXIQK Check============== */
40628c2ecf20Sopenharmony_ci							tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12));
40638c2ecf20Sopenharmony_ci
40648c2ecf20Sopenharmony_ci							if (~tx_fail) {
40658c2ecf20Sopenharmony_ci								rtl_write_dword(rtlpriv, 0xcb8, 0x02000000);
40668c2ecf20Sopenharmony_ci								tx_x0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
40678c2ecf20Sopenharmony_ci								rtl_write_dword(rtlpriv, 0xcb8, 0x04000000);
40688c2ecf20Sopenharmony_ci								tx_y0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
40698c2ecf20Sopenharmony_ci								tx0iqkok = true;
40708c2ecf20Sopenharmony_ci								break;
40718c2ecf20Sopenharmony_ci							} else{
40728c2ecf20Sopenharmony_ci								tx0iqkok = false;
40738c2ecf20Sopenharmony_ci								cal_retry++;
40748c2ecf20Sopenharmony_ci								if (cal_retry == 10)
40758c2ecf20Sopenharmony_ci									break;
40768c2ecf20Sopenharmony_ci							}
40778c2ecf20Sopenharmony_ci						} else {
40788c2ecf20Sopenharmony_ci							tx0iqkok = false;
40798c2ecf20Sopenharmony_ci							cal_retry++;
40808c2ecf20Sopenharmony_ci							if (cal_retry == 10)
40818c2ecf20Sopenharmony_ci								break;
40828c2ecf20Sopenharmony_ci						}
40838c2ecf20Sopenharmony_ci					}
40848c2ecf20Sopenharmony_ci
40858c2ecf20Sopenharmony_ci					if (tx0iqkok == false) {   /* If RX mode TXK fail, then take TXK Result */
40868c2ecf20Sopenharmony_ci						tx_x0_rxk[cal] = tx_x0[cal];
40878c2ecf20Sopenharmony_ci						tx_y0_rxk[cal] = tx_y0[cal];
40888c2ecf20Sopenharmony_ci						tx0iqkok = true;
40898c2ecf20Sopenharmony_ci						rtl_dbg(rtlpriv,
40908c2ecf20Sopenharmony_ci							COMP_IQK,
40918c2ecf20Sopenharmony_ci							DBG_LOUD,
40928c2ecf20Sopenharmony_ci							"RXK Step 1 fail\n");
40938c2ecf20Sopenharmony_ci					}
40948c2ecf20Sopenharmony_ci
40958c2ecf20Sopenharmony_ci					/* ====== RX IQK ====== */
40968c2ecf20Sopenharmony_ci					rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
40978c2ecf20Sopenharmony_ci					/* 1. RX RF Setting */
40988c2ecf20Sopenharmony_ci					rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
40998c2ecf20Sopenharmony_ci					rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000);
41008c2ecf20Sopenharmony_ci					rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0002f);
41018c2ecf20Sopenharmony_ci					rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xfffbb);
41028c2ecf20Sopenharmony_ci					rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x88001);
41038c2ecf20Sopenharmony_ci					rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d8);
41048c2ecf20Sopenharmony_ci					rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
41058c2ecf20Sopenharmony_ci
41068c2ecf20Sopenharmony_ci					rtl_set_bbreg(hw, 0x978, 0x03FF8000, (tx_x0_rxk[cal])>>21&0x000007ff);
41078c2ecf20Sopenharmony_ci					rtl_set_bbreg(hw, 0x978, 0x000007FF, (tx_y0_rxk[cal])>>21&0x000007ff);
41088c2ecf20Sopenharmony_ci					rtl_set_bbreg(hw, 0x978, BIT(31), 0x1);
41098c2ecf20Sopenharmony_ci					rtl_set_bbreg(hw, 0x97c, BIT(31), 0x0);
41108c2ecf20Sopenharmony_ci					rtl_set_bbreg(hw, 0xcb8, 0xF, 0xe);
41118c2ecf20Sopenharmony_ci					rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
41128c2ecf20Sopenharmony_ci					rtl_write_dword(rtlpriv, 0x984, 0x0046a911);
41138c2ecf20Sopenharmony_ci
41148c2ecf20Sopenharmony_ci					rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
41158c2ecf20Sopenharmony_ci					rtl_set_bbreg(hw, 0xc80, BIT(29), 0x1);
41168c2ecf20Sopenharmony_ci					rtl_set_bbreg(hw, 0xc84, BIT(29), 0x0);
41178c2ecf20Sopenharmony_ci					rtl_write_dword(rtlpriv, 0xc88, 0x02140119);
41188c2ecf20Sopenharmony_ci
41198c2ecf20Sopenharmony_ci					rtl_write_dword(rtlpriv, 0xc8c, 0x28160d00); /* pDM_Odm->SupportInterface == 1 */
41208c2ecf20Sopenharmony_ci
41218c2ecf20Sopenharmony_ci					if (k == 2)
41228c2ecf20Sopenharmony_ci						rtl_set_bbreg(hw, 0xce8, BIT(30), 0x1);  /* RX VDF Enable */
41238c2ecf20Sopenharmony_ci					rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
41248c2ecf20Sopenharmony_ci
41258c2ecf20Sopenharmony_ci					cal_retry = 0;
41268c2ecf20Sopenharmony_ci					while (1) {
41278c2ecf20Sopenharmony_ci						/* one shot */
41288c2ecf20Sopenharmony_ci						rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
41298c2ecf20Sopenharmony_ci						rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
41308c2ecf20Sopenharmony_ci
41318c2ecf20Sopenharmony_ci						mdelay(10); /* Delay 10ms */
41328c2ecf20Sopenharmony_ci						rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
41338c2ecf20Sopenharmony_ci						delay_count = 0;
41348c2ecf20Sopenharmony_ci						while (1) {
41358c2ecf20Sopenharmony_ci							iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
41368c2ecf20Sopenharmony_ci							if ((~iqk_ready) || (delay_count > 20))
41378c2ecf20Sopenharmony_ci								break;
41388c2ecf20Sopenharmony_ci							else{
41398c2ecf20Sopenharmony_ci								mdelay(1);
41408c2ecf20Sopenharmony_ci								delay_count++;
41418c2ecf20Sopenharmony_ci							}
41428c2ecf20Sopenharmony_ci						}
41438c2ecf20Sopenharmony_ci
41448c2ecf20Sopenharmony_ci						if (delay_count < 20) {	/* If 20ms No Result, then cal_retry++ */
41458c2ecf20Sopenharmony_ci							/* ============RXIQK Check============== */
41468c2ecf20Sopenharmony_ci							rx_fail = rtl_get_bbreg(hw, 0xd00, BIT(11));
41478c2ecf20Sopenharmony_ci							if (rx_fail == 0) {
41488c2ecf20Sopenharmony_ci								rtl_write_dword(rtlpriv, 0xcb8, 0x06000000);
41498c2ecf20Sopenharmony_ci								vdf_x[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
41508c2ecf20Sopenharmony_ci								rtl_write_dword(rtlpriv, 0xcb8, 0x08000000);
41518c2ecf20Sopenharmony_ci								vdf_y[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
41528c2ecf20Sopenharmony_ci								rx0iqkok = true;
41538c2ecf20Sopenharmony_ci								break;
41548c2ecf20Sopenharmony_ci							} else {
41558c2ecf20Sopenharmony_ci								rtl_set_bbreg(hw, 0xc10, 0x000003ff, 0x200>>1);
41568c2ecf20Sopenharmony_ci								rtl_set_bbreg(hw, 0xc10, 0x03ff0000, 0x0>>1);
41578c2ecf20Sopenharmony_ci								rx0iqkok = false;
41588c2ecf20Sopenharmony_ci								cal_retry++;
41598c2ecf20Sopenharmony_ci								if (cal_retry == 10)
41608c2ecf20Sopenharmony_ci									break;
41618c2ecf20Sopenharmony_ci
41628c2ecf20Sopenharmony_ci							}
41638c2ecf20Sopenharmony_ci						} else{
41648c2ecf20Sopenharmony_ci							rx0iqkok = false;
41658c2ecf20Sopenharmony_ci							cal_retry++;
41668c2ecf20Sopenharmony_ci							if (cal_retry == 10)
41678c2ecf20Sopenharmony_ci								break;
41688c2ecf20Sopenharmony_ci						}
41698c2ecf20Sopenharmony_ci					}
41708c2ecf20Sopenharmony_ci
41718c2ecf20Sopenharmony_ci				}
41728c2ecf20Sopenharmony_ci				if (k == 3) {
41738c2ecf20Sopenharmony_ci					rx_x0[cal] = vdf_x[k-1];
41748c2ecf20Sopenharmony_ci					rx_y0[cal] = vdf_y[k-1];
41758c2ecf20Sopenharmony_ci				}
41768c2ecf20Sopenharmony_ci				rtl_set_bbreg(hw, 0xce8, BIT(31), 0x1);    /* TX VDF Enable */
41778c2ecf20Sopenharmony_ci			}
41788c2ecf20Sopenharmony_ci
41798c2ecf20Sopenharmony_ci			else{
41808c2ecf20Sopenharmony_ci				/* ====== RX mode TXK (RXK Step 1) ====== */
41818c2ecf20Sopenharmony_ci				rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
41828c2ecf20Sopenharmony_ci				/* 1. TX RF Setting */
41838c2ecf20Sopenharmony_ci				rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
41848c2ecf20Sopenharmony_ci				rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000);
41858c2ecf20Sopenharmony_ci				rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x00029);
41868c2ecf20Sopenharmony_ci				rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xd7ffb);
41878c2ecf20Sopenharmony_ci				rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, temp_reg65);
41888c2ecf20Sopenharmony_ci				rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001);
41898c2ecf20Sopenharmony_ci				rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
41908c2ecf20Sopenharmony_ci				rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
41918c2ecf20Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xb00, 0x03000100);
41928c2ecf20Sopenharmony_ci				rtl_write_dword(rtlpriv, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */
41938c2ecf20Sopenharmony_ci
41948c2ecf20Sopenharmony_ci				rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
41958c2ecf20Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc80, 0x18008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
41968c2ecf20Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc84, 0x38008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */
41978c2ecf20Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc88, 0x821603e0);
41988c2ecf20Sopenharmony_ci				/* ODM_Write4Byte(pDM_Odm, 0xc8c, 0x68163e96); */
41998c2ecf20Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
42008c2ecf20Sopenharmony_ci				cal_retry = 0;
42018c2ecf20Sopenharmony_ci				while (1) {
42028c2ecf20Sopenharmony_ci					/* one shot */
42038c2ecf20Sopenharmony_ci					rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
42048c2ecf20Sopenharmony_ci					rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
42058c2ecf20Sopenharmony_ci
42068c2ecf20Sopenharmony_ci					mdelay(10); /* Delay 10ms */
42078c2ecf20Sopenharmony_ci					rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
42088c2ecf20Sopenharmony_ci					delay_count = 0;
42098c2ecf20Sopenharmony_ci					while (1) {
42108c2ecf20Sopenharmony_ci						iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
42118c2ecf20Sopenharmony_ci						if ((~iqk_ready) || (delay_count > 20))
42128c2ecf20Sopenharmony_ci							break;
42138c2ecf20Sopenharmony_ci						else{
42148c2ecf20Sopenharmony_ci							mdelay(1);
42158c2ecf20Sopenharmony_ci							delay_count++;
42168c2ecf20Sopenharmony_ci						}
42178c2ecf20Sopenharmony_ci					}
42188c2ecf20Sopenharmony_ci
42198c2ecf20Sopenharmony_ci					if (delay_count < 20) {							/* If 20ms No Result, then cal_retry++ */
42208c2ecf20Sopenharmony_ci						/* ============TXIQK Check============== */
42218c2ecf20Sopenharmony_ci						tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12));
42228c2ecf20Sopenharmony_ci
42238c2ecf20Sopenharmony_ci						if (~tx_fail) {
42248c2ecf20Sopenharmony_ci							rtl_write_dword(rtlpriv, 0xcb8, 0x02000000);
42258c2ecf20Sopenharmony_ci							tx_x0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
42268c2ecf20Sopenharmony_ci							rtl_write_dword(rtlpriv, 0xcb8, 0x04000000);
42278c2ecf20Sopenharmony_ci							tx_y0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
42288c2ecf20Sopenharmony_ci							tx0iqkok = true;
42298c2ecf20Sopenharmony_ci							break;
42308c2ecf20Sopenharmony_ci						} else {
42318c2ecf20Sopenharmony_ci							tx0iqkok = false;
42328c2ecf20Sopenharmony_ci							cal_retry++;
42338c2ecf20Sopenharmony_ci							if (cal_retry == 10)
42348c2ecf20Sopenharmony_ci								break;
42358c2ecf20Sopenharmony_ci						}
42368c2ecf20Sopenharmony_ci					} else{
42378c2ecf20Sopenharmony_ci						tx0iqkok = false;
42388c2ecf20Sopenharmony_ci						cal_retry++;
42398c2ecf20Sopenharmony_ci						if (cal_retry == 10)
42408c2ecf20Sopenharmony_ci							break;
42418c2ecf20Sopenharmony_ci					}
42428c2ecf20Sopenharmony_ci				}
42438c2ecf20Sopenharmony_ci
42448c2ecf20Sopenharmony_ci				if (tx0iqkok == false) {   /* If RX mode TXK fail, then take TXK Result */
42458c2ecf20Sopenharmony_ci					tx_x0_rxk[cal] = tx_x0[cal];
42468c2ecf20Sopenharmony_ci					tx_y0_rxk[cal] = tx_y0[cal];
42478c2ecf20Sopenharmony_ci					tx0iqkok = true;
42488c2ecf20Sopenharmony_ci					rtl_dbg(rtlpriv, COMP_IQK,
42498c2ecf20Sopenharmony_ci						DBG_LOUD, "1");
42508c2ecf20Sopenharmony_ci				}
42518c2ecf20Sopenharmony_ci
42528c2ecf20Sopenharmony_ci				/* ====== RX IQK ====== */
42538c2ecf20Sopenharmony_ci				rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
42548c2ecf20Sopenharmony_ci				/* 1. RX RF Setting */
42558c2ecf20Sopenharmony_ci				rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
42568c2ecf20Sopenharmony_ci				rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000);
42578c2ecf20Sopenharmony_ci				rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0002f);
42588c2ecf20Sopenharmony_ci				rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xfffbb);
42598c2ecf20Sopenharmony_ci				rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x88001);
42608c2ecf20Sopenharmony_ci				rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d8);
42618c2ecf20Sopenharmony_ci				rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
42628c2ecf20Sopenharmony_ci
42638c2ecf20Sopenharmony_ci				rtl_set_bbreg(hw, 0x978, 0x03FF8000, (tx_x0_rxk[cal])>>21&0x000007ff);
42648c2ecf20Sopenharmony_ci				rtl_set_bbreg(hw, 0x978, 0x000007FF, (tx_y0_rxk[cal])>>21&0x000007ff);
42658c2ecf20Sopenharmony_ci				rtl_set_bbreg(hw, 0x978, BIT(31), 0x1);
42668c2ecf20Sopenharmony_ci				rtl_set_bbreg(hw, 0x97c, BIT(31), 0x0);
42678c2ecf20Sopenharmony_ci				/* ODM_SetBBReg(pDM_Odm, 0xcb8, 0xF, 0xe); */
42688c2ecf20Sopenharmony_ci				rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
42698c2ecf20Sopenharmony_ci				rtl_write_dword(rtlpriv, 0x984, 0x0046a911);
42708c2ecf20Sopenharmony_ci
42718c2ecf20Sopenharmony_ci				rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
42728c2ecf20Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc80, 0x38008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
42738c2ecf20Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc84, 0x18008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */
42748c2ecf20Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc88, 0x02140119);
42758c2ecf20Sopenharmony_ci
42768c2ecf20Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xc8c, 0x28160d00); /*pDM_Odm->SupportInterface == 1*/
42778c2ecf20Sopenharmony_ci
42788c2ecf20Sopenharmony_ci				rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
42798c2ecf20Sopenharmony_ci
42808c2ecf20Sopenharmony_ci				cal_retry = 0;
42818c2ecf20Sopenharmony_ci				while (1) {
42828c2ecf20Sopenharmony_ci					/* one shot */
42838c2ecf20Sopenharmony_ci					rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
42848c2ecf20Sopenharmony_ci					rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
42858c2ecf20Sopenharmony_ci
42868c2ecf20Sopenharmony_ci					mdelay(10); /* Delay 10ms */
42878c2ecf20Sopenharmony_ci					rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
42888c2ecf20Sopenharmony_ci					delay_count = 0;
42898c2ecf20Sopenharmony_ci					while (1) {
42908c2ecf20Sopenharmony_ci						iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
42918c2ecf20Sopenharmony_ci						if ((~iqk_ready) || (delay_count > 20))
42928c2ecf20Sopenharmony_ci							break;
42938c2ecf20Sopenharmony_ci						else{
42948c2ecf20Sopenharmony_ci							mdelay(1);
42958c2ecf20Sopenharmony_ci							delay_count++;
42968c2ecf20Sopenharmony_ci						}
42978c2ecf20Sopenharmony_ci					}
42988c2ecf20Sopenharmony_ci
42998c2ecf20Sopenharmony_ci					if (delay_count < 20) {	/* If 20ms No Result, then cal_retry++ */
43008c2ecf20Sopenharmony_ci						/* ============RXIQK Check============== */
43018c2ecf20Sopenharmony_ci						rx_fail = rtl_get_bbreg(hw, 0xd00, BIT(11));
43028c2ecf20Sopenharmony_ci						if (rx_fail == 0) {
43038c2ecf20Sopenharmony_ci							rtl_write_dword(rtlpriv, 0xcb8, 0x06000000);
43048c2ecf20Sopenharmony_ci							rx_x0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
43058c2ecf20Sopenharmony_ci							rtl_write_dword(rtlpriv, 0xcb8, 0x08000000);
43068c2ecf20Sopenharmony_ci							rx_y0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
43078c2ecf20Sopenharmony_ci							rx0iqkok = true;
43088c2ecf20Sopenharmony_ci							break;
43098c2ecf20Sopenharmony_ci						} else{
43108c2ecf20Sopenharmony_ci							rtl_set_bbreg(hw, 0xc10, 0x000003ff, 0x200>>1);
43118c2ecf20Sopenharmony_ci							rtl_set_bbreg(hw, 0xc10, 0x03ff0000, 0x0>>1);
43128c2ecf20Sopenharmony_ci							rx0iqkok = false;
43138c2ecf20Sopenharmony_ci							cal_retry++;
43148c2ecf20Sopenharmony_ci							if (cal_retry == 10)
43158c2ecf20Sopenharmony_ci								break;
43168c2ecf20Sopenharmony_ci
43178c2ecf20Sopenharmony_ci						}
43188c2ecf20Sopenharmony_ci					} else{
43198c2ecf20Sopenharmony_ci						rx0iqkok = false;
43208c2ecf20Sopenharmony_ci						cal_retry++;
43218c2ecf20Sopenharmony_ci						if (cal_retry == 10)
43228c2ecf20Sopenharmony_ci							break;
43238c2ecf20Sopenharmony_ci					}
43248c2ecf20Sopenharmony_ci				}
43258c2ecf20Sopenharmony_ci			}
43268c2ecf20Sopenharmony_ci
43278c2ecf20Sopenharmony_ci			if (tx0iqkok)
43288c2ecf20Sopenharmony_ci				tx_average++;
43298c2ecf20Sopenharmony_ci			if (rx0iqkok)
43308c2ecf20Sopenharmony_ci				rx_average++;
43318c2ecf20Sopenharmony_ci			rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
43328c2ecf20Sopenharmony_ci			rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, temp_reg65);
43338c2ecf20Sopenharmony_ci			break;
43348c2ecf20Sopenharmony_ci		default:
43358c2ecf20Sopenharmony_ci			break;
43368c2ecf20Sopenharmony_ci		}
43378c2ecf20Sopenharmony_ci		cal++;
43388c2ecf20Sopenharmony_ci	}
43398c2ecf20Sopenharmony_ci
43408c2ecf20Sopenharmony_ci	/* FillIQK Result */
43418c2ecf20Sopenharmony_ci	switch (path) {
43428c2ecf20Sopenharmony_ci	case RF90_PATH_A:
43438c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
43448c2ecf20Sopenharmony_ci			"========Path_A =======\n");
43458c2ecf20Sopenharmony_ci		if (tx_average == 0)
43468c2ecf20Sopenharmony_ci			break;
43478c2ecf20Sopenharmony_ci
43488c2ecf20Sopenharmony_ci		for (i = 0; i < tx_average; i++) {
43498c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
43508c2ecf20Sopenharmony_ci				"TX_X0_RXK[%d] = %x ;; TX_Y0_RXK[%d] = %x\n", i,
43518c2ecf20Sopenharmony_ci				(tx_x0_rxk[i]) >> 21 & 0x000007ff, i,
43528c2ecf20Sopenharmony_ci				(tx_y0_rxk[i]) >> 21 & 0x000007ff);
43538c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
43548c2ecf20Sopenharmony_ci				"TX_X0[%d] = %x ;; TX_Y0[%d] = %x\n", i,
43558c2ecf20Sopenharmony_ci				(tx_x0[i]) >> 21 & 0x000007ff, i,
43568c2ecf20Sopenharmony_ci				(tx_y0[i]) >> 21 & 0x000007ff);
43578c2ecf20Sopenharmony_ci		}
43588c2ecf20Sopenharmony_ci		for (i = 0; i < tx_average; i++) {
43598c2ecf20Sopenharmony_ci			for (ii = i+1; ii < tx_average; ii++) {
43608c2ecf20Sopenharmony_ci				dx = (tx_x0[i]>>21) - (tx_x0[ii]>>21);
43618c2ecf20Sopenharmony_ci				if (dx < 3 && dx > -3) {
43628c2ecf20Sopenharmony_ci					dy = (tx_y0[i]>>21) - (tx_y0[ii]>>21);
43638c2ecf20Sopenharmony_ci					if (dy < 3 && dy > -3) {
43648c2ecf20Sopenharmony_ci						tx_x = ((tx_x0[i]>>21) + (tx_x0[ii]>>21))/2;
43658c2ecf20Sopenharmony_ci						tx_y = ((tx_y0[i]>>21) + (tx_y0[ii]>>21))/2;
43668c2ecf20Sopenharmony_ci						tx_finish = 1;
43678c2ecf20Sopenharmony_ci						break;
43688c2ecf20Sopenharmony_ci					}
43698c2ecf20Sopenharmony_ci				}
43708c2ecf20Sopenharmony_ci			}
43718c2ecf20Sopenharmony_ci			if (tx_finish == 1)
43728c2ecf20Sopenharmony_ci				break;
43738c2ecf20Sopenharmony_ci		}
43748c2ecf20Sopenharmony_ci
43758c2ecf20Sopenharmony_ci		if (tx_finish == 1)
43768c2ecf20Sopenharmony_ci			_rtl8821ae_iqk_tx_fill_iqc(hw, path, tx_x, tx_y); /* ? */
43778c2ecf20Sopenharmony_ci		else
43788c2ecf20Sopenharmony_ci			_rtl8821ae_iqk_tx_fill_iqc(hw, path, 0x200, 0x0);
43798c2ecf20Sopenharmony_ci
43808c2ecf20Sopenharmony_ci		if (rx_average == 0)
43818c2ecf20Sopenharmony_ci			break;
43828c2ecf20Sopenharmony_ci
43838c2ecf20Sopenharmony_ci		for (i = 0; i < rx_average; i++)
43848c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
43858c2ecf20Sopenharmony_ci				"RX_X0[%d] = %x ;; RX_Y0[%d] = %x\n", i,
43868c2ecf20Sopenharmony_ci				(rx_x0[i])>>21&0x000007ff, i,
43878c2ecf20Sopenharmony_ci				(rx_y0[i])>>21&0x000007ff);
43888c2ecf20Sopenharmony_ci		for (i = 0; i < rx_average; i++) {
43898c2ecf20Sopenharmony_ci			for (ii = i+1; ii < rx_average; ii++) {
43908c2ecf20Sopenharmony_ci				dx = (rx_x0[i]>>21) - (rx_x0[ii]>>21);
43918c2ecf20Sopenharmony_ci				if (dx < 4 && dx > -4) {
43928c2ecf20Sopenharmony_ci					dy = (rx_y0[i]>>21) - (rx_y0[ii]>>21);
43938c2ecf20Sopenharmony_ci					if (dy < 4 && dy > -4) {
43948c2ecf20Sopenharmony_ci						rx_x = ((rx_x0[i]>>21) + (rx_x0[ii]>>21))/2;
43958c2ecf20Sopenharmony_ci						rx_y = ((rx_y0[i]>>21) + (rx_y0[ii]>>21))/2;
43968c2ecf20Sopenharmony_ci						rx_finish = 1;
43978c2ecf20Sopenharmony_ci						break;
43988c2ecf20Sopenharmony_ci					}
43998c2ecf20Sopenharmony_ci				}
44008c2ecf20Sopenharmony_ci			}
44018c2ecf20Sopenharmony_ci			if (rx_finish == 1)
44028c2ecf20Sopenharmony_ci				break;
44038c2ecf20Sopenharmony_ci		}
44048c2ecf20Sopenharmony_ci
44058c2ecf20Sopenharmony_ci		if (rx_finish == 1)
44068c2ecf20Sopenharmony_ci			_rtl8821ae_iqk_rx_fill_iqc(hw, path, rx_x, rx_y);
44078c2ecf20Sopenharmony_ci		else
44088c2ecf20Sopenharmony_ci			_rtl8821ae_iqk_rx_fill_iqc(hw, path, 0x200, 0x0);
44098c2ecf20Sopenharmony_ci		break;
44108c2ecf20Sopenharmony_ci	default:
44118c2ecf20Sopenharmony_ci		break;
44128c2ecf20Sopenharmony_ci	}
44138c2ecf20Sopenharmony_ci}
44148c2ecf20Sopenharmony_ci
44158c2ecf20Sopenharmony_cistatic void _rtl8821ae_iqk_restore_rf(struct ieee80211_hw *hw,
44168c2ecf20Sopenharmony_ci				      enum radio_path path,
44178c2ecf20Sopenharmony_ci				      u32 *backup_rf_reg,
44188c2ecf20Sopenharmony_ci				      u32 *rf_backup, u32 rf_reg_num)
44198c2ecf20Sopenharmony_ci{
44208c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
44218c2ecf20Sopenharmony_ci	u32 i;
44228c2ecf20Sopenharmony_ci
44238c2ecf20Sopenharmony_ci	rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
44248c2ecf20Sopenharmony_ci	for (i = 0; i < RF_REG_NUM; i++)
44258c2ecf20Sopenharmony_ci		rtl_set_rfreg(hw, path, backup_rf_reg[i], RFREG_OFFSET_MASK,
44268c2ecf20Sopenharmony_ci			      rf_backup[i]);
44278c2ecf20Sopenharmony_ci
44288c2ecf20Sopenharmony_ci	switch (path) {
44298c2ecf20Sopenharmony_ci	case RF90_PATH_A:
44308c2ecf20Sopenharmony_ci		rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
44318c2ecf20Sopenharmony_ci			"RestoreRF Path A Success!!!!\n");
44328c2ecf20Sopenharmony_ci		break;
44338c2ecf20Sopenharmony_ci	default:
44348c2ecf20Sopenharmony_ci			break;
44358c2ecf20Sopenharmony_ci	}
44368c2ecf20Sopenharmony_ci}
44378c2ecf20Sopenharmony_ci
44388c2ecf20Sopenharmony_cistatic void _rtl8821ae_iqk_restore_afe(struct ieee80211_hw *hw,
44398c2ecf20Sopenharmony_ci				       u32 *afe_backup, u32 *backup_afe_reg,
44408c2ecf20Sopenharmony_ci				       u32 afe_num)
44418c2ecf20Sopenharmony_ci{
44428c2ecf20Sopenharmony_ci	u32 i;
44438c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
44448c2ecf20Sopenharmony_ci
44458c2ecf20Sopenharmony_ci	rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
44468c2ecf20Sopenharmony_ci	/* Reload AFE Parameters */
44478c2ecf20Sopenharmony_ci	for (i = 0; i < afe_num; i++)
44488c2ecf20Sopenharmony_ci		rtl_write_dword(rtlpriv, backup_afe_reg[i], afe_backup[i]);
44498c2ecf20Sopenharmony_ci	rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
44508c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, 0xc80, 0x0);
44518c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, 0xc84, 0x0);
44528c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, 0xc88, 0x0);
44538c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, 0xc8c, 0x3c000000);
44548c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, 0xc90, 0x00000080);
44558c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, 0xc94, 0x00000000);
44568c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, 0xcc4, 0x20040000);
44578c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, 0xcc8, 0x20000000);
44588c2ecf20Sopenharmony_ci	rtl_write_dword(rtlpriv, 0xcb8, 0x0);
44598c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD, "RestoreAFE Success!!!!\n");
44608c2ecf20Sopenharmony_ci}
44618c2ecf20Sopenharmony_ci
44628c2ecf20Sopenharmony_cistatic void _rtl8821ae_iqk_restore_macbb(struct ieee80211_hw *hw,
44638c2ecf20Sopenharmony_ci					 u32 *macbb_backup,
44648c2ecf20Sopenharmony_ci					 u32 *backup_macbb_reg,
44658c2ecf20Sopenharmony_ci					 u32 macbb_num)
44668c2ecf20Sopenharmony_ci{
44678c2ecf20Sopenharmony_ci	u32 i;
44688c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
44698c2ecf20Sopenharmony_ci
44708c2ecf20Sopenharmony_ci	rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
44718c2ecf20Sopenharmony_ci	/* Reload MacBB Parameters */
44728c2ecf20Sopenharmony_ci	for (i = 0; i < macbb_num; i++)
44738c2ecf20Sopenharmony_ci		rtl_write_dword(rtlpriv, backup_macbb_reg[i], macbb_backup[i]);
44748c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD, "RestoreMacBB Success!!!!\n");
44758c2ecf20Sopenharmony_ci}
44768c2ecf20Sopenharmony_ci
44778c2ecf20Sopenharmony_ci#undef MACBB_REG_NUM
44788c2ecf20Sopenharmony_ci#undef AFE_REG_NUM
44798c2ecf20Sopenharmony_ci#undef RF_REG_NUM
44808c2ecf20Sopenharmony_ci
44818c2ecf20Sopenharmony_ci#define MACBB_REG_NUM 11
44828c2ecf20Sopenharmony_ci#define AFE_REG_NUM 12
44838c2ecf20Sopenharmony_ci#define RF_REG_NUM 3
44848c2ecf20Sopenharmony_ci
44858c2ecf20Sopenharmony_cistatic void _rtl8821ae_phy_iq_calibrate(struct ieee80211_hw *hw)
44868c2ecf20Sopenharmony_ci{
44878c2ecf20Sopenharmony_ci	u32	macbb_backup[MACBB_REG_NUM];
44888c2ecf20Sopenharmony_ci	u32 afe_backup[AFE_REG_NUM];
44898c2ecf20Sopenharmony_ci	u32 rfa_backup[RF_REG_NUM];
44908c2ecf20Sopenharmony_ci	u32 rfb_backup[RF_REG_NUM];
44918c2ecf20Sopenharmony_ci	u32 backup_macbb_reg[MACBB_REG_NUM] = {
44928c2ecf20Sopenharmony_ci		0xb00, 0x520, 0x550, 0x808, 0x90c, 0xc00, 0xc50,
44938c2ecf20Sopenharmony_ci		0xe00, 0xe50, 0x838, 0x82c
44948c2ecf20Sopenharmony_ci	};
44958c2ecf20Sopenharmony_ci	u32 backup_afe_reg[AFE_REG_NUM] = {
44968c2ecf20Sopenharmony_ci		0xc5c, 0xc60, 0xc64, 0xc68, 0xc6c, 0xc70, 0xc74,
44978c2ecf20Sopenharmony_ci		0xc78, 0xc7c, 0xc80, 0xc84, 0xcb8
44988c2ecf20Sopenharmony_ci	};
44998c2ecf20Sopenharmony_ci	u32	backup_rf_reg[RF_REG_NUM] = {0x65, 0x8f, 0x0};
45008c2ecf20Sopenharmony_ci
45018c2ecf20Sopenharmony_ci	_rtl8821ae_iqk_backup_macbb(hw, macbb_backup, backup_macbb_reg,
45028c2ecf20Sopenharmony_ci				    MACBB_REG_NUM);
45038c2ecf20Sopenharmony_ci	_rtl8821ae_iqk_backup_afe(hw, afe_backup, backup_afe_reg, AFE_REG_NUM);
45048c2ecf20Sopenharmony_ci	_rtl8821ae_iqk_backup_rf(hw, rfa_backup, rfb_backup, backup_rf_reg,
45058c2ecf20Sopenharmony_ci				 RF_REG_NUM);
45068c2ecf20Sopenharmony_ci
45078c2ecf20Sopenharmony_ci	_rtl8821ae_iqk_configure_mac(hw);
45088c2ecf20Sopenharmony_ci	_rtl8821ae_iqk_tx(hw, RF90_PATH_A);
45098c2ecf20Sopenharmony_ci	_rtl8821ae_iqk_restore_rf(hw, RF90_PATH_A, backup_rf_reg, rfa_backup,
45108c2ecf20Sopenharmony_ci				  RF_REG_NUM);
45118c2ecf20Sopenharmony_ci
45128c2ecf20Sopenharmony_ci	_rtl8821ae_iqk_restore_afe(hw, afe_backup, backup_afe_reg, AFE_REG_NUM);
45138c2ecf20Sopenharmony_ci	_rtl8821ae_iqk_restore_macbb(hw, macbb_backup, backup_macbb_reg,
45148c2ecf20Sopenharmony_ci				     MACBB_REG_NUM);
45158c2ecf20Sopenharmony_ci}
45168c2ecf20Sopenharmony_ci
45178c2ecf20Sopenharmony_cistatic void _rtl8821ae_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool main)
45188c2ecf20Sopenharmony_ci{
45198c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
45208c2ecf20Sopenharmony_ci	/* struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); */
45218c2ecf20Sopenharmony_ci	/* struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); */
45228c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "\n");
45238c2ecf20Sopenharmony_ci
45248c2ecf20Sopenharmony_ci	if (main)
45258c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_PINMUX + 4, BIT(29) | BIT(28), 0x1);
45268c2ecf20Sopenharmony_ci	else
45278c2ecf20Sopenharmony_ci		rtl_set_bbreg(hw, RA_RFE_PINMUX + 4, BIT(29) | BIT(28), 0x2);
45288c2ecf20Sopenharmony_ci}
45298c2ecf20Sopenharmony_ci
45308c2ecf20Sopenharmony_ci#undef IQK_ADDA_REG_NUM
45318c2ecf20Sopenharmony_ci#undef IQK_DELAY_TIME
45328c2ecf20Sopenharmony_ci
45338c2ecf20Sopenharmony_civoid rtl8812ae_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery)
45348c2ecf20Sopenharmony_ci{
45358c2ecf20Sopenharmony_ci}
45368c2ecf20Sopenharmony_ci
45378c2ecf20Sopenharmony_civoid rtl8812ae_do_iqk(struct ieee80211_hw *hw, u8 delta_thermal_index,
45388c2ecf20Sopenharmony_ci		      u8 thermal_value, u8 threshold)
45398c2ecf20Sopenharmony_ci{
45408c2ecf20Sopenharmony_ci	struct rtl_dm	*rtldm = rtl_dm(rtl_priv(hw));
45418c2ecf20Sopenharmony_ci
45428c2ecf20Sopenharmony_ci	rtldm->thermalvalue_iqk = thermal_value;
45438c2ecf20Sopenharmony_ci	rtl8812ae_phy_iq_calibrate(hw, false);
45448c2ecf20Sopenharmony_ci}
45458c2ecf20Sopenharmony_ci
45468c2ecf20Sopenharmony_civoid rtl8821ae_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery)
45478c2ecf20Sopenharmony_ci{
45488c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
45498c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
45508c2ecf20Sopenharmony_ci
45518c2ecf20Sopenharmony_ci	if (!rtlphy->lck_inprogress) {
45528c2ecf20Sopenharmony_ci		spin_lock(&rtlpriv->locks.iqk_lock);
45538c2ecf20Sopenharmony_ci		rtlphy->lck_inprogress = true;
45548c2ecf20Sopenharmony_ci		spin_unlock(&rtlpriv->locks.iqk_lock);
45558c2ecf20Sopenharmony_ci
45568c2ecf20Sopenharmony_ci		_rtl8821ae_phy_iq_calibrate(hw);
45578c2ecf20Sopenharmony_ci
45588c2ecf20Sopenharmony_ci		spin_lock(&rtlpriv->locks.iqk_lock);
45598c2ecf20Sopenharmony_ci		rtlphy->lck_inprogress = false;
45608c2ecf20Sopenharmony_ci		spin_unlock(&rtlpriv->locks.iqk_lock);
45618c2ecf20Sopenharmony_ci	}
45628c2ecf20Sopenharmony_ci}
45638c2ecf20Sopenharmony_ci
45648c2ecf20Sopenharmony_civoid rtl8821ae_reset_iqk_result(struct ieee80211_hw *hw)
45658c2ecf20Sopenharmony_ci{
45668c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
45678c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
45688c2ecf20Sopenharmony_ci	u8 i;
45698c2ecf20Sopenharmony_ci
45708c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
45718c2ecf20Sopenharmony_ci		"rtl8812ae_dm_reset_iqk_result:: settings regs %d default regs %d\n",
45728c2ecf20Sopenharmony_ci		(int)(sizeof(rtlphy->iqk_matrix) /
45738c2ecf20Sopenharmony_ci		sizeof(struct iqk_matrix_regs)),
45748c2ecf20Sopenharmony_ci		IQK_MATRIX_SETTINGS_NUM);
45758c2ecf20Sopenharmony_ci
45768c2ecf20Sopenharmony_ci	for (i = 0; i < IQK_MATRIX_SETTINGS_NUM; i++) {
45778c2ecf20Sopenharmony_ci		rtlphy->iqk_matrix[i].value[0][0] = 0x100;
45788c2ecf20Sopenharmony_ci		rtlphy->iqk_matrix[i].value[0][2] = 0x100;
45798c2ecf20Sopenharmony_ci		rtlphy->iqk_matrix[i].value[0][4] = 0x100;
45808c2ecf20Sopenharmony_ci		rtlphy->iqk_matrix[i].value[0][6] = 0x100;
45818c2ecf20Sopenharmony_ci
45828c2ecf20Sopenharmony_ci		rtlphy->iqk_matrix[i].value[0][1] = 0x0;
45838c2ecf20Sopenharmony_ci		rtlphy->iqk_matrix[i].value[0][3] = 0x0;
45848c2ecf20Sopenharmony_ci		rtlphy->iqk_matrix[i].value[0][5] = 0x0;
45858c2ecf20Sopenharmony_ci		rtlphy->iqk_matrix[i].value[0][7] = 0x0;
45868c2ecf20Sopenharmony_ci
45878c2ecf20Sopenharmony_ci		rtlphy->iqk_matrix[i].iqk_done = false;
45888c2ecf20Sopenharmony_ci	}
45898c2ecf20Sopenharmony_ci}
45908c2ecf20Sopenharmony_ci
45918c2ecf20Sopenharmony_civoid rtl8821ae_do_iqk(struct ieee80211_hw *hw, u8 delta_thermal_index,
45928c2ecf20Sopenharmony_ci		      u8 thermal_value, u8 threshold)
45938c2ecf20Sopenharmony_ci{
45948c2ecf20Sopenharmony_ci	struct rtl_dm	*rtldm = rtl_dm(rtl_priv(hw));
45958c2ecf20Sopenharmony_ci
45968c2ecf20Sopenharmony_ci	rtl8821ae_reset_iqk_result(hw);
45978c2ecf20Sopenharmony_ci
45988c2ecf20Sopenharmony_ci	rtldm->thermalvalue_iqk = thermal_value;
45998c2ecf20Sopenharmony_ci	rtl8821ae_phy_iq_calibrate(hw, false);
46008c2ecf20Sopenharmony_ci}
46018c2ecf20Sopenharmony_ci
46028c2ecf20Sopenharmony_civoid rtl8821ae_phy_lc_calibrate(struct ieee80211_hw *hw)
46038c2ecf20Sopenharmony_ci{
46048c2ecf20Sopenharmony_ci}
46058c2ecf20Sopenharmony_ci
46068c2ecf20Sopenharmony_civoid rtl8821ae_phy_ap_calibrate(struct ieee80211_hw *hw, s8 delta)
46078c2ecf20Sopenharmony_ci{
46088c2ecf20Sopenharmony_ci}
46098c2ecf20Sopenharmony_ci
46108c2ecf20Sopenharmony_civoid rtl8821ae_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain)
46118c2ecf20Sopenharmony_ci{
46128c2ecf20Sopenharmony_ci	_rtl8821ae_phy_set_rfpath_switch(hw, bmain);
46138c2ecf20Sopenharmony_ci}
46148c2ecf20Sopenharmony_ci
46158c2ecf20Sopenharmony_cibool rtl8821ae_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
46168c2ecf20Sopenharmony_ci{
46178c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
46188c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
46198c2ecf20Sopenharmony_ci	bool postprocessing = false;
46208c2ecf20Sopenharmony_ci
46218c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
46228c2ecf20Sopenharmony_ci		"-->IO Cmd(%#x), set_io_inprogress(%d)\n",
46238c2ecf20Sopenharmony_ci		iotype, rtlphy->set_io_inprogress);
46248c2ecf20Sopenharmony_ci	do {
46258c2ecf20Sopenharmony_ci		switch (iotype) {
46268c2ecf20Sopenharmony_ci		case IO_CMD_RESUME_DM_BY_SCAN:
46278c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
46288c2ecf20Sopenharmony_ci				"[IO CMD] Resume DM after scan.\n");
46298c2ecf20Sopenharmony_ci			postprocessing = true;
46308c2ecf20Sopenharmony_ci			break;
46318c2ecf20Sopenharmony_ci		case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
46328c2ecf20Sopenharmony_ci		case IO_CMD_PAUSE_BAND1_DM_BY_SCAN:
46338c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
46348c2ecf20Sopenharmony_ci				"[IO CMD] Pause DM before scan.\n");
46358c2ecf20Sopenharmony_ci			postprocessing = true;
46368c2ecf20Sopenharmony_ci			break;
46378c2ecf20Sopenharmony_ci		default:
46388c2ecf20Sopenharmony_ci			pr_err("switch case %#x not processed\n",
46398c2ecf20Sopenharmony_ci			       iotype);
46408c2ecf20Sopenharmony_ci			break;
46418c2ecf20Sopenharmony_ci		}
46428c2ecf20Sopenharmony_ci	} while (false);
46438c2ecf20Sopenharmony_ci	if (postprocessing && !rtlphy->set_io_inprogress) {
46448c2ecf20Sopenharmony_ci		rtlphy->set_io_inprogress = true;
46458c2ecf20Sopenharmony_ci		rtlphy->current_io_type = iotype;
46468c2ecf20Sopenharmony_ci	} else {
46478c2ecf20Sopenharmony_ci		return false;
46488c2ecf20Sopenharmony_ci	}
46498c2ecf20Sopenharmony_ci	rtl8821ae_phy_set_io(hw);
46508c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE, "IO Type(%#x)\n", iotype);
46518c2ecf20Sopenharmony_ci	return true;
46528c2ecf20Sopenharmony_ci}
46538c2ecf20Sopenharmony_ci
46548c2ecf20Sopenharmony_cistatic void rtl8821ae_phy_set_io(struct ieee80211_hw *hw)
46558c2ecf20Sopenharmony_ci{
46568c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
46578c2ecf20Sopenharmony_ci	struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
46588c2ecf20Sopenharmony_ci	struct rtl_phy *rtlphy = &rtlpriv->phy;
46598c2ecf20Sopenharmony_ci
46608c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
46618c2ecf20Sopenharmony_ci		"--->Cmd(%#x), set_io_inprogress(%d)\n",
46628c2ecf20Sopenharmony_ci		rtlphy->current_io_type, rtlphy->set_io_inprogress);
46638c2ecf20Sopenharmony_ci	switch (rtlphy->current_io_type) {
46648c2ecf20Sopenharmony_ci	case IO_CMD_RESUME_DM_BY_SCAN:
46658c2ecf20Sopenharmony_ci		if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC)
46668c2ecf20Sopenharmony_ci			_rtl8821ae_resume_tx_beacon(hw);
46678c2ecf20Sopenharmony_ci		rtl8821ae_dm_write_dig(hw, rtlphy->initgain_backup.xaagccore1);
46688c2ecf20Sopenharmony_ci		rtl8821ae_dm_write_cck_cca_thres(hw,
46698c2ecf20Sopenharmony_ci						 rtlphy->initgain_backup.cca);
46708c2ecf20Sopenharmony_ci		break;
46718c2ecf20Sopenharmony_ci	case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
46728c2ecf20Sopenharmony_ci		if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC)
46738c2ecf20Sopenharmony_ci			_rtl8821ae_stop_tx_beacon(hw);
46748c2ecf20Sopenharmony_ci		rtlphy->initgain_backup.xaagccore1 = dm_digtable->cur_igvalue;
46758c2ecf20Sopenharmony_ci		rtl8821ae_dm_write_dig(hw, 0x17);
46768c2ecf20Sopenharmony_ci		rtlphy->initgain_backup.cca = dm_digtable->cur_cck_cca_thres;
46778c2ecf20Sopenharmony_ci		rtl8821ae_dm_write_cck_cca_thres(hw, 0x40);
46788c2ecf20Sopenharmony_ci		break;
46798c2ecf20Sopenharmony_ci	case IO_CMD_PAUSE_BAND1_DM_BY_SCAN:
46808c2ecf20Sopenharmony_ci		break;
46818c2ecf20Sopenharmony_ci	default:
46828c2ecf20Sopenharmony_ci		pr_err("switch case %#x not processed\n",
46838c2ecf20Sopenharmony_ci		       rtlphy->current_io_type);
46848c2ecf20Sopenharmony_ci		break;
46858c2ecf20Sopenharmony_ci	}
46868c2ecf20Sopenharmony_ci	rtlphy->set_io_inprogress = false;
46878c2ecf20Sopenharmony_ci	rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
46888c2ecf20Sopenharmony_ci		"(%#x)\n", rtlphy->current_io_type);
46898c2ecf20Sopenharmony_ci}
46908c2ecf20Sopenharmony_ci
46918c2ecf20Sopenharmony_cistatic void rtl8821ae_phy_set_rf_on(struct ieee80211_hw *hw)
46928c2ecf20Sopenharmony_ci{
46938c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
46948c2ecf20Sopenharmony_ci
46958c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b);
46968c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
46978c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
46988c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
46998c2ecf20Sopenharmony_ci	rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
47008c2ecf20Sopenharmony_ci}
47018c2ecf20Sopenharmony_ci
47028c2ecf20Sopenharmony_cistatic bool _rtl8821ae_phy_set_rf_power_state(struct ieee80211_hw *hw,
47038c2ecf20Sopenharmony_ci					      enum rf_pwrstate rfpwr_state)
47048c2ecf20Sopenharmony_ci{
47058c2ecf20Sopenharmony_ci	struct rtl_priv *rtlpriv = rtl_priv(hw);
47068c2ecf20Sopenharmony_ci	struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
47078c2ecf20Sopenharmony_ci	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
47088c2ecf20Sopenharmony_ci	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
47098c2ecf20Sopenharmony_ci	bool bresult = true;
47108c2ecf20Sopenharmony_ci	u8 i, queue_id;
47118c2ecf20Sopenharmony_ci	struct rtl8192_tx_ring *ring = NULL;
47128c2ecf20Sopenharmony_ci
47138c2ecf20Sopenharmony_ci	switch (rfpwr_state) {
47148c2ecf20Sopenharmony_ci	case ERFON:
47158c2ecf20Sopenharmony_ci		if ((ppsc->rfpwr_state == ERFOFF) &&
47168c2ecf20Sopenharmony_ci		    RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
47178c2ecf20Sopenharmony_ci			bool rtstatus = false;
47188c2ecf20Sopenharmony_ci			u32 initializecount = 0;
47198c2ecf20Sopenharmony_ci
47208c2ecf20Sopenharmony_ci			do {
47218c2ecf20Sopenharmony_ci				initializecount++;
47228c2ecf20Sopenharmony_ci				rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
47238c2ecf20Sopenharmony_ci					"IPS Set eRf nic enable\n");
47248c2ecf20Sopenharmony_ci				rtstatus = rtl_ps_enable_nic(hw);
47258c2ecf20Sopenharmony_ci			} while (!rtstatus && (initializecount < 10));
47268c2ecf20Sopenharmony_ci			RT_CLEAR_PS_LEVEL(ppsc,
47278c2ecf20Sopenharmony_ci					  RT_RF_OFF_LEVL_HALT_NIC);
47288c2ecf20Sopenharmony_ci		} else {
47298c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
47308c2ecf20Sopenharmony_ci				"Set ERFON slept:%d ms\n",
47318c2ecf20Sopenharmony_ci				jiffies_to_msecs(jiffies -
47328c2ecf20Sopenharmony_ci						 ppsc->last_sleep_jiffies));
47338c2ecf20Sopenharmony_ci			ppsc->last_awake_jiffies = jiffies;
47348c2ecf20Sopenharmony_ci			rtl8821ae_phy_set_rf_on(hw);
47358c2ecf20Sopenharmony_ci		}
47368c2ecf20Sopenharmony_ci		if (mac->link_state == MAC80211_LINKED) {
47378c2ecf20Sopenharmony_ci			rtlpriv->cfg->ops->led_control(hw,
47388c2ecf20Sopenharmony_ci						       LED_CTL_LINK);
47398c2ecf20Sopenharmony_ci		} else {
47408c2ecf20Sopenharmony_ci			rtlpriv->cfg->ops->led_control(hw,
47418c2ecf20Sopenharmony_ci						       LED_CTL_NO_LINK);
47428c2ecf20Sopenharmony_ci		}
47438c2ecf20Sopenharmony_ci		break;
47448c2ecf20Sopenharmony_ci	case ERFOFF:
47458c2ecf20Sopenharmony_ci		for (queue_id = 0, i = 0;
47468c2ecf20Sopenharmony_ci		     queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
47478c2ecf20Sopenharmony_ci			ring = &pcipriv->dev.tx_ring[queue_id];
47488c2ecf20Sopenharmony_ci			if (queue_id == BEACON_QUEUE ||
47498c2ecf20Sopenharmony_ci			    skb_queue_len(&ring->queue) == 0) {
47508c2ecf20Sopenharmony_ci				queue_id++;
47518c2ecf20Sopenharmony_ci				continue;
47528c2ecf20Sopenharmony_ci			} else {
47538c2ecf20Sopenharmony_ci				rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
47548c2ecf20Sopenharmony_ci					"eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
47558c2ecf20Sopenharmony_ci					(i + 1), queue_id,
47568c2ecf20Sopenharmony_ci					skb_queue_len(&ring->queue));
47578c2ecf20Sopenharmony_ci
47588c2ecf20Sopenharmony_ci				udelay(10);
47598c2ecf20Sopenharmony_ci				i++;
47608c2ecf20Sopenharmony_ci			}
47618c2ecf20Sopenharmony_ci			if (i >= MAX_DOZE_WAITING_TIMES_9x) {
47628c2ecf20Sopenharmony_ci				rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
47638c2ecf20Sopenharmony_ci					"\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
47648c2ecf20Sopenharmony_ci					MAX_DOZE_WAITING_TIMES_9x,
47658c2ecf20Sopenharmony_ci					queue_id,
47668c2ecf20Sopenharmony_ci					skb_queue_len(&ring->queue));
47678c2ecf20Sopenharmony_ci				break;
47688c2ecf20Sopenharmony_ci			}
47698c2ecf20Sopenharmony_ci		}
47708c2ecf20Sopenharmony_ci
47718c2ecf20Sopenharmony_ci		if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
47728c2ecf20Sopenharmony_ci			rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
47738c2ecf20Sopenharmony_ci				"IPS Set eRf nic disable\n");
47748c2ecf20Sopenharmony_ci			rtl_ps_disable_nic(hw);
47758c2ecf20Sopenharmony_ci			RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
47768c2ecf20Sopenharmony_ci		} else {
47778c2ecf20Sopenharmony_ci			if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) {
47788c2ecf20Sopenharmony_ci				rtlpriv->cfg->ops->led_control(hw,
47798c2ecf20Sopenharmony_ci							       LED_CTL_NO_LINK);
47808c2ecf20Sopenharmony_ci			} else {
47818c2ecf20Sopenharmony_ci				rtlpriv->cfg->ops->led_control(hw,
47828c2ecf20Sopenharmony_ci							       LED_CTL_POWER_OFF);
47838c2ecf20Sopenharmony_ci			}
47848c2ecf20Sopenharmony_ci		}
47858c2ecf20Sopenharmony_ci		break;
47868c2ecf20Sopenharmony_ci	default:
47878c2ecf20Sopenharmony_ci		pr_err("switch case %#x not processed\n",
47888c2ecf20Sopenharmony_ci		       rfpwr_state);
47898c2ecf20Sopenharmony_ci		bresult = false;
47908c2ecf20Sopenharmony_ci		break;
47918c2ecf20Sopenharmony_ci	}
47928c2ecf20Sopenharmony_ci	if (bresult)
47938c2ecf20Sopenharmony_ci		ppsc->rfpwr_state = rfpwr_state;
47948c2ecf20Sopenharmony_ci	return bresult;
47958c2ecf20Sopenharmony_ci}
47968c2ecf20Sopenharmony_ci
47978c2ecf20Sopenharmony_cibool rtl8821ae_phy_set_rf_power_state(struct ieee80211_hw *hw,
47988c2ecf20Sopenharmony_ci				      enum rf_pwrstate rfpwr_state)
47998c2ecf20Sopenharmony_ci{
48008c2ecf20Sopenharmony_ci	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
48018c2ecf20Sopenharmony_ci
48028c2ecf20Sopenharmony_ci	bool bresult = false;
48038c2ecf20Sopenharmony_ci
48048c2ecf20Sopenharmony_ci	if (rfpwr_state == ppsc->rfpwr_state)
48058c2ecf20Sopenharmony_ci		return bresult;
48068c2ecf20Sopenharmony_ci	bresult = _rtl8821ae_phy_set_rf_power_state(hw, rfpwr_state);
48078c2ecf20Sopenharmony_ci	return bresult;
48088c2ecf20Sopenharmony_ci}
4809