[go: nahoru, domu]

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
54static 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
58static 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
62static 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
66static 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
70static 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
78static 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
83static 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};
87static 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
95static 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
101static u32 rf_syn_g4_for_c_cut_2g = 0xD1C31 & 0x7FF;
102
103static 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] */
110static 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
131static u32 curveindex_5g[TARGET_CHNL_NUM_5G] = {0};
132
133static u32 curveindex_2g[TARGET_CHNL_NUM_2G] = {0};
134
135static 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 */
184static 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
189static 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
201u32 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
231void 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
267static 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
313static 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
331u32 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
352void 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
382bool 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
408static 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
535static 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 %ul Rtl819XPHY_REGArray[1] is %ul\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 %ul Rtl819XPHY_REGArray[1] is %ul\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 %ul Rtl819XPHY_REGArray[1] is %ul\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
635static 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
687static 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
712static 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
753bool 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
781bool rtl92d_phy_rf_config(struct ieee80211_hw *hw)
782{
783	return rtl92d_phy_rf6052_config(hw);
784}
785
786bool 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		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
840			 "switch case not processed\n");
841		break;
842	case RF90_PATH_D:
843		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
844			 "switch case not processed\n");
845		break;
846	}
847	return true;
848}
849
850void rtl92d_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
851{
852	struct rtl_priv *rtlpriv = rtl_priv(hw);
853	struct rtl_phy *rtlphy = &(rtlpriv->phy);
854
855	rtlphy->default_initialgain[0] =
856	    (u8) rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
857	rtlphy->default_initialgain[1] =
858	    (u8) rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0);
859	rtlphy->default_initialgain[2] =
860	    (u8) rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0);
861	rtlphy->default_initialgain[3] =
862	    (u8) rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0);
863	RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
864		 "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n",
865		 rtlphy->default_initialgain[0],
866		 rtlphy->default_initialgain[1],
867		 rtlphy->default_initialgain[2],
868		 rtlphy->default_initialgain[3]);
869	rtlphy->framesync = (u8)rtl_get_bbreg(hw, ROFDM0_RXDETECTOR3,
870					      MASKBYTE0);
871	rtlphy->framesync_c34 = rtl_get_bbreg(hw, ROFDM0_RXDETECTOR2,
872					      MASKDWORD);
873	RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
874		 "Default framesync (0x%x) = 0x%x\n",
875		 ROFDM0_RXDETECTOR3, rtlphy->framesync);
876}
877
878static void _rtl92d_get_txpower_index(struct ieee80211_hw *hw, u8 channel,
879	u8 *cckpowerlevel, u8 *ofdmpowerlevel)
880{
881	struct rtl_priv *rtlpriv = rtl_priv(hw);
882	struct rtl_phy *rtlphy = &(rtlpriv->phy);
883	struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
884	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
885	u8 index = (channel - 1);
886
887	/* 1. CCK */
888	if (rtlhal->current_bandtype == BAND_ON_2_4G) {
889		/* RF-A */
890		cckpowerlevel[RF90_PATH_A] =
891				 rtlefuse->txpwrlevel_cck[RF90_PATH_A][index];
892		/* RF-B */
893		cckpowerlevel[RF90_PATH_B] =
894				 rtlefuse->txpwrlevel_cck[RF90_PATH_B][index];
895	} else {
896		cckpowerlevel[RF90_PATH_A] = 0;
897		cckpowerlevel[RF90_PATH_B] = 0;
898	}
899	/* 2. OFDM for 1S or 2S */
900	if (rtlphy->rf_type == RF_1T2R || rtlphy->rf_type == RF_1T1R) {
901		/*  Read HT 40 OFDM TX power */
902		ofdmpowerlevel[RF90_PATH_A] =
903		    rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_A][index];
904		ofdmpowerlevel[RF90_PATH_B] =
905		    rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_B][index];
906	} else if (rtlphy->rf_type == RF_2T2R) {
907		/* Read HT 40 OFDM TX power */
908		ofdmpowerlevel[RF90_PATH_A] =
909		    rtlefuse->txpwrlevel_ht40_2s[RF90_PATH_A][index];
910		ofdmpowerlevel[RF90_PATH_B] =
911		    rtlefuse->txpwrlevel_ht40_2s[RF90_PATH_B][index];
912	}
913}
914
915static void _rtl92d_ccxpower_index_check(struct ieee80211_hw *hw,
916	u8 channel, u8 *cckpowerlevel, u8 *ofdmpowerlevel)
917{
918	struct rtl_priv *rtlpriv = rtl_priv(hw);
919	struct rtl_phy *rtlphy = &(rtlpriv->phy);
920
921	rtlphy->cur_cck_txpwridx = cckpowerlevel[0];
922	rtlphy->cur_ofdm24g_txpwridx = ofdmpowerlevel[0];
923}
924
925static u8 _rtl92c_phy_get_rightchnlplace(u8 chnl)
926{
927	u8 channel_5g[59] = {
928		1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
929		36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
930		60, 62, 64, 100, 102, 104, 106, 108, 110, 112,
931		114, 116, 118, 120, 122, 124, 126, 128,
932		130, 132, 134, 136, 138, 140, 149, 151,
933		153, 155, 157, 159, 161, 163, 165
934	};
935	u8 place = chnl;
936
937	if (chnl > 14) {
938		for (place = 14; place < sizeof(channel_5g); place++) {
939			if (channel_5g[place] == chnl) {
940				place++;
941				break;
942			}
943		}
944	}
945	return place;
946}
947
948void rtl92d_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
949{
950	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
951	struct rtl_priv *rtlpriv = rtl_priv(hw);
952	u8 cckpowerlevel[2], ofdmpowerlevel[2];
953
954	if (!rtlefuse->txpwr_fromeprom)
955		return;
956	channel = _rtl92c_phy_get_rightchnlplace(channel);
957	_rtl92d_get_txpower_index(hw, channel, &cckpowerlevel[0],
958		&ofdmpowerlevel[0]);
959	if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G)
960		_rtl92d_ccxpower_index_check(hw, channel, &cckpowerlevel[0],
961				&ofdmpowerlevel[0]);
962	if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G)
963		rtl92d_phy_rf6052_set_cck_txpower(hw, &cckpowerlevel[0]);
964	rtl92d_phy_rf6052_set_ofdm_txpower(hw, &ofdmpowerlevel[0], channel);
965}
966
967void rtl92d_phy_set_bw_mode(struct ieee80211_hw *hw,
968			    enum nl80211_channel_type ch_type)
969{
970	struct rtl_priv *rtlpriv = rtl_priv(hw);
971	struct rtl_phy *rtlphy = &(rtlpriv->phy);
972	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
973	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
974	unsigned long flag = 0;
975	u8 reg_prsr_rsc;
976	u8 reg_bw_opmode;
977
978	if (rtlphy->set_bwmode_inprogress)
979		return;
980	if ((is_hal_stop(rtlhal)) || (RT_CANNOT_IO(hw))) {
981		RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
982			 "FALSE driver sleep or unload\n");
983		return;
984	}
985	rtlphy->set_bwmode_inprogress = true;
986	RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "Switch to %s bandwidth\n",
987		 rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
988		 "20MHz" : "40MHz");
989	reg_bw_opmode = rtl_read_byte(rtlpriv, REG_BWOPMODE);
990	reg_prsr_rsc = rtl_read_byte(rtlpriv, REG_RRSR + 2);
991	switch (rtlphy->current_chan_bw) {
992	case HT_CHANNEL_WIDTH_20:
993		reg_bw_opmode |= BW_OPMODE_20MHZ;
994		rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
995		break;
996	case HT_CHANNEL_WIDTH_20_40:
997		reg_bw_opmode &= ~BW_OPMODE_20MHZ;
998		rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
999
1000		reg_prsr_rsc = (reg_prsr_rsc & 0x90) |
1001			(mac->cur_40_prime_sc << 5);
1002		rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_prsr_rsc);
1003		break;
1004	default:
1005		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1006			 "unknown bandwidth: %#X\n", rtlphy->current_chan_bw);
1007		break;
1008	}
1009	switch (rtlphy->current_chan_bw) {
1010	case HT_CHANNEL_WIDTH_20:
1011		rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x0);
1012		rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x0);
1013		/* SET BIT10 BIT11  for receive cck */
1014		rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10) |
1015			      BIT(11), 3);
1016		break;
1017	case HT_CHANNEL_WIDTH_20_40:
1018		rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x1);
1019		rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x1);
1020		/* Set Control channel to upper or lower.
1021		 * These settings are required only for 40MHz */
1022		if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1023			rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag);
1024			rtl_set_bbreg(hw, RCCK0_SYSTEM, BCCKSIDEBAND,
1025				(mac->cur_40_prime_sc >> 1));
1026			rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
1027		}
1028		rtl_set_bbreg(hw, ROFDM1_LSTF, 0xC00, mac->cur_40_prime_sc);
1029		/* SET BIT10 BIT11  for receive cck */
1030		rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10) |
1031			      BIT(11), 0);
1032		rtl_set_bbreg(hw, 0x818, (BIT(26) | BIT(27)),
1033			(mac->cur_40_prime_sc ==
1034			HAL_PRIME_CHNL_OFFSET_LOWER) ? 2 : 1);
1035		break;
1036	default:
1037		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1038			 "unknown bandwidth: %#X\n", rtlphy->current_chan_bw);
1039		break;
1040
1041	}
1042	rtl92d_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
1043	rtlphy->set_bwmode_inprogress = false;
1044	RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "<==\n");
1045}
1046
1047static void _rtl92d_phy_stop_trx_before_changeband(struct ieee80211_hw *hw)
1048{
1049	rtl_set_bbreg(hw, RFPGA0_RFMOD, BCCKEN, 0);
1050	rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 0);
1051	rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKBYTE0, 0x00);
1052	rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE, BDWORD, 0x0);
1053}
1054
1055static void rtl92d_phy_switch_wirelessband(struct ieee80211_hw *hw, u8 band)
1056{
1057	struct rtl_priv *rtlpriv = rtl_priv(hw);
1058	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1059	u8 value8;
1060
1061	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "==>\n");
1062	rtlhal->bandset = band;
1063	rtlhal->current_bandtype = band;
1064	if (IS_92D_SINGLEPHY(rtlhal->version))
1065		rtlhal->bandset = BAND_ON_BOTH;
1066	/* stop RX/Tx */
1067	_rtl92d_phy_stop_trx_before_changeband(hw);
1068	/* reconfig BB/RF according to wireless mode */
1069	if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1070		/* BB & RF Config */
1071		RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG, "====>2.4G\n");
1072		if (rtlhal->interfaceindex == 1)
1073			_rtl92d_phy_config_bb_with_headerfile(hw,
1074				BASEBAND_CONFIG_AGC_TAB);
1075	} else {
1076		/* 5G band */
1077		RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG, "====>5G\n");
1078		if (rtlhal->interfaceindex == 1)
1079			_rtl92d_phy_config_bb_with_headerfile(hw,
1080				BASEBAND_CONFIG_AGC_TAB);
1081	}
1082	rtl92d_update_bbrf_configuration(hw);
1083	if (rtlhal->current_bandtype == BAND_ON_2_4G)
1084		rtl_set_bbreg(hw, RFPGA0_RFMOD, BCCKEN, 0x1);
1085	rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 0x1);
1086
1087	/* 20M BW. */
1088	/* rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 1); */
1089	rtlhal->reloadtxpowerindex = true;
1090	/* notice fw know band status  0x81[1]/0x53[1] = 0: 5G, 1: 2G */
1091	if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1092		value8 = rtl_read_byte(rtlpriv,	(rtlhal->interfaceindex ==
1093			0 ? REG_MAC0 : REG_MAC1));
1094		value8 |= BIT(1);
1095		rtl_write_byte(rtlpriv, (rtlhal->interfaceindex ==
1096			0 ? REG_MAC0 : REG_MAC1), value8);
1097	} else {
1098		value8 = rtl_read_byte(rtlpriv, (rtlhal->interfaceindex ==
1099			0 ? REG_MAC0 : REG_MAC1));
1100		value8 &= (~BIT(1));
1101		rtl_write_byte(rtlpriv, (rtlhal->interfaceindex ==
1102			0 ? REG_MAC0 : REG_MAC1), value8);
1103	}
1104	mdelay(1);
1105	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "<==Switch Band OK\n");
1106}
1107
1108static void _rtl92d_phy_reload_imr_setting(struct ieee80211_hw *hw,
1109	u8 channel, u8 rfpath)
1110{
1111	struct rtl_priv *rtlpriv = rtl_priv(hw);
1112	u32 imr_num = MAX_RF_IMR_INDEX;
1113	u32 rfmask = RFREG_OFFSET_MASK;
1114	u8 group, i;
1115	unsigned long flag = 0;
1116
1117	RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>path %d\n", rfpath);
1118	if (rtlpriv->rtlhal.current_bandtype == BAND_ON_5G) {
1119		RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>5G\n");
1120		rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(25) | BIT(24), 0);
1121		rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0x00f00000, 0xf);
1122		/* fc area 0xd2c */
1123		if (channel > 99)
1124			rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(13) |
1125				      BIT(14), 2);
1126		else
1127			rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(13) |
1128				      BIT(14), 1);
1129		/* leave 0 for channel1-14. */
1130		group = channel <= 64 ? 1 : 2;
1131		imr_num = MAX_RF_IMR_INDEX_NORMAL;
1132		for (i = 0; i < imr_num; i++)
1133			rtl_set_rfreg(hw, (enum radio_path)rfpath,
1134				      rf_reg_for_5g_swchnl_normal[i], rfmask,
1135				      rf_imr_param_normal[0][group][i]);
1136		rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0x00f00000, 0);
1137		rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 1);
1138	} else {
1139		/* G band. */
1140		RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
1141			 "Load RF IMR parameters for G band. IMR already setting %d\n",
1142			 rtlpriv->rtlhal.load_imrandiqk_setting_for2g);
1143		RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>2.4G\n");
1144		if (!rtlpriv->rtlhal.load_imrandiqk_setting_for2g) {
1145			RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
1146				 "Load RF IMR parameters for G band. %d\n",
1147				 rfpath);
1148			rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag);
1149			rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(25) | BIT(24), 0);
1150			rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4,
1151				      0x00f00000, 0xf);
1152			imr_num = MAX_RF_IMR_INDEX_NORMAL;
1153			for (i = 0; i < imr_num; i++) {
1154				rtl_set_rfreg(hw, (enum radio_path)rfpath,
1155					      rf_reg_for_5g_swchnl_normal[i],
1156					      RFREG_OFFSET_MASK,
1157					      rf_imr_param_normal[0][0][i]);
1158			}
1159			rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4,
1160				      0x00f00000, 0);
1161			rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN | BCCKEN, 3);
1162			rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
1163		}
1164	}
1165	RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
1166}
1167
1168static void _rtl92d_phy_enable_rf_env(struct ieee80211_hw *hw,
1169	u8 rfpath, u32 *pu4_regval)
1170{
1171	struct rtl_priv *rtlpriv = rtl_priv(hw);
1172	struct rtl_phy *rtlphy = &(rtlpriv->phy);
1173	struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
1174
1175	RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "====>\n");
1176	/*----Store original RFENV control type----*/
1177	switch (rfpath) {
1178	case RF90_PATH_A:
1179	case RF90_PATH_C:
1180		*pu4_regval = rtl_get_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV);
1181		break;
1182	case RF90_PATH_B:
1183	case RF90_PATH_D:
1184		*pu4_regval =
1185		    rtl_get_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV << 16);
1186		break;
1187	}
1188	/*----Set RF_ENV enable----*/
1189	rtl_set_bbreg(hw, pphyreg->rfintfe, BRFSI_RFENV << 16, 0x1);
1190	udelay(1);
1191	/*----Set RF_ENV output high----*/
1192	rtl_set_bbreg(hw, pphyreg->rfintfo, BRFSI_RFENV, 0x1);
1193	udelay(1);
1194	/* Set bit number of Address and Data for RF register */
1195	/* Set 1 to 4 bits for 8255 */
1196	rtl_set_bbreg(hw, pphyreg->rfhssi_para2, B3WIREADDRESSLENGTH, 0x0);
1197	udelay(1);
1198	/*Set 0 to 12 bits for 8255 */
1199	rtl_set_bbreg(hw, pphyreg->rfhssi_para2, B3WIREDATALENGTH, 0x0);
1200	udelay(1);
1201	RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "<====\n");
1202}
1203
1204static void _rtl92d_phy_restore_rf_env(struct ieee80211_hw *hw, u8 rfpath,
1205				       u32 *pu4_regval)
1206{
1207	struct rtl_priv *rtlpriv = rtl_priv(hw);
1208	struct rtl_phy *rtlphy = &(rtlpriv->phy);
1209	struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
1210
1211	RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "=====>\n");
1212	/*----Restore RFENV control type----*/
1213	switch (rfpath) {
1214	case RF90_PATH_A:
1215	case RF90_PATH_C:
1216		rtl_set_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV, *pu4_regval);
1217		break;
1218	case RF90_PATH_B:
1219	case RF90_PATH_D:
1220		rtl_set_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV << 16,
1221			      *pu4_regval);
1222		break;
1223	}
1224	RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "<=====\n");
1225}
1226
1227static void _rtl92d_phy_switch_rf_setting(struct ieee80211_hw *hw, u8 channel)
1228{
1229	struct rtl_priv *rtlpriv = rtl_priv(hw);
1230	struct rtl_phy *rtlphy = &(rtlpriv->phy);
1231	struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
1232	u8 path = rtlhal->current_bandtype ==
1233	    BAND_ON_5G ? RF90_PATH_A : RF90_PATH_B;
1234	u8 index = 0, i = 0, rfpath = RF90_PATH_A;
1235	bool need_pwr_down = false, internal_pa = false;
1236	u32 u4regvalue, mask = 0x1C000, value = 0, u4tmp, u4tmp2;
1237
1238	RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>\n");
1239	/* config path A for 5G */
1240	if (rtlhal->current_bandtype == BAND_ON_5G) {
1241		RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>5G\n");
1242		u4tmp = curveindex_5g[channel - 1];
1243		RTPRINT(rtlpriv, FINIT, INIT_IQK,
1244			"ver 1 set RF-A, 5G, 0x28 = 0x%x !!\n", u4tmp);
1245		for (i = 0; i < RF_CHNL_NUM_5G; i++) {
1246			if (channel == rf_chnl_5g[i] && channel <= 140)
1247				index = 0;
1248		}
1249		for (i = 0; i < RF_CHNL_NUM_5G_40M; i++) {
1250			if (channel == rf_chnl_5g_40m[i] && channel <= 140)
1251				index = 1;
1252		}
1253		if (channel == 149 || channel == 155 || channel == 161)
1254			index = 2;
1255		else if (channel == 151 || channel == 153 || channel == 163
1256			 || channel == 165)
1257			index = 3;
1258		else if (channel == 157 || channel == 159)
1259			index = 4;
1260
1261		if (rtlhal->macphymode == DUALMAC_DUALPHY
1262		    && rtlhal->interfaceindex == 1) {
1263			need_pwr_down = rtl92d_phy_enable_anotherphy(hw, false);
1264			rtlhal->during_mac1init_radioa = true;
1265			/* asume no this case */
1266			if (need_pwr_down)
1267				_rtl92d_phy_enable_rf_env(hw, path,
1268							  &u4regvalue);
1269		}
1270		for (i = 0; i < RF_REG_NUM_FOR_C_CUT_5G; i++) {
1271			if (i == 0 && (rtlhal->macphymode == DUALMAC_DUALPHY)) {
1272				rtl_set_rfreg(hw, (enum radio_path)path,
1273					      rf_reg_for_c_cut_5g[i],
1274					      RFREG_OFFSET_MASK, 0xE439D);
1275			} else if (rf_reg_for_c_cut_5g[i] == RF_SYN_G4) {
1276				u4tmp2 = (rf_reg_pram_c_5g[index][i] &
1277				     0x7FF) | (u4tmp << 11);
1278				if (channel == 36)
1279					u4tmp2 &= ~(BIT(7) | BIT(6));
1280				rtl_set_rfreg(hw, (enum radio_path)path,
1281					      rf_reg_for_c_cut_5g[i],
1282					      RFREG_OFFSET_MASK, u4tmp2);
1283			} else {
1284				rtl_set_rfreg(hw, (enum radio_path)path,
1285					      rf_reg_for_c_cut_5g[i],
1286					      RFREG_OFFSET_MASK,
1287					      rf_reg_pram_c_5g[index][i]);
1288			}
1289			RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
1290				 "offset 0x%x value 0x%x path %d index %d readback 0x%x\n",
1291				 rf_reg_for_c_cut_5g[i],
1292				 rf_reg_pram_c_5g[index][i],
1293				 path, index,
1294				 rtl_get_rfreg(hw, (enum radio_path)path,
1295					       rf_reg_for_c_cut_5g[i],
1296					       RFREG_OFFSET_MASK));
1297		}
1298		if (need_pwr_down)
1299			_rtl92d_phy_restore_rf_env(hw, path, &u4regvalue);
1300		if (rtlhal->during_mac1init_radioa)
1301			rtl92d_phy_powerdown_anotherphy(hw, false);
1302		if (channel < 149)
1303			value = 0x07;
1304		else if (channel >= 149)
1305			value = 0x02;
1306		if (channel >= 36 && channel <= 64)
1307			index = 0;
1308		else if (channel >= 100 && channel <= 140)
1309			index = 1;
1310		else
1311			index = 2;
1312		for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
1313			rfpath++) {
1314			if (rtlhal->macphymode == DUALMAC_DUALPHY &&
1315				rtlhal->interfaceindex == 1)	/* MAC 1 5G */
1316				internal_pa = rtlpriv->efuse.internal_pa_5g[1];
1317			else
1318				internal_pa =
1319					 rtlpriv->efuse.internal_pa_5g[rfpath];
1320			if (internal_pa) {
1321				for (i = 0;
1322				     i < RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA;
1323				     i++) {
1324					rtl_set_rfreg(hw, rfpath,
1325						rf_for_c_cut_5g_internal_pa[i],
1326						RFREG_OFFSET_MASK,
1327						rf_pram_c_5g_int_pa[index][i]);
1328					RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
1329						 "offset 0x%x value 0x%x path %d index %d\n",
1330						 rf_for_c_cut_5g_internal_pa[i],
1331						 rf_pram_c_5g_int_pa[index][i],
1332						 rfpath, index);
1333				}
1334			} else {
1335				rtl_set_rfreg(hw, (enum radio_path)rfpath, 0x0B,
1336					      mask, value);
1337			}
1338		}
1339	} else if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1340		RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>2.4G\n");
1341		u4tmp = curveindex_2g[channel - 1];
1342		RTPRINT(rtlpriv, FINIT, INIT_IQK,
1343			"ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n", u4tmp);
1344		if (channel == 1 || channel == 2 || channel == 4 || channel == 9
1345		    || channel == 10 || channel == 11 || channel == 12)
1346			index = 0;
1347		else if (channel == 3 || channel == 13 || channel == 14)
1348			index = 1;
1349		else if (channel >= 5 && channel <= 8)
1350			index = 2;
1351		if (rtlhal->macphymode == DUALMAC_DUALPHY) {
1352			path = RF90_PATH_A;
1353			if (rtlhal->interfaceindex == 0) {
1354				need_pwr_down =
1355					 rtl92d_phy_enable_anotherphy(hw, true);
1356				rtlhal->during_mac0init_radiob = true;
1357
1358				if (need_pwr_down)
1359					_rtl92d_phy_enable_rf_env(hw, path,
1360								  &u4regvalue);
1361			}
1362		}
1363		for (i = 0; i < RF_REG_NUM_FOR_C_CUT_2G; i++) {
1364			if (rf_reg_for_c_cut_2g[i] == RF_SYN_G7)
1365				rtl_set_rfreg(hw, (enum radio_path)path,
1366					rf_reg_for_c_cut_2g[i],
1367					RFREG_OFFSET_MASK,
1368					(rf_reg_param_for_c_cut_2g[index][i] |
1369					BIT(17)));
1370			else
1371				rtl_set_rfreg(hw, (enum radio_path)path,
1372					      rf_reg_for_c_cut_2g[i],
1373					      RFREG_OFFSET_MASK,
1374					      rf_reg_param_for_c_cut_2g
1375					      [index][i]);
1376			RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
1377				 "offset 0x%x value 0x%x mak 0x%x path %d index %d readback 0x%x\n",
1378				 rf_reg_for_c_cut_2g[i],
1379				 rf_reg_param_for_c_cut_2g[index][i],
1380				 rf_reg_mask_for_c_cut_2g[i], path, index,
1381				 rtl_get_rfreg(hw, (enum radio_path)path,
1382					       rf_reg_for_c_cut_2g[i],
1383					       RFREG_OFFSET_MASK));
1384		}
1385		RTPRINT(rtlpriv, FINIT, INIT_IQK,
1386			"cosa ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n",
1387			rf_syn_g4_for_c_cut_2g | (u4tmp << 11));
1388
1389		rtl_set_rfreg(hw, (enum radio_path)path, RF_SYN_G4,
1390			      RFREG_OFFSET_MASK,
1391			      rf_syn_g4_for_c_cut_2g | (u4tmp << 11));
1392		if (need_pwr_down)
1393			_rtl92d_phy_restore_rf_env(hw, path, &u4regvalue);
1394		if (rtlhal->during_mac0init_radiob)
1395			rtl92d_phy_powerdown_anotherphy(hw, true);
1396	}
1397	RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
1398}
1399
1400u8 rtl92d_get_rightchnlplace_for_iqk(u8 chnl)
1401{
1402	u8 channel_all[59] = {
1403		1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
1404		36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
1405		60, 62, 64, 100, 102, 104, 106, 108, 110, 112,
1406		114, 116, 118, 120, 122, 124, 126, 128,	130,
1407		132, 134, 136, 138, 140, 149, 151, 153, 155,
1408		157, 159, 161, 163, 165
1409	};
1410	u8 place = chnl;
1411
1412	if (chnl > 14) {
1413		for (place = 14; place < sizeof(channel_all); place++) {
1414			if (channel_all[place] == chnl)
1415				return place - 13;
1416		}
1417	}
1418
1419	return 0;
1420}
1421
1422#define MAX_TOLERANCE		5
1423#define IQK_DELAY_TIME		1	/* ms */
1424#define MAX_TOLERANCE_92D	3
1425
1426/* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
1427static u8 _rtl92d_phy_patha_iqk(struct ieee80211_hw *hw, bool configpathb)
1428{
1429	struct rtl_priv *rtlpriv = rtl_priv(hw);
1430	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1431	u32 regeac, rege94, rege9c, regea4;
1432	u8 result = 0;
1433
1434	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path A IQK!\n");
1435	/* path-A IQK setting */
1436	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path-A IQK setting!\n");
1437	if (rtlhal->interfaceindex == 0) {
1438		rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x10008c1f);
1439		rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x10008c1f);
1440	} else {
1441		rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x10008c22);
1442		rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x10008c22);
1443	}
1444	rtl_set_bbreg(hw, 0xe38, MASKDWORD, 0x82140102);
1445	rtl_set_bbreg(hw, 0xe3c, MASKDWORD, 0x28160206);
1446	/* path-B IQK setting */
1447	if (configpathb) {
1448		rtl_set_bbreg(hw, 0xe50, MASKDWORD, 0x10008c22);
1449		rtl_set_bbreg(hw, 0xe54, MASKDWORD, 0x10008c22);
1450		rtl_set_bbreg(hw, 0xe58, MASKDWORD, 0x82140102);
1451		rtl_set_bbreg(hw, 0xe5c, MASKDWORD, 0x28160206);
1452	}
1453	/* LO calibration setting */
1454	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "LO calibration setting!\n");
1455	rtl_set_bbreg(hw, 0xe4c, MASKDWORD, 0x00462911);
1456	/* One shot, path A LOK & IQK */
1457	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "One shot, path A LOK & IQK!\n");
1458	rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf9000000);
1459	rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf8000000);
1460	/* delay x ms */
1461	RTPRINT(rtlpriv, FINIT, INIT_IQK,
1462		"Delay %d ms for One shot, path A LOK & IQK\n",
1463		IQK_DELAY_TIME);
1464	mdelay(IQK_DELAY_TIME);
1465	/* Check failed */
1466	regeac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1467	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xeac = 0x%x\n", regeac);
1468	rege94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD);
1469	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xe94 = 0x%x\n", rege94);
1470	rege9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD);
1471	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xe9c = 0x%x\n", rege9c);
1472	regea4 = rtl_get_bbreg(hw, 0xea4, MASKDWORD);
1473	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xea4 = 0x%x\n", regea4);
1474	if (!(regeac & BIT(28)) && (((rege94 & 0x03FF0000) >> 16) != 0x142) &&
1475	    (((rege9c & 0x03FF0000) >> 16) != 0x42))
1476		result |= 0x01;
1477	else			/* if Tx not OK, ignore Rx */
1478		return result;
1479	/* if Tx is OK, check whether Rx is OK */
1480	if (!(regeac & BIT(27)) && (((regea4 & 0x03FF0000) >> 16) != 0x132) &&
1481	    (((regeac & 0x03FF0000) >> 16) != 0x36))
1482		result |= 0x02;
1483	else
1484		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path A Rx IQK fail!!\n");
1485	return result;
1486}
1487
1488/* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
1489static u8 _rtl92d_phy_patha_iqk_5g_normal(struct ieee80211_hw *hw,
1490					  bool configpathb)
1491{
1492	struct rtl_priv *rtlpriv = rtl_priv(hw);
1493	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1494	struct rtl_phy *rtlphy = &(rtlpriv->phy);
1495	u32 regeac, rege94, rege9c, regea4;
1496	u8 result = 0;
1497	u8 i;
1498	u8 retrycount = 2;
1499	u32 TxOKBit = BIT(28), RxOKBit = BIT(27);
1500
1501	if (rtlhal->interfaceindex == 1) {	/* PHY1 */
1502		TxOKBit = BIT(31);
1503		RxOKBit = BIT(30);
1504	}
1505	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path A IQK!\n");
1506	/* path-A IQK setting */
1507	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path-A IQK setting!\n");
1508	rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x18008c1f);
1509	rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x18008c1f);
1510	rtl_set_bbreg(hw, 0xe38, MASKDWORD, 0x82140307);
1511	rtl_set_bbreg(hw, 0xe3c, MASKDWORD, 0x68160960);
1512	/* path-B IQK setting */
1513	if (configpathb) {
1514		rtl_set_bbreg(hw, 0xe50, MASKDWORD, 0x18008c2f);
1515		rtl_set_bbreg(hw, 0xe54, MASKDWORD, 0x18008c2f);
1516		rtl_set_bbreg(hw, 0xe58, MASKDWORD, 0x82110000);
1517		rtl_set_bbreg(hw, 0xe5c, MASKDWORD, 0x68110000);
1518	}
1519	/* LO calibration setting */
1520	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "LO calibration setting!\n");
1521	rtl_set_bbreg(hw, 0xe4c, MASKDWORD, 0x00462911);
1522	/* path-A PA on */
1523	rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, MASKDWORD, 0x07000f60);
1524	rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, MASKDWORD, 0x66e60e30);
1525	for (i = 0; i < retrycount; i++) {
1526		/* One shot, path A LOK & IQK */
1527		RTPRINT(rtlpriv, FINIT, INIT_IQK,
1528			"One shot, path A LOK & IQK!\n");
1529		rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf9000000);
1530		rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf8000000);
1531		/* delay x ms */
1532		RTPRINT(rtlpriv, FINIT, INIT_IQK,
1533			"Delay %d ms for One shot, path A LOK & IQK.\n",
1534			IQK_DELAY_TIME);
1535		mdelay(IQK_DELAY_TIME * 10);
1536		/* Check failed */
1537		regeac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1538		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xeac = 0x%x\n", regeac);
1539		rege94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD);
1540		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xe94 = 0x%x\n", rege94);
1541		rege9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD);
1542		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xe9c = 0x%x\n", rege9c);
1543		regea4 = rtl_get_bbreg(hw, 0xea4, MASKDWORD);
1544		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xea4 = 0x%x\n", regea4);
1545		if (!(regeac & TxOKBit) &&
1546		     (((rege94 & 0x03FF0000) >> 16) != 0x142)) {
1547			result |= 0x01;
1548		} else { /* if Tx not OK, ignore Rx */
1549			RTPRINT(rtlpriv, FINIT, INIT_IQK,
1550				"Path A Tx IQK fail!!\n");
1551			continue;
1552		}
1553
1554		/* if Tx is OK, check whether Rx is OK */
1555		if (!(regeac & RxOKBit) &&
1556		    (((regea4 & 0x03FF0000) >> 16) != 0x132)) {
1557			result |= 0x02;
1558			break;
1559		} else {
1560			RTPRINT(rtlpriv, FINIT, INIT_IQK,
1561				"Path A Rx IQK fail!!\n");
1562		}
1563	}
1564	/* path A PA off */
1565	rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, MASKDWORD,
1566		      rtlphy->iqk_bb_backup[0]);
1567	rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, MASKDWORD,
1568		      rtlphy->iqk_bb_backup[1]);
1569	return result;
1570}
1571
1572/* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
1573static u8 _rtl92d_phy_pathb_iqk(struct ieee80211_hw *hw)
1574{
1575	struct rtl_priv *rtlpriv = rtl_priv(hw);
1576	u32 regeac, regeb4, regebc, regec4, regecc;
1577	u8 result = 0;
1578
1579	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path B IQK!\n");
1580	/* One shot, path B LOK & IQK */
1581	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "One shot, path A LOK & IQK!\n");
1582	rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0x00000002);
1583	rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0x00000000);
1584	/* delay x ms  */
1585	RTPRINT(rtlpriv, FINIT, INIT_IQK,
1586		"Delay %d ms for One shot, path B LOK & IQK\n", IQK_DELAY_TIME);
1587	mdelay(IQK_DELAY_TIME);
1588	/* Check failed */
1589	regeac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1590	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xeac = 0x%x\n", regeac);
1591	regeb4 = rtl_get_bbreg(hw, 0xeb4, MASKDWORD);
1592	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xeb4 = 0x%x\n", regeb4);
1593	regebc = rtl_get_bbreg(hw, 0xebc, MASKDWORD);
1594	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xebc = 0x%x\n", regebc);
1595	regec4 = rtl_get_bbreg(hw, 0xec4, MASKDWORD);
1596	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xec4 = 0x%x\n", regec4);
1597	regecc = rtl_get_bbreg(hw, 0xecc, MASKDWORD);
1598	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xecc = 0x%x\n", regecc);
1599	if (!(regeac & BIT(31)) && (((regeb4 & 0x03FF0000) >> 16) != 0x142) &&
1600	    (((regebc & 0x03FF0000) >> 16) != 0x42))
1601		result |= 0x01;
1602	else
1603		return result;
1604	if (!(regeac & BIT(30)) && (((regec4 & 0x03FF0000) >> 16) != 0x132) &&
1605	    (((regecc & 0x03FF0000) >> 16) != 0x36))
1606		result |= 0x02;
1607	else
1608		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path B Rx IQK fail!!\n");
1609	return result;
1610}
1611
1612/* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
1613static u8 _rtl92d_phy_pathb_iqk_5g_normal(struct ieee80211_hw *hw)
1614{
1615	struct rtl_priv *rtlpriv = rtl_priv(hw);
1616	struct rtl_phy *rtlphy = &(rtlpriv->phy);
1617	u32 regeac, regeb4, regebc, regec4, regecc;
1618	u8 result = 0;
1619	u8 i;
1620	u8 retrycount = 2;
1621
1622	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path B IQK!\n");
1623	/* path-A IQK setting */
1624	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path-A IQK setting!\n");
1625	rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x18008c1f);
1626	rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x18008c1f);
1627	rtl_set_bbreg(hw, 0xe38, MASKDWORD, 0x82110000);
1628	rtl_set_bbreg(hw, 0xe3c, MASKDWORD, 0x68110000);
1629
1630	/* path-B IQK setting */
1631	rtl_set_bbreg(hw, 0xe50, MASKDWORD, 0x18008c2f);
1632	rtl_set_bbreg(hw, 0xe54, MASKDWORD, 0x18008c2f);
1633	rtl_set_bbreg(hw, 0xe58, MASKDWORD, 0x82140307);
1634	rtl_set_bbreg(hw, 0xe5c, MASKDWORD, 0x68160960);
1635
1636	/* LO calibration setting */
1637	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "LO calibration setting!\n");
1638	rtl_set_bbreg(hw, 0xe4c, MASKDWORD, 0x00462911);
1639
1640	/* path-B PA on */
1641	rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, MASKDWORD, 0x0f600700);
1642	rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, MASKDWORD, 0x061f0d30);
1643
1644	for (i = 0; i < retrycount; i++) {
1645		/* One shot, path B LOK & IQK */
1646		RTPRINT(rtlpriv, FINIT, INIT_IQK,
1647			"One shot, path A LOK & IQK!\n");
1648		rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xfa000000);
1649		rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf8000000);
1650
1651		/* delay x ms */
1652		RTPRINT(rtlpriv, FINIT, INIT_IQK,
1653			"Delay %d ms for One shot, path B LOK & IQK.\n", 10);
1654		mdelay(IQK_DELAY_TIME * 10);
1655
1656		/* Check failed */
1657		regeac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1658		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xeac = 0x%x\n", regeac);
1659		regeb4 = rtl_get_bbreg(hw, 0xeb4, MASKDWORD);
1660		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xeb4 = 0x%x\n", regeb4);
1661		regebc = rtl_get_bbreg(hw, 0xebc, MASKDWORD);
1662		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xebc = 0x%x\n", regebc);
1663		regec4 = rtl_get_bbreg(hw, 0xec4, MASKDWORD);
1664		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xec4 = 0x%x\n", regec4);
1665		regecc = rtl_get_bbreg(hw, 0xecc, MASKDWORD);
1666		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xecc = 0x%x\n", regecc);
1667		if (!(regeac & BIT(31)) &&
1668		    (((regeb4 & 0x03FF0000) >> 16) != 0x142))
1669			result |= 0x01;
1670		else
1671			continue;
1672		if (!(regeac & BIT(30)) &&
1673		    (((regec4 & 0x03FF0000) >> 16) != 0x132)) {
1674			result |= 0x02;
1675			break;
1676		} else {
1677			RTPRINT(rtlpriv, FINIT, INIT_IQK,
1678				"Path B Rx IQK fail!!\n");
1679		}
1680	}
1681
1682	/* path B PA off */
1683	rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, MASKDWORD,
1684		      rtlphy->iqk_bb_backup[0]);
1685	rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, MASKDWORD,
1686		      rtlphy->iqk_bb_backup[2]);
1687	return result;
1688}
1689
1690static void _rtl92d_phy_save_adda_registers(struct ieee80211_hw *hw,
1691					    u32 *adda_reg, u32 *adda_backup,
1692					    u32 regnum)
1693{
1694	struct rtl_priv *rtlpriv = rtl_priv(hw);
1695	u32 i;
1696
1697	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Save ADDA parameters.\n");
1698	for (i = 0; i < regnum; i++)
1699		adda_backup[i] = rtl_get_bbreg(hw, adda_reg[i], MASKDWORD);
1700}
1701
1702static void _rtl92d_phy_save_mac_registers(struct ieee80211_hw *hw,
1703	u32 *macreg, u32 *macbackup)
1704{
1705	struct rtl_priv *rtlpriv = rtl_priv(hw);
1706	u32 i;
1707
1708	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Save MAC parameters.\n");
1709	for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
1710		macbackup[i] = rtl_read_byte(rtlpriv, macreg[i]);
1711	macbackup[i] = rtl_read_dword(rtlpriv, macreg[i]);
1712}
1713
1714static void _rtl92d_phy_reload_adda_registers(struct ieee80211_hw *hw,
1715					      u32 *adda_reg, u32 *adda_backup,
1716					      u32 regnum)
1717{
1718	struct rtl_priv *rtlpriv = rtl_priv(hw);
1719	u32 i;
1720
1721	RTPRINT(rtlpriv, FINIT, INIT_IQK,
1722		"Reload ADDA power saving parameters !\n");
1723	for (i = 0; i < regnum; i++)
1724		rtl_set_bbreg(hw, adda_reg[i], MASKDWORD, adda_backup[i]);
1725}
1726
1727static void _rtl92d_phy_reload_mac_registers(struct ieee80211_hw *hw,
1728					     u32 *macreg, u32 *macbackup)
1729{
1730	struct rtl_priv *rtlpriv = rtl_priv(hw);
1731	u32 i;
1732
1733	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Reload MAC parameters !\n");
1734	for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
1735		rtl_write_byte(rtlpriv, macreg[i], (u8) macbackup[i]);
1736	rtl_write_byte(rtlpriv, macreg[i], macbackup[i]);
1737}
1738
1739static void _rtl92d_phy_path_adda_on(struct ieee80211_hw *hw,
1740		u32 *adda_reg, bool patha_on, bool is2t)
1741{
1742	struct rtl_priv *rtlpriv = rtl_priv(hw);
1743	u32 pathon;
1744	u32 i;
1745
1746	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "ADDA ON.\n");
1747	pathon = patha_on ? 0x04db25a4 : 0x0b1b25a4;
1748	if (patha_on)
1749		pathon = rtlpriv->rtlhal.interfaceindex == 0 ?
1750		    0x04db25a4 : 0x0b1b25a4;
1751	for (i = 0; i < IQK_ADDA_REG_NUM; i++)
1752		rtl_set_bbreg(hw, adda_reg[i], MASKDWORD, pathon);
1753}
1754
1755static void _rtl92d_phy_mac_setting_calibration(struct ieee80211_hw *hw,
1756						u32 *macreg, u32 *macbackup)
1757{
1758	struct rtl_priv *rtlpriv = rtl_priv(hw);
1759	u32 i;
1760
1761	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "MAC settings for Calibration.\n");
1762	rtl_write_byte(rtlpriv, macreg[0], 0x3F);
1763
1764	for (i = 1; i < (IQK_MAC_REG_NUM - 1); i++)
1765		rtl_write_byte(rtlpriv, macreg[i], (u8)(macbackup[i] &
1766			       (~BIT(3))));
1767	rtl_write_byte(rtlpriv, macreg[i], (u8) (macbackup[i] & (~BIT(5))));
1768}
1769
1770static void _rtl92d_phy_patha_standby(struct ieee80211_hw *hw)
1771{
1772	struct rtl_priv *rtlpriv = rtl_priv(hw);
1773	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path-A standby mode!\n");
1774
1775	rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x0);
1776	rtl_set_bbreg(hw, RFPGA0_XA_LSSIPARAMETER, MASKDWORD, 0x00010000);
1777	rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
1778}
1779
1780static void _rtl92d_phy_pimode_switch(struct ieee80211_hw *hw, bool pi_mode)
1781{
1782	struct rtl_priv *rtlpriv = rtl_priv(hw);
1783	u32 mode;
1784
1785	RTPRINT(rtlpriv, FINIT, INIT_IQK,
1786		"BB Switch to %s mode!\n", pi_mode ? "PI" : "SI");
1787	mode = pi_mode ? 0x01000100 : 0x01000000;
1788	rtl_set_bbreg(hw, 0x820, MASKDWORD, mode);
1789	rtl_set_bbreg(hw, 0x828, MASKDWORD, mode);
1790}
1791
1792static void _rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw, long result[][8],
1793				     u8 t, bool is2t)
1794{
1795	struct rtl_priv *rtlpriv = rtl_priv(hw);
1796	struct rtl_phy *rtlphy = &(rtlpriv->phy);
1797	u32 i;
1798	u8 patha_ok, pathb_ok;
1799	static u32 adda_reg[IQK_ADDA_REG_NUM] = {
1800		RFPGA0_XCD_SWITCHCONTROL, 0xe6c, 0xe70, 0xe74,
1801		0xe78, 0xe7c, 0xe80, 0xe84,
1802		0xe88, 0xe8c, 0xed0, 0xed4,
1803		0xed8, 0xedc, 0xee0, 0xeec
1804	};
1805	static u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
1806		0x522, 0x550, 0x551, 0x040
1807	};
1808	static u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
1809		RFPGA0_XAB_RFINTERFACESW, RFPGA0_XA_RFINTERFACEOE,
1810		RFPGA0_XB_RFINTERFACEOE, ROFDM0_TRMUXPAR,
1811		RFPGA0_XCD_RFINTERFACESW, ROFDM0_TRXPATHENABLE,
1812		RFPGA0_RFMOD, RFPGA0_ANALOGPARAMETER4,
1813		ROFDM0_XAAGCCORE1, ROFDM0_XBAGCCORE1
1814	};
1815	const u32 retrycount = 2;
1816	u32 bbvalue;
1817
1818	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "IQK for 2.4G :Start!!!\n");
1819	if (t == 0) {
1820		bbvalue = rtl_get_bbreg(hw, RFPGA0_RFMOD, MASKDWORD);
1821		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "==>0x%08x\n", bbvalue);
1822		RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQ Calibration for %s\n",
1823			is2t ? "2T2R" : "1T1R");
1824
1825		/*  Save ADDA parameters, turn Path A ADDA on */
1826		_rtl92d_phy_save_adda_registers(hw, adda_reg,
1827			rtlphy->adda_backup, IQK_ADDA_REG_NUM);
1828		_rtl92d_phy_save_mac_registers(hw, iqk_mac_reg,
1829			rtlphy->iqk_mac_backup);
1830		_rtl92d_phy_save_adda_registers(hw, iqk_bb_reg,
1831			rtlphy->iqk_bb_backup, IQK_BB_REG_NUM);
1832	}
1833	_rtl92d_phy_path_adda_on(hw, adda_reg, true, is2t);
1834	if (t == 0)
1835		rtlphy->rfpi_enable = (u8) rtl_get_bbreg(hw,
1836				RFPGA0_XA_HSSIPARAMETER1, BIT(8));
1837
1838	/*  Switch BB to PI mode to do IQ Calibration. */
1839	if (!rtlphy->rfpi_enable)
1840		_rtl92d_phy_pimode_switch(hw, true);
1841
1842	rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(24), 0x00);
1843	rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKDWORD, 0x03a05600);
1844	rtl_set_bbreg(hw, ROFDM0_TRMUXPAR, MASKDWORD, 0x000800e4);
1845	rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, MASKDWORD, 0x22204000);
1846	rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xf00000, 0x0f);
1847	if (is2t) {
1848		rtl_set_bbreg(hw, RFPGA0_XA_LSSIPARAMETER, MASKDWORD,
1849			      0x00010000);
1850		rtl_set_bbreg(hw, RFPGA0_XB_LSSIPARAMETER, MASKDWORD,
1851			      0x00010000);
1852	}
1853	/* MAC settings */
1854	_rtl92d_phy_mac_setting_calibration(hw, iqk_mac_reg,
1855					    rtlphy->iqk_mac_backup);
1856	/* Page B init */
1857	rtl_set_bbreg(hw, 0xb68, MASKDWORD, 0x0f600000);
1858	if (is2t)
1859		rtl_set_bbreg(hw, 0xb6c, MASKDWORD, 0x0f600000);
1860	/* IQ calibration setting */
1861	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "IQK setting!\n");
1862	rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
1863	rtl_set_bbreg(hw, 0xe40, MASKDWORD, 0x01007c00);
1864	rtl_set_bbreg(hw, 0xe44, MASKDWORD, 0x01004800);
1865	for (i = 0; i < retrycount; i++) {
1866		patha_ok = _rtl92d_phy_patha_iqk(hw, is2t);
1867		if (patha_ok == 0x03) {
1868			RTPRINT(rtlpriv, FINIT, INIT_IQK,
1869				"Path A IQK Success!!\n");
1870			result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
1871					0x3FF0000) >> 16;
1872			result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
1873					0x3FF0000) >> 16;
1874			result[t][2] = (rtl_get_bbreg(hw, 0xea4, MASKDWORD) &
1875					0x3FF0000) >> 16;
1876			result[t][3] = (rtl_get_bbreg(hw, 0xeac, MASKDWORD) &
1877					0x3FF0000) >> 16;
1878			break;
1879		} else if (i == (retrycount - 1) && patha_ok == 0x01) {
1880			/* Tx IQK OK */
1881			RTPRINT(rtlpriv, FINIT, INIT_IQK,
1882				"Path A IQK Only  Tx Success!!\n");
1883
1884			result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
1885					0x3FF0000) >> 16;
1886			result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
1887					0x3FF0000) >> 16;
1888		}
1889	}
1890	if (0x00 == patha_ok)
1891		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path A IQK failed!!\n");
1892	if (is2t) {
1893		_rtl92d_phy_patha_standby(hw);
1894		/* Turn Path B ADDA on */
1895		_rtl92d_phy_path_adda_on(hw, adda_reg, false, is2t);
1896		for (i = 0; i < retrycount; i++) {
1897			pathb_ok = _rtl92d_phy_pathb_iqk(hw);
1898			if (pathb_ok == 0x03) {
1899				RTPRINT(rtlpriv, FINIT, INIT_IQK,
1900					"Path B IQK Success!!\n");
1901				result[t][4] = (rtl_get_bbreg(hw, 0xeb4,
1902					       MASKDWORD) & 0x3FF0000) >> 16;
1903				result[t][5] = (rtl_get_bbreg(hw, 0xebc,
1904					       MASKDWORD) & 0x3FF0000) >> 16;
1905				result[t][6] = (rtl_get_bbreg(hw, 0xec4,
1906					       MASKDWORD) & 0x3FF0000) >> 16;
1907				result[t][7] = (rtl_get_bbreg(hw, 0xecc,
1908					       MASKDWORD) & 0x3FF0000) >> 16;
1909				break;
1910			} else if (i == (retrycount - 1) && pathb_ok == 0x01) {
1911				/* Tx IQK OK */
1912				RTPRINT(rtlpriv, FINIT, INIT_IQK,
1913					"Path B Only Tx IQK Success!!\n");
1914				result[t][4] = (rtl_get_bbreg(hw, 0xeb4,
1915					       MASKDWORD) & 0x3FF0000) >> 16;
1916				result[t][5] = (rtl_get_bbreg(hw, 0xebc,
1917					       MASKDWORD) & 0x3FF0000) >> 16;
1918			}
1919		}
1920		if (0x00 == pathb_ok)
1921			RTPRINT(rtlpriv, FINIT, INIT_IQK,
1922				"Path B IQK failed!!\n");
1923	}
1924
1925	/* Back to BB mode, load original value */
1926	RTPRINT(rtlpriv, FINIT, INIT_IQK,
1927		"IQK:Back to BB mode, load original value!\n");
1928
1929	rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0);
1930	if (t != 0) {
1931		/* Switch back BB to SI mode after finish IQ Calibration. */
1932		if (!rtlphy->rfpi_enable)
1933			_rtl92d_phy_pimode_switch(hw, false);
1934		/* Reload ADDA power saving parameters */
1935		_rtl92d_phy_reload_adda_registers(hw, adda_reg,
1936				rtlphy->adda_backup, IQK_ADDA_REG_NUM);
1937		/* Reload MAC parameters */
1938		_rtl92d_phy_reload_mac_registers(hw, iqk_mac_reg,
1939					rtlphy->iqk_mac_backup);
1940		if (is2t)
1941			_rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
1942							  rtlphy->iqk_bb_backup,
1943							  IQK_BB_REG_NUM);
1944		else
1945			_rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
1946							  rtlphy->iqk_bb_backup,
1947							  IQK_BB_REG_NUM - 1);
1948		/* load 0xe30 IQC default value */
1949		rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x01008c00);
1950		rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x01008c00);
1951	}
1952	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "<==\n");
1953}
1954
1955static void _rtl92d_phy_iq_calibrate_5g_normal(struct ieee80211_hw *hw,
1956					       long result[][8], u8 t)
1957{
1958	struct rtl_priv *rtlpriv = rtl_priv(hw);
1959	struct rtl_phy *rtlphy = &(rtlpriv->phy);
1960	struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
1961	u8 patha_ok, pathb_ok;
1962	static u32 adda_reg[IQK_ADDA_REG_NUM] = {
1963		RFPGA0_XCD_SWITCHCONTROL, 0xe6c, 0xe70, 0xe74,
1964		0xe78, 0xe7c, 0xe80, 0xe84,
1965		0xe88, 0xe8c, 0xed0, 0xed4,
1966		0xed8, 0xedc, 0xee0, 0xeec
1967	};
1968	static u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
1969		0x522, 0x550, 0x551, 0x040
1970	};
1971	static u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
1972		RFPGA0_XAB_RFINTERFACESW, RFPGA0_XA_RFINTERFACEOE,
1973		RFPGA0_XB_RFINTERFACEOE, ROFDM0_TRMUXPAR,
1974		RFPGA0_XCD_RFINTERFACESW, ROFDM0_TRXPATHENABLE,
1975		RFPGA0_RFMOD, RFPGA0_ANALOGPARAMETER4,
1976		ROFDM0_XAAGCCORE1, ROFDM0_XBAGCCORE1
1977	};
1978	u32 bbvalue;
1979	bool is2t = IS_92D_SINGLEPHY(rtlhal->version);
1980
1981	/* Note: IQ calibration must be performed after loading
1982	 * PHY_REG.txt , and radio_a, radio_b.txt */
1983
1984	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "IQK for 5G NORMAL:Start!!!\n");
1985	mdelay(IQK_DELAY_TIME * 20);
1986	if (t == 0) {
1987		bbvalue = rtl_get_bbreg(hw, RFPGA0_RFMOD, MASKDWORD);
1988		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "==>0x%08x\n", bbvalue);
1989		RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQ Calibration for %s\n",
1990			is2t ? "2T2R" : "1T1R");
1991		/* Save ADDA parameters, turn Path A ADDA on */
1992		_rtl92d_phy_save_adda_registers(hw, adda_reg,
1993						rtlphy->adda_backup,
1994						IQK_ADDA_REG_NUM);
1995		_rtl92d_phy_save_mac_registers(hw, iqk_mac_reg,
1996					       rtlphy->iqk_mac_backup);
1997		if (is2t)
1998			_rtl92d_phy_save_adda_registers(hw, iqk_bb_reg,
1999							rtlphy->iqk_bb_backup,
2000							IQK_BB_REG_NUM);
2001		else
2002			_rtl92d_phy_save_adda_registers(hw, iqk_bb_reg,
2003							rtlphy->iqk_bb_backup,
2004							IQK_BB_REG_NUM - 1);
2005	}
2006	_rtl92d_phy_path_adda_on(hw, adda_reg, true, is2t);
2007	/* MAC settings */
2008	_rtl92d_phy_mac_setting_calibration(hw, iqk_mac_reg,
2009			rtlphy->iqk_mac_backup);
2010	if (t == 0)
2011		rtlphy->rfpi_enable = (u8) rtl_get_bbreg(hw,
2012			RFPGA0_XA_HSSIPARAMETER1, BIT(8));
2013	/*  Switch BB to PI mode to do IQ Calibration. */
2014	if (!rtlphy->rfpi_enable)
2015		_rtl92d_phy_pimode_switch(hw, true);
2016	rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(24), 0x00);
2017	rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKDWORD, 0x03a05600);
2018	rtl_set_bbreg(hw, ROFDM0_TRMUXPAR, MASKDWORD, 0x000800e4);
2019	rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, MASKDWORD, 0x22208000);
2020	rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xf00000, 0x0f);
2021
2022	/* Page B init */
2023	rtl_set_bbreg(hw, 0xb68, MASKDWORD, 0x0f600000);
2024	if (is2t)
2025		rtl_set_bbreg(hw, 0xb6c, MASKDWORD, 0x0f600000);
2026	/* IQ calibration setting  */
2027	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "IQK setting!\n");
2028	rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
2029	rtl_set_bbreg(hw, 0xe40, MASKDWORD, 0x10007c00);
2030	rtl_set_bbreg(hw, 0xe44, MASKDWORD, 0x01004800);
2031	patha_ok = _rtl92d_phy_patha_iqk_5g_normal(hw, is2t);
2032	if (patha_ok == 0x03) {
2033		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path A IQK Success!!\n");
2034		result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
2035				0x3FF0000) >> 16;
2036		result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
2037				0x3FF0000) >> 16;
2038		result[t][2] = (rtl_get_bbreg(hw, 0xea4, MASKDWORD) &
2039				0x3FF0000) >> 16;
2040		result[t][3] = (rtl_get_bbreg(hw, 0xeac, MASKDWORD) &
2041				0x3FF0000) >> 16;
2042	} else if (patha_ok == 0x01) {	/* Tx IQK OK */
2043		RTPRINT(rtlpriv, FINIT, INIT_IQK,
2044			"Path A IQK Only  Tx Success!!\n");
2045
2046		result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
2047				0x3FF0000) >> 16;
2048		result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
2049				0x3FF0000) >> 16;
2050	} else {
2051		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path A IQK Fail!!\n");
2052	}
2053	if (is2t) {
2054		/* _rtl92d_phy_patha_standby(hw); */
2055		/* Turn Path B ADDA on  */
2056		_rtl92d_phy_path_adda_on(hw, adda_reg, false, is2t);
2057		pathb_ok = _rtl92d_phy_pathb_iqk_5g_normal(hw);
2058		if (pathb_ok == 0x03) {
2059			RTPRINT(rtlpriv, FINIT, INIT_IQK,
2060				"Path B 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			result[t][6] = (rtl_get_bbreg(hw, 0xec4, MASKDWORD) &
2066			     0x3FF0000) >> 16;
2067			result[t][7] = (rtl_get_bbreg(hw, 0xecc, MASKDWORD) &
2068			     0x3FF0000) >> 16;
2069		} else if (pathb_ok == 0x01) { /* Tx IQK OK */
2070			RTPRINT(rtlpriv, FINIT, INIT_IQK,
2071				"Path B Only Tx IQK Success!!\n");
2072			result[t][4] = (rtl_get_bbreg(hw, 0xeb4, MASKDWORD) &
2073			     0x3FF0000) >> 16;
2074			result[t][5] = (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
2075			     0x3FF0000) >> 16;
2076		} else {
2077			RTPRINT(rtlpriv, FINIT, INIT_IQK,
2078				"Path B IQK failed!!\n");
2079		}
2080	}
2081
2082	/* Back to BB mode, load original value */
2083	RTPRINT(rtlpriv, FINIT, INIT_IQK,
2084		"IQK:Back to BB mode, load original value!\n");
2085	rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0);
2086	if (t != 0) {
2087		if (is2t)
2088			_rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
2089							  rtlphy->iqk_bb_backup,
2090							  IQK_BB_REG_NUM);
2091		else
2092			_rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
2093							  rtlphy->iqk_bb_backup,
2094							  IQK_BB_REG_NUM - 1);
2095		/* Reload MAC parameters */
2096		_rtl92d_phy_reload_mac_registers(hw, iqk_mac_reg,
2097				rtlphy->iqk_mac_backup);
2098		/*  Switch back BB to SI mode after finish IQ Calibration. */
2099		if (!rtlphy->rfpi_enable)
2100			_rtl92d_phy_pimode_switch(hw, false);
2101		/* Reload ADDA power saving parameters */
2102		_rtl92d_phy_reload_adda_registers(hw, adda_reg,
2103						  rtlphy->adda_backup,
2104						  IQK_ADDA_REG_NUM);
2105	}
2106	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "<==\n");
2107}
2108
2109static bool _rtl92d_phy_simularity_compare(struct ieee80211_hw *hw,
2110	long result[][8], u8 c1, u8 c2)
2111{
2112	struct rtl_priv *rtlpriv = rtl_priv(hw);
2113	struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2114	u32 i, j, diff, sim_bitmap, bound;
2115	u8 final_candidate[2] = {0xFF, 0xFF};	/* for path A and path B */
2116	bool bresult = true;
2117	bool is2t = IS_92D_SINGLEPHY(rtlhal->version);
2118
2119	if (is2t)
2120		bound = 8;
2121	else
2122		bound = 4;
2123	sim_bitmap = 0;
2124	for (i = 0; i < bound; i++) {
2125		diff = (result[c1][i] > result[c2][i]) ? (result[c1][i] -
2126		       result[c2][i]) : (result[c2][i] - result[c1][i]);
2127		if (diff > MAX_TOLERANCE_92D) {
2128			if ((i == 2 || i == 6) && !sim_bitmap) {
2129				if (result[c1][i] + result[c1][i + 1] == 0)
2130					final_candidate[(i / 4)] = c2;
2131				else if (result[c2][i] + result[c2][i + 1] == 0)
2132					final_candidate[(i / 4)] = c1;
2133				else
2134					sim_bitmap = sim_bitmap | (1 << i);
2135			} else {
2136				sim_bitmap = sim_bitmap | (1 << i);
2137			}
2138		}
2139	}
2140	if (sim_bitmap == 0) {
2141		for (i = 0; i < (bound / 4); i++) {
2142			if (final_candidate[i] != 0xFF) {
2143				for (j = i * 4; j < (i + 1) * 4 - 2; j++)
2144					result[3][j] =
2145						 result[final_candidate[i]][j];
2146				bresult = false;
2147			}
2148		}
2149		return bresult;
2150	}
2151	if (!(sim_bitmap & 0x0F)) { /* path A OK */
2152		for (i = 0; i < 4; i++)
2153			result[3][i] = result[c1][i];
2154	} else if (!(sim_bitmap & 0x03)) { /* path A, Tx OK */
2155		for (i = 0; i < 2; i++)
2156			result[3][i] = result[c1][i];
2157	}
2158	if (!(sim_bitmap & 0xF0) && is2t) { /* path B OK */
2159		for (i = 4; i < 8; i++)
2160			result[3][i] = result[c1][i];
2161	} else if (!(sim_bitmap & 0x30)) { /* path B, Tx OK */
2162		for (i = 4; i < 6; i++)
2163			result[3][i] = result[c1][i];
2164	}
2165	return false;
2166}
2167
2168static void _rtl92d_phy_patha_fill_iqk_matrix(struct ieee80211_hw *hw,
2169					      bool iqk_ok, long result[][8],
2170					      u8 final_candidate, bool txonly)
2171{
2172	struct rtl_priv *rtlpriv = rtl_priv(hw);
2173	struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2174	u32 oldval_0, val_x, tx0_a, reg;
2175	long val_y, tx0_c;
2176	bool is2t = IS_92D_SINGLEPHY(rtlhal->version) ||
2177	    rtlhal->macphymode == DUALMAC_DUALPHY;
2178
2179	RTPRINT(rtlpriv, FINIT, INIT_IQK,
2180		"Path A IQ Calibration %s !\n", iqk_ok ? "Success" : "Failed");
2181	if (final_candidate == 0xFF) {
2182		return;
2183	} else if (iqk_ok) {
2184		oldval_0 = (rtl_get_bbreg(hw, ROFDM0_XATxIQIMBALANCE,
2185			MASKDWORD) >> 22) & 0x3FF;	/* OFDM0_D */
2186		val_x = result[final_candidate][0];
2187		if ((val_x & 0x00000200) != 0)
2188			val_x = val_x | 0xFFFFFC00;
2189		tx0_a = (val_x * oldval_0) >> 8;
2190		RTPRINT(rtlpriv, FINIT, INIT_IQK,
2191			"X = 0x%x, tx0_a = 0x%x, oldval_0 0x%x\n",
2192			val_x, tx0_a, oldval_0);
2193		rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, 0x3FF, tx0_a);
2194		rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(24),
2195			      ((val_x * oldval_0 >> 7) & 0x1));
2196		val_y = result[final_candidate][1];
2197		if ((val_y & 0x00000200) != 0)
2198			val_y = val_y | 0xFFFFFC00;
2199		/* path B IQK result + 3 */
2200		if (rtlhal->interfaceindex == 1 &&
2201			rtlhal->current_bandtype == BAND_ON_5G)
2202			val_y += 3;
2203		tx0_c = (val_y * oldval_0) >> 8;
2204		RTPRINT(rtlpriv, FINIT, INIT_IQK,
2205			"Y = 0x%lx, tx0_c = 0x%lx\n",
2206			val_y, tx0_c);
2207		rtl_set_bbreg(hw, ROFDM0_XCTxAFE, 0xF0000000,
2208			      ((tx0_c & 0x3C0) >> 6));
2209		rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, 0x003F0000,
2210			      (tx0_c & 0x3F));
2211		if (is2t)
2212			rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(26),
2213				      ((val_y * oldval_0 >> 7) & 0x1));
2214		RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xC80 = 0x%x\n",
2215			rtl_get_bbreg(hw, ROFDM0_XATxIQIMBALANCE,
2216				      MASKDWORD));
2217		if (txonly) {
2218			RTPRINT(rtlpriv, FINIT, INIT_IQK,  "only Tx OK\n");
2219			return;
2220		}
2221		reg = result[final_candidate][2];
2222		rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0x3FF, reg);
2223		reg = result[final_candidate][3] & 0x3F;
2224		rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0xFC00, reg);
2225		reg = (result[final_candidate][3] >> 6) & 0xF;
2226		rtl_set_bbreg(hw, 0xca0, 0xF0000000, reg);
2227	}
2228}
2229
2230static void _rtl92d_phy_pathb_fill_iqk_matrix(struct ieee80211_hw *hw,
2231	bool iqk_ok, long result[][8], u8 final_candidate, bool txonly)
2232{
2233	struct rtl_priv *rtlpriv = rtl_priv(hw);
2234	struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2235	u32 oldval_1, val_x, tx1_a, reg;
2236	long val_y, tx1_c;
2237
2238	RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path B IQ Calibration %s !\n",
2239		iqk_ok ? "Success" : "Failed");
2240	if (final_candidate == 0xFF) {
2241		return;
2242	} else if (iqk_ok) {
2243		oldval_1 = (rtl_get_bbreg(hw, ROFDM0_XBTxIQIMBALANCE,
2244					  MASKDWORD) >> 22) & 0x3FF;
2245		val_x = result[final_candidate][4];
2246		if ((val_x & 0x00000200) != 0)
2247			val_x = val_x | 0xFFFFFC00;
2248		tx1_a = (val_x * oldval_1) >> 8;
2249		RTPRINT(rtlpriv, FINIT, INIT_IQK, "X = 0x%x, tx1_a = 0x%x\n",
2250			val_x, tx1_a);
2251		rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, 0x3FF, tx1_a);
2252		rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(28),
2253			      ((val_x * oldval_1 >> 7) & 0x1));
2254		val_y = result[final_candidate][5];
2255		if ((val_y & 0x00000200) != 0)
2256			val_y = val_y | 0xFFFFFC00;
2257		if (rtlhal->current_bandtype == BAND_ON_5G)
2258			val_y += 3;
2259		tx1_c = (val_y * oldval_1) >> 8;
2260		RTPRINT(rtlpriv, FINIT, INIT_IQK, "Y = 0x%lx, tx1_c = 0x%lx\n",
2261			val_y, tx1_c);
2262		rtl_set_bbreg(hw, ROFDM0_XDTxAFE, 0xF0000000,
2263			      ((tx1_c & 0x3C0) >> 6));
2264		rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, 0x003F0000,
2265			      (tx1_c & 0x3F));
2266		rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(30),
2267			      ((val_y * oldval_1 >> 7) & 0x1));
2268		if (txonly)
2269			return;
2270		reg = result[final_candidate][6];
2271		rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0x3FF, reg);
2272		reg = result[final_candidate][7] & 0x3F;
2273		rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0xFC00, reg);
2274		reg = (result[final_candidate][7] >> 6) & 0xF;
2275		rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0x0000F000, reg);
2276	}
2277}
2278
2279void rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw)
2280{
2281	struct rtl_priv *rtlpriv = rtl_priv(hw);
2282	struct rtl_phy *rtlphy = &(rtlpriv->phy);
2283	struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2284	long result[4][8];
2285	u8 i, final_candidate, indexforchannel;
2286	bool patha_ok, pathb_ok;
2287	long rege94, rege9c, regea4, regeac, regeb4;
2288	long regebc, regec4, regecc, regtmp = 0;
2289	bool is12simular, is13simular, is23simular;
2290	unsigned long flag = 0;
2291
2292	RTPRINT(rtlpriv, FINIT, INIT_IQK,
2293		"IQK:Start!!!channel %d\n", rtlphy->current_channel);
2294	for (i = 0; i < 8; i++) {
2295		result[0][i] = 0;
2296		result[1][i] = 0;
2297		result[2][i] = 0;
2298		result[3][i] = 0;
2299	}
2300	final_candidate = 0xff;
2301	patha_ok = false;
2302	pathb_ok = false;
2303	is12simular = false;
2304	is23simular = false;
2305	is13simular = false;
2306	RTPRINT(rtlpriv, FINIT, INIT_IQK,
2307		"IQK !!!currentband %d\n", rtlhal->current_bandtype);
2308	rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag);
2309	for (i = 0; i < 3; i++) {
2310		if (rtlhal->current_bandtype == BAND_ON_5G) {
2311			_rtl92d_phy_iq_calibrate_5g_normal(hw, result, i);
2312		} else if (rtlhal->current_bandtype == BAND_ON_2_4G) {
2313			if (IS_92D_SINGLEPHY(rtlhal->version))
2314				_rtl92d_phy_iq_calibrate(hw, result, i, true);
2315			else
2316				_rtl92d_phy_iq_calibrate(hw, result, i, false);
2317		}
2318		if (i == 1) {
2319			is12simular = _rtl92d_phy_simularity_compare(hw, result,
2320								     0, 1);
2321			if (is12simular) {
2322				final_candidate = 0;
2323				break;
2324			}
2325		}
2326		if (i == 2) {
2327			is13simular = _rtl92d_phy_simularity_compare(hw, result,
2328								     0, 2);
2329			if (is13simular) {
2330				final_candidate = 0;
2331				break;
2332			}
2333			is23simular = _rtl92d_phy_simularity_compare(hw, result,
2334								     1, 2);
2335			if (is23simular) {
2336				final_candidate = 1;
2337			} else {
2338				for (i = 0; i < 8; i++)
2339					regtmp += result[3][i];
2340
2341				if (regtmp != 0)
2342					final_candidate = 3;
2343				else
2344					final_candidate = 0xFF;
2345			}
2346		}
2347	}
2348	rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
2349	for (i = 0; i < 4; i++) {
2350		rege94 = result[i][0];
2351		rege9c = result[i][1];
2352		regea4 = result[i][2];
2353		regeac = result[i][3];
2354		regeb4 = result[i][4];
2355		regebc = result[i][5];
2356		regec4 = result[i][6];
2357		regecc = result[i][7];
2358		RTPRINT(rtlpriv, FINIT, INIT_IQK,
2359			"IQK: rege94=%lx rege9c=%lx regea4=%lx regeac=%lx regeb4=%lx regebc=%lx regec4=%lx regecc=%lx\n",
2360			rege94, rege9c, regea4, regeac, regeb4, regebc, regec4,
2361			regecc);
2362	}
2363	if (final_candidate != 0xff) {
2364		rtlphy->reg_e94 = rege94 = result[final_candidate][0];
2365		rtlphy->reg_e9c = rege9c = result[final_candidate][1];
2366		regea4 = result[final_candidate][2];
2367		regeac = result[final_candidate][3];
2368		rtlphy->reg_eb4 = regeb4 = result[final_candidate][4];
2369		rtlphy->reg_ebc = regebc = result[final_candidate][5];
2370		regec4 = result[final_candidate][6];
2371		regecc = result[final_candidate][7];
2372		RTPRINT(rtlpriv, FINIT, INIT_IQK,
2373			"IQK: final_candidate is %x\n", final_candidate);
2374		RTPRINT(rtlpriv, FINIT, INIT_IQK,
2375			"IQK: rege94=%lx rege9c=%lx regea4=%lx regeac=%lx regeb4=%lx regebc=%lx regec4=%lx regecc=%lx\n",
2376			rege94, rege9c, regea4, regeac, regeb4, regebc, regec4,
2377			regecc);
2378		patha_ok = pathb_ok = true;
2379	} else {
2380		rtlphy->reg_e94 = rtlphy->reg_eb4 = 0x100; /* X default value */
2381		rtlphy->reg_e9c = rtlphy->reg_ebc = 0x0;   /* Y default value */
2382	}
2383	if ((rege94 != 0) /*&&(regea4 != 0) */)
2384		_rtl92d_phy_patha_fill_iqk_matrix(hw, patha_ok, result,
2385				final_candidate, (regea4 == 0));
2386	if (IS_92D_SINGLEPHY(rtlhal->version)) {
2387		if ((regeb4 != 0) /*&&(regec4 != 0) */)
2388			_rtl92d_phy_pathb_fill_iqk_matrix(hw, pathb_ok, result,
2389						final_candidate, (regec4 == 0));
2390	}
2391	if (final_candidate != 0xFF) {
2392		indexforchannel = rtl92d_get_rightchnlplace_for_iqk(
2393				  rtlphy->current_channel);
2394
2395		for (i = 0; i < IQK_MATRIX_REG_NUM; i++)
2396			rtlphy->iqk_matrix[indexforchannel].
2397				value[0][i] = result[final_candidate][i];
2398		rtlphy->iqk_matrix[indexforchannel].iqk_done =
2399			true;
2400
2401		RT_TRACE(rtlpriv, COMP_SCAN | COMP_MLME, DBG_LOUD,
2402			 "IQK OK indexforchannel %d\n", indexforchannel);
2403	}
2404}
2405
2406void rtl92d_phy_reload_iqk_setting(struct ieee80211_hw *hw, u8 channel)
2407{
2408	struct rtl_priv *rtlpriv = rtl_priv(hw);
2409	struct rtl_phy *rtlphy = &(rtlpriv->phy);
2410	struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2411	u8 indexforchannel;
2412
2413	RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "channel %d\n", channel);
2414	/*------Do IQK for normal chip and test chip 5G band------- */
2415	indexforchannel = rtl92d_get_rightchnlplace_for_iqk(channel);
2416	RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "indexforchannel %d done %d\n",
2417		 indexforchannel,
2418		 rtlphy->iqk_matrix[indexforchannel].iqk_done);
2419	if (0 && !rtlphy->iqk_matrix[indexforchannel].iqk_done &&
2420		rtlphy->need_iqk) {
2421		/* Re Do IQK. */
2422		RT_TRACE(rtlpriv, COMP_SCAN | COMP_INIT, DBG_LOUD,
2423			 "Do IQK Matrix reg for channel:%d....\n", channel);
2424		rtl92d_phy_iq_calibrate(hw);
2425	} else {
2426		/* Just load the value. */
2427		/* 2G band just load once. */
2428		if (((!rtlhal->load_imrandiqk_setting_for2g) &&
2429		    indexforchannel == 0) || indexforchannel > 0) {
2430			RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
2431				 "Just Read IQK Matrix reg for channel:%d....\n",
2432				 channel);
2433			if ((rtlphy->iqk_matrix[indexforchannel].
2434			     value[0] != NULL)
2435				/*&&(regea4 != 0) */)
2436				_rtl92d_phy_patha_fill_iqk_matrix(hw, true,
2437					rtlphy->iqk_matrix[
2438					indexforchannel].value,	0,
2439					(rtlphy->iqk_matrix[
2440					indexforchannel].value[0][2] == 0));
2441			if (IS_92D_SINGLEPHY(rtlhal->version)) {
2442				if ((rtlphy->iqk_matrix[
2443					indexforchannel].value[0][4] != 0)
2444					/*&&(regec4 != 0) */)
2445					_rtl92d_phy_pathb_fill_iqk_matrix(hw,
2446						true,
2447						rtlphy->iqk_matrix[
2448						indexforchannel].value, 0,
2449						(rtlphy->iqk_matrix[
2450						indexforchannel].value[0][6]
2451						== 0));
2452			}
2453		}
2454	}
2455	rtlphy->need_iqk = false;
2456	RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
2457}
2458
2459static u32 _rtl92d_phy_get_abs(u32 val1, u32 val2)
2460{
2461	u32 ret;
2462
2463	if (val1 >= val2)
2464		ret = val1 - val2;
2465	else
2466		ret = val2 - val1;
2467	return ret;
2468}
2469
2470static bool _rtl92d_is_legal_5g_channel(struct ieee80211_hw *hw, u8 channel)
2471{
2472
2473	int i;
2474	u8 channel_5g[45] = {
2475		36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
2476		60, 62, 64, 100, 102, 104, 106, 108, 110, 112,
2477		114, 116, 118, 120, 122, 124, 126, 128, 130, 132,
2478		134, 136, 138, 140, 149, 151, 153, 155, 157, 159,
2479		161, 163, 165
2480	};
2481
2482	for (i = 0; i < sizeof(channel_5g); i++)
2483		if (channel == channel_5g[i])
2484			return true;
2485	return false;
2486}
2487
2488static void _rtl92d_phy_calc_curvindex(struct ieee80211_hw *hw,
2489				       u32 *targetchnl, u32 * curvecount_val,
2490				       bool is5g, u32 *curveindex)
2491{
2492	struct rtl_priv *rtlpriv = rtl_priv(hw);
2493	u32 smallest_abs_val = 0xffffffff, u4tmp;
2494	u8 i, j;
2495	u8 chnl_num = is5g ? TARGET_CHNL_NUM_5G : TARGET_CHNL_NUM_2G;
2496
2497	for (i = 0; i < chnl_num; i++) {
2498		if (is5g && !_rtl92d_is_legal_5g_channel(hw, i + 1))
2499			continue;
2500		curveindex[i] = 0;
2501		for (j = 0; j < (CV_CURVE_CNT * 2); j++) {
2502			u4tmp = _rtl92d_phy_get_abs(targetchnl[i],
2503				curvecount_val[j]);
2504
2505			if (u4tmp < smallest_abs_val) {
2506				curveindex[i] = j;
2507				smallest_abs_val = u4tmp;
2508			}
2509		}
2510		smallest_abs_val = 0xffffffff;
2511		RTPRINT(rtlpriv, FINIT, INIT_IQK, "curveindex[%d] = %x\n",
2512			i, curveindex[i]);
2513	}
2514}
2515
2516static void _rtl92d_phy_reload_lck_setting(struct ieee80211_hw *hw,
2517		u8 channel)
2518{
2519	struct rtl_priv *rtlpriv = rtl_priv(hw);
2520	u8 erfpath = rtlpriv->rtlhal.current_bandtype ==
2521		BAND_ON_5G ? RF90_PATH_A :
2522		IS_92D_SINGLEPHY(rtlpriv->rtlhal.version) ?
2523		RF90_PATH_B : RF90_PATH_A;
2524	u32 u4tmp = 0, u4regvalue = 0;
2525	bool bneed_powerdown_radio = false;
2526
2527	RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "path %d\n", erfpath);
2528	RTPRINT(rtlpriv, FINIT, INIT_IQK, "band type = %d\n",
2529		rtlpriv->rtlhal.current_bandtype);
2530	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "channel = %d\n", channel);
2531	if (rtlpriv->rtlhal.current_bandtype == BAND_ON_5G) {/* Path-A for 5G */
2532		u4tmp = curveindex_5g[channel-1];
2533		RTPRINT(rtlpriv, FINIT, INIT_IQK,
2534			"ver 1 set RF-A, 5G,	0x28 = 0x%x !!\n", u4tmp);
2535		if (rtlpriv->rtlhal.macphymode == DUALMAC_DUALPHY &&
2536			rtlpriv->rtlhal.interfaceindex == 1) {
2537			bneed_powerdown_radio =
2538				rtl92d_phy_enable_anotherphy(hw, false);
2539			rtlpriv->rtlhal.during_mac1init_radioa = true;
2540			/* asume no this case */
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		if (bneed_powerdown_radio)
2547			_rtl92d_phy_restore_rf_env(hw, erfpath, &u4regvalue);
2548		if (rtlpriv->rtlhal.during_mac1init_radioa)
2549			rtl92d_phy_powerdown_anotherphy(hw, false);
2550	} else if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G) {
2551		u4tmp = curveindex_2g[channel-1];
2552		RTPRINT(rtlpriv, FINIT, INIT_IQK,
2553			"ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n", u4tmp);
2554		if (rtlpriv->rtlhal.macphymode == DUALMAC_DUALPHY &&
2555			rtlpriv->rtlhal.interfaceindex == 0) {
2556			bneed_powerdown_radio =
2557				rtl92d_phy_enable_anotherphy(hw, true);
2558			rtlpriv->rtlhal.during_mac0init_radiob = true;
2559			if (bneed_powerdown_radio)
2560				_rtl92d_phy_enable_rf_env(hw, erfpath,
2561							  &u4regvalue);
2562		}
2563		rtl_set_rfreg(hw, erfpath, RF_SYN_G4, 0x3f800, u4tmp);
2564		RTPRINT(rtlpriv, FINIT, INIT_IQK,
2565			"ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n",
2566			rtl_get_rfreg(hw,  erfpath, RF_SYN_G4, 0x3f800));
2567		if (bneed_powerdown_radio)
2568			_rtl92d_phy_restore_rf_env(hw, erfpath, &u4regvalue);
2569		if (rtlpriv->rtlhal.during_mac0init_radiob)
2570			rtl92d_phy_powerdown_anotherphy(hw, true);
2571	}
2572	RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
2573}
2574
2575static void _rtl92d_phy_lc_calibrate_sw(struct ieee80211_hw *hw, bool is2t)
2576{
2577	struct rtl_priv *rtlpriv = rtl_priv(hw);
2578	struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2579	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2580	u8 tmpreg, index, rf_mode[2];
2581	u8 path = is2t ? 2 : 1;
2582	u8 i;
2583	u32 u4tmp, offset;
2584	u32 curvecount_val[CV_CURVE_CNT * 2] = {0};
2585	u16 timeout = 800, timecount = 0;
2586
2587	/* Check continuous TX and Packet TX */
2588	tmpreg = rtl_read_byte(rtlpriv, 0xd03);
2589	/* if Deal with contisuous TX case, disable all continuous TX */
2590	/* if Deal with Packet TX case, block all queues */
2591	if ((tmpreg & 0x70) != 0)
2592		rtl_write_byte(rtlpriv, 0xd03, tmpreg & 0x8F);
2593	else
2594		rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
2595	rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xF00000, 0x0F);
2596	for (index = 0; index < path; index++) {
2597		/* 1. Read original RF mode */
2598		offset = index == 0 ? ROFDM0_XAAGCCORE1 : ROFDM0_XBAGCCORE1;
2599		rf_mode[index] = rtl_read_byte(rtlpriv, offset);
2600		/* 2. Set RF mode = standby mode */
2601		rtl_set_rfreg(hw, (enum radio_path)index, RF_AC,
2602			      RFREG_OFFSET_MASK, 0x010000);
2603		if (rtlpci->init_ready) {
2604			/* switch CV-curve control by LC-calibration */
2605			rtl_set_rfreg(hw, (enum radio_path)index, RF_SYN_G7,
2606				      BIT(17), 0x0);
2607			/* 4. Set LC calibration begin */
2608			rtl_set_rfreg(hw, (enum radio_path)index, RF_CHNLBW,
2609				      0x08000, 0x01);
2610		}
2611		u4tmp = rtl_get_rfreg(hw, (enum radio_path)index, RF_SYN_G6,
2612				  RFREG_OFFSET_MASK);
2613		while ((!(u4tmp & BIT(11))) && timecount <= timeout) {
2614			mdelay(50);
2615			timecount += 50;
2616			u4tmp = rtl_get_rfreg(hw, (enum radio_path)index,
2617					      RF_SYN_G6, RFREG_OFFSET_MASK);
2618		}
2619		RTPRINT(rtlpriv, FINIT, INIT_IQK,
2620			"PHY_LCK finish delay for %d ms=2\n", timecount);
2621		u4tmp = rtl_get_rfreg(hw, index, RF_SYN_G4, RFREG_OFFSET_MASK);
2622		if (index == 0 && rtlhal->interfaceindex == 0) {
2623			RTPRINT(rtlpriv, FINIT, INIT_IQK,
2624				"path-A / 5G LCK\n");
2625		} else {
2626			RTPRINT(rtlpriv, FINIT, INIT_IQK,
2627				"path-B / 2.4G LCK\n");
2628		}
2629		memset(&curvecount_val[0], 0, CV_CURVE_CNT * 2);
2630		/* Set LC calibration off */
2631		rtl_set_rfreg(hw, (enum radio_path)index, RF_CHNLBW,
2632			      0x08000, 0x0);
2633		RTPRINT(rtlpriv, FINIT, INIT_IQK,  "set RF 0x18[15] = 0\n");
2634		/* save Curve-counting number */
2635		for (i = 0; i < CV_CURVE_CNT; i++) {
2636			u32 readval = 0, readval2 = 0;
2637			rtl_set_rfreg(hw, (enum radio_path)index, 0x3F,
2638				      0x7f, i);
2639
2640			rtl_set_rfreg(hw, (enum radio_path)index, 0x4D,
2641				RFREG_OFFSET_MASK, 0x0);
2642			readval = rtl_get_rfreg(hw, (enum radio_path)index,
2643					  0x4F, RFREG_OFFSET_MASK);
2644			curvecount_val[2 * i + 1] = (readval & 0xfffe0) >> 5;
2645			/* reg 0x4f [4:0] */
2646			/* reg 0x50 [19:10] */
2647			readval2 = rtl_get_rfreg(hw, (enum radio_path)index,
2648						 0x50, 0xffc00);
2649			curvecount_val[2 * i] = (((readval & 0x1F) << 10) |
2650						 readval2);
2651		}
2652		if (index == 0 && rtlhal->interfaceindex == 0)
2653			_rtl92d_phy_calc_curvindex(hw, targetchnl_5g,
2654						   curvecount_val,
2655						   true, curveindex_5g);
2656		else
2657			_rtl92d_phy_calc_curvindex(hw, targetchnl_2g,
2658						   curvecount_val,
2659						   false, curveindex_2g);
2660		/* switch CV-curve control mode */
2661		rtl_set_rfreg(hw, (enum radio_path)index, RF_SYN_G7,
2662			      BIT(17), 0x1);
2663	}
2664
2665	/* Restore original situation  */
2666	for (index = 0; index < path; index++) {
2667		offset = index == 0 ? ROFDM0_XAAGCCORE1 : ROFDM0_XBAGCCORE1;
2668		rtl_write_byte(rtlpriv, offset, 0x50);
2669		rtl_write_byte(rtlpriv, offset, rf_mode[index]);
2670	}
2671	if ((tmpreg & 0x70) != 0)
2672		rtl_write_byte(rtlpriv, 0xd03, tmpreg);
2673	else /*Deal with Packet TX case */
2674		rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
2675	rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xF00000, 0x00);
2676	_rtl92d_phy_reload_lck_setting(hw, rtlpriv->phy.current_channel);
2677}
2678
2679static void _rtl92d_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
2680{
2681	struct rtl_priv *rtlpriv = rtl_priv(hw);
2682
2683	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "cosa PHY_LCK ver=2\n");
2684	_rtl92d_phy_lc_calibrate_sw(hw, is2t);
2685}
2686
2687void rtl92d_phy_lc_calibrate(struct ieee80211_hw *hw)
2688{
2689	struct rtl_priv *rtlpriv = rtl_priv(hw);
2690	struct rtl_phy *rtlphy = &(rtlpriv->phy);
2691	struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2692	u32 timeout = 2000, timecount = 0;
2693
2694	while (rtlpriv->mac80211.act_scanning && timecount < timeout) {
2695		udelay(50);
2696		timecount += 50;
2697	}
2698
2699	rtlphy->lck_inprogress = true;
2700	RTPRINT(rtlpriv, FINIT, INIT_IQK,
2701		"LCK:Start!!! currentband %x delay %d ms\n",
2702		rtlhal->current_bandtype, timecount);
2703	if (IS_92D_SINGLEPHY(rtlhal->version)) {
2704		_rtl92d_phy_lc_calibrate(hw, true);
2705	} else {
2706		/* For 1T1R */
2707		_rtl92d_phy_lc_calibrate(hw, false);
2708	}
2709	rtlphy->lck_inprogress = false;
2710	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "LCK:Finish!!!\n");
2711}
2712
2713void rtl92d_phy_ap_calibrate(struct ieee80211_hw *hw, char delta)
2714{
2715	return;
2716}
2717
2718static bool _rtl92d_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
2719		u32 cmdtableidx, u32 cmdtablesz, enum swchnlcmd_id cmdid,
2720		u32 para1, u32 para2, u32 msdelay)
2721{
2722	struct swchnlcmd *pcmd;
2723
2724	if (cmdtable == NULL) {
2725		RT_ASSERT(false, "cmdtable cannot be NULL\n");
2726		return false;
2727	}
2728	if (cmdtableidx >= cmdtablesz)
2729		return false;
2730
2731	pcmd = cmdtable + cmdtableidx;
2732	pcmd->cmdid = cmdid;
2733	pcmd->para1 = para1;
2734	pcmd->para2 = para2;
2735	pcmd->msdelay = msdelay;
2736	return true;
2737}
2738
2739void rtl92d_phy_reset_iqk_result(struct ieee80211_hw *hw)
2740{
2741	struct rtl_priv *rtlpriv = rtl_priv(hw);
2742	struct rtl_phy *rtlphy = &(rtlpriv->phy);
2743	u8 i;
2744
2745	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2746		 "settings regs %d default regs %d\n",
2747		 (int)(sizeof(rtlphy->iqk_matrix) /
2748		       sizeof(struct iqk_matrix_regs)),
2749		 IQK_MATRIX_REG_NUM);
2750	/* 0xe94, 0xe9c, 0xea4, 0xeac, 0xeb4, 0xebc, 0xec4, 0xecc */
2751	for (i = 0; i < IQK_MATRIX_SETTINGS_NUM; i++) {
2752		rtlphy->iqk_matrix[i].value[0][0] = 0x100;
2753		rtlphy->iqk_matrix[i].value[0][2] = 0x100;
2754		rtlphy->iqk_matrix[i].value[0][4] = 0x100;
2755		rtlphy->iqk_matrix[i].value[0][6] = 0x100;
2756		rtlphy->iqk_matrix[i].value[0][1] = 0x0;
2757		rtlphy->iqk_matrix[i].value[0][3] = 0x0;
2758		rtlphy->iqk_matrix[i].value[0][5] = 0x0;
2759		rtlphy->iqk_matrix[i].value[0][7] = 0x0;
2760		rtlphy->iqk_matrix[i].iqk_done = false;
2761	}
2762}
2763
2764static bool _rtl92d_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
2765					     u8 channel, u8 *stage, u8 *step,
2766					     u32 *delay)
2767{
2768	struct rtl_priv *rtlpriv = rtl_priv(hw);
2769	struct rtl_phy *rtlphy = &(rtlpriv->phy);
2770	struct swchnlcmd precommoncmd[MAX_PRECMD_CNT];
2771	u32 precommoncmdcnt;
2772	struct swchnlcmd postcommoncmd[MAX_POSTCMD_CNT];
2773	u32 postcommoncmdcnt;
2774	struct swchnlcmd rfdependcmd[MAX_RFDEPENDCMD_CNT];
2775	u32 rfdependcmdcnt;
2776	struct swchnlcmd *currentcmd = NULL;
2777	u8 rfpath;
2778	u8 num_total_rfpath = rtlphy->num_total_rfpath;
2779
2780	precommoncmdcnt = 0;
2781	_rtl92d_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
2782					 MAX_PRECMD_CNT,
2783					 CMDID_SET_TXPOWEROWER_LEVEL, 0, 0, 0);
2784	_rtl92d_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
2785					 MAX_PRECMD_CNT, CMDID_END, 0, 0, 0);
2786	postcommoncmdcnt = 0;
2787	_rtl92d_phy_set_sw_chnl_cmdarray(postcommoncmd, postcommoncmdcnt++,
2788					 MAX_POSTCMD_CNT, CMDID_END, 0, 0, 0);
2789	rfdependcmdcnt = 0;
2790	_rtl92d_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
2791					 MAX_RFDEPENDCMD_CNT, CMDID_RF_WRITEREG,
2792					 RF_CHNLBW, channel, 0);
2793	_rtl92d_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
2794					 MAX_RFDEPENDCMD_CNT, CMDID_END,
2795					 0, 0, 0);
2796
2797	do {
2798		switch (*stage) {
2799		case 0:
2800			currentcmd = &precommoncmd[*step];
2801			break;
2802		case 1:
2803			currentcmd = &rfdependcmd[*step];
2804			break;
2805		case 2:
2806			currentcmd = &postcommoncmd[*step];
2807			break;
2808		}
2809		if (currentcmd->cmdid == CMDID_END) {
2810			if ((*stage) == 2) {
2811				return true;
2812			} else {
2813				(*stage)++;
2814				(*step) = 0;
2815				continue;
2816			}
2817		}
2818		switch (currentcmd->cmdid) {
2819		case CMDID_SET_TXPOWEROWER_LEVEL:
2820			rtl92d_phy_set_txpower_level(hw, channel);
2821			break;
2822		case CMDID_WRITEPORT_ULONG:
2823			rtl_write_dword(rtlpriv, currentcmd->para1,
2824					currentcmd->para2);
2825			break;
2826		case CMDID_WRITEPORT_USHORT:
2827			rtl_write_word(rtlpriv, currentcmd->para1,
2828				       (u16)currentcmd->para2);
2829			break;
2830		case CMDID_WRITEPORT_UCHAR:
2831			rtl_write_byte(rtlpriv, currentcmd->para1,
2832				       (u8)currentcmd->para2);
2833			break;
2834		case CMDID_RF_WRITEREG:
2835			for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) {
2836				rtlphy->rfreg_chnlval[rfpath] =
2837					((rtlphy->rfreg_chnlval[rfpath] &
2838					0xffffff00) | currentcmd->para2);
2839				if (rtlpriv->rtlhal.current_bandtype ==
2840				    BAND_ON_5G) {
2841					if (currentcmd->para2 > 99)
2842						rtlphy->rfreg_chnlval[rfpath] =
2843						    rtlphy->rfreg_chnlval
2844						    [rfpath] | (BIT(18));
2845					else
2846						rtlphy->rfreg_chnlval[rfpath] =
2847						    rtlphy->rfreg_chnlval
2848						    [rfpath] & (~BIT(18));
2849					rtlphy->rfreg_chnlval[rfpath] |=
2850						 (BIT(16) | BIT(8));
2851				} else {
2852					rtlphy->rfreg_chnlval[rfpath] &=
2853						~(BIT(8) | BIT(16) | BIT(18));
2854				}
2855				rtl_set_rfreg(hw, (enum radio_path)rfpath,
2856					      currentcmd->para1,
2857					      RFREG_OFFSET_MASK,
2858					      rtlphy->rfreg_chnlval[rfpath]);
2859				_rtl92d_phy_reload_imr_setting(hw, channel,
2860							       rfpath);
2861			}
2862			_rtl92d_phy_switch_rf_setting(hw, channel);
2863			/* do IQK when all parameters are ready */
2864			rtl92d_phy_reload_iqk_setting(hw, channel);
2865			break;
2866		default:
2867			RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2868				 "switch case not processed\n");
2869			break;
2870		}
2871		break;
2872	} while (true);
2873	(*delay) = currentcmd->msdelay;
2874	(*step)++;
2875	return false;
2876}
2877
2878u8 rtl92d_phy_sw_chnl(struct ieee80211_hw *hw)
2879{
2880	struct rtl_priv *rtlpriv = rtl_priv(hw);
2881	struct rtl_phy *rtlphy = &(rtlpriv->phy);
2882	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2883	u32 delay;
2884	u32 timeout = 1000, timecount = 0;
2885	u8 channel = rtlphy->current_channel;
2886	u32 ret_value;
2887
2888	if (rtlphy->sw_chnl_inprogress)
2889		return 0;
2890	if (rtlphy->set_bwmode_inprogress)
2891		return 0;
2892
2893	if ((is_hal_stop(rtlhal)) || (RT_CANNOT_IO(hw))) {
2894		RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
2895			 "sw_chnl_inprogress false driver sleep or unload\n");
2896		return 0;
2897	}
2898	while (rtlphy->lck_inprogress && timecount < timeout) {
2899		mdelay(50);
2900		timecount += 50;
2901	}
2902	if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY &&
2903	    rtlhal->bandset == BAND_ON_BOTH) {
2904		ret_value = rtl_get_bbreg(hw, RFPGA0_XAB_RFPARAMETER,
2905					  MASKDWORD);
2906		if (rtlphy->current_channel > 14 && !(ret_value & BIT(0)))
2907			rtl92d_phy_switch_wirelessband(hw, BAND_ON_5G);
2908		else if (rtlphy->current_channel <= 14 && (ret_value & BIT(0)))
2909			rtl92d_phy_switch_wirelessband(hw, BAND_ON_2_4G);
2910	}
2911	switch (rtlhal->current_bandtype) {
2912	case BAND_ON_5G:
2913		/* Get first channel error when change between
2914		 * 5G and 2.4G band. */
2915		if (channel <= 14)
2916			return 0;
2917		RT_ASSERT((channel > 14), "5G but channel<=14\n");
2918		break;
2919	case BAND_ON_2_4G:
2920		/* Get first channel error when change between
2921		 * 5G and 2.4G band. */
2922		if (channel > 14)
2923			return 0;
2924		RT_ASSERT((channel <= 14), "2G but channel>14\n");
2925		break;
2926	default:
2927		RT_ASSERT(false, "Invalid WirelessMode(%#x)!!\n",
2928			  rtlpriv->mac80211.mode);
2929		break;
2930	}
2931	rtlphy->sw_chnl_inprogress = true;
2932	if (channel == 0)
2933		channel = 1;
2934	rtlphy->sw_chnl_stage = 0;
2935	rtlphy->sw_chnl_step = 0;
2936	RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
2937		 "switch to channel%d\n", rtlphy->current_channel);
2938
2939	do {
2940		if (!rtlphy->sw_chnl_inprogress)
2941			break;
2942		if (!_rtl92d_phy_sw_chnl_step_by_step(hw,
2943						      rtlphy->current_channel,
2944		    &rtlphy->sw_chnl_stage, &rtlphy->sw_chnl_step, &delay)) {
2945			if (delay > 0)
2946				mdelay(delay);
2947			else
2948				continue;
2949		} else {
2950			rtlphy->sw_chnl_inprogress = false;
2951		}
2952		break;
2953	} while (true);
2954	RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "<==\n");
2955	rtlphy->sw_chnl_inprogress = false;
2956	return 1;
2957}
2958
2959static void rtl92d_phy_set_io(struct ieee80211_hw *hw)
2960{
2961	struct rtl_priv *rtlpriv = rtl_priv(hw);
2962	struct dig_t *de_digtable = &rtlpriv->dm_digtable;
2963	struct rtl_phy *rtlphy = &(rtlpriv->phy);
2964
2965	RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
2966		 "--->Cmd(%#x), set_io_inprogress(%d)\n",
2967		 rtlphy->current_io_type, rtlphy->set_io_inprogress);
2968	switch (rtlphy->current_io_type) {
2969	case IO_CMD_RESUME_DM_BY_SCAN:
2970		de_digtable->cur_igvalue = rtlphy->initgain_backup.xaagccore1;
2971		rtl92d_dm_write_dig(hw);
2972		rtl92d_phy_set_txpower_level(hw, rtlphy->current_channel);
2973		break;
2974	case IO_CMD_PAUSE_DM_BY_SCAN:
2975		rtlphy->initgain_backup.xaagccore1 = de_digtable->cur_igvalue;
2976		de_digtable->cur_igvalue = 0x37;
2977		rtl92d_dm_write_dig(hw);
2978		break;
2979	default:
2980		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2981			 "switch case not processed\n");
2982		break;
2983	}
2984	rtlphy->set_io_inprogress = false;
2985	RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "<---(%#x)\n",
2986		 rtlphy->current_io_type);
2987}
2988
2989bool rtl92d_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
2990{
2991	struct rtl_priv *rtlpriv = rtl_priv(hw);
2992	struct rtl_phy *rtlphy = &(rtlpriv->phy);
2993	bool postprocessing = false;
2994
2995	RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
2996		 "-->IO Cmd(%#x), set_io_inprogress(%d)\n",
2997		 iotype, rtlphy->set_io_inprogress);
2998	do {
2999		switch (iotype) {
3000		case IO_CMD_RESUME_DM_BY_SCAN:
3001			RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
3002				 "[IO CMD] Resume DM after scan\n");
3003			postprocessing = true;
3004			break;
3005		case IO_CMD_PAUSE_DM_BY_SCAN:
3006			RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
3007				 "[IO CMD] Pause DM before scan\n");
3008			postprocessing = true;
3009			break;
3010		default:
3011			RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3012				 "switch case not processed\n");
3013			break;
3014		}
3015	} while (false);
3016	if (postprocessing && !rtlphy->set_io_inprogress) {
3017		rtlphy->set_io_inprogress = true;
3018		rtlphy->current_io_type = iotype;
3019	} else {
3020		return false;
3021	}
3022	rtl92d_phy_set_io(hw);
3023	RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "<--IO Type(%#x)\n", iotype);
3024	return true;
3025}
3026
3027static void _rtl92d_phy_set_rfon(struct ieee80211_hw *hw)
3028{
3029	struct rtl_priv *rtlpriv = rtl_priv(hw);
3030
3031	/* a.  SYS_CLKR 0x08[11] = 1  restore MAC clock */
3032	/* b.  SPS_CTRL 0x11[7:0] = 0x2b */
3033	if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY)
3034		rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b);
3035	/* c.  For PCIE: SYS_FUNC_EN 0x02[7:0] = 0xE3 enable BB TRX function */
3036	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3037	/* RF_ON_EXCEP(d~g): */
3038	/* d.  APSD_CTRL 0x600[7:0] = 0x00 */
3039	rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);
3040	/* e.  SYS_FUNC_EN 0x02[7:0] = 0xE2  reset BB TRX function again */
3041	/* f.  SYS_FUNC_EN 0x02[7:0] = 0xE3  enable BB TRX function*/
3042	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3043	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3044	/* g.   txpause 0x522[7:0] = 0x00  enable mac tx queue */
3045	rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
3046}
3047
3048static void _rtl92d_phy_set_rfsleep(struct ieee80211_hw *hw)
3049{
3050	struct rtl_priv *rtlpriv = rtl_priv(hw);
3051	u32 u4btmp;
3052	u8 delay = 5;
3053
3054	/* a.   TXPAUSE 0x522[7:0] = 0xFF  Pause MAC TX queue  */
3055	rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
3056	/* b.   RF path 0 offset 0x00 = 0x00  disable RF  */
3057	rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
3058	/* c.   APSD_CTRL 0x600[7:0] = 0x40 */
3059	rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40);
3060	/* d. APSD_CTRL 0x600[7:0] = 0x00
3061	 * APSD_CTRL 0x600[7:0] = 0x00
3062	 * RF path 0 offset 0x00 = 0x00
3063	 * APSD_CTRL 0x600[7:0] = 0x40
3064	 * */
3065	u4btmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK);
3066	while (u4btmp != 0 && delay > 0) {
3067		rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x0);
3068		rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
3069		rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40);
3070		u4btmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK);
3071		delay--;
3072	}
3073	if (delay == 0) {
3074		/* Jump out the LPS turn off sequence to RF_ON_EXCEP */
3075		rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);
3076
3077		rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3078		rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3079		rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
3080		RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
3081			 "Fail !!! Switch RF timeout\n");
3082		return;
3083	}
3084	/* e.   For PCIE: SYS_FUNC_EN 0x02[7:0] = 0xE2 reset BB TRX function */
3085	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3086	/* f.   SPS_CTRL 0x11[7:0] = 0x22 */
3087	if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY)
3088		rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22);
3089	/* g.    SYS_CLKR 0x08[11] = 0  gated MAC clock */
3090}
3091
3092bool rtl92d_phy_set_rf_power_state(struct ieee80211_hw *hw,
3093				   enum rf_pwrstate rfpwr_state)
3094{
3095
3096	bool bresult = true;
3097	struct rtl_priv *rtlpriv = rtl_priv(hw);
3098	struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
3099	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3100	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
3101	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
3102	u8 i, queue_id;
3103	struct rtl8192_tx_ring *ring = NULL;
3104
3105	if (rfpwr_state == ppsc->rfpwr_state)
3106		return false;
3107	switch (rfpwr_state) {
3108	case ERFON:
3109		if ((ppsc->rfpwr_state == ERFOFF) &&
3110		    RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
3111			bool rtstatus;
3112			u32 InitializeCount = 0;
3113			do {
3114				InitializeCount++;
3115				RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3116					 "IPS Set eRf nic enable\n");
3117				rtstatus = rtl_ps_enable_nic(hw);
3118			} while (!rtstatus && (InitializeCount < 10));
3119
3120			RT_CLEAR_PS_LEVEL(ppsc,
3121					  RT_RF_OFF_LEVL_HALT_NIC);
3122		} else {
3123			RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
3124				 "awake, sleeped:%d ms state_inap:%x\n",
3125				 jiffies_to_msecs(jiffies -
3126						  ppsc->last_sleep_jiffies),
3127				 rtlpriv->psc.state_inap);
3128			ppsc->last_awake_jiffies = jiffies;
3129			_rtl92d_phy_set_rfon(hw);
3130		}
3131
3132		if (mac->link_state == MAC80211_LINKED)
3133			rtlpriv->cfg->ops->led_control(hw,
3134					 LED_CTL_LINK);
3135		else
3136			rtlpriv->cfg->ops->led_control(hw,
3137					 LED_CTL_NO_LINK);
3138		break;
3139	case ERFOFF:
3140		if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
3141			RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3142				 "IPS Set eRf nic disable\n");
3143			rtl_ps_disable_nic(hw);
3144			RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
3145		} else {
3146			if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS)
3147				rtlpriv->cfg->ops->led_control(hw,
3148						 LED_CTL_NO_LINK);
3149			else
3150				rtlpriv->cfg->ops->led_control(hw,
3151						 LED_CTL_POWER_OFF);
3152		}
3153		break;
3154	case ERFSLEEP:
3155		if (ppsc->rfpwr_state == ERFOFF)
3156			return false;
3157
3158		for (queue_id = 0, i = 0;
3159		     queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
3160			ring = &pcipriv->dev.tx_ring[queue_id];
3161			if (skb_queue_len(&ring->queue) == 0 ||
3162			    queue_id == BEACON_QUEUE) {
3163				queue_id++;
3164				continue;
3165			} else if (rtlpci->pdev->current_state != PCI_D0) {
3166				RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
3167					 "eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 but lower power state!\n",
3168					 i + 1, queue_id);
3169				break;
3170			} else {
3171				RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3172					 "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
3173					 i + 1, queue_id,
3174					 skb_queue_len(&ring->queue));
3175				udelay(10);
3176				i++;
3177			}
3178
3179			if (i >= MAX_DOZE_WAITING_TIMES_9x) {
3180				RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3181					 "ERFOFF: %d times TcbBusyQueue[%d] = %d !\n",
3182					 MAX_DOZE_WAITING_TIMES_9x, queue_id,
3183					 skb_queue_len(&ring->queue));
3184				break;
3185			}
3186		}
3187		RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
3188			 "Set rfsleep awaked:%d ms\n",
3189			 jiffies_to_msecs(jiffies - ppsc->last_awake_jiffies));
3190		RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
3191			 "sleep awaked:%d ms state_inap:%x\n",
3192			 jiffies_to_msecs(jiffies -
3193					  ppsc->last_awake_jiffies),
3194			 rtlpriv->psc.state_inap);
3195		ppsc->last_sleep_jiffies = jiffies;
3196		_rtl92d_phy_set_rfsleep(hw);
3197		break;
3198	default:
3199		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3200			 "switch case not processed\n");
3201		bresult = false;
3202		break;
3203	}
3204	if (bresult)
3205		ppsc->rfpwr_state = rfpwr_state;
3206	return bresult;
3207}
3208
3209void rtl92d_phy_config_macphymode(struct ieee80211_hw *hw)
3210{
3211	struct rtl_priv *rtlpriv = rtl_priv(hw);
3212	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3213	u8 offset = REG_MAC_PHY_CTRL_NORMAL;
3214
3215	switch (rtlhal->macphymode) {
3216	case DUALMAC_DUALPHY:
3217		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3218			 "MacPhyMode: DUALMAC_DUALPHY\n");
3219		rtl_write_byte(rtlpriv, offset, 0xF3);
3220		break;
3221	case SINGLEMAC_SINGLEPHY:
3222		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3223			 "MacPhyMode: SINGLEMAC_SINGLEPHY\n");
3224		rtl_write_byte(rtlpriv, offset, 0xF4);
3225		break;
3226	case DUALMAC_SINGLEPHY:
3227		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3228			 "MacPhyMode: DUALMAC_SINGLEPHY\n");
3229		rtl_write_byte(rtlpriv, offset, 0xF1);
3230		break;
3231	}
3232}
3233
3234void rtl92d_phy_config_macphymode_info(struct ieee80211_hw *hw)
3235{
3236	struct rtl_priv *rtlpriv = rtl_priv(hw);
3237	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3238	struct rtl_phy *rtlphy = &(rtlpriv->phy);
3239
3240	switch (rtlhal->macphymode) {
3241	case DUALMAC_SINGLEPHY:
3242		rtlphy->rf_type = RF_2T2R;
3243		rtlhal->version |= RF_TYPE_2T2R;
3244		rtlhal->bandset = BAND_ON_BOTH;
3245		rtlhal->current_bandtype = BAND_ON_2_4G;
3246		break;
3247
3248	case SINGLEMAC_SINGLEPHY:
3249		rtlphy->rf_type = RF_2T2R;
3250		rtlhal->version |= RF_TYPE_2T2R;
3251		rtlhal->bandset = BAND_ON_BOTH;
3252		rtlhal->current_bandtype = BAND_ON_2_4G;
3253		break;
3254
3255	case DUALMAC_DUALPHY:
3256		rtlphy->rf_type = RF_1T1R;
3257		rtlhal->version &= RF_TYPE_1T1R;
3258		/* Now we let MAC0 run on 5G band. */
3259		if (rtlhal->interfaceindex == 0) {
3260			rtlhal->bandset = BAND_ON_5G;
3261			rtlhal->current_bandtype = BAND_ON_5G;
3262		} else {
3263			rtlhal->bandset = BAND_ON_2_4G;
3264			rtlhal->current_bandtype = BAND_ON_2_4G;
3265		}
3266		break;
3267	default:
3268		break;
3269	}
3270}
3271
3272u8 rtl92d_get_chnlgroup_fromarray(u8 chnl)
3273{
3274	u8 group;
3275	u8 channel_info[59] = {
3276		1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
3277		36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56,
3278		58, 60, 62, 64, 100, 102, 104, 106, 108,
3279		110, 112, 114, 116, 118, 120, 122, 124,
3280		126, 128, 130, 132, 134, 136, 138, 140,
3281		149, 151, 153, 155, 157, 159, 161, 163,
3282		165
3283	};
3284
3285	if (channel_info[chnl] <= 3)
3286		group = 0;
3287	else if (channel_info[chnl] <= 9)
3288		group = 1;
3289	else if (channel_info[chnl] <= 14)
3290		group = 2;
3291	else if (channel_info[chnl] <= 44)
3292		group = 3;
3293	else if (channel_info[chnl] <= 54)
3294		group = 4;
3295	else if (channel_info[chnl] <= 64)
3296		group = 5;
3297	else if (channel_info[chnl] <= 112)
3298		group = 6;
3299	else if (channel_info[chnl] <= 126)
3300		group = 7;
3301	else if (channel_info[chnl] <= 140)
3302		group = 8;
3303	else if (channel_info[chnl] <= 153)
3304		group = 9;
3305	else if (channel_info[chnl] <= 159)
3306		group = 10;
3307	else
3308		group = 11;
3309	return group;
3310}
3311
3312void rtl92d_phy_set_poweron(struct ieee80211_hw *hw)
3313{
3314	struct rtl_priv *rtlpriv = rtl_priv(hw);
3315	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3316	unsigned long flags;
3317	u8 value8;
3318	u16 i;
3319	u32 mac_reg = (rtlhal->interfaceindex == 0 ? REG_MAC0 : REG_MAC1);
3320
3321	/* notice fw know band status  0x81[1]/0x53[1] = 0: 5G, 1: 2G */
3322	if (rtlhal->current_bandtype == BAND_ON_2_4G) {
3323		value8 = rtl_read_byte(rtlpriv, mac_reg);
3324		value8 |= BIT(1);
3325		rtl_write_byte(rtlpriv, mac_reg, value8);
3326	} else {
3327		value8 = rtl_read_byte(rtlpriv, mac_reg);
3328		value8 &= (~BIT(1));
3329		rtl_write_byte(rtlpriv, mac_reg, value8);
3330	}
3331
3332	if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY) {
3333		value8 = rtl_read_byte(rtlpriv, REG_MAC0);
3334		rtl_write_byte(rtlpriv, REG_MAC0, value8 | MAC0_ON);
3335	} else {
3336		spin_lock_irqsave(&globalmutex_power, flags);
3337		if (rtlhal->interfaceindex == 0) {
3338			value8 = rtl_read_byte(rtlpriv, REG_MAC0);
3339			rtl_write_byte(rtlpriv, REG_MAC0, value8 | MAC0_ON);
3340		} else {
3341			value8 = rtl_read_byte(rtlpriv, REG_MAC1);
3342			rtl_write_byte(rtlpriv, REG_MAC1, value8 | MAC1_ON);
3343		}
3344		value8 = rtl_read_byte(rtlpriv, REG_POWER_OFF_IN_PROCESS);
3345		spin_unlock_irqrestore(&globalmutex_power, flags);
3346		for (i = 0; i < 200; i++) {
3347			if ((value8 & BIT(7)) == 0) {
3348				break;
3349			} else {
3350				udelay(500);
3351				spin_lock_irqsave(&globalmutex_power, flags);
3352				value8 = rtl_read_byte(rtlpriv,
3353						    REG_POWER_OFF_IN_PROCESS);
3354				spin_unlock_irqrestore(&globalmutex_power,
3355						       flags);
3356			}
3357		}
3358		if (i == 200)
3359			RT_ASSERT(false, "Another mac power off over time\n");
3360	}
3361}
3362
3363void rtl92d_phy_config_maccoexist_rfpage(struct ieee80211_hw *hw)
3364{
3365	struct rtl_priv *rtlpriv = rtl_priv(hw);
3366
3367	switch (rtlpriv->rtlhal.macphymode) {
3368	case DUALMAC_DUALPHY:
3369		rtl_write_byte(rtlpriv, REG_DMC, 0x0);
3370		rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x08);
3371		rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, 0x13ff);
3372		break;
3373	case DUALMAC_SINGLEPHY:
3374		rtl_write_byte(rtlpriv, REG_DMC, 0xf8);
3375		rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x08);
3376		rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, 0x13ff);
3377		break;
3378	case SINGLEMAC_SINGLEPHY:
3379		rtl_write_byte(rtlpriv, REG_DMC, 0x0);
3380		rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x10);
3381		rtl_write_word(rtlpriv, (REG_TRXFF_BNDY + 2), 0x27FF);
3382		break;
3383	default:
3384		break;
3385	}
3386}
3387
3388void rtl92d_update_bbrf_configuration(struct ieee80211_hw *hw)
3389{
3390	struct rtl_priv *rtlpriv = rtl_priv(hw);
3391	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3392	struct rtl_phy *rtlphy = &(rtlpriv->phy);
3393	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
3394	u8 rfpath, i;
3395
3396	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "==>\n");
3397	/* r_select_5G for path_A/B 0 for 2.4G, 1 for 5G */
3398	if (rtlhal->current_bandtype == BAND_ON_2_4G) {
3399		/* r_select_5G for path_A/B,0x878 */
3400		rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(0), 0x0);
3401		rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15), 0x0);
3402		if (rtlhal->macphymode != DUALMAC_DUALPHY) {
3403			rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(16), 0x0);
3404			rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(31), 0x0);
3405		}
3406		/* rssi_table_select:index 0 for 2.4G.1~3 for 5G,0xc78 */
3407		rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, BIT(6) | BIT(7), 0x0);
3408		/* fc_area  0xd2c */
3409		rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(14) | BIT(13), 0x0);
3410		/* 5G LAN ON */
3411		rtl_set_bbreg(hw, 0xB30, 0x00F00000, 0xa);
3412		/* TX BB gain shift*1,Just for testchip,0xc80,0xc88 */
3413		rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, MASKDWORD,
3414			      0x40000100);
3415		rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, MASKDWORD,
3416			      0x40000100);
3417		if (rtlhal->macphymode == DUALMAC_DUALPHY) {
3418			rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3419				      BIT(10) | BIT(6) | BIT(5),
3420				      ((rtlefuse->eeprom_c9 & BIT(3)) >> 3) |
3421				      (rtlefuse->eeprom_c9 & BIT(1)) |
3422				      ((rtlefuse->eeprom_cc & BIT(1)) << 4));
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_XAB_RFPARAMETER, BIT(15), 0);
3429		} else {
3430			rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3431				      BIT(26) | BIT(22) | BIT(21) | BIT(10) |
3432				      BIT(6) | BIT(5),
3433				      ((rtlefuse->eeprom_c9 & BIT(3)) >> 3) |
3434				      (rtlefuse->eeprom_c9 & BIT(1)) |
3435				      ((rtlefuse->eeprom_cc & BIT(1)) << 4) |
3436				      ((rtlefuse->eeprom_c9 & BIT(7)) << 9) |
3437				      ((rtlefuse->eeprom_c9 & BIT(5)) << 12) |
3438				      ((rtlefuse->eeprom_cc & BIT(3)) << 18));
3439			rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
3440				      BIT(10) | BIT(6) | BIT(5),
3441				      ((rtlefuse->eeprom_c9 & BIT(2)) >> 2) |
3442				      ((rtlefuse->eeprom_c9 & BIT(0)) << 1) |
3443				      ((rtlefuse->eeprom_cc & BIT(0)) << 5));
3444			rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
3445				      BIT(10) | BIT(6) | BIT(5),
3446				      ((rtlefuse->eeprom_c9 & BIT(6)) >> 6) |
3447				      ((rtlefuse->eeprom_c9 & BIT(4)) >> 3) |
3448				      ((rtlefuse->eeprom_cc & BIT(2)) << 3));
3449			rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER,
3450				      BIT(31) | BIT(15), 0);
3451		}
3452		/* 1.5V_LDO */
3453	} else {
3454		/* r_select_5G for path_A/B */
3455		rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(0), 0x1);
3456		rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15), 0x1);
3457		if (rtlhal->macphymode != DUALMAC_DUALPHY) {
3458			rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(16), 0x1);
3459			rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(31), 0x1);
3460		}
3461		/* rssi_table_select:index 0 for 2.4G.1~3 for 5G */
3462		rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, BIT(6) | BIT(7), 0x1);
3463		/* fc_area */
3464		rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(14) | BIT(13), 0x1);
3465		/* 5G LAN ON */
3466		rtl_set_bbreg(hw, 0xB30, 0x00F00000, 0x0);
3467		/* TX BB gain shift,Just for testchip,0xc80,0xc88 */
3468		if (rtlefuse->internal_pa_5g[0])
3469			rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, MASKDWORD,
3470				      0x2d4000b5);
3471		else
3472			rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, MASKDWORD,
3473				      0x20000080);
3474		if (rtlefuse->internal_pa_5g[1])
3475			rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, MASKDWORD,
3476				      0x2d4000b5);
3477		else
3478			rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, MASKDWORD,
3479				      0x20000080);
3480		if (rtlhal->macphymode == DUALMAC_DUALPHY) {
3481			rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3482				      BIT(10) | BIT(6) | BIT(5),
3483				      (rtlefuse->eeprom_cc & BIT(5)));
3484			rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(10),
3485				      ((rtlefuse->eeprom_cc & BIT(4)) >> 4));
3486			rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15),
3487				      (rtlefuse->eeprom_cc & BIT(4)) >> 4);
3488		} else {
3489			rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3490				      BIT(26) | BIT(22) | BIT(21) | BIT(10) |
3491				      BIT(6) | BIT(5),
3492				      (rtlefuse->eeprom_cc & BIT(5)) |
3493				      ((rtlefuse->eeprom_cc & BIT(7)) << 14));
3494			rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(10),
3495				      ((rtlefuse->eeprom_cc & BIT(4)) >> 4));
3496			rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, BIT(10),
3497				      ((rtlefuse->eeprom_cc & BIT(6)) >> 6));
3498			rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER,
3499				      BIT(31) | BIT(15),
3500				      ((rtlefuse->eeprom_cc & BIT(4)) >> 4) |
3501				      ((rtlefuse->eeprom_cc & BIT(6)) << 10));
3502		}
3503	}
3504	/* update IQK related settings */
3505	rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, MASKDWORD, 0x40000100);
3506	rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, MASKDWORD, 0x40000100);
3507	rtl_set_bbreg(hw, ROFDM0_XCTxAFE, 0xF0000000, 0x00);
3508	rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(30) | BIT(28) |
3509		      BIT(26) | BIT(24), 0x00);
3510	rtl_set_bbreg(hw, ROFDM0_XDTxAFE, 0xF0000000, 0x00);
3511	rtl_set_bbreg(hw, 0xca0, 0xF0000000, 0x00);
3512	rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0x0000F000, 0x00);
3513
3514	/* Update RF */
3515	for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
3516	     rfpath++) {
3517		if (rtlhal->current_bandtype == BAND_ON_2_4G) {
3518			/* MOD_AG for RF paht_A 0x18 BIT8,BIT16 */
3519			rtl_set_rfreg(hw, rfpath, RF_CHNLBW, BIT(8) | BIT(16) |
3520				      BIT(18), 0);
3521			/* RF0x0b[16:14] =3b'111 */
3522			rtl_set_rfreg(hw, (enum radio_path)rfpath, 0x0B,
3523				      0x1c000, 0x07);
3524		} else {
3525			/* MOD_AG for RF paht_A 0x18 BIT8,BIT16 */
3526			rtl_set_rfreg(hw, rfpath, RF_CHNLBW, BIT(8) |
3527				      BIT(16) | BIT(18),
3528				      (BIT(16) | BIT(8)) >> 8);
3529		}
3530	}
3531	/* Update for all band. */
3532	/* DMDP */
3533	if (rtlphy->rf_type == RF_1T1R) {
3534		/* Use antenna 0,0xc04,0xd04 */
3535		rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKBYTE0, 0x11);
3536		rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE, BDWORD, 0x1);
3537
3538		/* enable ad/da clock1 for dual-phy reg0x888 */
3539		if (rtlhal->interfaceindex == 0) {
3540			rtl_set_bbreg(hw, RFPGA0_ADDALLOCKEN, BIT(12) |
3541				      BIT(13), 0x3);
3542		} else {
3543			rtl92d_phy_enable_anotherphy(hw, false);
3544			RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3545				 "MAC1 use DBI to update 0x888\n");
3546			/* 0x888 */
3547			rtl92de_write_dword_dbi(hw, RFPGA0_ADDALLOCKEN,
3548						rtl92de_read_dword_dbi(hw,
3549						RFPGA0_ADDALLOCKEN,
3550						BIT(3)) | BIT(12) | BIT(13),
3551						BIT(3));
3552			rtl92d_phy_powerdown_anotherphy(hw, false);
3553		}
3554	} else {
3555		/* Single PHY */
3556		/* Use antenna 0 & 1,0xc04,0xd04 */
3557		rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKBYTE0, 0x33);
3558		rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE, BDWORD, 0x3);
3559		/* disable ad/da clock1,0x888 */
3560		rtl_set_bbreg(hw, RFPGA0_ADDALLOCKEN, BIT(12) | BIT(13), 0);
3561	}
3562	for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
3563	     rfpath++) {
3564		rtlphy->rfreg_chnlval[rfpath] = rtl_get_rfreg(hw, rfpath,
3565						RF_CHNLBW, RFREG_OFFSET_MASK);
3566		rtlphy->reg_rf3c[rfpath] = rtl_get_rfreg(hw, rfpath, 0x3C,
3567			RFREG_OFFSET_MASK);
3568	}
3569	for (i = 0; i < 2; i++)
3570		RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "RF 0x18 = 0x%x\n",
3571			 rtlphy->rfreg_chnlval[i]);
3572	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "<==\n");
3573
3574}
3575
3576bool rtl92d_phy_check_poweroff(struct ieee80211_hw *hw)
3577{
3578	struct rtl_priv *rtlpriv = rtl_priv(hw);
3579	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3580	u8 u1btmp;
3581	unsigned long flags;
3582
3583	if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY) {
3584		u1btmp = rtl_read_byte(rtlpriv, REG_MAC0);
3585		rtl_write_byte(rtlpriv, REG_MAC0, u1btmp & (~MAC0_ON));
3586		return true;
3587	}
3588	spin_lock_irqsave(&globalmutex_power, flags);
3589	if (rtlhal->interfaceindex == 0) {
3590		u1btmp = rtl_read_byte(rtlpriv, REG_MAC0);
3591		rtl_write_byte(rtlpriv, REG_MAC0, u1btmp & (~MAC0_ON));
3592		u1btmp = rtl_read_byte(rtlpriv, REG_MAC1);
3593		u1btmp &= MAC1_ON;
3594	} else {
3595		u1btmp = rtl_read_byte(rtlpriv, REG_MAC1);
3596		rtl_write_byte(rtlpriv, REG_MAC1, u1btmp & (~MAC1_ON));
3597		u1btmp = rtl_read_byte(rtlpriv, REG_MAC0);
3598		u1btmp &= MAC0_ON;
3599	}
3600	if (u1btmp) {
3601		spin_unlock_irqrestore(&globalmutex_power, flags);
3602		return false;
3603	}
3604	u1btmp = rtl_read_byte(rtlpriv, REG_POWER_OFF_IN_PROCESS);
3605	u1btmp |= BIT(7);
3606	rtl_write_byte(rtlpriv, REG_POWER_OFF_IN_PROCESS, u1btmp);
3607	spin_unlock_irqrestore(&globalmutex_power, flags);
3608	return true;
3609}
3610