1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2009-2010  Realtek Corporation.*/
3 
4 #include "../wifi.h"
5 #include "../pci.h"
6 #include "../ps.h"
7 #include "reg.h"
8 #include "def.h"
9 #include "phy.h"
10 #include "rf.h"
11 #include "dm.h"
12 #include "table.h"
13 #include "trx.h"
14 #include "../btcoexist/halbt_precomp.h"
15 #include "hw.h"
16 #include "../efuse.h"
17 
18 #define READ_NEXT_PAIR(array_table, v1, v2, i) \
19 	do { \
20 		i += 2; \
21 		v1 = array_table[i]; \
22 		v2 = array_table[i+1]; \
23 	} while (0)
24 
25 static u32 _rtl8821ae_phy_rf_serial_read(struct ieee80211_hw *hw,
26 					 enum radio_path rfpath, u32 offset);
27 static void _rtl8821ae_phy_rf_serial_write(struct ieee80211_hw *hw,
28 					   enum radio_path rfpath, u32 offset,
29 					   u32 data);
30 static bool _rtl8821ae_phy_bb8821a_config_parafile(struct ieee80211_hw *hw);
31 /*static bool _rtl8812ae_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);*/
32 static bool _rtl8821ae_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);
33 static bool _rtl8821ae_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
34 						     u8 configtype);
35 static bool _rtl8821ae_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
36 						       u8 configtype);
37 static void phy_init_bb_rf_register_definition(struct ieee80211_hw *hw);
38 
39 static long _rtl8821ae_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
40 					    enum wireless_mode wirelessmode,
41 					    u8 txpwridx);
42 static void rtl8821ae_phy_set_rf_on(struct ieee80211_hw *hw);
43 static void rtl8821ae_phy_set_io(struct ieee80211_hw *hw);
44 
rtl8812ae_fixspur(struct ieee80211_hw * hw,enum ht_channel_width band_width,u8 channel)45 static void rtl8812ae_fixspur(struct ieee80211_hw *hw,
46 			      enum ht_channel_width band_width, u8 channel)
47 {
48 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
49 
50 	/*C cut Item12 ADC FIFO CLOCK*/
51 	if (IS_VENDOR_8812A_C_CUT(rtlhal->version)) {
52 		if (band_width == HT_CHANNEL_WIDTH_20_40 && channel == 11)
53 			rtl_set_bbreg(hw, RRFMOD, 0xC00, 0x3);
54 			/* 0x8AC[11:10] = 2'b11*/
55 		else
56 			rtl_set_bbreg(hw, RRFMOD, 0xC00, 0x2);
57 			/* 0x8AC[11:10] = 2'b10*/
58 
59 		/* <20120914, Kordan> A workaround to resolve
60 		 * 2480Mhz spur by setting ADC clock as 160M. (Asked by Binson)
61 		 */
62 		if (band_width == HT_CHANNEL_WIDTH_20 &&
63 		    (channel == 13 || channel == 14)) {
64 			rtl_set_bbreg(hw, RRFMOD, 0x300, 0x3);
65 			/*0x8AC[9:8] = 2'b11*/
66 			rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 1);
67 			/* 0x8C4[30] = 1*/
68 		} else if (band_width == HT_CHANNEL_WIDTH_20_40 &&
69 			   channel == 11) {
70 			rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 1);
71 			/*0x8C4[30] = 1*/
72 		} else if (band_width != HT_CHANNEL_WIDTH_80) {
73 			rtl_set_bbreg(hw, RRFMOD, 0x300, 0x2);
74 			/*0x8AC[9:8] = 2'b10*/
75 			rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 0);
76 			/*0x8C4[30] = 0*/
77 		}
78 	} else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
79 		/* <20120914, Kordan> A workaround to resolve
80 		 * 2480Mhz spur by setting ADC clock as 160M.
81 		 */
82 		if (band_width == HT_CHANNEL_WIDTH_20 &&
83 		    (channel == 13 || channel == 14))
84 			rtl_set_bbreg(hw, RRFMOD, 0x300, 0x3);
85 			/*0x8AC[9:8] = 11*/
86 		else if (channel  <= 14) /*2.4G only*/
87 			rtl_set_bbreg(hw, RRFMOD, 0x300, 0x2);
88 			/*0x8AC[9:8] = 10*/
89 	}
90 }
91 
rtl8821ae_phy_query_bb_reg(struct ieee80211_hw * hw,u32 regaddr,u32 bitmask)92 u32 rtl8821ae_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr,
93 			       u32 bitmask)
94 {
95 	struct rtl_priv *rtlpriv = rtl_priv(hw);
96 	u32 returnvalue, originalvalue, bitshift;
97 
98 	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
99 		"regaddr(%#x), bitmask(%#x)\n",
100 		regaddr, bitmask);
101 	originalvalue = rtl_read_dword(rtlpriv, regaddr);
102 	bitshift = calculate_bit_shift(bitmask);
103 	returnvalue = (originalvalue & bitmask) >> bitshift;
104 
105 	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
106 		"BBR MASK=0x%x Addr[0x%x]=0x%x\n",
107 		bitmask, regaddr, originalvalue);
108 	return returnvalue;
109 }
110 
rtl8821ae_phy_set_bb_reg(struct ieee80211_hw * hw,u32 regaddr,u32 bitmask,u32 data)111 void rtl8821ae_phy_set_bb_reg(struct ieee80211_hw *hw,
112 			      u32 regaddr, u32 bitmask, u32 data)
113 {
114 	struct rtl_priv *rtlpriv = rtl_priv(hw);
115 	u32 originalvalue, bitshift;
116 
117 	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
118 		"regaddr(%#x), bitmask(%#x), data(%#x)\n",
119 		regaddr, bitmask, data);
120 
121 	if (bitmask != MASKDWORD) {
122 		originalvalue = rtl_read_dword(rtlpriv, regaddr);
123 		bitshift = calculate_bit_shift(bitmask);
124 		data = ((originalvalue & (~bitmask)) |
125 			((data << bitshift) & bitmask));
126 	}
127 
128 	rtl_write_dword(rtlpriv, regaddr, data);
129 
130 	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
131 		"regaddr(%#x), bitmask(%#x), data(%#x)\n",
132 		regaddr, bitmask, data);
133 }
134 
rtl8821ae_phy_query_rf_reg(struct ieee80211_hw * hw,enum radio_path rfpath,u32 regaddr,u32 bitmask)135 u32 rtl8821ae_phy_query_rf_reg(struct ieee80211_hw *hw,
136 			       enum radio_path rfpath, u32 regaddr,
137 			       u32 bitmask)
138 {
139 	struct rtl_priv *rtlpriv = rtl_priv(hw);
140 	u32 original_value, readback_value, bitshift;
141 
142 	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
143 		"regaddr(%#x), rfpath(%#x), bitmask(%#x)\n",
144 		regaddr, rfpath, bitmask);
145 
146 	spin_lock(&rtlpriv->locks.rf_lock);
147 
148 	original_value = _rtl8821ae_phy_rf_serial_read(hw, rfpath, regaddr);
149 	bitshift = calculate_bit_shift(bitmask);
150 	readback_value = (original_value & bitmask) >> bitshift;
151 
152 	spin_unlock(&rtlpriv->locks.rf_lock);
153 
154 	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
155 		"regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n",
156 		regaddr, rfpath, bitmask, original_value);
157 
158 	return readback_value;
159 }
160 
rtl8821ae_phy_set_rf_reg(struct ieee80211_hw * hw,enum radio_path rfpath,u32 regaddr,u32 bitmask,u32 data)161 void rtl8821ae_phy_set_rf_reg(struct ieee80211_hw *hw,
162 			   enum radio_path rfpath,
163 			   u32 regaddr, u32 bitmask, u32 data)
164 {
165 	struct rtl_priv *rtlpriv = rtl_priv(hw);
166 	u32 original_value, bitshift;
167 
168 	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
169 		"regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
170 		regaddr, bitmask, data, rfpath);
171 
172 	spin_lock(&rtlpriv->locks.rf_lock);
173 
174 	if (bitmask != RFREG_OFFSET_MASK) {
175 		original_value =
176 		   _rtl8821ae_phy_rf_serial_read(hw, rfpath, regaddr);
177 		bitshift = calculate_bit_shift(bitmask);
178 		data = ((original_value & (~bitmask)) | (data << bitshift));
179 	}
180 
181 	_rtl8821ae_phy_rf_serial_write(hw, rfpath, regaddr, data);
182 
183 	spin_unlock(&rtlpriv->locks.rf_lock);
184 
185 	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
186 		"regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
187 		 regaddr, bitmask, data, rfpath);
188 }
189 
_rtl8821ae_phy_rf_serial_read(struct ieee80211_hw * hw,enum radio_path rfpath,u32 offset)190 static u32 _rtl8821ae_phy_rf_serial_read(struct ieee80211_hw *hw,
191 					 enum radio_path rfpath, u32 offset)
192 {
193 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
194 	bool is_pi_mode = false;
195 	u32 retvalue = 0;
196 
197 	/* 2009/06/17 MH We can not execute IO for power
198 	save or other accident mode.*/
199 	if (RT_CANNOT_IO(hw)) {
200 		pr_err("return all one\n");
201 		return 0xFFFFFFFF;
202 	}
203 	/* <20120809, Kordan> CCA OFF(when entering),
204 		asked by James to avoid reading the wrong value.
205 	    <20120828, Kordan> Toggling CCA would affect RF 0x0, skip it!*/
206 	if (offset != 0x0 &&
207 	    !((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) ||
208 	    (IS_VENDOR_8812A_C_CUT(rtlhal->version))))
209 		rtl_set_bbreg(hw, RCCAONSEC, 0x8, 1);
210 	offset &= 0xff;
211 
212 	if (rfpath == RF90_PATH_A)
213 		is_pi_mode = (bool)rtl_get_bbreg(hw, 0xC00, 0x4);
214 	else if (rfpath == RF90_PATH_B)
215 		is_pi_mode = (bool)rtl_get_bbreg(hw, 0xE00, 0x4);
216 
217 	rtl_set_bbreg(hw, RHSSIREAD_8821AE, 0xff, offset);
218 
219 	if ((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) ||
220 	    (IS_VENDOR_8812A_C_CUT(rtlhal->version)))
221 		udelay(20);
222 
223 	if (is_pi_mode) {
224 		if (rfpath == RF90_PATH_A)
225 			retvalue =
226 			  rtl_get_bbreg(hw, RA_PIREAD_8821A, BLSSIREADBACKDATA);
227 		else if (rfpath == RF90_PATH_B)
228 			retvalue =
229 			  rtl_get_bbreg(hw, RB_PIREAD_8821A, BLSSIREADBACKDATA);
230 	} else {
231 		if (rfpath == RF90_PATH_A)
232 			retvalue =
233 			  rtl_get_bbreg(hw, RA_SIREAD_8821A, BLSSIREADBACKDATA);
234 		else if (rfpath == RF90_PATH_B)
235 			retvalue =
236 			  rtl_get_bbreg(hw, RB_SIREAD_8821A, BLSSIREADBACKDATA);
237 	}
238 
239 	/*<20120809, Kordan> CCA ON(when exiting),
240 	 * asked by James to avoid reading the wrong value.
241 	 *   <20120828, Kordan> Toggling CCA would affect RF 0x0, skip it!
242 	 */
243 	if (offset != 0x0 &&
244 	    !((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) ||
245 	    (IS_VENDOR_8812A_C_CUT(rtlhal->version))))
246 		rtl_set_bbreg(hw, RCCAONSEC, 0x8, 0);
247 	return retvalue;
248 }
249 
_rtl8821ae_phy_rf_serial_write(struct ieee80211_hw * hw,enum radio_path rfpath,u32 offset,u32 data)250 static void _rtl8821ae_phy_rf_serial_write(struct ieee80211_hw *hw,
251 					   enum radio_path rfpath, u32 offset,
252 					   u32 data)
253 {
254 	struct rtl_priv *rtlpriv = rtl_priv(hw);
255 	struct rtl_phy *rtlphy = &rtlpriv->phy;
256 	struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
257 	u32 data_and_addr;
258 	u32 newoffset;
259 
260 	if (RT_CANNOT_IO(hw)) {
261 		pr_err("stop\n");
262 		return;
263 	}
264 	offset &= 0xff;
265 	newoffset = offset;
266 	data_and_addr = ((newoffset << 20) |
267 			 (data & 0x000fffff)) & 0x0fffffff;
268 	rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr);
269 	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
270 		"RFW-%d Addr[0x%x]=0x%x\n",
271 		rfpath, pphyreg->rf3wire_offset, data_and_addr);
272 }
273 
rtl8821ae_phy_mac_config(struct ieee80211_hw * hw)274 bool rtl8821ae_phy_mac_config(struct ieee80211_hw *hw)
275 {
276 	bool rtstatus = 0;
277 
278 	rtstatus = _rtl8821ae_phy_config_mac_with_headerfile(hw);
279 
280 	return rtstatus;
281 }
282 
rtl8821ae_phy_bb_config(struct ieee80211_hw * hw)283 bool rtl8821ae_phy_bb_config(struct ieee80211_hw *hw)
284 {
285 	bool rtstatus = true;
286 	struct rtl_priv *rtlpriv = rtl_priv(hw);
287 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
288 	struct rtl_phy *rtlphy = &rtlpriv->phy;
289 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
290 	u8 regval;
291 	u8 crystal_cap;
292 
293 	phy_init_bb_rf_register_definition(hw);
294 
295 	regval = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN);
296 	regval |= FEN_PCIEA;
297 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, regval);
298 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN,
299 		       regval | FEN_BB_GLB_RSTN | FEN_BBRSTB);
300 
301 	rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x7);
302 	rtl_write_byte(rtlpriv, REG_OPT_CTRL + 2, 0x7);
303 
304 	rtstatus = _rtl8821ae_phy_bb8821a_config_parafile(hw);
305 
306 	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
307 		crystal_cap = rtlefuse->crystalcap & 0x3F;
308 		rtl_set_bbreg(hw, REG_MAC_PHY_CTRL, 0x7FF80000,
309 			      (crystal_cap | (crystal_cap << 6)));
310 	} else {
311 		crystal_cap = rtlefuse->crystalcap & 0x3F;
312 		rtl_set_bbreg(hw, REG_MAC_PHY_CTRL, 0xFFF000,
313 			      (crystal_cap | (crystal_cap << 6)));
314 	}
315 	rtlphy->reg_837 = rtl_read_byte(rtlpriv, 0x837);
316 
317 	return rtstatus;
318 }
319 
rtl8821ae_phy_rf_config(struct ieee80211_hw * hw)320 bool rtl8821ae_phy_rf_config(struct ieee80211_hw *hw)
321 {
322 	return rtl8821ae_phy_rf6052_config(hw);
323 }
324 
_rtl8812ae_phy_set_rfe_reg_24g(struct ieee80211_hw * hw)325 static void _rtl8812ae_phy_set_rfe_reg_24g(struct ieee80211_hw *hw)
326 {
327 	struct rtl_priv *rtlpriv = rtl_priv(hw);
328 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
329 	u8 tmp;
330 
331 	switch (rtlhal->rfe_type) {
332 	case 3:
333 		rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x54337770);
334 		rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x54337770);
335 		rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x010);
336 		rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010);
337 		rtl_set_bbreg(hw, 0x900, 0x00000303, 0x1);
338 		break;
339 	case 4:
340 		rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x77777777);
341 		rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77777777);
342 		rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x001);
343 		rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x001);
344 		break;
345 	case 5:
346 		rtl_write_byte(rtlpriv, RA_RFE_PINMUX + 2, 0x77);
347 		rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77777777);
348 		tmp = rtl_read_byte(rtlpriv, RA_RFE_INV + 3);
349 		rtl_write_byte(rtlpriv, RA_RFE_INV + 3, tmp & ~0x1);
350 		rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000);
351 		break;
352 	case 1:
353 		if (rtlpriv->btcoexist.bt_coexistence) {
354 			rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xffffff, 0x777777);
355 			rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD,
356 				      0x77777777);
357 			rtl_set_bbreg(hw, RA_RFE_INV, 0x33f00000, 0x000);
358 			rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000);
359 			break;
360 		}
361 		fallthrough;
362 	case 0:
363 	case 2:
364 	default:
365 		rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x77777777);
366 		rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77777777);
367 		rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x000);
368 		rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000);
369 		break;
370 	}
371 }
372 
_rtl8812ae_phy_set_rfe_reg_5g(struct ieee80211_hw * hw)373 static void _rtl8812ae_phy_set_rfe_reg_5g(struct ieee80211_hw *hw)
374 {
375 	struct rtl_priv *rtlpriv = rtl_priv(hw);
376 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
377 	u8 tmp;
378 
379 	switch (rtlhal->rfe_type) {
380 	case 0:
381 		rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x77337717);
382 		rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77337717);
383 		rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x010);
384 		rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010);
385 		break;
386 	case 1:
387 		if (rtlpriv->btcoexist.bt_coexistence) {
388 			rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xffffff, 0x337717);
389 			rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD,
390 				      0x77337717);
391 			rtl_set_bbreg(hw, RA_RFE_INV, 0x33f00000, 0x000);
392 			rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000);
393 		} else {
394 			rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD,
395 				      0x77337717);
396 			rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD,
397 				      0x77337717);
398 			rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x000);
399 			rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000);
400 		}
401 		break;
402 	case 3:
403 		rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x54337717);
404 		rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x54337717);
405 		rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x010);
406 		rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010);
407 		rtl_set_bbreg(hw, 0x900, 0x00000303, 0x1);
408 		break;
409 	case 5:
410 		rtl_write_byte(rtlpriv, RA_RFE_PINMUX + 2, 0x33);
411 		rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77337777);
412 		tmp = rtl_read_byte(rtlpriv, RA_RFE_INV + 3);
413 		rtl_write_byte(rtlpriv, RA_RFE_INV + 3, tmp | 0x1);
414 		rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010);
415 		break;
416 	case 2:
417 	case 4:
418 	default:
419 		rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x77337777);
420 		rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77337777);
421 		rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x010);
422 		rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010);
423 		break;
424 	}
425 }
426 
phy_get_tx_swing_8812A(struct ieee80211_hw * hw,u8 band,u8 rf_path)427 u32 phy_get_tx_swing_8812A(struct ieee80211_hw *hw, u8	band,
428 			   u8 rf_path)
429 {
430 	struct rtl_priv *rtlpriv = rtl_priv(hw);
431 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
432 	struct rtl_dm *rtldm = rtl_dm(rtlpriv);
433 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
434 	s8 reg_swing_2g = -1;/* 0xff; */
435 	s8 reg_swing_5g = -1;/* 0xff; */
436 	s8 swing_2g = -1 * reg_swing_2g;
437 	s8 swing_5g = -1 * reg_swing_5g;
438 	u32  out = 0x200;
439 	const s8 auto_temp = -1;
440 
441 	rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
442 		"===> PHY_GetTXBBSwing_8812A, bbSwing_2G: %d, bbSwing_5G: %d,autoload_failflag=%d.\n",
443 		(int)swing_2g, (int)swing_5g,
444 		(int)rtlefuse->autoload_failflag);
445 
446 	if (rtlefuse->autoload_failflag) {
447 		if (band == BAND_ON_2_4G) {
448 			rtldm->swing_diff_2g = swing_2g;
449 			if (swing_2g == 0) {
450 				out = 0x200; /* 0 dB */
451 			} else if (swing_2g == -3) {
452 				out = 0x16A; /* -3 dB */
453 			} else if (swing_2g == -6) {
454 				out = 0x101; /* -6 dB */
455 			} else if (swing_2g == -9) {
456 				out = 0x0B6; /* -9 dB */
457 			} else {
458 				rtldm->swing_diff_2g = 0;
459 				out = 0x200;
460 			}
461 		} else if (band == BAND_ON_5G) {
462 			rtldm->swing_diff_5g = swing_5g;
463 			if (swing_5g == 0) {
464 				out = 0x200; /* 0 dB */
465 			} else if (swing_5g == -3) {
466 				out = 0x16A; /* -3 dB */
467 			} else if (swing_5g == -6) {
468 				out = 0x101; /* -6 dB */
469 			} else if (swing_5g == -9) {
470 				out = 0x0B6; /* -9 dB */
471 			} else {
472 				if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
473 					rtldm->swing_diff_5g = -3;
474 					out = 0x16A;
475 				} else {
476 					rtldm->swing_diff_5g = 0;
477 					out = 0x200;
478 				}
479 			}
480 		} else {
481 			rtldm->swing_diff_2g = -3;
482 			rtldm->swing_diff_5g = -3;
483 			out = 0x16A; /* -3 dB */
484 		}
485 	} else {
486 		u32 swing = 0, swing_a = 0, swing_b = 0;
487 
488 		if (band == BAND_ON_2_4G) {
489 			if (reg_swing_2g == auto_temp) {
490 				efuse_shadow_read(hw, 1, 0xC6, (u32 *)&swing);
491 				swing = (swing == 0xFF) ? 0x00 : swing;
492 			} else if (swing_2g ==  0) {
493 				swing = 0x00; /* 0 dB */
494 			} else if (swing_2g == -3) {
495 				swing = 0x05; /* -3 dB */
496 			} else if (swing_2g == -6) {
497 				swing = 0x0A; /* -6 dB */
498 			} else if (swing_2g == -9) {
499 				swing = 0xFF; /* -9 dB */
500 			} else {
501 				swing = 0x00;
502 			}
503 		} else {
504 			if (reg_swing_5g == auto_temp) {
505 				efuse_shadow_read(hw, 1, 0xC7, (u32 *)&swing);
506 				swing = (swing == 0xFF) ? 0x00 : swing;
507 			} else if (swing_5g ==  0) {
508 				swing = 0x00; /* 0 dB */
509 			} else if (swing_5g == -3) {
510 				swing = 0x05; /* -3 dB */
511 			} else if (swing_5g == -6) {
512 				swing = 0x0A; /* -6 dB */
513 			} else if (swing_5g == -9) {
514 				swing = 0xFF; /* -9 dB */
515 			} else {
516 				swing = 0x00;
517 			}
518 		}
519 
520 		swing_a = (swing & 0x3) >> 0; /* 0xC6/C7[1:0] */
521 		swing_b = (swing & 0xC) >> 2; /* 0xC6/C7[3:2] */
522 		rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
523 			"===> PHY_GetTXBBSwing_8812A, swingA: 0x%X, swingB: 0x%X\n",
524 			swing_a, swing_b);
525 
526 		/* 3 Path-A */
527 		if (swing_a == 0x0) {
528 			if (band == BAND_ON_2_4G)
529 				rtldm->swing_diff_2g = 0;
530 			else
531 				rtldm->swing_diff_5g = 0;
532 			out = 0x200; /* 0 dB */
533 		} else if (swing_a == 0x1) {
534 			if (band == BAND_ON_2_4G)
535 				rtldm->swing_diff_2g = -3;
536 			else
537 				rtldm->swing_diff_5g = -3;
538 			out = 0x16A; /* -3 dB */
539 		} else if (swing_a == 0x2) {
540 			if (band == BAND_ON_2_4G)
541 				rtldm->swing_diff_2g = -6;
542 			else
543 				rtldm->swing_diff_5g = -6;
544 			out = 0x101; /* -6 dB */
545 		} else if (swing_a == 0x3) {
546 			if (band == BAND_ON_2_4G)
547 				rtldm->swing_diff_2g = -9;
548 			else
549 				rtldm->swing_diff_5g = -9;
550 			out = 0x0B6; /* -9 dB */
551 		}
552 		/* 3 Path-B */
553 		if (swing_b == 0x0) {
554 			if (band == BAND_ON_2_4G)
555 				rtldm->swing_diff_2g = 0;
556 			else
557 				rtldm->swing_diff_5g = 0;
558 			out = 0x200; /* 0 dB */
559 		} else if (swing_b == 0x1) {
560 			if (band == BAND_ON_2_4G)
561 				rtldm->swing_diff_2g = -3;
562 			else
563 				rtldm->swing_diff_5g = -3;
564 			out = 0x16A; /* -3 dB */
565 		} else if (swing_b == 0x2) {
566 			if (band == BAND_ON_2_4G)
567 				rtldm->swing_diff_2g = -6;
568 			else
569 				rtldm->swing_diff_5g = -6;
570 			out = 0x101; /* -6 dB */
571 		} else if (swing_b == 0x3) {
572 			if (band == BAND_ON_2_4G)
573 				rtldm->swing_diff_2g = -9;
574 			else
575 				rtldm->swing_diff_5g = -9;
576 			out = 0x0B6; /* -9 dB */
577 		}
578 	}
579 
580 	rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
581 		"<=== PHY_GetTXBBSwing_8812A, out = 0x%X\n", out);
582 	return out;
583 }
584 
rtl8821ae_phy_switch_wirelessband(struct ieee80211_hw * hw,u8 band)585 void rtl8821ae_phy_switch_wirelessband(struct ieee80211_hw *hw, u8 band)
586 {
587 	struct rtl_priv *rtlpriv = rtl_priv(hw);
588 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
589 	struct rtl_dm *rtldm = rtl_dm(rtlpriv);
590 	u8 current_band = rtlhal->current_bandtype;
591 	s8 bb_diff_between_band;
592 
593 	rtl8821ae_phy_query_bb_reg(hw, RTXPATH, 0xf0);
594 	rtl8821ae_phy_query_bb_reg(hw, RCCK_RX, 0x0f000000);
595 	rtlhal->current_bandtype = (enum band_type) band;
596 	/* reconfig BB/RF according to wireless mode */
597 	if (rtlhal->current_bandtype == BAND_ON_2_4G) {
598 		/* BB & RF Config */
599 		rtl_set_bbreg(hw, ROFDMCCKEN, BOFDMEN|BCCKEN, 0x03);
600 
601 		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
602 			/* 0xCB0[15:12] = 0x7 (LNA_On)*/
603 			rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF000, 0x7);
604 			/* 0xCB0[7:4] = 0x7 (PAPE_A)*/
605 			rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF0, 0x7);
606 		}
607 
608 		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
609 			/*0x834[1:0] = 0x1*/
610 			rtl_set_bbreg(hw, 0x834, 0x3, 0x1);
611 		}
612 
613 		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
614 			/* 0xC1C[11:8] = 0 */
615 			rtl_set_bbreg(hw, RA_TXSCALE, 0xF00, 0);
616 		} else {
617 			/* 0x82C[1:0] = 2b'00 */
618 			rtl_set_bbreg(hw, 0x82c, 0x3, 0);
619 		}
620 
621 		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
622 			_rtl8812ae_phy_set_rfe_reg_24g(hw);
623 
624 		rtl_set_bbreg(hw, RTXPATH, 0xf0, 0x1);
625 		rtl_set_bbreg(hw, RCCK_RX, 0x0f000000, 0x1);
626 
627 		rtl_write_byte(rtlpriv, REG_CCK_CHECK, 0x0);
628 	} else {/* 5G band */
629 		u16 count, reg_41a;
630 
631 		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
632 			/*0xCB0[15:12] = 0x5 (LNA_On)*/
633 			rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF000, 0x5);
634 			/*0xCB0[7:4] = 0x4 (PAPE_A)*/
635 			rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF0, 0x4);
636 		}
637 		/*CCK_CHECK_en*/
638 		rtl_write_byte(rtlpriv, REG_CCK_CHECK, 0x80);
639 
640 		count = 0;
641 		reg_41a = rtl_read_word(rtlpriv, REG_TXPKT_EMPTY);
642 		rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
643 			"Reg41A value %d\n", reg_41a);
644 		reg_41a &= 0x30;
645 		while ((reg_41a != 0x30) && (count < 50)) {
646 			udelay(50);
647 			rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD, "Delay 50us\n");
648 
649 			reg_41a = rtl_read_word(rtlpriv, REG_TXPKT_EMPTY);
650 			reg_41a &= 0x30;
651 			count++;
652 			rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
653 				"Reg41A value %d\n", reg_41a);
654 		}
655 		if (count != 0)
656 			rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD,
657 				"PHY_SwitchWirelessBand8812(): Switch to 5G Band. Count = %d reg41A=0x%x\n",
658 				count, reg_41a);
659 
660 		/* 2012/02/01, Sinda add registry to switch workaround
661 		without long-run verification for scan issue. */
662 		rtl_set_bbreg(hw, ROFDMCCKEN, BOFDMEN|BCCKEN, 0x03);
663 
664 		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
665 			/*0x834[1:0] = 0x2*/
666 			rtl_set_bbreg(hw, 0x834, 0x3, 0x2);
667 		}
668 
669 		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
670 			/* AGC table select */
671 			/* 0xC1C[11:8] = 1*/
672 			rtl_set_bbreg(hw, RA_TXSCALE, 0xF00, 1);
673 		} else
674 			/* 0x82C[1:0] = 2'b00 */
675 			rtl_set_bbreg(hw, 0x82c, 0x3, 1);
676 
677 		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
678 			_rtl8812ae_phy_set_rfe_reg_5g(hw);
679 
680 		rtl_set_bbreg(hw, RTXPATH, 0xf0, 0);
681 		rtl_set_bbreg(hw, RCCK_RX, 0x0f000000, 0xf);
682 
683 		rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
684 			"==>PHY_SwitchWirelessBand8812() BAND_ON_5G settings OFDM index 0x%x\n",
685 			rtlpriv->dm.ofdm_index[RF90_PATH_A]);
686 	}
687 
688 	if ((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) ||
689 	    (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)) {
690 		/* 0xC1C[31:21] */
691 		rtl_set_bbreg(hw, RA_TXSCALE, 0xFFE00000,
692 			      phy_get_tx_swing_8812A(hw, band, RF90_PATH_A));
693 		/* 0xE1C[31:21] */
694 		rtl_set_bbreg(hw, RB_TXSCALE, 0xFFE00000,
695 			      phy_get_tx_swing_8812A(hw, band, RF90_PATH_B));
696 
697 		/* <20121005, Kordan> When TxPowerTrack is ON,
698 		 *	we should take care of the change of BB swing.
699 		 *   That is, reset all info to trigger Tx power tracking.
700 		 */
701 		if (band != current_band) {
702 			bb_diff_between_band =
703 				(rtldm->swing_diff_2g - rtldm->swing_diff_5g);
704 			bb_diff_between_band = (band == BAND_ON_2_4G) ?
705 						bb_diff_between_band :
706 						(-1 * bb_diff_between_band);
707 			rtldm->default_ofdm_index += bb_diff_between_band * 2;
708 		}
709 		rtl8821ae_dm_clear_txpower_tracking_state(hw);
710 	}
711 
712 	rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE,
713 		"<==%s():Switch Band OK.\n", __func__);
714 	return;
715 }
716 
_rtl8821ae_check_positive(struct ieee80211_hw * hw,const u32 condition1,const u32 condition2)717 static bool _rtl8821ae_check_positive(struct ieee80211_hw *hw,
718 				      const u32 condition1,
719 				      const u32 condition2)
720 {
721 	struct rtl_priv *rtlpriv = rtl_priv(hw);
722 	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
723 	u32 cut_ver = ((rtlhal->version & CHIP_VER_RTL_MASK)
724 					>> CHIP_VER_RTL_SHIFT);
725 	u32 intf = (rtlhal->interface == INTF_USB ? BIT(1) : BIT(0));
726 
727 	u8  board_type = ((rtlhal->board_type & BIT(4)) >> 4) << 0 | /* _GLNA */
728 			 ((rtlhal->board_type & BIT(3)) >> 3) << 1 | /* _GPA  */
729 			 ((rtlhal->board_type & BIT(7)) >> 7) << 2 | /* _ALNA */
730 			 ((rtlhal->board_type & BIT(6)) >> 6) << 3 | /* _APA  */
731 			 ((rtlhal->board_type & BIT(2)) >> 2) << 4;  /* _BT   */
732 
733 	u32 cond1 = condition1, cond2 = condition2;
734 	u32 driver1 = cut_ver << 24 |	/* CUT ver */
735 		      0 << 20 |			/* interface 2/2 */
736 		      0x04 << 16 |		/* platform */
737 		      rtlhal->package_type << 12 |
738 		      intf << 8 |			/* interface 1/2 */
739 		      board_type;
740 
741 	u32 driver2 = rtlhal->type_glna <<  0 |
742 		      rtlhal->type_gpa  <<  8 |
743 		      rtlhal->type_alna << 16 |
744 		      rtlhal->type_apa  << 24;
745 
746 	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
747 		"===> [8812A] CheckPositive (cond1, cond2) = (0x%X 0x%X)\n",
748 		cond1, cond2);
749 	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
750 		"===> [8812A] CheckPositive (driver1, driver2) = (0x%X 0x%X)\n",
751 		driver1, driver2);
752 
753 	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
754 		"	(Platform, Interface) = (0x%X, 0x%X)\n", 0x04, intf);
755 	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
756 		"	(Board, Package) = (0x%X, 0x%X)\n",
757 		rtlhal->board_type, rtlhal->package_type);
758 
759 	/*============== Value Defined Check ===============*/
760 	/*QFN Type [15:12] and Cut Version [27:24] need to do value check*/
761 
762 	if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) !=
763 		(driver1 & 0x0000F000)))
764 		return false;
765 	if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) !=
766 		(driver1 & 0x0F000000)))
767 		return false;
768 
769 	/*=============== Bit Defined Check ================*/
770 	/* We don't care [31:28] */
771 
772 	cond1   &= 0x00FF0FFF;
773 	driver1 &= 0x00FF0FFF;
774 
775 	if ((cond1 & driver1) == cond1) {
776 		u32 mask = 0;
777 
778 		if ((cond1 & 0x0F) == 0) /* BoardType is DONTCARE*/
779 			return true;
780 
781 		if ((cond1 & BIT(0)) != 0) /*GLNA*/
782 			mask |= 0x000000FF;
783 		if ((cond1 & BIT(1)) != 0) /*GPA*/
784 			mask |= 0x0000FF00;
785 		if ((cond1 & BIT(2)) != 0) /*ALNA*/
786 			mask |= 0x00FF0000;
787 		if ((cond1 & BIT(3)) != 0) /*APA*/
788 			mask |= 0xFF000000;
789 
790 		/* BoardType of each RF path is matched*/
791 		if ((cond2 & mask) == (driver2 & mask))
792 			return true;
793 		else
794 			return false;
795 	} else
796 		return false;
797 }
798 
_rtl8821ae_check_condition(struct ieee80211_hw * hw,const u32 condition)799 static bool _rtl8821ae_check_condition(struct ieee80211_hw *hw,
800 				       const u32 condition)
801 {
802 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
803 	u32 _board = rtlefuse->board_type; /*need efuse define*/
804 	u32 _interface = 0x01; /* ODM_ITRF_PCIE */
805 	u32 _platform = 0x08;/* ODM_WIN */
806 	u32 cond = condition;
807 
808 	if (condition == 0xCDCDCDCD)
809 		return true;
810 
811 	cond = condition & 0xFF;
812 	if ((_board != cond) && cond != 0xFF)
813 		return false;
814 
815 	cond = condition & 0xFF00;
816 	cond = cond >> 8;
817 	if ((_interface & cond) == 0 && cond != 0x07)
818 		return false;
819 
820 	cond = condition & 0xFF0000;
821 	cond = cond >> 16;
822 	if ((_platform & cond) == 0 && cond != 0x0F)
823 		return false;
824 	return true;
825 }
826 
_rtl8821ae_config_rf_reg(struct ieee80211_hw * hw,u32 addr,u32 data,enum radio_path rfpath,u32 regaddr)827 static void _rtl8821ae_config_rf_reg(struct ieee80211_hw *hw,
828 				     u32 addr, u32 data,
829 				     enum radio_path rfpath, u32 regaddr)
830 {
831 	if (addr == 0xfe || addr == 0xffe) {
832 		/* In order not to disturb BT music when
833 		 * wifi init.(1ant NIC only)
834 		 */
835 		mdelay(50);
836 	} else {
837 		rtl_set_rfreg(hw, rfpath, regaddr, RFREG_OFFSET_MASK, data);
838 		udelay(1);
839 	}
840 }
841 
_rtl8821ae_config_rf_radio_a(struct ieee80211_hw * hw,u32 addr,u32 data)842 static void _rtl8821ae_config_rf_radio_a(struct ieee80211_hw *hw,
843 					 u32 addr, u32 data)
844 {
845 	u32 content = 0x1000; /*RF Content: radio_a_txt*/
846 	u32 maskforphyset = (u32)(content & 0xE000);
847 
848 	_rtl8821ae_config_rf_reg(hw, addr, data,
849 				 RF90_PATH_A, addr | maskforphyset);
850 }
851 
_rtl8821ae_config_rf_radio_b(struct ieee80211_hw * hw,u32 addr,u32 data)852 static void _rtl8821ae_config_rf_radio_b(struct ieee80211_hw *hw,
853 					 u32 addr, u32 data)
854 {
855 	u32 content = 0x1001; /*RF Content: radio_b_txt*/
856 	u32 maskforphyset = (u32)(content & 0xE000);
857 
858 	_rtl8821ae_config_rf_reg(hw, addr, data,
859 				 RF90_PATH_B, addr | maskforphyset);
860 }
861 
_rtl8821ae_config_bb_reg(struct ieee80211_hw * hw,u32 addr,u32 data)862 static void _rtl8821ae_config_bb_reg(struct ieee80211_hw *hw,
863 				     u32 addr, u32 data)
864 {
865 	if (addr == 0xfe)
866 		mdelay(50);
867 	else if (addr == 0xfd)
868 		mdelay(5);
869 	else if (addr == 0xfc)
870 		mdelay(1);
871 	else if (addr == 0xfb)
872 		udelay(50);
873 	else if (addr == 0xfa)
874 		udelay(5);
875 	else if (addr == 0xf9)
876 		udelay(1);
877 	else
878 		rtl_set_bbreg(hw, addr, MASKDWORD, data);
879 
880 	udelay(1);
881 }
882 
_rtl8821ae_phy_init_tx_power_by_rate(struct ieee80211_hw * hw)883 static void _rtl8821ae_phy_init_tx_power_by_rate(struct ieee80211_hw *hw)
884 {
885 	struct rtl_priv *rtlpriv = rtl_priv(hw);
886 	struct rtl_phy *rtlphy = &rtlpriv->phy;
887 	u8 band, rfpath, txnum, rate_section;
888 
889 	for (band = BAND_ON_2_4G; band <= BAND_ON_5G; ++band)
890 		for (rfpath = 0; rfpath < TX_PWR_BY_RATE_NUM_RF; ++rfpath)
891 			for (txnum = 0; txnum < TX_PWR_BY_RATE_NUM_RF; ++txnum)
892 				for (rate_section = 0;
893 				     rate_section < TX_PWR_BY_RATE_NUM_SECTION;
894 				     ++rate_section)
895 					rtlphy->tx_power_by_rate_offset[band]
896 					    [rfpath][txnum][rate_section] = 0;
897 }
898 
_rtl8821ae_phy_set_txpower_by_rate_base(struct ieee80211_hw * hw,u8 band,u8 path,u8 rate_section,u8 txnum,u8 value)899 static void _rtl8821ae_phy_set_txpower_by_rate_base(struct ieee80211_hw *hw,
900 					  u8 band, u8 path,
901 					  u8 rate_section,
902 					  u8 txnum, u8 value)
903 {
904 	struct rtl_priv *rtlpriv = rtl_priv(hw);
905 	struct rtl_phy *rtlphy = &rtlpriv->phy;
906 
907 	if (path > RF90_PATH_D) {
908 		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
909 			"Invalid Rf Path %d in phy_SetTxPowerByRatBase()\n", path);
910 		return;
911 	}
912 
913 	if (band == BAND_ON_2_4G) {
914 		switch (rate_section) {
915 		case CCK:
916 			rtlphy->txpwr_by_rate_base_24g[path][txnum][0] = value;
917 			break;
918 		case OFDM:
919 			rtlphy->txpwr_by_rate_base_24g[path][txnum][1] = value;
920 			break;
921 		case HT_MCS0_MCS7:
922 			rtlphy->txpwr_by_rate_base_24g[path][txnum][2] = value;
923 			break;
924 		case HT_MCS8_MCS15:
925 			rtlphy->txpwr_by_rate_base_24g[path][txnum][3] = value;
926 			break;
927 		case VHT_1SSMCS0_1SSMCS9:
928 			rtlphy->txpwr_by_rate_base_24g[path][txnum][4] = value;
929 			break;
930 		case VHT_2SSMCS0_2SSMCS9:
931 			rtlphy->txpwr_by_rate_base_24g[path][txnum][5] = value;
932 			break;
933 		default:
934 			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
935 				"Invalid RateSection %d in Band 2.4G,Rf Path %d, %dTx in PHY_SetTxPowerByRateBase()\n",
936 				rate_section, path, txnum);
937 			break;
938 		}
939 	} else if (band == BAND_ON_5G) {
940 		switch (rate_section) {
941 		case OFDM:
942 			rtlphy->txpwr_by_rate_base_5g[path][txnum][0] = value;
943 			break;
944 		case HT_MCS0_MCS7:
945 			rtlphy->txpwr_by_rate_base_5g[path][txnum][1] = value;
946 			break;
947 		case HT_MCS8_MCS15:
948 			rtlphy->txpwr_by_rate_base_5g[path][txnum][2] = value;
949 			break;
950 		case VHT_1SSMCS0_1SSMCS9:
951 			rtlphy->txpwr_by_rate_base_5g[path][txnum][3] = value;
952 			break;
953 		case VHT_2SSMCS0_2SSMCS9:
954 			rtlphy->txpwr_by_rate_base_5g[path][txnum][4] = value;
955 			break;
956 		default:
957 			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
958 				"Invalid RateSection %d in Band 5G, Rf Path %d, %dTx in PHY_SetTxPowerByRateBase()\n",
959 				rate_section, path, txnum);
960 			break;
961 		}
962 	} else {
963 		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
964 			"Invalid Band %d in PHY_SetTxPowerByRateBase()\n", band);
965 	}
966 }
967 
_rtl8821ae_phy_get_txpower_by_rate_base(struct ieee80211_hw * hw,u8 band,u8 path,u8 txnum,u8 rate_section)968 static u8 _rtl8821ae_phy_get_txpower_by_rate_base(struct ieee80211_hw *hw,
969 						  u8 band, u8 path,
970 						  u8 txnum, u8 rate_section)
971 {
972 	struct rtl_priv *rtlpriv = rtl_priv(hw);
973 	struct rtl_phy *rtlphy = &rtlpriv->phy;
974 	u8 value = 0;
975 
976 	if (path > RF90_PATH_D) {
977 		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
978 			"Invalid Rf Path %d in PHY_GetTxPowerByRateBase()\n",
979 			path);
980 		return 0;
981 	}
982 
983 	if (band == BAND_ON_2_4G) {
984 		switch (rate_section) {
985 		case CCK:
986 			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][0];
987 			break;
988 		case OFDM:
989 			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][1];
990 			break;
991 		case HT_MCS0_MCS7:
992 			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][2];
993 			break;
994 		case HT_MCS8_MCS15:
995 			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][3];
996 			break;
997 		case VHT_1SSMCS0_1SSMCS9:
998 			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][4];
999 			break;
1000 		case VHT_2SSMCS0_2SSMCS9:
1001 			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][5];
1002 			break;
1003 		default:
1004 			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1005 				"Invalid RateSection %d in Band 2.4G, Rf Path %d, %dTx in PHY_GetTxPowerByRateBase()\n",
1006 				rate_section, path, txnum);
1007 			break;
1008 		}
1009 	} else if (band == BAND_ON_5G) {
1010 		switch (rate_section) {
1011 		case OFDM:
1012 			value = rtlphy->txpwr_by_rate_base_5g[path][txnum][0];
1013 			break;
1014 		case HT_MCS0_MCS7:
1015 			value = rtlphy->txpwr_by_rate_base_5g[path][txnum][1];
1016 			break;
1017 		case HT_MCS8_MCS15:
1018 			value = rtlphy->txpwr_by_rate_base_5g[path][txnum][2];
1019 			break;
1020 		case VHT_1SSMCS0_1SSMCS9:
1021 			value = rtlphy->txpwr_by_rate_base_5g[path][txnum][3];
1022 			break;
1023 		case VHT_2SSMCS0_2SSMCS9:
1024 			value = rtlphy->txpwr_by_rate_base_5g[path][txnum][4];
1025 			break;
1026 		default:
1027 			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1028 				"Invalid RateSection %d in Band 5G, Rf Path %d, %dTx in PHY_GetTxPowerByRateBase()\n",
1029 				rate_section, path, txnum);
1030 			break;
1031 		}
1032 	} else {
1033 		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1034 			"Invalid Band %d in PHY_GetTxPowerByRateBase()\n", band);
1035 	}
1036 
1037 	return value;
1038 }
1039 
_rtl8821ae_phy_store_txpower_by_rate_base(struct ieee80211_hw * hw)1040 static void _rtl8821ae_phy_store_txpower_by_rate_base(struct ieee80211_hw *hw)
1041 {
1042 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1043 	struct rtl_phy *rtlphy = &rtlpriv->phy;
1044 	u16 rawvalue = 0;
1045 	u8 base = 0, path = 0;
1046 
1047 	for (path = RF90_PATH_A; path <= RF90_PATH_B; ++path) {
1048 		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][0] >> 24) & 0xFF;
1049 		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
1050 		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, CCK, RF_1TX, base);
1051 
1052 		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][2] >> 24) & 0xFF;
1053 		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
1054 		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, OFDM, RF_1TX, base);
1055 
1056 		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][4] >> 24) & 0xFF;
1057 		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
1058 		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, HT_MCS0_MCS7, RF_1TX, base);
1059 
1060 		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_2TX][6] >> 24) & 0xFF;
1061 		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
1062 		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, HT_MCS8_MCS15, RF_2TX, base);
1063 
1064 		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][8] >> 24) & 0xFF;
1065 		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
1066 		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, VHT_1SSMCS0_1SSMCS9, RF_1TX, base);
1067 
1068 		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_2TX][11] >> 8) & 0xFF;
1069 		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
1070 		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, VHT_2SSMCS0_2SSMCS9, RF_2TX, base);
1071 
1072 		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_1TX][2] >> 24) & 0xFF;
1073 		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
1074 		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, OFDM, RF_1TX, base);
1075 
1076 		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_1TX][4] >> 24) & 0xFF;
1077 		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
1078 		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, HT_MCS0_MCS7, RF_1TX, base);
1079 
1080 		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_2TX][6] >> 24) & 0xFF;
1081 		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
1082 		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, HT_MCS8_MCS15, RF_2TX, base);
1083 
1084 		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_1TX][8] >> 24) & 0xFF;
1085 		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
1086 		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, VHT_1SSMCS0_1SSMCS9, RF_1TX, base);
1087 
1088 		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_2TX][11] >> 8) & 0xFF;
1089 		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
1090 		_rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, VHT_2SSMCS0_2SSMCS9, RF_2TX, base);
1091 	}
1092 }
1093 
_phy_convert_txpower_dbm_to_relative_value(u32 * data,u8 start,u8 end,u8 base_val)1094 static void _phy_convert_txpower_dbm_to_relative_value(u32 *data, u8 start,
1095 						u8 end, u8 base_val)
1096 {
1097 	int i;
1098 	u8 temp_value = 0;
1099 	u32 temp_data = 0;
1100 
1101 	for (i = 3; i >= 0; --i) {
1102 		if (i >= start && i <= end) {
1103 			/* Get the exact value */
1104 			temp_value = (u8)(*data >> (i * 8)) & 0xF;
1105 			temp_value += ((u8)((*data >> (i * 8 + 4)) & 0xF)) * 10;
1106 
1107 			/* Change the value to a relative value */
1108 			temp_value = (temp_value > base_val) ? temp_value -
1109 					base_val : base_val - temp_value;
1110 		} else {
1111 			temp_value = (u8)(*data >> (i * 8)) & 0xFF;
1112 		}
1113 		temp_data <<= 8;
1114 		temp_data |= temp_value;
1115 	}
1116 	*data = temp_data;
1117 }
1118 
_rtl8812ae_phy_cross_reference_ht_and_vht_txpower_limit(struct ieee80211_hw * hw)1119 static void _rtl8812ae_phy_cross_reference_ht_and_vht_txpower_limit(struct ieee80211_hw *hw)
1120 {
1121 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1122 	struct rtl_phy *rtlphy = &rtlpriv->phy;
1123 	u8 regulation, bw, channel, rate_section;
1124 	s8 temp_pwrlmt = 0;
1125 
1126 	for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {
1127 		for (bw = 0; bw < MAX_5G_BANDWIDTH_NUM; ++bw) {
1128 			for (channel = 0; channel < CHANNEL_MAX_NUMBER_5G; ++channel) {
1129 				for (rate_section = 0; rate_section < MAX_RATE_SECTION_NUM; ++rate_section) {
1130 					temp_pwrlmt = rtlphy->txpwr_limit_5g[regulation]
1131 						[bw][rate_section][channel][RF90_PATH_A];
1132 					if (temp_pwrlmt == MAX_POWER_INDEX) {
1133 						if (bw == 0 || bw == 1) { /*5G 20M 40M VHT and HT can cross reference*/
1134 							rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
1135 								"No power limit table of the specified band %d, bandwidth %d, ratesection %d, channel %d, rf path %d\n",
1136 								1, bw, rate_section, channel, RF90_PATH_A);
1137 							if (rate_section == 2) {
1138 								rtlphy->txpwr_limit_5g[regulation][bw][2][channel][RF90_PATH_A] =
1139 									rtlphy->txpwr_limit_5g[regulation][bw][4][channel][RF90_PATH_A];
1140 							} else if (rate_section == 4) {
1141 								rtlphy->txpwr_limit_5g[regulation][bw][4][channel][RF90_PATH_A] =
1142 									rtlphy->txpwr_limit_5g[regulation][bw][2][channel][RF90_PATH_A];
1143 							} else if (rate_section == 3) {
1144 								rtlphy->txpwr_limit_5g[regulation][bw][3][channel][RF90_PATH_A] =
1145 									rtlphy->txpwr_limit_5g[regulation][bw][5][channel][RF90_PATH_A];
1146 							} else if (rate_section == 5) {
1147 								rtlphy->txpwr_limit_5g[regulation][bw][5][channel][RF90_PATH_A] =
1148 									rtlphy->txpwr_limit_5g[regulation][bw][3][channel][RF90_PATH_A];
1149 							}
1150 
1151 							rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
1152 								"use other value %d\n",
1153 								temp_pwrlmt);
1154 						}
1155 					}
1156 				}
1157 			}
1158 		}
1159 	}
1160 }
1161 
_rtl8812ae_phy_get_txpower_by_rate_base_index(struct ieee80211_hw * hw,enum band_type band,u8 rate)1162 static u8 _rtl8812ae_phy_get_txpower_by_rate_base_index(struct ieee80211_hw *hw,
1163 						   enum band_type band, u8 rate)
1164 {
1165 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1166 	u8 index = 0;
1167 	if (band == BAND_ON_2_4G) {
1168 		switch (rate) {
1169 		case MGN_1M:
1170 		case MGN_2M:
1171 		case MGN_5_5M:
1172 		case MGN_11M:
1173 			index = 0;
1174 			break;
1175 
1176 		case MGN_6M:
1177 		case MGN_9M:
1178 		case MGN_12M:
1179 		case MGN_18M:
1180 		case MGN_24M:
1181 		case MGN_36M:
1182 		case MGN_48M:
1183 		case MGN_54M:
1184 			index = 1;
1185 			break;
1186 
1187 		case MGN_MCS0:
1188 		case MGN_MCS1:
1189 		case MGN_MCS2:
1190 		case MGN_MCS3:
1191 		case MGN_MCS4:
1192 		case MGN_MCS5:
1193 		case MGN_MCS6:
1194 		case MGN_MCS7:
1195 			index = 2;
1196 			break;
1197 
1198 		case MGN_MCS8:
1199 		case MGN_MCS9:
1200 		case MGN_MCS10:
1201 		case MGN_MCS11:
1202 		case MGN_MCS12:
1203 		case MGN_MCS13:
1204 		case MGN_MCS14:
1205 		case MGN_MCS15:
1206 			index = 3;
1207 			break;
1208 
1209 		default:
1210 			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1211 				"Wrong rate 0x%x to obtain index in 2.4G in PHY_GetTxPowerByRateBaseIndex()\n",
1212 				rate);
1213 			break;
1214 		}
1215 	} else if (band == BAND_ON_5G) {
1216 		switch (rate) {
1217 		case MGN_6M:
1218 		case MGN_9M:
1219 		case MGN_12M:
1220 		case MGN_18M:
1221 		case MGN_24M:
1222 		case MGN_36M:
1223 		case MGN_48M:
1224 		case MGN_54M:
1225 			index = 0;
1226 			break;
1227 
1228 		case MGN_MCS0:
1229 		case MGN_MCS1:
1230 		case MGN_MCS2:
1231 		case MGN_MCS3:
1232 		case MGN_MCS4:
1233 		case MGN_MCS5:
1234 		case MGN_MCS6:
1235 		case MGN_MCS7:
1236 			index = 1;
1237 			break;
1238 
1239 		case MGN_MCS8:
1240 		case MGN_MCS9:
1241 		case MGN_MCS10:
1242 		case MGN_MCS11:
1243 		case MGN_MCS12:
1244 		case MGN_MCS13:
1245 		case MGN_MCS14:
1246 		case MGN_MCS15:
1247 			index = 2;
1248 			break;
1249 
1250 		case MGN_VHT1SS_MCS0:
1251 		case MGN_VHT1SS_MCS1:
1252 		case MGN_VHT1SS_MCS2:
1253 		case MGN_VHT1SS_MCS3:
1254 		case MGN_VHT1SS_MCS4:
1255 		case MGN_VHT1SS_MCS5:
1256 		case MGN_VHT1SS_MCS6:
1257 		case MGN_VHT1SS_MCS7:
1258 		case MGN_VHT1SS_MCS8:
1259 		case MGN_VHT1SS_MCS9:
1260 			index = 3;
1261 			break;
1262 
1263 		case MGN_VHT2SS_MCS0:
1264 		case MGN_VHT2SS_MCS1:
1265 		case MGN_VHT2SS_MCS2:
1266 		case MGN_VHT2SS_MCS3:
1267 		case MGN_VHT2SS_MCS4:
1268 		case MGN_VHT2SS_MCS5:
1269 		case MGN_VHT2SS_MCS6:
1270 		case MGN_VHT2SS_MCS7:
1271 		case MGN_VHT2SS_MCS8:
1272 		case MGN_VHT2SS_MCS9:
1273 			index = 4;
1274 			break;
1275 
1276 		default:
1277 			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1278 				"Wrong rate 0x%x to obtain index in 5G in PHY_GetTxPowerByRateBaseIndex()\n",
1279 				rate);
1280 			break;
1281 		}
1282 	}
1283 
1284 	return index;
1285 }
1286 
_rtl8812ae_phy_convert_txpower_limit_to_power_index(struct ieee80211_hw * hw)1287 static void _rtl8812ae_phy_convert_txpower_limit_to_power_index(struct ieee80211_hw *hw)
1288 {
1289 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1290 	struct rtl_phy *rtlphy = &rtlpriv->phy;
1291 	u8 bw40_pwr_base_dbm2_4G, bw40_pwr_base_dbm5G;
1292 	u8 regulation, bw, channel, rate_section;
1293 	u8 base_index2_4G = 0;
1294 	u8 base_index5G = 0;
1295 	s8 temp_value = 0, temp_pwrlmt = 0;
1296 	u8 rf_path = 0;
1297 
1298 	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
1299 		"=====> _rtl8812ae_phy_convert_txpower_limit_to_power_index()\n");
1300 
1301 	_rtl8812ae_phy_cross_reference_ht_and_vht_txpower_limit(hw);
1302 
1303 	for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {
1304 		for (bw = 0; bw < MAX_2_4G_BANDWIDTH_NUM; ++bw) {
1305 			for (channel = 0; channel < CHANNEL_MAX_NUMBER_2G; ++channel) {
1306 				for (rate_section = 0; rate_section < MAX_RATE_SECTION_NUM; ++rate_section) {
1307 					/* obtain the base dBm values in 2.4G band
1308 					 CCK => 11M, OFDM => 54M, HT 1T => MCS7, HT 2T => MCS15*/
1309 					if (rate_section == 0) { /*CCK*/
1310 						base_index2_4G =
1311 							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1312 							BAND_ON_2_4G, MGN_11M);
1313 					} else if (rate_section == 1) { /*OFDM*/
1314 						base_index2_4G =
1315 							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1316 							BAND_ON_2_4G, MGN_54M);
1317 					} else if (rate_section == 2) { /*HT IT*/
1318 						base_index2_4G =
1319 							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1320 							BAND_ON_2_4G, MGN_MCS7);
1321 					} else if (rate_section == 3) { /*HT 2T*/
1322 						base_index2_4G =
1323 							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1324 							BAND_ON_2_4G, MGN_MCS15);
1325 					}
1326 
1327 					temp_pwrlmt = rtlphy->txpwr_limit_2_4g[regulation]
1328 						[bw][rate_section][channel][RF90_PATH_A];
1329 
1330 					for (rf_path = RF90_PATH_A;
1331 						rf_path < MAX_RF_PATH_NUM;
1332 						++rf_path) {
1333 						if (rate_section == 3)
1334 							bw40_pwr_base_dbm2_4G =
1335 							rtlphy->txpwr_by_rate_base_24g[rf_path][RF_2TX][base_index2_4G];
1336 						else
1337 							bw40_pwr_base_dbm2_4G =
1338 							rtlphy->txpwr_by_rate_base_24g[rf_path][RF_1TX][base_index2_4G];
1339 
1340 						if (temp_pwrlmt != MAX_POWER_INDEX) {
1341 							temp_value = temp_pwrlmt - bw40_pwr_base_dbm2_4G;
1342 							rtlphy->txpwr_limit_2_4g[regulation]
1343 								[bw][rate_section][channel][rf_path] =
1344 								temp_value;
1345 						}
1346 
1347 						rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
1348 							"TxPwrLimit_2_4G[regulation %d][bw %d][rateSection %d][channel %d] = %d\n(TxPwrLimit in dBm %d - BW40PwrLmt2_4G[channel %d][rfpath %d] %d)\n",
1349 							regulation, bw, rate_section, channel,
1350 							rtlphy->txpwr_limit_2_4g[regulation][bw]
1351 							[rate_section][channel][rf_path], (temp_pwrlmt == 63)
1352 							? 0 : temp_pwrlmt/2, channel, rf_path,
1353 							bw40_pwr_base_dbm2_4G);
1354 					}
1355 				}
1356 			}
1357 		}
1358 	}
1359 	for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {
1360 		for (bw = 0; bw < MAX_5G_BANDWIDTH_NUM; ++bw) {
1361 			for (channel = 0; channel < CHANNEL_MAX_NUMBER_5G; ++channel) {
1362 				for (rate_section = 0; rate_section < MAX_RATE_SECTION_NUM; ++rate_section) {
1363 					/* obtain the base dBm values in 5G band
1364 					 OFDM => 54M, HT 1T => MCS7, HT 2T => MCS15,
1365 					VHT => 1SSMCS7, VHT 2T => 2SSMCS7*/
1366 					if (rate_section == 1) { /*OFDM*/
1367 						base_index5G =
1368 							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1369 							BAND_ON_5G, MGN_54M);
1370 					} else if (rate_section == 2) { /*HT 1T*/
1371 						base_index5G =
1372 							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1373 							BAND_ON_5G, MGN_MCS7);
1374 					} else if (rate_section == 3) { /*HT 2T*/
1375 						base_index5G =
1376 							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1377 							BAND_ON_5G, MGN_MCS15);
1378 					} else if (rate_section == 4) { /*VHT 1T*/
1379 						base_index5G =
1380 							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1381 							BAND_ON_5G, MGN_VHT1SS_MCS7);
1382 					} else if (rate_section == 5) { /*VHT 2T*/
1383 						base_index5G =
1384 							_rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1385 							BAND_ON_5G, MGN_VHT2SS_MCS7);
1386 					}
1387 
1388 					temp_pwrlmt = rtlphy->txpwr_limit_5g[regulation]
1389 						[bw][rate_section][channel]
1390 						[RF90_PATH_A];
1391 
1392 					for (rf_path = RF90_PATH_A;
1393 					     rf_path < MAX_RF_PATH_NUM;
1394 					     ++rf_path) {
1395 						if (rate_section == 3 || rate_section == 5)
1396 							bw40_pwr_base_dbm5G =
1397 							rtlphy->txpwr_by_rate_base_5g[rf_path]
1398 							[RF_2TX][base_index5G];
1399 						else
1400 							bw40_pwr_base_dbm5G =
1401 							rtlphy->txpwr_by_rate_base_5g[rf_path]
1402 							[RF_1TX][base_index5G];
1403 
1404 						if (temp_pwrlmt != MAX_POWER_INDEX) {
1405 							temp_value =
1406 								temp_pwrlmt - bw40_pwr_base_dbm5G;
1407 							rtlphy->txpwr_limit_5g[regulation]
1408 								[bw][rate_section][channel]
1409 								[rf_path] = temp_value;
1410 						}
1411 
1412 						rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
1413 							"TxPwrLimit_5G[regulation %d][bw %d][rateSection %d][channel %d] =%d\n(TxPwrLimit in dBm %d - BW40PwrLmt5G[chnl group %d][rfpath %d] %d)\n",
1414 							regulation, bw, rate_section,
1415 							channel, rtlphy->txpwr_limit_5g[regulation]
1416 							[bw][rate_section][channel][rf_path],
1417 							temp_pwrlmt, channel, rf_path, bw40_pwr_base_dbm5G);
1418 					}
1419 				}
1420 			}
1421 		}
1422 	}
1423 	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
1424 		"<===== %s()\n", __func__);
1425 }
1426 
_rtl8821ae_phy_init_txpower_limit(struct ieee80211_hw * hw)1427 static void _rtl8821ae_phy_init_txpower_limit(struct ieee80211_hw *hw)
1428 {
1429 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1430 	struct rtl_phy *rtlphy = &rtlpriv->phy;
1431 	u8 i, j, k, l, m;
1432 
1433 	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1434 		"=====>`%s()!\n", __func__);
1435 
1436 	for (i = 0; i < MAX_REGULATION_NUM; ++i) {
1437 		for (j = 0; j < MAX_2_4G_BANDWIDTH_NUM; ++j)
1438 			for (k = 0; k < MAX_RATE_SECTION_NUM; ++k)
1439 				for (m = 0; m < CHANNEL_MAX_NUMBER_2G; ++m)
1440 					for (l = 0; l < MAX_RF_PATH_NUM; ++l)
1441 						rtlphy->txpwr_limit_2_4g
1442 								[i][j][k][m][l]
1443 							= MAX_POWER_INDEX;
1444 	}
1445 	for (i = 0; i < MAX_REGULATION_NUM; ++i) {
1446 		for (j = 0; j < MAX_5G_BANDWIDTH_NUM; ++j)
1447 			for (k = 0; k < MAX_RATE_SECTION_NUM; ++k)
1448 				for (m = 0; m < CHANNEL_MAX_NUMBER_5G; ++m)
1449 					for (l = 0; l < MAX_RF_PATH_NUM; ++l)
1450 						rtlphy->txpwr_limit_5g
1451 								[i][j][k][m][l]
1452 							= MAX_POWER_INDEX;
1453 	}
1454 
1455 	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1456 		"<===== %s()!\n", __func__);
1457 }
1458 
_rtl8821ae_phy_convert_txpower_dbm_to_relative_value(struct ieee80211_hw * hw)1459 static void _rtl8821ae_phy_convert_txpower_dbm_to_relative_value(struct ieee80211_hw *hw)
1460 {
1461 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1462 	struct rtl_phy *rtlphy = &rtlpriv->phy;
1463 	u8 base = 0, rfpath = 0;
1464 
1465 	for (rfpath = RF90_PATH_A; rfpath <= RF90_PATH_B; ++rfpath) {
1466 		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath, RF_1TX, CCK);
1467 		_phy_convert_txpower_dbm_to_relative_value(
1468 			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][0],
1469 			0, 3, base);
1470 
1471 		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath, RF_1TX, OFDM);
1472 		_phy_convert_txpower_dbm_to_relative_value(
1473 			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][1],
1474 			0, 3, base);
1475 		_phy_convert_txpower_dbm_to_relative_value(
1476 			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][2],
1477 			0, 3, base);
1478 
1479 		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath, RF_1TX, HT_MCS0_MCS7);
1480 		_phy_convert_txpower_dbm_to_relative_value(
1481 			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][3],
1482 			0, 3, base);
1483 		_phy_convert_txpower_dbm_to_relative_value(
1484 			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][4],
1485 			0, 3, base);
1486 
1487 		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath, RF_2TX, HT_MCS8_MCS15);
1488 
1489 		_phy_convert_txpower_dbm_to_relative_value(
1490 			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_2TX][5],
1491 			0, 3, base);
1492 
1493 		_phy_convert_txpower_dbm_to_relative_value(
1494 			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_2TX][6],
1495 			0, 3, base);
1496 
1497 		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath, RF_1TX, VHT_1SSMCS0_1SSMCS9);
1498 		_phy_convert_txpower_dbm_to_relative_value(
1499 			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][7],
1500 			0, 3, base);
1501 		_phy_convert_txpower_dbm_to_relative_value(
1502 			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][8],
1503 			0, 3, base);
1504 		_phy_convert_txpower_dbm_to_relative_value(
1505 			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][9],
1506 			0, 1, base);
1507 
1508 		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath, RF_2TX, VHT_2SSMCS0_2SSMCS9);
1509 		_phy_convert_txpower_dbm_to_relative_value(
1510 			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][9],
1511 			2, 3, base);
1512 		_phy_convert_txpower_dbm_to_relative_value(
1513 			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_2TX][10],
1514 			0, 3, base);
1515 		_phy_convert_txpower_dbm_to_relative_value(
1516 			&rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_2TX][11],
1517 			0, 3, base);
1518 
1519 		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfpath, RF_1TX, OFDM);
1520 		_phy_convert_txpower_dbm_to_relative_value(
1521 			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][1],
1522 			0, 3, base);
1523 		_phy_convert_txpower_dbm_to_relative_value(
1524 			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][2],
1525 			0, 3, base);
1526 
1527 		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfpath, RF_1TX, HT_MCS0_MCS7);
1528 		_phy_convert_txpower_dbm_to_relative_value(
1529 			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][3],
1530 			0, 3, base);
1531 		_phy_convert_txpower_dbm_to_relative_value(
1532 			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][4],
1533 			0, 3, base);
1534 
1535 		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfpath, RF_2TX, HT_MCS8_MCS15);
1536 		_phy_convert_txpower_dbm_to_relative_value(
1537 			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_2TX][5],
1538 			0, 3, base);
1539 		_phy_convert_txpower_dbm_to_relative_value(
1540 			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_2TX][6],
1541 			0, 3, base);
1542 
1543 		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfpath, RF_1TX, VHT_1SSMCS0_1SSMCS9);
1544 		_phy_convert_txpower_dbm_to_relative_value(
1545 			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][7],
1546 			0, 3, base);
1547 		_phy_convert_txpower_dbm_to_relative_value(
1548 			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][8],
1549 			0, 3, base);
1550 		_phy_convert_txpower_dbm_to_relative_value(
1551 			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][9],
1552 			0, 1, base);
1553 
1554 		base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfpath, RF_2TX, VHT_2SSMCS0_2SSMCS9);
1555 		_phy_convert_txpower_dbm_to_relative_value(
1556 			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][9],
1557 			2, 3, base);
1558 		_phy_convert_txpower_dbm_to_relative_value(
1559 			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_2TX][10],
1560 			0, 3, base);
1561 		_phy_convert_txpower_dbm_to_relative_value(
1562 			&rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_2TX][11],
1563 			0, 3, base);
1564 	}
1565 
1566 	rtl_dbg(rtlpriv, COMP_POWER, DBG_TRACE,
1567 		"<===_rtl8821ae_phy_convert_txpower_dbm_to_relative_value()\n");
1568 }
1569 
_rtl8821ae_phy_txpower_by_rate_configuration(struct ieee80211_hw * hw)1570 static void _rtl8821ae_phy_txpower_by_rate_configuration(struct ieee80211_hw *hw)
1571 {
1572 	_rtl8821ae_phy_store_txpower_by_rate_base(hw);
1573 	_rtl8821ae_phy_convert_txpower_dbm_to_relative_value(hw);
1574 }
1575 
1576 /* string is in decimal */
_rtl8812ae_get_integer_from_string(const char * str,u8 * pint)1577 static bool _rtl8812ae_get_integer_from_string(const char *str, u8 *pint)
1578 {
1579 	u16 i = 0;
1580 	*pint = 0;
1581 
1582 	while (str[i] != '\0') {
1583 		if (str[i] >= '0' && str[i] <= '9') {
1584 			*pint *= 10;
1585 			*pint += (str[i] - '0');
1586 		} else {
1587 			return false;
1588 		}
1589 		++i;
1590 	}
1591 
1592 	return true;
1593 }
1594 
_rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(struct ieee80211_hw * hw,u8 band,u8 channel)1595 static s8 _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(struct ieee80211_hw *hw,
1596 					      u8 band, u8 channel)
1597 {
1598 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1599 	s8 channel_index = -1;
1600 	u8  i = 0;
1601 
1602 	if (band == BAND_ON_2_4G)
1603 		channel_index = channel - 1;
1604 	else if (band == BAND_ON_5G) {
1605 		for (i = 0; i < sizeof(channel5g)/sizeof(u8); ++i) {
1606 			if (channel5g[i] == channel)
1607 				channel_index = i;
1608 		}
1609 	} else
1610 		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, "Invalid Band %d in %s\n",
1611 			band,  __func__);
1612 
1613 	if (channel_index == -1)
1614 		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
1615 			"Invalid Channel %d of Band %d in %s\n", channel,
1616 			band, __func__);
1617 
1618 	return channel_index;
1619 }
1620 
_rtl8812ae_phy_set_txpower_limit(struct ieee80211_hw * hw,const char * pregulation,const char * pband,const char * pbandwidth,const char * prate_section,const char * prf_path,const char * pchannel,const char * ppower_limit)1621 static void _rtl8812ae_phy_set_txpower_limit(struct ieee80211_hw *hw,
1622 				      const char *pregulation,
1623 				      const char *pband, const char *pbandwidth,
1624 				      const char *prate_section, const char *prf_path,
1625 				      const char *pchannel, const char *ppower_limit)
1626 {
1627 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1628 	struct rtl_phy *rtlphy = &rtlpriv->phy;
1629 	u8 regulation = 0, bandwidth = 0, rate_section = 0, channel;
1630 	u8 channel_index;
1631 	s8 power_limit = 0, prev_power_limit, ret;
1632 
1633 	if (!_rtl8812ae_get_integer_from_string(pchannel, &channel) ||
1634 	    !_rtl8812ae_get_integer_from_string(ppower_limit,
1635 						&power_limit)) {
1636 		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
1637 			"Illegal index of pwr_lmt table [chnl %d][val %d]\n",
1638 			channel, power_limit);
1639 	}
1640 
1641 	power_limit = power_limit > MAX_POWER_INDEX ?
1642 		      MAX_POWER_INDEX : power_limit;
1643 
1644 	if (strcmp(pregulation, "FCC") == 0)
1645 		regulation = 0;
1646 	else if (strcmp(pregulation, "MKK") == 0)
1647 		regulation = 1;
1648 	else if (strcmp(pregulation, "ETSI") == 0)
1649 		regulation = 2;
1650 	else if (strcmp(pregulation, "WW13") == 0)
1651 		regulation = 3;
1652 
1653 	if (strcmp(prate_section, "CCK") == 0)
1654 		rate_section = 0;
1655 	else if (strcmp(prate_section, "OFDM") == 0)
1656 		rate_section = 1;
1657 	else if (strcmp(prate_section, "HT") == 0 &&
1658 		 strcmp(prf_path, "1T") == 0)
1659 		rate_section = 2;
1660 	else if (strcmp(prate_section, "HT") == 0 &&
1661 		 strcmp(prf_path, "2T") == 0)
1662 		rate_section = 3;
1663 	else if (strcmp(prate_section, "VHT") == 0 &&
1664 		 strcmp(prf_path, "1T") == 0)
1665 		rate_section = 4;
1666 	else if (strcmp(prate_section, "VHT") == 0 &&
1667 		 strcmp(prf_path, "2T") == 0)
1668 		rate_section = 5;
1669 
1670 	if (strcmp(pbandwidth, "20M") == 0)
1671 		bandwidth = 0;
1672 	else if (strcmp(pbandwidth, "40M") == 0)
1673 		bandwidth = 1;
1674 	else if (strcmp(pbandwidth, "80M") == 0)
1675 		bandwidth = 2;
1676 	else if (strcmp(pbandwidth, "160M") == 0)
1677 		bandwidth = 3;
1678 
1679 	if (strcmp(pband, "2.4G") == 0) {
1680 		ret = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw,
1681 							       BAND_ON_2_4G,
1682 							       channel);
1683 
1684 		if (ret == -1)
1685 			return;
1686 
1687 		channel_index = ret;
1688 
1689 		prev_power_limit = rtlphy->txpwr_limit_2_4g[regulation]
1690 						[bandwidth][rate_section]
1691 						[channel_index][RF90_PATH_A];
1692 
1693 		if (power_limit < prev_power_limit)
1694 			rtlphy->txpwr_limit_2_4g[regulation][bandwidth]
1695 				[rate_section][channel_index][RF90_PATH_A] =
1696 								   power_limit;
1697 
1698 		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
1699 			"2.4G [regula %d][bw %d][sec %d][chnl %d][val %d]\n",
1700 			regulation, bandwidth, rate_section, channel_index,
1701 			rtlphy->txpwr_limit_2_4g[regulation][bandwidth]
1702 				[rate_section][channel_index][RF90_PATH_A]);
1703 	} else if (strcmp(pband, "5G") == 0) {
1704 		ret = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw,
1705 							       BAND_ON_5G,
1706 							       channel);
1707 
1708 		if (ret == -1)
1709 			return;
1710 
1711 		channel_index = ret;
1712 
1713 		prev_power_limit = rtlphy->txpwr_limit_5g[regulation][bandwidth]
1714 						[rate_section][channel_index]
1715 						[RF90_PATH_A];
1716 
1717 		if (power_limit < prev_power_limit)
1718 			rtlphy->txpwr_limit_5g[regulation][bandwidth]
1719 			[rate_section][channel_index][RF90_PATH_A] = power_limit;
1720 
1721 		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
1722 			"5G: [regul %d][bw %d][sec %d][chnl %d][val %d]\n",
1723 			regulation, bandwidth, rate_section, channel,
1724 			rtlphy->txpwr_limit_5g[regulation][bandwidth]
1725 				[rate_section][channel_index][RF90_PATH_A]);
1726 	} else {
1727 		rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
1728 			"Cannot recognize the band info in %s\n", pband);
1729 		return;
1730 	}
1731 }
1732 
_rtl8812ae_phy_config_bb_txpwr_lmt(struct ieee80211_hw * hw,const char * regulation,const char * band,const char * bandwidth,const char * rate_section,const char * rf_path,const char * channel,const char * power_limit)1733 static void _rtl8812ae_phy_config_bb_txpwr_lmt(struct ieee80211_hw *hw,
1734 					  const char *regulation, const char *band,
1735 					  const char *bandwidth, const char *rate_section,
1736 					  const char *rf_path, const char *channel,
1737 					  const char *power_limit)
1738 {
1739 	_rtl8812ae_phy_set_txpower_limit(hw, regulation, band, bandwidth,
1740 					 rate_section, rf_path, channel,
1741 					 power_limit);
1742 }
1743 
_rtl8821ae_phy_read_and_config_txpwr_lmt(struct ieee80211_hw * hw)1744 static void _rtl8821ae_phy_read_and_config_txpwr_lmt(struct ieee80211_hw *hw)
1745 {
1746 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1747 	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1748 	u32 i = 0;
1749 	u32 array_len;
1750 	const char **array;
1751 
1752 	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
1753 		array_len = RTL8812AE_TXPWR_LMT_ARRAY_LEN;
1754 		array = RTL8812AE_TXPWR_LMT;
1755 	} else {
1756 		array_len = RTL8821AE_TXPWR_LMT_ARRAY_LEN;
1757 		array = RTL8821AE_TXPWR_LMT;
1758 	}
1759 
1760 	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "\n");
1761 
1762 	for (i = 0; i < array_len; i += 7) {
1763 		const char *regulation = array[i];
1764 		const char *band = array[i+1];
1765 		const char *bandwidth = array[i+2];
1766 		const char *rate = array[i+3];
1767 		const char *rf_path = array[i+4];
1768 		const char *chnl = array[i+5];
1769 		const char *val = array[i+6];
1770 
1771 		_rtl8812ae_phy_config_bb_txpwr_lmt(hw, regulation, band,
1772 						   bandwidth, rate, rf_path,
1773 						   chnl, val);
1774 	}
1775 }
1776 
_rtl8821ae_phy_bb8821a_config_parafile(struct ieee80211_hw * hw)1777 static bool _rtl8821ae_phy_bb8821a_config_parafile(struct ieee80211_hw *hw)
1778 {
1779 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1780 	struct rtl_phy *rtlphy = &rtlpriv->phy;
1781 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1782 	bool rtstatus;
1783 
1784 	_rtl8821ae_phy_init_txpower_limit(hw);
1785 
1786 	/* RegEnableTxPowerLimit == 1 for 8812a & 8821a */
1787 	if (rtlefuse->eeprom_regulatory != 2)
1788 		_rtl8821ae_phy_read_and_config_txpwr_lmt(hw);
1789 
1790 	rtstatus = _rtl8821ae_phy_config_bb_with_headerfile(hw,
1791 						       BASEBAND_CONFIG_PHY_REG);
1792 	if (!rtstatus) {
1793 		pr_err("Write BB Reg Fail!!\n");
1794 		return false;
1795 	}
1796 	_rtl8821ae_phy_init_tx_power_by_rate(hw);
1797 	if (!rtlefuse->autoload_failflag) {
1798 		rtstatus = _rtl8821ae_phy_config_bb_with_pgheaderfile(hw,
1799 						    BASEBAND_CONFIG_PHY_REG);
1800 	}
1801 	if (!rtstatus) {
1802 		pr_err("BB_PG Reg Fail!!\n");
1803 		return false;
1804 	}
1805 
1806 	_rtl8821ae_phy_txpower_by_rate_configuration(hw);
1807 
1808 	/* RegEnableTxPowerLimit == 1 for 8812a & 8821a */
1809 	if (rtlefuse->eeprom_regulatory != 2)
1810 		_rtl8812ae_phy_convert_txpower_limit_to_power_index(hw);
1811 
1812 	rtstatus = _rtl8821ae_phy_config_bb_with_headerfile(hw,
1813 						BASEBAND_CONFIG_AGC_TAB);
1814 
1815 	if (!rtstatus) {
1816 		pr_err("AGC Table Fail\n");
1817 		return false;
1818 	}
1819 	rtlphy->cck_high_power = (bool)(rtl_get_bbreg(hw,
1820 			RFPGA0_XA_HSSIPARAMETER2, 0x200));
1821 	return true;
1822 }
1823 
1824 static bool
__rtl8821ae_phy_config_with_headerfile(struct ieee80211_hw * hw,u32 * array_table,u16 arraylen,void (* set_reg)(struct ieee80211_hw * hw,u32 regaddr,u32 data))1825 __rtl8821ae_phy_config_with_headerfile(struct ieee80211_hw *hw,
1826 				       u32 *array_table, u16 arraylen,
1827 				       void (*set_reg)(struct ieee80211_hw *hw,
1828 						       u32 regaddr, u32 data))
1829 {
1830 	#define COND_ELSE  2
1831 	#define COND_ENDIF 3
1832 
1833 	int i = 0;
1834 	u8 cond;
1835 	bool matched = true, skipped = false;
1836 
1837 	while ((i + 1) < arraylen) {
1838 		u32 v1 = array_table[i];
1839 		u32 v2 = array_table[i + 1];
1840 
1841 		if (v1 & (BIT(31) | BIT(30))) {/*positive & negative condition*/
1842 			if (v1 & BIT(31)) {/* positive condition*/
1843 				cond  = (u8)((v1 & (BIT(29) | BIT(28))) >> 28);
1844 				if (cond == COND_ENDIF) {/*end*/
1845 					matched = true;
1846 					skipped = false;
1847 				} else if (cond == COND_ELSE) /*else*/
1848 					matched = skipped ? false : true;
1849 				else {/*if , else if*/
1850 					if (skipped) {
1851 						matched = false;
1852 					} else {
1853 						if (_rtl8821ae_check_positive(
1854 								hw, v1, v2)) {
1855 							matched = true;
1856 							skipped = true;
1857 						} else {
1858 							matched = false;
1859 							skipped = false;
1860 						}
1861 					}
1862 				}
1863 			} else if (v1 & BIT(30)) { /*negative condition*/
1864 			/*do nothing*/
1865 			}
1866 		} else {
1867 			if (matched)
1868 				set_reg(hw, v1, v2);
1869 		}
1870 		i = i + 2;
1871 	}
1872 
1873 	return true;
1874 }
1875 
_rtl8821ae_phy_config_mac_with_headerfile(struct ieee80211_hw * hw)1876 static bool _rtl8821ae_phy_config_mac_with_headerfile(struct ieee80211_hw *hw)
1877 {
1878 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1879 	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1880 	u32 arraylength;
1881 	u32 *ptrarray;
1882 
1883 	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "Read MAC_REG_Array\n");
1884 	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1885 		arraylength = RTL8821AE_MAC_1T_ARRAYLEN;
1886 		ptrarray = RTL8821AE_MAC_REG_ARRAY;
1887 	} else {
1888 		arraylength = RTL8812AE_MAC_1T_ARRAYLEN;
1889 		ptrarray = RTL8812AE_MAC_REG_ARRAY;
1890 	}
1891 	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1892 		"Img: MAC_REG_ARRAY LEN %d\n", arraylength);
1893 
1894 	return __rtl8821ae_phy_config_with_headerfile(hw,
1895 			ptrarray, arraylength, rtl_write_byte_with_val32);
1896 }
1897 
_rtl8821ae_phy_config_bb_with_headerfile(struct ieee80211_hw * hw,u8 configtype)1898 static bool _rtl8821ae_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
1899 						     u8 configtype)
1900 {
1901 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1902 	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1903 	u32 *array_table;
1904 	u16 arraylen;
1905 
1906 	if (configtype == BASEBAND_CONFIG_PHY_REG) {
1907 		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
1908 			arraylen = RTL8812AE_PHY_REG_1TARRAYLEN;
1909 			array_table = RTL8812AE_PHY_REG_ARRAY;
1910 		} else {
1911 			arraylen = RTL8821AE_PHY_REG_1TARRAYLEN;
1912 			array_table = RTL8821AE_PHY_REG_ARRAY;
1913 		}
1914 
1915 		return __rtl8821ae_phy_config_with_headerfile(hw,
1916 				array_table, arraylen,
1917 				_rtl8821ae_config_bb_reg);
1918 	} else if (configtype == BASEBAND_CONFIG_AGC_TAB) {
1919 		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
1920 			arraylen = RTL8812AE_AGC_TAB_1TARRAYLEN;
1921 			array_table = RTL8812AE_AGC_TAB_ARRAY;
1922 		} else {
1923 			arraylen = RTL8821AE_AGC_TAB_1TARRAYLEN;
1924 			array_table = RTL8821AE_AGC_TAB_ARRAY;
1925 		}
1926 
1927 		return __rtl8821ae_phy_config_with_headerfile(hw,
1928 				array_table, arraylen,
1929 				rtl_set_bbreg_with_dwmask);
1930 	}
1931 	return true;
1932 }
1933 
_rtl8821ae_get_rate_section_index(u32 regaddr)1934 static u8 _rtl8821ae_get_rate_section_index(u32 regaddr)
1935 {
1936 	u8 index = 0;
1937 	regaddr &= 0xFFF;
1938 	if (regaddr >= 0xC20 && regaddr <= 0xC4C)
1939 		index = (u8)((regaddr - 0xC20) / 4);
1940 	else if (regaddr >= 0xE20 && regaddr <= 0xE4C)
1941 		index = (u8)((regaddr - 0xE20) / 4);
1942 	else
1943 		WARN_ONCE(true,
1944 			  "rtl8821ae: Invalid RegAddr 0x%x\n", regaddr);
1945 	return index;
1946 }
1947 
_rtl8821ae_store_tx_power_by_rate(struct ieee80211_hw * hw,u32 band,u32 rfpath,u32 txnum,u32 regaddr,u32 bitmask,u32 data)1948 static void _rtl8821ae_store_tx_power_by_rate(struct ieee80211_hw *hw,
1949 					      u32 band, u32 rfpath,
1950 					      u32 txnum, u32 regaddr,
1951 					      u32 bitmask, u32 data)
1952 {
1953 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1954 	struct rtl_phy *rtlphy = &rtlpriv->phy;
1955 	u8 rate_section = _rtl8821ae_get_rate_section_index(regaddr);
1956 
1957 	if (band != BAND_ON_2_4G && band != BAND_ON_5G) {
1958 		rtl_dbg(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid Band %d\n", band);
1959 		band = BAND_ON_2_4G;
1960 	}
1961 	if (rfpath >= MAX_RF_PATH) {
1962 		rtl_dbg(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid RfPath %d\n", rfpath);
1963 		rfpath = MAX_RF_PATH - 1;
1964 	}
1965 	if (txnum >= MAX_RF_PATH) {
1966 		rtl_dbg(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid TxNum %d\n", txnum);
1967 		txnum = MAX_RF_PATH - 1;
1968 	}
1969 	rtlphy->tx_power_by_rate_offset[band][rfpath][txnum][rate_section] = data;
1970 	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1971 		"TxPwrByRateOffset[Band %d][RfPath %d][TxNum %d][RateSection %d] = 0x%x\n",
1972 		band, rfpath, txnum, rate_section,
1973 		rtlphy->tx_power_by_rate_offset[band][rfpath][txnum][rate_section]);
1974 }
1975 
_rtl8821ae_phy_config_bb_with_pgheaderfile(struct ieee80211_hw * hw,u8 configtype)1976 static bool _rtl8821ae_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
1977 							u8 configtype)
1978 {
1979 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1980 	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1981 	int i;
1982 	u32 *array;
1983 	u16 arraylen;
1984 	u32 v1, v2, v3, v4, v5, v6;
1985 
1986 	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
1987 		arraylen = RTL8812AE_PHY_REG_ARRAY_PGLEN;
1988 		array = RTL8812AE_PHY_REG_ARRAY_PG;
1989 	} else {
1990 		arraylen = RTL8821AE_PHY_REG_ARRAY_PGLEN;
1991 		array = RTL8821AE_PHY_REG_ARRAY_PG;
1992 	}
1993 
1994 	if (configtype != BASEBAND_CONFIG_PHY_REG) {
1995 		rtl_dbg(rtlpriv, COMP_SEND, DBG_TRACE,
1996 			"configtype != BaseBand_Config_PHY_REG\n");
1997 		return true;
1998 	}
1999 	for (i = 0; i < arraylen; i += 6) {
2000 		v1 = array[i];
2001 		v2 = array[i+1];
2002 		v3 = array[i+2];
2003 		v4 = array[i+3];
2004 		v5 = array[i+4];
2005 		v6 = array[i+5];
2006 
2007 		if (v1 < 0xCDCDCDCD) {
2008 			if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE &&
2009 				(v4 == 0xfe || v4 == 0xffe)) {
2010 				msleep(50);
2011 				continue;
2012 			}
2013 
2014 			if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
2015 				if (v4 == 0xfe)
2016 					msleep(50);
2017 				else if (v4 == 0xfd)
2018 					mdelay(5);
2019 				else if (v4 == 0xfc)
2020 					mdelay(1);
2021 				else if (v4 == 0xfb)
2022 					udelay(50);
2023 				else if (v4 == 0xfa)
2024 					udelay(5);
2025 				else if (v4 == 0xf9)
2026 					udelay(1);
2027 			}
2028 			_rtl8821ae_store_tx_power_by_rate(hw, v1, v2, v3,
2029 							  v4, v5, v6);
2030 			continue;
2031 		} else {
2032 			 /*don't need the hw_body*/
2033 			if (!_rtl8821ae_check_condition(hw, v1)) {
2034 				i += 2; /* skip the pair of expression*/
2035 				v2 = array[i+1];
2036 				while (v2 != 0xDEAD) {
2037 					i += 3;
2038 					v2 = array[i + 1];
2039 				}
2040 			}
2041 		}
2042 	}
2043 
2044 	return true;
2045 }
2046 
rtl8812ae_phy_config_rf_with_headerfile(struct ieee80211_hw * hw,enum radio_path rfpath)2047 bool rtl8812ae_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
2048 					     enum radio_path rfpath)
2049 {
2050 	u32 *radioa_array_table_a, *radioa_array_table_b;
2051 	u16 radioa_arraylen_a, radioa_arraylen_b;
2052 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2053 
2054 	radioa_arraylen_a = RTL8812AE_RADIOA_1TARRAYLEN;
2055 	radioa_array_table_a = RTL8812AE_RADIOA_ARRAY;
2056 	radioa_arraylen_b = RTL8812AE_RADIOB_1TARRAYLEN;
2057 	radioa_array_table_b = RTL8812AE_RADIOB_ARRAY;
2058 	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2059 		"Radio_A:RTL8821AE_RADIOA_ARRAY %d\n", radioa_arraylen_a);
2060 	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath);
2061 	switch (rfpath) {
2062 	case RF90_PATH_A:
2063 		return __rtl8821ae_phy_config_with_headerfile(hw,
2064 				radioa_array_table_a, radioa_arraylen_a,
2065 				_rtl8821ae_config_rf_radio_a);
2066 	case RF90_PATH_B:
2067 		return __rtl8821ae_phy_config_with_headerfile(hw,
2068 				radioa_array_table_b, radioa_arraylen_b,
2069 				_rtl8821ae_config_rf_radio_b);
2070 	case RF90_PATH_C:
2071 	case RF90_PATH_D:
2072 		pr_err("switch case %#x not processed\n", rfpath);
2073 		break;
2074 	}
2075 	return true;
2076 }
2077 
rtl8821ae_phy_config_rf_with_headerfile(struct ieee80211_hw * hw,enum radio_path rfpath)2078 bool rtl8821ae_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
2079 						enum radio_path rfpath)
2080 {
2081 	u32 *radioa_array_table;
2082 	u16 radioa_arraylen;
2083 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2084 
2085 	radioa_arraylen = RTL8821AE_RADIOA_1TARRAYLEN;
2086 	radioa_array_table = RTL8821AE_RADIOA_ARRAY;
2087 	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2088 		"Radio_A:RTL8821AE_RADIOA_ARRAY %d\n", radioa_arraylen);
2089 	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath);
2090 	switch (rfpath) {
2091 	case RF90_PATH_A:
2092 		return __rtl8821ae_phy_config_with_headerfile(hw,
2093 			radioa_array_table, radioa_arraylen,
2094 			_rtl8821ae_config_rf_radio_a);
2095 
2096 	case RF90_PATH_B:
2097 	case RF90_PATH_C:
2098 	case RF90_PATH_D:
2099 		pr_err("switch case %#x not processed\n", rfpath);
2100 		break;
2101 	}
2102 	return true;
2103 }
2104 
rtl8821ae_phy_get_hw_reg_originalvalue(struct ieee80211_hw * hw)2105 void rtl8821ae_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
2106 {
2107 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2108 	struct rtl_phy *rtlphy = &rtlpriv->phy;
2109 
2110 	rtlphy->default_initialgain[0] =
2111 	    (u8)rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
2112 	rtlphy->default_initialgain[1] =
2113 	    (u8)rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0);
2114 	rtlphy->default_initialgain[2] =
2115 	    (u8)rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0);
2116 	rtlphy->default_initialgain[3] =
2117 	    (u8)rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0);
2118 
2119 	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
2120 		"Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n",
2121 		rtlphy->default_initialgain[0],
2122 		rtlphy->default_initialgain[1],
2123 		rtlphy->default_initialgain[2],
2124 		rtlphy->default_initialgain[3]);
2125 
2126 	rtlphy->framesync = (u8)rtl_get_bbreg(hw,
2127 					       ROFDM0_RXDETECTOR3, MASKBYTE0);
2128 	rtlphy->framesync_c34 = rtl_get_bbreg(hw,
2129 					      ROFDM0_RXDETECTOR2, MASKDWORD);
2130 
2131 	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
2132 		"Default framesync (0x%x) = 0x%x\n",
2133 		ROFDM0_RXDETECTOR3, rtlphy->framesync);
2134 }
2135 
phy_init_bb_rf_register_definition(struct ieee80211_hw * hw)2136 static void phy_init_bb_rf_register_definition(struct ieee80211_hw *hw)
2137 {
2138 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2139 	struct rtl_phy *rtlphy = &rtlpriv->phy;
2140 
2141 	rtlphy->phyreg_def[RF90_PATH_A].rfintfs = RFPGA0_XAB_RFINTERFACESW;
2142 	rtlphy->phyreg_def[RF90_PATH_B].rfintfs = RFPGA0_XAB_RFINTERFACESW;
2143 
2144 	rtlphy->phyreg_def[RF90_PATH_A].rfintfo = RFPGA0_XA_RFINTERFACEOE;
2145 	rtlphy->phyreg_def[RF90_PATH_B].rfintfo = RFPGA0_XB_RFINTERFACEOE;
2146 
2147 	rtlphy->phyreg_def[RF90_PATH_A].rfintfe = RFPGA0_XA_RFINTERFACEOE;
2148 	rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE;
2149 
2150 	rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset = RA_LSSIWRITE_8821A;
2151 	rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset = RB_LSSIWRITE_8821A;
2152 
2153 	rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para2 = RHSSIREAD_8821AE;
2154 	rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para2 = RHSSIREAD_8821AE;
2155 
2156 	rtlphy->phyreg_def[RF90_PATH_A].rf_rb = RA_SIREAD_8821A;
2157 	rtlphy->phyreg_def[RF90_PATH_B].rf_rb = RB_SIREAD_8821A;
2158 
2159 	rtlphy->phyreg_def[RF90_PATH_A].rf_rbpi = RA_PIREAD_8821A;
2160 	rtlphy->phyreg_def[RF90_PATH_B].rf_rbpi = RB_PIREAD_8821A;
2161 }
2162 
rtl8821ae_phy_get_txpower_level(struct ieee80211_hw * hw,long * powerlevel)2163 void rtl8821ae_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel)
2164 {
2165 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2166 	struct rtl_phy *rtlphy = &rtlpriv->phy;
2167 	u8 txpwr_level;
2168 	long txpwr_dbm;
2169 
2170 	txpwr_level = rtlphy->cur_cck_txpwridx;
2171 	txpwr_dbm = _rtl8821ae_phy_txpwr_idx_to_dbm(hw,
2172 						 WIRELESS_MODE_B, txpwr_level);
2173 	txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
2174 	if (_rtl8821ae_phy_txpwr_idx_to_dbm(hw,
2175 					 WIRELESS_MODE_G,
2176 					 txpwr_level) > txpwr_dbm)
2177 		txpwr_dbm =
2178 		    _rtl8821ae_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G,
2179 						 txpwr_level);
2180 	txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
2181 	if (_rtl8821ae_phy_txpwr_idx_to_dbm(hw,
2182 					 WIRELESS_MODE_N_24G,
2183 					 txpwr_level) > txpwr_dbm)
2184 		txpwr_dbm =
2185 		    _rtl8821ae_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_N_24G,
2186 						 txpwr_level);
2187 	*powerlevel = txpwr_dbm;
2188 }
2189 
_rtl8821ae_phy_get_chnl_index(u8 channel,u8 * chnl_index)2190 static bool _rtl8821ae_phy_get_chnl_index(u8 channel, u8 *chnl_index)
2191 {
2192 	u8 i = 0;
2193 	bool in_24g = true;
2194 
2195 	if (channel <= 14) {
2196 		in_24g = true;
2197 		*chnl_index = channel - 1;
2198 	} else {
2199 		in_24g = false;
2200 
2201 		for (i = 0; i < CHANNEL_MAX_NUMBER_5G; ++i) {
2202 			if (channel5g[i] == channel) {
2203 				*chnl_index = i;
2204 				return in_24g;
2205 			}
2206 		}
2207 	}
2208 	return in_24g;
2209 }
2210 
_rtl8821ae_phy_get_ratesection_intxpower_byrate(u8 path,u8 rate)2211 static s8 _rtl8821ae_phy_get_ratesection_intxpower_byrate(u8 path, u8 rate)
2212 {
2213 	s8 rate_section = 0;
2214 	switch (rate) {
2215 	case DESC_RATE1M:
2216 	case DESC_RATE2M:
2217 	case DESC_RATE5_5M:
2218 	case DESC_RATE11M:
2219 		rate_section = 0;
2220 		break;
2221 	case DESC_RATE6M:
2222 	case DESC_RATE9M:
2223 	case DESC_RATE12M:
2224 	case DESC_RATE18M:
2225 		rate_section = 1;
2226 		break;
2227 	case DESC_RATE24M:
2228 	case DESC_RATE36M:
2229 	case DESC_RATE48M:
2230 	case DESC_RATE54M:
2231 		rate_section = 2;
2232 		break;
2233 	case DESC_RATEMCS0:
2234 	case DESC_RATEMCS1:
2235 	case DESC_RATEMCS2:
2236 	case DESC_RATEMCS3:
2237 		rate_section = 3;
2238 		break;
2239 	case DESC_RATEMCS4:
2240 	case DESC_RATEMCS5:
2241 	case DESC_RATEMCS6:
2242 	case DESC_RATEMCS7:
2243 		rate_section = 4;
2244 		break;
2245 	case DESC_RATEMCS8:
2246 	case DESC_RATEMCS9:
2247 	case DESC_RATEMCS10:
2248 	case DESC_RATEMCS11:
2249 		rate_section = 5;
2250 		break;
2251 	case DESC_RATEMCS12:
2252 	case DESC_RATEMCS13:
2253 	case DESC_RATEMCS14:
2254 	case DESC_RATEMCS15:
2255 		rate_section = 6;
2256 		break;
2257 	case DESC_RATEVHT1SS_MCS0:
2258 	case DESC_RATEVHT1SS_MCS1:
2259 	case DESC_RATEVHT1SS_MCS2:
2260 	case DESC_RATEVHT1SS_MCS3:
2261 		rate_section = 7;
2262 		break;
2263 	case DESC_RATEVHT1SS_MCS4:
2264 	case DESC_RATEVHT1SS_MCS5:
2265 	case DESC_RATEVHT1SS_MCS6:
2266 	case DESC_RATEVHT1SS_MCS7:
2267 		rate_section = 8;
2268 		break;
2269 	case DESC_RATEVHT1SS_MCS8:
2270 	case DESC_RATEVHT1SS_MCS9:
2271 	case DESC_RATEVHT2SS_MCS0:
2272 	case DESC_RATEVHT2SS_MCS1:
2273 		rate_section = 9;
2274 		break;
2275 	case DESC_RATEVHT2SS_MCS2:
2276 	case DESC_RATEVHT2SS_MCS3:
2277 	case DESC_RATEVHT2SS_MCS4:
2278 	case DESC_RATEVHT2SS_MCS5:
2279 		rate_section = 10;
2280 		break;
2281 	case DESC_RATEVHT2SS_MCS6:
2282 	case DESC_RATEVHT2SS_MCS7:
2283 	case DESC_RATEVHT2SS_MCS8:
2284 	case DESC_RATEVHT2SS_MCS9:
2285 		rate_section = 11;
2286 		break;
2287 	default:
2288 		WARN_ONCE(true, "rtl8821ae: Rate_Section is Illegal\n");
2289 		break;
2290 	}
2291 
2292 	return rate_section;
2293 }
2294 
_rtl8812ae_phy_get_world_wide_limit(s8 * limit_table)2295 static s8 _rtl8812ae_phy_get_world_wide_limit(s8  *limit_table)
2296 {
2297 	s8 min = limit_table[0];
2298 	u8 i = 0;
2299 
2300 	for (i = 0; i < MAX_REGULATION_NUM; ++i) {
2301 		if (limit_table[i] < min)
2302 			min = limit_table[i];
2303 	}
2304 	return min;
2305 }
2306 
_rtl8812ae_phy_get_txpower_limit(struct ieee80211_hw * hw,u8 band,enum ht_channel_width bandwidth,enum radio_path rf_path,u8 rate,u8 channel)2307 static s8 _rtl8812ae_phy_get_txpower_limit(struct ieee80211_hw *hw,
2308 					     u8 band,
2309 					     enum ht_channel_width bandwidth,
2310 					     enum radio_path rf_path,
2311 					     u8 rate, u8 channel)
2312 {
2313 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2314 	struct rtl_efuse *rtlefuse = rtl_efuse(rtlpriv);
2315 	struct rtl_phy *rtlphy = &rtlpriv->phy;
2316 	short band_temp = -1, regulation = -1, bandwidth_temp = -1,
2317 		 rate_section = -1, channel_temp = -1;
2318 	u16 regu, bdwidth, sec, chnl;
2319 	s8 power_limit = MAX_POWER_INDEX;
2320 
2321 	if (rtlefuse->eeprom_regulatory == 2)
2322 		return MAX_POWER_INDEX;
2323 
2324 	regulation = TXPWR_LMT_WW;
2325 
2326 	if (band == BAND_ON_2_4G)
2327 		band_temp = 0;
2328 	else if (band == BAND_ON_5G)
2329 		band_temp = 1;
2330 
2331 	if (bandwidth == HT_CHANNEL_WIDTH_20)
2332 		bandwidth_temp = 0;
2333 	else if (bandwidth == HT_CHANNEL_WIDTH_20_40)
2334 		bandwidth_temp = 1;
2335 	else if (bandwidth == HT_CHANNEL_WIDTH_80)
2336 		bandwidth_temp = 2;
2337 
2338 	switch (rate) {
2339 	case DESC_RATE1M:
2340 	case DESC_RATE2M:
2341 	case DESC_RATE5_5M:
2342 	case DESC_RATE11M:
2343 		rate_section = 0;
2344 		break;
2345 	case DESC_RATE6M:
2346 	case DESC_RATE9M:
2347 	case DESC_RATE12M:
2348 	case DESC_RATE18M:
2349 	case DESC_RATE24M:
2350 	case DESC_RATE36M:
2351 	case DESC_RATE48M:
2352 	case DESC_RATE54M:
2353 		rate_section = 1;
2354 		break;
2355 	case DESC_RATEMCS0:
2356 	case DESC_RATEMCS1:
2357 	case DESC_RATEMCS2:
2358 	case DESC_RATEMCS3:
2359 	case DESC_RATEMCS4:
2360 	case DESC_RATEMCS5:
2361 	case DESC_RATEMCS6:
2362 	case DESC_RATEMCS7:
2363 		rate_section = 2;
2364 		break;
2365 	case DESC_RATEMCS8:
2366 	case DESC_RATEMCS9:
2367 	case DESC_RATEMCS10:
2368 	case DESC_RATEMCS11:
2369 	case DESC_RATEMCS12:
2370 	case DESC_RATEMCS13:
2371 	case DESC_RATEMCS14:
2372 	case DESC_RATEMCS15:
2373 		rate_section = 3;
2374 		break;
2375 	case DESC_RATEVHT1SS_MCS0:
2376 	case DESC_RATEVHT1SS_MCS1:
2377 	case DESC_RATEVHT1SS_MCS2:
2378 	case DESC_RATEVHT1SS_MCS3:
2379 	case DESC_RATEVHT1SS_MCS4:
2380 	case DESC_RATEVHT1SS_MCS5:
2381 	case DESC_RATEVHT1SS_MCS6:
2382 	case DESC_RATEVHT1SS_MCS7:
2383 	case DESC_RATEVHT1SS_MCS8:
2384 	case DESC_RATEVHT1SS_MCS9:
2385 		rate_section = 4;
2386 		break;
2387 	case DESC_RATEVHT2SS_MCS0:
2388 	case DESC_RATEVHT2SS_MCS1:
2389 	case DESC_RATEVHT2SS_MCS2:
2390 	case DESC_RATEVHT2SS_MCS3:
2391 	case DESC_RATEVHT2SS_MCS4:
2392 	case DESC_RATEVHT2SS_MCS5:
2393 	case DESC_RATEVHT2SS_MCS6:
2394 	case DESC_RATEVHT2SS_MCS7:
2395 	case DESC_RATEVHT2SS_MCS8:
2396 	case DESC_RATEVHT2SS_MCS9:
2397 		rate_section = 5;
2398 		break;
2399 	default:
2400 		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
2401 			"Wrong rate 0x%x\n", rate);
2402 		break;
2403 	}
2404 
2405 	if (band_temp == BAND_ON_5G  && rate_section == 0)
2406 		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
2407 			"Wrong rate 0x%x: No CCK in 5G Band\n", rate);
2408 
2409 	/*workaround for wrong index combination to obtain tx power limit,
2410 	  OFDM only exists in BW 20M*/
2411 	if (rate_section == 1)
2412 		bandwidth_temp = 0;
2413 
2414 	/*workaround for wrong index combination to obtain tx power limit,
2415 	 *HT on 80M will reference to HT on 40M
2416 	 */
2417 	if ((rate_section == 2 || rate_section == 3) && band == BAND_ON_5G &&
2418 	    bandwidth_temp == 2)
2419 		bandwidth_temp = 1;
2420 
2421 	if (band == BAND_ON_2_4G)
2422 		channel_temp = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw,
2423 		BAND_ON_2_4G, channel);
2424 	else if (band == BAND_ON_5G)
2425 		channel_temp = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw,
2426 		BAND_ON_5G, channel);
2427 	else if (band == BAND_ON_BOTH) {
2428 		;/* BAND_ON_BOTH don't care temporarily */
2429 	}
2430 
2431 	if (band_temp == -1 || regulation == -1 || bandwidth_temp == -1 ||
2432 		rate_section == -1 || channel_temp == -1) {
2433 		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
2434 			"Wrong index value to access power limit table [band %d][regulation %d][bandwidth %d][rf_path %d][rate_section %d][chnl %d]\n",
2435 			band_temp, regulation, bandwidth_temp, rf_path,
2436 			rate_section, channel_temp);
2437 		return MAX_POWER_INDEX;
2438 	}
2439 
2440 	regu = regulation;
2441 	bdwidth = bandwidth_temp;
2442 	sec = rate_section;
2443 	chnl = channel_temp;
2444 
2445 	if (band == BAND_ON_2_4G) {
2446 		s8 limits[10] = {0};
2447 		u8 i;
2448 
2449 		for (i = 0; i < 4; ++i)
2450 			limits[i] = rtlphy->txpwr_limit_2_4g[i][bdwidth]
2451 			[sec][chnl][rf_path];
2452 
2453 		power_limit = (regulation == TXPWR_LMT_WW) ?
2454 			_rtl8812ae_phy_get_world_wide_limit(limits) :
2455 			rtlphy->txpwr_limit_2_4g[regu][bdwidth]
2456 					[sec][chnl][rf_path];
2457 	} else if (band == BAND_ON_5G) {
2458 		s8 limits[10] = {0};
2459 		u8 i;
2460 
2461 		for (i = 0; i < MAX_REGULATION_NUM; ++i)
2462 			limits[i] = rtlphy->txpwr_limit_5g[i][bdwidth]
2463 			[sec][chnl][rf_path];
2464 
2465 		power_limit = (regulation == TXPWR_LMT_WW) ?
2466 			_rtl8812ae_phy_get_world_wide_limit(limits) :
2467 			rtlphy->txpwr_limit_5g[regu][chnl]
2468 			[sec][chnl][rf_path];
2469 	} else {
2470 		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2471 			"No power limit table of the specified band\n");
2472 	}
2473 	return power_limit;
2474 }
2475 
_rtl8821ae_phy_get_txpower_by_rate(struct ieee80211_hw * hw,u8 band,u8 path,u8 rate)2476 static s8 _rtl8821ae_phy_get_txpower_by_rate(struct ieee80211_hw *hw,
2477 					u8 band, u8 path, u8 rate)
2478 {
2479 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2480 	struct rtl_phy *rtlphy = &rtlpriv->phy;
2481 	u8 shift = 0, rate_section, tx_num;
2482 	s8 tx_pwr_diff = 0;
2483 	s8 limit = 0;
2484 
2485 	rate_section = _rtl8821ae_phy_get_ratesection_intxpower_byrate(path, rate);
2486 	tx_num = RF_TX_NUM_NONIMPLEMENT;
2487 
2488 	if (tx_num == RF_TX_NUM_NONIMPLEMENT) {
2489 		if ((rate >= DESC_RATEMCS8 && rate <= DESC_RATEMCS15) ||
2490 			(rate >= DESC_RATEVHT2SS_MCS2 && rate <= DESC_RATEVHT2SS_MCS9))
2491 			tx_num = RF_2TX;
2492 		else
2493 			tx_num = RF_1TX;
2494 	}
2495 
2496 	switch (rate) {
2497 	case DESC_RATE1M:
2498 	case DESC_RATE6M:
2499 	case DESC_RATE24M:
2500 	case DESC_RATEMCS0:
2501 	case DESC_RATEMCS4:
2502 	case DESC_RATEMCS8:
2503 	case DESC_RATEMCS12:
2504 	case DESC_RATEVHT1SS_MCS0:
2505 	case DESC_RATEVHT1SS_MCS4:
2506 	case DESC_RATEVHT1SS_MCS8:
2507 	case DESC_RATEVHT2SS_MCS2:
2508 	case DESC_RATEVHT2SS_MCS6:
2509 		shift = 0;
2510 		break;
2511 	case DESC_RATE2M:
2512 	case DESC_RATE9M:
2513 	case DESC_RATE36M:
2514 	case DESC_RATEMCS1:
2515 	case DESC_RATEMCS5:
2516 	case DESC_RATEMCS9:
2517 	case DESC_RATEMCS13:
2518 	case DESC_RATEVHT1SS_MCS1:
2519 	case DESC_RATEVHT1SS_MCS5:
2520 	case DESC_RATEVHT1SS_MCS9:
2521 	case DESC_RATEVHT2SS_MCS3:
2522 	case DESC_RATEVHT2SS_MCS7:
2523 		shift = 8;
2524 		break;
2525 	case DESC_RATE5_5M:
2526 	case DESC_RATE12M:
2527 	case DESC_RATE48M:
2528 	case DESC_RATEMCS2:
2529 	case DESC_RATEMCS6:
2530 	case DESC_RATEMCS10:
2531 	case DESC_RATEMCS14:
2532 	case DESC_RATEVHT1SS_MCS2:
2533 	case DESC_RATEVHT1SS_MCS6:
2534 	case DESC_RATEVHT2SS_MCS0:
2535 	case DESC_RATEVHT2SS_MCS4:
2536 	case DESC_RATEVHT2SS_MCS8:
2537 		shift = 16;
2538 		break;
2539 	case DESC_RATE11M:
2540 	case DESC_RATE18M:
2541 	case DESC_RATE54M:
2542 	case DESC_RATEMCS3:
2543 	case DESC_RATEMCS7:
2544 	case DESC_RATEMCS11:
2545 	case DESC_RATEMCS15:
2546 	case DESC_RATEVHT1SS_MCS3:
2547 	case DESC_RATEVHT1SS_MCS7:
2548 	case DESC_RATEVHT2SS_MCS1:
2549 	case DESC_RATEVHT2SS_MCS5:
2550 	case DESC_RATEVHT2SS_MCS9:
2551 		shift = 24;
2552 		break;
2553 	default:
2554 		WARN_ONCE(true, "rtl8821ae: Rate_Section is Illegal\n");
2555 		break;
2556 	}
2557 
2558 	tx_pwr_diff = (u8)(rtlphy->tx_power_by_rate_offset[band][path]
2559 		[tx_num][rate_section] >> shift) & 0xff;
2560 
2561 	/* RegEnableTxPowerLimit == 1 for 8812a & 8821a */
2562 	if (rtlpriv->efuse.eeprom_regulatory != 2) {
2563 		limit = _rtl8812ae_phy_get_txpower_limit(hw, band,
2564 			rtlphy->current_chan_bw, path, rate,
2565 			rtlphy->current_channel);
2566 
2567 		if (rate == DESC_RATEVHT1SS_MCS8 || rate == DESC_RATEVHT1SS_MCS9  ||
2568 			 rate == DESC_RATEVHT2SS_MCS8 || rate == DESC_RATEVHT2SS_MCS9) {
2569 			if (limit < 0) {
2570 				if (tx_pwr_diff < (-limit))
2571 					tx_pwr_diff = -limit;
2572 			}
2573 		} else {
2574 			if (limit < 0)
2575 				tx_pwr_diff = limit;
2576 			else
2577 				tx_pwr_diff = tx_pwr_diff > limit ? limit : tx_pwr_diff;
2578 		}
2579 		rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2580 			"Maximum power by rate %d, final power by rate %d\n",
2581 			limit, tx_pwr_diff);
2582 	}
2583 
2584 	return	tx_pwr_diff;
2585 }
2586 
_rtl8821ae_get_txpower_index(struct ieee80211_hw * hw,u8 path,u8 rate,u8 bandwidth,u8 channel)2587 static u8 _rtl8821ae_get_txpower_index(struct ieee80211_hw *hw, u8 path,
2588 					u8 rate, u8 bandwidth, u8 channel)
2589 {
2590 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2591 	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
2592 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2593 	u8 index = (channel - 1);
2594 	u8 txpower = 0;
2595 	bool in_24g = false;
2596 	s8 powerdiff_byrate = 0;
2597 
2598 	if (((rtlhal->current_bandtype == BAND_ON_2_4G) &&
2599 	    (channel > 14 || channel < 1)) ||
2600 	    ((rtlhal->current_bandtype == BAND_ON_5G) && (channel <= 14))) {
2601 		index = 0;
2602 		rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2603 			"Illegal channel!!\n");
2604 	}
2605 
2606 	in_24g = _rtl8821ae_phy_get_chnl_index(channel, &index);
2607 	if (in_24g) {
2608 		if (RTL8821AE_RX_HAL_IS_CCK_RATE(rate))
2609 			txpower = rtlefuse->txpwrlevel_cck[path][index];
2610 		else if (DESC_RATE6M <= rate)
2611 			txpower = rtlefuse->txpwrlevel_ht40_1s[path][index];
2612 		else
2613 			rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, "invalid rate\n");
2614 
2615 		if (DESC_RATE6M <= rate && rate <= DESC_RATE54M &&
2616 		    !RTL8821AE_RX_HAL_IS_CCK_RATE(rate))
2617 			txpower += rtlefuse->txpwr_legacyhtdiff[path][TX_1S];
2618 
2619 		if (bandwidth == HT_CHANNEL_WIDTH_20) {
2620 			if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
2621 				(DESC_RATEVHT1SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9))
2622 				txpower += rtlefuse->txpwr_ht20diff[path][TX_1S];
2623 			if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
2624 				(DESC_RATEVHT2SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9))
2625 				txpower += rtlefuse->txpwr_ht20diff[path][TX_2S];
2626 		} else if (bandwidth == HT_CHANNEL_WIDTH_20_40) {
2627 			if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
2628 				(DESC_RATEVHT1SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9))
2629 				txpower += rtlefuse->txpwr_ht40diff[path][TX_1S];
2630 			if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
2631 				(DESC_RATEVHT2SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9))
2632 				txpower += rtlefuse->txpwr_ht40diff[path][TX_2S];
2633 		} else if (bandwidth == HT_CHANNEL_WIDTH_80) {
2634 			if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
2635 			    (DESC_RATEVHT1SS_MCS0 <= rate &&
2636 			     rate <= DESC_RATEVHT2SS_MCS9))
2637 				txpower += rtlefuse->txpwr_ht40diff[path][TX_1S];
2638 			if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
2639 			    (DESC_RATEVHT2SS_MCS0 <= rate &&
2640 			     rate <= DESC_RATEVHT2SS_MCS9))
2641 				txpower += rtlefuse->txpwr_ht40diff[path][TX_2S];
2642 		}
2643 	} else {
2644 		if (DESC_RATE6M <= rate)
2645 			txpower = rtlefuse->txpwr_5g_bw40base[path][index];
2646 		else
2647 			rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_WARNING,
2648 				"INVALID Rate.\n");
2649 
2650 		if (DESC_RATE6M <= rate && rate <= DESC_RATE54M &&
2651 		    !RTL8821AE_RX_HAL_IS_CCK_RATE(rate))
2652 			txpower += rtlefuse->txpwr_5g_ofdmdiff[path][TX_1S];
2653 
2654 		if (bandwidth == HT_CHANNEL_WIDTH_20) {
2655 			if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
2656 			    (DESC_RATEVHT1SS_MCS0 <= rate &&
2657 			     rate <= DESC_RATEVHT2SS_MCS9))
2658 				txpower += rtlefuse->txpwr_5g_bw20diff[path][TX_1S];
2659 			if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
2660 			    (DESC_RATEVHT2SS_MCS0 <= rate &&
2661 			     rate <= DESC_RATEVHT2SS_MCS9))
2662 				txpower += rtlefuse->txpwr_5g_bw20diff[path][TX_2S];
2663 		} else if (bandwidth == HT_CHANNEL_WIDTH_20_40) {
2664 			if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
2665 			    (DESC_RATEVHT1SS_MCS0 <= rate &&
2666 			     rate <= DESC_RATEVHT2SS_MCS9))
2667 				txpower += rtlefuse->txpwr_5g_bw40diff[path][TX_1S];
2668 			if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
2669 			    (DESC_RATEVHT2SS_MCS0 <= rate &&
2670 			     rate <= DESC_RATEVHT2SS_MCS9))
2671 				txpower += rtlefuse->txpwr_5g_bw40diff[path][TX_2S];
2672 		} else if (bandwidth == HT_CHANNEL_WIDTH_80) {
2673 			u8 i;
2674 
2675 			for (i = 0; i < sizeof(channel5g_80m) / sizeof(u8); ++i)
2676 				if (channel5g_80m[i] == channel)
2677 					index = i;
2678 
2679 			if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
2680 			    (DESC_RATEVHT1SS_MCS0 <= rate &&
2681 			     rate <= DESC_RATEVHT2SS_MCS9))
2682 				txpower = rtlefuse->txpwr_5g_bw80base[path][index]
2683 					+ rtlefuse->txpwr_5g_bw80diff[path][TX_1S];
2684 			if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
2685 			    (DESC_RATEVHT2SS_MCS0 <= rate &&
2686 			     rate <= DESC_RATEVHT2SS_MCS9))
2687 				txpower = rtlefuse->txpwr_5g_bw80base[path][index]
2688 					+ rtlefuse->txpwr_5g_bw80diff[path][TX_1S]
2689 					+ rtlefuse->txpwr_5g_bw80diff[path][TX_2S];
2690 		    }
2691 	}
2692 	if (rtlefuse->eeprom_regulatory != 2)
2693 		powerdiff_byrate =
2694 		  _rtl8821ae_phy_get_txpower_by_rate(hw, (u8)(!in_24g),
2695 						     path, rate);
2696 
2697 	if (rate == DESC_RATEVHT1SS_MCS8 || rate == DESC_RATEVHT1SS_MCS9 ||
2698 	    rate == DESC_RATEVHT2SS_MCS8 || rate == DESC_RATEVHT2SS_MCS9)
2699 		txpower -= powerdiff_byrate;
2700 	else
2701 		txpower += powerdiff_byrate;
2702 
2703 	if (rate > DESC_RATE11M)
2704 		txpower += rtlpriv->dm.remnant_ofdm_swing_idx[path];
2705 	else
2706 		txpower += rtlpriv->dm.remnant_cck_idx;
2707 
2708 	if (txpower > MAX_POWER_INDEX)
2709 		txpower = MAX_POWER_INDEX;
2710 
2711 	return txpower;
2712 }
2713 
_rtl8821ae_phy_set_txpower_index(struct ieee80211_hw * hw,u8 power_index,u8 path,u8 rate)2714 static void _rtl8821ae_phy_set_txpower_index(struct ieee80211_hw *hw,
2715 					     u8 power_index, u8 path, u8 rate)
2716 {
2717 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2718 
2719 	if (path == RF90_PATH_A) {
2720 		switch (rate) {
2721 		case DESC_RATE1M:
2722 			rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1,
2723 				      MASKBYTE0, power_index);
2724 			break;
2725 		case DESC_RATE2M:
2726 			rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1,
2727 				      MASKBYTE1, power_index);
2728 			break;
2729 		case DESC_RATE5_5M:
2730 			rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1,
2731 				      MASKBYTE2, power_index);
2732 			break;
2733 		case DESC_RATE11M:
2734 			rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1,
2735 				      MASKBYTE3, power_index);
2736 			break;
2737 		case DESC_RATE6M:
2738 			rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6,
2739 				      MASKBYTE0, power_index);
2740 			break;
2741 		case DESC_RATE9M:
2742 			rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6,
2743 				      MASKBYTE1, power_index);
2744 			break;
2745 		case DESC_RATE12M:
2746 			rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6,
2747 				      MASKBYTE2, power_index);
2748 			break;
2749 		case DESC_RATE18M:
2750 			rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6,
2751 				      MASKBYTE3, power_index);
2752 			break;
2753 		case DESC_RATE24M:
2754 			rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24,
2755 				      MASKBYTE0, power_index);
2756 			break;
2757 		case DESC_RATE36M:
2758 			rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24,
2759 				      MASKBYTE1, power_index);
2760 			break;
2761 		case DESC_RATE48M:
2762 			rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24,
2763 				      MASKBYTE2, power_index);
2764 			break;
2765 		case DESC_RATE54M:
2766 			rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24,
2767 				      MASKBYTE3, power_index);
2768 			break;
2769 		case DESC_RATEMCS0:
2770 			rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
2771 				      MASKBYTE0, power_index);
2772 			break;
2773 		case DESC_RATEMCS1:
2774 			rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
2775 				      MASKBYTE1, power_index);
2776 			break;
2777 		case DESC_RATEMCS2:
2778 			rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
2779 				      MASKBYTE2, power_index);
2780 			break;
2781 		case DESC_RATEMCS3:
2782 			rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
2783 				      MASKBYTE3, power_index);
2784 			break;
2785 		case DESC_RATEMCS4:
2786 			rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
2787 				      MASKBYTE0, power_index);
2788 			break;
2789 		case DESC_RATEMCS5:
2790 			rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
2791 				      MASKBYTE1, power_index);
2792 			break;
2793 		case DESC_RATEMCS6:
2794 			rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
2795 				      MASKBYTE2, power_index);
2796 			break;
2797 		case DESC_RATEMCS7:
2798 			rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
2799 				      MASKBYTE3, power_index);
2800 			break;
2801 		case DESC_RATEMCS8:
2802 			rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
2803 				      MASKBYTE0, power_index);
2804 			break;
2805 		case DESC_RATEMCS9:
2806 			rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
2807 				      MASKBYTE1, power_index);
2808 			break;
2809 		case DESC_RATEMCS10:
2810 			rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
2811 				      MASKBYTE2, power_index);
2812 			break;
2813 		case DESC_RATEMCS11:
2814 			rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
2815 				      MASKBYTE3, power_index);
2816 			break;
2817 		case DESC_RATEMCS12:
2818 			rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
2819 				      MASKBYTE0, power_index);
2820 			break;
2821 		case DESC_RATEMCS13:
2822 			rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
2823 				      MASKBYTE1, power_index);
2824 			break;
2825 		case DESC_RATEMCS14:
2826 			rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
2827 				      MASKBYTE2, power_index);
2828 			break;
2829 		case DESC_RATEMCS15:
2830 			rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
2831 				      MASKBYTE3, power_index);
2832 			break;
2833 		case DESC_RATEVHT1SS_MCS0:
2834 			rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0,
2835 				      MASKBYTE0, power_index);
2836 			break;
2837 		case DESC_RATEVHT1SS_MCS1:
2838 			rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0,
2839 				      MASKBYTE1, power_index);
2840 			break;
2841 		case DESC_RATEVHT1SS_MCS2:
2842 			rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0,
2843 				      MASKBYTE2, power_index);
2844 			break;
2845 		case DESC_RATEVHT1SS_MCS3:
2846 			rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0,
2847 				      MASKBYTE3, power_index);
2848 			break;
2849 		case DESC_RATEVHT1SS_MCS4:
2850 			rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4,
2851 				      MASKBYTE0, power_index);
2852 			break;
2853 		case DESC_RATEVHT1SS_MCS5:
2854 			rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4,
2855 				      MASKBYTE1, power_index);
2856 			break;
2857 		case DESC_RATEVHT1SS_MCS6:
2858 			rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4,
2859 				      MASKBYTE2, power_index);
2860 			break;
2861 		case DESC_RATEVHT1SS_MCS7:
2862 			rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4,
2863 				      MASKBYTE3, power_index);
2864 			break;
2865 		case DESC_RATEVHT1SS_MCS8:
2866 			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8,
2867 				      MASKBYTE0, power_index);
2868 			break;
2869 		case DESC_RATEVHT1SS_MCS9:
2870 			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8,
2871 				      MASKBYTE1, power_index);
2872 			break;
2873 		case DESC_RATEVHT2SS_MCS0:
2874 			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8,
2875 				      MASKBYTE2, power_index);
2876 			break;
2877 		case DESC_RATEVHT2SS_MCS1:
2878 			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8,
2879 				      MASKBYTE3, power_index);
2880 			break;
2881 		case DESC_RATEVHT2SS_MCS2:
2882 			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2,
2883 				      MASKBYTE0, power_index);
2884 			break;
2885 		case DESC_RATEVHT2SS_MCS3:
2886 			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2,
2887 				      MASKBYTE1, power_index);
2888 			break;
2889 		case DESC_RATEVHT2SS_MCS4:
2890 			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2,
2891 				      MASKBYTE2, power_index);
2892 			break;
2893 		case DESC_RATEVHT2SS_MCS5:
2894 			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2,
2895 				      MASKBYTE3, power_index);
2896 			break;
2897 		case DESC_RATEVHT2SS_MCS6:
2898 			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6,
2899 				      MASKBYTE0, power_index);
2900 			break;
2901 		case DESC_RATEVHT2SS_MCS7:
2902 			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6,
2903 				      MASKBYTE1, power_index);
2904 			break;
2905 		case DESC_RATEVHT2SS_MCS8:
2906 			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6,
2907 				      MASKBYTE2, power_index);
2908 			break;
2909 		case DESC_RATEVHT2SS_MCS9:
2910 			rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6,
2911 				      MASKBYTE3, power_index);
2912 			break;
2913 		default:
2914 			rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
2915 				"Invalid Rate!!\n");
2916 			break;
2917 		}
2918 	} else if (path == RF90_PATH_B) {
2919 		switch (rate) {
2920 		case DESC_RATE1M:
2921 			rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1,
2922 				      MASKBYTE0, power_index);
2923 			break;
2924 		case DESC_RATE2M:
2925 			rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1,
2926 				      MASKBYTE1, power_index);
2927 			break;
2928 		case DESC_RATE5_5M:
2929 			rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1,
2930 				      MASKBYTE2, power_index);
2931 			break;
2932 		case DESC_RATE11M:
2933 			rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1,
2934 				      MASKBYTE3, power_index);
2935 			break;
2936 		case DESC_RATE6M:
2937 			rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6,
2938 				      MASKBYTE0, power_index);
2939 			break;
2940 		case DESC_RATE9M:
2941 			rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6,
2942 				      MASKBYTE1, power_index);
2943 			break;
2944 		case DESC_RATE12M:
2945 			rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6,
2946 				      MASKBYTE2, power_index);
2947 			break;
2948 		case DESC_RATE18M:
2949 			rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6,
2950 				      MASKBYTE3, power_index);
2951 			break;
2952 		case DESC_RATE24M:
2953 			rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24,
2954 				      MASKBYTE0, power_index);
2955 			break;
2956 		case DESC_RATE36M:
2957 			rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24,
2958 				      MASKBYTE1, power_index);
2959 			break;
2960 		case DESC_RATE48M:
2961 			rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24,
2962 				      MASKBYTE2, power_index);
2963 			break;
2964 		case DESC_RATE54M:
2965 			rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24,
2966 				      MASKBYTE3, power_index);
2967 			break;
2968 		case DESC_RATEMCS0:
2969 			rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
2970 				      MASKBYTE0, power_index);
2971 			break;
2972 		case DESC_RATEMCS1:
2973 			rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
2974 				      MASKBYTE1, power_index);
2975 			break;
2976 		case DESC_RATEMCS2:
2977 			rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
2978 				      MASKBYTE2, power_index);
2979 			break;
2980 		case DESC_RATEMCS3:
2981 			rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
2982 				      MASKBYTE3, power_index);
2983 			break;
2984 		case DESC_RATEMCS4:
2985 			rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
2986 				      MASKBYTE0, power_index);
2987 			break;
2988 		case DESC_RATEMCS5:
2989 			rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
2990 				      MASKBYTE1, power_index);
2991 			break;
2992 		case DESC_RATEMCS6:
2993 			rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
2994 				      MASKBYTE2, power_index);
2995 			break;
2996 		case DESC_RATEMCS7:
2997 			rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
2998 				      MASKBYTE3, power_index);
2999 			break;
3000 		case DESC_RATEMCS8:
3001 			rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
3002 				      MASKBYTE0, power_index);
3003 			break;
3004 		case DESC_RATEMCS9:
3005 			rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
3006 				      MASKBYTE1, power_index);
3007 			break;
3008 		case DESC_RATEMCS10:
3009 			rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
3010 				      MASKBYTE2, power_index);
3011 			break;
3012 		case DESC_RATEMCS11:
3013 			rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
3014 				      MASKBYTE3, power_index);
3015 			break;
3016 		case DESC_RATEMCS12:
3017 			rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
3018 				      MASKBYTE0, power_index);
3019 			break;
3020 		case DESC_RATEMCS13:
3021 			rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
3022 				      MASKBYTE1, power_index);
3023 			break;
3024 		case DESC_RATEMCS14:
3025 			rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
3026 				      MASKBYTE2, power_index);
3027 			break;
3028 		case DESC_RATEMCS15:
3029 			rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
3030 				      MASKBYTE3, power_index);
3031 			break;
3032 		case DESC_RATEVHT1SS_MCS0:
3033 			rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0,
3034 				      MASKBYTE0, power_index);
3035 			break;
3036 		case DESC_RATEVHT1SS_MCS1:
3037 			rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0,
3038 				      MASKBYTE1, power_index);
3039 			break;
3040 		case DESC_RATEVHT1SS_MCS2:
3041 			rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0,
3042 				      MASKBYTE2, power_index);
3043 			break;
3044 		case DESC_RATEVHT1SS_MCS3:
3045 			rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0,
3046 				      MASKBYTE3, power_index);
3047 			break;
3048 		case DESC_RATEVHT1SS_MCS4:
3049 			rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4,
3050 				      MASKBYTE0, power_index);
3051 			break;
3052 		case DESC_RATEVHT1SS_MCS5:
3053 			rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4,
3054 				      MASKBYTE1, power_index);
3055 			break;
3056 		case DESC_RATEVHT1SS_MCS6:
3057 			rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4,
3058 				      MASKBYTE2, power_index);
3059 			break;
3060 		case DESC_RATEVHT1SS_MCS7:
3061 			rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4,
3062 				      MASKBYTE3, power_index);
3063 			break;
3064 		case DESC_RATEVHT1SS_MCS8:
3065 			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8,
3066 				      MASKBYTE0, power_index);
3067 			break;
3068 		case DESC_RATEVHT1SS_MCS9:
3069 			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8,
3070 				      MASKBYTE1, power_index);
3071 			break;
3072 		case DESC_RATEVHT2SS_MCS0:
3073 			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8,
3074 				      MASKBYTE2, power_index);
3075 			break;
3076 		case DESC_RATEVHT2SS_MCS1:
3077 			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8,
3078 				      MASKBYTE3, power_index);
3079 			break;
3080 		case DESC_RATEVHT2SS_MCS2:
3081 			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2,
3082 				      MASKBYTE0, power_index);
3083 			break;
3084 		case DESC_RATEVHT2SS_MCS3:
3085 			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2,
3086 				      MASKBYTE1, power_index);
3087 			break;
3088 		case DESC_RATEVHT2SS_MCS4:
3089 			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2,
3090 				      MASKBYTE2, power_index);
3091 			break;
3092 		case DESC_RATEVHT2SS_MCS5:
3093 			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2,
3094 				      MASKBYTE3, power_index);
3095 			break;
3096 		case DESC_RATEVHT2SS_MCS6:
3097 			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6,
3098 				      MASKBYTE0, power_index);
3099 			break;
3100 		case DESC_RATEVHT2SS_MCS7:
3101 			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6,
3102 				      MASKBYTE1, power_index);
3103 			break;
3104 		case DESC_RATEVHT2SS_MCS8:
3105 			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6,
3106 				      MASKBYTE2, power_index);
3107 			break;
3108 		case DESC_RATEVHT2SS_MCS9:
3109 			rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6,
3110 				      MASKBYTE3, power_index);
3111 			break;
3112 		default:
3113 			rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
3114 				"Invalid Rate!!\n");
3115 			break;
3116 		}
3117 	} else {
3118 		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
3119 			"Invalid RFPath!!\n");
3120 	}
3121 }
3122 
_rtl8821ae_phy_set_txpower_level_by_path(struct ieee80211_hw * hw,u8 * array,u8 path,u8 channel,u8 size)3123 static void _rtl8821ae_phy_set_txpower_level_by_path(struct ieee80211_hw *hw,
3124 						     u8 *array, u8 path,
3125 						     u8 channel, u8 size)
3126 {
3127 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3128 	struct rtl_phy *rtlphy = &rtlpriv->phy;
3129 	u8 i;
3130 	u8 power_index;
3131 
3132 	for (i = 0; i < size; i++) {
3133 		power_index =
3134 		  _rtl8821ae_get_txpower_index(hw, path, array[i],
3135 					       rtlphy->current_chan_bw,
3136 					       channel);
3137 		_rtl8821ae_phy_set_txpower_index(hw, power_index, path,
3138 						 array[i]);
3139 	}
3140 }
3141 
_rtl8821ae_phy_txpower_training_by_path(struct ieee80211_hw * hw,u8 bw,u8 channel,u8 path)3142 static void _rtl8821ae_phy_txpower_training_by_path(struct ieee80211_hw *hw,
3143 						    u8 bw, u8 channel, u8 path)
3144 {
3145 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3146 	struct rtl_phy *rtlphy = &rtlpriv->phy;
3147 
3148 	u8 i;
3149 	u32 power_level, data, offset;
3150 
3151 	if (path >= rtlphy->num_total_rfpath)
3152 		return;
3153 
3154 	data = 0;
3155 	if (path == RF90_PATH_A) {
3156 		power_level =
3157 			_rtl8821ae_get_txpower_index(hw, RF90_PATH_A,
3158 			DESC_RATEMCS7, bw, channel);
3159 		offset =  RA_TXPWRTRAING;
3160 	} else {
3161 		power_level =
3162 			_rtl8821ae_get_txpower_index(hw, RF90_PATH_B,
3163 			DESC_RATEMCS7, bw, channel);
3164 		offset =  RB_TXPWRTRAING;
3165 	}
3166 
3167 	for (i = 0; i < 3; i++) {
3168 		if (i == 0)
3169 			power_level = power_level - 10;
3170 		else if (i == 1)
3171 			power_level = power_level - 8;
3172 		else
3173 			power_level = power_level - 6;
3174 
3175 		data |= (((power_level > 2) ? (power_level) : 2) << (i * 8));
3176 	}
3177 	rtl_set_bbreg(hw, offset, 0xffffff, data);
3178 }
3179 
rtl8821ae_phy_set_txpower_level_by_path(struct ieee80211_hw * hw,u8 channel,u8 path)3180 void rtl8821ae_phy_set_txpower_level_by_path(struct ieee80211_hw *hw,
3181 					     u8 channel, u8 path)
3182 {
3183 	/* struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); */
3184 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3185 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3186 	struct rtl_phy *rtlphy = &rtlpriv->phy;
3187 	u8 cck_rates[]  = {DESC_RATE1M, DESC_RATE2M, DESC_RATE5_5M,
3188 			      DESC_RATE11M};
3189 	u8 sizes_of_cck_retes = 4;
3190 	u8 ofdm_rates[]  = {DESC_RATE6M, DESC_RATE9M, DESC_RATE12M,
3191 				DESC_RATE18M, DESC_RATE24M, DESC_RATE36M,
3192 				DESC_RATE48M, DESC_RATE54M};
3193 	u8 sizes_of_ofdm_retes = 8;
3194 	u8 ht_rates_1t[]  = {DESC_RATEMCS0, DESC_RATEMCS1, DESC_RATEMCS2,
3195 				DESC_RATEMCS3, DESC_RATEMCS4, DESC_RATEMCS5,
3196 				DESC_RATEMCS6, DESC_RATEMCS7};
3197 	u8 sizes_of_ht_retes_1t = 8;
3198 	u8 ht_rates_2t[]  = {DESC_RATEMCS8, DESC_RATEMCS9,
3199 				DESC_RATEMCS10, DESC_RATEMCS11,
3200 				DESC_RATEMCS12, DESC_RATEMCS13,
3201 				DESC_RATEMCS14, DESC_RATEMCS15};
3202 	u8 sizes_of_ht_retes_2t = 8;
3203 	u8 vht_rates_1t[]  = {DESC_RATEVHT1SS_MCS0, DESC_RATEVHT1SS_MCS1,
3204 				DESC_RATEVHT1SS_MCS2, DESC_RATEVHT1SS_MCS3,
3205 				DESC_RATEVHT1SS_MCS4, DESC_RATEVHT1SS_MCS5,
3206 				DESC_RATEVHT1SS_MCS6, DESC_RATEVHT1SS_MCS7,
3207 			     DESC_RATEVHT1SS_MCS8, DESC_RATEVHT1SS_MCS9};
3208 	u8 vht_rates_2t[]  = {DESC_RATEVHT2SS_MCS0, DESC_RATEVHT2SS_MCS1,
3209 				DESC_RATEVHT2SS_MCS2, DESC_RATEVHT2SS_MCS3,
3210 				DESC_RATEVHT2SS_MCS4, DESC_RATEVHT2SS_MCS5,
3211 				DESC_RATEVHT2SS_MCS6, DESC_RATEVHT2SS_MCS7,
3212 				DESC_RATEVHT2SS_MCS8, DESC_RATEVHT2SS_MCS9};
3213 	u8 sizes_of_vht_retes = 10;
3214 
3215 	if (rtlhal->current_bandtype == BAND_ON_2_4G)
3216 		_rtl8821ae_phy_set_txpower_level_by_path(hw, cck_rates, path, channel,
3217 							 sizes_of_cck_retes);
3218 
3219 	_rtl8821ae_phy_set_txpower_level_by_path(hw, ofdm_rates, path, channel,
3220 						 sizes_of_ofdm_retes);
3221 	_rtl8821ae_phy_set_txpower_level_by_path(hw, ht_rates_1t, path, channel,
3222 						 sizes_of_ht_retes_1t);
3223 	_rtl8821ae_phy_set_txpower_level_by_path(hw, vht_rates_1t, path, channel,
3224 						 sizes_of_vht_retes);
3225 
3226 	if (rtlphy->num_total_rfpath >= 2) {
3227 		_rtl8821ae_phy_set_txpower_level_by_path(hw, ht_rates_2t, path,
3228 							 channel,
3229 							 sizes_of_ht_retes_2t);
3230 		_rtl8821ae_phy_set_txpower_level_by_path(hw, vht_rates_2t, path,
3231 							 channel,
3232 							 sizes_of_vht_retes);
3233 	}
3234 
3235 	_rtl8821ae_phy_txpower_training_by_path(hw, rtlphy->current_chan_bw,
3236 						channel, path);
3237 }
3238 
3239 /*just in case, write txpower in DW, to reduce time*/
rtl8821ae_phy_set_txpower_level(struct ieee80211_hw * hw,u8 channel)3240 void rtl8821ae_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
3241 {
3242 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3243 	struct rtl_phy *rtlphy = &rtlpriv->phy;
3244 	u8 path = 0;
3245 
3246 	for (path = RF90_PATH_A; path < rtlphy->num_total_rfpath; ++path)
3247 		rtl8821ae_phy_set_txpower_level_by_path(hw, channel, path);
3248 }
3249 
_rtl8821ae_phy_txpwr_idx_to_dbm(struct ieee80211_hw * hw,enum wireless_mode wirelessmode,u8 txpwridx)3250 static long _rtl8821ae_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
3251 					    enum wireless_mode wirelessmode,
3252 					    u8 txpwridx)
3253 {
3254 	long offset;
3255 	long pwrout_dbm;
3256 
3257 	switch (wirelessmode) {
3258 	case WIRELESS_MODE_B:
3259 		offset = -7;
3260 		break;
3261 	case WIRELESS_MODE_G:
3262 	case WIRELESS_MODE_N_24G:
3263 		offset = -8;
3264 		break;
3265 	default:
3266 		offset = -8;
3267 		break;
3268 	}
3269 	pwrout_dbm = txpwridx / 2 + offset;
3270 	return pwrout_dbm;
3271 }
3272 
rtl8821ae_phy_scan_operation_backup(struct ieee80211_hw * hw,u8 operation)3273 void rtl8821ae_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
3274 {
3275 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3276 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3277 	enum io_type iotype = IO_CMD_PAUSE_BAND0_DM_BY_SCAN;
3278 
3279 	if (!is_hal_stop(rtlhal)) {
3280 		switch (operation) {
3281 		case SCAN_OPT_BACKUP_BAND0:
3282 			iotype = IO_CMD_PAUSE_BAND0_DM_BY_SCAN;
3283 			rtlpriv->cfg->ops->set_hw_reg(hw,
3284 						      HW_VAR_IO_CMD,
3285 						      (u8 *)&iotype);
3286 
3287 			break;
3288 		case SCAN_OPT_BACKUP_BAND1:
3289 			iotype = IO_CMD_PAUSE_BAND1_DM_BY_SCAN;
3290 			rtlpriv->cfg->ops->set_hw_reg(hw,
3291 						      HW_VAR_IO_CMD,
3292 						      (u8 *)&iotype);
3293 
3294 			break;
3295 		case SCAN_OPT_RESTORE:
3296 			iotype = IO_CMD_RESUME_DM_BY_SCAN;
3297 			rtlpriv->cfg->ops->set_hw_reg(hw,
3298 						      HW_VAR_IO_CMD,
3299 						      (u8 *)&iotype);
3300 			break;
3301 		default:
3302 			pr_err("Unknown Scan Backup operation.\n");
3303 			break;
3304 		}
3305 	}
3306 }
3307 
_rtl8821ae_phy_set_reg_bw(struct rtl_priv * rtlpriv,u8 bw)3308 static void _rtl8821ae_phy_set_reg_bw(struct rtl_priv *rtlpriv, u8 bw)
3309 {
3310 	u16 reg_rf_mode_bw, tmp = 0;
3311 
3312 	reg_rf_mode_bw = rtl_read_word(rtlpriv, REG_TRXPTCL_CTL);
3313 	switch (bw) {
3314 	case HT_CHANNEL_WIDTH_20:
3315 		rtl_write_word(rtlpriv, REG_TRXPTCL_CTL, reg_rf_mode_bw & 0xFE7F);
3316 		break;
3317 	case HT_CHANNEL_WIDTH_20_40:
3318 		tmp = reg_rf_mode_bw | BIT(7);
3319 		rtl_write_word(rtlpriv, REG_TRXPTCL_CTL, tmp & 0xFEFF);
3320 		break;
3321 	case HT_CHANNEL_WIDTH_80:
3322 		tmp = reg_rf_mode_bw | BIT(8);
3323 		rtl_write_word(rtlpriv, REG_TRXPTCL_CTL, tmp & 0xFF7F);
3324 		break;
3325 	default:
3326 		rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING, "unknown Bandwidth: 0x%x\n", bw);
3327 		break;
3328 	}
3329 }
3330 
_rtl8821ae_phy_get_secondary_chnl(struct rtl_priv * rtlpriv)3331 static u8 _rtl8821ae_phy_get_secondary_chnl(struct rtl_priv *rtlpriv)
3332 {
3333 	struct rtl_phy *rtlphy = &rtlpriv->phy;
3334 	struct rtl_mac *mac = rtl_mac(rtlpriv);
3335 	u8 sc_set_40 = 0, sc_set_20 = 0;
3336 
3337 	if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80) {
3338 		if (mac->cur_80_prime_sc == PRIME_CHNL_OFFSET_LOWER)
3339 			sc_set_40 = VHT_DATA_SC_40_LOWER_OF_80MHZ;
3340 		else if (mac->cur_80_prime_sc == PRIME_CHNL_OFFSET_UPPER)
3341 			sc_set_40 = VHT_DATA_SC_40_UPPER_OF_80MHZ;
3342 		else
3343 			pr_err("SCMapping: Not Correct Primary40MHz Setting\n");
3344 
3345 		if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_LOWER) &&
3346 			(mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_LOWER))
3347 			sc_set_20 = VHT_DATA_SC_20_LOWEST_OF_80MHZ;
3348 		else if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_UPPER) &&
3349 			(mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_LOWER))
3350 			sc_set_20 = VHT_DATA_SC_20_LOWER_OF_80MHZ;
3351 		else if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_LOWER) &&
3352 			(mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_UPPER))
3353 			sc_set_20 = VHT_DATA_SC_20_UPPER_OF_80MHZ;
3354 		else if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_UPPER) &&
3355 			(mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_UPPER))
3356 			sc_set_20 = VHT_DATA_SC_20_UPPERST_OF_80MHZ;
3357 		else
3358 			pr_err("SCMapping: Not Correct Primary40MHz Setting\n");
3359 	} else if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
3360 		if (mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_UPPER)
3361 			sc_set_20 = VHT_DATA_SC_20_UPPER_OF_80MHZ;
3362 		else if (mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_LOWER)
3363 			sc_set_20 = VHT_DATA_SC_20_LOWER_OF_80MHZ;
3364 		else
3365 			pr_err("SCMapping: Not Correct Primary40MHz Setting\n");
3366 	}
3367 	return (sc_set_40 << 4) | sc_set_20;
3368 }
3369 
rtl8821ae_phy_set_bw_mode_callback(struct ieee80211_hw * hw)3370 void rtl8821ae_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
3371 {
3372 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3373 	struct rtl_phy *rtlphy = &rtlpriv->phy;
3374 	u8 sub_chnl = 0;
3375 	u8 l1pk_val = 0;
3376 
3377 	rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE,
3378 		"Switch to %s bandwidth\n",
3379 		(rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
3380 		 "20MHz" :
3381 		 (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40 ?
3382 		  "40MHz" : "80MHz")));
3383 
3384 	_rtl8821ae_phy_set_reg_bw(rtlpriv, rtlphy->current_chan_bw);
3385 	sub_chnl = _rtl8821ae_phy_get_secondary_chnl(rtlpriv);
3386 	rtl_write_byte(rtlpriv, 0x0483, sub_chnl);
3387 
3388 	switch (rtlphy->current_chan_bw) {
3389 	case HT_CHANNEL_WIDTH_20:
3390 		rtl_set_bbreg(hw, RRFMOD, 0x003003C3, 0x00300200);
3391 		rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 0);
3392 
3393 		if (rtlphy->rf_type == RF_2T2R)
3394 			rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, 7);
3395 		else
3396 			rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, 8);
3397 		break;
3398 	case HT_CHANNEL_WIDTH_20_40:
3399 		rtl_set_bbreg(hw, RRFMOD, 0x003003C3, 0x00300201);
3400 		rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 0);
3401 		rtl_set_bbreg(hw, RRFMOD, 0x3C, sub_chnl);
3402 		rtl_set_bbreg(hw, RCCAONSEC, 0xf0000000, sub_chnl);
3403 
3404 		if (rtlphy->reg_837 & BIT(2))
3405 			l1pk_val = 6;
3406 		else {
3407 			if (rtlphy->rf_type == RF_2T2R)
3408 				l1pk_val = 7;
3409 			else
3410 				l1pk_val = 8;
3411 		}
3412 		/* 0x848[25:22] = 0x6 */
3413 		rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, l1pk_val);
3414 
3415 		if (sub_chnl == VHT_DATA_SC_20_UPPER_OF_80MHZ)
3416 			rtl_set_bbreg(hw, RCCK_SYSTEM, BCCK_SYSTEM, 1);
3417 		else
3418 			rtl_set_bbreg(hw, RCCK_SYSTEM, BCCK_SYSTEM, 0);
3419 		break;
3420 
3421 	case HT_CHANNEL_WIDTH_80:
3422 		 /* 0x8ac[21,20,9:6,1,0]=8'b11100010 */
3423 		rtl_set_bbreg(hw, RRFMOD, 0x003003C3, 0x00300202);
3424 		/* 0x8c4[30] = 1 */
3425 		rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 1);
3426 		rtl_set_bbreg(hw, RRFMOD, 0x3C, sub_chnl);
3427 		rtl_set_bbreg(hw, RCCAONSEC, 0xf0000000, sub_chnl);
3428 
3429 		if (rtlphy->reg_837 & BIT(2))
3430 			l1pk_val = 5;
3431 		else {
3432 			if (rtlphy->rf_type == RF_2T2R)
3433 				l1pk_val = 6;
3434 			else
3435 				l1pk_val = 7;
3436 		}
3437 		rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, l1pk_val);
3438 
3439 		break;
3440 	default:
3441 		pr_err("unknown bandwidth: %#X\n",
3442 		       rtlphy->current_chan_bw);
3443 		break;
3444 	}
3445 
3446 	rtl8812ae_fixspur(hw, rtlphy->current_chan_bw, rtlphy->current_channel);
3447 
3448 	rtl8821ae_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
3449 	rtlphy->set_bwmode_inprogress = false;
3450 
3451 	rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD, "\n");
3452 }
3453 
rtl8821ae_phy_set_bw_mode(struct ieee80211_hw * hw,enum nl80211_channel_type ch_type)3454 void rtl8821ae_phy_set_bw_mode(struct ieee80211_hw *hw,
3455 			    enum nl80211_channel_type ch_type)
3456 {
3457 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3458 	struct rtl_phy *rtlphy = &rtlpriv->phy;
3459 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3460 	u8 tmp_bw = rtlphy->current_chan_bw;
3461 
3462 	if (rtlphy->set_bwmode_inprogress)
3463 		return;
3464 	rtlphy->set_bwmode_inprogress = true;
3465 	if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw)))
3466 		rtl8821ae_phy_set_bw_mode_callback(hw);
3467 	else {
3468 		rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
3469 			"FALSE driver sleep or unload\n");
3470 		rtlphy->set_bwmode_inprogress = false;
3471 		rtlphy->current_chan_bw = tmp_bw;
3472 	}
3473 }
3474 
rtl8821ae_phy_sw_chnl_callback(struct ieee80211_hw * hw)3475 void rtl8821ae_phy_sw_chnl_callback(struct ieee80211_hw *hw)
3476 {
3477 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3478 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3479 	struct rtl_phy *rtlphy = &rtlpriv->phy;
3480 	u8 channel = rtlphy->current_channel;
3481 	u8 path;
3482 	u32 data;
3483 
3484 	rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE,
3485 		"switch to channel%d\n", rtlphy->current_channel);
3486 	if (is_hal_stop(rtlhal))
3487 		return;
3488 
3489 	if (36 <= channel && channel <= 48)
3490 		data = 0x494;
3491 	else if (50 <= channel && channel <= 64)
3492 		data = 0x453;
3493 	else if (100 <= channel && channel <= 116)
3494 		data = 0x452;
3495 	else if (118 <= channel)
3496 		data = 0x412;
3497 	else
3498 		data = 0x96a;
3499 	rtl_set_bbreg(hw, RFC_AREA, 0x1ffe0000, data);
3500 
3501 	for (path = RF90_PATH_A; path < rtlphy->num_total_rfpath; path++) {
3502 		if (36 <= channel && channel <= 64)
3503 			data = 0x101;
3504 		else if (100 <= channel && channel <= 140)
3505 			data = 0x301;
3506 		else if (140 < channel)
3507 			data = 0x501;
3508 		else
3509 			data = 0x000;
3510 		rtl8821ae_phy_set_rf_reg(hw, path, RF_CHNLBW,
3511 			BIT(18)|BIT(17)|BIT(16)|BIT(9)|BIT(8), data);
3512 
3513 		rtl8821ae_phy_set_rf_reg(hw, path, RF_CHNLBW,
3514 			BMASKBYTE0, channel);
3515 
3516 		if (channel > 14) {
3517 			if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
3518 				if (36 <= channel && channel <= 64)
3519 					data = 0x114E9;
3520 				else
3521 					data = 0x110E9;
3522 				rtl8821ae_phy_set_rf_reg(hw, path, RF_APK,
3523 					BRFREGOFFSETMASK, data);
3524 			}
3525 		}
3526 	}
3527 	rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE, "\n");
3528 }
3529 
rtl8821ae_phy_sw_chnl(struct ieee80211_hw * hw)3530 u8 rtl8821ae_phy_sw_chnl(struct ieee80211_hw *hw)
3531 {
3532 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3533 	struct rtl_phy *rtlphy = &rtlpriv->phy;
3534 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3535 	u32 timeout = 1000, timecount = 0;
3536 
3537 	if (rtlphy->sw_chnl_inprogress)
3538 		return 0;
3539 	if (rtlphy->set_bwmode_inprogress)
3540 		return 0;
3541 
3542 	if ((is_hal_stop(rtlhal)) || (RT_CANNOT_IO(hw))) {
3543 		rtl_dbg(rtlpriv, COMP_CHAN, DBG_LOUD,
3544 			"sw_chnl_inprogress false driver sleep or unload\n");
3545 		return 0;
3546 	}
3547 	while (rtlphy->lck_inprogress && timecount < timeout) {
3548 		mdelay(50);
3549 		timecount += 50;
3550 	}
3551 
3552 	if (rtlphy->current_channel > 14 && rtlhal->current_bandtype != BAND_ON_5G)
3553 		rtl8821ae_phy_switch_wirelessband(hw, BAND_ON_5G);
3554 	else if (rtlphy->current_channel <= 14 && rtlhal->current_bandtype != BAND_ON_2_4G)
3555 		rtl8821ae_phy_switch_wirelessband(hw, BAND_ON_2_4G);
3556 
3557 	rtlphy->sw_chnl_inprogress = true;
3558 
3559 	rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE,
3560 		"switch to channel%d, band type is %d\n",
3561 		rtlphy->current_channel, rtlhal->current_bandtype);
3562 
3563 	rtl8821ae_phy_sw_chnl_callback(hw);
3564 
3565 	rtl8821ae_dm_clear_txpower_tracking_state(hw);
3566 	rtl8821ae_phy_set_txpower_level(hw, rtlphy->current_channel);
3567 
3568 	rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE, "\n");
3569 	rtlphy->sw_chnl_inprogress = false;
3570 	return 1;
3571 }
3572 
_rtl8812ae_get_right_chnl_place_for_iqk(u8 chnl)3573 u8 _rtl8812ae_get_right_chnl_place_for_iqk(u8 chnl)
3574 {
3575 	static const u8 channel_all[TARGET_CHNL_NUM_2G_5G_8812] = {
3576 		1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
3577 		14, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54,
3578 		56, 58, 60, 62, 64, 100, 102, 104, 106, 108,
3579 		110, 112, 114, 116, 118, 120, 122, 124, 126,
3580 		128, 130, 132, 134, 136, 138, 140, 149, 151,
3581 		153, 155, 157, 159, 161, 163, 165};
3582 	u8 place;
3583 
3584 	if (chnl > 14) {
3585 		for (place = 14; place < sizeof(channel_all); place++)
3586 			if (channel_all[place] == chnl)
3587 				return place-13;
3588 	}
3589 
3590 	return 0;
3591 }
3592 
3593 #define MACBB_REG_NUM 10
3594 #define AFE_REG_NUM 14
3595 #define RF_REG_NUM 3
3596 
_rtl8821ae_iqk_backup_macbb(struct ieee80211_hw * hw,u32 * macbb_backup,u32 * backup_macbb_reg,u32 mac_bb_num)3597 static void _rtl8821ae_iqk_backup_macbb(struct ieee80211_hw *hw,
3598 					u32 *macbb_backup,
3599 					u32 *backup_macbb_reg, u32 mac_bb_num)
3600 {
3601 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3602 	u32 i;
3603 
3604 	rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
3605 	/*save MACBB default value*/
3606 	for (i = 0; i < mac_bb_num; i++)
3607 		macbb_backup[i] = rtl_read_dword(rtlpriv, backup_macbb_reg[i]);
3608 
3609 	rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD, "BackupMacBB Success!!!!\n");
3610 }
3611 
_rtl8821ae_iqk_backup_afe(struct ieee80211_hw * hw,u32 * afe_backup,u32 * backup_afe_REG,u32 afe_num)3612 static void _rtl8821ae_iqk_backup_afe(struct ieee80211_hw *hw, u32 *afe_backup,
3613 				      u32 *backup_afe_REG, u32 afe_num)
3614 {
3615 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3616 	u32 i;
3617 
3618 	rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
3619 	/*Save AFE Parameters */
3620 	for (i = 0; i < afe_num; i++)
3621 		afe_backup[i] = rtl_read_dword(rtlpriv, backup_afe_REG[i]);
3622 	rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD, "BackupAFE Success!!!!\n");
3623 }
3624 
_rtl8821ae_iqk_backup_rf(struct ieee80211_hw * hw,u32 * rfa_backup,u32 * rfb_backup,u32 * backup_rf_reg,u32 rf_num)3625 static void _rtl8821ae_iqk_backup_rf(struct ieee80211_hw *hw, u32 *rfa_backup,
3626 				     u32 *rfb_backup, u32 *backup_rf_reg,
3627 				     u32 rf_num)
3628 {
3629 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3630 	u32 i;
3631 
3632 	rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
3633 	/*Save RF Parameters*/
3634 	for (i = 0; i < rf_num; i++) {
3635 		rfa_backup[i] = rtl_get_rfreg(hw, RF90_PATH_A, backup_rf_reg[i],
3636 					      BMASKDWORD);
3637 		rfb_backup[i] = rtl_get_rfreg(hw, RF90_PATH_B, backup_rf_reg[i],
3638 					      BMASKDWORD);
3639 	}
3640 	rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD, "BackupRF Success!!!!\n");
3641 }
3642 
_rtl8821ae_iqk_configure_mac(struct ieee80211_hw * hw)3643 static void _rtl8821ae_iqk_configure_mac(
3644 		struct ieee80211_hw *hw
3645 		)
3646 {
3647 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3648 	/* ========MAC register setting========*/
3649 	rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
3650 	rtl_write_byte(rtlpriv, 0x522, 0x3f);
3651 	rtl_set_bbreg(hw, 0x550, BIT(11) | BIT(3), 0x0);
3652 	rtl_write_byte(rtlpriv, 0x808, 0x00);		/*RX ante off*/
3653 	rtl_set_bbreg(hw, 0x838, 0xf, 0xc);		/*CCA off*/
3654 }
3655 
_rtl8821ae_iqk_tx_fill_iqc(struct ieee80211_hw * hw,enum radio_path path,u32 tx_x,u32 tx_y)3656 static void _rtl8821ae_iqk_tx_fill_iqc(struct ieee80211_hw *hw,
3657 				       enum radio_path path, u32 tx_x, u32 tx_y)
3658 {
3659 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3660 	switch (path) {
3661 	case RF90_PATH_A:
3662 		/* [31] = 1 --> Page C1 */
3663 		rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1);
3664 		rtl_write_dword(rtlpriv, 0xc90, 0x00000080);
3665 		rtl_write_dword(rtlpriv, 0xcc4, 0x20040000);
3666 		rtl_write_dword(rtlpriv, 0xcc8, 0x20000000);
3667 		rtl_set_bbreg(hw, 0xccc, 0x000007ff, tx_y);
3668 		rtl_set_bbreg(hw, 0xcd4, 0x000007ff, tx_x);
3669 		rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
3670 			"TX_X = %x;;TX_Y = %x =====> fill to IQC\n",
3671 			tx_x, tx_y);
3672 		rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
3673 			"0xcd4 = %x;;0xccc = %x ====>fill to IQC\n",
3674 			rtl_get_bbreg(hw, 0xcd4, 0x000007ff),
3675 			rtl_get_bbreg(hw, 0xccc, 0x000007ff));
3676 		break;
3677 	default:
3678 		break;
3679 	}
3680 }
3681 
_rtl8821ae_iqk_rx_fill_iqc(struct ieee80211_hw * hw,enum radio_path path,u32 rx_x,u32 rx_y)3682 static void _rtl8821ae_iqk_rx_fill_iqc(struct ieee80211_hw *hw,
3683 				       enum radio_path path, u32 rx_x, u32 rx_y)
3684 {
3685 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3686 	switch (path) {
3687 	case RF90_PATH_A:
3688 		rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
3689 		rtl_set_bbreg(hw, 0xc10, 0x000003ff, rx_x>>1);
3690 		rtl_set_bbreg(hw, 0xc10, 0x03ff0000, rx_y>>1);
3691 		rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
3692 			"rx_x = %x;;rx_y = %x ====>fill to IQC\n",
3693 			rx_x >> 1, rx_y >> 1);
3694 		rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
3695 			"0xc10 = %x ====>fill to IQC\n",
3696 			rtl_read_dword(rtlpriv, 0xc10));
3697 		break;
3698 	default:
3699 		break;
3700 	}
3701 }
3702 
3703 #define cal_num 10
3704 
_rtl8821ae_iqk_tx(struct ieee80211_hw * hw,enum radio_path path)3705 static void _rtl8821ae_iqk_tx(struct ieee80211_hw *hw, enum radio_path path)
3706 {
3707 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3708 	struct rtl_phy *rtlphy = &rtlpriv->phy;
3709 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3710 
3711 	u32	tx_fail, rx_fail, delay_count, iqk_ready, cal_retry, cal = 0, temp_reg65;
3712 	int	tx_x = 0, tx_y = 0, rx_x = 0, rx_y = 0, tx_average = 0, rx_average = 0;
3713 	int	tx_x0[cal_num], tx_y0[cal_num], tx_x0_rxk[cal_num],
3714 		tx_y0_rxk[cal_num], rx_x0[cal_num], rx_y0[cal_num],
3715 		tx_dt[cal_num], rx_dt[cal_num];
3716 	bool	tx0iqkok = false, rx0iqkok = false;
3717 	bool	vdf_enable = false;
3718 	int	i, k, vdf_y[3], vdf_x[3],
3719 		ii, dx = 0, dy = 0, tx_finish = 0, rx_finish = 0;
3720 
3721 	rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
3722 		"BandWidth = %d.\n",
3723 		rtlphy->current_chan_bw);
3724 	if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80)
3725 		vdf_enable = true;
3726 
3727 	while (cal < cal_num) {
3728 		switch (path) {
3729 		case RF90_PATH_A:
3730 			temp_reg65 = rtl_get_rfreg(hw, path, 0x65, 0xffffffff);
3731 			/* Path-A LOK */
3732 			rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
3733 			/*========Path-A AFE all on========*/
3734 			/*Port 0 DAC/ADC on*/
3735 			rtl_write_dword(rtlpriv, 0xc60, 0x77777777);
3736 			rtl_write_dword(rtlpriv, 0xc64, 0x77777777);
3737 			rtl_write_dword(rtlpriv, 0xc68, 0x19791979);
3738 			rtl_write_dword(rtlpriv, 0xc6c, 0x19791979);
3739 			rtl_write_dword(rtlpriv, 0xc70, 0x19791979);
3740 			rtl_write_dword(rtlpriv, 0xc74, 0x19791979);
3741 			rtl_write_dword(rtlpriv, 0xc78, 0x19791979);
3742 			rtl_write_dword(rtlpriv, 0xc7c, 0x19791979);
3743 			rtl_write_dword(rtlpriv, 0xc80, 0x19791979);
3744 			rtl_write_dword(rtlpriv, 0xc84, 0x19791979);
3745 
3746 			rtl_set_bbreg(hw, 0xc00, 0xf, 0x4); /*hardware 3-wire off*/
3747 
3748 			/* LOK Setting */
3749 			/* ====== LOK ====== */
3750 			/*DAC/ADC sampling rate (160 MHz)*/
3751 			rtl_set_bbreg(hw, 0xc5c, BIT(26) | BIT(25) | BIT(24), 0x7);
3752 
3753 			/* 2. LoK RF Setting (at BW = 20M) */
3754 			rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80002);
3755 			rtl_set_rfreg(hw, path, 0x18, 0x00c00, 0x3);     /* BW 20M */
3756 			rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x20000);
3757 			rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0003f);
3758 			rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xf3fc3);
3759 			rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d5);
3760 			rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001);
3761 			rtl_set_bbreg(hw, 0xcb8, 0xf, 0xd);
3762 			rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
3763 			rtl_write_dword(rtlpriv, 0xb00, 0x03000100);
3764 			rtl_set_bbreg(hw, 0xc94, BIT(0), 0x1);
3765 			rtl_write_dword(rtlpriv, 0x978, 0x29002000);/* TX (X,Y) */
3766 			rtl_write_dword(rtlpriv, 0x97c, 0xa9002000);/* RX (X,Y) */
3767 			rtl_write_dword(rtlpriv, 0x984, 0x00462910);/* [0]:AGC_en, [15]:idac_K_Mask */
3768 
3769 			rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
3770 			rtl_write_dword(rtlpriv, 0xc88, 0x821403f4);
3771 
3772 			if (rtlhal->current_bandtype)
3773 				rtl_write_dword(rtlpriv, 0xc8c, 0x68163e96);
3774 			else
3775 				rtl_write_dword(rtlpriv, 0xc8c, 0x28163e96);
3776 
3777 			rtl_write_dword(rtlpriv, 0xc80, 0x18008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
3778 			rtl_write_dword(rtlpriv, 0xc84, 0x38008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */
3779 			rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
3780 			rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
3781 			rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
3782 
3783 			mdelay(10); /* Delay 10ms */
3784 			rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
3785 
3786 			rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
3787 			rtl_set_rfreg(hw, path, 0x58, 0x7fe00, rtl_get_rfreg(hw, path, 0x8, 0xffc00)); /* Load LOK */
3788 
3789 			switch (rtlphy->current_chan_bw) {
3790 			case 1:
3791 				rtl_set_rfreg(hw, path, 0x18, 0x00c00, 0x1);
3792 				break;
3793 			case 2:
3794 				rtl_set_rfreg(hw, path, 0x18, 0x00c00, 0x0);
3795 				break;
3796 			default:
3797 				break;
3798 			}
3799 
3800 			rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
3801 
3802 			/* 3. TX RF Setting */
3803 			rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
3804 			rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
3805 			rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x20000);
3806 			rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0003f);
3807 			rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xf3fc3);
3808 			rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d5);
3809 			rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001);
3810 			rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
3811 			/* ODM_SetBBReg(pDM_Odm, 0xcb8, 0xf, 0xd); */
3812 			rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
3813 			rtl_write_dword(rtlpriv, 0xb00, 0x03000100);
3814 			rtl_set_bbreg(hw, 0xc94, BIT(0), 0x1);
3815 			rtl_write_dword(rtlpriv, 0x978, 0x29002000);/* TX (X,Y) */
3816 			rtl_write_dword(rtlpriv, 0x97c, 0xa9002000);/* RX (X,Y) */
3817 			rtl_write_dword(rtlpriv, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */
3818 
3819 			rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
3820 			rtl_write_dword(rtlpriv, 0xc88, 0x821403f1);
3821 			if (rtlhal->current_bandtype)
3822 				rtl_write_dword(rtlpriv, 0xc8c, 0x40163e96);
3823 			else
3824 				rtl_write_dword(rtlpriv, 0xc8c, 0x00163e96);
3825 
3826 			if (vdf_enable) {
3827 				rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD, "VDF_enable\n");
3828 				for (k = 0; k <= 2; k++) {
3829 					switch (k) {
3830 					case 0:
3831 						rtl_write_dword(rtlpriv, 0xc80, 0x18008c38);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
3832 						rtl_write_dword(rtlpriv, 0xc84, 0x38008c38);/* RX_TONE_idx[9:0], RxK_Mask[29] */
3833 						rtl_set_bbreg(hw, 0xce8, BIT(31), 0x0);
3834 						break;
3835 					case 1:
3836 						rtl_set_bbreg(hw, 0xc80, BIT(28), 0x0);
3837 						rtl_set_bbreg(hw, 0xc84, BIT(28), 0x0);
3838 						rtl_set_bbreg(hw, 0xce8, BIT(31), 0x0);
3839 						break;
3840 					case 2:
3841 						rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
3842 							"vdf_y[1] = %x;;;vdf_y[0] = %x\n", vdf_y[1]>>21 & 0x00007ff, vdf_y[0]>>21 & 0x00007ff);
3843 						rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
3844 							"vdf_x[1] = %x;;;vdf_x[0] = %x\n", vdf_x[1]>>21 & 0x00007ff, vdf_x[0]>>21 & 0x00007ff);
3845 						tx_dt[cal] = (vdf_y[1]>>20)-(vdf_y[0]>>20);
3846 						tx_dt[cal] = ((16*tx_dt[cal])*10000/15708);
3847 						tx_dt[cal] = (tx_dt[cal] >> 1)+(tx_dt[cal] & BIT(0));
3848 						rtl_write_dword(rtlpriv, 0xc80, 0x18008c20);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
3849 						rtl_write_dword(rtlpriv, 0xc84, 0x38008c20);/* RX_TONE_idx[9:0], RxK_Mask[29] */
3850 						rtl_set_bbreg(hw, 0xce8, BIT(31), 0x1);
3851 						rtl_set_bbreg(hw, 0xce8, 0x3fff0000, tx_dt[cal] & 0x00003fff);
3852 						break;
3853 					default:
3854 						break;
3855 					}
3856 					rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
3857 					cal_retry = 0;
3858 					while (1) {
3859 						/* one shot */
3860 						rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
3861 						rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
3862 
3863 						mdelay(10); /* Delay 10ms */
3864 						rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
3865 						delay_count = 0;
3866 						while (1) {
3867 							iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
3868 							if ((~iqk_ready) || (delay_count > 20))
3869 								break;
3870 							else{
3871 								mdelay(1);
3872 								delay_count++;
3873 							}
3874 						}
3875 
3876 						if (delay_count < 20) {							/* If 20ms No Result, then cal_retry++ */
3877 							/* ============TXIQK Check============== */
3878 							tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12));
3879 
3880 							if (~tx_fail) {
3881 								rtl_write_dword(rtlpriv, 0xcb8, 0x02000000);
3882 								vdf_x[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
3883 								rtl_write_dword(rtlpriv, 0xcb8, 0x04000000);
3884 								vdf_y[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
3885 								tx0iqkok = true;
3886 								break;
3887 							} else {
3888 								rtl_set_bbreg(hw, 0xccc, 0x000007ff, 0x0);
3889 								rtl_set_bbreg(hw, 0xcd4, 0x000007ff, 0x200);
3890 								tx0iqkok = false;
3891 								cal_retry++;
3892 								if (cal_retry == 10)
3893 									break;
3894 							}
3895 						} else {
3896 							tx0iqkok = false;
3897 							cal_retry++;
3898 							if (cal_retry == 10)
3899 								break;
3900 						}
3901 					}
3902 				}
3903 				if (k == 3) {
3904 					tx_x0[cal] = vdf_x[k-1];
3905 					tx_y0[cal] = vdf_y[k-1];
3906 				}
3907 			} else {
3908 				rtl_write_dword(rtlpriv, 0xc80, 0x18008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
3909 				rtl_write_dword(rtlpriv, 0xc84, 0x38008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */
3910 				rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
3911 				cal_retry = 0;
3912 				while (1) {
3913 					/* one shot */
3914 					rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
3915 					rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
3916 
3917 					mdelay(10); /* Delay 10ms */
3918 					rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
3919 					delay_count = 0;
3920 					while (1) {
3921 						iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
3922 						if ((~iqk_ready) || (delay_count > 20))
3923 							break;
3924 						else{
3925 							mdelay(1);
3926 							delay_count++;
3927 						}
3928 					}
3929 
3930 					if (delay_count < 20) {							/* If 20ms No Result, then cal_retry++ */
3931 						/* ============TXIQK Check============== */
3932 						tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12));
3933 
3934 						if (~tx_fail) {
3935 							rtl_write_dword(rtlpriv, 0xcb8, 0x02000000);
3936 							tx_x0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
3937 							rtl_write_dword(rtlpriv, 0xcb8, 0x04000000);
3938 							tx_y0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
3939 							tx0iqkok = true;
3940 							break;
3941 						} else {
3942 							rtl_set_bbreg(hw, 0xccc, 0x000007ff, 0x0);
3943 							rtl_set_bbreg(hw, 0xcd4, 0x000007ff, 0x200);
3944 							tx0iqkok = false;
3945 							cal_retry++;
3946 							if (cal_retry == 10)
3947 								break;
3948 						}
3949 					} else {
3950 						tx0iqkok = false;
3951 						cal_retry++;
3952 						if (cal_retry == 10)
3953 							break;
3954 					}
3955 				}
3956 			}
3957 
3958 			if (!tx0iqkok)
3959 				break;				/* TXK fail, Don't do RXK */
3960 
3961 			if (vdf_enable == 1) {
3962 				rtl_set_bbreg(hw, 0xce8, BIT(31), 0x0);    /* TX VDF Disable */
3963 				rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD, "RXVDF Start\n");
3964 				for (k = 0; k <= 2; k++) {
3965 					/* ====== RX mode TXK (RXK Step 1) ====== */
3966 					rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
3967 					/* 1. TX RF Setting */
3968 					rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
3969 					rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000);
3970 					rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x00029);
3971 					rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xd7ffb);
3972 					rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, temp_reg65);
3973 					rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001);
3974 					rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
3975 
3976 					rtl_set_bbreg(hw, 0xcb8, 0xf, 0xd);
3977 					rtl_write_dword(rtlpriv, 0x978, 0x29002000);/* TX (X,Y) */
3978 					rtl_write_dword(rtlpriv, 0x97c, 0xa9002000);/* RX (X,Y) */
3979 					rtl_write_dword(rtlpriv, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */
3980 					rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
3981 					rtl_write_dword(rtlpriv, 0xb00, 0x03000100);
3982 					rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
3983 					switch (k) {
3984 					case 0:
3985 						{
3986 							rtl_write_dword(rtlpriv, 0xc80, 0x18008c38);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
3987 							rtl_write_dword(rtlpriv, 0xc84, 0x38008c38);/* RX_TONE_idx[9:0], RxK_Mask[29] */
3988 							rtl_set_bbreg(hw, 0xce8, BIT(30), 0x0);
3989 						}
3990 						break;
3991 					case 1:
3992 						{
3993 							rtl_write_dword(rtlpriv, 0xc80, 0x08008c38);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
3994 							rtl_write_dword(rtlpriv, 0xc84, 0x28008c38);/* RX_TONE_idx[9:0], RxK_Mask[29] */
3995 							rtl_set_bbreg(hw, 0xce8, BIT(30), 0x0);
3996 						}
3997 						break;
3998 					case 2:
3999 						{
4000 							rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
4001 								"VDF_Y[1] = %x;;;VDF_Y[0] = %x\n",
4002 								vdf_y[1] >> 21 & 0x00007ff,
4003 								vdf_y[0] >> 21 & 0x00007ff);
4004 							rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
4005 								"VDF_X[1] = %x;;;VDF_X[0] = %x\n",
4006 								vdf_x[1] >> 21 & 0x00007ff,
4007 								vdf_x[0] >> 21 & 0x00007ff);
4008 							rx_dt[cal] = (vdf_y[1]>>20)-(vdf_y[0]>>20);
4009 							rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD, "Rx_dt = %d\n",
4010 								rx_dt[cal]);
4011 							rx_dt[cal] = ((16*rx_dt[cal])*10000/13823);
4012 							rx_dt[cal] = (rx_dt[cal] >> 1)+(rx_dt[cal] & BIT(0));
4013 							rtl_write_dword(rtlpriv, 0xc80, 0x18008c20);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
4014 							rtl_write_dword(rtlpriv, 0xc84, 0x38008c20);/* RX_TONE_idx[9:0], RxK_Mask[29] */
4015 							rtl_set_bbreg(hw, 0xce8, 0x00003fff, rx_dt[cal] & 0x00003fff);
4016 						}
4017 						break;
4018 					default:
4019 						break;
4020 					}
4021 					rtl_write_dword(rtlpriv, 0xc88, 0x821603e0);
4022 					rtl_write_dword(rtlpriv, 0xc8c, 0x68163e96);
4023 					rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
4024 					cal_retry = 0;
4025 					while (1) {
4026 						/* one shot */
4027 						rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
4028 						rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
4029 
4030 						mdelay(10); /* Delay 10ms */
4031 						rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
4032 						delay_count = 0;
4033 						while (1) {
4034 							iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
4035 							if ((~iqk_ready) || (delay_count > 20))
4036 								break;
4037 							else{
4038 								mdelay(1);
4039 								delay_count++;
4040 							}
4041 						}
4042 
4043 						if (delay_count < 20) {							/* If 20ms No Result, then cal_retry++ */
4044 							/* ============TXIQK Check============== */
4045 							tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12));
4046 
4047 							if (~tx_fail) {
4048 								rtl_write_dword(rtlpriv, 0xcb8, 0x02000000);
4049 								tx_x0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4050 								rtl_write_dword(rtlpriv, 0xcb8, 0x04000000);
4051 								tx_y0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4052 								tx0iqkok = true;
4053 								break;
4054 							} else{
4055 								tx0iqkok = false;
4056 								cal_retry++;
4057 								if (cal_retry == 10)
4058 									break;
4059 							}
4060 						} else {
4061 							tx0iqkok = false;
4062 							cal_retry++;
4063 							if (cal_retry == 10)
4064 								break;
4065 						}
4066 					}
4067 
4068 					if (!tx0iqkok) {   /* If RX mode TXK fail, then take TXK Result */
4069 						tx_x0_rxk[cal] = tx_x0[cal];
4070 						tx_y0_rxk[cal] = tx_y0[cal];
4071 						tx0iqkok = true;
4072 						rtl_dbg(rtlpriv,
4073 							COMP_IQK,
4074 							DBG_LOUD,
4075 							"RXK Step 1 fail\n");
4076 					}
4077 
4078 					/* ====== RX IQK ====== */
4079 					rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4080 					/* 1. RX RF Setting */
4081 					rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
4082 					rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000);
4083 					rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0002f);
4084 					rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xfffbb);
4085 					rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x88001);
4086 					rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d8);
4087 					rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
4088 
4089 					rtl_set_bbreg(hw, 0x978, 0x03FF8000, (tx_x0_rxk[cal])>>21&0x000007ff);
4090 					rtl_set_bbreg(hw, 0x978, 0x000007FF, (tx_y0_rxk[cal])>>21&0x000007ff);
4091 					rtl_set_bbreg(hw, 0x978, BIT(31), 0x1);
4092 					rtl_set_bbreg(hw, 0x97c, BIT(31), 0x0);
4093 					rtl_set_bbreg(hw, 0xcb8, 0xF, 0xe);
4094 					rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
4095 					rtl_write_dword(rtlpriv, 0x984, 0x0046a911);
4096 
4097 					rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
4098 					rtl_set_bbreg(hw, 0xc80, BIT(29), 0x1);
4099 					rtl_set_bbreg(hw, 0xc84, BIT(29), 0x0);
4100 					rtl_write_dword(rtlpriv, 0xc88, 0x02140119);
4101 
4102 					rtl_write_dword(rtlpriv, 0xc8c, 0x28160d00); /* pDM_Odm->SupportInterface == 1 */
4103 
4104 					if (k == 2)
4105 						rtl_set_bbreg(hw, 0xce8, BIT(30), 0x1);  /* RX VDF Enable */
4106 					rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
4107 
4108 					cal_retry = 0;
4109 					while (1) {
4110 						/* one shot */
4111 						rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
4112 						rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
4113 
4114 						mdelay(10); /* Delay 10ms */
4115 						rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
4116 						delay_count = 0;
4117 						while (1) {
4118 							iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
4119 							if ((~iqk_ready) || (delay_count > 20))
4120 								break;
4121 							else{
4122 								mdelay(1);
4123 								delay_count++;
4124 							}
4125 						}
4126 
4127 						if (delay_count < 20) {	/* If 20ms No Result, then cal_retry++ */
4128 							/* ============RXIQK Check============== */
4129 							rx_fail = rtl_get_bbreg(hw, 0xd00, BIT(11));
4130 							if (rx_fail == 0) {
4131 								rtl_write_dword(rtlpriv, 0xcb8, 0x06000000);
4132 								vdf_x[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4133 								rtl_write_dword(rtlpriv, 0xcb8, 0x08000000);
4134 								vdf_y[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4135 								rx0iqkok = true;
4136 								break;
4137 							} else {
4138 								rtl_set_bbreg(hw, 0xc10, 0x000003ff, 0x200>>1);
4139 								rtl_set_bbreg(hw, 0xc10, 0x03ff0000, 0x0>>1);
4140 								rx0iqkok = false;
4141 								cal_retry++;
4142 								if (cal_retry == 10)
4143 									break;
4144 
4145 							}
4146 						} else{
4147 							rx0iqkok = false;
4148 							cal_retry++;
4149 							if (cal_retry == 10)
4150 								break;
4151 						}
4152 					}
4153 
4154 				}
4155 				if (k == 3) {
4156 					rx_x0[cal] = vdf_x[k-1];
4157 					rx_y0[cal] = vdf_y[k-1];
4158 				}
4159 				rtl_set_bbreg(hw, 0xce8, BIT(31), 0x1);    /* TX VDF Enable */
4160 			}
4161 
4162 			else{
4163 				/* ====== RX mode TXK (RXK Step 1) ====== */
4164 				rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4165 				/* 1. TX RF Setting */
4166 				rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
4167 				rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000);
4168 				rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x00029);
4169 				rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xd7ffb);
4170 				rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, temp_reg65);
4171 				rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001);
4172 				rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
4173 				rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
4174 				rtl_write_dword(rtlpriv, 0xb00, 0x03000100);
4175 				rtl_write_dword(rtlpriv, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */
4176 
4177 				rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
4178 				rtl_write_dword(rtlpriv, 0xc80, 0x18008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
4179 				rtl_write_dword(rtlpriv, 0xc84, 0x38008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */
4180 				rtl_write_dword(rtlpriv, 0xc88, 0x821603e0);
4181 				/* ODM_Write4Byte(pDM_Odm, 0xc8c, 0x68163e96); */
4182 				rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
4183 				cal_retry = 0;
4184 				while (1) {
4185 					/* one shot */
4186 					rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
4187 					rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
4188 
4189 					mdelay(10); /* Delay 10ms */
4190 					rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
4191 					delay_count = 0;
4192 					while (1) {
4193 						iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
4194 						if ((~iqk_ready) || (delay_count > 20))
4195 							break;
4196 						else{
4197 							mdelay(1);
4198 							delay_count++;
4199 						}
4200 					}
4201 
4202 					if (delay_count < 20) {							/* If 20ms No Result, then cal_retry++ */
4203 						/* ============TXIQK Check============== */
4204 						tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12));
4205 
4206 						if (~tx_fail) {
4207 							rtl_write_dword(rtlpriv, 0xcb8, 0x02000000);
4208 							tx_x0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4209 							rtl_write_dword(rtlpriv, 0xcb8, 0x04000000);
4210 							tx_y0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4211 							tx0iqkok = true;
4212 							break;
4213 						} else {
4214 							tx0iqkok = false;
4215 							cal_retry++;
4216 							if (cal_retry == 10)
4217 								break;
4218 						}
4219 					} else{
4220 						tx0iqkok = false;
4221 						cal_retry++;
4222 						if (cal_retry == 10)
4223 							break;
4224 					}
4225 				}
4226 
4227 				if (!tx0iqkok) {   /* If RX mode TXK fail, then take TXK Result */
4228 					tx_x0_rxk[cal] = tx_x0[cal];
4229 					tx_y0_rxk[cal] = tx_y0[cal];
4230 					tx0iqkok = true;
4231 					rtl_dbg(rtlpriv, COMP_IQK,
4232 						DBG_LOUD, "1");
4233 				}
4234 
4235 				/* ====== RX IQK ====== */
4236 				rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4237 				/* 1. RX RF Setting */
4238 				rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
4239 				rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000);
4240 				rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0002f);
4241 				rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xfffbb);
4242 				rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x88001);
4243 				rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d8);
4244 				rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
4245 
4246 				rtl_set_bbreg(hw, 0x978, 0x03FF8000, (tx_x0_rxk[cal])>>21&0x000007ff);
4247 				rtl_set_bbreg(hw, 0x978, 0x000007FF, (tx_y0_rxk[cal])>>21&0x000007ff);
4248 				rtl_set_bbreg(hw, 0x978, BIT(31), 0x1);
4249 				rtl_set_bbreg(hw, 0x97c, BIT(31), 0x0);
4250 				/* ODM_SetBBReg(pDM_Odm, 0xcb8, 0xF, 0xe); */
4251 				rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
4252 				rtl_write_dword(rtlpriv, 0x984, 0x0046a911);
4253 
4254 				rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
4255 				rtl_write_dword(rtlpriv, 0xc80, 0x38008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
4256 				rtl_write_dword(rtlpriv, 0xc84, 0x18008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */
4257 				rtl_write_dword(rtlpriv, 0xc88, 0x02140119);
4258 
4259 				rtl_write_dword(rtlpriv, 0xc8c, 0x28160d00); /*pDM_Odm->SupportInterface == 1*/
4260 
4261 				rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
4262 
4263 				cal_retry = 0;
4264 				while (1) {
4265 					/* one shot */
4266 					rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
4267 					rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
4268 
4269 					mdelay(10); /* Delay 10ms */
4270 					rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
4271 					delay_count = 0;
4272 					while (1) {
4273 						iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
4274 						if ((~iqk_ready) || (delay_count > 20))
4275 							break;
4276 						else{
4277 							mdelay(1);
4278 							delay_count++;
4279 						}
4280 					}
4281 
4282 					if (delay_count < 20) {	/* If 20ms No Result, then cal_retry++ */
4283 						/* ============RXIQK Check============== */
4284 						rx_fail = rtl_get_bbreg(hw, 0xd00, BIT(11));
4285 						if (rx_fail == 0) {
4286 							rtl_write_dword(rtlpriv, 0xcb8, 0x06000000);
4287 							rx_x0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4288 							rtl_write_dword(rtlpriv, 0xcb8, 0x08000000);
4289 							rx_y0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4290 							rx0iqkok = true;
4291 							break;
4292 						} else{
4293 							rtl_set_bbreg(hw, 0xc10, 0x000003ff, 0x200>>1);
4294 							rtl_set_bbreg(hw, 0xc10, 0x03ff0000, 0x0>>1);
4295 							rx0iqkok = false;
4296 							cal_retry++;
4297 							if (cal_retry == 10)
4298 								break;
4299 
4300 						}
4301 					} else{
4302 						rx0iqkok = false;
4303 						cal_retry++;
4304 						if (cal_retry == 10)
4305 							break;
4306 					}
4307 				}
4308 			}
4309 
4310 			if (tx0iqkok)
4311 				tx_average++;
4312 			if (rx0iqkok)
4313 				rx_average++;
4314 			rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4315 			rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, temp_reg65);
4316 			break;
4317 		default:
4318 			break;
4319 		}
4320 		cal++;
4321 	}
4322 
4323 	/* FillIQK Result */
4324 	switch (path) {
4325 	case RF90_PATH_A:
4326 		rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
4327 			"========Path_A =======\n");
4328 		if (tx_average == 0)
4329 			break;
4330 
4331 		for (i = 0; i < tx_average; i++) {
4332 			rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
4333 				"TX_X0_RXK[%d] = %x ;; TX_Y0_RXK[%d] = %x\n", i,
4334 				(tx_x0_rxk[i]) >> 21 & 0x000007ff, i,
4335 				(tx_y0_rxk[i]) >> 21 & 0x000007ff);
4336 			rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
4337 				"TX_X0[%d] = %x ;; TX_Y0[%d] = %x\n", i,
4338 				(tx_x0[i]) >> 21 & 0x000007ff, i,
4339 				(tx_y0[i]) >> 21 & 0x000007ff);
4340 		}
4341 		for (i = 0; i < tx_average; i++) {
4342 			for (ii = i+1; ii < tx_average; ii++) {
4343 				dx = (tx_x0[i]>>21) - (tx_x0[ii]>>21);
4344 				if (dx < 3 && dx > -3) {
4345 					dy = (tx_y0[i]>>21) - (tx_y0[ii]>>21);
4346 					if (dy < 3 && dy > -3) {
4347 						tx_x = ((tx_x0[i]>>21) + (tx_x0[ii]>>21))/2;
4348 						tx_y = ((tx_y0[i]>>21) + (tx_y0[ii]>>21))/2;
4349 						tx_finish = 1;
4350 						break;
4351 					}
4352 				}
4353 			}
4354 			if (tx_finish == 1)
4355 				break;
4356 		}
4357 
4358 		if (tx_finish == 1)
4359 			_rtl8821ae_iqk_tx_fill_iqc(hw, path, tx_x, tx_y); /* ? */
4360 		else
4361 			_rtl8821ae_iqk_tx_fill_iqc(hw, path, 0x200, 0x0);
4362 
4363 		if (rx_average == 0)
4364 			break;
4365 
4366 		for (i = 0; i < rx_average; i++)
4367 			rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
4368 				"RX_X0[%d] = %x ;; RX_Y0[%d] = %x\n", i,
4369 				(rx_x0[i])>>21&0x000007ff, i,
4370 				(rx_y0[i])>>21&0x000007ff);
4371 		for (i = 0; i < rx_average; i++) {
4372 			for (ii = i+1; ii < rx_average; ii++) {
4373 				dx = (rx_x0[i]>>21) - (rx_x0[ii]>>21);
4374 				if (dx < 4 && dx > -4) {
4375 					dy = (rx_y0[i]>>21) - (rx_y0[ii]>>21);
4376 					if (dy < 4 && dy > -4) {
4377 						rx_x = ((rx_x0[i]>>21) + (rx_x0[ii]>>21))/2;
4378 						rx_y = ((rx_y0[i]>>21) + (rx_y0[ii]>>21))/2;
4379 						rx_finish = 1;
4380 						break;
4381 					}
4382 				}
4383 			}
4384 			if (rx_finish == 1)
4385 				break;
4386 		}
4387 
4388 		if (rx_finish == 1)
4389 			_rtl8821ae_iqk_rx_fill_iqc(hw, path, rx_x, rx_y);
4390 		else
4391 			_rtl8821ae_iqk_rx_fill_iqc(hw, path, 0x200, 0x0);
4392 		break;
4393 	default:
4394 		break;
4395 	}
4396 }
4397 
_rtl8821ae_iqk_restore_rf(struct ieee80211_hw * hw,enum radio_path path,u32 * backup_rf_reg,u32 * rf_backup,u32 rf_reg_num)4398 static void _rtl8821ae_iqk_restore_rf(struct ieee80211_hw *hw,
4399 				      enum radio_path path,
4400 				      u32 *backup_rf_reg,
4401 				      u32 *rf_backup, u32 rf_reg_num)
4402 {
4403 	struct rtl_priv *rtlpriv = rtl_priv(hw);
4404 	u32 i;
4405 
4406 	rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4407 	for (i = 0; i < RF_REG_NUM; i++)
4408 		rtl_set_rfreg(hw, path, backup_rf_reg[i], RFREG_OFFSET_MASK,
4409 			      rf_backup[i]);
4410 
4411 	switch (path) {
4412 	case RF90_PATH_A:
4413 		rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
4414 			"RestoreRF Path A Success!!!!\n");
4415 		break;
4416 	default:
4417 			break;
4418 	}
4419 }
4420 
_rtl8821ae_iqk_restore_afe(struct ieee80211_hw * hw,u32 * afe_backup,u32 * backup_afe_reg,u32 afe_num)4421 static void _rtl8821ae_iqk_restore_afe(struct ieee80211_hw *hw,
4422 				       u32 *afe_backup, u32 *backup_afe_reg,
4423 				       u32 afe_num)
4424 {
4425 	u32 i;
4426 	struct rtl_priv *rtlpriv = rtl_priv(hw);
4427 
4428 	rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4429 	/* Reload AFE Parameters */
4430 	for (i = 0; i < afe_num; i++)
4431 		rtl_write_dword(rtlpriv, backup_afe_reg[i], afe_backup[i]);
4432 	rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
4433 	rtl_write_dword(rtlpriv, 0xc80, 0x0);
4434 	rtl_write_dword(rtlpriv, 0xc84, 0x0);
4435 	rtl_write_dword(rtlpriv, 0xc88, 0x0);
4436 	rtl_write_dword(rtlpriv, 0xc8c, 0x3c000000);
4437 	rtl_write_dword(rtlpriv, 0xc90, 0x00000080);
4438 	rtl_write_dword(rtlpriv, 0xc94, 0x00000000);
4439 	rtl_write_dword(rtlpriv, 0xcc4, 0x20040000);
4440 	rtl_write_dword(rtlpriv, 0xcc8, 0x20000000);
4441 	rtl_write_dword(rtlpriv, 0xcb8, 0x0);
4442 	rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD, "RestoreAFE Success!!!!\n");
4443 }
4444 
_rtl8821ae_iqk_restore_macbb(struct ieee80211_hw * hw,u32 * macbb_backup,u32 * backup_macbb_reg,u32 macbb_num)4445 static void _rtl8821ae_iqk_restore_macbb(struct ieee80211_hw *hw,
4446 					 u32 *macbb_backup,
4447 					 u32 *backup_macbb_reg,
4448 					 u32 macbb_num)
4449 {
4450 	u32 i;
4451 	struct rtl_priv *rtlpriv = rtl_priv(hw);
4452 
4453 	rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4454 	/* Reload MacBB Parameters */
4455 	for (i = 0; i < macbb_num; i++)
4456 		rtl_write_dword(rtlpriv, backup_macbb_reg[i], macbb_backup[i]);
4457 	rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD, "RestoreMacBB Success!!!!\n");
4458 }
4459 
4460 #undef MACBB_REG_NUM
4461 #undef AFE_REG_NUM
4462 #undef RF_REG_NUM
4463 
4464 #define MACBB_REG_NUM 11
4465 #define AFE_REG_NUM 12
4466 #define RF_REG_NUM 3
4467 
_rtl8821ae_phy_iq_calibrate(struct ieee80211_hw * hw)4468 static void _rtl8821ae_phy_iq_calibrate(struct ieee80211_hw *hw)
4469 {
4470 	u32	macbb_backup[MACBB_REG_NUM];
4471 	u32 afe_backup[AFE_REG_NUM];
4472 	u32 rfa_backup[RF_REG_NUM];
4473 	u32 rfb_backup[RF_REG_NUM];
4474 	u32 backup_macbb_reg[MACBB_REG_NUM] = {
4475 		0xb00, 0x520, 0x550, 0x808, 0x90c, 0xc00, 0xc50,
4476 		0xe00, 0xe50, 0x838, 0x82c
4477 	};
4478 	u32 backup_afe_reg[AFE_REG_NUM] = {
4479 		0xc5c, 0xc60, 0xc64, 0xc68, 0xc6c, 0xc70, 0xc74,
4480 		0xc78, 0xc7c, 0xc80, 0xc84, 0xcb8
4481 	};
4482 	u32	backup_rf_reg[RF_REG_NUM] = {0x65, 0x8f, 0x0};
4483 
4484 	_rtl8821ae_iqk_backup_macbb(hw, macbb_backup, backup_macbb_reg,
4485 				    MACBB_REG_NUM);
4486 	_rtl8821ae_iqk_backup_afe(hw, afe_backup, backup_afe_reg, AFE_REG_NUM);
4487 	_rtl8821ae_iqk_backup_rf(hw, rfa_backup, rfb_backup, backup_rf_reg,
4488 				 RF_REG_NUM);
4489 
4490 	_rtl8821ae_iqk_configure_mac(hw);
4491 	_rtl8821ae_iqk_tx(hw, RF90_PATH_A);
4492 	_rtl8821ae_iqk_restore_rf(hw, RF90_PATH_A, backup_rf_reg, rfa_backup,
4493 				  RF_REG_NUM);
4494 
4495 	_rtl8821ae_iqk_restore_afe(hw, afe_backup, backup_afe_reg, AFE_REG_NUM);
4496 	_rtl8821ae_iqk_restore_macbb(hw, macbb_backup, backup_macbb_reg,
4497 				     MACBB_REG_NUM);
4498 }
4499 
_rtl8821ae_phy_set_rfpath_switch(struct ieee80211_hw * hw,bool main)4500 static void _rtl8821ae_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool main)
4501 {
4502 	struct rtl_priv *rtlpriv = rtl_priv(hw);
4503 	/* struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); */
4504 	/* struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); */
4505 	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "\n");
4506 
4507 	if (main)
4508 		rtl_set_bbreg(hw, RA_RFE_PINMUX + 4, BIT(29) | BIT(28), 0x1);
4509 	else
4510 		rtl_set_bbreg(hw, RA_RFE_PINMUX + 4, BIT(29) | BIT(28), 0x2);
4511 }
4512 
4513 #undef IQK_ADDA_REG_NUM
4514 #undef IQK_DELAY_TIME
4515 
rtl8812ae_phy_iq_calibrate(struct ieee80211_hw * hw,bool b_recovery)4516 void rtl8812ae_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery)
4517 {
4518 }
4519 
rtl8812ae_do_iqk(struct ieee80211_hw * hw,u8 delta_thermal_index,u8 thermal_value,u8 threshold)4520 void rtl8812ae_do_iqk(struct ieee80211_hw *hw, u8 delta_thermal_index,
4521 		      u8 thermal_value, u8 threshold)
4522 {
4523 	struct rtl_dm	*rtldm = rtl_dm(rtl_priv(hw));
4524 
4525 	rtldm->thermalvalue_iqk = thermal_value;
4526 	rtl8812ae_phy_iq_calibrate(hw, false);
4527 }
4528 
rtl8821ae_phy_iq_calibrate(struct ieee80211_hw * hw,bool b_recovery)4529 void rtl8821ae_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery)
4530 {
4531 	struct rtl_priv *rtlpriv = rtl_priv(hw);
4532 	struct rtl_phy *rtlphy = &rtlpriv->phy;
4533 
4534 	if (!rtlphy->lck_inprogress) {
4535 		spin_lock(&rtlpriv->locks.iqk_lock);
4536 		rtlphy->lck_inprogress = true;
4537 		spin_unlock(&rtlpriv->locks.iqk_lock);
4538 
4539 		_rtl8821ae_phy_iq_calibrate(hw);
4540 
4541 		spin_lock(&rtlpriv->locks.iqk_lock);
4542 		rtlphy->lck_inprogress = false;
4543 		spin_unlock(&rtlpriv->locks.iqk_lock);
4544 	}
4545 }
4546 
rtl8821ae_reset_iqk_result(struct ieee80211_hw * hw)4547 void rtl8821ae_reset_iqk_result(struct ieee80211_hw *hw)
4548 {
4549 	struct rtl_priv *rtlpriv = rtl_priv(hw);
4550 	struct rtl_phy *rtlphy = &rtlpriv->phy;
4551 	u8 i;
4552 
4553 	rtl_dbg(rtlpriv, COMP_IQK, DBG_LOUD,
4554 		"rtl8812ae_dm_reset_iqk_result:: settings regs %d default regs %d\n",
4555 		(int)(sizeof(rtlphy->iqk_matrix) /
4556 		sizeof(struct iqk_matrix_regs)),
4557 		IQK_MATRIX_SETTINGS_NUM);
4558 
4559 	for (i = 0; i < IQK_MATRIX_SETTINGS_NUM; i++) {
4560 		rtlphy->iqk_matrix[i].value[0][0] = 0x100;
4561 		rtlphy->iqk_matrix[i].value[0][2] = 0x100;
4562 		rtlphy->iqk_matrix[i].value[0][4] = 0x100;
4563 		rtlphy->iqk_matrix[i].value[0][6] = 0x100;
4564 
4565 		rtlphy->iqk_matrix[i].value[0][1] = 0x0;
4566 		rtlphy->iqk_matrix[i].value[0][3] = 0x0;
4567 		rtlphy->iqk_matrix[i].value[0][5] = 0x0;
4568 		rtlphy->iqk_matrix[i].value[0][7] = 0x0;
4569 
4570 		rtlphy->iqk_matrix[i].iqk_done = false;
4571 	}
4572 }
4573 
rtl8821ae_do_iqk(struct ieee80211_hw * hw,u8 delta_thermal_index,u8 thermal_value,u8 threshold)4574 void rtl8821ae_do_iqk(struct ieee80211_hw *hw, u8 delta_thermal_index,
4575 		      u8 thermal_value, u8 threshold)
4576 {
4577 	struct rtl_dm	*rtldm = rtl_dm(rtl_priv(hw));
4578 
4579 	rtl8821ae_reset_iqk_result(hw);
4580 
4581 	rtldm->thermalvalue_iqk = thermal_value;
4582 	rtl8821ae_phy_iq_calibrate(hw, false);
4583 }
4584 
rtl8821ae_phy_lc_calibrate(struct ieee80211_hw * hw)4585 void rtl8821ae_phy_lc_calibrate(struct ieee80211_hw *hw)
4586 {
4587 }
4588 
rtl8821ae_phy_ap_calibrate(struct ieee80211_hw * hw,s8 delta)4589 void rtl8821ae_phy_ap_calibrate(struct ieee80211_hw *hw, s8 delta)
4590 {
4591 }
4592 
rtl8821ae_phy_set_rfpath_switch(struct ieee80211_hw * hw,bool bmain)4593 void rtl8821ae_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain)
4594 {
4595 	_rtl8821ae_phy_set_rfpath_switch(hw, bmain);
4596 }
4597 
rtl8821ae_phy_set_io_cmd(struct ieee80211_hw * hw,enum io_type iotype)4598 bool rtl8821ae_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
4599 {
4600 	struct rtl_priv *rtlpriv = rtl_priv(hw);
4601 	struct rtl_phy *rtlphy = &rtlpriv->phy;
4602 	bool postprocessing = false;
4603 
4604 	rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
4605 		"-->IO Cmd(%#x), set_io_inprogress(%d)\n",
4606 		iotype, rtlphy->set_io_inprogress);
4607 	do {
4608 		switch (iotype) {
4609 		case IO_CMD_RESUME_DM_BY_SCAN:
4610 			rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
4611 				"[IO CMD] Resume DM after scan.\n");
4612 			postprocessing = true;
4613 			break;
4614 		case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
4615 		case IO_CMD_PAUSE_BAND1_DM_BY_SCAN:
4616 			rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
4617 				"[IO CMD] Pause DM before scan.\n");
4618 			postprocessing = true;
4619 			break;
4620 		default:
4621 			pr_err("switch case %#x not processed\n",
4622 			       iotype);
4623 			break;
4624 		}
4625 	} while (false);
4626 	if (postprocessing && !rtlphy->set_io_inprogress) {
4627 		rtlphy->set_io_inprogress = true;
4628 		rtlphy->current_io_type = iotype;
4629 	} else {
4630 		return false;
4631 	}
4632 	rtl8821ae_phy_set_io(hw);
4633 	rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE, "IO Type(%#x)\n", iotype);
4634 	return true;
4635 }
4636 
rtl8821ae_phy_set_io(struct ieee80211_hw * hw)4637 static void rtl8821ae_phy_set_io(struct ieee80211_hw *hw)
4638 {
4639 	struct rtl_priv *rtlpriv = rtl_priv(hw);
4640 	struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
4641 	struct rtl_phy *rtlphy = &rtlpriv->phy;
4642 
4643 	rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
4644 		"--->Cmd(%#x), set_io_inprogress(%d)\n",
4645 		rtlphy->current_io_type, rtlphy->set_io_inprogress);
4646 	switch (rtlphy->current_io_type) {
4647 	case IO_CMD_RESUME_DM_BY_SCAN:
4648 		if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC)
4649 			_rtl8821ae_resume_tx_beacon(hw);
4650 		rtl8821ae_dm_write_dig(hw, rtlphy->initgain_backup.xaagccore1);
4651 		rtl8821ae_dm_write_cck_cca_thres(hw,
4652 						 rtlphy->initgain_backup.cca);
4653 		break;
4654 	case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
4655 		if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC)
4656 			_rtl8821ae_stop_tx_beacon(hw);
4657 		rtlphy->initgain_backup.xaagccore1 = dm_digtable->cur_igvalue;
4658 		rtl8821ae_dm_write_dig(hw, 0x17);
4659 		rtlphy->initgain_backup.cca = dm_digtable->cur_cck_cca_thres;
4660 		rtl8821ae_dm_write_cck_cca_thres(hw, 0x40);
4661 		break;
4662 	case IO_CMD_PAUSE_BAND1_DM_BY_SCAN:
4663 		break;
4664 	default:
4665 		pr_err("switch case %#x not processed\n",
4666 		       rtlphy->current_io_type);
4667 		break;
4668 	}
4669 	rtlphy->set_io_inprogress = false;
4670 	rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
4671 		"(%#x)\n", rtlphy->current_io_type);
4672 }
4673 
rtl8821ae_phy_set_rf_on(struct ieee80211_hw * hw)4674 static void rtl8821ae_phy_set_rf_on(struct ieee80211_hw *hw)
4675 {
4676 	struct rtl_priv *rtlpriv = rtl_priv(hw);
4677 
4678 	rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b);
4679 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
4680 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
4681 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
4682 	rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
4683 }
4684 
_rtl8821ae_phy_set_rf_power_state(struct ieee80211_hw * hw,enum rf_pwrstate rfpwr_state)4685 static bool _rtl8821ae_phy_set_rf_power_state(struct ieee80211_hw *hw,
4686 					      enum rf_pwrstate rfpwr_state)
4687 {
4688 	struct rtl_priv *rtlpriv = rtl_priv(hw);
4689 	struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
4690 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
4691 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
4692 	bool bresult = true;
4693 	u8 i, queue_id;
4694 	struct rtl8192_tx_ring *ring = NULL;
4695 
4696 	switch (rfpwr_state) {
4697 	case ERFON:
4698 		if ((ppsc->rfpwr_state == ERFOFF) &&
4699 		    RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
4700 			bool rtstatus = false;
4701 			u32 initializecount = 0;
4702 
4703 			do {
4704 				initializecount++;
4705 				rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
4706 					"IPS Set eRf nic enable\n");
4707 				rtstatus = rtl_ps_enable_nic(hw);
4708 			} while (!rtstatus && (initializecount < 10));
4709 			RT_CLEAR_PS_LEVEL(ppsc,
4710 					  RT_RF_OFF_LEVL_HALT_NIC);
4711 		} else {
4712 			rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
4713 				"Set ERFON slept:%d ms\n",
4714 				jiffies_to_msecs(jiffies -
4715 						 ppsc->last_sleep_jiffies));
4716 			ppsc->last_awake_jiffies = jiffies;
4717 			rtl8821ae_phy_set_rf_on(hw);
4718 		}
4719 		if (mac->link_state == MAC80211_LINKED) {
4720 			rtlpriv->cfg->ops->led_control(hw,
4721 						       LED_CTL_LINK);
4722 		} else {
4723 			rtlpriv->cfg->ops->led_control(hw,
4724 						       LED_CTL_NO_LINK);
4725 		}
4726 		break;
4727 	case ERFOFF:
4728 		for (queue_id = 0, i = 0;
4729 		     queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
4730 			ring = &pcipriv->dev.tx_ring[queue_id];
4731 			if (queue_id == BEACON_QUEUE ||
4732 			    skb_queue_len(&ring->queue) == 0) {
4733 				queue_id++;
4734 				continue;
4735 			} else {
4736 				rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
4737 					"eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
4738 					(i + 1), queue_id,
4739 					skb_queue_len(&ring->queue));
4740 
4741 				udelay(10);
4742 				i++;
4743 			}
4744 			if (i >= MAX_DOZE_WAITING_TIMES_9x) {
4745 				rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
4746 					"\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
4747 					MAX_DOZE_WAITING_TIMES_9x,
4748 					queue_id,
4749 					skb_queue_len(&ring->queue));
4750 				break;
4751 			}
4752 		}
4753 
4754 		if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
4755 			rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
4756 				"IPS Set eRf nic disable\n");
4757 			rtl_ps_disable_nic(hw);
4758 			RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
4759 		} else {
4760 			if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) {
4761 				rtlpriv->cfg->ops->led_control(hw,
4762 							       LED_CTL_NO_LINK);
4763 			} else {
4764 				rtlpriv->cfg->ops->led_control(hw,
4765 							       LED_CTL_POWER_OFF);
4766 			}
4767 		}
4768 		break;
4769 	default:
4770 		pr_err("switch case %#x not processed\n",
4771 		       rfpwr_state);
4772 		bresult = false;
4773 		break;
4774 	}
4775 	if (bresult)
4776 		ppsc->rfpwr_state = rfpwr_state;
4777 	return bresult;
4778 }
4779 
rtl8821ae_phy_set_rf_power_state(struct ieee80211_hw * hw,enum rf_pwrstate rfpwr_state)4780 bool rtl8821ae_phy_set_rf_power_state(struct ieee80211_hw *hw,
4781 				      enum rf_pwrstate rfpwr_state)
4782 {
4783 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
4784 
4785 	bool bresult = false;
4786 
4787 	if (rfpwr_state == ppsc->rfpwr_state)
4788 		return bresult;
4789 	bresult = _rtl8821ae_phy_set_rf_power_state(hw, rfpwr_state);
4790 	return bresult;
4791 }
4792