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