1 /******************************************************************************
2  *
3  * Copyright(c) 2009-2012  Realtek Corporation.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12  * more details.
13  *
14  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17  *
18  * The full GNU General Public License is included in this distribution in the
19  * file called LICENSE.
20  *
21  * Contact Information:
22  * wlanfae <wlanfae@realtek.com>
23  * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
24  * Hsinchu 300, Taiwan.
25  *
26  * Larry Finger <Larry.Finger@lwfinger.net>
27  *
28  *****************************************************************************/
29 
30 #include "../wifi.h"
31 #include "../pci.h"
32 #include "../ps.h"
33 #include "../core.h"
34 #include "reg.h"
35 #include "def.h"
36 #include "phy.h"
37 #include "rf.h"
38 #include "dm.h"
39 #include "table.h"
40 #include "sw.h"
41 #include "hw.h"
42 
43 #define MAX_RF_IMR_INDEX			12
44 #define MAX_RF_IMR_INDEX_NORMAL			13
45 #define RF_REG_NUM_FOR_C_CUT_5G			6
46 #define RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA	7
47 #define RF_REG_NUM_FOR_C_CUT_2G			5
48 #define RF_CHNL_NUM_5G				19
49 #define RF_CHNL_NUM_5G_40M			17
50 #define TARGET_CHNL_NUM_5G			221
51 #define TARGET_CHNL_NUM_2G			14
52 #define CV_CURVE_CNT				64
53 
54 static u32 rf_reg_for_5g_swchnl_normal[MAX_RF_IMR_INDEX_NORMAL] = {
55 	0, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x0
56 };
57 
58 static u8 rf_reg_for_c_cut_5g[RF_REG_NUM_FOR_C_CUT_5G] = {
59 	RF_SYN_G1, RF_SYN_G2, RF_SYN_G3, RF_SYN_G4, RF_SYN_G5, RF_SYN_G6
60 };
61 
62 static u8 rf_reg_for_c_cut_2g[RF_REG_NUM_FOR_C_CUT_2G] = {
63 	RF_SYN_G1, RF_SYN_G2, RF_SYN_G3, RF_SYN_G7, RF_SYN_G8
64 };
65 
66 static u8 rf_for_c_cut_5g_internal_pa[RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA] = {
67 	0x0B, 0x48, 0x49, 0x4B, 0x03, 0x04, 0x0E
68 };
69 
70 static u32 rf_reg_mask_for_c_cut_2g[RF_REG_NUM_FOR_C_CUT_2G] = {
71 	BIT(19) | BIT(18) | BIT(17) | BIT(14) | BIT(1),
72 	BIT(10) | BIT(9),
73 	BIT(18) | BIT(17) | BIT(16) | BIT(1),
74 	BIT(2) | BIT(1),
75 	BIT(15) | BIT(14) | BIT(13) | BIT(12) | BIT(11)
76 };
77 
78 static u8 rf_chnl_5g[RF_CHNL_NUM_5G] = {
79 	36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108,
80 	112, 116, 120, 124, 128, 132, 136, 140
81 };
82 
83 static u8 rf_chnl_5g_40m[RF_CHNL_NUM_5G_40M] = {
84 	38, 42, 46, 50, 54, 58, 62, 102, 106, 110, 114,
85 	118, 122, 126, 130, 134, 138
86 };
87 static u32 rf_reg_pram_c_5g[5][RF_REG_NUM_FOR_C_CUT_5G] = {
88 	{0xE43BE, 0xFC638, 0x77C0A, 0xDE471, 0xd7110, 0x8EB04},
89 	{0xE43BE, 0xFC078, 0xF7C1A, 0xE0C71, 0xD7550, 0xAEB04},
90 	{0xE43BF, 0xFF038, 0xF7C0A, 0xDE471, 0xE5550, 0xAEB04},
91 	{0xE43BF, 0xFF079, 0xF7C1A, 0xDE471, 0xE5550, 0xAEB04},
92 	{0xE43BF, 0xFF038, 0xF7C1A, 0xDE471, 0xd7550, 0xAEB04}
93 };
94 
95 static u32 rf_reg_param_for_c_cut_2g[3][RF_REG_NUM_FOR_C_CUT_2G] = {
96 	{0x643BC, 0xFC038, 0x77C1A, 0x41289, 0x01840},
97 	{0x643BC, 0xFC038, 0x07C1A, 0x41289, 0x01840},
98 	{0x243BC, 0xFC438, 0x07C1A, 0x4128B, 0x0FC41}
99 };
100 
101 static u32 rf_syn_g4_for_c_cut_2g = 0xD1C31 & 0x7FF;
102 
103 static u32 rf_pram_c_5g_int_pa[3][RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA] = {
104 	{0x01a00, 0x40443, 0x00eb5, 0x89bec, 0x94a12, 0x94a12, 0x94a12},
105 	{0x01800, 0xc0443, 0x00730, 0x896ee, 0x94a52, 0x94a52, 0x94a52},
106 	{0x01800, 0xc0443, 0x00730, 0x896ee, 0x94a12, 0x94a12, 0x94a12}
107 };
108 
109 /* [mode][patha+b][reg] */
110 static u32 rf_imr_param_normal[1][3][MAX_RF_IMR_INDEX_NORMAL] = {
111 	{
112 		/* channel 1-14. */
113 		{
114 			0x70000, 0x00ff0, 0x4400f, 0x00ff0, 0x0, 0x0, 0x0,
115 			0x0, 0x0, 0x64888, 0xe266c, 0x00090, 0x22fff
116 		},
117 		/* path 36-64 */
118 		{
119 			0x70000, 0x22880, 0x4470f, 0x55880, 0x00070, 0x88000,
120 			0x0, 0x88080, 0x70000, 0x64a82, 0xe466c, 0x00090,
121 			0x32c9a
122 		},
123 		/* 100 -165 */
124 		{
125 			0x70000, 0x44880, 0x4477f, 0x77880, 0x00070, 0x88000,
126 			0x0, 0x880b0, 0x0, 0x64b82, 0xe466c, 0x00090, 0x32c9a
127 		}
128 	}
129 };
130 
131 static u32 curveindex_5g[TARGET_CHNL_NUM_5G] = {0};
132 
133 static u32 curveindex_2g[TARGET_CHNL_NUM_2G] = {0};
134 
135 static u32 targetchnl_5g[TARGET_CHNL_NUM_5G] = {
136 	25141, 25116, 25091, 25066, 25041,
137 	25016, 24991, 24966, 24941, 24917,
138 	24892, 24867, 24843, 24818, 24794,
139 	24770, 24765, 24721, 24697, 24672,
140 	24648, 24624, 24600, 24576, 24552,
141 	24528, 24504, 24480, 24457, 24433,
142 	24409, 24385, 24362, 24338, 24315,
143 	24291, 24268, 24245, 24221, 24198,
144 	24175, 24151, 24128, 24105, 24082,
145 	24059, 24036, 24013, 23990, 23967,
146 	23945, 23922, 23899, 23876, 23854,
147 	23831, 23809, 23786, 23764, 23741,
148 	23719, 23697, 23674, 23652, 23630,
149 	23608, 23586, 23564, 23541, 23519,
150 	23498, 23476, 23454, 23432, 23410,
151 	23388, 23367, 23345, 23323, 23302,
152 	23280, 23259, 23237, 23216, 23194,
153 	23173, 23152, 23130, 23109, 23088,
154 	23067, 23046, 23025, 23003, 22982,
155 	22962, 22941, 22920, 22899, 22878,
156 	22857, 22837, 22816, 22795, 22775,
157 	22754, 22733, 22713, 22692, 22672,
158 	22652, 22631, 22611, 22591, 22570,
159 	22550, 22530, 22510, 22490, 22469,
160 	22449, 22429, 22409, 22390, 22370,
161 	22350, 22336, 22310, 22290, 22271,
162 	22251, 22231, 22212, 22192, 22173,
163 	22153, 22134, 22114, 22095, 22075,
164 	22056, 22037, 22017, 21998, 21979,
165 	21960, 21941, 21921, 21902, 21883,
166 	21864, 21845, 21826, 21807, 21789,
167 	21770, 21751, 21732, 21713, 21695,
168 	21676, 21657, 21639, 21620, 21602,
169 	21583, 21565, 21546, 21528, 21509,
170 	21491, 21473, 21454, 21436, 21418,
171 	21400, 21381, 21363, 21345, 21327,
172 	21309, 21291, 21273, 21255, 21237,
173 	21219, 21201, 21183, 21166, 21148,
174 	21130, 21112, 21095, 21077, 21059,
175 	21042, 21024, 21007, 20989, 20972,
176 	25679, 25653, 25627, 25601, 25575,
177 	25549, 25523, 25497, 25471, 25446,
178 	25420, 25394, 25369, 25343, 25318,
179 	25292, 25267, 25242, 25216, 25191,
180 	25166
181 };
182 
183 /* channel 1~14 */
184 static u32 targetchnl_2g[TARGET_CHNL_NUM_2G] = {
185 	26084, 26030, 25976, 25923, 25869, 25816, 25764,
186 	25711, 25658, 25606, 25554, 25502, 25451, 25328
187 };
188 
189 static u32 _rtl92d_phy_calculate_bit_shift(u32 bitmask)
190 {
191 	u32 i;
192 
193 	for (i = 0; i <= 31; i++) {
194 		if (((bitmask >> i) & 0x1) == 1)
195 			break;
196 	}
197 
198 	return i;
199 }
200 
201 u32 rtl92d_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask)
202 {
203 	struct rtl_priv *rtlpriv = rtl_priv(hw);
204 	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
205 	u32 returnvalue, originalvalue, bitshift;
206 
207 	RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "regaddr(%#x), bitmask(%#x)\n",
208 		 regaddr, bitmask);
209 	if (rtlhal->during_mac1init_radioa || rtlhal->during_mac0init_radiob) {
210 		u8 dbi_direct = 0;
211 
212 		/* mac1 use phy0 read radio_b. */
213 		/* mac0 use phy1 read radio_b. */
214 		if (rtlhal->during_mac1init_radioa)
215 			dbi_direct = BIT(3);
216 		else if (rtlhal->during_mac0init_radiob)
217 			dbi_direct = BIT(3) | BIT(2);
218 		originalvalue = rtl92de_read_dword_dbi(hw, (u16)regaddr,
219 			dbi_direct);
220 	} else {
221 		originalvalue = rtl_read_dword(rtlpriv, regaddr);
222 	}
223 	bitshift = _rtl92d_phy_calculate_bit_shift(bitmask);
224 	returnvalue = (originalvalue & bitmask) >> bitshift;
225 	RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
226 		 "BBR MASK=0x%x Addr[0x%x]=0x%x\n",
227 		 bitmask, regaddr, originalvalue);
228 	return returnvalue;
229 }
230 
231 void rtl92d_phy_set_bb_reg(struct ieee80211_hw *hw,
232 			   u32 regaddr, u32 bitmask, u32 data)
233 {
234 	struct rtl_priv *rtlpriv = rtl_priv(hw);
235 	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
236 	u8 dbi_direct = 0;
237 	u32 originalvalue, bitshift;
238 
239 	RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
240 		 "regaddr(%#x), bitmask(%#x), data(%#x)\n",
241 		 regaddr, bitmask, data);
242 	if (rtlhal->during_mac1init_radioa)
243 		dbi_direct = BIT(3);
244 	else if (rtlhal->during_mac0init_radiob)
245 		/* mac0 use phy1 write radio_b. */
246 		dbi_direct = BIT(3) | BIT(2);
247 	if (bitmask != MASKDWORD) {
248 		if (rtlhal->during_mac1init_radioa ||
249 		    rtlhal->during_mac0init_radiob)
250 			originalvalue = rtl92de_read_dword_dbi(hw,
251 					(u16) regaddr,
252 					dbi_direct);
253 		else
254 			originalvalue = rtl_read_dword(rtlpriv, regaddr);
255 		bitshift = _rtl92d_phy_calculate_bit_shift(bitmask);
256 		data = ((originalvalue & (~bitmask)) | (data << bitshift));
257 	}
258 	if (rtlhal->during_mac1init_radioa || rtlhal->during_mac0init_radiob)
259 		rtl92de_write_dword_dbi(hw, (u16) regaddr, data, dbi_direct);
260 	else
261 		rtl_write_dword(rtlpriv, regaddr, data);
262 	RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
263 		 "regaddr(%#x), bitmask(%#x), data(%#x)\n",
264 		 regaddr, bitmask, data);
265 }
266 
267 static u32 _rtl92d_phy_rf_serial_read(struct ieee80211_hw *hw,
268 				      enum radio_path rfpath, u32 offset)
269 {
270 
271 	struct rtl_priv *rtlpriv = rtl_priv(hw);
272 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
273 	struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
274 	u32 newoffset;
275 	u32 tmplong, tmplong2;
276 	u8 rfpi_enable = 0;
277 	u32 retvalue;
278 
279 	newoffset = offset;
280 	tmplong = rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD);
281 	if (rfpath == RF90_PATH_A)
282 		tmplong2 = tmplong;
283 	else
284 		tmplong2 = rtl_get_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD);
285 	tmplong2 = (tmplong2 & (~BLSSIREADADDRESS)) |
286 		(newoffset << 23) | BLSSIREADEDGE;
287 	rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
288 		tmplong & (~BLSSIREADEDGE));
289 	udelay(10);
290 	rtl_set_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD, tmplong2);
291 	udelay(50);
292 	udelay(50);
293 	rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
294 		tmplong | BLSSIREADEDGE);
295 	udelay(10);
296 	if (rfpath == RF90_PATH_A)
297 		rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1,
298 			      BIT(8));
299 	else if (rfpath == RF90_PATH_B)
300 		rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XB_HSSIPARAMETER1,
301 			      BIT(8));
302 	if (rfpi_enable)
303 		retvalue = rtl_get_bbreg(hw, pphyreg->rf_rbpi,
304 			BLSSIREADBACKDATA);
305 	else
306 		retvalue = rtl_get_bbreg(hw, pphyreg->rf_rb,
307 			BLSSIREADBACKDATA);
308 	RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "RFR-%d Addr[0x%x] = 0x%x\n",
309 		 rfpath, pphyreg->rf_rb, retvalue);
310 	return retvalue;
311 }
312 
313 static void _rtl92d_phy_rf_serial_write(struct ieee80211_hw *hw,
314 					enum radio_path rfpath,
315 					u32 offset, u32 data)
316 {
317 	u32 data_and_addr;
318 	u32 newoffset;
319 	struct rtl_priv *rtlpriv = rtl_priv(hw);
320 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
321 	struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
322 
323 	newoffset = offset;
324 	/* T65 RF */
325 	data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff;
326 	rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr);
327 	RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "RFW-%d Addr[0x%x]=0x%x\n",
328 		 rfpath, pphyreg->rf3wire_offset, data_and_addr);
329 }
330 
331 u32 rtl92d_phy_query_rf_reg(struct ieee80211_hw *hw,
332 			    enum radio_path rfpath, u32 regaddr, u32 bitmask)
333 {
334 	struct rtl_priv *rtlpriv = rtl_priv(hw);
335 	u32 original_value, readback_value, bitshift;
336 	unsigned long flags;
337 
338 	RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
339 		 "regaddr(%#x), rfpath(%#x), bitmask(%#x)\n",
340 		 regaddr, rfpath, bitmask);
341 	spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
342 	original_value = _rtl92d_phy_rf_serial_read(hw, rfpath, regaddr);
343 	bitshift = _rtl92d_phy_calculate_bit_shift(bitmask);
344 	readback_value = (original_value & bitmask) >> bitshift;
345 	spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
346 	RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
347 		 "regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n",
348 		 regaddr, rfpath, bitmask, original_value);
349 	return readback_value;
350 }
351 
352 void rtl92d_phy_set_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,
353 	u32 regaddr, u32 bitmask, u32 data)
354 {
355 	struct rtl_priv *rtlpriv = rtl_priv(hw);
356 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
357 	u32 original_value, bitshift;
358 	unsigned long flags;
359 
360 	RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
361 		 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
362 		 regaddr, bitmask, data, rfpath);
363 	if (bitmask == 0)
364 		return;
365 	spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
366 	if (rtlphy->rf_mode != RF_OP_BY_FW) {
367 		if (bitmask != RFREG_OFFSET_MASK) {
368 			original_value = _rtl92d_phy_rf_serial_read(hw,
369 				rfpath, regaddr);
370 			bitshift = _rtl92d_phy_calculate_bit_shift(bitmask);
371 			data = ((original_value & (~bitmask)) |
372 				(data << bitshift));
373 		}
374 		_rtl92d_phy_rf_serial_write(hw, rfpath, regaddr, data);
375 	}
376 	spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
377 	RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
378 		 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
379 		 regaddr, bitmask, data, rfpath);
380 }
381 
382 bool rtl92d_phy_mac_config(struct ieee80211_hw *hw)
383 {
384 	struct rtl_priv *rtlpriv = rtl_priv(hw);
385 	u32 i;
386 	u32 arraylength;
387 	u32 *ptrarray;
388 
389 	RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Read Rtl819XMACPHY_Array\n");
390 	arraylength = MAC_2T_ARRAYLENGTH;
391 	ptrarray = rtl8192de_mac_2tarray;
392 	RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Img:Rtl819XMAC_Array\n");
393 	for (i = 0; i < arraylength; i = i + 2)
394 		rtl_write_byte(rtlpriv, ptrarray[i], (u8) ptrarray[i + 1]);
395 	if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY) {
396 		/* improve 2-stream TX EVM */
397 		/* rtl_write_byte(rtlpriv, 0x14,0x71); */
398 		/* AMPDU aggregation number 9 */
399 		/* rtl_write_word(rtlpriv, REG_MAX_AGGR_NUM, MAX_AGGR_NUM); */
400 		rtl_write_byte(rtlpriv, REG_MAX_AGGR_NUM, 0x0B);
401 	} else {
402 		/* 92D need to test to decide the num. */
403 		rtl_write_byte(rtlpriv, REG_MAX_AGGR_NUM, 0x07);
404 	}
405 	return true;
406 }
407 
408 static void _rtl92d_phy_init_bb_rf_register_definition(struct ieee80211_hw *hw)
409 {
410 	struct rtl_priv *rtlpriv = rtl_priv(hw);
411 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
412 
413 	/* RF Interface Sowrtware Control */
414 	/* 16 LSBs if read 32-bit from 0x870 */
415 	rtlphy->phyreg_def[RF90_PATH_A].rfintfs = RFPGA0_XAB_RFINTERFACESW;
416 	/* 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872) */
417 	rtlphy->phyreg_def[RF90_PATH_B].rfintfs = RFPGA0_XAB_RFINTERFACESW;
418 	/* 16 LSBs if read 32-bit from 0x874 */
419 	rtlphy->phyreg_def[RF90_PATH_C].rfintfs = RFPGA0_XCD_RFINTERFACESW;
420 	/* 16 MSBs if read 32-bit from 0x874 (16-bit for 0x876) */
421 
422 	rtlphy->phyreg_def[RF90_PATH_D].rfintfs = RFPGA0_XCD_RFINTERFACESW;
423 	/* RF Interface Readback Value */
424 	/* 16 LSBs if read 32-bit from 0x8E0 */
425 	rtlphy->phyreg_def[RF90_PATH_A].rfintfi = RFPGA0_XAB_RFINTERFACERB;
426 	/* 16 MSBs if read 32-bit from 0x8E0 (16-bit for 0x8E2) */
427 	rtlphy->phyreg_def[RF90_PATH_B].rfintfi = RFPGA0_XAB_RFINTERFACERB;
428 	/* 16 LSBs if read 32-bit from 0x8E4 */
429 	rtlphy->phyreg_def[RF90_PATH_C].rfintfi = RFPGA0_XCD_RFINTERFACERB;
430 	/* 16 MSBs if read 32-bit from 0x8E4 (16-bit for 0x8E6) */
431 	rtlphy->phyreg_def[RF90_PATH_D].rfintfi = RFPGA0_XCD_RFINTERFACERB;
432 
433 	/* RF Interface Output (and Enable) */
434 	/* 16 LSBs if read 32-bit from 0x860 */
435 	rtlphy->phyreg_def[RF90_PATH_A].rfintfo = RFPGA0_XA_RFINTERFACEOE;
436 	/* 16 LSBs if read 32-bit from 0x864 */
437 	rtlphy->phyreg_def[RF90_PATH_B].rfintfo = RFPGA0_XB_RFINTERFACEOE;
438 
439 	/* RF Interface (Output and)  Enable */
440 	/* 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862) */
441 	rtlphy->phyreg_def[RF90_PATH_A].rfintfe = RFPGA0_XA_RFINTERFACEOE;
442 	/* 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866) */
443 	rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE;
444 
445 	/* Addr of LSSI. Wirte RF register by driver */
446 	/* LSSI Parameter */
447 	rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset =
448 				 RFPGA0_XA_LSSIPARAMETER;
449 	rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset =
450 				 RFPGA0_XB_LSSIPARAMETER;
451 
452 	/* RF parameter */
453 	/* BB Band Select */
454 	rtlphy->phyreg_def[RF90_PATH_A].rflssi_select = RFPGA0_XAB_RFPARAMETER;
455 	rtlphy->phyreg_def[RF90_PATH_B].rflssi_select = RFPGA0_XAB_RFPARAMETER;
456 	rtlphy->phyreg_def[RF90_PATH_C].rflssi_select = RFPGA0_XCD_RFPARAMETER;
457 	rtlphy->phyreg_def[RF90_PATH_D].rflssi_select = RFPGA0_XCD_RFPARAMETER;
458 
459 	/* Tx AGC Gain Stage (same for all path. Should we remove this?) */
460 	/* Tx gain stage */
461 	rtlphy->phyreg_def[RF90_PATH_A].rftxgain_stage = RFPGA0_TXGAINSTAGE;
462 	/* Tx gain stage */
463 	rtlphy->phyreg_def[RF90_PATH_B].rftxgain_stage = RFPGA0_TXGAINSTAGE;
464 	/* Tx gain stage */
465 	rtlphy->phyreg_def[RF90_PATH_C].rftxgain_stage = RFPGA0_TXGAINSTAGE;
466 	/* Tx gain stage */
467 	rtlphy->phyreg_def[RF90_PATH_D].rftxgain_stage = RFPGA0_TXGAINSTAGE;
468 
469 	/* Tranceiver A~D HSSI Parameter-1 */
470 	/* wire control parameter1 */
471 	rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para1 = RFPGA0_XA_HSSIPARAMETER1;
472 	/* wire control parameter1 */
473 	rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para1 = RFPGA0_XB_HSSIPARAMETER1;
474 
475 	/* Tranceiver A~D HSSI Parameter-2 */
476 	/* wire control parameter2 */
477 	rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para2 = RFPGA0_XA_HSSIPARAMETER2;
478 	/* wire control parameter2 */
479 	rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para2 = RFPGA0_XB_HSSIPARAMETER2;
480 
481 	/* RF switch Control */
482 	/* TR/Ant switch control */
483 	rtlphy->phyreg_def[RF90_PATH_A].rfsw_ctrl = RFPGA0_XAB_SWITCHCONTROL;
484 	rtlphy->phyreg_def[RF90_PATH_B].rfsw_ctrl = RFPGA0_XAB_SWITCHCONTROL;
485 	rtlphy->phyreg_def[RF90_PATH_C].rfsw_ctrl = RFPGA0_XCD_SWITCHCONTROL;
486 	rtlphy->phyreg_def[RF90_PATH_D].rfsw_ctrl = RFPGA0_XCD_SWITCHCONTROL;
487 
488 	/* AGC control 1 */
489 	rtlphy->phyreg_def[RF90_PATH_A].rfagc_control1 = ROFDM0_XAAGCCORE1;
490 	rtlphy->phyreg_def[RF90_PATH_B].rfagc_control1 = ROFDM0_XBAGCCORE1;
491 	rtlphy->phyreg_def[RF90_PATH_C].rfagc_control1 = ROFDM0_XCAGCCORE1;
492 	rtlphy->phyreg_def[RF90_PATH_D].rfagc_control1 = ROFDM0_XDAGCCORE1;
493 
494 	/* AGC control 2  */
495 	rtlphy->phyreg_def[RF90_PATH_A].rfagc_control2 = ROFDM0_XAAGCCORE2;
496 	rtlphy->phyreg_def[RF90_PATH_B].rfagc_control2 = ROFDM0_XBAGCCORE2;
497 	rtlphy->phyreg_def[RF90_PATH_C].rfagc_control2 = ROFDM0_XCAGCCORE2;
498 	rtlphy->phyreg_def[RF90_PATH_D].rfagc_control2 = ROFDM0_XDAGCCORE2;
499 
500 	/* RX AFE control 1 */
501 	rtlphy->phyreg_def[RF90_PATH_A].rfrxiq_imbal = ROFDM0_XARXIQIMBALANCE;
502 	rtlphy->phyreg_def[RF90_PATH_B].rfrxiq_imbal = ROFDM0_XBRXIQIMBALANCE;
503 	rtlphy->phyreg_def[RF90_PATH_C].rfrxiq_imbal = ROFDM0_XCRXIQIMBALANCE;
504 	rtlphy->phyreg_def[RF90_PATH_D].rfrxiq_imbal = ROFDM0_XDRXIQIMBALANCE;
505 
506 	/*RX AFE control 1 */
507 	rtlphy->phyreg_def[RF90_PATH_A].rfrx_afe = ROFDM0_XARXAFE;
508 	rtlphy->phyreg_def[RF90_PATH_B].rfrx_afe = ROFDM0_XBRXAFE;
509 	rtlphy->phyreg_def[RF90_PATH_C].rfrx_afe = ROFDM0_XCRXAFE;
510 	rtlphy->phyreg_def[RF90_PATH_D].rfrx_afe = ROFDM0_XDRXAFE;
511 
512 	/* Tx AFE control 1 */
513 	rtlphy->phyreg_def[RF90_PATH_A].rftxiq_imbal = ROFDM0_XATxIQIMBALANCE;
514 	rtlphy->phyreg_def[RF90_PATH_B].rftxiq_imbal = ROFDM0_XBTxIQIMBALANCE;
515 	rtlphy->phyreg_def[RF90_PATH_C].rftxiq_imbal = ROFDM0_XCTxIQIMBALANCE;
516 	rtlphy->phyreg_def[RF90_PATH_D].rftxiq_imbal = ROFDM0_XDTxIQIMBALANCE;
517 
518 	/* Tx AFE control 2 */
519 	rtlphy->phyreg_def[RF90_PATH_A].rftx_afe = ROFDM0_XATxAFE;
520 	rtlphy->phyreg_def[RF90_PATH_B].rftx_afe = ROFDM0_XBTxAFE;
521 	rtlphy->phyreg_def[RF90_PATH_C].rftx_afe = ROFDM0_XCTxAFE;
522 	rtlphy->phyreg_def[RF90_PATH_D].rftx_afe = ROFDM0_XDTxAFE;
523 
524 	/* Tranceiver LSSI Readback SI mode */
525 	rtlphy->phyreg_def[RF90_PATH_A].rf_rb = RFPGA0_XA_LSSIREADBACK;
526 	rtlphy->phyreg_def[RF90_PATH_B].rf_rb = RFPGA0_XB_LSSIREADBACK;
527 	rtlphy->phyreg_def[RF90_PATH_C].rf_rb = RFPGA0_XC_LSSIREADBACK;
528 	rtlphy->phyreg_def[RF90_PATH_D].rf_rb = RFPGA0_XD_LSSIREADBACK;
529 
530 	/* Tranceiver LSSI Readback PI mode */
531 	rtlphy->phyreg_def[RF90_PATH_A].rf_rbpi = TRANSCEIVERA_HSPI_READBACK;
532 	rtlphy->phyreg_def[RF90_PATH_B].rf_rbpi = TRANSCEIVERB_HSPI_READBACK;
533 }
534 
535 static bool _rtl92d_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
536 	u8 configtype)
537 {
538 	int i;
539 	u32 *phy_regarray_table;
540 	u32 *agctab_array_table = NULL;
541 	u32 *agctab_5garray_table;
542 	u16 phy_reg_arraylen, agctab_arraylen = 0, agctab_5garraylen;
543 	struct rtl_priv *rtlpriv = rtl_priv(hw);
544 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
545 
546 	/* Normal chip,Mac0 use AGC_TAB.txt for 2G and 5G band. */
547 	if (rtlhal->interfaceindex == 0) {
548 		agctab_arraylen = AGCTAB_ARRAYLENGTH;
549 		agctab_array_table = rtl8192de_agctab_array;
550 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
551 			 " ===> phy:MAC0, Rtl819XAGCTAB_Array\n");
552 	} else {
553 		if (rtlhal->current_bandtype == BAND_ON_2_4G) {
554 			agctab_arraylen = AGCTAB_2G_ARRAYLENGTH;
555 			agctab_array_table = rtl8192de_agctab_2garray;
556 			RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
557 				 " ===> phy:MAC1, Rtl819XAGCTAB_2GArray\n");
558 		} else {
559 			agctab_5garraylen = AGCTAB_5G_ARRAYLENGTH;
560 			agctab_5garray_table = rtl8192de_agctab_5garray;
561 			RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
562 				 " ===> phy:MAC1, Rtl819XAGCTAB_5GArray\n");
563 
564 		}
565 	}
566 	phy_reg_arraylen = PHY_REG_2T_ARRAYLENGTH;
567 	phy_regarray_table = rtl8192de_phy_reg_2tarray;
568 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
569 		 " ===> phy:Rtl819XPHY_REG_Array_PG\n");
570 	if (configtype == BASEBAND_CONFIG_PHY_REG) {
571 		for (i = 0; i < phy_reg_arraylen; i = i + 2) {
572 			rtl_addr_delay(phy_regarray_table[i]);
573 			rtl_set_bbreg(hw, phy_regarray_table[i], MASKDWORD,
574 				      phy_regarray_table[i + 1]);
575 			udelay(1);
576 			RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
577 				 "The phy_regarray_table[0] is %x Rtl819XPHY_REGArray[1] is %x\n",
578 				 phy_regarray_table[i],
579 				 phy_regarray_table[i + 1]);
580 		}
581 	} else if (configtype == BASEBAND_CONFIG_AGC_TAB) {
582 		if (rtlhal->interfaceindex == 0) {
583 			for (i = 0; i < agctab_arraylen; i = i + 2) {
584 				rtl_set_bbreg(hw, agctab_array_table[i],
585 					MASKDWORD,
586 					agctab_array_table[i + 1]);
587 				/* Add 1us delay between BB/RF register
588 				 * setting. */
589 				udelay(1);
590 				RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
591 					 "The Rtl819XAGCTAB_Array_Table[0] is %u Rtl819XPHY_REGArray[1] is %u\n",
592 					 agctab_array_table[i],
593 					 agctab_array_table[i + 1]);
594 			}
595 			RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
596 				 "Normal Chip, MAC0, load Rtl819XAGCTAB_Array\n");
597 		} else {
598 			if (rtlhal->current_bandtype == BAND_ON_2_4G) {
599 				for (i = 0; i < agctab_arraylen; i = i + 2) {
600 					rtl_set_bbreg(hw, agctab_array_table[i],
601 						MASKDWORD,
602 						agctab_array_table[i + 1]);
603 					/* Add 1us delay between BB/RF register
604 					 * setting. */
605 					udelay(1);
606 					RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
607 						 "The Rtl819XAGCTAB_Array_Table[0] is %u Rtl819XPHY_REGArray[1] is %u\n",
608 						 agctab_array_table[i],
609 						 agctab_array_table[i + 1]);
610 				}
611 				RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
612 					 "Load Rtl819XAGCTAB_2GArray\n");
613 			} else {
614 				for (i = 0; i < agctab_5garraylen; i = i + 2) {
615 					rtl_set_bbreg(hw,
616 						agctab_5garray_table[i],
617 						MASKDWORD,
618 						agctab_5garray_table[i + 1]);
619 					/* Add 1us delay between BB/RF registeri
620 					 * setting. */
621 					udelay(1);
622 					RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
623 						 "The Rtl819XAGCTAB_5GArray_Table[0] is %u Rtl819XPHY_REGArray[1] is %u\n",
624 						 agctab_5garray_table[i],
625 						 agctab_5garray_table[i + 1]);
626 				}
627 				RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
628 					 "Load Rtl819XAGCTAB_5GArray\n");
629 			}
630 		}
631 	}
632 	return true;
633 }
634 
635 static void _rtl92d_store_pwrindex_diffrate_offset(struct ieee80211_hw *hw,
636 						   u32 regaddr, u32 bitmask,
637 						   u32 data)
638 {
639 	struct rtl_priv *rtlpriv = rtl_priv(hw);
640 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
641 	int index;
642 
643 	if (regaddr == RTXAGC_A_RATE18_06)
644 		index = 0;
645 	else if (regaddr == RTXAGC_A_RATE54_24)
646 		index = 1;
647 	else if (regaddr == RTXAGC_A_CCK1_MCS32)
648 		index = 6;
649 	else if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0xffffff00)
650 		index = 7;
651 	else if (regaddr == RTXAGC_A_MCS03_MCS00)
652 		index = 2;
653 	else if (regaddr == RTXAGC_A_MCS07_MCS04)
654 		index = 3;
655 	else if (regaddr == RTXAGC_A_MCS11_MCS08)
656 		index = 4;
657 	else if (regaddr == RTXAGC_A_MCS15_MCS12)
658 		index = 5;
659 	else if (regaddr == RTXAGC_B_RATE18_06)
660 		index = 8;
661 	else if (regaddr == RTXAGC_B_RATE54_24)
662 		index = 9;
663 	else if (regaddr == RTXAGC_B_CCK1_55_MCS32)
664 		index = 14;
665 	else if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0x000000ff)
666 		index = 15;
667 	else if (regaddr == RTXAGC_B_MCS03_MCS00)
668 		index = 10;
669 	else if (regaddr == RTXAGC_B_MCS07_MCS04)
670 		index = 11;
671 	else if (regaddr == RTXAGC_B_MCS11_MCS08)
672 		index = 12;
673 	else if (regaddr == RTXAGC_B_MCS15_MCS12)
674 		index = 13;
675 	else
676 		return;
677 
678 	rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][index] = data;
679 	RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
680 		 "MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n",
681 		 rtlphy->pwrgroup_cnt, index,
682 		 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][index]);
683 	if (index == 13)
684 		rtlphy->pwrgroup_cnt++;
685 }
686 
687 static bool _rtl92d_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
688 	u8 configtype)
689 {
690 	struct rtl_priv *rtlpriv = rtl_priv(hw);
691 	int i;
692 	u32 *phy_regarray_table_pg;
693 	u16 phy_regarray_pg_len;
694 
695 	phy_regarray_pg_len = PHY_REG_ARRAY_PG_LENGTH;
696 	phy_regarray_table_pg = rtl8192de_phy_reg_array_pg;
697 	if (configtype == BASEBAND_CONFIG_PHY_REG) {
698 		for (i = 0; i < phy_regarray_pg_len; i = i + 3) {
699 			rtl_addr_delay(phy_regarray_table_pg[i]);
700 			_rtl92d_store_pwrindex_diffrate_offset(hw,
701 				phy_regarray_table_pg[i],
702 				phy_regarray_table_pg[i + 1],
703 				phy_regarray_table_pg[i + 2]);
704 		}
705 	} else {
706 		RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
707 			 "configtype != BaseBand_Config_PHY_REG\n");
708 	}
709 	return true;
710 }
711 
712 static bool _rtl92d_phy_bb_config(struct ieee80211_hw *hw)
713 {
714 	struct rtl_priv *rtlpriv = rtl_priv(hw);
715 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
716 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
717 	bool rtstatus = true;
718 
719 	RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "==>\n");
720 	rtstatus = _rtl92d_phy_config_bb_with_headerfile(hw,
721 		BASEBAND_CONFIG_PHY_REG);
722 	if (!rtstatus) {
723 		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Write BB Reg Fail!!\n");
724 		return false;
725 	}
726 
727 	/* if (rtlphy->rf_type == RF_1T2R) {
728 	 *      _rtl92c_phy_bb_config_1t(hw);
729 	 *     RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Config to 1T!!\n");
730 	 *} */
731 
732 	if (rtlefuse->autoload_failflag == false) {
733 		rtlphy->pwrgroup_cnt = 0;
734 		rtstatus = _rtl92d_phy_config_bb_with_pgheaderfile(hw,
735 			BASEBAND_CONFIG_PHY_REG);
736 	}
737 	if (!rtstatus) {
738 		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "BB_PG Reg Fail!!\n");
739 		return false;
740 	}
741 	rtstatus = _rtl92d_phy_config_bb_with_headerfile(hw,
742 		BASEBAND_CONFIG_AGC_TAB);
743 	if (!rtstatus) {
744 		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "AGC Table Fail\n");
745 		return false;
746 	}
747 	rtlphy->cck_high_power = (bool) (rtl_get_bbreg(hw,
748 		RFPGA0_XA_HSSIPARAMETER2, 0x200));
749 
750 	return true;
751 }
752 
753 bool rtl92d_phy_bb_config(struct ieee80211_hw *hw)
754 {
755 	struct rtl_priv *rtlpriv = rtl_priv(hw);
756 	u16 regval;
757 	u32 regvaldw;
758 	u8 value;
759 
760 	_rtl92d_phy_init_bb_rf_register_definition(hw);
761 	regval = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
762 	rtl_write_word(rtlpriv, REG_SYS_FUNC_EN,
763 		       regval | BIT(13) | BIT(0) | BIT(1));
764 	rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL, 0x83);
765 	rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL + 1, 0xdb);
766 	/* 0x1f bit7 bit6 represent for mac0/mac1 driver ready */
767 	value = rtl_read_byte(rtlpriv, REG_RF_CTRL);
768 	rtl_write_byte(rtlpriv, REG_RF_CTRL, value | RF_EN | RF_RSTB |
769 		RF_SDMRSTB);
770 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, FEN_PPLL | FEN_PCIEA |
771 		FEN_DIO_PCIE | FEN_BB_GLB_RSTn | FEN_BBRSTB);
772 	rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL + 1, 0x80);
773 	if (!(IS_92D_SINGLEPHY(rtlpriv->rtlhal.version))) {
774 		regvaldw = rtl_read_dword(rtlpriv, REG_LEDCFG0);
775 		rtl_write_dword(rtlpriv, REG_LEDCFG0, regvaldw | BIT(23));
776 	}
777 
778 	return _rtl92d_phy_bb_config(hw);
779 }
780 
781 bool rtl92d_phy_rf_config(struct ieee80211_hw *hw)
782 {
783 	return rtl92d_phy_rf6052_config(hw);
784 }
785 
786 bool rtl92d_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
787 					  enum rf_content content,
788 					  enum radio_path rfpath)
789 {
790 	int i;
791 	u32 *radioa_array_table;
792 	u32 *radiob_array_table;
793 	u16 radioa_arraylen, radiob_arraylen;
794 	struct rtl_priv *rtlpriv = rtl_priv(hw);
795 
796 	radioa_arraylen = RADIOA_2T_ARRAYLENGTH;
797 	radioa_array_table = rtl8192de_radioa_2tarray;
798 	radiob_arraylen = RADIOB_2T_ARRAYLENGTH;
799 	radiob_array_table = rtl8192de_radiob_2tarray;
800 	if (rtlpriv->efuse.internal_pa_5g[0]) {
801 		radioa_arraylen = RADIOA_2T_INT_PA_ARRAYLENGTH;
802 		radioa_array_table = rtl8192de_radioa_2t_int_paarray;
803 	}
804 	if (rtlpriv->efuse.internal_pa_5g[1]) {
805 		radiob_arraylen = RADIOB_2T_INT_PA_ARRAYLENGTH;
806 		radiob_array_table = rtl8192de_radiob_2t_int_paarray;
807 	}
808 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
809 		 "PHY_ConfigRFWithHeaderFile() Radio_A:Rtl819XRadioA_1TArray\n");
810 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
811 		 "PHY_ConfigRFWithHeaderFile() Radio_B:Rtl819XRadioB_1TArray\n");
812 	RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Radio No %x\n", rfpath);
813 
814 	/* this only happens when DMDP, mac0 start on 2.4G,
815 	 * mac1 start on 5G, mac 0 has to set phy0&phy1
816 	 * pathA or mac1 has to set phy0&phy1 pathA */
817 	if ((content == radiob_txt) && (rfpath == RF90_PATH_A)) {
818 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
819 			 " ===> althougth Path A, we load radiob.txt\n");
820 		radioa_arraylen = radiob_arraylen;
821 		radioa_array_table = radiob_array_table;
822 	}
823 	switch (rfpath) {
824 	case RF90_PATH_A:
825 		for (i = 0; i < radioa_arraylen; i = i + 2) {
826 			rtl_rfreg_delay(hw, rfpath, radioa_array_table[i],
827 					RFREG_OFFSET_MASK,
828 					radioa_array_table[i + 1]);
829 		}
830 		break;
831 	case RF90_PATH_B:
832 		for (i = 0; i < radiob_arraylen; i = i + 2) {
833 			rtl_rfreg_delay(hw, rfpath, radiob_array_table[i],
834 					RFREG_OFFSET_MASK,
835 					radiob_array_table[i + 1]);
836 		}
837 		break;
838 	case RF90_PATH_C:
839 	case RF90_PATH_D:
840 		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
841 			 "switch case %#x not processed\n", rfpath);
842 		break;
843 	}
844 	return true;
845 }
846 
847 void rtl92d_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
848 {
849 	struct rtl_priv *rtlpriv = rtl_priv(hw);
850 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
851 
852 	rtlphy->default_initialgain[0] =
853 	    (u8) rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
854 	rtlphy->default_initialgain[1] =
855 	    (u8) rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0);
856 	rtlphy->default_initialgain[2] =
857 	    (u8) rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0);
858 	rtlphy->default_initialgain[3] =
859 	    (u8) rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0);
860 	RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
861 		 "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n",
862 		 rtlphy->default_initialgain[0],
863 		 rtlphy->default_initialgain[1],
864 		 rtlphy->default_initialgain[2],
865 		 rtlphy->default_initialgain[3]);
866 	rtlphy->framesync = (u8)rtl_get_bbreg(hw, ROFDM0_RXDETECTOR3,
867 					      MASKBYTE0);
868 	rtlphy->framesync_c34 = rtl_get_bbreg(hw, ROFDM0_RXDETECTOR2,
869 					      MASKDWORD);
870 	RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
871 		 "Default framesync (0x%x) = 0x%x\n",
872 		 ROFDM0_RXDETECTOR3, rtlphy->framesync);
873 }
874 
875 static void _rtl92d_get_txpower_index(struct ieee80211_hw *hw, u8 channel,
876 	u8 *cckpowerlevel, u8 *ofdmpowerlevel)
877 {
878 	struct rtl_priv *rtlpriv = rtl_priv(hw);
879 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
880 	struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
881 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
882 	u8 index = (channel - 1);
883 
884 	/* 1. CCK */
885 	if (rtlhal->current_bandtype == BAND_ON_2_4G) {
886 		/* RF-A */
887 		cckpowerlevel[RF90_PATH_A] =
888 				 rtlefuse->txpwrlevel_cck[RF90_PATH_A][index];
889 		/* RF-B */
890 		cckpowerlevel[RF90_PATH_B] =
891 				 rtlefuse->txpwrlevel_cck[RF90_PATH_B][index];
892 	} else {
893 		cckpowerlevel[RF90_PATH_A] = 0;
894 		cckpowerlevel[RF90_PATH_B] = 0;
895 	}
896 	/* 2. OFDM for 1S or 2S */
897 	if (rtlphy->rf_type == RF_1T2R || rtlphy->rf_type == RF_1T1R) {
898 		/*  Read HT 40 OFDM TX power */
899 		ofdmpowerlevel[RF90_PATH_A] =
900 		    rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_A][index];
901 		ofdmpowerlevel[RF90_PATH_B] =
902 		    rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_B][index];
903 	} else if (rtlphy->rf_type == RF_2T2R) {
904 		/* Read HT 40 OFDM TX power */
905 		ofdmpowerlevel[RF90_PATH_A] =
906 		    rtlefuse->txpwrlevel_ht40_2s[RF90_PATH_A][index];
907 		ofdmpowerlevel[RF90_PATH_B] =
908 		    rtlefuse->txpwrlevel_ht40_2s[RF90_PATH_B][index];
909 	}
910 }
911 
912 static void _rtl92d_ccxpower_index_check(struct ieee80211_hw *hw,
913 	u8 channel, u8 *cckpowerlevel, u8 *ofdmpowerlevel)
914 {
915 	struct rtl_priv *rtlpriv = rtl_priv(hw);
916 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
917 
918 	rtlphy->cur_cck_txpwridx = cckpowerlevel[0];
919 	rtlphy->cur_ofdm24g_txpwridx = ofdmpowerlevel[0];
920 }
921 
922 static u8 _rtl92c_phy_get_rightchnlplace(u8 chnl)
923 {
924 	u8 place = chnl;
925 
926 	if (chnl > 14) {
927 		for (place = 14; place < sizeof(channel5g); place++) {
928 			if (channel5g[place] == chnl) {
929 				place++;
930 				break;
931 			}
932 		}
933 	}
934 	return place;
935 }
936 
937 void rtl92d_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
938 {
939 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
940 	struct rtl_priv *rtlpriv = rtl_priv(hw);
941 	u8 cckpowerlevel[2], ofdmpowerlevel[2];
942 
943 	if (!rtlefuse->txpwr_fromeprom)
944 		return;
945 	channel = _rtl92c_phy_get_rightchnlplace(channel);
946 	_rtl92d_get_txpower_index(hw, channel, &cckpowerlevel[0],
947 		&ofdmpowerlevel[0]);
948 	if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G)
949 		_rtl92d_ccxpower_index_check(hw, channel, &cckpowerlevel[0],
950 				&ofdmpowerlevel[0]);
951 	if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G)
952 		rtl92d_phy_rf6052_set_cck_txpower(hw, &cckpowerlevel[0]);
953 	rtl92d_phy_rf6052_set_ofdm_txpower(hw, &ofdmpowerlevel[0], channel);
954 }
955 
956 void rtl92d_phy_set_bw_mode(struct ieee80211_hw *hw,
957 			    enum nl80211_channel_type ch_type)
958 {
959 	struct rtl_priv *rtlpriv = rtl_priv(hw);
960 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
961 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
962 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
963 	unsigned long flag = 0;
964 	u8 reg_prsr_rsc;
965 	u8 reg_bw_opmode;
966 
967 	if (rtlphy->set_bwmode_inprogress)
968 		return;
969 	if ((is_hal_stop(rtlhal)) || (RT_CANNOT_IO(hw))) {
970 		RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
971 			 "FALSE driver sleep or unload\n");
972 		return;
973 	}
974 	rtlphy->set_bwmode_inprogress = true;
975 	RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "Switch to %s bandwidth\n",
976 		 rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
977 		 "20MHz" : "40MHz");
978 	reg_bw_opmode = rtl_read_byte(rtlpriv, REG_BWOPMODE);
979 	reg_prsr_rsc = rtl_read_byte(rtlpriv, REG_RRSR + 2);
980 	switch (rtlphy->current_chan_bw) {
981 	case HT_CHANNEL_WIDTH_20:
982 		reg_bw_opmode |= BW_OPMODE_20MHZ;
983 		rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
984 		break;
985 	case HT_CHANNEL_WIDTH_20_40:
986 		reg_bw_opmode &= ~BW_OPMODE_20MHZ;
987 		rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
988 
989 		reg_prsr_rsc = (reg_prsr_rsc & 0x90) |
990 			(mac->cur_40_prime_sc << 5);
991 		rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_prsr_rsc);
992 		break;
993 	default:
994 		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
995 			 "unknown bandwidth: %#X\n", rtlphy->current_chan_bw);
996 		break;
997 	}
998 	switch (rtlphy->current_chan_bw) {
999 	case HT_CHANNEL_WIDTH_20:
1000 		rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x0);
1001 		rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x0);
1002 		/* SET BIT10 BIT11  for receive cck */
1003 		rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10) |
1004 			      BIT(11), 3);
1005 		break;
1006 	case HT_CHANNEL_WIDTH_20_40:
1007 		rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x1);
1008 		rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x1);
1009 		/* Set Control channel to upper or lower.
1010 		 * These settings are required only for 40MHz */
1011 		if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1012 			rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag);
1013 			rtl_set_bbreg(hw, RCCK0_SYSTEM, BCCKSIDEBAND,
1014 				(mac->cur_40_prime_sc >> 1));
1015 			rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
1016 		}
1017 		rtl_set_bbreg(hw, ROFDM1_LSTF, 0xC00, mac->cur_40_prime_sc);
1018 		/* SET BIT10 BIT11  for receive cck */
1019 		rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10) |
1020 			      BIT(11), 0);
1021 		rtl_set_bbreg(hw, 0x818, (BIT(26) | BIT(27)),
1022 			(mac->cur_40_prime_sc ==
1023 			HAL_PRIME_CHNL_OFFSET_LOWER) ? 2 : 1);
1024 		break;
1025 	default:
1026 		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1027 			 "unknown bandwidth: %#X\n", rtlphy->current_chan_bw);
1028 		break;
1029 
1030 	}
1031 	rtl92d_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
1032 	rtlphy->set_bwmode_inprogress = false;
1033 	RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "<==\n");
1034 }
1035 
1036 static void _rtl92d_phy_stop_trx_before_changeband(struct ieee80211_hw *hw)
1037 {
1038 	rtl_set_bbreg(hw, RFPGA0_RFMOD, BCCKEN, 0);
1039 	rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 0);
1040 	rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKBYTE0, 0x00);
1041 	rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE, BDWORD, 0x0);
1042 }
1043 
1044 static void rtl92d_phy_switch_wirelessband(struct ieee80211_hw *hw, u8 band)
1045 {
1046 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1047 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1048 	u8 value8;
1049 
1050 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "==>\n");
1051 	rtlhal->bandset = band;
1052 	rtlhal->current_bandtype = band;
1053 	if (IS_92D_SINGLEPHY(rtlhal->version))
1054 		rtlhal->bandset = BAND_ON_BOTH;
1055 	/* stop RX/Tx */
1056 	_rtl92d_phy_stop_trx_before_changeband(hw);
1057 	/* reconfig BB/RF according to wireless mode */
1058 	if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1059 		/* BB & RF Config */
1060 		RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG, "====>2.4G\n");
1061 		if (rtlhal->interfaceindex == 1)
1062 			_rtl92d_phy_config_bb_with_headerfile(hw,
1063 				BASEBAND_CONFIG_AGC_TAB);
1064 	} else {
1065 		/* 5G band */
1066 		RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG, "====>5G\n");
1067 		if (rtlhal->interfaceindex == 1)
1068 			_rtl92d_phy_config_bb_with_headerfile(hw,
1069 				BASEBAND_CONFIG_AGC_TAB);
1070 	}
1071 	rtl92d_update_bbrf_configuration(hw);
1072 	if (rtlhal->current_bandtype == BAND_ON_2_4G)
1073 		rtl_set_bbreg(hw, RFPGA0_RFMOD, BCCKEN, 0x1);
1074 	rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 0x1);
1075 
1076 	/* 20M BW. */
1077 	/* rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 1); */
1078 	rtlhal->reloadtxpowerindex = true;
1079 	/* notice fw know band status  0x81[1]/0x53[1] = 0: 5G, 1: 2G */
1080 	if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1081 		value8 = rtl_read_byte(rtlpriv,	(rtlhal->interfaceindex ==
1082 			0 ? REG_MAC0 : REG_MAC1));
1083 		value8 |= BIT(1);
1084 		rtl_write_byte(rtlpriv, (rtlhal->interfaceindex ==
1085 			0 ? REG_MAC0 : REG_MAC1), value8);
1086 	} else {
1087 		value8 = rtl_read_byte(rtlpriv, (rtlhal->interfaceindex ==
1088 			0 ? REG_MAC0 : REG_MAC1));
1089 		value8 &= (~BIT(1));
1090 		rtl_write_byte(rtlpriv, (rtlhal->interfaceindex ==
1091 			0 ? REG_MAC0 : REG_MAC1), value8);
1092 	}
1093 	mdelay(1);
1094 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "<==Switch Band OK\n");
1095 }
1096 
1097 static void _rtl92d_phy_reload_imr_setting(struct ieee80211_hw *hw,
1098 	u8 channel, u8 rfpath)
1099 {
1100 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1101 	u32 imr_num = MAX_RF_IMR_INDEX;
1102 	u32 rfmask = RFREG_OFFSET_MASK;
1103 	u8 group, i;
1104 	unsigned long flag = 0;
1105 
1106 	RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>path %d\n", rfpath);
1107 	if (rtlpriv->rtlhal.current_bandtype == BAND_ON_5G) {
1108 		RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>5G\n");
1109 		rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(25) | BIT(24), 0);
1110 		rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0x00f00000, 0xf);
1111 		/* fc area 0xd2c */
1112 		if (channel > 99)
1113 			rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(13) |
1114 				      BIT(14), 2);
1115 		else
1116 			rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(13) |
1117 				      BIT(14), 1);
1118 		/* leave 0 for channel1-14. */
1119 		group = channel <= 64 ? 1 : 2;
1120 		imr_num = MAX_RF_IMR_INDEX_NORMAL;
1121 		for (i = 0; i < imr_num; i++)
1122 			rtl_set_rfreg(hw, (enum radio_path)rfpath,
1123 				      rf_reg_for_5g_swchnl_normal[i], rfmask,
1124 				      rf_imr_param_normal[0][group][i]);
1125 		rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0x00f00000, 0);
1126 		rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 1);
1127 	} else {
1128 		/* G band. */
1129 		RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
1130 			 "Load RF IMR parameters for G band. IMR already setting %d\n",
1131 			 rtlpriv->rtlhal.load_imrandiqk_setting_for2g);
1132 		RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>2.4G\n");
1133 		if (!rtlpriv->rtlhal.load_imrandiqk_setting_for2g) {
1134 			RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
1135 				 "Load RF IMR parameters for G band. %d\n",
1136 				 rfpath);
1137 			rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag);
1138 			rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(25) | BIT(24), 0);
1139 			rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4,
1140 				      0x00f00000, 0xf);
1141 			imr_num = MAX_RF_IMR_INDEX_NORMAL;
1142 			for (i = 0; i < imr_num; i++) {
1143 				rtl_set_rfreg(hw, (enum radio_path)rfpath,
1144 					      rf_reg_for_5g_swchnl_normal[i],
1145 					      RFREG_OFFSET_MASK,
1146 					      rf_imr_param_normal[0][0][i]);
1147 			}
1148 			rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4,
1149 				      0x00f00000, 0);
1150 			rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN | BCCKEN, 3);
1151 			rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
1152 		}
1153 	}
1154 	RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
1155 }
1156 
1157 static void _rtl92d_phy_enable_rf_env(struct ieee80211_hw *hw,
1158 	u8 rfpath, u32 *pu4_regval)
1159 {
1160 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1161 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
1162 	struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
1163 
1164 	RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "====>\n");
1165 	/*----Store original RFENV control type----*/
1166 	switch (rfpath) {
1167 	case RF90_PATH_A:
1168 	case RF90_PATH_C:
1169 		*pu4_regval = rtl_get_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV);
1170 		break;
1171 	case RF90_PATH_B:
1172 	case RF90_PATH_D:
1173 		*pu4_regval =
1174 		    rtl_get_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV << 16);
1175 		break;
1176 	}
1177 	/*----Set RF_ENV enable----*/
1178 	rtl_set_bbreg(hw, pphyreg->rfintfe, BRFSI_RFENV << 16, 0x1);
1179 	udelay(1);
1180 	/*----Set RF_ENV output high----*/
1181 	rtl_set_bbreg(hw, pphyreg->rfintfo, BRFSI_RFENV, 0x1);
1182 	udelay(1);
1183 	/* Set bit number of Address and Data for RF register */
1184 	/* Set 1 to 4 bits for 8255 */
1185 	rtl_set_bbreg(hw, pphyreg->rfhssi_para2, B3WIREADDRESSLENGTH, 0x0);
1186 	udelay(1);
1187 	/*Set 0 to 12 bits for 8255 */
1188 	rtl_set_bbreg(hw, pphyreg->rfhssi_para2, B3WIREDATALENGTH, 0x0);
1189 	udelay(1);
1190 	RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "<====\n");
1191 }
1192 
1193 static void _rtl92d_phy_restore_rf_env(struct ieee80211_hw *hw, u8 rfpath,
1194 				       u32 *pu4_regval)
1195 {
1196 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1197 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
1198 	struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
1199 
1200 	RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "=====>\n");
1201 	/*----Restore RFENV control type----*/
1202 	switch (rfpath) {
1203 	case RF90_PATH_A:
1204 	case RF90_PATH_C:
1205 		rtl_set_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV, *pu4_regval);
1206 		break;
1207 	case RF90_PATH_B:
1208 	case RF90_PATH_D:
1209 		rtl_set_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV << 16,
1210 			      *pu4_regval);
1211 		break;
1212 	}
1213 	RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "<=====\n");
1214 }
1215 
1216 static void _rtl92d_phy_switch_rf_setting(struct ieee80211_hw *hw, u8 channel)
1217 {
1218 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1219 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
1220 	struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
1221 	u8 path = rtlhal->current_bandtype ==
1222 	    BAND_ON_5G ? RF90_PATH_A : RF90_PATH_B;
1223 	u8 index = 0, i = 0, rfpath = RF90_PATH_A;
1224 	bool need_pwr_down = false, internal_pa = false;
1225 	u32 u4regvalue, mask = 0x1C000, value = 0, u4tmp, u4tmp2;
1226 
1227 	RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>\n");
1228 	/* config path A for 5G */
1229 	if (rtlhal->current_bandtype == BAND_ON_5G) {
1230 		RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>5G\n");
1231 		u4tmp = curveindex_5g[channel - 1];
1232 		RTPRINT(rtlpriv, FINIT, INIT_IQK,
1233 			"ver 1 set RF-A, 5G, 0x28 = 0x%x !!\n", u4tmp);
1234 		for (i = 0; i < RF_CHNL_NUM_5G; i++) {
1235 			if (channel == rf_chnl_5g[i] && channel <= 140)
1236 				index = 0;
1237 		}
1238 		for (i = 0; i < RF_CHNL_NUM_5G_40M; i++) {
1239 			if (channel == rf_chnl_5g_40m[i] && channel <= 140)
1240 				index = 1;
1241 		}
1242 		if (channel == 149 || channel == 155 || channel == 161)
1243 			index = 2;
1244 		else if (channel == 151 || channel == 153 || channel == 163
1245 			 || channel == 165)
1246 			index = 3;
1247 		else if (channel == 157 || channel == 159)
1248 			index = 4;
1249 
1250 		if (rtlhal->macphymode == DUALMAC_DUALPHY
1251 		    && rtlhal->interfaceindex == 1) {
1252 			need_pwr_down = rtl92d_phy_enable_anotherphy(hw, false);
1253 			rtlhal->during_mac1init_radioa = true;
1254 			/* asume no this case */
1255 			if (need_pwr_down)
1256 				_rtl92d_phy_enable_rf_env(hw, path,
1257 							  &u4regvalue);
1258 		}
1259 		for (i = 0; i < RF_REG_NUM_FOR_C_CUT_5G; i++) {
1260 			if (i == 0 && (rtlhal->macphymode == DUALMAC_DUALPHY)) {
1261 				rtl_set_rfreg(hw, (enum radio_path)path,
1262 					      rf_reg_for_c_cut_5g[i],
1263 					      RFREG_OFFSET_MASK, 0xE439D);
1264 			} else if (rf_reg_for_c_cut_5g[i] == RF_SYN_G4) {
1265 				u4tmp2 = (rf_reg_pram_c_5g[index][i] &
1266 				     0x7FF) | (u4tmp << 11);
1267 				if (channel == 36)
1268 					u4tmp2 &= ~(BIT(7) | BIT(6));
1269 				rtl_set_rfreg(hw, (enum radio_path)path,
1270 					      rf_reg_for_c_cut_5g[i],
1271 					      RFREG_OFFSET_MASK, u4tmp2);
1272 			} else {
1273 				rtl_set_rfreg(hw, (enum radio_path)path,
1274 					      rf_reg_for_c_cut_5g[i],
1275 					      RFREG_OFFSET_MASK,
1276 					      rf_reg_pram_c_5g[index][i]);
1277 			}
1278 			RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
1279 				 "offset 0x%x value 0x%x path %d index %d readback 0x%x\n",
1280 				 rf_reg_for_c_cut_5g[i],
1281 				 rf_reg_pram_c_5g[index][i],
1282 				 path, index,
1283 				 rtl_get_rfreg(hw, (enum radio_path)path,
1284 					       rf_reg_for_c_cut_5g[i],
1285 					       RFREG_OFFSET_MASK));
1286 		}
1287 		if (need_pwr_down)
1288 			_rtl92d_phy_restore_rf_env(hw, path, &u4regvalue);
1289 		if (rtlhal->during_mac1init_radioa)
1290 			rtl92d_phy_powerdown_anotherphy(hw, false);
1291 		if (channel < 149)
1292 			value = 0x07;
1293 		else if (channel >= 149)
1294 			value = 0x02;
1295 		if (channel >= 36 && channel <= 64)
1296 			index = 0;
1297 		else if (channel >= 100 && channel <= 140)
1298 			index = 1;
1299 		else
1300 			index = 2;
1301 		for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
1302 			rfpath++) {
1303 			if (rtlhal->macphymode == DUALMAC_DUALPHY &&
1304 				rtlhal->interfaceindex == 1)	/* MAC 1 5G */
1305 				internal_pa = rtlpriv->efuse.internal_pa_5g[1];
1306 			else
1307 				internal_pa =
1308 					 rtlpriv->efuse.internal_pa_5g[rfpath];
1309 			if (internal_pa) {
1310 				for (i = 0;
1311 				     i < RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA;
1312 				     i++) {
1313 					rtl_set_rfreg(hw, rfpath,
1314 						rf_for_c_cut_5g_internal_pa[i],
1315 						RFREG_OFFSET_MASK,
1316 						rf_pram_c_5g_int_pa[index][i]);
1317 					RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
1318 						 "offset 0x%x value 0x%x path %d index %d\n",
1319 						 rf_for_c_cut_5g_internal_pa[i],
1320 						 rf_pram_c_5g_int_pa[index][i],
1321 						 rfpath, index);
1322 				}
1323 			} else {
1324 				rtl_set_rfreg(hw, (enum radio_path)rfpath, 0x0B,
1325 					      mask, value);
1326 			}
1327 		}
1328 	} else if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1329 		RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>2.4G\n");
1330 		u4tmp = curveindex_2g[channel - 1];
1331 		RTPRINT(rtlpriv, FINIT, INIT_IQK,
1332 			"ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n", u4tmp);
1333 		if (channel == 1 || channel == 2 || channel == 4 || channel == 9
1334 		    || channel == 10 || channel == 11 || channel == 12)
1335 			index = 0;
1336 		else if (channel == 3 || channel == 13 || channel == 14)
1337 			index = 1;
1338 		else if (channel >= 5 && channel <= 8)
1339 			index = 2;
1340 		if (rtlhal->macphymode == DUALMAC_DUALPHY) {
1341 			path = RF90_PATH_A;
1342 			if (rtlhal->interfaceindex == 0) {
1343 				need_pwr_down =
1344 					 rtl92d_phy_enable_anotherphy(hw, true);
1345 				rtlhal->during_mac0init_radiob = true;
1346 
1347 				if (need_pwr_down)
1348 					_rtl92d_phy_enable_rf_env(hw, path,
1349 								  &u4regvalue);
1350 			}
1351 		}
1352 		for (i = 0; i < RF_REG_NUM_FOR_C_CUT_2G; i++) {
1353 			if (rf_reg_for_c_cut_2g[i] == RF_SYN_G7)
1354 				rtl_set_rfreg(hw, (enum radio_path)path,
1355 					rf_reg_for_c_cut_2g[i],
1356 					RFREG_OFFSET_MASK,
1357 					(rf_reg_param_for_c_cut_2g[index][i] |
1358 					BIT(17)));
1359 			else
1360 				rtl_set_rfreg(hw, (enum radio_path)path,
1361 					      rf_reg_for_c_cut_2g[i],
1362 					      RFREG_OFFSET_MASK,
1363 					      rf_reg_param_for_c_cut_2g
1364 					      [index][i]);
1365 			RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
1366 				 "offset 0x%x value 0x%x mak 0x%x path %d index %d readback 0x%x\n",
1367 				 rf_reg_for_c_cut_2g[i],
1368 				 rf_reg_param_for_c_cut_2g[index][i],
1369 				 rf_reg_mask_for_c_cut_2g[i], path, index,
1370 				 rtl_get_rfreg(hw, (enum radio_path)path,
1371 					       rf_reg_for_c_cut_2g[i],
1372 					       RFREG_OFFSET_MASK));
1373 		}
1374 		RTPRINT(rtlpriv, FINIT, INIT_IQK,
1375 			"cosa ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n",
1376 			rf_syn_g4_for_c_cut_2g | (u4tmp << 11));
1377 
1378 		rtl_set_rfreg(hw, (enum radio_path)path, RF_SYN_G4,
1379 			      RFREG_OFFSET_MASK,
1380 			      rf_syn_g4_for_c_cut_2g | (u4tmp << 11));
1381 		if (need_pwr_down)
1382 			_rtl92d_phy_restore_rf_env(hw, path, &u4regvalue);
1383 		if (rtlhal->during_mac0init_radiob)
1384 			rtl92d_phy_powerdown_anotherphy(hw, true);
1385 	}
1386 	RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
1387 }
1388 
1389 u8 rtl92d_get_rightchnlplace_for_iqk(u8 chnl)
1390 {
1391 	u8 channel_all[59] = {
1392 		1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
1393 		36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
1394 		60, 62, 64, 100, 102, 104, 106, 108, 110, 112,
1395 		114, 116, 118, 120, 122, 124, 126, 128,	130,
1396 		132, 134, 136, 138, 140, 149, 151, 153, 155,
1397 		157, 159, 161, 163, 165
1398 	};
1399 	u8 place = chnl;
1400 
1401 	if (chnl > 14) {
1402 		for (place = 14; place < sizeof(channel_all); place++) {
1403 			if (channel_all[place] == chnl)
1404 				return place - 13;
1405 		}
1406 	}
1407 
1408 	return 0;
1409 }
1410 
1411 #define MAX_TOLERANCE		5
1412 #define IQK_DELAY_TIME		1	/* ms */
1413 #define MAX_TOLERANCE_92D	3
1414 
1415 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
1416 static u8 _rtl92d_phy_patha_iqk(struct ieee80211_hw *hw, bool configpathb)
1417 {
1418 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1419 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1420 	u32 regeac, rege94, rege9c, regea4;
1421 	u8 result = 0;
1422 
1423 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path A IQK!\n");
1424 	/* path-A IQK setting */
1425 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path-A IQK setting!\n");
1426 	if (rtlhal->interfaceindex == 0) {
1427 		rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x10008c1f);
1428 		rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x10008c1f);
1429 	} else {
1430 		rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x10008c22);
1431 		rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x10008c22);
1432 	}
1433 	rtl_set_bbreg(hw, 0xe38, MASKDWORD, 0x82140102);
1434 	rtl_set_bbreg(hw, 0xe3c, MASKDWORD, 0x28160206);
1435 	/* path-B IQK setting */
1436 	if (configpathb) {
1437 		rtl_set_bbreg(hw, 0xe50, MASKDWORD, 0x10008c22);
1438 		rtl_set_bbreg(hw, 0xe54, MASKDWORD, 0x10008c22);
1439 		rtl_set_bbreg(hw, 0xe58, MASKDWORD, 0x82140102);
1440 		rtl_set_bbreg(hw, 0xe5c, MASKDWORD, 0x28160206);
1441 	}
1442 	/* LO calibration setting */
1443 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "LO calibration setting!\n");
1444 	rtl_set_bbreg(hw, 0xe4c, MASKDWORD, 0x00462911);
1445 	/* One shot, path A LOK & IQK */
1446 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "One shot, path A LOK & IQK!\n");
1447 	rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf9000000);
1448 	rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf8000000);
1449 	/* delay x ms */
1450 	RTPRINT(rtlpriv, FINIT, INIT_IQK,
1451 		"Delay %d ms for One shot, path A LOK & IQK\n",
1452 		IQK_DELAY_TIME);
1453 	mdelay(IQK_DELAY_TIME);
1454 	/* Check failed */
1455 	regeac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1456 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xeac = 0x%x\n", regeac);
1457 	rege94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD);
1458 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xe94 = 0x%x\n", rege94);
1459 	rege9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD);
1460 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xe9c = 0x%x\n", rege9c);
1461 	regea4 = rtl_get_bbreg(hw, 0xea4, MASKDWORD);
1462 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xea4 = 0x%x\n", regea4);
1463 	if (!(regeac & BIT(28)) && (((rege94 & 0x03FF0000) >> 16) != 0x142) &&
1464 	    (((rege9c & 0x03FF0000) >> 16) != 0x42))
1465 		result |= 0x01;
1466 	else			/* if Tx not OK, ignore Rx */
1467 		return result;
1468 	/* if Tx is OK, check whether Rx is OK */
1469 	if (!(regeac & BIT(27)) && (((regea4 & 0x03FF0000) >> 16) != 0x132) &&
1470 	    (((regeac & 0x03FF0000) >> 16) != 0x36))
1471 		result |= 0x02;
1472 	else
1473 		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path A Rx IQK fail!!\n");
1474 	return result;
1475 }
1476 
1477 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
1478 static u8 _rtl92d_phy_patha_iqk_5g_normal(struct ieee80211_hw *hw,
1479 					  bool configpathb)
1480 {
1481 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1482 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1483 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
1484 	u32 regeac, rege94, rege9c, regea4;
1485 	u8 result = 0;
1486 	u8 i;
1487 	u8 retrycount = 2;
1488 	u32 TxOKBit = BIT(28), RxOKBit = BIT(27);
1489 
1490 	if (rtlhal->interfaceindex == 1) {	/* PHY1 */
1491 		TxOKBit = BIT(31);
1492 		RxOKBit = BIT(30);
1493 	}
1494 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path A IQK!\n");
1495 	/* path-A IQK setting */
1496 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path-A IQK setting!\n");
1497 	rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x18008c1f);
1498 	rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x18008c1f);
1499 	rtl_set_bbreg(hw, 0xe38, MASKDWORD, 0x82140307);
1500 	rtl_set_bbreg(hw, 0xe3c, MASKDWORD, 0x68160960);
1501 	/* path-B IQK setting */
1502 	if (configpathb) {
1503 		rtl_set_bbreg(hw, 0xe50, MASKDWORD, 0x18008c2f);
1504 		rtl_set_bbreg(hw, 0xe54, MASKDWORD, 0x18008c2f);
1505 		rtl_set_bbreg(hw, 0xe58, MASKDWORD, 0x82110000);
1506 		rtl_set_bbreg(hw, 0xe5c, MASKDWORD, 0x68110000);
1507 	}
1508 	/* LO calibration setting */
1509 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "LO calibration setting!\n");
1510 	rtl_set_bbreg(hw, 0xe4c, MASKDWORD, 0x00462911);
1511 	/* path-A PA on */
1512 	rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, MASKDWORD, 0x07000f60);
1513 	rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, MASKDWORD, 0x66e60e30);
1514 	for (i = 0; i < retrycount; i++) {
1515 		/* One shot, path A LOK & IQK */
1516 		RTPRINT(rtlpriv, FINIT, INIT_IQK,
1517 			"One shot, path A LOK & IQK!\n");
1518 		rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf9000000);
1519 		rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf8000000);
1520 		/* delay x ms */
1521 		RTPRINT(rtlpriv, FINIT, INIT_IQK,
1522 			"Delay %d ms for One shot, path A LOK & IQK.\n",
1523 			IQK_DELAY_TIME);
1524 		mdelay(IQK_DELAY_TIME * 10);
1525 		/* Check failed */
1526 		regeac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1527 		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xeac = 0x%x\n", regeac);
1528 		rege94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD);
1529 		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xe94 = 0x%x\n", rege94);
1530 		rege9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD);
1531 		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xe9c = 0x%x\n", rege9c);
1532 		regea4 = rtl_get_bbreg(hw, 0xea4, MASKDWORD);
1533 		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xea4 = 0x%x\n", regea4);
1534 		if (!(regeac & TxOKBit) &&
1535 		     (((rege94 & 0x03FF0000) >> 16) != 0x142)) {
1536 			result |= 0x01;
1537 		} else { /* if Tx not OK, ignore Rx */
1538 			RTPRINT(rtlpriv, FINIT, INIT_IQK,
1539 				"Path A Tx IQK fail!!\n");
1540 			continue;
1541 		}
1542 
1543 		/* if Tx is OK, check whether Rx is OK */
1544 		if (!(regeac & RxOKBit) &&
1545 		    (((regea4 & 0x03FF0000) >> 16) != 0x132)) {
1546 			result |= 0x02;
1547 			break;
1548 		} else {
1549 			RTPRINT(rtlpriv, FINIT, INIT_IQK,
1550 				"Path A Rx IQK fail!!\n");
1551 		}
1552 	}
1553 	/* path A PA off */
1554 	rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, MASKDWORD,
1555 		      rtlphy->iqk_bb_backup[0]);
1556 	rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, MASKDWORD,
1557 		      rtlphy->iqk_bb_backup[1]);
1558 	return result;
1559 }
1560 
1561 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
1562 static u8 _rtl92d_phy_pathb_iqk(struct ieee80211_hw *hw)
1563 {
1564 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1565 	u32 regeac, regeb4, regebc, regec4, regecc;
1566 	u8 result = 0;
1567 
1568 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path B IQK!\n");
1569 	/* One shot, path B LOK & IQK */
1570 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "One shot, path A LOK & IQK!\n");
1571 	rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0x00000002);
1572 	rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0x00000000);
1573 	/* delay x ms  */
1574 	RTPRINT(rtlpriv, FINIT, INIT_IQK,
1575 		"Delay %d ms for One shot, path B LOK & IQK\n", IQK_DELAY_TIME);
1576 	mdelay(IQK_DELAY_TIME);
1577 	/* Check failed */
1578 	regeac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1579 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xeac = 0x%x\n", regeac);
1580 	regeb4 = rtl_get_bbreg(hw, 0xeb4, MASKDWORD);
1581 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xeb4 = 0x%x\n", regeb4);
1582 	regebc = rtl_get_bbreg(hw, 0xebc, MASKDWORD);
1583 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xebc = 0x%x\n", regebc);
1584 	regec4 = rtl_get_bbreg(hw, 0xec4, MASKDWORD);
1585 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xec4 = 0x%x\n", regec4);
1586 	regecc = rtl_get_bbreg(hw, 0xecc, MASKDWORD);
1587 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xecc = 0x%x\n", regecc);
1588 	if (!(regeac & BIT(31)) && (((regeb4 & 0x03FF0000) >> 16) != 0x142) &&
1589 	    (((regebc & 0x03FF0000) >> 16) != 0x42))
1590 		result |= 0x01;
1591 	else
1592 		return result;
1593 	if (!(regeac & BIT(30)) && (((regec4 & 0x03FF0000) >> 16) != 0x132) &&
1594 	    (((regecc & 0x03FF0000) >> 16) != 0x36))
1595 		result |= 0x02;
1596 	else
1597 		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path B Rx IQK fail!!\n");
1598 	return result;
1599 }
1600 
1601 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
1602 static u8 _rtl92d_phy_pathb_iqk_5g_normal(struct ieee80211_hw *hw)
1603 {
1604 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1605 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
1606 	u32 regeac, regeb4, regebc, regec4, regecc;
1607 	u8 result = 0;
1608 	u8 i;
1609 	u8 retrycount = 2;
1610 
1611 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path B IQK!\n");
1612 	/* path-A IQK setting */
1613 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path-A IQK setting!\n");
1614 	rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x18008c1f);
1615 	rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x18008c1f);
1616 	rtl_set_bbreg(hw, 0xe38, MASKDWORD, 0x82110000);
1617 	rtl_set_bbreg(hw, 0xe3c, MASKDWORD, 0x68110000);
1618 
1619 	/* path-B IQK setting */
1620 	rtl_set_bbreg(hw, 0xe50, MASKDWORD, 0x18008c2f);
1621 	rtl_set_bbreg(hw, 0xe54, MASKDWORD, 0x18008c2f);
1622 	rtl_set_bbreg(hw, 0xe58, MASKDWORD, 0x82140307);
1623 	rtl_set_bbreg(hw, 0xe5c, MASKDWORD, 0x68160960);
1624 
1625 	/* LO calibration setting */
1626 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "LO calibration setting!\n");
1627 	rtl_set_bbreg(hw, 0xe4c, MASKDWORD, 0x00462911);
1628 
1629 	/* path-B PA on */
1630 	rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, MASKDWORD, 0x0f600700);
1631 	rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, MASKDWORD, 0x061f0d30);
1632 
1633 	for (i = 0; i < retrycount; i++) {
1634 		/* One shot, path B LOK & IQK */
1635 		RTPRINT(rtlpriv, FINIT, INIT_IQK,
1636 			"One shot, path A LOK & IQK!\n");
1637 		rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xfa000000);
1638 		rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf8000000);
1639 
1640 		/* delay x ms */
1641 		RTPRINT(rtlpriv, FINIT, INIT_IQK,
1642 			"Delay %d ms for One shot, path B LOK & IQK.\n", 10);
1643 		mdelay(IQK_DELAY_TIME * 10);
1644 
1645 		/* Check failed */
1646 		regeac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1647 		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xeac = 0x%x\n", regeac);
1648 		regeb4 = rtl_get_bbreg(hw, 0xeb4, MASKDWORD);
1649 		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xeb4 = 0x%x\n", regeb4);
1650 		regebc = rtl_get_bbreg(hw, 0xebc, MASKDWORD);
1651 		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xebc = 0x%x\n", regebc);
1652 		regec4 = rtl_get_bbreg(hw, 0xec4, MASKDWORD);
1653 		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xec4 = 0x%x\n", regec4);
1654 		regecc = rtl_get_bbreg(hw, 0xecc, MASKDWORD);
1655 		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xecc = 0x%x\n", regecc);
1656 		if (!(regeac & BIT(31)) &&
1657 		    (((regeb4 & 0x03FF0000) >> 16) != 0x142))
1658 			result |= 0x01;
1659 		else
1660 			continue;
1661 		if (!(regeac & BIT(30)) &&
1662 		    (((regec4 & 0x03FF0000) >> 16) != 0x132)) {
1663 			result |= 0x02;
1664 			break;
1665 		} else {
1666 			RTPRINT(rtlpriv, FINIT, INIT_IQK,
1667 				"Path B Rx IQK fail!!\n");
1668 		}
1669 	}
1670 
1671 	/* path B PA off */
1672 	rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, MASKDWORD,
1673 		      rtlphy->iqk_bb_backup[0]);
1674 	rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, MASKDWORD,
1675 		      rtlphy->iqk_bb_backup[2]);
1676 	return result;
1677 }
1678 
1679 static void _rtl92d_phy_save_adda_registers(struct ieee80211_hw *hw,
1680 					    u32 *adda_reg, u32 *adda_backup,
1681 					    u32 regnum)
1682 {
1683 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1684 	u32 i;
1685 
1686 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Save ADDA parameters.\n");
1687 	for (i = 0; i < regnum; i++)
1688 		adda_backup[i] = rtl_get_bbreg(hw, adda_reg[i], MASKDWORD);
1689 }
1690 
1691 static void _rtl92d_phy_save_mac_registers(struct ieee80211_hw *hw,
1692 	u32 *macreg, u32 *macbackup)
1693 {
1694 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1695 	u32 i;
1696 
1697 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Save MAC parameters.\n");
1698 	for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
1699 		macbackup[i] = rtl_read_byte(rtlpriv, macreg[i]);
1700 	macbackup[i] = rtl_read_dword(rtlpriv, macreg[i]);
1701 }
1702 
1703 static void _rtl92d_phy_reload_adda_registers(struct ieee80211_hw *hw,
1704 					      u32 *adda_reg, u32 *adda_backup,
1705 					      u32 regnum)
1706 {
1707 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1708 	u32 i;
1709 
1710 	RTPRINT(rtlpriv, FINIT, INIT_IQK,
1711 		"Reload ADDA power saving parameters !\n");
1712 	for (i = 0; i < regnum; i++)
1713 		rtl_set_bbreg(hw, adda_reg[i], MASKDWORD, adda_backup[i]);
1714 }
1715 
1716 static void _rtl92d_phy_reload_mac_registers(struct ieee80211_hw *hw,
1717 					     u32 *macreg, u32 *macbackup)
1718 {
1719 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1720 	u32 i;
1721 
1722 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Reload MAC parameters !\n");
1723 	for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
1724 		rtl_write_byte(rtlpriv, macreg[i], (u8) macbackup[i]);
1725 	rtl_write_byte(rtlpriv, macreg[i], macbackup[i]);
1726 }
1727 
1728 static void _rtl92d_phy_path_adda_on(struct ieee80211_hw *hw,
1729 		u32 *adda_reg, bool patha_on, bool is2t)
1730 {
1731 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1732 	u32 pathon;
1733 	u32 i;
1734 
1735 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "ADDA ON.\n");
1736 	pathon = patha_on ? 0x04db25a4 : 0x0b1b25a4;
1737 	if (patha_on)
1738 		pathon = rtlpriv->rtlhal.interfaceindex == 0 ?
1739 		    0x04db25a4 : 0x0b1b25a4;
1740 	for (i = 0; i < IQK_ADDA_REG_NUM; i++)
1741 		rtl_set_bbreg(hw, adda_reg[i], MASKDWORD, pathon);
1742 }
1743 
1744 static void _rtl92d_phy_mac_setting_calibration(struct ieee80211_hw *hw,
1745 						u32 *macreg, u32 *macbackup)
1746 {
1747 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1748 	u32 i;
1749 
1750 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "MAC settings for Calibration.\n");
1751 	rtl_write_byte(rtlpriv, macreg[0], 0x3F);
1752 
1753 	for (i = 1; i < (IQK_MAC_REG_NUM - 1); i++)
1754 		rtl_write_byte(rtlpriv, macreg[i], (u8)(macbackup[i] &
1755 			       (~BIT(3))));
1756 	rtl_write_byte(rtlpriv, macreg[i], (u8) (macbackup[i] & (~BIT(5))));
1757 }
1758 
1759 static void _rtl92d_phy_patha_standby(struct ieee80211_hw *hw)
1760 {
1761 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1762 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path-A standby mode!\n");
1763 
1764 	rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x0);
1765 	rtl_set_bbreg(hw, RFPGA0_XA_LSSIPARAMETER, MASKDWORD, 0x00010000);
1766 	rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
1767 }
1768 
1769 static void _rtl92d_phy_pimode_switch(struct ieee80211_hw *hw, bool pi_mode)
1770 {
1771 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1772 	u32 mode;
1773 
1774 	RTPRINT(rtlpriv, FINIT, INIT_IQK,
1775 		"BB Switch to %s mode!\n", pi_mode ? "PI" : "SI");
1776 	mode = pi_mode ? 0x01000100 : 0x01000000;
1777 	rtl_set_bbreg(hw, 0x820, MASKDWORD, mode);
1778 	rtl_set_bbreg(hw, 0x828, MASKDWORD, mode);
1779 }
1780 
1781 static void _rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw, long result[][8],
1782 				     u8 t, bool is2t)
1783 {
1784 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1785 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
1786 	u32 i;
1787 	u8 patha_ok, pathb_ok;
1788 	static u32 adda_reg[IQK_ADDA_REG_NUM] = {
1789 		RFPGA0_XCD_SWITCHCONTROL, 0xe6c, 0xe70, 0xe74,
1790 		0xe78, 0xe7c, 0xe80, 0xe84,
1791 		0xe88, 0xe8c, 0xed0, 0xed4,
1792 		0xed8, 0xedc, 0xee0, 0xeec
1793 	};
1794 	static u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
1795 		0x522, 0x550, 0x551, 0x040
1796 	};
1797 	static u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
1798 		RFPGA0_XAB_RFINTERFACESW, RFPGA0_XA_RFINTERFACEOE,
1799 		RFPGA0_XB_RFINTERFACEOE, ROFDM0_TRMUXPAR,
1800 		RFPGA0_XCD_RFINTERFACESW, ROFDM0_TRXPATHENABLE,
1801 		RFPGA0_RFMOD, RFPGA0_ANALOGPARAMETER4,
1802 		ROFDM0_XAAGCCORE1, ROFDM0_XBAGCCORE1
1803 	};
1804 	const u32 retrycount = 2;
1805 	u32 bbvalue;
1806 
1807 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "IQK for 2.4G :Start!!!\n");
1808 	if (t == 0) {
1809 		bbvalue = rtl_get_bbreg(hw, RFPGA0_RFMOD, MASKDWORD);
1810 		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "==>0x%08x\n", bbvalue);
1811 		RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQ Calibration for %s\n",
1812 			is2t ? "2T2R" : "1T1R");
1813 
1814 		/*  Save ADDA parameters, turn Path A ADDA on */
1815 		_rtl92d_phy_save_adda_registers(hw, adda_reg,
1816 			rtlphy->adda_backup, IQK_ADDA_REG_NUM);
1817 		_rtl92d_phy_save_mac_registers(hw, iqk_mac_reg,
1818 			rtlphy->iqk_mac_backup);
1819 		_rtl92d_phy_save_adda_registers(hw, iqk_bb_reg,
1820 			rtlphy->iqk_bb_backup, IQK_BB_REG_NUM);
1821 	}
1822 	_rtl92d_phy_path_adda_on(hw, adda_reg, true, is2t);
1823 	if (t == 0)
1824 		rtlphy->rfpi_enable = (u8) rtl_get_bbreg(hw,
1825 				RFPGA0_XA_HSSIPARAMETER1, BIT(8));
1826 
1827 	/*  Switch BB to PI mode to do IQ Calibration. */
1828 	if (!rtlphy->rfpi_enable)
1829 		_rtl92d_phy_pimode_switch(hw, true);
1830 
1831 	rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(24), 0x00);
1832 	rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKDWORD, 0x03a05600);
1833 	rtl_set_bbreg(hw, ROFDM0_TRMUXPAR, MASKDWORD, 0x000800e4);
1834 	rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, MASKDWORD, 0x22204000);
1835 	rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xf00000, 0x0f);
1836 	if (is2t) {
1837 		rtl_set_bbreg(hw, RFPGA0_XA_LSSIPARAMETER, MASKDWORD,
1838 			      0x00010000);
1839 		rtl_set_bbreg(hw, RFPGA0_XB_LSSIPARAMETER, MASKDWORD,
1840 			      0x00010000);
1841 	}
1842 	/* MAC settings */
1843 	_rtl92d_phy_mac_setting_calibration(hw, iqk_mac_reg,
1844 					    rtlphy->iqk_mac_backup);
1845 	/* Page B init */
1846 	rtl_set_bbreg(hw, 0xb68, MASKDWORD, 0x0f600000);
1847 	if (is2t)
1848 		rtl_set_bbreg(hw, 0xb6c, MASKDWORD, 0x0f600000);
1849 	/* IQ calibration setting */
1850 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "IQK setting!\n");
1851 	rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
1852 	rtl_set_bbreg(hw, 0xe40, MASKDWORD, 0x01007c00);
1853 	rtl_set_bbreg(hw, 0xe44, MASKDWORD, 0x01004800);
1854 	for (i = 0; i < retrycount; i++) {
1855 		patha_ok = _rtl92d_phy_patha_iqk(hw, is2t);
1856 		if (patha_ok == 0x03) {
1857 			RTPRINT(rtlpriv, FINIT, INIT_IQK,
1858 				"Path A IQK Success!!\n");
1859 			result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
1860 					0x3FF0000) >> 16;
1861 			result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
1862 					0x3FF0000) >> 16;
1863 			result[t][2] = (rtl_get_bbreg(hw, 0xea4, MASKDWORD) &
1864 					0x3FF0000) >> 16;
1865 			result[t][3] = (rtl_get_bbreg(hw, 0xeac, MASKDWORD) &
1866 					0x3FF0000) >> 16;
1867 			break;
1868 		} else if (i == (retrycount - 1) && patha_ok == 0x01) {
1869 			/* Tx IQK OK */
1870 			RTPRINT(rtlpriv, FINIT, INIT_IQK,
1871 				"Path A IQK Only  Tx Success!!\n");
1872 
1873 			result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
1874 					0x3FF0000) >> 16;
1875 			result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
1876 					0x3FF0000) >> 16;
1877 		}
1878 	}
1879 	if (0x00 == patha_ok)
1880 		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path A IQK failed!!\n");
1881 	if (is2t) {
1882 		_rtl92d_phy_patha_standby(hw);
1883 		/* Turn Path B ADDA on */
1884 		_rtl92d_phy_path_adda_on(hw, adda_reg, false, is2t);
1885 		for (i = 0; i < retrycount; i++) {
1886 			pathb_ok = _rtl92d_phy_pathb_iqk(hw);
1887 			if (pathb_ok == 0x03) {
1888 				RTPRINT(rtlpriv, FINIT, INIT_IQK,
1889 					"Path B IQK Success!!\n");
1890 				result[t][4] = (rtl_get_bbreg(hw, 0xeb4,
1891 					       MASKDWORD) & 0x3FF0000) >> 16;
1892 				result[t][5] = (rtl_get_bbreg(hw, 0xebc,
1893 					       MASKDWORD) & 0x3FF0000) >> 16;
1894 				result[t][6] = (rtl_get_bbreg(hw, 0xec4,
1895 					       MASKDWORD) & 0x3FF0000) >> 16;
1896 				result[t][7] = (rtl_get_bbreg(hw, 0xecc,
1897 					       MASKDWORD) & 0x3FF0000) >> 16;
1898 				break;
1899 			} else if (i == (retrycount - 1) && pathb_ok == 0x01) {
1900 				/* Tx IQK OK */
1901 				RTPRINT(rtlpriv, FINIT, INIT_IQK,
1902 					"Path B Only Tx IQK Success!!\n");
1903 				result[t][4] = (rtl_get_bbreg(hw, 0xeb4,
1904 					       MASKDWORD) & 0x3FF0000) >> 16;
1905 				result[t][5] = (rtl_get_bbreg(hw, 0xebc,
1906 					       MASKDWORD) & 0x3FF0000) >> 16;
1907 			}
1908 		}
1909 		if (0x00 == pathb_ok)
1910 			RTPRINT(rtlpriv, FINIT, INIT_IQK,
1911 				"Path B IQK failed!!\n");
1912 	}
1913 
1914 	/* Back to BB mode, load original value */
1915 	RTPRINT(rtlpriv, FINIT, INIT_IQK,
1916 		"IQK:Back to BB mode, load original value!\n");
1917 
1918 	rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0);
1919 	if (t != 0) {
1920 		/* Switch back BB to SI mode after finish IQ Calibration. */
1921 		if (!rtlphy->rfpi_enable)
1922 			_rtl92d_phy_pimode_switch(hw, false);
1923 		/* Reload ADDA power saving parameters */
1924 		_rtl92d_phy_reload_adda_registers(hw, adda_reg,
1925 				rtlphy->adda_backup, IQK_ADDA_REG_NUM);
1926 		/* Reload MAC parameters */
1927 		_rtl92d_phy_reload_mac_registers(hw, iqk_mac_reg,
1928 					rtlphy->iqk_mac_backup);
1929 		if (is2t)
1930 			_rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
1931 							  rtlphy->iqk_bb_backup,
1932 							  IQK_BB_REG_NUM);
1933 		else
1934 			_rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
1935 							  rtlphy->iqk_bb_backup,
1936 							  IQK_BB_REG_NUM - 1);
1937 		/* load 0xe30 IQC default value */
1938 		rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x01008c00);
1939 		rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x01008c00);
1940 	}
1941 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "<==\n");
1942 }
1943 
1944 static void _rtl92d_phy_iq_calibrate_5g_normal(struct ieee80211_hw *hw,
1945 					       long result[][8], u8 t)
1946 {
1947 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1948 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
1949 	struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
1950 	u8 patha_ok, pathb_ok;
1951 	static u32 adda_reg[IQK_ADDA_REG_NUM] = {
1952 		RFPGA0_XCD_SWITCHCONTROL, 0xe6c, 0xe70, 0xe74,
1953 		0xe78, 0xe7c, 0xe80, 0xe84,
1954 		0xe88, 0xe8c, 0xed0, 0xed4,
1955 		0xed8, 0xedc, 0xee0, 0xeec
1956 	};
1957 	static u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
1958 		0x522, 0x550, 0x551, 0x040
1959 	};
1960 	static u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
1961 		RFPGA0_XAB_RFINTERFACESW, RFPGA0_XA_RFINTERFACEOE,
1962 		RFPGA0_XB_RFINTERFACEOE, ROFDM0_TRMUXPAR,
1963 		RFPGA0_XCD_RFINTERFACESW, ROFDM0_TRXPATHENABLE,
1964 		RFPGA0_RFMOD, RFPGA0_ANALOGPARAMETER4,
1965 		ROFDM0_XAAGCCORE1, ROFDM0_XBAGCCORE1
1966 	};
1967 	u32 bbvalue;
1968 	bool is2t = IS_92D_SINGLEPHY(rtlhal->version);
1969 
1970 	/* Note: IQ calibration must be performed after loading
1971 	 * PHY_REG.txt , and radio_a, radio_b.txt */
1972 
1973 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "IQK for 5G NORMAL:Start!!!\n");
1974 	mdelay(IQK_DELAY_TIME * 20);
1975 	if (t == 0) {
1976 		bbvalue = rtl_get_bbreg(hw, RFPGA0_RFMOD, MASKDWORD);
1977 		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "==>0x%08x\n", bbvalue);
1978 		RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQ Calibration for %s\n",
1979 			is2t ? "2T2R" : "1T1R");
1980 		/* Save ADDA parameters, turn Path A ADDA on */
1981 		_rtl92d_phy_save_adda_registers(hw, adda_reg,
1982 						rtlphy->adda_backup,
1983 						IQK_ADDA_REG_NUM);
1984 		_rtl92d_phy_save_mac_registers(hw, iqk_mac_reg,
1985 					       rtlphy->iqk_mac_backup);
1986 		if (is2t)
1987 			_rtl92d_phy_save_adda_registers(hw, iqk_bb_reg,
1988 							rtlphy->iqk_bb_backup,
1989 							IQK_BB_REG_NUM);
1990 		else
1991 			_rtl92d_phy_save_adda_registers(hw, iqk_bb_reg,
1992 							rtlphy->iqk_bb_backup,
1993 							IQK_BB_REG_NUM - 1);
1994 	}
1995 	_rtl92d_phy_path_adda_on(hw, adda_reg, true, is2t);
1996 	/* MAC settings */
1997 	_rtl92d_phy_mac_setting_calibration(hw, iqk_mac_reg,
1998 			rtlphy->iqk_mac_backup);
1999 	if (t == 0)
2000 		rtlphy->rfpi_enable = (u8) rtl_get_bbreg(hw,
2001 			RFPGA0_XA_HSSIPARAMETER1, BIT(8));
2002 	/*  Switch BB to PI mode to do IQ Calibration. */
2003 	if (!rtlphy->rfpi_enable)
2004 		_rtl92d_phy_pimode_switch(hw, true);
2005 	rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(24), 0x00);
2006 	rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKDWORD, 0x03a05600);
2007 	rtl_set_bbreg(hw, ROFDM0_TRMUXPAR, MASKDWORD, 0x000800e4);
2008 	rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, MASKDWORD, 0x22208000);
2009 	rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xf00000, 0x0f);
2010 
2011 	/* Page B init */
2012 	rtl_set_bbreg(hw, 0xb68, MASKDWORD, 0x0f600000);
2013 	if (is2t)
2014 		rtl_set_bbreg(hw, 0xb6c, MASKDWORD, 0x0f600000);
2015 	/* IQ calibration setting  */
2016 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "IQK setting!\n");
2017 	rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
2018 	rtl_set_bbreg(hw, 0xe40, MASKDWORD, 0x10007c00);
2019 	rtl_set_bbreg(hw, 0xe44, MASKDWORD, 0x01004800);
2020 	patha_ok = _rtl92d_phy_patha_iqk_5g_normal(hw, is2t);
2021 	if (patha_ok == 0x03) {
2022 		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path A IQK Success!!\n");
2023 		result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
2024 				0x3FF0000) >> 16;
2025 		result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
2026 				0x3FF0000) >> 16;
2027 		result[t][2] = (rtl_get_bbreg(hw, 0xea4, MASKDWORD) &
2028 				0x3FF0000) >> 16;
2029 		result[t][3] = (rtl_get_bbreg(hw, 0xeac, MASKDWORD) &
2030 				0x3FF0000) >> 16;
2031 	} else if (patha_ok == 0x01) {	/* Tx IQK OK */
2032 		RTPRINT(rtlpriv, FINIT, INIT_IQK,
2033 			"Path A IQK Only  Tx Success!!\n");
2034 
2035 		result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
2036 				0x3FF0000) >> 16;
2037 		result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
2038 				0x3FF0000) >> 16;
2039 	} else {
2040 		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path A IQK Fail!!\n");
2041 	}
2042 	if (is2t) {
2043 		/* _rtl92d_phy_patha_standby(hw); */
2044 		/* Turn Path B ADDA on  */
2045 		_rtl92d_phy_path_adda_on(hw, adda_reg, false, is2t);
2046 		pathb_ok = _rtl92d_phy_pathb_iqk_5g_normal(hw);
2047 		if (pathb_ok == 0x03) {
2048 			RTPRINT(rtlpriv, FINIT, INIT_IQK,
2049 				"Path B IQK Success!!\n");
2050 			result[t][4] = (rtl_get_bbreg(hw, 0xeb4, MASKDWORD) &
2051 			     0x3FF0000) >> 16;
2052 			result[t][5] = (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
2053 			     0x3FF0000) >> 16;
2054 			result[t][6] = (rtl_get_bbreg(hw, 0xec4, MASKDWORD) &
2055 			     0x3FF0000) >> 16;
2056 			result[t][7] = (rtl_get_bbreg(hw, 0xecc, MASKDWORD) &
2057 			     0x3FF0000) >> 16;
2058 		} else if (pathb_ok == 0x01) { /* Tx IQK OK */
2059 			RTPRINT(rtlpriv, FINIT, INIT_IQK,
2060 				"Path B Only Tx IQK Success!!\n");
2061 			result[t][4] = (rtl_get_bbreg(hw, 0xeb4, MASKDWORD) &
2062 			     0x3FF0000) >> 16;
2063 			result[t][5] = (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
2064 			     0x3FF0000) >> 16;
2065 		} else {
2066 			RTPRINT(rtlpriv, FINIT, INIT_IQK,
2067 				"Path B IQK failed!!\n");
2068 		}
2069 	}
2070 
2071 	/* Back to BB mode, load original value */
2072 	RTPRINT(rtlpriv, FINIT, INIT_IQK,
2073 		"IQK:Back to BB mode, load original value!\n");
2074 	rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0);
2075 	if (t != 0) {
2076 		if (is2t)
2077 			_rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
2078 							  rtlphy->iqk_bb_backup,
2079 							  IQK_BB_REG_NUM);
2080 		else
2081 			_rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
2082 							  rtlphy->iqk_bb_backup,
2083 							  IQK_BB_REG_NUM - 1);
2084 		/* Reload MAC parameters */
2085 		_rtl92d_phy_reload_mac_registers(hw, iqk_mac_reg,
2086 				rtlphy->iqk_mac_backup);
2087 		/*  Switch back BB to SI mode after finish IQ Calibration. */
2088 		if (!rtlphy->rfpi_enable)
2089 			_rtl92d_phy_pimode_switch(hw, false);
2090 		/* Reload ADDA power saving parameters */
2091 		_rtl92d_phy_reload_adda_registers(hw, adda_reg,
2092 						  rtlphy->adda_backup,
2093 						  IQK_ADDA_REG_NUM);
2094 	}
2095 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "<==\n");
2096 }
2097 
2098 static bool _rtl92d_phy_simularity_compare(struct ieee80211_hw *hw,
2099 	long result[][8], u8 c1, u8 c2)
2100 {
2101 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2102 	struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2103 	u32 i, j, diff, sim_bitmap, bound;
2104 	u8 final_candidate[2] = {0xFF, 0xFF};	/* for path A and path B */
2105 	bool bresult = true;
2106 	bool is2t = IS_92D_SINGLEPHY(rtlhal->version);
2107 
2108 	if (is2t)
2109 		bound = 8;
2110 	else
2111 		bound = 4;
2112 	sim_bitmap = 0;
2113 	for (i = 0; i < bound; i++) {
2114 		diff = (result[c1][i] > result[c2][i]) ? (result[c1][i] -
2115 		       result[c2][i]) : (result[c2][i] - result[c1][i]);
2116 		if (diff > MAX_TOLERANCE_92D) {
2117 			if ((i == 2 || i == 6) && !sim_bitmap) {
2118 				if (result[c1][i] + result[c1][i + 1] == 0)
2119 					final_candidate[(i / 4)] = c2;
2120 				else if (result[c2][i] + result[c2][i + 1] == 0)
2121 					final_candidate[(i / 4)] = c1;
2122 				else
2123 					sim_bitmap = sim_bitmap | (1 << i);
2124 			} else {
2125 				sim_bitmap = sim_bitmap | (1 << i);
2126 			}
2127 		}
2128 	}
2129 	if (sim_bitmap == 0) {
2130 		for (i = 0; i < (bound / 4); i++) {
2131 			if (final_candidate[i] != 0xFF) {
2132 				for (j = i * 4; j < (i + 1) * 4 - 2; j++)
2133 					result[3][j] =
2134 						 result[final_candidate[i]][j];
2135 				bresult = false;
2136 			}
2137 		}
2138 		return bresult;
2139 	}
2140 	if (!(sim_bitmap & 0x0F)) { /* path A OK */
2141 		for (i = 0; i < 4; i++)
2142 			result[3][i] = result[c1][i];
2143 	} else if (!(sim_bitmap & 0x03)) { /* path A, Tx OK */
2144 		for (i = 0; i < 2; i++)
2145 			result[3][i] = result[c1][i];
2146 	}
2147 	if (!(sim_bitmap & 0xF0) && is2t) { /* path B OK */
2148 		for (i = 4; i < 8; i++)
2149 			result[3][i] = result[c1][i];
2150 	} else if (!(sim_bitmap & 0x30)) { /* path B, Tx OK */
2151 		for (i = 4; i < 6; i++)
2152 			result[3][i] = result[c1][i];
2153 	}
2154 	return false;
2155 }
2156 
2157 static void _rtl92d_phy_patha_fill_iqk_matrix(struct ieee80211_hw *hw,
2158 					      bool iqk_ok, long result[][8],
2159 					      u8 final_candidate, bool txonly)
2160 {
2161 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2162 	struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2163 	u32 oldval_0, val_x, tx0_a, reg;
2164 	long val_y, tx0_c;
2165 	bool is2t = IS_92D_SINGLEPHY(rtlhal->version) ||
2166 	    rtlhal->macphymode == DUALMAC_DUALPHY;
2167 
2168 	RTPRINT(rtlpriv, FINIT, INIT_IQK,
2169 		"Path A IQ Calibration %s !\n", iqk_ok ? "Success" : "Failed");
2170 	if (final_candidate == 0xFF) {
2171 		return;
2172 	} else if (iqk_ok) {
2173 		oldval_0 = (rtl_get_bbreg(hw, ROFDM0_XATxIQIMBALANCE,
2174 			MASKDWORD) >> 22) & 0x3FF;	/* OFDM0_D */
2175 		val_x = result[final_candidate][0];
2176 		if ((val_x & 0x00000200) != 0)
2177 			val_x = val_x | 0xFFFFFC00;
2178 		tx0_a = (val_x * oldval_0) >> 8;
2179 		RTPRINT(rtlpriv, FINIT, INIT_IQK,
2180 			"X = 0x%x, tx0_a = 0x%x, oldval_0 0x%x\n",
2181 			val_x, tx0_a, oldval_0);
2182 		rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, 0x3FF, tx0_a);
2183 		rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(24),
2184 			      ((val_x * oldval_0 >> 7) & 0x1));
2185 		val_y = result[final_candidate][1];
2186 		if ((val_y & 0x00000200) != 0)
2187 			val_y = val_y | 0xFFFFFC00;
2188 		/* path B IQK result + 3 */
2189 		if (rtlhal->interfaceindex == 1 &&
2190 			rtlhal->current_bandtype == BAND_ON_5G)
2191 			val_y += 3;
2192 		tx0_c = (val_y * oldval_0) >> 8;
2193 		RTPRINT(rtlpriv, FINIT, INIT_IQK,
2194 			"Y = 0x%lx, tx0_c = 0x%lx\n",
2195 			val_y, tx0_c);
2196 		rtl_set_bbreg(hw, ROFDM0_XCTxAFE, 0xF0000000,
2197 			      ((tx0_c & 0x3C0) >> 6));
2198 		rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, 0x003F0000,
2199 			      (tx0_c & 0x3F));
2200 		if (is2t)
2201 			rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(26),
2202 				      ((val_y * oldval_0 >> 7) & 0x1));
2203 		RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xC80 = 0x%x\n",
2204 			rtl_get_bbreg(hw, ROFDM0_XATxIQIMBALANCE,
2205 				      MASKDWORD));
2206 		if (txonly) {
2207 			RTPRINT(rtlpriv, FINIT, INIT_IQK,  "only Tx OK\n");
2208 			return;
2209 		}
2210 		reg = result[final_candidate][2];
2211 		rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0x3FF, reg);
2212 		reg = result[final_candidate][3] & 0x3F;
2213 		rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0xFC00, reg);
2214 		reg = (result[final_candidate][3] >> 6) & 0xF;
2215 		rtl_set_bbreg(hw, 0xca0, 0xF0000000, reg);
2216 	}
2217 }
2218 
2219 static void _rtl92d_phy_pathb_fill_iqk_matrix(struct ieee80211_hw *hw,
2220 	bool iqk_ok, long result[][8], u8 final_candidate, bool txonly)
2221 {
2222 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2223 	struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2224 	u32 oldval_1, val_x, tx1_a, reg;
2225 	long val_y, tx1_c;
2226 
2227 	RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path B IQ Calibration %s !\n",
2228 		iqk_ok ? "Success" : "Failed");
2229 	if (final_candidate == 0xFF) {
2230 		return;
2231 	} else if (iqk_ok) {
2232 		oldval_1 = (rtl_get_bbreg(hw, ROFDM0_XBTxIQIMBALANCE,
2233 					  MASKDWORD) >> 22) & 0x3FF;
2234 		val_x = result[final_candidate][4];
2235 		if ((val_x & 0x00000200) != 0)
2236 			val_x = val_x | 0xFFFFFC00;
2237 		tx1_a = (val_x * oldval_1) >> 8;
2238 		RTPRINT(rtlpriv, FINIT, INIT_IQK, "X = 0x%x, tx1_a = 0x%x\n",
2239 			val_x, tx1_a);
2240 		rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, 0x3FF, tx1_a);
2241 		rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(28),
2242 			      ((val_x * oldval_1 >> 7) & 0x1));
2243 		val_y = result[final_candidate][5];
2244 		if ((val_y & 0x00000200) != 0)
2245 			val_y = val_y | 0xFFFFFC00;
2246 		if (rtlhal->current_bandtype == BAND_ON_5G)
2247 			val_y += 3;
2248 		tx1_c = (val_y * oldval_1) >> 8;
2249 		RTPRINT(rtlpriv, FINIT, INIT_IQK, "Y = 0x%lx, tx1_c = 0x%lx\n",
2250 			val_y, tx1_c);
2251 		rtl_set_bbreg(hw, ROFDM0_XDTxAFE, 0xF0000000,
2252 			      ((tx1_c & 0x3C0) >> 6));
2253 		rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, 0x003F0000,
2254 			      (tx1_c & 0x3F));
2255 		rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(30),
2256 			      ((val_y * oldval_1 >> 7) & 0x1));
2257 		if (txonly)
2258 			return;
2259 		reg = result[final_candidate][6];
2260 		rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0x3FF, reg);
2261 		reg = result[final_candidate][7] & 0x3F;
2262 		rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0xFC00, reg);
2263 		reg = (result[final_candidate][7] >> 6) & 0xF;
2264 		rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0x0000F000, reg);
2265 	}
2266 }
2267 
2268 void rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw)
2269 {
2270 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2271 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
2272 	struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2273 	long result[4][8];
2274 	u8 i, final_candidate, indexforchannel;
2275 	bool patha_ok, pathb_ok;
2276 	long rege94, rege9c, regea4, regeac, regeb4;
2277 	long regebc, regec4, regecc, regtmp = 0;
2278 	bool is12simular, is13simular, is23simular;
2279 	unsigned long flag = 0;
2280 
2281 	RTPRINT(rtlpriv, FINIT, INIT_IQK,
2282 		"IQK:Start!!!channel %d\n", rtlphy->current_channel);
2283 	for (i = 0; i < 8; i++) {
2284 		result[0][i] = 0;
2285 		result[1][i] = 0;
2286 		result[2][i] = 0;
2287 		result[3][i] = 0;
2288 	}
2289 	final_candidate = 0xff;
2290 	patha_ok = false;
2291 	pathb_ok = false;
2292 	is12simular = false;
2293 	is23simular = false;
2294 	is13simular = false;
2295 	RTPRINT(rtlpriv, FINIT, INIT_IQK,
2296 		"IQK !!!currentband %d\n", rtlhal->current_bandtype);
2297 	rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag);
2298 	for (i = 0; i < 3; i++) {
2299 		if (rtlhal->current_bandtype == BAND_ON_5G) {
2300 			_rtl92d_phy_iq_calibrate_5g_normal(hw, result, i);
2301 		} else if (rtlhal->current_bandtype == BAND_ON_2_4G) {
2302 			if (IS_92D_SINGLEPHY(rtlhal->version))
2303 				_rtl92d_phy_iq_calibrate(hw, result, i, true);
2304 			else
2305 				_rtl92d_phy_iq_calibrate(hw, result, i, false);
2306 		}
2307 		if (i == 1) {
2308 			is12simular = _rtl92d_phy_simularity_compare(hw, result,
2309 								     0, 1);
2310 			if (is12simular) {
2311 				final_candidate = 0;
2312 				break;
2313 			}
2314 		}
2315 		if (i == 2) {
2316 			is13simular = _rtl92d_phy_simularity_compare(hw, result,
2317 								     0, 2);
2318 			if (is13simular) {
2319 				final_candidate = 0;
2320 				break;
2321 			}
2322 			is23simular = _rtl92d_phy_simularity_compare(hw, result,
2323 								     1, 2);
2324 			if (is23simular) {
2325 				final_candidate = 1;
2326 			} else {
2327 				for (i = 0; i < 8; i++)
2328 					regtmp += result[3][i];
2329 
2330 				if (regtmp != 0)
2331 					final_candidate = 3;
2332 				else
2333 					final_candidate = 0xFF;
2334 			}
2335 		}
2336 	}
2337 	rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
2338 	for (i = 0; i < 4; i++) {
2339 		rege94 = result[i][0];
2340 		rege9c = result[i][1];
2341 		regea4 = result[i][2];
2342 		regeac = result[i][3];
2343 		regeb4 = result[i][4];
2344 		regebc = result[i][5];
2345 		regec4 = result[i][6];
2346 		regecc = result[i][7];
2347 		RTPRINT(rtlpriv, FINIT, INIT_IQK,
2348 			"IQK: rege94=%lx rege9c=%lx regea4=%lx regeac=%lx regeb4=%lx regebc=%lx regec4=%lx regecc=%lx\n",
2349 			rege94, rege9c, regea4, regeac, regeb4, regebc, regec4,
2350 			regecc);
2351 	}
2352 	if (final_candidate != 0xff) {
2353 		rtlphy->reg_e94 = rege94 = result[final_candidate][0];
2354 		rtlphy->reg_e9c = rege9c = result[final_candidate][1];
2355 		regea4 = result[final_candidate][2];
2356 		regeac = result[final_candidate][3];
2357 		rtlphy->reg_eb4 = regeb4 = result[final_candidate][4];
2358 		rtlphy->reg_ebc = regebc = result[final_candidate][5];
2359 		regec4 = result[final_candidate][6];
2360 		regecc = result[final_candidate][7];
2361 		RTPRINT(rtlpriv, FINIT, INIT_IQK,
2362 			"IQK: final_candidate is %x\n", final_candidate);
2363 		RTPRINT(rtlpriv, FINIT, INIT_IQK,
2364 			"IQK: rege94=%lx rege9c=%lx regea4=%lx regeac=%lx regeb4=%lx regebc=%lx regec4=%lx regecc=%lx\n",
2365 			rege94, rege9c, regea4, regeac, regeb4, regebc, regec4,
2366 			regecc);
2367 		patha_ok = pathb_ok = true;
2368 	} else {
2369 		rtlphy->reg_e94 = rtlphy->reg_eb4 = 0x100; /* X default value */
2370 		rtlphy->reg_e9c = rtlphy->reg_ebc = 0x0;   /* Y default value */
2371 	}
2372 	if ((rege94 != 0) /*&&(regea4 != 0) */)
2373 		_rtl92d_phy_patha_fill_iqk_matrix(hw, patha_ok, result,
2374 				final_candidate, (regea4 == 0));
2375 	if (IS_92D_SINGLEPHY(rtlhal->version)) {
2376 		if ((regeb4 != 0) /*&&(regec4 != 0) */)
2377 			_rtl92d_phy_pathb_fill_iqk_matrix(hw, pathb_ok, result,
2378 						final_candidate, (regec4 == 0));
2379 	}
2380 	if (final_candidate != 0xFF) {
2381 		indexforchannel = rtl92d_get_rightchnlplace_for_iqk(
2382 				  rtlphy->current_channel);
2383 
2384 		for (i = 0; i < IQK_MATRIX_REG_NUM; i++)
2385 			rtlphy->iqk_matrix[indexforchannel].
2386 				value[0][i] = result[final_candidate][i];
2387 		rtlphy->iqk_matrix[indexforchannel].iqk_done =
2388 			true;
2389 
2390 		RT_TRACE(rtlpriv, COMP_SCAN | COMP_MLME, DBG_LOUD,
2391 			 "IQK OK indexforchannel %d\n", indexforchannel);
2392 	}
2393 }
2394 
2395 void rtl92d_phy_reload_iqk_setting(struct ieee80211_hw *hw, u8 channel)
2396 {
2397 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2398 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
2399 	struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2400 	u8 indexforchannel;
2401 
2402 	RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "channel %d\n", channel);
2403 	/*------Do IQK for normal chip and test chip 5G band------- */
2404 	indexforchannel = rtl92d_get_rightchnlplace_for_iqk(channel);
2405 	RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "indexforchannel %d done %d\n",
2406 		 indexforchannel,
2407 		 rtlphy->iqk_matrix[indexforchannel].iqk_done);
2408 	if (0 && !rtlphy->iqk_matrix[indexforchannel].iqk_done &&
2409 		rtlphy->need_iqk) {
2410 		/* Re Do IQK. */
2411 		RT_TRACE(rtlpriv, COMP_SCAN | COMP_INIT, DBG_LOUD,
2412 			 "Do IQK Matrix reg for channel:%d....\n", channel);
2413 		rtl92d_phy_iq_calibrate(hw);
2414 	} else {
2415 		/* Just load the value. */
2416 		/* 2G band just load once. */
2417 		if (((!rtlhal->load_imrandiqk_setting_for2g) &&
2418 		    indexforchannel == 0) || indexforchannel > 0) {
2419 			RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
2420 				 "Just Read IQK Matrix reg for channel:%d....\n",
2421 				 channel);
2422 			if ((rtlphy->iqk_matrix[indexforchannel].
2423 			     value[0] != NULL)
2424 				/*&&(regea4 != 0) */)
2425 				_rtl92d_phy_patha_fill_iqk_matrix(hw, true,
2426 					rtlphy->iqk_matrix[
2427 					indexforchannel].value,	0,
2428 					(rtlphy->iqk_matrix[
2429 					indexforchannel].value[0][2] == 0));
2430 			if (IS_92D_SINGLEPHY(rtlhal->version)) {
2431 				if ((rtlphy->iqk_matrix[
2432 					indexforchannel].value[0][4] != 0)
2433 					/*&&(regec4 != 0) */)
2434 					_rtl92d_phy_pathb_fill_iqk_matrix(hw,
2435 						true,
2436 						rtlphy->iqk_matrix[
2437 						indexforchannel].value, 0,
2438 						(rtlphy->iqk_matrix[
2439 						indexforchannel].value[0][6]
2440 						== 0));
2441 			}
2442 		}
2443 	}
2444 	rtlphy->need_iqk = false;
2445 	RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
2446 }
2447 
2448 static u32 _rtl92d_phy_get_abs(u32 val1, u32 val2)
2449 {
2450 	u32 ret;
2451 
2452 	if (val1 >= val2)
2453 		ret = val1 - val2;
2454 	else
2455 		ret = val2 - val1;
2456 	return ret;
2457 }
2458 
2459 static bool _rtl92d_is_legal_5g_channel(struct ieee80211_hw *hw, u8 channel)
2460 {
2461 
2462 	int i;
2463 
2464 	for (i = 0; i < sizeof(channel5g); i++)
2465 		if (channel == channel5g[i])
2466 			return true;
2467 	return false;
2468 }
2469 
2470 static void _rtl92d_phy_calc_curvindex(struct ieee80211_hw *hw,
2471 				       u32 *targetchnl, u32 * curvecount_val,
2472 				       bool is5g, u32 *curveindex)
2473 {
2474 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2475 	u32 smallest_abs_val = 0xffffffff, u4tmp;
2476 	u8 i, j;
2477 	u8 chnl_num = is5g ? TARGET_CHNL_NUM_5G : TARGET_CHNL_NUM_2G;
2478 
2479 	for (i = 0; i < chnl_num; i++) {
2480 		if (is5g && !_rtl92d_is_legal_5g_channel(hw, i + 1))
2481 			continue;
2482 		curveindex[i] = 0;
2483 		for (j = 0; j < (CV_CURVE_CNT * 2); j++) {
2484 			u4tmp = _rtl92d_phy_get_abs(targetchnl[i],
2485 				curvecount_val[j]);
2486 
2487 			if (u4tmp < smallest_abs_val) {
2488 				curveindex[i] = j;
2489 				smallest_abs_val = u4tmp;
2490 			}
2491 		}
2492 		smallest_abs_val = 0xffffffff;
2493 		RTPRINT(rtlpriv, FINIT, INIT_IQK, "curveindex[%d] = %x\n",
2494 			i, curveindex[i]);
2495 	}
2496 }
2497 
2498 static void _rtl92d_phy_reload_lck_setting(struct ieee80211_hw *hw,
2499 		u8 channel)
2500 {
2501 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2502 	u8 erfpath = rtlpriv->rtlhal.current_bandtype ==
2503 		BAND_ON_5G ? RF90_PATH_A :
2504 		IS_92D_SINGLEPHY(rtlpriv->rtlhal.version) ?
2505 		RF90_PATH_B : RF90_PATH_A;
2506 	u32 u4tmp = 0, u4regvalue = 0;
2507 	bool bneed_powerdown_radio = false;
2508 
2509 	RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "path %d\n", erfpath);
2510 	RTPRINT(rtlpriv, FINIT, INIT_IQK, "band type = %d\n",
2511 		rtlpriv->rtlhal.current_bandtype);
2512 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "channel = %d\n", channel);
2513 	if (rtlpriv->rtlhal.current_bandtype == BAND_ON_5G) {/* Path-A for 5G */
2514 		u4tmp = curveindex_5g[channel-1];
2515 		RTPRINT(rtlpriv, FINIT, INIT_IQK,
2516 			"ver 1 set RF-A, 5G,	0x28 = 0x%x !!\n", u4tmp);
2517 		if (rtlpriv->rtlhal.macphymode == DUALMAC_DUALPHY &&
2518 			rtlpriv->rtlhal.interfaceindex == 1) {
2519 			bneed_powerdown_radio =
2520 				rtl92d_phy_enable_anotherphy(hw, false);
2521 			rtlpriv->rtlhal.during_mac1init_radioa = true;
2522 			/* asume no this case */
2523 			if (bneed_powerdown_radio)
2524 				_rtl92d_phy_enable_rf_env(hw, erfpath,
2525 							  &u4regvalue);
2526 		}
2527 		rtl_set_rfreg(hw, erfpath, RF_SYN_G4, 0x3f800, u4tmp);
2528 		if (bneed_powerdown_radio)
2529 			_rtl92d_phy_restore_rf_env(hw, erfpath, &u4regvalue);
2530 		if (rtlpriv->rtlhal.during_mac1init_radioa)
2531 			rtl92d_phy_powerdown_anotherphy(hw, false);
2532 	} else if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G) {
2533 		u4tmp = curveindex_2g[channel-1];
2534 		RTPRINT(rtlpriv, FINIT, INIT_IQK,
2535 			"ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n", u4tmp);
2536 		if (rtlpriv->rtlhal.macphymode == DUALMAC_DUALPHY &&
2537 			rtlpriv->rtlhal.interfaceindex == 0) {
2538 			bneed_powerdown_radio =
2539 				rtl92d_phy_enable_anotherphy(hw, true);
2540 			rtlpriv->rtlhal.during_mac0init_radiob = true;
2541 			if (bneed_powerdown_radio)
2542 				_rtl92d_phy_enable_rf_env(hw, erfpath,
2543 							  &u4regvalue);
2544 		}
2545 		rtl_set_rfreg(hw, erfpath, RF_SYN_G4, 0x3f800, u4tmp);
2546 		RTPRINT(rtlpriv, FINIT, INIT_IQK,
2547 			"ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n",
2548 			rtl_get_rfreg(hw,  erfpath, RF_SYN_G4, 0x3f800));
2549 		if (bneed_powerdown_radio)
2550 			_rtl92d_phy_restore_rf_env(hw, erfpath, &u4regvalue);
2551 		if (rtlpriv->rtlhal.during_mac0init_radiob)
2552 			rtl92d_phy_powerdown_anotherphy(hw, true);
2553 	}
2554 	RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
2555 }
2556 
2557 static void _rtl92d_phy_lc_calibrate_sw(struct ieee80211_hw *hw, bool is2t)
2558 {
2559 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2560 	struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2561 	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2562 	u8 tmpreg, index, rf_mode[2];
2563 	u8 path = is2t ? 2 : 1;
2564 	u8 i;
2565 	u32 u4tmp, offset;
2566 	u32 curvecount_val[CV_CURVE_CNT * 2] = {0};
2567 	u16 timeout = 800, timecount = 0;
2568 
2569 	/* Check continuous TX and Packet TX */
2570 	tmpreg = rtl_read_byte(rtlpriv, 0xd03);
2571 	/* if Deal with contisuous TX case, disable all continuous TX */
2572 	/* if Deal with Packet TX case, block all queues */
2573 	if ((tmpreg & 0x70) != 0)
2574 		rtl_write_byte(rtlpriv, 0xd03, tmpreg & 0x8F);
2575 	else
2576 		rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
2577 	rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xF00000, 0x0F);
2578 	for (index = 0; index < path; index++) {
2579 		/* 1. Read original RF mode */
2580 		offset = index == 0 ? ROFDM0_XAAGCCORE1 : ROFDM0_XBAGCCORE1;
2581 		rf_mode[index] = rtl_read_byte(rtlpriv, offset);
2582 		/* 2. Set RF mode = standby mode */
2583 		rtl_set_rfreg(hw, (enum radio_path)index, RF_AC,
2584 			      RFREG_OFFSET_MASK, 0x010000);
2585 		if (rtlpci->init_ready) {
2586 			/* switch CV-curve control by LC-calibration */
2587 			rtl_set_rfreg(hw, (enum radio_path)index, RF_SYN_G7,
2588 				      BIT(17), 0x0);
2589 			/* 4. Set LC calibration begin */
2590 			rtl_set_rfreg(hw, (enum radio_path)index, RF_CHNLBW,
2591 				      0x08000, 0x01);
2592 		}
2593 		u4tmp = rtl_get_rfreg(hw, (enum radio_path)index, RF_SYN_G6,
2594 				  RFREG_OFFSET_MASK);
2595 		while ((!(u4tmp & BIT(11))) && timecount <= timeout) {
2596 			mdelay(50);
2597 			timecount += 50;
2598 			u4tmp = rtl_get_rfreg(hw, (enum radio_path)index,
2599 					      RF_SYN_G6, RFREG_OFFSET_MASK);
2600 		}
2601 		RTPRINT(rtlpriv, FINIT, INIT_IQK,
2602 			"PHY_LCK finish delay for %d ms=2\n", timecount);
2603 		u4tmp = rtl_get_rfreg(hw, index, RF_SYN_G4, RFREG_OFFSET_MASK);
2604 		if (index == 0 && rtlhal->interfaceindex == 0) {
2605 			RTPRINT(rtlpriv, FINIT, INIT_IQK,
2606 				"path-A / 5G LCK\n");
2607 		} else {
2608 			RTPRINT(rtlpriv, FINIT, INIT_IQK,
2609 				"path-B / 2.4G LCK\n");
2610 		}
2611 		memset(&curvecount_val[0], 0, CV_CURVE_CNT * 2);
2612 		/* Set LC calibration off */
2613 		rtl_set_rfreg(hw, (enum radio_path)index, RF_CHNLBW,
2614 			      0x08000, 0x0);
2615 		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "set RF 0x18[15] = 0\n");
2616 		/* save Curve-counting number */
2617 		for (i = 0; i < CV_CURVE_CNT; i++) {
2618 			u32 readval = 0, readval2 = 0;
2619 			rtl_set_rfreg(hw, (enum radio_path)index, 0x3F,
2620 				      0x7f, i);
2621 
2622 			rtl_set_rfreg(hw, (enum radio_path)index, 0x4D,
2623 				RFREG_OFFSET_MASK, 0x0);
2624 			readval = rtl_get_rfreg(hw, (enum radio_path)index,
2625 					  0x4F, RFREG_OFFSET_MASK);
2626 			curvecount_val[2 * i + 1] = (readval & 0xfffe0) >> 5;
2627 			/* reg 0x4f [4:0] */
2628 			/* reg 0x50 [19:10] */
2629 			readval2 = rtl_get_rfreg(hw, (enum radio_path)index,
2630 						 0x50, 0xffc00);
2631 			curvecount_val[2 * i] = (((readval & 0x1F) << 10) |
2632 						 readval2);
2633 		}
2634 		if (index == 0 && rtlhal->interfaceindex == 0)
2635 			_rtl92d_phy_calc_curvindex(hw, targetchnl_5g,
2636 						   curvecount_val,
2637 						   true, curveindex_5g);
2638 		else
2639 			_rtl92d_phy_calc_curvindex(hw, targetchnl_2g,
2640 						   curvecount_val,
2641 						   false, curveindex_2g);
2642 		/* switch CV-curve control mode */
2643 		rtl_set_rfreg(hw, (enum radio_path)index, RF_SYN_G7,
2644 			      BIT(17), 0x1);
2645 	}
2646 
2647 	/* Restore original situation  */
2648 	for (index = 0; index < path; index++) {
2649 		offset = index == 0 ? ROFDM0_XAAGCCORE1 : ROFDM0_XBAGCCORE1;
2650 		rtl_write_byte(rtlpriv, offset, 0x50);
2651 		rtl_write_byte(rtlpriv, offset, rf_mode[index]);
2652 	}
2653 	if ((tmpreg & 0x70) != 0)
2654 		rtl_write_byte(rtlpriv, 0xd03, tmpreg);
2655 	else /*Deal with Packet TX case */
2656 		rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
2657 	rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xF00000, 0x00);
2658 	_rtl92d_phy_reload_lck_setting(hw, rtlpriv->phy.current_channel);
2659 }
2660 
2661 static void _rtl92d_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
2662 {
2663 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2664 
2665 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "cosa PHY_LCK ver=2\n");
2666 	_rtl92d_phy_lc_calibrate_sw(hw, is2t);
2667 }
2668 
2669 void rtl92d_phy_lc_calibrate(struct ieee80211_hw *hw)
2670 {
2671 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2672 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
2673 	struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2674 	u32 timeout = 2000, timecount = 0;
2675 
2676 	while (rtlpriv->mac80211.act_scanning && timecount < timeout) {
2677 		udelay(50);
2678 		timecount += 50;
2679 	}
2680 
2681 	rtlphy->lck_inprogress = true;
2682 	RTPRINT(rtlpriv, FINIT, INIT_IQK,
2683 		"LCK:Start!!! currentband %x delay %d ms\n",
2684 		rtlhal->current_bandtype, timecount);
2685 	if (IS_92D_SINGLEPHY(rtlhal->version)) {
2686 		_rtl92d_phy_lc_calibrate(hw, true);
2687 	} else {
2688 		/* For 1T1R */
2689 		_rtl92d_phy_lc_calibrate(hw, false);
2690 	}
2691 	rtlphy->lck_inprogress = false;
2692 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "LCK:Finish!!!\n");
2693 }
2694 
2695 void rtl92d_phy_ap_calibrate(struct ieee80211_hw *hw, s8 delta)
2696 {
2697 	return;
2698 }
2699 
2700 static bool _rtl92d_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
2701 		u32 cmdtableidx, u32 cmdtablesz, enum swchnlcmd_id cmdid,
2702 		u32 para1, u32 para2, u32 msdelay)
2703 {
2704 	struct swchnlcmd *pcmd;
2705 
2706 	if (cmdtable == NULL) {
2707 		RT_ASSERT(false, "cmdtable cannot be NULL\n");
2708 		return false;
2709 	}
2710 	if (cmdtableidx >= cmdtablesz)
2711 		return false;
2712 
2713 	pcmd = cmdtable + cmdtableidx;
2714 	pcmd->cmdid = cmdid;
2715 	pcmd->para1 = para1;
2716 	pcmd->para2 = para2;
2717 	pcmd->msdelay = msdelay;
2718 	return true;
2719 }
2720 
2721 void rtl92d_phy_reset_iqk_result(struct ieee80211_hw *hw)
2722 {
2723 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2724 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
2725 	u8 i;
2726 
2727 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2728 		 "settings regs %d default regs %d\n",
2729 		 (int)(sizeof(rtlphy->iqk_matrix) /
2730 		       sizeof(struct iqk_matrix_regs)),
2731 		 IQK_MATRIX_REG_NUM);
2732 	/* 0xe94, 0xe9c, 0xea4, 0xeac, 0xeb4, 0xebc, 0xec4, 0xecc */
2733 	for (i = 0; i < IQK_MATRIX_SETTINGS_NUM; i++) {
2734 		rtlphy->iqk_matrix[i].value[0][0] = 0x100;
2735 		rtlphy->iqk_matrix[i].value[0][2] = 0x100;
2736 		rtlphy->iqk_matrix[i].value[0][4] = 0x100;
2737 		rtlphy->iqk_matrix[i].value[0][6] = 0x100;
2738 		rtlphy->iqk_matrix[i].value[0][1] = 0x0;
2739 		rtlphy->iqk_matrix[i].value[0][3] = 0x0;
2740 		rtlphy->iqk_matrix[i].value[0][5] = 0x0;
2741 		rtlphy->iqk_matrix[i].value[0][7] = 0x0;
2742 		rtlphy->iqk_matrix[i].iqk_done = false;
2743 	}
2744 }
2745 
2746 static bool _rtl92d_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
2747 					     u8 channel, u8 *stage, u8 *step,
2748 					     u32 *delay)
2749 {
2750 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2751 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
2752 	struct swchnlcmd precommoncmd[MAX_PRECMD_CNT];
2753 	u32 precommoncmdcnt;
2754 	struct swchnlcmd postcommoncmd[MAX_POSTCMD_CNT];
2755 	u32 postcommoncmdcnt;
2756 	struct swchnlcmd rfdependcmd[MAX_RFDEPENDCMD_CNT];
2757 	u32 rfdependcmdcnt;
2758 	struct swchnlcmd *currentcmd = NULL;
2759 	u8 rfpath;
2760 	u8 num_total_rfpath = rtlphy->num_total_rfpath;
2761 
2762 	precommoncmdcnt = 0;
2763 	_rtl92d_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
2764 					 MAX_PRECMD_CNT,
2765 					 CMDID_SET_TXPOWEROWER_LEVEL, 0, 0, 0);
2766 	_rtl92d_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
2767 					 MAX_PRECMD_CNT, CMDID_END, 0, 0, 0);
2768 	postcommoncmdcnt = 0;
2769 	_rtl92d_phy_set_sw_chnl_cmdarray(postcommoncmd, postcommoncmdcnt++,
2770 					 MAX_POSTCMD_CNT, CMDID_END, 0, 0, 0);
2771 	rfdependcmdcnt = 0;
2772 	_rtl92d_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
2773 					 MAX_RFDEPENDCMD_CNT, CMDID_RF_WRITEREG,
2774 					 RF_CHNLBW, channel, 0);
2775 	_rtl92d_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
2776 					 MAX_RFDEPENDCMD_CNT, CMDID_END,
2777 					 0, 0, 0);
2778 
2779 	do {
2780 		switch (*stage) {
2781 		case 0:
2782 			currentcmd = &precommoncmd[*step];
2783 			break;
2784 		case 1:
2785 			currentcmd = &rfdependcmd[*step];
2786 			break;
2787 		case 2:
2788 			currentcmd = &postcommoncmd[*step];
2789 			break;
2790 		}
2791 		if (currentcmd->cmdid == CMDID_END) {
2792 			if ((*stage) == 2) {
2793 				return true;
2794 			} else {
2795 				(*stage)++;
2796 				(*step) = 0;
2797 				continue;
2798 			}
2799 		}
2800 		switch (currentcmd->cmdid) {
2801 		case CMDID_SET_TXPOWEROWER_LEVEL:
2802 			rtl92d_phy_set_txpower_level(hw, channel);
2803 			break;
2804 		case CMDID_WRITEPORT_ULONG:
2805 			rtl_write_dword(rtlpriv, currentcmd->para1,
2806 					currentcmd->para2);
2807 			break;
2808 		case CMDID_WRITEPORT_USHORT:
2809 			rtl_write_word(rtlpriv, currentcmd->para1,
2810 				       (u16)currentcmd->para2);
2811 			break;
2812 		case CMDID_WRITEPORT_UCHAR:
2813 			rtl_write_byte(rtlpriv, currentcmd->para1,
2814 				       (u8)currentcmd->para2);
2815 			break;
2816 		case CMDID_RF_WRITEREG:
2817 			for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) {
2818 				rtlphy->rfreg_chnlval[rfpath] =
2819 					((rtlphy->rfreg_chnlval[rfpath] &
2820 					0xffffff00) | currentcmd->para2);
2821 				if (rtlpriv->rtlhal.current_bandtype ==
2822 				    BAND_ON_5G) {
2823 					if (currentcmd->para2 > 99)
2824 						rtlphy->rfreg_chnlval[rfpath] =
2825 						    rtlphy->rfreg_chnlval
2826 						    [rfpath] | (BIT(18));
2827 					else
2828 						rtlphy->rfreg_chnlval[rfpath] =
2829 						    rtlphy->rfreg_chnlval
2830 						    [rfpath] & (~BIT(18));
2831 					rtlphy->rfreg_chnlval[rfpath] |=
2832 						 (BIT(16) | BIT(8));
2833 				} else {
2834 					rtlphy->rfreg_chnlval[rfpath] &=
2835 						~(BIT(8) | BIT(16) | BIT(18));
2836 				}
2837 				rtl_set_rfreg(hw, (enum radio_path)rfpath,
2838 					      currentcmd->para1,
2839 					      RFREG_OFFSET_MASK,
2840 					      rtlphy->rfreg_chnlval[rfpath]);
2841 				_rtl92d_phy_reload_imr_setting(hw, channel,
2842 							       rfpath);
2843 			}
2844 			_rtl92d_phy_switch_rf_setting(hw, channel);
2845 			/* do IQK when all parameters are ready */
2846 			rtl92d_phy_reload_iqk_setting(hw, channel);
2847 			break;
2848 		default:
2849 			RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2850 				 "switch case %#x not processed\n",
2851 				 currentcmd->cmdid);
2852 			break;
2853 		}
2854 		break;
2855 	} while (true);
2856 	(*delay) = currentcmd->msdelay;
2857 	(*step)++;
2858 	return false;
2859 }
2860 
2861 u8 rtl92d_phy_sw_chnl(struct ieee80211_hw *hw)
2862 {
2863 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2864 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
2865 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2866 	u32 delay;
2867 	u32 timeout = 1000, timecount = 0;
2868 	u8 channel = rtlphy->current_channel;
2869 	u32 ret_value;
2870 
2871 	if (rtlphy->sw_chnl_inprogress)
2872 		return 0;
2873 	if (rtlphy->set_bwmode_inprogress)
2874 		return 0;
2875 
2876 	if ((is_hal_stop(rtlhal)) || (RT_CANNOT_IO(hw))) {
2877 		RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
2878 			 "sw_chnl_inprogress false driver sleep or unload\n");
2879 		return 0;
2880 	}
2881 	while (rtlphy->lck_inprogress && timecount < timeout) {
2882 		mdelay(50);
2883 		timecount += 50;
2884 	}
2885 	if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY &&
2886 	    rtlhal->bandset == BAND_ON_BOTH) {
2887 		ret_value = rtl_get_bbreg(hw, RFPGA0_XAB_RFPARAMETER,
2888 					  MASKDWORD);
2889 		if (rtlphy->current_channel > 14 && !(ret_value & BIT(0)))
2890 			rtl92d_phy_switch_wirelessband(hw, BAND_ON_5G);
2891 		else if (rtlphy->current_channel <= 14 && (ret_value & BIT(0)))
2892 			rtl92d_phy_switch_wirelessband(hw, BAND_ON_2_4G);
2893 	}
2894 	switch (rtlhal->current_bandtype) {
2895 	case BAND_ON_5G:
2896 		/* Get first channel error when change between
2897 		 * 5G and 2.4G band. */
2898 		if (channel <= 14)
2899 			return 0;
2900 		RT_ASSERT((channel > 14), "5G but channel<=14\n");
2901 		break;
2902 	case BAND_ON_2_4G:
2903 		/* Get first channel error when change between
2904 		 * 5G and 2.4G band. */
2905 		if (channel > 14)
2906 			return 0;
2907 		RT_ASSERT((channel <= 14), "2G but channel>14\n");
2908 		break;
2909 	default:
2910 		RT_ASSERT(false, "Invalid WirelessMode(%#x)!!\n",
2911 			  rtlpriv->mac80211.mode);
2912 		break;
2913 	}
2914 	rtlphy->sw_chnl_inprogress = true;
2915 	if (channel == 0)
2916 		channel = 1;
2917 	rtlphy->sw_chnl_stage = 0;
2918 	rtlphy->sw_chnl_step = 0;
2919 	RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
2920 		 "switch to channel%d\n", rtlphy->current_channel);
2921 
2922 	do {
2923 		if (!rtlphy->sw_chnl_inprogress)
2924 			break;
2925 		if (!_rtl92d_phy_sw_chnl_step_by_step(hw,
2926 						      rtlphy->current_channel,
2927 		    &rtlphy->sw_chnl_stage, &rtlphy->sw_chnl_step, &delay)) {
2928 			if (delay > 0)
2929 				mdelay(delay);
2930 			else
2931 				continue;
2932 		} else {
2933 			rtlphy->sw_chnl_inprogress = false;
2934 		}
2935 		break;
2936 	} while (true);
2937 	RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "<==\n");
2938 	rtlphy->sw_chnl_inprogress = false;
2939 	return 1;
2940 }
2941 
2942 static void rtl92d_phy_set_io(struct ieee80211_hw *hw)
2943 {
2944 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2945 	struct dig_t *de_digtable = &rtlpriv->dm_digtable;
2946 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
2947 
2948 	RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
2949 		 "--->Cmd(%#x), set_io_inprogress(%d)\n",
2950 		 rtlphy->current_io_type, rtlphy->set_io_inprogress);
2951 	switch (rtlphy->current_io_type) {
2952 	case IO_CMD_RESUME_DM_BY_SCAN:
2953 		de_digtable->cur_igvalue = rtlphy->initgain_backup.xaagccore1;
2954 		rtl92d_dm_write_dig(hw);
2955 		rtl92d_phy_set_txpower_level(hw, rtlphy->current_channel);
2956 		break;
2957 	case IO_CMD_PAUSE_DM_BY_SCAN:
2958 		rtlphy->initgain_backup.xaagccore1 = de_digtable->cur_igvalue;
2959 		de_digtable->cur_igvalue = 0x37;
2960 		rtl92d_dm_write_dig(hw);
2961 		break;
2962 	default:
2963 		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2964 			 "switch case %#x not processed\n",
2965 			 rtlphy->current_io_type);
2966 		break;
2967 	}
2968 	rtlphy->set_io_inprogress = false;
2969 	RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "<---(%#x)\n",
2970 		 rtlphy->current_io_type);
2971 }
2972 
2973 bool rtl92d_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
2974 {
2975 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2976 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
2977 	bool postprocessing = false;
2978 
2979 	RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
2980 		 "-->IO Cmd(%#x), set_io_inprogress(%d)\n",
2981 		 iotype, rtlphy->set_io_inprogress);
2982 	do {
2983 		switch (iotype) {
2984 		case IO_CMD_RESUME_DM_BY_SCAN:
2985 			RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
2986 				 "[IO CMD] Resume DM after scan\n");
2987 			postprocessing = true;
2988 			break;
2989 		case IO_CMD_PAUSE_DM_BY_SCAN:
2990 			RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
2991 				 "[IO CMD] Pause DM before scan\n");
2992 			postprocessing = true;
2993 			break;
2994 		default:
2995 			RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2996 				 "switch case %#x not processed\n", iotype);
2997 			break;
2998 		}
2999 	} while (false);
3000 	if (postprocessing && !rtlphy->set_io_inprogress) {
3001 		rtlphy->set_io_inprogress = true;
3002 		rtlphy->current_io_type = iotype;
3003 	} else {
3004 		return false;
3005 	}
3006 	rtl92d_phy_set_io(hw);
3007 	RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "<--IO Type(%#x)\n", iotype);
3008 	return true;
3009 }
3010 
3011 static void _rtl92d_phy_set_rfon(struct ieee80211_hw *hw)
3012 {
3013 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3014 
3015 	/* a.  SYS_CLKR 0x08[11] = 1  restore MAC clock */
3016 	/* b.  SPS_CTRL 0x11[7:0] = 0x2b */
3017 	if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY)
3018 		rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b);
3019 	/* c.  For PCIE: SYS_FUNC_EN 0x02[7:0] = 0xE3 enable BB TRX function */
3020 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3021 	/* RF_ON_EXCEP(d~g): */
3022 	/* d.  APSD_CTRL 0x600[7:0] = 0x00 */
3023 	rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);
3024 	/* e.  SYS_FUNC_EN 0x02[7:0] = 0xE2  reset BB TRX function again */
3025 	/* f.  SYS_FUNC_EN 0x02[7:0] = 0xE3  enable BB TRX function*/
3026 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3027 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3028 	/* g.   txpause 0x522[7:0] = 0x00  enable mac tx queue */
3029 	rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
3030 }
3031 
3032 static void _rtl92d_phy_set_rfsleep(struct ieee80211_hw *hw)
3033 {
3034 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3035 	u32 u4btmp;
3036 	u8 delay = 5;
3037 
3038 	/* a.   TXPAUSE 0x522[7:0] = 0xFF  Pause MAC TX queue  */
3039 	rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
3040 	/* b.   RF path 0 offset 0x00 = 0x00  disable RF  */
3041 	rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
3042 	/* c.   APSD_CTRL 0x600[7:0] = 0x40 */
3043 	rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40);
3044 	/* d. APSD_CTRL 0x600[7:0] = 0x00
3045 	 * APSD_CTRL 0x600[7:0] = 0x00
3046 	 * RF path 0 offset 0x00 = 0x00
3047 	 * APSD_CTRL 0x600[7:0] = 0x40
3048 	 * */
3049 	u4btmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK);
3050 	while (u4btmp != 0 && delay > 0) {
3051 		rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x0);
3052 		rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
3053 		rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40);
3054 		u4btmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK);
3055 		delay--;
3056 	}
3057 	if (delay == 0) {
3058 		/* Jump out the LPS turn off sequence to RF_ON_EXCEP */
3059 		rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);
3060 
3061 		rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3062 		rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3063 		rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
3064 		RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
3065 			 "Fail !!! Switch RF timeout\n");
3066 		return;
3067 	}
3068 	/* e.   For PCIE: SYS_FUNC_EN 0x02[7:0] = 0xE2 reset BB TRX function */
3069 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3070 	/* f.   SPS_CTRL 0x11[7:0] = 0x22 */
3071 	if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY)
3072 		rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22);
3073 	/* g.    SYS_CLKR 0x08[11] = 0  gated MAC clock */
3074 }
3075 
3076 bool rtl92d_phy_set_rf_power_state(struct ieee80211_hw *hw,
3077 				   enum rf_pwrstate rfpwr_state)
3078 {
3079 
3080 	bool bresult = true;
3081 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3082 	struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
3083 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3084 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
3085 	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
3086 	u8 i, queue_id;
3087 	struct rtl8192_tx_ring *ring = NULL;
3088 
3089 	if (rfpwr_state == ppsc->rfpwr_state)
3090 		return false;
3091 	switch (rfpwr_state) {
3092 	case ERFON:
3093 		if ((ppsc->rfpwr_state == ERFOFF) &&
3094 		    RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
3095 			bool rtstatus;
3096 			u32 InitializeCount = 0;
3097 			do {
3098 				InitializeCount++;
3099 				RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3100 					 "IPS Set eRf nic enable\n");
3101 				rtstatus = rtl_ps_enable_nic(hw);
3102 			} while (!rtstatus && (InitializeCount < 10));
3103 
3104 			RT_CLEAR_PS_LEVEL(ppsc,
3105 					  RT_RF_OFF_LEVL_HALT_NIC);
3106 		} else {
3107 			RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
3108 				 "awake, sleeped:%d ms state_inap:%x\n",
3109 				 jiffies_to_msecs(jiffies -
3110 						  ppsc->last_sleep_jiffies),
3111 				 rtlpriv->psc.state_inap);
3112 			ppsc->last_awake_jiffies = jiffies;
3113 			_rtl92d_phy_set_rfon(hw);
3114 		}
3115 
3116 		if (mac->link_state == MAC80211_LINKED)
3117 			rtlpriv->cfg->ops->led_control(hw,
3118 					 LED_CTL_LINK);
3119 		else
3120 			rtlpriv->cfg->ops->led_control(hw,
3121 					 LED_CTL_NO_LINK);
3122 		break;
3123 	case ERFOFF:
3124 		if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
3125 			RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3126 				 "IPS Set eRf nic disable\n");
3127 			rtl_ps_disable_nic(hw);
3128 			RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
3129 		} else {
3130 			if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS)
3131 				rtlpriv->cfg->ops->led_control(hw,
3132 						 LED_CTL_NO_LINK);
3133 			else
3134 				rtlpriv->cfg->ops->led_control(hw,
3135 						 LED_CTL_POWER_OFF);
3136 		}
3137 		break;
3138 	case ERFSLEEP:
3139 		if (ppsc->rfpwr_state == ERFOFF)
3140 			return false;
3141 
3142 		for (queue_id = 0, i = 0;
3143 		     queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
3144 			ring = &pcipriv->dev.tx_ring[queue_id];
3145 			if (skb_queue_len(&ring->queue) == 0 ||
3146 			    queue_id == BEACON_QUEUE) {
3147 				queue_id++;
3148 				continue;
3149 			} else if (rtlpci->pdev->current_state != PCI_D0) {
3150 				RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
3151 					 "eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 but lower power state!\n",
3152 					 i + 1, queue_id);
3153 				break;
3154 			} else {
3155 				RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3156 					 "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
3157 					 i + 1, queue_id,
3158 					 skb_queue_len(&ring->queue));
3159 				udelay(10);
3160 				i++;
3161 			}
3162 
3163 			if (i >= MAX_DOZE_WAITING_TIMES_9x) {
3164 				RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3165 					 "ERFOFF: %d times TcbBusyQueue[%d] = %d !\n",
3166 					 MAX_DOZE_WAITING_TIMES_9x, queue_id,
3167 					 skb_queue_len(&ring->queue));
3168 				break;
3169 			}
3170 		}
3171 		RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
3172 			 "Set rfsleep awaked:%d ms\n",
3173 			 jiffies_to_msecs(jiffies - ppsc->last_awake_jiffies));
3174 		RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
3175 			 "sleep awaked:%d ms state_inap:%x\n",
3176 			 jiffies_to_msecs(jiffies -
3177 					  ppsc->last_awake_jiffies),
3178 			 rtlpriv->psc.state_inap);
3179 		ppsc->last_sleep_jiffies = jiffies;
3180 		_rtl92d_phy_set_rfsleep(hw);
3181 		break;
3182 	default:
3183 		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3184 			 "switch case %#x not processed\n", rfpwr_state);
3185 		bresult = false;
3186 		break;
3187 	}
3188 	if (bresult)
3189 		ppsc->rfpwr_state = rfpwr_state;
3190 	return bresult;
3191 }
3192 
3193 void rtl92d_phy_config_macphymode(struct ieee80211_hw *hw)
3194 {
3195 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3196 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3197 	u8 offset = REG_MAC_PHY_CTRL_NORMAL;
3198 
3199 	switch (rtlhal->macphymode) {
3200 	case DUALMAC_DUALPHY:
3201 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3202 			 "MacPhyMode: DUALMAC_DUALPHY\n");
3203 		rtl_write_byte(rtlpriv, offset, 0xF3);
3204 		break;
3205 	case SINGLEMAC_SINGLEPHY:
3206 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3207 			 "MacPhyMode: SINGLEMAC_SINGLEPHY\n");
3208 		rtl_write_byte(rtlpriv, offset, 0xF4);
3209 		break;
3210 	case DUALMAC_SINGLEPHY:
3211 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3212 			 "MacPhyMode: DUALMAC_SINGLEPHY\n");
3213 		rtl_write_byte(rtlpriv, offset, 0xF1);
3214 		break;
3215 	}
3216 }
3217 
3218 void rtl92d_phy_config_macphymode_info(struct ieee80211_hw *hw)
3219 {
3220 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3221 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3222 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
3223 
3224 	switch (rtlhal->macphymode) {
3225 	case DUALMAC_SINGLEPHY:
3226 		rtlphy->rf_type = RF_2T2R;
3227 		rtlhal->version |= RF_TYPE_2T2R;
3228 		rtlhal->bandset = BAND_ON_BOTH;
3229 		rtlhal->current_bandtype = BAND_ON_2_4G;
3230 		break;
3231 
3232 	case SINGLEMAC_SINGLEPHY:
3233 		rtlphy->rf_type = RF_2T2R;
3234 		rtlhal->version |= RF_TYPE_2T2R;
3235 		rtlhal->bandset = BAND_ON_BOTH;
3236 		rtlhal->current_bandtype = BAND_ON_2_4G;
3237 		break;
3238 
3239 	case DUALMAC_DUALPHY:
3240 		rtlphy->rf_type = RF_1T1R;
3241 		rtlhal->version &= RF_TYPE_1T1R;
3242 		/* Now we let MAC0 run on 5G band. */
3243 		if (rtlhal->interfaceindex == 0) {
3244 			rtlhal->bandset = BAND_ON_5G;
3245 			rtlhal->current_bandtype = BAND_ON_5G;
3246 		} else {
3247 			rtlhal->bandset = BAND_ON_2_4G;
3248 			rtlhal->current_bandtype = BAND_ON_2_4G;
3249 		}
3250 		break;
3251 	default:
3252 		break;
3253 	}
3254 }
3255 
3256 u8 rtl92d_get_chnlgroup_fromarray(u8 chnl)
3257 {
3258 	u8 group;
3259 	u8 channel_info[59] = {
3260 		1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
3261 		36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56,
3262 		58, 60, 62, 64, 100, 102, 104, 106, 108,
3263 		110, 112, 114, 116, 118, 120, 122, 124,
3264 		126, 128, 130, 132, 134, 136, 138, 140,
3265 		149, 151, 153, 155, 157, 159, 161, 163,
3266 		165
3267 	};
3268 
3269 	if (channel_info[chnl] <= 3)
3270 		group = 0;
3271 	else if (channel_info[chnl] <= 9)
3272 		group = 1;
3273 	else if (channel_info[chnl] <= 14)
3274 		group = 2;
3275 	else if (channel_info[chnl] <= 44)
3276 		group = 3;
3277 	else if (channel_info[chnl] <= 54)
3278 		group = 4;
3279 	else if (channel_info[chnl] <= 64)
3280 		group = 5;
3281 	else if (channel_info[chnl] <= 112)
3282 		group = 6;
3283 	else if (channel_info[chnl] <= 126)
3284 		group = 7;
3285 	else if (channel_info[chnl] <= 140)
3286 		group = 8;
3287 	else if (channel_info[chnl] <= 153)
3288 		group = 9;
3289 	else if (channel_info[chnl] <= 159)
3290 		group = 10;
3291 	else
3292 		group = 11;
3293 	return group;
3294 }
3295 
3296 void rtl92d_phy_set_poweron(struct ieee80211_hw *hw)
3297 {
3298 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3299 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3300 	unsigned long flags;
3301 	u8 value8;
3302 	u16 i;
3303 	u32 mac_reg = (rtlhal->interfaceindex == 0 ? REG_MAC0 : REG_MAC1);
3304 
3305 	/* notice fw know band status  0x81[1]/0x53[1] = 0: 5G, 1: 2G */
3306 	if (rtlhal->current_bandtype == BAND_ON_2_4G) {
3307 		value8 = rtl_read_byte(rtlpriv, mac_reg);
3308 		value8 |= BIT(1);
3309 		rtl_write_byte(rtlpriv, mac_reg, value8);
3310 	} else {
3311 		value8 = rtl_read_byte(rtlpriv, mac_reg);
3312 		value8 &= (~BIT(1));
3313 		rtl_write_byte(rtlpriv, mac_reg, value8);
3314 	}
3315 
3316 	if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY) {
3317 		value8 = rtl_read_byte(rtlpriv, REG_MAC0);
3318 		rtl_write_byte(rtlpriv, REG_MAC0, value8 | MAC0_ON);
3319 	} else {
3320 		spin_lock_irqsave(&globalmutex_power, flags);
3321 		if (rtlhal->interfaceindex == 0) {
3322 			value8 = rtl_read_byte(rtlpriv, REG_MAC0);
3323 			rtl_write_byte(rtlpriv, REG_MAC0, value8 | MAC0_ON);
3324 		} else {
3325 			value8 = rtl_read_byte(rtlpriv, REG_MAC1);
3326 			rtl_write_byte(rtlpriv, REG_MAC1, value8 | MAC1_ON);
3327 		}
3328 		value8 = rtl_read_byte(rtlpriv, REG_POWER_OFF_IN_PROCESS);
3329 		spin_unlock_irqrestore(&globalmutex_power, flags);
3330 		for (i = 0; i < 200; i++) {
3331 			if ((value8 & BIT(7)) == 0) {
3332 				break;
3333 			} else {
3334 				udelay(500);
3335 				spin_lock_irqsave(&globalmutex_power, flags);
3336 				value8 = rtl_read_byte(rtlpriv,
3337 						    REG_POWER_OFF_IN_PROCESS);
3338 				spin_unlock_irqrestore(&globalmutex_power,
3339 						       flags);
3340 			}
3341 		}
3342 		if (i == 200)
3343 			RT_ASSERT(false, "Another mac power off over time\n");
3344 	}
3345 }
3346 
3347 void rtl92d_phy_config_maccoexist_rfpage(struct ieee80211_hw *hw)
3348 {
3349 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3350 
3351 	switch (rtlpriv->rtlhal.macphymode) {
3352 	case DUALMAC_DUALPHY:
3353 		rtl_write_byte(rtlpriv, REG_DMC, 0x0);
3354 		rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x08);
3355 		rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, 0x13ff);
3356 		break;
3357 	case DUALMAC_SINGLEPHY:
3358 		rtl_write_byte(rtlpriv, REG_DMC, 0xf8);
3359 		rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x08);
3360 		rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, 0x13ff);
3361 		break;
3362 	case SINGLEMAC_SINGLEPHY:
3363 		rtl_write_byte(rtlpriv, REG_DMC, 0x0);
3364 		rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x10);
3365 		rtl_write_word(rtlpriv, (REG_TRXFF_BNDY + 2), 0x27FF);
3366 		break;
3367 	default:
3368 		break;
3369 	}
3370 }
3371 
3372 void rtl92d_update_bbrf_configuration(struct ieee80211_hw *hw)
3373 {
3374 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3375 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3376 	struct rtl_phy *rtlphy = &(rtlpriv->phy);
3377 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
3378 	u8 rfpath, i;
3379 
3380 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "==>\n");
3381 	/* r_select_5G for path_A/B 0 for 2.4G, 1 for 5G */
3382 	if (rtlhal->current_bandtype == BAND_ON_2_4G) {
3383 		/* r_select_5G for path_A/B,0x878 */
3384 		rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(0), 0x0);
3385 		rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15), 0x0);
3386 		if (rtlhal->macphymode != DUALMAC_DUALPHY) {
3387 			rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(16), 0x0);
3388 			rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(31), 0x0);
3389 		}
3390 		/* rssi_table_select:index 0 for 2.4G.1~3 for 5G,0xc78 */
3391 		rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, BIT(6) | BIT(7), 0x0);
3392 		/* fc_area  0xd2c */
3393 		rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(14) | BIT(13), 0x0);
3394 		/* 5G LAN ON */
3395 		rtl_set_bbreg(hw, 0xB30, 0x00F00000, 0xa);
3396 		/* TX BB gain shift*1,Just for testchip,0xc80,0xc88 */
3397 		rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, MASKDWORD,
3398 			      0x40000100);
3399 		rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, MASKDWORD,
3400 			      0x40000100);
3401 		if (rtlhal->macphymode == DUALMAC_DUALPHY) {
3402 			rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3403 				      BIT(10) | BIT(6) | BIT(5),
3404 				      ((rtlefuse->eeprom_c9 & BIT(3)) >> 3) |
3405 				      (rtlefuse->eeprom_c9 & BIT(1)) |
3406 				      ((rtlefuse->eeprom_cc & BIT(1)) << 4));
3407 			rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
3408 				      BIT(10) | BIT(6) | BIT(5),
3409 				      ((rtlefuse->eeprom_c9 & BIT(2)) >> 2) |
3410 				      ((rtlefuse->eeprom_c9 & BIT(0)) << 1) |
3411 				      ((rtlefuse->eeprom_cc & BIT(0)) << 5));
3412 			rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15), 0);
3413 		} else {
3414 			rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3415 				      BIT(26) | BIT(22) | BIT(21) | BIT(10) |
3416 				      BIT(6) | BIT(5),
3417 				      ((rtlefuse->eeprom_c9 & BIT(3)) >> 3) |
3418 				      (rtlefuse->eeprom_c9 & BIT(1)) |
3419 				      ((rtlefuse->eeprom_cc & BIT(1)) << 4) |
3420 				      ((rtlefuse->eeprom_c9 & BIT(7)) << 9) |
3421 				      ((rtlefuse->eeprom_c9 & BIT(5)) << 12) |
3422 				      ((rtlefuse->eeprom_cc & BIT(3)) << 18));
3423 			rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
3424 				      BIT(10) | BIT(6) | BIT(5),
3425 				      ((rtlefuse->eeprom_c9 & BIT(2)) >> 2) |
3426 				      ((rtlefuse->eeprom_c9 & BIT(0)) << 1) |
3427 				      ((rtlefuse->eeprom_cc & BIT(0)) << 5));
3428 			rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
3429 				      BIT(10) | BIT(6) | BIT(5),
3430 				      ((rtlefuse->eeprom_c9 & BIT(6)) >> 6) |
3431 				      ((rtlefuse->eeprom_c9 & BIT(4)) >> 3) |
3432 				      ((rtlefuse->eeprom_cc & BIT(2)) << 3));
3433 			rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER,
3434 				      BIT(31) | BIT(15), 0);
3435 		}
3436 		/* 1.5V_LDO */
3437 	} else {
3438 		/* r_select_5G for path_A/B */
3439 		rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(0), 0x1);
3440 		rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15), 0x1);
3441 		if (rtlhal->macphymode != DUALMAC_DUALPHY) {
3442 			rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(16), 0x1);
3443 			rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(31), 0x1);
3444 		}
3445 		/* rssi_table_select:index 0 for 2.4G.1~3 for 5G */
3446 		rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, BIT(6) | BIT(7), 0x1);
3447 		/* fc_area */
3448 		rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(14) | BIT(13), 0x1);
3449 		/* 5G LAN ON */
3450 		rtl_set_bbreg(hw, 0xB30, 0x00F00000, 0x0);
3451 		/* TX BB gain shift,Just for testchip,0xc80,0xc88 */
3452 		if (rtlefuse->internal_pa_5g[0])
3453 			rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, MASKDWORD,
3454 				      0x2d4000b5);
3455 		else
3456 			rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, MASKDWORD,
3457 				      0x20000080);
3458 		if (rtlefuse->internal_pa_5g[1])
3459 			rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, MASKDWORD,
3460 				      0x2d4000b5);
3461 		else
3462 			rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, MASKDWORD,
3463 				      0x20000080);
3464 		if (rtlhal->macphymode == DUALMAC_DUALPHY) {
3465 			rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3466 				      BIT(10) | BIT(6) | BIT(5),
3467 				      (rtlefuse->eeprom_cc & BIT(5)));
3468 			rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(10),
3469 				      ((rtlefuse->eeprom_cc & BIT(4)) >> 4));
3470 			rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15),
3471 				      (rtlefuse->eeprom_cc & BIT(4)) >> 4);
3472 		} else {
3473 			rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3474 				      BIT(26) | BIT(22) | BIT(21) | BIT(10) |
3475 				      BIT(6) | BIT(5),
3476 				      (rtlefuse->eeprom_cc & BIT(5)) |
3477 				      ((rtlefuse->eeprom_cc & BIT(7)) << 14));
3478 			rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(10),
3479 				      ((rtlefuse->eeprom_cc & BIT(4)) >> 4));
3480 			rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, BIT(10),
3481 				      ((rtlefuse->eeprom_cc & BIT(6)) >> 6));
3482 			rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER,
3483 				      BIT(31) | BIT(15),
3484 				      ((rtlefuse->eeprom_cc & BIT(4)) >> 4) |
3485 				      ((rtlefuse->eeprom_cc & BIT(6)) << 10));
3486 		}
3487 	}
3488 	/* update IQK related settings */
3489 	rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, MASKDWORD, 0x40000100);
3490 	rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, MASKDWORD, 0x40000100);
3491 	rtl_set_bbreg(hw, ROFDM0_XCTxAFE, 0xF0000000, 0x00);
3492 	rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(30) | BIT(28) |
3493 		      BIT(26) | BIT(24), 0x00);
3494 	rtl_set_bbreg(hw, ROFDM0_XDTxAFE, 0xF0000000, 0x00);
3495 	rtl_set_bbreg(hw, 0xca0, 0xF0000000, 0x00);
3496 	rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0x0000F000, 0x00);
3497 
3498 	/* Update RF */
3499 	for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
3500 	     rfpath++) {
3501 		if (rtlhal->current_bandtype == BAND_ON_2_4G) {
3502 			/* MOD_AG for RF path_A 0x18 BIT8,BIT16 */
3503 			rtl_set_rfreg(hw, rfpath, RF_CHNLBW, BIT(8) | BIT(16) |
3504 				      BIT(18), 0);
3505 			/* RF0x0b[16:14] =3b'111 */
3506 			rtl_set_rfreg(hw, (enum radio_path)rfpath, 0x0B,
3507 				      0x1c000, 0x07);
3508 		} else {
3509 			/* MOD_AG for RF path_A 0x18 BIT8,BIT16 */
3510 			rtl_set_rfreg(hw, rfpath, RF_CHNLBW, BIT(8) |
3511 				      BIT(16) | BIT(18),
3512 				      (BIT(16) | BIT(8)) >> 8);
3513 		}
3514 	}
3515 	/* Update for all band. */
3516 	/* DMDP */
3517 	if (rtlphy->rf_type == RF_1T1R) {
3518 		/* Use antenna 0,0xc04,0xd04 */
3519 		rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKBYTE0, 0x11);
3520 		rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE, BDWORD, 0x1);
3521 
3522 		/* enable ad/da clock1 for dual-phy reg0x888 */
3523 		if (rtlhal->interfaceindex == 0) {
3524 			rtl_set_bbreg(hw, RFPGA0_ADDALLOCKEN, BIT(12) |
3525 				      BIT(13), 0x3);
3526 		} else {
3527 			rtl92d_phy_enable_anotherphy(hw, false);
3528 			RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3529 				 "MAC1 use DBI to update 0x888\n");
3530 			/* 0x888 */
3531 			rtl92de_write_dword_dbi(hw, RFPGA0_ADDALLOCKEN,
3532 						rtl92de_read_dword_dbi(hw,
3533 						RFPGA0_ADDALLOCKEN,
3534 						BIT(3)) | BIT(12) | BIT(13),
3535 						BIT(3));
3536 			rtl92d_phy_powerdown_anotherphy(hw, false);
3537 		}
3538 	} else {
3539 		/* Single PHY */
3540 		/* Use antenna 0 & 1,0xc04,0xd04 */
3541 		rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKBYTE0, 0x33);
3542 		rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE, BDWORD, 0x3);
3543 		/* disable ad/da clock1,0x888 */
3544 		rtl_set_bbreg(hw, RFPGA0_ADDALLOCKEN, BIT(12) | BIT(13), 0);
3545 	}
3546 	for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
3547 	     rfpath++) {
3548 		rtlphy->rfreg_chnlval[rfpath] = rtl_get_rfreg(hw, rfpath,
3549 						RF_CHNLBW, RFREG_OFFSET_MASK);
3550 		rtlphy->reg_rf3c[rfpath] = rtl_get_rfreg(hw, rfpath, 0x3C,
3551 			RFREG_OFFSET_MASK);
3552 	}
3553 	for (i = 0; i < 2; i++)
3554 		RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "RF 0x18 = 0x%x\n",
3555 			 rtlphy->rfreg_chnlval[i]);
3556 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "<==\n");
3557 
3558 }
3559 
3560 bool rtl92d_phy_check_poweroff(struct ieee80211_hw *hw)
3561 {
3562 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3563 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3564 	u8 u1btmp;
3565 	unsigned long flags;
3566 
3567 	if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY) {
3568 		u1btmp = rtl_read_byte(rtlpriv, REG_MAC0);
3569 		rtl_write_byte(rtlpriv, REG_MAC0, u1btmp & (~MAC0_ON));
3570 		return true;
3571 	}
3572 	spin_lock_irqsave(&globalmutex_power, flags);
3573 	if (rtlhal->interfaceindex == 0) {
3574 		u1btmp = rtl_read_byte(rtlpriv, REG_MAC0);
3575 		rtl_write_byte(rtlpriv, REG_MAC0, u1btmp & (~MAC0_ON));
3576 		u1btmp = rtl_read_byte(rtlpriv, REG_MAC1);
3577 		u1btmp &= MAC1_ON;
3578 	} else {
3579 		u1btmp = rtl_read_byte(rtlpriv, REG_MAC1);
3580 		rtl_write_byte(rtlpriv, REG_MAC1, u1btmp & (~MAC1_ON));
3581 		u1btmp = rtl_read_byte(rtlpriv, REG_MAC0);
3582 		u1btmp &= MAC0_ON;
3583 	}
3584 	if (u1btmp) {
3585 		spin_unlock_irqrestore(&globalmutex_power, flags);
3586 		return false;
3587 	}
3588 	u1btmp = rtl_read_byte(rtlpriv, REG_POWER_OFF_IN_PROCESS);
3589 	u1btmp |= BIT(7);
3590 	rtl_write_byte(rtlpriv, REG_POWER_OFF_IN_PROCESS, u1btmp);
3591 	spin_unlock_irqrestore(&globalmutex_power, flags);
3592 	return true;
3593 }
3594