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