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