xref: /linux/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/phy.c (revision 6fdcba32711044c35c0e1b094cbd8f3f0b4472c9)
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2009-2014  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 
14 static u32 _rtl92ee_phy_rf_serial_read(struct ieee80211_hw *hw,
15 				       enum radio_path rfpath, u32 offset);
16 static void _rtl92ee_phy_rf_serial_write(struct ieee80211_hw *hw,
17 					 enum radio_path rfpath, u32 offset,
18 					 u32 data);
19 static u32 _rtl92ee_phy_calculate_bit_shift(u32 bitmask);
20 static bool _rtl92ee_phy_bb8192ee_config_parafile(struct ieee80211_hw *hw);
21 static bool _rtl92ee_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);
22 static bool phy_config_bb_with_hdr_file(struct ieee80211_hw *hw,
23 					u8 configtype);
24 static bool phy_config_bb_with_pghdrfile(struct ieee80211_hw *hw,
25 					 u8 configtype);
26 static void phy_init_bb_rf_register_def(struct ieee80211_hw *hw);
27 static bool _rtl92ee_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
28 					      u32 cmdtableidx, u32 cmdtablesz,
29 					      enum swchnlcmd_id cmdid,
30 					      u32 para1, u32 para2,
31 					      u32 msdelay);
32 static bool _rtl92ee_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
33 					      u8 channel, u8 *stage,
34 					      u8 *step, u32 *delay);
35 static long _rtl92ee_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
36 					  enum wireless_mode wirelessmode,
37 					  u8 txpwridx);
38 static void rtl92ee_phy_set_rf_on(struct ieee80211_hw *hw);
39 static void rtl92ee_phy_set_io(struct ieee80211_hw *hw);
40 
41 u32 rtl92ee_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask)
42 {
43 	struct rtl_priv *rtlpriv = rtl_priv(hw);
44 	u32 returnvalue, originalvalue, bitshift;
45 
46 	RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
47 		 "regaddr(%#x), bitmask(%#x)\n", regaddr, bitmask);
48 	originalvalue = rtl_read_dword(rtlpriv, regaddr);
49 	bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask);
50 	returnvalue = (originalvalue & bitmask) >> bitshift;
51 
52 	RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
53 		 "BBR MASK=0x%x Addr[0x%x]=0x%x\n",
54 		  bitmask, regaddr, originalvalue);
55 
56 	return returnvalue;
57 }
58 
59 void rtl92ee_phy_set_bb_reg(struct ieee80211_hw *hw, u32 regaddr,
60 			    u32 bitmask, u32 data)
61 {
62 	struct rtl_priv *rtlpriv = rtl_priv(hw);
63 	u32 originalvalue, bitshift;
64 
65 	RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
66 		 "regaddr(%#x), bitmask(%#x), data(%#x)\n",
67 		  regaddr, bitmask, data);
68 
69 	if (bitmask != MASKDWORD) {
70 		originalvalue = rtl_read_dword(rtlpriv, regaddr);
71 		bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask);
72 		data = ((originalvalue & (~bitmask)) | (data << bitshift));
73 	}
74 
75 	rtl_write_dword(rtlpriv, regaddr, data);
76 
77 	RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
78 		 "regaddr(%#x), bitmask(%#x), data(%#x)\n",
79 		  regaddr, bitmask, data);
80 }
81 
82 u32 rtl92ee_phy_query_rf_reg(struct ieee80211_hw *hw,
83 			     enum radio_path rfpath, u32 regaddr, u32 bitmask)
84 {
85 	struct rtl_priv *rtlpriv = rtl_priv(hw);
86 	u32 original_value, readback_value, bitshift;
87 
88 	RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
89 		 "regaddr(%#x), rfpath(%#x), bitmask(%#x)\n",
90 		  regaddr, rfpath, bitmask);
91 
92 	spin_lock(&rtlpriv->locks.rf_lock);
93 
94 	original_value = _rtl92ee_phy_rf_serial_read(hw , rfpath, regaddr);
95 	bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask);
96 	readback_value = (original_value & bitmask) >> bitshift;
97 
98 	spin_unlock(&rtlpriv->locks.rf_lock);
99 
100 	RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
101 		 "regaddr(%#x),rfpath(%#x),bitmask(%#x),original_value(%#x)\n",
102 		  regaddr, rfpath, bitmask, original_value);
103 
104 	return readback_value;
105 }
106 
107 void rtl92ee_phy_set_rf_reg(struct ieee80211_hw *hw,
108 			    enum radio_path rfpath,
109 			    u32 addr, u32 bitmask, u32 data)
110 {
111 	struct rtl_priv *rtlpriv = rtl_priv(hw);
112 	u32 original_value, bitshift;
113 
114 	RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
115 		 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
116 		  addr, bitmask, data, rfpath);
117 
118 	spin_lock(&rtlpriv->locks.rf_lock);
119 
120 	if (bitmask != RFREG_OFFSET_MASK) {
121 		original_value = _rtl92ee_phy_rf_serial_read(hw, rfpath, addr);
122 		bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask);
123 		data = (original_value & (~bitmask)) | (data << bitshift);
124 	}
125 
126 	_rtl92ee_phy_rf_serial_write(hw, rfpath, addr, data);
127 
128 	spin_unlock(&rtlpriv->locks.rf_lock);
129 
130 	RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
131 		 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
132 		  addr, bitmask, data, rfpath);
133 }
134 
135 static u32 _rtl92ee_phy_rf_serial_read(struct ieee80211_hw *hw,
136 				       enum radio_path rfpath, u32 offset)
137 {
138 	struct rtl_priv *rtlpriv = rtl_priv(hw);
139 	struct rtl_phy *rtlphy = &rtlpriv->phy;
140 	struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
141 	u32 newoffset;
142 	u32 tmplong, tmplong2;
143 	u8 rfpi_enable = 0;
144 	u32 retvalue;
145 
146 	offset &= 0xff;
147 	newoffset = offset;
148 	if (RT_CANNOT_IO(hw)) {
149 		pr_err("return all one\n");
150 		return 0xFFFFFFFF;
151 	}
152 	tmplong = rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD);
153 	if (rfpath == RF90_PATH_A)
154 		tmplong2 = tmplong;
155 	else
156 		tmplong2 = rtl_get_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD);
157 	tmplong2 = (tmplong2 & (~BLSSIREADADDRESS)) |
158 		   (newoffset << 23) | BLSSIREADEDGE;
159 	rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
160 		      tmplong & (~BLSSIREADEDGE));
161 	rtl_set_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD, tmplong2);
162 	udelay(20);
163 	if (rfpath == RF90_PATH_A)
164 		rfpi_enable = (u8)rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1,
165 						BIT(8));
166 	else if (rfpath == RF90_PATH_B)
167 		rfpi_enable = (u8)rtl_get_bbreg(hw, RFPGA0_XB_HSSIPARAMETER1,
168 						BIT(8));
169 	if (rfpi_enable)
170 		retvalue = rtl_get_bbreg(hw, pphyreg->rf_rbpi,
171 					 BLSSIREADBACKDATA);
172 	else
173 		retvalue = rtl_get_bbreg(hw, pphyreg->rf_rb,
174 					 BLSSIREADBACKDATA);
175 	RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
176 		 "RFR-%d Addr[0x%x]=0x%x\n",
177 		  rfpath, pphyreg->rf_rb, retvalue);
178 	return retvalue;
179 }
180 
181 static void _rtl92ee_phy_rf_serial_write(struct ieee80211_hw *hw,
182 					 enum radio_path rfpath, u32 offset,
183 					 u32 data)
184 {
185 	u32 data_and_addr;
186 	u32 newoffset;
187 	struct rtl_priv *rtlpriv = rtl_priv(hw);
188 	struct rtl_phy *rtlphy = &rtlpriv->phy;
189 	struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
190 
191 	if (RT_CANNOT_IO(hw)) {
192 		pr_err("stop\n");
193 		return;
194 	}
195 	offset &= 0xff;
196 	newoffset = offset;
197 	data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff;
198 	rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr);
199 	RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
200 		 "RFW-%d Addr[0x%x]=0x%x\n", rfpath,
201 		 pphyreg->rf3wire_offset, data_and_addr);
202 }
203 
204 static u32 _rtl92ee_phy_calculate_bit_shift(u32 bitmask)
205 {
206 	u32 i;
207 
208 	for (i = 0; i <= 31; i++) {
209 		if (((bitmask >> i) & 0x1) == 1)
210 			break;
211 	}
212 	return i;
213 }
214 
215 bool rtl92ee_phy_mac_config(struct ieee80211_hw *hw)
216 {
217 	return _rtl92ee_phy_config_mac_with_headerfile(hw);
218 }
219 
220 bool rtl92ee_phy_bb_config(struct ieee80211_hw *hw)
221 {
222 	struct rtl_priv *rtlpriv = rtl_priv(hw);
223 	bool rtstatus = true;
224 	u16 regval;
225 	u32 tmp;
226 	u8 crystal_cap;
227 
228 	phy_init_bb_rf_register_def(hw);
229 	regval = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
230 	rtl_write_word(rtlpriv, REG_SYS_FUNC_EN,
231 		       regval | BIT(13) | BIT(0) | BIT(1));
232 
233 	rtl_write_byte(rtlpriv, REG_RF_CTRL, RF_EN | RF_RSTB | RF_SDMRSTB);
234 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN,
235 		       FEN_PPLL | FEN_PCIEA | FEN_DIO_PCIE |
236 		       FEN_BB_GLB_RSTN | FEN_BBRSTB);
237 
238 	rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL + 1, 0x80);
239 
240 	tmp = rtl_read_dword(rtlpriv, 0x4c);
241 	rtl_write_dword(rtlpriv, 0x4c, tmp | BIT(23));
242 
243 	rtstatus = _rtl92ee_phy_bb8192ee_config_parafile(hw);
244 
245 	crystal_cap = rtlpriv->efuse.eeprom_crystalcap & 0x3F;
246 	rtl_set_bbreg(hw, REG_MAC_PHY_CTRL, 0xFFF000,
247 		      (crystal_cap | (crystal_cap << 6)));
248 	return rtstatus;
249 }
250 
251 bool rtl92ee_phy_rf_config(struct ieee80211_hw *hw)
252 {
253 	return rtl92ee_phy_rf6052_config(hw);
254 }
255 
256 static bool _check_condition(struct ieee80211_hw *hw,
257 			     const u32  condition)
258 {
259 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
260 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
261 	u32 _board = rtlefuse->board_type; /*need efuse define*/
262 	u32 _interface = rtlhal->interface;
263 	u32 _platform = 0x08;/*SupportPlatform */
264 	u32 cond = condition;
265 
266 	if (condition == 0xCDCDCDCD)
267 		return true;
268 
269 	cond = condition & 0xFF;
270 	if ((_board != cond) && (cond != 0xFF))
271 		return false;
272 
273 	cond = condition & 0xFF00;
274 	cond = cond >> 8;
275 	if ((_interface & cond) == 0 && cond != 0x07)
276 		return false;
277 
278 	cond = condition & 0xFF0000;
279 	cond = cond >> 16;
280 	if ((_platform & cond) == 0 && cond != 0x0F)
281 		return false;
282 
283 	return true;
284 }
285 
286 static void _rtl92ee_config_rf_reg(struct ieee80211_hw *hw, u32 addr, u32 data,
287 				   enum radio_path rfpath, u32 regaddr)
288 {
289 	if (addr == 0xfe || addr == 0xffe) {
290 		mdelay(50);
291 	} else {
292 		rtl_set_rfreg(hw, rfpath, regaddr, RFREG_OFFSET_MASK, data);
293 		udelay(1);
294 
295 		if (addr == 0xb6) {
296 			u32 getvalue;
297 			u8 count = 0;
298 
299 			getvalue = rtl_get_rfreg(hw, rfpath, addr, MASKDWORD);
300 			udelay(1);
301 
302 			while ((getvalue >> 8) != (data >> 8)) {
303 				count++;
304 				rtl_set_rfreg(hw, rfpath, regaddr,
305 					      RFREG_OFFSET_MASK, data);
306 				udelay(1);
307 				getvalue = rtl_get_rfreg(hw, rfpath, addr,
308 							 MASKDWORD);
309 				if (count > 5)
310 					break;
311 			}
312 		}
313 
314 		if (addr == 0xb2) {
315 			u32 getvalue;
316 			u8 count = 0;
317 
318 			getvalue = rtl_get_rfreg(hw, rfpath, addr, MASKDWORD);
319 			udelay(1);
320 
321 			while (getvalue != data) {
322 				count++;
323 				rtl_set_rfreg(hw, rfpath, regaddr,
324 					      RFREG_OFFSET_MASK, data);
325 				udelay(1);
326 				rtl_set_rfreg(hw, rfpath, 0x18,
327 					      RFREG_OFFSET_MASK, 0x0fc07);
328 				udelay(1);
329 				getvalue = rtl_get_rfreg(hw, rfpath, addr,
330 							 MASKDWORD);
331 				if (count > 5)
332 					break;
333 			}
334 		}
335 	}
336 }
337 
338 static void _rtl92ee_config_rf_radio_a(struct ieee80211_hw *hw,
339 				       u32 addr, u32 data)
340 {
341 	u32 content = 0x1000; /*RF Content: radio_a_txt*/
342 	u32 maskforphyset = (u32)(content & 0xE000);
343 
344 	_rtl92ee_config_rf_reg(hw, addr, data, RF90_PATH_A,
345 			       addr | maskforphyset);
346 }
347 
348 static void _rtl92ee_config_rf_radio_b(struct ieee80211_hw *hw,
349 				       u32 addr, u32 data)
350 {
351 	u32 content = 0x1001; /*RF Content: radio_b_txt*/
352 	u32 maskforphyset = (u32)(content & 0xE000);
353 
354 	_rtl92ee_config_rf_reg(hw, addr, data, RF90_PATH_B,
355 			       addr | maskforphyset);
356 }
357 
358 static void _rtl92ee_config_bb_reg(struct ieee80211_hw *hw,
359 				   u32 addr, u32 data)
360 {
361 	if (addr == 0xfe)
362 		mdelay(50);
363 	else if (addr == 0xfd)
364 		mdelay(5);
365 	else if (addr == 0xfc)
366 		mdelay(1);
367 	else if (addr == 0xfb)
368 		udelay(50);
369 	else if (addr == 0xfa)
370 		udelay(5);
371 	else if (addr == 0xf9)
372 		udelay(1);
373 	else
374 		rtl_set_bbreg(hw, addr, MASKDWORD , data);
375 
376 	udelay(1);
377 }
378 
379 static void _rtl92ee_phy_init_tx_power_by_rate(struct ieee80211_hw *hw)
380 {
381 	struct rtl_priv *rtlpriv = rtl_priv(hw);
382 	struct rtl_phy *rtlphy = &rtlpriv->phy;
383 
384 	u8 band = BAND_ON_2_4G, rf = 0, txnum = 0, sec = 0;
385 
386 	for (; band <= BAND_ON_5G; ++band)
387 		for (; rf < TX_PWR_BY_RATE_NUM_RF; ++rf)
388 			for (; txnum < TX_PWR_BY_RATE_NUM_RF; ++txnum)
389 				for (; sec < TX_PWR_BY_RATE_NUM_SECTION; ++sec)
390 					rtlphy->tx_power_by_rate_offset
391 					     [band][rf][txnum][sec] = 0;
392 }
393 
394 static void _rtl92ee_phy_set_txpower_by_rate_base(struct ieee80211_hw *hw,
395 						  u8 band, u8 path,
396 						  u8 rate_section, u8 txnum,
397 						  u8 value)
398 {
399 	struct rtl_priv *rtlpriv = rtl_priv(hw);
400 	struct rtl_phy *rtlphy = &rtlpriv->phy;
401 
402 	if (path > RF90_PATH_D) {
403 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
404 			 "Invalid Rf Path %d\n", path);
405 		return;
406 	}
407 
408 	if (band == BAND_ON_2_4G) {
409 		switch (rate_section) {
410 		case CCK:
411 			rtlphy->txpwr_by_rate_base_24g[path][txnum][0] = value;
412 			break;
413 		case OFDM:
414 			rtlphy->txpwr_by_rate_base_24g[path][txnum][1] = value;
415 			break;
416 		case HT_MCS0_MCS7:
417 			rtlphy->txpwr_by_rate_base_24g[path][txnum][2] = value;
418 			break;
419 		case HT_MCS8_MCS15:
420 			rtlphy->txpwr_by_rate_base_24g[path][txnum][3] = value;
421 			break;
422 		default:
423 			RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
424 				 "Invalid RateSection %d in 2.4G,Rf %d,%dTx\n",
425 				  rate_section, path, txnum);
426 			break;
427 		}
428 	} else {
429 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
430 			 "Invalid Band %d\n", band);
431 	}
432 }
433 
434 static u8 _rtl92ee_phy_get_txpower_by_rate_base(struct ieee80211_hw *hw,
435 						u8 band, u8 path, u8 txnum,
436 						u8 rate_section)
437 {
438 	struct rtl_priv *rtlpriv = rtl_priv(hw);
439 	struct rtl_phy *rtlphy = &rtlpriv->phy;
440 	u8 value = 0;
441 
442 	if (path > RF90_PATH_D) {
443 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
444 			 "Invalid Rf Path %d\n", path);
445 		return 0;
446 	}
447 
448 	if (band == BAND_ON_2_4G) {
449 		switch (rate_section) {
450 		case CCK:
451 			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][0];
452 			break;
453 		case OFDM:
454 			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][1];
455 			break;
456 		case HT_MCS0_MCS7:
457 			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][2];
458 			break;
459 		case HT_MCS8_MCS15:
460 			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][3];
461 			break;
462 		default:
463 			RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
464 				 "Invalid RateSection %d in 2.4G,Rf %d,%dTx\n",
465 				  rate_section, path, txnum);
466 			break;
467 		}
468 	} else {
469 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
470 			 "Invalid Band %d()\n", band);
471 	}
472 	return value;
473 }
474 
475 static void _rtl92ee_phy_store_txpower_by_rate_base(struct ieee80211_hw *hw)
476 {
477 	struct rtl_priv *rtlpriv = rtl_priv(hw);
478 	struct rtl_phy *rtlphy = &rtlpriv->phy;
479 	u16 raw = 0;
480 	u8 base = 0, path = 0;
481 
482 	for (path = RF90_PATH_A; path <= RF90_PATH_B; ++path) {
483 		if (path == RF90_PATH_A) {
484 			raw = (u16)(rtlphy->tx_power_by_rate_offset
485 				    [BAND_ON_2_4G][path][RF_1TX][3] >> 24) &
486 				    0xFF;
487 			base = (raw >> 4) * 10 + (raw & 0xF);
488 			_rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G,
489 							      path, CCK, RF_1TX,
490 							      base);
491 		} else if (path == RF90_PATH_B) {
492 			raw = (u16)(rtlphy->tx_power_by_rate_offset
493 				    [BAND_ON_2_4G][path][RF_1TX][3] >> 0) &
494 				    0xFF;
495 			base = (raw >> 4) * 10 + (raw & 0xF);
496 			_rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G,
497 							      path, CCK, RF_1TX,
498 							      base);
499 		}
500 		raw = (u16)(rtlphy->tx_power_by_rate_offset
501 			    [BAND_ON_2_4G][path][RF_1TX][1] >> 24) & 0xFF;
502 		base = (raw >> 4) * 10 + (raw & 0xF);
503 		_rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path,
504 						      OFDM, RF_1TX, base);
505 
506 		raw = (u16)(rtlphy->tx_power_by_rate_offset
507 			    [BAND_ON_2_4G][path][RF_1TX][5] >> 24) & 0xFF;
508 		base = (raw >> 4) * 10 + (raw & 0xF);
509 		_rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path,
510 						      HT_MCS0_MCS7, RF_1TX,
511 						      base);
512 
513 		raw = (u16)(rtlphy->tx_power_by_rate_offset
514 			    [BAND_ON_2_4G][path][RF_2TX][7] >> 24) & 0xFF;
515 		base = (raw >> 4) * 10 + (raw & 0xF);
516 		_rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path,
517 						      HT_MCS8_MCS15, RF_2TX,
518 						      base);
519 	}
520 }
521 
522 static void _phy_convert_txpower_dbm_to_relative_value(u32 *data, u8 start,
523 						       u8 end, u8 base)
524 {
525 	s8 i = 0;
526 	u8 tmp = 0;
527 	u32 temp_data = 0;
528 
529 	for (i = 3; i >= 0; --i) {
530 		if (i >= start && i <= end) {
531 			/* Get the exact value */
532 			tmp = (u8)(*data >> (i * 8)) & 0xF;
533 			tmp += ((u8)((*data >> (i * 8 + 4)) & 0xF)) * 10;
534 
535 			/* Change the value to a relative value */
536 			tmp = (tmp > base) ? tmp - base : base - tmp;
537 		} else {
538 			tmp = (u8)(*data >> (i * 8)) & 0xFF;
539 		}
540 		temp_data <<= 8;
541 		temp_data |= tmp;
542 	}
543 	*data = temp_data;
544 }
545 
546 static void phy_convert_txpwr_dbm_to_rel_val(struct ieee80211_hw *hw)
547 {
548 	struct rtl_priv *rtlpriv = rtl_priv(hw);
549 	struct rtl_phy *rtlphy = &rtlpriv->phy;
550 	u8 base = 0, rf = 0, band = BAND_ON_2_4G;
551 
552 	for (rf = RF90_PATH_A; rf <= RF90_PATH_B; ++rf) {
553 		if (rf == RF90_PATH_A) {
554 			base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band,
555 								     rf, RF_1TX,
556 								     CCK);
557 			_phy_convert_txpower_dbm_to_relative_value(
558 				&rtlphy->tx_power_by_rate_offset
559 				[band][rf][RF_1TX][2],
560 				1, 1, base);
561 			_phy_convert_txpower_dbm_to_relative_value(
562 				&rtlphy->tx_power_by_rate_offset
563 				[band][rf][RF_1TX][3],
564 				1, 3, base);
565 		} else if (rf == RF90_PATH_B) {
566 			base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band,
567 								     rf, RF_1TX,
568 								     CCK);
569 			_phy_convert_txpower_dbm_to_relative_value(
570 				&rtlphy->tx_power_by_rate_offset
571 				[band][rf][RF_1TX][3],
572 				0, 0, base);
573 			_phy_convert_txpower_dbm_to_relative_value(
574 				&rtlphy->tx_power_by_rate_offset
575 				[band][rf][RF_1TX][2],
576 				1, 3, base);
577 		}
578 		base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band, rf,
579 							     RF_1TX, OFDM);
580 		_phy_convert_txpower_dbm_to_relative_value(
581 			&rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][0],
582 			0, 3, base);
583 		_phy_convert_txpower_dbm_to_relative_value(
584 			&rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][1],
585 			0, 3, base);
586 
587 		base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band, rf,
588 							     RF_1TX,
589 							     HT_MCS0_MCS7);
590 		_phy_convert_txpower_dbm_to_relative_value(
591 			&rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][4],
592 			0, 3, base);
593 		_phy_convert_txpower_dbm_to_relative_value(
594 			&rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][5],
595 			0, 3, base);
596 
597 		base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band, rf,
598 							     RF_2TX,
599 							     HT_MCS8_MCS15);
600 		_phy_convert_txpower_dbm_to_relative_value(
601 			&rtlphy->tx_power_by_rate_offset[band][rf][RF_2TX][6],
602 			0, 3, base);
603 
604 		_phy_convert_txpower_dbm_to_relative_value(
605 			&rtlphy->tx_power_by_rate_offset[band][rf][RF_2TX][7],
606 			0, 3, base);
607 	}
608 
609 	RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
610 		 "<==phy_convert_txpwr_dbm_to_rel_val()\n");
611 }
612 
613 static void _rtl92ee_phy_txpower_by_rate_configuration(struct ieee80211_hw *hw)
614 {
615 	_rtl92ee_phy_store_txpower_by_rate_base(hw);
616 	phy_convert_txpwr_dbm_to_rel_val(hw);
617 }
618 
619 static bool _rtl92ee_phy_bb8192ee_config_parafile(struct ieee80211_hw *hw)
620 {
621 	struct rtl_priv *rtlpriv = rtl_priv(hw);
622 	struct rtl_phy *rtlphy = &rtlpriv->phy;
623 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
624 	bool rtstatus;
625 
626 	rtstatus = phy_config_bb_with_hdr_file(hw, BASEBAND_CONFIG_PHY_REG);
627 	if (!rtstatus) {
628 		pr_err("Write BB Reg Fail!!\n");
629 		return false;
630 	}
631 
632 	_rtl92ee_phy_init_tx_power_by_rate(hw);
633 	if (!rtlefuse->autoload_failflag) {
634 		rtlphy->pwrgroup_cnt = 0;
635 		rtstatus =
636 		  phy_config_bb_with_pghdrfile(hw, BASEBAND_CONFIG_PHY_REG);
637 	}
638 	_rtl92ee_phy_txpower_by_rate_configuration(hw);
639 	if (!rtstatus) {
640 		pr_err("BB_PG Reg Fail!!\n");
641 		return false;
642 	}
643 	rtstatus = phy_config_bb_with_hdr_file(hw, BASEBAND_CONFIG_AGC_TAB);
644 	if (!rtstatus) {
645 		pr_err("AGC Table Fail\n");
646 		return false;
647 	}
648 	rtlphy->cck_high_power = (bool)(rtl_get_bbreg(hw,
649 						      RFPGA0_XA_HSSIPARAMETER2,
650 						      0x200));
651 
652 	return true;
653 }
654 
655 static bool _rtl92ee_phy_config_mac_with_headerfile(struct ieee80211_hw *hw)
656 {
657 	struct rtl_priv *rtlpriv = rtl_priv(hw);
658 	u32 i;
659 	u32 arraylength;
660 	u32 *ptrarray;
661 
662 	RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Read Rtl8192EMACPHY_Array\n");
663 	arraylength = RTL8192EE_MAC_ARRAY_LEN;
664 	ptrarray = RTL8192EE_MAC_ARRAY;
665 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
666 		 "Img:RTL8192EE_MAC_ARRAY LEN %d\n" , arraylength);
667 	for (i = 0; i < arraylength; i = i + 2)
668 		rtl_write_byte(rtlpriv, ptrarray[i], (u8)ptrarray[i + 1]);
669 	return true;
670 }
671 
672 #define READ_NEXT_PAIR(v1, v2, i) \
673 	do { \
674 		i += 2; \
675 		v1 = array[i]; \
676 		v2 = array[i+1]; \
677 	} while (0)
678 
679 static bool phy_config_bb_with_hdr_file(struct ieee80211_hw *hw,
680 					u8 configtype)
681 {
682 	int i;
683 	u32 *array;
684 	u16 len;
685 	struct rtl_priv *rtlpriv = rtl_priv(hw);
686 	u32 v1 = 0, v2 = 0;
687 
688 	if (configtype == BASEBAND_CONFIG_PHY_REG) {
689 		len = RTL8192EE_PHY_REG_ARRAY_LEN;
690 		array = RTL8192EE_PHY_REG_ARRAY;
691 
692 		for (i = 0; i < len; i = i + 2) {
693 			v1 = array[i];
694 			v2 = array[i+1];
695 			if (v1 < 0xcdcdcdcd) {
696 				_rtl92ee_config_bb_reg(hw, v1, v2);
697 			} else {/*This line is the start line of branch.*/
698 				/* to protect READ_NEXT_PAIR not overrun */
699 				if (i >= len - 2)
700 					break;
701 
702 				if (!_check_condition(hw , array[i])) {
703 					/*Discard the following pairs*/
704 					READ_NEXT_PAIR(v1, v2, i);
705 					while (v2 != 0xDEAD &&
706 					       v2 != 0xCDEF &&
707 					       v2 != 0xCDCD && i < len - 2) {
708 						READ_NEXT_PAIR(v1, v2, i);
709 					}
710 					i -= 2; /* prevent from for-loop += 2*/
711 				} else {
712 					/* Configure matched pairs and
713 					 * skip to end of if-else.
714 					 */
715 					READ_NEXT_PAIR(v1, v2, i);
716 					while (v2 != 0xDEAD &&
717 					       v2 != 0xCDEF &&
718 					       v2 != 0xCDCD && i < len - 2) {
719 						_rtl92ee_config_bb_reg(hw, v1,
720 								       v2);
721 						READ_NEXT_PAIR(v1, v2, i);
722 					}
723 
724 					while (v2 != 0xDEAD && i < len - 2)
725 						READ_NEXT_PAIR(v1, v2, i);
726 				}
727 			}
728 		}
729 	} else if (configtype == BASEBAND_CONFIG_AGC_TAB) {
730 		len = RTL8192EE_AGC_TAB_ARRAY_LEN;
731 		array = RTL8192EE_AGC_TAB_ARRAY;
732 
733 		for (i = 0; i < len; i = i + 2) {
734 			v1 = array[i];
735 			v2 = array[i+1];
736 			if (v1 < 0xCDCDCDCD) {
737 				rtl_set_bbreg(hw, array[i], MASKDWORD,
738 					      array[i + 1]);
739 				udelay(1);
740 				continue;
741 		    } else{/*This line is the start line of branch.*/
742 			  /* to protect READ_NEXT_PAIR not overrun */
743 				if (i >= len - 2)
744 					break;
745 
746 				if (!_check_condition(hw , array[i])) {
747 					/*Discard the following pairs*/
748 					READ_NEXT_PAIR(v1, v2, i);
749 					while (v2 != 0xDEAD &&
750 					       v2 != 0xCDEF &&
751 					       v2 != 0xCDCD &&
752 					       i < len - 2) {
753 						READ_NEXT_PAIR(v1, v2, i);
754 					}
755 					i -= 2; /* prevent from for-loop += 2*/
756 				} else {
757 					/* Configure matched pairs and
758 					 * skip to end of if-else.
759 					 */
760 					READ_NEXT_PAIR(v1, v2, i);
761 					while (v2 != 0xDEAD &&
762 					       v2 != 0xCDEF &&
763 					       v2 != 0xCDCD &&
764 					       i < len - 2) {
765 						rtl_set_bbreg(hw,
766 							      array[i],
767 							      MASKDWORD,
768 							      array[i + 1]);
769 						udelay(1);
770 						READ_NEXT_PAIR(v1 , v2 , i);
771 					}
772 
773 					while (v2 != 0xDEAD &&
774 					       i < len - 2) {
775 						READ_NEXT_PAIR(v1 , v2 , i);
776 					}
777 				}
778 			}
779 			RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
780 				 "The agctab_array_table[0] is %x Rtl818EEPHY_REGArray[1] is %x\n",
781 				 array[i],
782 				 array[i + 1]);
783 		}
784 	}
785 	return true;
786 }
787 
788 static u8 _rtl92ee_get_rate_section_index(u32 regaddr)
789 {
790 	u8 index = 0;
791 
792 	switch (regaddr) {
793 	case RTXAGC_A_RATE18_06:
794 	case RTXAGC_B_RATE18_06:
795 		index = 0;
796 		break;
797 	case RTXAGC_A_RATE54_24:
798 	case RTXAGC_B_RATE54_24:
799 		index = 1;
800 		break;
801 	case RTXAGC_A_CCK1_MCS32:
802 	case RTXAGC_B_CCK1_55_MCS32:
803 		index = 2;
804 		break;
805 	case RTXAGC_B_CCK11_A_CCK2_11:
806 		index = 3;
807 		break;
808 	case RTXAGC_A_MCS03_MCS00:
809 	case RTXAGC_B_MCS03_MCS00:
810 		index = 4;
811 		break;
812 	case RTXAGC_A_MCS07_MCS04:
813 	case RTXAGC_B_MCS07_MCS04:
814 		index = 5;
815 		break;
816 	case RTXAGC_A_MCS11_MCS08:
817 	case RTXAGC_B_MCS11_MCS08:
818 		index = 6;
819 		break;
820 	case RTXAGC_A_MCS15_MCS12:
821 	case RTXAGC_B_MCS15_MCS12:
822 		index = 7;
823 		break;
824 	default:
825 		regaddr &= 0xFFF;
826 		if (regaddr >= 0xC20 && regaddr <= 0xC4C)
827 			index = (u8)((regaddr - 0xC20) / 4);
828 		else if (regaddr >= 0xE20 && regaddr <= 0xE4C)
829 			index = (u8)((regaddr - 0xE20) / 4);
830 		break;
831 	}
832 	return index;
833 }
834 
835 static void _rtl92ee_store_tx_power_by_rate(struct ieee80211_hw *hw,
836 					    enum band_type band,
837 					    enum radio_path rfpath,
838 					    u32 txnum, u32 regaddr,
839 					    u32 bitmask, u32 data)
840 {
841 	struct rtl_priv *rtlpriv = rtl_priv(hw);
842 	struct rtl_phy *rtlphy = &rtlpriv->phy;
843 	u8 section = _rtl92ee_get_rate_section_index(regaddr);
844 
845 	if (band != BAND_ON_2_4G && band != BAND_ON_5G) {
846 		RT_TRACE(rtlpriv, FPHY, PHY_TXPWR, "Invalid Band %d\n", band);
847 		return;
848 	}
849 
850 	if (rfpath > MAX_RF_PATH - 1) {
851 		RT_TRACE(rtlpriv, FPHY, PHY_TXPWR,
852 			 "Invalid RfPath %d\n", rfpath);
853 		return;
854 	}
855 	if (txnum > MAX_RF_PATH - 1) {
856 		RT_TRACE(rtlpriv, FPHY, PHY_TXPWR, "Invalid TxNum %d\n", txnum);
857 		return;
858 	}
859 
860 	rtlphy->tx_power_by_rate_offset[band][rfpath][txnum][section] = data;
861 }
862 
863 static bool phy_config_bb_with_pghdrfile(struct ieee80211_hw *hw,
864 					 u8 configtype)
865 {
866 	struct rtl_priv *rtlpriv = rtl_priv(hw);
867 	int i;
868 	u32 *phy_regarray_table_pg;
869 	u16 phy_regarray_pg_len;
870 	u32 v1 = 0, v2 = 0, v3 = 0, v4 = 0, v5 = 0, v6 = 0;
871 
872 	phy_regarray_pg_len = RTL8192EE_PHY_REG_ARRAY_PG_LEN;
873 	phy_regarray_table_pg = RTL8192EE_PHY_REG_ARRAY_PG;
874 
875 	if (configtype == BASEBAND_CONFIG_PHY_REG) {
876 		for (i = 0; i < phy_regarray_pg_len; i = i + 6) {
877 			v1 = phy_regarray_table_pg[i];
878 			v2 = phy_regarray_table_pg[i+1];
879 			v3 = phy_regarray_table_pg[i+2];
880 			v4 = phy_regarray_table_pg[i+3];
881 			v5 = phy_regarray_table_pg[i+4];
882 			v6 = phy_regarray_table_pg[i+5];
883 
884 			if (v1 < 0xcdcdcdcd) {
885 				_rtl92ee_store_tx_power_by_rate(hw, v1, v2, v3,
886 								v4, v5, v6);
887 				continue;
888 			}
889 		}
890 	} else {
891 		RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
892 			 "configtype != BaseBand_Config_PHY_REG\n");
893 	}
894 	return true;
895 }
896 
897 #define READ_NEXT_RF_PAIR(v1, v2, i) \
898 	do { \
899 		i += 2; \
900 		v1 = array[i]; \
901 		v2 = array[i+1]; \
902 	} while (0)
903 
904 bool rtl92ee_phy_config_rf_with_headerfile(struct ieee80211_hw  *hw,
905 					   enum radio_path rfpath)
906 {
907 	struct rtl_priv *rtlpriv = rtl_priv(hw);
908 	int i;
909 	u32 *array;
910 	u16 len;
911 	u32 v1 = 0, v2 = 0;
912 
913 	switch (rfpath) {
914 	case RF90_PATH_A:
915 		len = RTL8192EE_RADIOA_ARRAY_LEN;
916 		array = RTL8192EE_RADIOA_ARRAY;
917 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
918 			 "Radio_A:RTL8192EE_RADIOA_ARRAY %d\n" , len);
919 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath);
920 		for (i = 0; i < len; i = i + 2) {
921 			v1 = array[i];
922 			v2 = array[i+1];
923 			if (v1 < 0xcdcdcdcd) {
924 				_rtl92ee_config_rf_radio_a(hw, v1, v2);
925 				continue;
926 			} else {/*This line is the start line of branch.*/
927 				/* to protect READ_NEXT_PAIR not overrun */
928 				if (i >= len - 2)
929 					break;
930 
931 				if (!_check_condition(hw , array[i])) {
932 					/*Discard the following pairs*/
933 					READ_NEXT_RF_PAIR(v1, v2, i);
934 					while (v2 != 0xDEAD &&
935 					       v2 != 0xCDEF &&
936 					       v2 != 0xCDCD && i < len - 2) {
937 						READ_NEXT_RF_PAIR(v1, v2, i);
938 					}
939 					i -= 2; /* prevent from for-loop += 2*/
940 				} else {
941 					/* Configure matched pairs and
942 					 * skip to end of if-else.
943 					 */
944 					READ_NEXT_RF_PAIR(v1, v2, i);
945 					while (v2 != 0xDEAD &&
946 					       v2 != 0xCDEF &&
947 					       v2 != 0xCDCD && i < len - 2) {
948 						_rtl92ee_config_rf_radio_a(hw,
949 									   v1,
950 									   v2);
951 						READ_NEXT_RF_PAIR(v1, v2, i);
952 					}
953 
954 					while (v2 != 0xDEAD && i < len - 2)
955 						READ_NEXT_RF_PAIR(v1, v2, i);
956 				}
957 			}
958 		}
959 		break;
960 
961 	case RF90_PATH_B:
962 		len = RTL8192EE_RADIOB_ARRAY_LEN;
963 		array = RTL8192EE_RADIOB_ARRAY;
964 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
965 			 "Radio_A:RTL8192EE_RADIOB_ARRAY %d\n" , len);
966 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath);
967 		for (i = 0; i < len; i = i + 2) {
968 			v1 = array[i];
969 			v2 = array[i+1];
970 			if (v1 < 0xcdcdcdcd) {
971 				_rtl92ee_config_rf_radio_b(hw, v1, v2);
972 				continue;
973 			} else {/*This line is the start line of branch.*/
974 				/* to protect READ_NEXT_PAIR not overrun */
975 				if (i >= len - 2)
976 					break;
977 
978 				if (!_check_condition(hw , array[i])) {
979 					/*Discard the following pairs*/
980 					READ_NEXT_RF_PAIR(v1, v2, i);
981 					while (v2 != 0xDEAD &&
982 					       v2 != 0xCDEF &&
983 					       v2 != 0xCDCD && i < len - 2) {
984 						READ_NEXT_RF_PAIR(v1, v2, i);
985 					}
986 					i -= 2; /* prevent from for-loop += 2*/
987 				} else {
988 					/* Configure matched pairs and
989 					 * skip to end of if-else.
990 					 */
991 					READ_NEXT_RF_PAIR(v1, v2, i);
992 					while (v2 != 0xDEAD &&
993 					       v2 != 0xCDEF &&
994 					       v2 != 0xCDCD && i < len - 2) {
995 						_rtl92ee_config_rf_radio_b(hw,
996 									   v1,
997 									   v2);
998 						READ_NEXT_RF_PAIR(v1, v2, i);
999 					}
1000 
1001 					while (v2 != 0xDEAD && i < len - 2)
1002 						READ_NEXT_RF_PAIR(v1, v2, i);
1003 				}
1004 			}
1005 		}
1006 		break;
1007 	case RF90_PATH_C:
1008 	case RF90_PATH_D:
1009 		break;
1010 	}
1011 	return true;
1012 }
1013 
1014 void rtl92ee_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
1015 {
1016 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1017 	struct rtl_phy *rtlphy = &rtlpriv->phy;
1018 
1019 	rtlphy->default_initialgain[0] =
1020 		(u8)rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
1021 	rtlphy->default_initialgain[1] =
1022 		(u8)rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0);
1023 	rtlphy->default_initialgain[2] =
1024 		(u8)rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0);
1025 	rtlphy->default_initialgain[3] =
1026 		(u8)rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0);
1027 
1028 	RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1029 		 "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n",
1030 		  rtlphy->default_initialgain[0],
1031 		  rtlphy->default_initialgain[1],
1032 		  rtlphy->default_initialgain[2],
1033 		  rtlphy->default_initialgain[3]);
1034 
1035 	rtlphy->framesync = (u8)rtl_get_bbreg(hw,
1036 					      ROFDM0_RXDETECTOR3, MASKBYTE0);
1037 	rtlphy->framesync_c34 = rtl_get_bbreg(hw,
1038 					      ROFDM0_RXDETECTOR2, MASKDWORD);
1039 
1040 	RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1041 		 "Default framesync (0x%x) = 0x%x\n",
1042 		  ROFDM0_RXDETECTOR3, rtlphy->framesync);
1043 }
1044 
1045 static void phy_init_bb_rf_register_def(struct ieee80211_hw *hw)
1046 {
1047 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1048 	struct rtl_phy *rtlphy = &rtlpriv->phy;
1049 
1050 	rtlphy->phyreg_def[RF90_PATH_A].rfintfs = RFPGA0_XAB_RFINTERFACESW;
1051 	rtlphy->phyreg_def[RF90_PATH_B].rfintfs = RFPGA0_XAB_RFINTERFACESW;
1052 
1053 	rtlphy->phyreg_def[RF90_PATH_A].rfintfo = RFPGA0_XA_RFINTERFACEOE;
1054 	rtlphy->phyreg_def[RF90_PATH_B].rfintfo = RFPGA0_XB_RFINTERFACEOE;
1055 
1056 	rtlphy->phyreg_def[RF90_PATH_A].rfintfe = RFPGA0_XA_RFINTERFACEOE;
1057 	rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE;
1058 
1059 	rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset =
1060 							RFPGA0_XA_LSSIPARAMETER;
1061 	rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset =
1062 							RFPGA0_XB_LSSIPARAMETER;
1063 
1064 	rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para2 = RFPGA0_XA_HSSIPARAMETER2;
1065 	rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para2 = RFPGA0_XB_HSSIPARAMETER2;
1066 
1067 	rtlphy->phyreg_def[RF90_PATH_A].rf_rb = RFPGA0_XA_LSSIREADBACK;
1068 	rtlphy->phyreg_def[RF90_PATH_B].rf_rb = RFPGA0_XB_LSSIREADBACK;
1069 
1070 	rtlphy->phyreg_def[RF90_PATH_A].rf_rbpi = TRANSCEIVEA_HSPI_READBACK;
1071 	rtlphy->phyreg_def[RF90_PATH_B].rf_rbpi = TRANSCEIVEB_HSPI_READBACK;
1072 }
1073 
1074 void rtl92ee_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel)
1075 {
1076 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1077 	struct rtl_phy *rtlphy = &rtlpriv->phy;
1078 	u8 txpwr_level;
1079 	long txpwr_dbm;
1080 
1081 	txpwr_level = rtlphy->cur_cck_txpwridx;
1082 	txpwr_dbm = _rtl92ee_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_B,
1083 						  txpwr_level);
1084 	txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
1085 	if (_rtl92ee_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G, txpwr_level) >
1086 	    txpwr_dbm)
1087 		txpwr_dbm = _rtl92ee_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G,
1088 							  txpwr_level);
1089 	txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
1090 	if (_rtl92ee_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_N_24G,
1091 					  txpwr_level) > txpwr_dbm)
1092 		txpwr_dbm = _rtl92ee_phy_txpwr_idx_to_dbm(hw,
1093 							  WIRELESS_MODE_N_24G,
1094 							  txpwr_level);
1095 	*powerlevel = txpwr_dbm;
1096 }
1097 
1098 static u8 _rtl92ee_phy_get_ratesection_intxpower_byrate(enum radio_path path,
1099 							u8 rate)
1100 {
1101 	u8 rate_section = 0;
1102 
1103 	switch (rate) {
1104 	case DESC92C_RATE1M:
1105 		rate_section = 2;
1106 		break;
1107 	case DESC92C_RATE2M:
1108 	case DESC92C_RATE5_5M:
1109 		if (path == RF90_PATH_A)
1110 			rate_section = 3;
1111 		else if (path == RF90_PATH_B)
1112 			rate_section = 2;
1113 		break;
1114 	case DESC92C_RATE11M:
1115 		rate_section = 3;
1116 		break;
1117 	case DESC92C_RATE6M:
1118 	case DESC92C_RATE9M:
1119 	case DESC92C_RATE12M:
1120 	case DESC92C_RATE18M:
1121 		rate_section = 0;
1122 		break;
1123 	case DESC92C_RATE24M:
1124 	case DESC92C_RATE36M:
1125 	case DESC92C_RATE48M:
1126 	case DESC92C_RATE54M:
1127 		rate_section = 1;
1128 		break;
1129 	case DESC92C_RATEMCS0:
1130 	case DESC92C_RATEMCS1:
1131 	case DESC92C_RATEMCS2:
1132 	case DESC92C_RATEMCS3:
1133 		rate_section = 4;
1134 		break;
1135 	case DESC92C_RATEMCS4:
1136 	case DESC92C_RATEMCS5:
1137 	case DESC92C_RATEMCS6:
1138 	case DESC92C_RATEMCS7:
1139 		rate_section = 5;
1140 		break;
1141 	case DESC92C_RATEMCS8:
1142 	case DESC92C_RATEMCS9:
1143 	case DESC92C_RATEMCS10:
1144 	case DESC92C_RATEMCS11:
1145 		rate_section = 6;
1146 		break;
1147 	case DESC92C_RATEMCS12:
1148 	case DESC92C_RATEMCS13:
1149 	case DESC92C_RATEMCS14:
1150 	case DESC92C_RATEMCS15:
1151 		rate_section = 7;
1152 		break;
1153 	default:
1154 		WARN_ONCE(true, "rtl8192ee: Rate_Section is Illegal\n");
1155 		break;
1156 	}
1157 	return rate_section;
1158 }
1159 
1160 static u8 _rtl92ee_get_txpower_by_rate(struct ieee80211_hw *hw,
1161 				       enum band_type band,
1162 				       enum radio_path rf, u8 rate)
1163 {
1164 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1165 	struct rtl_phy *rtlphy = &rtlpriv->phy;
1166 	u8 shift = 0, sec, tx_num;
1167 	s8 diff = 0;
1168 
1169 	sec = _rtl92ee_phy_get_ratesection_intxpower_byrate(rf, rate);
1170 	tx_num = RF_TX_NUM_NONIMPLEMENT;
1171 
1172 	if (tx_num == RF_TX_NUM_NONIMPLEMENT) {
1173 		if ((rate >= DESC92C_RATEMCS8 && rate <= DESC92C_RATEMCS15))
1174 			tx_num = RF_2TX;
1175 		else
1176 			tx_num = RF_1TX;
1177 	}
1178 
1179 	switch (rate) {
1180 	case DESC92C_RATE1M:
1181 	case DESC92C_RATE6M:
1182 	case DESC92C_RATE24M:
1183 	case DESC92C_RATEMCS0:
1184 	case DESC92C_RATEMCS4:
1185 	case DESC92C_RATEMCS8:
1186 	case DESC92C_RATEMCS12:
1187 		shift = 0;
1188 		break;
1189 	case DESC92C_RATE2M:
1190 	case DESC92C_RATE9M:
1191 	case DESC92C_RATE36M:
1192 	case DESC92C_RATEMCS1:
1193 	case DESC92C_RATEMCS5:
1194 	case DESC92C_RATEMCS9:
1195 	case DESC92C_RATEMCS13:
1196 		shift = 8;
1197 		break;
1198 	case DESC92C_RATE5_5M:
1199 	case DESC92C_RATE12M:
1200 	case DESC92C_RATE48M:
1201 	case DESC92C_RATEMCS2:
1202 	case DESC92C_RATEMCS6:
1203 	case DESC92C_RATEMCS10:
1204 	case DESC92C_RATEMCS14:
1205 		shift = 16;
1206 		break;
1207 	case DESC92C_RATE11M:
1208 	case DESC92C_RATE18M:
1209 	case DESC92C_RATE54M:
1210 	case DESC92C_RATEMCS3:
1211 	case DESC92C_RATEMCS7:
1212 	case DESC92C_RATEMCS11:
1213 	case DESC92C_RATEMCS15:
1214 		shift = 24;
1215 		break;
1216 	default:
1217 		WARN_ONCE(true, "rtl8192ee: Rate_Section is Illegal\n");
1218 		break;
1219 	}
1220 
1221 	diff = (u8)(rtlphy->tx_power_by_rate_offset[band][rf][tx_num][sec] >>
1222 		    shift) & 0xff;
1223 
1224 	return	diff;
1225 }
1226 
1227 static u8 _rtl92ee_get_txpower_index(struct ieee80211_hw *hw,
1228 				     enum radio_path rfpath, u8 rate,
1229 				     u8 bw, u8 channel)
1230 {
1231 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1232 	struct rtl_efuse *rtlefuse = rtl_efuse(rtlpriv);
1233 	u8 index = (channel - 1);
1234 	u8 tx_power = 0;
1235 	u8 diff = 0;
1236 
1237 	if (channel < 1 || channel > 14) {
1238 		index = 0;
1239 		RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_DMESG,
1240 			 "Illegal channel!!\n");
1241 	}
1242 
1243 	if (IS_CCK_RATE((s8)rate))
1244 		tx_power = rtlefuse->txpwrlevel_cck[rfpath][index];
1245 	else if (DESC92C_RATE6M <= rate)
1246 		tx_power = rtlefuse->txpwrlevel_ht40_1s[rfpath][index];
1247 
1248 	/* OFDM-1T*/
1249 	if (DESC92C_RATE6M <= rate && rate <= DESC92C_RATE54M &&
1250 	    !IS_CCK_RATE((s8)rate))
1251 		tx_power += rtlefuse->txpwr_legacyhtdiff[rfpath][TX_1S];
1252 
1253 	/* BW20-1S, BW20-2S */
1254 	if (bw == HT_CHANNEL_WIDTH_20) {
1255 		if (DESC92C_RATEMCS0 <= rate && rate <= DESC92C_RATEMCS15)
1256 			tx_power += rtlefuse->txpwr_ht20diff[rfpath][TX_1S];
1257 		if (DESC92C_RATEMCS8 <= rate && rate <= DESC92C_RATEMCS15)
1258 			tx_power += rtlefuse->txpwr_ht20diff[rfpath][TX_2S];
1259 	} else if (bw == HT_CHANNEL_WIDTH_20_40) {/* BW40-1S, BW40-2S */
1260 		if (DESC92C_RATEMCS0 <= rate && rate <= DESC92C_RATEMCS15)
1261 			tx_power += rtlefuse->txpwr_ht40diff[rfpath][TX_1S];
1262 		if (DESC92C_RATEMCS8 <= rate && rate <= DESC92C_RATEMCS15)
1263 			tx_power += rtlefuse->txpwr_ht40diff[rfpath][TX_2S];
1264 	}
1265 
1266 	if (rtlefuse->eeprom_regulatory != 2)
1267 		diff = _rtl92ee_get_txpower_by_rate(hw, BAND_ON_2_4G,
1268 						    rfpath, rate);
1269 
1270 	tx_power += diff;
1271 
1272 	if (tx_power > MAX_POWER_INDEX)
1273 		tx_power = MAX_POWER_INDEX;
1274 
1275 	return tx_power;
1276 }
1277 
1278 static void _rtl92ee_set_txpower_index(struct ieee80211_hw *hw, u8 pwr_idx,
1279 				       enum radio_path rfpath, u8 rate)
1280 {
1281 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1282 
1283 	if (rfpath == RF90_PATH_A) {
1284 		switch (rate) {
1285 		case DESC92C_RATE1M:
1286 			rtl_set_bbreg(hw, RTXAGC_A_CCK1_MCS32, MASKBYTE1,
1287 				      pwr_idx);
1288 			break;
1289 		case DESC92C_RATE2M:
1290 			rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE1,
1291 				      pwr_idx);
1292 			break;
1293 		case DESC92C_RATE5_5M:
1294 			rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE2,
1295 				      pwr_idx);
1296 			break;
1297 		case DESC92C_RATE11M:
1298 			rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE3,
1299 				      pwr_idx);
1300 			break;
1301 		case DESC92C_RATE6M:
1302 			rtl_set_bbreg(hw, RTXAGC_A_RATE18_06, MASKBYTE0,
1303 				      pwr_idx);
1304 			break;
1305 		case DESC92C_RATE9M:
1306 			rtl_set_bbreg(hw, RTXAGC_A_RATE18_06, MASKBYTE1,
1307 				      pwr_idx);
1308 			break;
1309 		case DESC92C_RATE12M:
1310 			rtl_set_bbreg(hw, RTXAGC_A_RATE18_06, MASKBYTE2,
1311 				      pwr_idx);
1312 			break;
1313 		case DESC92C_RATE18M:
1314 			rtl_set_bbreg(hw, RTXAGC_A_RATE18_06, MASKBYTE3,
1315 				      pwr_idx);
1316 			break;
1317 		case DESC92C_RATE24M:
1318 			rtl_set_bbreg(hw, RTXAGC_A_RATE54_24, MASKBYTE0,
1319 				      pwr_idx);
1320 			break;
1321 		case DESC92C_RATE36M:
1322 			rtl_set_bbreg(hw, RTXAGC_A_RATE54_24, MASKBYTE1,
1323 				      pwr_idx);
1324 			break;
1325 		case DESC92C_RATE48M:
1326 			rtl_set_bbreg(hw, RTXAGC_A_RATE54_24, MASKBYTE2,
1327 				      pwr_idx);
1328 			break;
1329 		case DESC92C_RATE54M:
1330 			rtl_set_bbreg(hw, RTXAGC_A_RATE54_24, MASKBYTE3,
1331 				      pwr_idx);
1332 			break;
1333 		case DESC92C_RATEMCS0:
1334 			rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00, MASKBYTE0,
1335 				      pwr_idx);
1336 			break;
1337 		case DESC92C_RATEMCS1:
1338 			rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00, MASKBYTE1,
1339 				      pwr_idx);
1340 			break;
1341 		case DESC92C_RATEMCS2:
1342 			rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00, MASKBYTE2,
1343 				      pwr_idx);
1344 			break;
1345 		case DESC92C_RATEMCS3:
1346 			rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00, MASKBYTE3,
1347 				      pwr_idx);
1348 			break;
1349 		case DESC92C_RATEMCS4:
1350 			rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04, MASKBYTE0,
1351 				      pwr_idx);
1352 			break;
1353 		case DESC92C_RATEMCS5:
1354 			rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04, MASKBYTE1,
1355 				      pwr_idx);
1356 			break;
1357 		case DESC92C_RATEMCS6:
1358 			rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04, MASKBYTE2,
1359 				      pwr_idx);
1360 			break;
1361 		case DESC92C_RATEMCS7:
1362 			rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04, MASKBYTE3,
1363 				      pwr_idx);
1364 			break;
1365 		case DESC92C_RATEMCS8:
1366 			rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08, MASKBYTE0,
1367 				      pwr_idx);
1368 			break;
1369 		case DESC92C_RATEMCS9:
1370 			rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08, MASKBYTE1,
1371 				      pwr_idx);
1372 			break;
1373 		case DESC92C_RATEMCS10:
1374 			rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08, MASKBYTE2,
1375 				      pwr_idx);
1376 			break;
1377 		case DESC92C_RATEMCS11:
1378 			rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08, MASKBYTE3,
1379 				      pwr_idx);
1380 			break;
1381 		case DESC92C_RATEMCS12:
1382 			rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12, MASKBYTE0,
1383 				      pwr_idx);
1384 			break;
1385 		case DESC92C_RATEMCS13:
1386 			rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12, MASKBYTE1,
1387 				      pwr_idx);
1388 			break;
1389 		case DESC92C_RATEMCS14:
1390 			rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12, MASKBYTE2,
1391 				      pwr_idx);
1392 			break;
1393 		case DESC92C_RATEMCS15:
1394 			rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12, MASKBYTE3,
1395 				      pwr_idx);
1396 			break;
1397 		default:
1398 			RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1399 				 "Invalid Rate!!\n");
1400 			break;
1401 		}
1402 	} else if (rfpath == RF90_PATH_B) {
1403 		switch (rate) {
1404 		case DESC92C_RATE1M:
1405 			rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, MASKBYTE1,
1406 				      pwr_idx);
1407 			break;
1408 		case DESC92C_RATE2M:
1409 			rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, MASKBYTE2,
1410 				      pwr_idx);
1411 			break;
1412 		case DESC92C_RATE5_5M:
1413 			rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, MASKBYTE3,
1414 				      pwr_idx);
1415 			break;
1416 		case DESC92C_RATE11M:
1417 			rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE0,
1418 				      pwr_idx);
1419 			break;
1420 		case DESC92C_RATE6M:
1421 			rtl_set_bbreg(hw, RTXAGC_B_RATE18_06, MASKBYTE0,
1422 				      pwr_idx);
1423 			break;
1424 		case DESC92C_RATE9M:
1425 			rtl_set_bbreg(hw, RTXAGC_B_RATE18_06, MASKBYTE1,
1426 				      pwr_idx);
1427 			break;
1428 		case DESC92C_RATE12M:
1429 			rtl_set_bbreg(hw, RTXAGC_B_RATE18_06, MASKBYTE2,
1430 				      pwr_idx);
1431 			break;
1432 		case DESC92C_RATE18M:
1433 			rtl_set_bbreg(hw, RTXAGC_B_RATE18_06, MASKBYTE3,
1434 				      pwr_idx);
1435 			break;
1436 		case DESC92C_RATE24M:
1437 			rtl_set_bbreg(hw, RTXAGC_B_RATE54_24, MASKBYTE0,
1438 				      pwr_idx);
1439 			break;
1440 		case DESC92C_RATE36M:
1441 			rtl_set_bbreg(hw, RTXAGC_B_RATE54_24, MASKBYTE1,
1442 				      pwr_idx);
1443 			break;
1444 		case DESC92C_RATE48M:
1445 			rtl_set_bbreg(hw, RTXAGC_B_RATE54_24, MASKBYTE2,
1446 				      pwr_idx);
1447 			break;
1448 		case DESC92C_RATE54M:
1449 			rtl_set_bbreg(hw, RTXAGC_B_RATE54_24, MASKBYTE3,
1450 				      pwr_idx);
1451 			break;
1452 		case DESC92C_RATEMCS0:
1453 			rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00, MASKBYTE0,
1454 				      pwr_idx);
1455 			break;
1456 		case DESC92C_RATEMCS1:
1457 			rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00, MASKBYTE1,
1458 				      pwr_idx);
1459 			break;
1460 		case DESC92C_RATEMCS2:
1461 			rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00, MASKBYTE2,
1462 				      pwr_idx);
1463 			break;
1464 		case DESC92C_RATEMCS3:
1465 			rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00, MASKBYTE3,
1466 				      pwr_idx);
1467 			break;
1468 		case DESC92C_RATEMCS4:
1469 			rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04, MASKBYTE0,
1470 				      pwr_idx);
1471 			break;
1472 		case DESC92C_RATEMCS5:
1473 			rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04, MASKBYTE1,
1474 				      pwr_idx);
1475 			break;
1476 		case DESC92C_RATEMCS6:
1477 			rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04, MASKBYTE2,
1478 				      pwr_idx);
1479 			break;
1480 		case DESC92C_RATEMCS7:
1481 			rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04, MASKBYTE3,
1482 				      pwr_idx);
1483 			break;
1484 		case DESC92C_RATEMCS8:
1485 			rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08, MASKBYTE0,
1486 				      pwr_idx);
1487 			break;
1488 		case DESC92C_RATEMCS9:
1489 			rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08, MASKBYTE1,
1490 				      pwr_idx);
1491 			break;
1492 		case DESC92C_RATEMCS10:
1493 			rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08, MASKBYTE2,
1494 				      pwr_idx);
1495 			break;
1496 		case DESC92C_RATEMCS11:
1497 			rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08, MASKBYTE3,
1498 				      pwr_idx);
1499 			break;
1500 		case DESC92C_RATEMCS12:
1501 			rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12, MASKBYTE0,
1502 				      pwr_idx);
1503 			break;
1504 		case DESC92C_RATEMCS13:
1505 			rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12, MASKBYTE1,
1506 				      pwr_idx);
1507 			break;
1508 		case DESC92C_RATEMCS14:
1509 			rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12, MASKBYTE2,
1510 				      pwr_idx);
1511 			break;
1512 		case DESC92C_RATEMCS15:
1513 			rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12, MASKBYTE3,
1514 				      pwr_idx);
1515 			break;
1516 		default:
1517 			RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1518 				 "Invalid Rate!!\n");
1519 			break;
1520 		}
1521 	} else {
1522 		RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "Invalid RFPath!!\n");
1523 	}
1524 }
1525 
1526 static void phy_set_txpower_index_by_rate_array(struct ieee80211_hw *hw,
1527 						enum radio_path rfpath, u8 bw,
1528 						u8 channel, u8 *rates, u8 size)
1529 {
1530 	u8 i;
1531 	u8 power_index;
1532 
1533 	for (i = 0; i < size; i++) {
1534 		power_index = _rtl92ee_get_txpower_index(hw, rfpath, rates[i],
1535 							 bw, channel);
1536 		_rtl92ee_set_txpower_index(hw, power_index, rfpath, rates[i]);
1537 	}
1538 }
1539 
1540 static void phy_set_txpower_index_by_rate_section(struct ieee80211_hw *hw,
1541 						  enum radio_path rfpath,
1542 						  u8 channel,
1543 						  enum rate_section section)
1544 {
1545 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1546 	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1547 	struct rtl_phy *rtlphy = &rtlpriv->phy;
1548 
1549 	if (section == CCK) {
1550 		u8 cck_rates[] = {DESC92C_RATE1M, DESC92C_RATE2M,
1551 				  DESC92C_RATE5_5M, DESC92C_RATE11M};
1552 		if (rtlhal->current_bandtype == BAND_ON_2_4G)
1553 			phy_set_txpower_index_by_rate_array(hw, rfpath,
1554 							rtlphy->current_chan_bw,
1555 							channel, cck_rates, 4);
1556 	} else if (section == OFDM) {
1557 		u8 ofdm_rates[] = {DESC92C_RATE6M, DESC92C_RATE9M,
1558 				   DESC92C_RATE12M, DESC92C_RATE18M,
1559 				   DESC92C_RATE24M, DESC92C_RATE36M,
1560 				   DESC92C_RATE48M, DESC92C_RATE54M};
1561 		phy_set_txpower_index_by_rate_array(hw, rfpath,
1562 						    rtlphy->current_chan_bw,
1563 						    channel, ofdm_rates, 8);
1564 	} else if (section == HT_MCS0_MCS7) {
1565 		u8 ht_rates1t[]  = {DESC92C_RATEMCS0, DESC92C_RATEMCS1,
1566 				    DESC92C_RATEMCS2, DESC92C_RATEMCS3,
1567 				    DESC92C_RATEMCS4, DESC92C_RATEMCS5,
1568 				    DESC92C_RATEMCS6, DESC92C_RATEMCS7};
1569 		phy_set_txpower_index_by_rate_array(hw, rfpath,
1570 						    rtlphy->current_chan_bw,
1571 						    channel, ht_rates1t, 8);
1572 	} else if (section == HT_MCS8_MCS15) {
1573 		u8 ht_rates2t[]  = {DESC92C_RATEMCS8, DESC92C_RATEMCS9,
1574 				    DESC92C_RATEMCS10, DESC92C_RATEMCS11,
1575 				    DESC92C_RATEMCS12, DESC92C_RATEMCS13,
1576 				    DESC92C_RATEMCS14, DESC92C_RATEMCS15};
1577 		phy_set_txpower_index_by_rate_array(hw, rfpath,
1578 						    rtlphy->current_chan_bw,
1579 						    channel, ht_rates2t, 8);
1580 	} else
1581 		RT_TRACE(rtlpriv, FPHY, PHY_TXPWR,
1582 			 "Invalid RateSection %d\n", section);
1583 }
1584 
1585 void rtl92ee_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
1586 {
1587 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1588 	struct rtl_phy *rtlphy = &rtl_priv(hw)->phy;
1589 	enum radio_path rfpath;
1590 
1591 	if (!rtlefuse->txpwr_fromeprom)
1592 		return;
1593 	for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
1594 	     rfpath++) {
1595 		phy_set_txpower_index_by_rate_section(hw, rfpath,
1596 						      channel, CCK);
1597 		phy_set_txpower_index_by_rate_section(hw, rfpath,
1598 						      channel, OFDM);
1599 		phy_set_txpower_index_by_rate_section(hw, rfpath,
1600 						      channel,
1601 						      HT_MCS0_MCS7);
1602 
1603 		if (rtlphy->num_total_rfpath >= 2)
1604 			phy_set_txpower_index_by_rate_section(hw,
1605 							      rfpath, channel,
1606 							      HT_MCS8_MCS15);
1607 	}
1608 }
1609 
1610 static long _rtl92ee_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
1611 					  enum wireless_mode wirelessmode,
1612 					  u8 txpwridx)
1613 {
1614 	long offset;
1615 	long pwrout_dbm;
1616 
1617 	switch (wirelessmode) {
1618 	case WIRELESS_MODE_B:
1619 		offset = -7;
1620 		break;
1621 	case WIRELESS_MODE_G:
1622 	case WIRELESS_MODE_N_24G:
1623 		offset = -8;
1624 		break;
1625 	default:
1626 		offset = -8;
1627 		break;
1628 	}
1629 	pwrout_dbm = txpwridx / 2 + offset;
1630 	return pwrout_dbm;
1631 }
1632 
1633 void rtl92ee_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
1634 {
1635 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1636 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1637 	enum io_type iotype;
1638 
1639 	if (!is_hal_stop(rtlhal)) {
1640 		switch (operation) {
1641 		case SCAN_OPT_BACKUP_BAND0:
1642 			iotype = IO_CMD_PAUSE_BAND0_DM_BY_SCAN;
1643 			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_IO_CMD,
1644 						      (u8 *)&iotype);
1645 
1646 			break;
1647 		case SCAN_OPT_RESTORE:
1648 			iotype = IO_CMD_RESUME_DM_BY_SCAN;
1649 			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_IO_CMD,
1650 						      (u8 *)&iotype);
1651 			break;
1652 		default:
1653 			pr_err("Unknown Scan Backup operation.\n");
1654 			break;
1655 		}
1656 	}
1657 }
1658 
1659 void rtl92ee_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
1660 {
1661 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1662 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1663 	struct rtl_phy *rtlphy = &rtlpriv->phy;
1664 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1665 	u8 reg_bw_opmode;
1666 	u8 reg_prsr_rsc;
1667 
1668 	RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
1669 		 "Switch to %s bandwidth\n",
1670 		  rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
1671 		  "20MHz" : "40MHz");
1672 
1673 	if (is_hal_stop(rtlhal)) {
1674 		rtlphy->set_bwmode_inprogress = false;
1675 		return;
1676 	}
1677 
1678 	reg_bw_opmode = rtl_read_byte(rtlpriv, REG_BWOPMODE);
1679 	reg_prsr_rsc = rtl_read_byte(rtlpriv, REG_RRSR + 2);
1680 
1681 	switch (rtlphy->current_chan_bw) {
1682 	case HT_CHANNEL_WIDTH_20:
1683 		reg_bw_opmode |= BW_OPMODE_20MHZ;
1684 		rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
1685 		break;
1686 	case HT_CHANNEL_WIDTH_20_40:
1687 		reg_bw_opmode &= ~BW_OPMODE_20MHZ;
1688 		rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
1689 		reg_prsr_rsc = (reg_prsr_rsc & 0x90) |
1690 			       (mac->cur_40_prime_sc << 5);
1691 		rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_prsr_rsc);
1692 		break;
1693 	default:
1694 		pr_err("unknown bandwidth: %#X\n",
1695 		       rtlphy->current_chan_bw);
1696 		break;
1697 	}
1698 
1699 	switch (rtlphy->current_chan_bw) {
1700 	case HT_CHANNEL_WIDTH_20:
1701 		rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x0);
1702 		rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x0);
1703 		rtl_set_bbreg(hw, ROFDM0_TXPSEUDONOISEWGT,
1704 			      (BIT(31) | BIT(30)), 0);
1705 		break;
1706 	case HT_CHANNEL_WIDTH_20_40:
1707 		rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x1);
1708 		rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x1);
1709 		rtl_set_bbreg(hw, RCCK0_SYSTEM, BCCK_SIDEBAND,
1710 			      (mac->cur_40_prime_sc >> 1));
1711 		rtl_set_bbreg(hw, ROFDM1_LSTF, 0xC00,
1712 			      mac->cur_40_prime_sc);
1713 
1714 		rtl_set_bbreg(hw, 0x818, (BIT(26) | BIT(27)),
1715 			      (mac->cur_40_prime_sc ==
1716 			       HAL_PRIME_CHNL_OFFSET_LOWER) ? 2 : 1);
1717 		break;
1718 	default:
1719 		pr_err("unknown bandwidth: %#X\n",
1720 		       rtlphy->current_chan_bw);
1721 		break;
1722 	}
1723 	rtl92ee_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
1724 	rtlphy->set_bwmode_inprogress = false;
1725 	RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD, "\n");
1726 }
1727 
1728 void rtl92ee_phy_set_bw_mode(struct ieee80211_hw *hw,
1729 			     enum nl80211_channel_type ch_type)
1730 {
1731 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1732 	struct rtl_phy *rtlphy = &rtlpriv->phy;
1733 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1734 	u8 tmp_bw = rtlphy->current_chan_bw;
1735 
1736 	if (rtlphy->set_bwmode_inprogress)
1737 		return;
1738 	rtlphy->set_bwmode_inprogress = true;
1739 	if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
1740 		rtl92ee_phy_set_bw_mode_callback(hw);
1741 	} else {
1742 		RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1743 			 "false driver sleep or unload\n");
1744 		rtlphy->set_bwmode_inprogress = false;
1745 		rtlphy->current_chan_bw = tmp_bw;
1746 	}
1747 }
1748 
1749 void rtl92ee_phy_sw_chnl_callback(struct ieee80211_hw *hw)
1750 {
1751 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1752 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1753 	struct rtl_phy *rtlphy = &rtlpriv->phy;
1754 	u32 delay;
1755 
1756 	RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
1757 		 "switch to channel%d\n", rtlphy->current_channel);
1758 	if (is_hal_stop(rtlhal))
1759 		return;
1760 	do {
1761 		if (!rtlphy->sw_chnl_inprogress)
1762 			break;
1763 		if (!_rtl92ee_phy_sw_chnl_step_by_step
1764 		    (hw, rtlphy->current_channel, &rtlphy->sw_chnl_stage,
1765 		     &rtlphy->sw_chnl_step, &delay)) {
1766 			if (delay > 0)
1767 				mdelay(delay);
1768 			else
1769 				continue;
1770 		} else {
1771 			rtlphy->sw_chnl_inprogress = false;
1772 		}
1773 		break;
1774 	} while (true);
1775 	RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "\n");
1776 }
1777 
1778 u8 rtl92ee_phy_sw_chnl(struct ieee80211_hw *hw)
1779 {
1780 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1781 	struct rtl_phy *rtlphy = &rtlpriv->phy;
1782 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1783 
1784 	if (rtlphy->sw_chnl_inprogress)
1785 		return 0;
1786 	if (rtlphy->set_bwmode_inprogress)
1787 		return 0;
1788 	WARN_ONCE((rtlphy->current_channel > 14),
1789 		  "rtl8192ee: WIRELESS_MODE_G but channel>14");
1790 	rtlphy->sw_chnl_inprogress = true;
1791 	rtlphy->sw_chnl_stage = 0;
1792 	rtlphy->sw_chnl_step = 0;
1793 	if (!(is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
1794 		rtl92ee_phy_sw_chnl_callback(hw);
1795 		RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
1796 			 "sw_chnl_inprogress false schedule workitem current channel %d\n",
1797 			 rtlphy->current_channel);
1798 		rtlphy->sw_chnl_inprogress = false;
1799 	} else {
1800 		RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
1801 			 "sw_chnl_inprogress false driver sleep or unload\n");
1802 		rtlphy->sw_chnl_inprogress = false;
1803 	}
1804 	return 1;
1805 }
1806 
1807 static bool _rtl92ee_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
1808 					      u8 channel, u8 *stage, u8 *step,
1809 					      u32 *delay)
1810 {
1811 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1812 	struct rtl_phy *rtlphy = &rtlpriv->phy;
1813 	struct swchnlcmd precommoncmd[MAX_PRECMD_CNT];
1814 	u32 precommoncmdcnt;
1815 	struct swchnlcmd postcommoncmd[MAX_POSTCMD_CNT];
1816 	u32 postcommoncmdcnt;
1817 	struct swchnlcmd rfdependcmd[MAX_RFDEPENDCMD_CNT];
1818 	u32 rfdependcmdcnt;
1819 	struct swchnlcmd *currentcmd = NULL;
1820 	u8 rfpath;
1821 	u8 num_total_rfpath = rtlphy->num_total_rfpath;
1822 
1823 	precommoncmdcnt = 0;
1824 	_rtl92ee_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
1825 					  MAX_PRECMD_CNT,
1826 					  CMDID_SET_TXPOWEROWER_LEVEL, 0, 0, 0);
1827 	_rtl92ee_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
1828 					  MAX_PRECMD_CNT, CMDID_END, 0, 0, 0);
1829 
1830 	postcommoncmdcnt = 0;
1831 
1832 	_rtl92ee_phy_set_sw_chnl_cmdarray(postcommoncmd, postcommoncmdcnt++,
1833 					  MAX_POSTCMD_CNT, CMDID_END, 0, 0, 0);
1834 
1835 	rfdependcmdcnt = 0;
1836 
1837 	WARN_ONCE((channel < 1 || channel > 14),
1838 		  "rtl8192ee: illegal channel for Zebra: %d\n", channel);
1839 
1840 	_rtl92ee_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
1841 					  MAX_RFDEPENDCMD_CNT,
1842 					  CMDID_RF_WRITEREG,
1843 					  RF_CHNLBW, channel, 10);
1844 
1845 	_rtl92ee_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
1846 					  MAX_RFDEPENDCMD_CNT, CMDID_END,
1847 					  0, 0, 0);
1848 
1849 	do {
1850 		switch (*stage) {
1851 		case 0:
1852 			currentcmd = &precommoncmd[*step];
1853 			break;
1854 		case 1:
1855 			currentcmd = &rfdependcmd[*step];
1856 			break;
1857 		case 2:
1858 			currentcmd = &postcommoncmd[*step];
1859 			break;
1860 		default:
1861 			pr_err("Invalid 'stage' = %d, Check it!\n",
1862 			       *stage);
1863 			return true;
1864 		}
1865 
1866 		if (currentcmd->cmdid == CMDID_END) {
1867 			if ((*stage) == 2)
1868 				return true;
1869 			(*stage)++;
1870 			(*step) = 0;
1871 			continue;
1872 		}
1873 
1874 		switch (currentcmd->cmdid) {
1875 		case CMDID_SET_TXPOWEROWER_LEVEL:
1876 			rtl92ee_phy_set_txpower_level(hw, channel);
1877 			break;
1878 		case CMDID_WRITEPORT_ULONG:
1879 			rtl_write_dword(rtlpriv, currentcmd->para1,
1880 					currentcmd->para2);
1881 			break;
1882 		case CMDID_WRITEPORT_USHORT:
1883 			rtl_write_word(rtlpriv, currentcmd->para1,
1884 				       (u16)currentcmd->para2);
1885 			break;
1886 		case CMDID_WRITEPORT_UCHAR:
1887 			rtl_write_byte(rtlpriv, currentcmd->para1,
1888 				       (u8)currentcmd->para2);
1889 			break;
1890 		case CMDID_RF_WRITEREG:
1891 			for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) {
1892 				rtlphy->rfreg_chnlval[rfpath] =
1893 					((rtlphy->rfreg_chnlval[rfpath] &
1894 					  0xfffff00) | currentcmd->para2);
1895 
1896 				rtl_set_rfreg(hw, (enum radio_path)rfpath,
1897 					      currentcmd->para1,
1898 					      0x3ff,
1899 					      rtlphy->rfreg_chnlval[rfpath]);
1900 			}
1901 			break;
1902 		default:
1903 			RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
1904 				 "switch case %#x not processed\n",
1905 				 currentcmd->cmdid);
1906 			break;
1907 		}
1908 
1909 		break;
1910 	} while (true);
1911 
1912 	(*delay) = currentcmd->msdelay;
1913 	(*step)++;
1914 	return false;
1915 }
1916 
1917 static bool _rtl92ee_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
1918 					      u32 cmdtableidx, u32 cmdtablesz,
1919 					      enum swchnlcmd_id cmdid,
1920 					      u32 para1, u32 para2, u32 msdelay)
1921 {
1922 	struct swchnlcmd *pcmd;
1923 
1924 	if (cmdtable == NULL) {
1925 		WARN_ONCE(true, "rtl8192ee: cmdtable cannot be NULL.\n");
1926 		return false;
1927 	}
1928 
1929 	if (cmdtableidx >= cmdtablesz)
1930 		return false;
1931 
1932 	pcmd = cmdtable + cmdtableidx;
1933 	pcmd->cmdid = cmdid;
1934 	pcmd->para1 = para1;
1935 	pcmd->para2 = para2;
1936 	pcmd->msdelay = msdelay;
1937 	return true;
1938 }
1939 
1940 static u8 _rtl92ee_phy_path_a_iqk(struct ieee80211_hw *hw, bool config_pathb)
1941 {
1942 	u32 reg_eac, reg_e94, reg_e9c;
1943 	u8 result = 0x00;
1944 	/* path-A IQK setting */
1945 	/* PA/PAD controlled by 0x0 */
1946 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1947 	rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x180);
1948 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
1949 
1950 	rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
1951 	rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
1952 	rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1953 	rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1954 
1955 	rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82140303);
1956 	rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x68160000);
1957 
1958 	/*LO calibration setting*/
1959 	rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x00462911);
1960 
1961 	/*One shot, path A LOK & IQK*/
1962 	rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000);
1963 	rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
1964 
1965 	mdelay(IQK_DELAY_TIME);
1966 
1967 	reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1968 	reg_e94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD);
1969 	reg_e9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD);
1970 
1971 	if (!(reg_eac & BIT(28)) &&
1972 	    (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
1973 	    (((reg_e9c & 0x03FF0000) >> 16) != 0x42))
1974 		result |= 0x01;
1975 	else
1976 		return result;
1977 
1978 	return result;
1979 }
1980 
1981 static u8 _rtl92ee_phy_path_b_iqk(struct ieee80211_hw *hw)
1982 {
1983 	u32 reg_eac, reg_eb4, reg_ebc;
1984 	u8 result = 0x00;
1985 
1986 	/* PA/PAD controlled by 0x0 */
1987 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1988 	rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x180);
1989 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
1990 
1991 	rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x00000000);
1992 	rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
1993 
1994 	rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
1995 	rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
1996 	rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x18008c1c);
1997 	rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1998 
1999 	rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x821403e2);
2000 	rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x68160000);
2001 
2002 	/* LO calibration setting */
2003 	rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x00462911);
2004 
2005 	/*One shot, path B LOK & IQK*/
2006 	rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000);
2007 	rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
2008 
2009 	mdelay(IQK_DELAY_TIME);
2010 
2011 	reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
2012 	reg_eb4 = rtl_get_bbreg(hw, 0xeb4, MASKDWORD);
2013 	reg_ebc = rtl_get_bbreg(hw, 0xebc, MASKDWORD);
2014 
2015 	if (!(reg_eac & BIT(31)) &&
2016 	    (((reg_eb4 & 0x03FF0000) >> 16) != 0x142) &&
2017 	    (((reg_ebc & 0x03FF0000) >> 16) != 0x42))
2018 		result |= 0x01;
2019 	else
2020 		return result;
2021 
2022 	return result;
2023 }
2024 
2025 static u8 _rtl92ee_phy_path_a_rx_iqk(struct ieee80211_hw *hw, bool config_pathb)
2026 {
2027 	u32 reg_eac, reg_e94, reg_e9c, reg_ea4 , u32temp;
2028 	u8 result = 0x00;
2029 
2030 	/*Get TXIMR Setting*/
2031 	/*Modify RX IQK mode table*/
2032 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2033 
2034 	rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
2035 	rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
2036 	rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
2037 	rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf117b);
2038 
2039 	/*PA/PAD control by 0x56, and set = 0x0*/
2040 	rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x980);
2041 	rtl_set_rfreg(hw, RF90_PATH_A, 0x56, RFREG_OFFSET_MASK, 0x51000);
2042 
2043 	/*enter IQK mode*/
2044 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2045 
2046 	/*IQK Setting*/
2047 	rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
2048 	rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
2049 
2050 	/*path a IQK setting*/
2051 	rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
2052 	rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2053 	rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2054 	rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2055 
2056 	rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82160c1f);
2057 	rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x68160c1f);
2058 
2059 	/*LO calibration Setting*/
2060 	rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a911);
2061 
2062 	/*one shot,path A LOK & iqk*/
2063 	rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000);
2064 	rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
2065 
2066 	mdelay(IQK_DELAY_TIME);
2067 
2068 	/* Check failed */
2069 	reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
2070 	reg_e94 = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_A, MASKDWORD);
2071 	reg_e9c = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A, MASKDWORD);
2072 
2073 	if (!(reg_eac & BIT(28)) &&
2074 	    (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
2075 	    (((reg_e9c & 0x03FF0000) >> 16) != 0x42)) {
2076 		result |= 0x01;
2077 	} else {
2078 		/*	PA/PAD controlled by 0x0 */
2079 		rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2080 		rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x180);
2081 		return result;
2082 	}
2083 
2084 	u32temp = 0x80007C00 | (reg_e94 & 0x3FF0000)  |
2085 		  ((reg_e9c & 0x3FF0000) >> 16);
2086 	rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, u32temp);
2087 	/*RX IQK*/
2088 	/*Modify RX IQK mode table*/
2089 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2090 
2091 	rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
2092 
2093 	rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
2094 	rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
2095 	rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf7ffa);
2096 
2097 	/*PA/PAD control by 0x56, and set = 0x0*/
2098 	rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x980);
2099 	rtl_set_rfreg(hw, RF90_PATH_A, 0x56, RFREG_OFFSET_MASK, 0x51000);
2100 
2101 	/*enter IQK mode*/
2102 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2103 
2104 	/*IQK Setting*/
2105 	rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
2106 
2107 	/*path a IQK setting*/
2108 	rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2109 	rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
2110 	rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2111 	rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2112 
2113 	rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82160c1f);
2114 	rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x28160c1f);
2115 
2116 	/*LO calibration Setting*/
2117 	rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a891);
2118 	/*one shot,path A LOK & iqk*/
2119 	rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000);
2120 	rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
2121 
2122 	mdelay(IQK_DELAY_TIME);
2123 	/*Check failed*/
2124 	reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
2125 	reg_ea4 = rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_A_2, MASKDWORD);
2126 
2127 	/*PA/PAD controlled by 0x0*/
2128 	/*leave IQK mode*/
2129 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2130 	rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x180);
2131 	/*if Tx is OK, check whether Rx is OK*/
2132 	if (!(reg_eac & BIT(27)) &&
2133 	    (((reg_ea4 & 0x03FF0000) >> 16) != 0x132) &&
2134 	    (((reg_eac & 0x03FF0000) >> 16) != 0x36))
2135 		result |= 0x02;
2136 
2137 	return result;
2138 }
2139 
2140 static u8 _rtl92ee_phy_path_b_rx_iqk(struct ieee80211_hw *hw, bool config_pathb)
2141 {
2142 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2143 	u32 reg_eac, reg_eb4, reg_ebc, reg_ecc, reg_ec4, u32temp;
2144 	u8 result = 0x00;
2145 
2146 	/*Get TXIMR Setting*/
2147 	/*Modify RX IQK mode table*/
2148 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2149 
2150 	rtl_set_rfreg(hw, RF90_PATH_B, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
2151 	rtl_set_rfreg(hw, RF90_PATH_B, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
2152 	rtl_set_rfreg(hw, RF90_PATH_B, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
2153 	rtl_set_rfreg(hw, RF90_PATH_B, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf117b);
2154 
2155 	/*PA/PAD all off*/
2156 	rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x980);
2157 	rtl_set_rfreg(hw, RF90_PATH_B, 0x56, RFREG_OFFSET_MASK, 0x51000);
2158 
2159 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2160 
2161 	/*IQK Setting*/
2162 	rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
2163 	rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
2164 
2165 	/*path a IQK setting*/
2166 	rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2167 	rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2168 	rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x18008c1c);
2169 	rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2170 
2171 	rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x82160c1f);
2172 	rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x68160c1f);
2173 
2174 	/*LO calibration Setting*/
2175 	rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a911);
2176 
2177 	/*one shot,path A LOK & iqk*/
2178 	rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000);
2179 	rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
2180 
2181 	mdelay(IQK_DELAY_TIME);
2182 
2183 	/* Check failed */
2184 	reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
2185 	reg_eb4 = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_B, MASKDWORD);
2186 	reg_ebc = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_B, MASKDWORD);
2187 
2188 	if (!(reg_eac & BIT(31)) &&
2189 	    (((reg_eb4 & 0x03FF0000) >> 16) != 0x142) &&
2190 	    (((reg_ebc & 0x03FF0000) >> 16) != 0x42)) {
2191 		result |= 0x01;
2192 	} else {
2193 		/*	PA/PAD controlled by 0x0 */
2194 		rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2195 		rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x180);
2196 		return result;
2197 	}
2198 
2199 	u32temp = 0x80007C00 | (reg_eb4 & 0x3FF0000) |
2200 		  ((reg_ebc & 0x3FF0000) >> 16);
2201 	rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, u32temp);
2202 	/*RX IQK*/
2203 	/*Modify RX IQK mode table*/
2204 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2205 	rtl_set_rfreg(hw, RF90_PATH_B, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
2206 
2207 	rtl_set_rfreg(hw, RF90_PATH_B, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
2208 	rtl_set_rfreg(hw, RF90_PATH_B, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
2209 	rtl_set_rfreg(hw, RF90_PATH_B, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf7ffa);
2210 
2211 	/*PA/PAD all off*/
2212 	rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x980);
2213 	rtl_set_rfreg(hw, RF90_PATH_B, 0x56, RFREG_OFFSET_MASK, 0x51000);
2214 
2215 	/*enter IQK mode*/
2216 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2217 
2218 	/*IQK Setting*/
2219 	rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
2220 
2221 	/*path b IQK setting*/
2222 	rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2223 	rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2224 	rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2225 	rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x18008c1c);
2226 
2227 	rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x82160c1f);
2228 	rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x28160c1f);
2229 
2230 	/*LO calibration Setting*/
2231 	rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a891);
2232 	/*one shot,path A LOK & iqk*/
2233 	rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000);
2234 	rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
2235 
2236 	mdelay(IQK_DELAY_TIME);
2237 	/*Check failed*/
2238 	reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
2239 	reg_ec4 = rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_B_2, MASKDWORD);
2240 	reg_ecc = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_B_2, MASKDWORD);
2241 	/*PA/PAD controlled by 0x0*/
2242 	/*leave IQK mode*/
2243 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2244 	rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x180);
2245 	/*if Tx is OK, check whether Rx is OK*/
2246 	if (!(reg_eac & BIT(30)) &&
2247 	    (((reg_ec4 & 0x03FF0000) >> 16) != 0x132) &&
2248 	    (((reg_ecc & 0x03FF0000) >> 16) != 0x36))
2249 		result |= 0x02;
2250 	else
2251 		RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "Path B Rx IQK fail!!\n");
2252 
2253 	return result;
2254 }
2255 
2256 static void _rtl92ee_phy_path_a_fill_iqk_matrix(struct ieee80211_hw *hw,
2257 						bool b_iqk_ok, long result[][8],
2258 						u8 final_candidate,
2259 						bool btxonly)
2260 {
2261 	u32 oldval_0, x, tx0_a, reg;
2262 	long y, tx0_c;
2263 
2264 	if (final_candidate == 0xFF) {
2265 		return;
2266 	} else if (b_iqk_ok) {
2267 		oldval_0 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
2268 					  MASKDWORD) >> 22) & 0x3FF;
2269 		x = result[final_candidate][0];
2270 		if ((x & 0x00000200) != 0)
2271 			x = x | 0xFFFFFC00;
2272 		tx0_a = (x * oldval_0) >> 8;
2273 		rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x3FF, tx0_a);
2274 		rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(31),
2275 			      ((x * oldval_0 >> 7) & 0x1));
2276 		y = result[final_candidate][1];
2277 		if ((y & 0x00000200) != 0)
2278 			y = y | 0xFFFFFC00;
2279 		tx0_c = (y * oldval_0) >> 8;
2280 		rtl_set_bbreg(hw, ROFDM0_XCTXAFE, 0xF0000000,
2281 			      ((tx0_c & 0x3C0) >> 6));
2282 		rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x003F0000,
2283 			      (tx0_c & 0x3F));
2284 		rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(29),
2285 			      ((y * oldval_0 >> 7) & 0x1));
2286 
2287 		if (btxonly)
2288 			return;
2289 
2290 		reg = result[final_candidate][2];
2291 		rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0x3FF, reg);
2292 
2293 		reg = result[final_candidate][3] & 0x3F;
2294 		rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0xFC00, reg);
2295 
2296 		reg = (result[final_candidate][3] >> 6) & 0xF;
2297 		rtl_set_bbreg(hw, ROFDM0_RXIQEXTANTA, 0xF0000000, reg);
2298 	}
2299 }
2300 
2301 static void _rtl92ee_phy_path_b_fill_iqk_matrix(struct ieee80211_hw *hw,
2302 						bool b_iqk_ok, long result[][8],
2303 						u8 final_candidate,
2304 						bool btxonly)
2305 {
2306 	u32 oldval_1, x, tx1_a, reg;
2307 	long y, tx1_c;
2308 
2309 	if (final_candidate == 0xFF) {
2310 		return;
2311 	} else if (b_iqk_ok) {
2312 		oldval_1 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
2313 					  MASKDWORD) >> 22) & 0x3FF;
2314 		x = result[final_candidate][4];
2315 		if ((x & 0x00000200) != 0)
2316 			x = x | 0xFFFFFC00;
2317 		tx1_a = (x * oldval_1) >> 8;
2318 		rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x3FF, tx1_a);
2319 		rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(27),
2320 			      ((x * oldval_1 >> 7) & 0x1));
2321 		y = result[final_candidate][5];
2322 		if ((y & 0x00000200) != 0)
2323 			y = y | 0xFFFFFC00;
2324 		tx1_c = (y * oldval_1) >> 8;
2325 		rtl_set_bbreg(hw, ROFDM0_XDTXAFE, 0xF0000000,
2326 			      ((tx1_c & 0x3C0) >> 6));
2327 		rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 0x003F0000,
2328 			      (tx1_c & 0x3F));
2329 		rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(25),
2330 			      ((y * oldval_1 >> 7) & 0x1));
2331 
2332 		if (btxonly)
2333 			return;
2334 
2335 		reg = result[final_candidate][6];
2336 		rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0x3FF, reg);
2337 
2338 		reg = result[final_candidate][7] & 0x3F;
2339 		rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0xFC00, reg);
2340 
2341 		reg = (result[final_candidate][7] >> 6) & 0xF;
2342 		rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0xF0000000, reg);
2343 	}
2344 }
2345 
2346 static void _rtl92ee_phy_save_adda_registers(struct ieee80211_hw *hw,
2347 					     u32 *addareg, u32 *addabackup,
2348 					     u32 registernum)
2349 {
2350 	u32 i;
2351 
2352 	for (i = 0; i < registernum; i++)
2353 		addabackup[i] = rtl_get_bbreg(hw, addareg[i], MASKDWORD);
2354 }
2355 
2356 static void _rtl92ee_phy_save_mac_registers(struct ieee80211_hw *hw,
2357 					    u32 *macreg, u32 *macbackup)
2358 {
2359 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2360 	u32 i;
2361 
2362 	for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
2363 		macbackup[i] = rtl_read_byte(rtlpriv, macreg[i]);
2364 
2365 	macbackup[i] = rtl_read_dword(rtlpriv, macreg[i]);
2366 }
2367 
2368 static void _rtl92ee_phy_reload_adda_registers(struct ieee80211_hw *hw,
2369 					       u32 *addareg, u32 *addabackup,
2370 					       u32 regiesternum)
2371 {
2372 	u32 i;
2373 
2374 	for (i = 0; i < regiesternum; i++)
2375 		rtl_set_bbreg(hw, addareg[i], MASKDWORD, addabackup[i]);
2376 }
2377 
2378 static void _rtl92ee_phy_reload_mac_registers(struct ieee80211_hw *hw,
2379 					      u32 *macreg, u32 *macbackup)
2380 {
2381 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2382 	u32 i;
2383 
2384 	for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
2385 		rtl_write_byte(rtlpriv, macreg[i], (u8)macbackup[i]);
2386 	rtl_write_dword(rtlpriv, macreg[i], macbackup[i]);
2387 }
2388 
2389 static void _rtl92ee_phy_path_adda_on(struct ieee80211_hw *hw, u32 *addareg,
2390 				      bool is_patha_on, bool is2t)
2391 {
2392 	u32 i;
2393 
2394 	for (i = 0; i < IQK_ADDA_REG_NUM; i++)
2395 		rtl_set_bbreg(hw, addareg[i], MASKDWORD, 0x0fc01616);
2396 }
2397 
2398 static void _rtl92ee_phy_mac_setting_calibration(struct ieee80211_hw *hw,
2399 						 u32 *macreg, u32 *macbackup)
2400 {
2401 	rtl_set_bbreg(hw, 0x520, 0x00ff0000, 0xff);
2402 }
2403 
2404 static void _rtl92ee_phy_path_a_standby(struct ieee80211_hw *hw)
2405 {
2406 	rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x0);
2407 	rtl_set_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK, 0x10000);
2408 	rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
2409 }
2410 
2411 static bool _rtl92ee_phy_simularity_compare(struct ieee80211_hw *hw,
2412 					    long result[][8], u8 c1, u8 c2)
2413 {
2414 	u32 i, j, diff, simularity_bitmap, bound;
2415 
2416 	u8 final_candidate[2] = { 0xFF, 0xFF };
2417 	bool bresult = true/*, is2t = true*/;
2418 	s32 tmp1, tmp2;
2419 
2420 	bound = 8;
2421 
2422 	simularity_bitmap = 0;
2423 
2424 	for (i = 0; i < bound; i++) {
2425 		if ((i == 1) || (i == 3) || (i == 5) || (i == 7)) {
2426 			if ((result[c1][i] & 0x00000200) != 0)
2427 				tmp1 = result[c1][i] | 0xFFFFFC00;
2428 			else
2429 				tmp1 = result[c1][i];
2430 
2431 			if ((result[c2][i] & 0x00000200) != 0)
2432 				tmp2 = result[c2][i] | 0xFFFFFC00;
2433 			else
2434 				tmp2 = result[c2][i];
2435 		} else {
2436 			tmp1 = result[c1][i];
2437 			tmp2 = result[c2][i];
2438 		}
2439 
2440 		diff = (tmp1 > tmp2) ? (tmp1 - tmp2) : (tmp2 - tmp1);
2441 
2442 		if (diff > MAX_TOLERANCE) {
2443 			if ((i == 2 || i == 6) && !simularity_bitmap) {
2444 				if (result[c1][i] + result[c1][i + 1] == 0)
2445 					final_candidate[(i / 4)] = c2;
2446 				else if (result[c2][i] + result[c2][i + 1] == 0)
2447 					final_candidate[(i / 4)] = c1;
2448 				else
2449 					simularity_bitmap |= (1 << i);
2450 			} else {
2451 				simularity_bitmap |= (1 << i);
2452 			}
2453 		}
2454 	}
2455 
2456 	if (simularity_bitmap == 0) {
2457 		for (i = 0; i < (bound / 4); i++) {
2458 			if (final_candidate[i] != 0xFF) {
2459 				for (j = i * 4; j < (i + 1) * 4 - 2; j++)
2460 					result[3][j] =
2461 						result[final_candidate[i]][j];
2462 				bresult = false;
2463 			}
2464 		}
2465 		return bresult;
2466 	}
2467 	if (!(simularity_bitmap & 0x03)) {/*path A TX OK*/
2468 		for (i = 0; i < 2; i++)
2469 			result[3][i] = result[c1][i];
2470 	}
2471 	if (!(simularity_bitmap & 0x0c)) {/*path A RX OK*/
2472 		for (i = 2; i < 4; i++)
2473 			result[3][i] = result[c1][i];
2474 	}
2475 	if (!(simularity_bitmap & 0x30)) {/*path B TX OK*/
2476 		for (i = 4; i < 6; i++)
2477 			result[3][i] = result[c1][i];
2478 	}
2479 	if (!(simularity_bitmap & 0xc0)) {/*path B RX OK*/
2480 		for (i = 6; i < 8; i++)
2481 			result[3][i] = result[c1][i];
2482 	}
2483 	return false;
2484 }
2485 
2486 static void _rtl92ee_phy_iq_calibrate(struct ieee80211_hw *hw,
2487 				      long result[][8], u8 t, bool is2t)
2488 {
2489 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2490 	struct rtl_phy *rtlphy = &rtlpriv->phy;
2491 	u32 i;
2492 	u8 patha_ok, pathb_ok;
2493 	u8 tmp_0xc50 = (u8)rtl_get_bbreg(hw, 0xc50, MASKBYTE0);
2494 	u8 tmp_0xc58 = (u8)rtl_get_bbreg(hw, 0xc58, MASKBYTE0);
2495 	u32 adda_reg[IQK_ADDA_REG_NUM] = {
2496 		0x85c, 0xe6c, 0xe70, 0xe74,
2497 		0xe78, 0xe7c, 0xe80, 0xe84,
2498 		0xe88, 0xe8c, 0xed0, 0xed4,
2499 		0xed8, 0xedc, 0xee0, 0xeec
2500 	};
2501 	u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
2502 		0x522, 0x550, 0x551, 0x040
2503 	};
2504 	u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
2505 		ROFDM0_TRXPATHENABLE, ROFDM0_TRMUXPAR,
2506 		RFPGA0_XCD_RFINTERFACESW, 0xb68, 0xb6c,
2507 		0x870, 0x860,
2508 		0x864, 0x800
2509 	};
2510 	const u32 retrycount = 2;
2511 
2512 	if (t == 0) {
2513 		_rtl92ee_phy_save_adda_registers(hw, adda_reg,
2514 						 rtlphy->adda_backup,
2515 						 IQK_ADDA_REG_NUM);
2516 		_rtl92ee_phy_save_mac_registers(hw, iqk_mac_reg,
2517 						rtlphy->iqk_mac_backup);
2518 		_rtl92ee_phy_save_adda_registers(hw, iqk_bb_reg,
2519 						 rtlphy->iqk_bb_backup,
2520 						 IQK_BB_REG_NUM);
2521 	}
2522 
2523 	_rtl92ee_phy_path_adda_on(hw, adda_reg, true, is2t);
2524 
2525 	/*BB setting*/
2526 	rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(24), 0x00);
2527 	rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKDWORD, 0x03a05600);
2528 	rtl_set_bbreg(hw, ROFDM0_TRMUXPAR, MASKDWORD, 0x000800e4);
2529 	rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, MASKDWORD, 0x22208200);
2530 
2531 	rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BIT(10), 0x01);
2532 	rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BIT(26), 0x01);
2533 	rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(10), 0x01);
2534 	rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, BIT(10), 0x01);
2535 
2536 	_rtl92ee_phy_mac_setting_calibration(hw, iqk_mac_reg,
2537 					     rtlphy->iqk_mac_backup);
2538 	/* Page B init*/
2539 	/* IQ calibration setting*/
2540 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2541 	rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
2542 	rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
2543 
2544 	for (i = 0 ; i < retrycount ; i++) {
2545 		patha_ok = _rtl92ee_phy_path_a_iqk(hw, is2t);
2546 
2547 		if (patha_ok == 0x01) {
2548 			RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2549 				 "Path A Tx IQK Success!!\n");
2550 			result[t][0] = (rtl_get_bbreg(hw,
2551 						      RTX_POWER_BEFORE_IQK_A,
2552 						      MASKDWORD) & 0x3FF0000)
2553 						      >> 16;
2554 			result[t][1] = (rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A,
2555 						      MASKDWORD) & 0x3FF0000)
2556 						      >> 16;
2557 			break;
2558 		}
2559 		RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2560 			 "Path A Tx IQK Fail!!, ret = 0x%x\n",
2561 			 patha_ok);
2562 	}
2563 
2564 	for (i = 0 ; i < retrycount ; i++) {
2565 		patha_ok = _rtl92ee_phy_path_a_rx_iqk(hw, is2t);
2566 
2567 		if (patha_ok == 0x03) {
2568 			RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2569 				 "Path A Rx IQK Success!!\n");
2570 			result[t][2] = (rtl_get_bbreg(hw,
2571 						      RRX_POWER_BEFORE_IQK_A_2,
2572 						      MASKDWORD) & 0x3FF0000)
2573 						      >> 16;
2574 			result[t][3] = (rtl_get_bbreg(hw,
2575 						      RRX_POWER_AFTER_IQK_A_2,
2576 						      MASKDWORD) & 0x3FF0000)
2577 						      >> 16;
2578 			break;
2579 		}
2580 		RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2581 			 "Path A Rx IQK Fail!!, ret = 0x%x\n",
2582 			  patha_ok);
2583 	}
2584 
2585 	if (0x00 == patha_ok)
2586 		RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2587 			 "Path A IQK failed!!, ret = 0\n");
2588 	if (is2t) {
2589 		_rtl92ee_phy_path_a_standby(hw);
2590 		/* Turn Path B ADDA on */
2591 		_rtl92ee_phy_path_adda_on(hw, adda_reg, false, is2t);
2592 
2593 		/* IQ calibration setting */
2594 		rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2595 		rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
2596 		rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
2597 
2598 		for (i = 0 ; i < retrycount ; i++) {
2599 			pathb_ok = _rtl92ee_phy_path_b_iqk(hw);
2600 			if (pathb_ok == 0x01) {
2601 				RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2602 					 "Path B Tx IQK Success!!\n");
2603 				result[t][4] = (rtl_get_bbreg(hw,
2604 							RTX_POWER_BEFORE_IQK_B,
2605 							MASKDWORD) & 0x3FF0000)
2606 							>> 16;
2607 				result[t][5] = (rtl_get_bbreg(hw,
2608 							RTX_POWER_AFTER_IQK_B,
2609 							MASKDWORD) & 0x3FF0000)
2610 							>> 16;
2611 				break;
2612 			}
2613 			RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2614 				 "Path B Tx IQK Fail!!, ret = 0x%x\n",
2615 				 pathb_ok);
2616 		}
2617 
2618 		for (i = 0 ; i < retrycount ; i++) {
2619 			pathb_ok = _rtl92ee_phy_path_b_rx_iqk(hw, is2t);
2620 			if (pathb_ok == 0x03) {
2621 				RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2622 					 "Path B Rx IQK Success!!\n");
2623 				result[t][6] = (rtl_get_bbreg(hw,
2624 						       RRX_POWER_BEFORE_IQK_B_2,
2625 						       MASKDWORD) & 0x3FF0000)
2626 						       >> 16;
2627 				result[t][7] = (rtl_get_bbreg(hw,
2628 						       RRX_POWER_AFTER_IQK_B_2,
2629 						       MASKDWORD) & 0x3FF0000)
2630 						       >> 16;
2631 				break;
2632 			}
2633 			RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2634 				 "Path B Rx IQK Fail!!, ret = 0x%x\n",
2635 				 pathb_ok);
2636 		}
2637 
2638 		if (0x00 == pathb_ok)
2639 			RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2640 				 "Path B IQK failed!!, ret = 0\n");
2641 	}
2642 	/* Back to BB mode, load original value */
2643 	RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2644 		 "IQK:Back to BB mode, load original value!\n");
2645 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0);
2646 
2647 	if (t != 0) {
2648 		/* Reload ADDA power saving parameters */
2649 		_rtl92ee_phy_reload_adda_registers(hw, adda_reg,
2650 						   rtlphy->adda_backup,
2651 						   IQK_ADDA_REG_NUM);
2652 
2653 		/* Reload MAC parameters */
2654 		_rtl92ee_phy_reload_mac_registers(hw, iqk_mac_reg,
2655 						  rtlphy->iqk_mac_backup);
2656 
2657 		_rtl92ee_phy_reload_adda_registers(hw, iqk_bb_reg,
2658 						   rtlphy->iqk_bb_backup,
2659 						   IQK_BB_REG_NUM);
2660 
2661 		/* Restore RX initial gain */
2662 		rtl_set_bbreg(hw, 0xc50, MASKBYTE0, 0x50);
2663 		rtl_set_bbreg(hw, 0xc50, MASKBYTE0, tmp_0xc50);
2664 		if (is2t) {
2665 			rtl_set_bbreg(hw, 0xc50, MASKBYTE0, 0x50);
2666 			rtl_set_bbreg(hw, 0xc58, MASKBYTE0, tmp_0xc58);
2667 		}
2668 
2669 		/* load 0xe30 IQC default value */
2670 		rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x01008c00);
2671 		rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x01008c00);
2672 	}
2673 }
2674 
2675 static void _rtl92ee_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
2676 {
2677 	u8 tmpreg;
2678 	u32 rf_a_mode = 0, rf_b_mode = 0, lc_cal;
2679 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2680 
2681 	tmpreg = rtl_read_byte(rtlpriv, 0xd03);
2682 
2683 	if ((tmpreg & 0x70) != 0)
2684 		rtl_write_byte(rtlpriv, 0xd03, tmpreg & 0x8F);
2685 	else
2686 		rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
2687 
2688 	if ((tmpreg & 0x70) != 0) {
2689 		rf_a_mode = rtl_get_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS);
2690 
2691 		if (is2t)
2692 			rf_b_mode = rtl_get_rfreg(hw, RF90_PATH_B, 0x00,
2693 						  MASK12BITS);
2694 
2695 		rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS,
2696 			      (rf_a_mode & 0x8FFFF) | 0x10000);
2697 
2698 		if (is2t)
2699 			rtl_set_rfreg(hw, RF90_PATH_B, 0x00, MASK12BITS,
2700 				      (rf_b_mode & 0x8FFFF) | 0x10000);
2701 	}
2702 	lc_cal = rtl_get_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS);
2703 
2704 	rtl_set_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS, lc_cal | 0x08000);
2705 
2706 	mdelay(100);
2707 
2708 	if ((tmpreg & 0x70) != 0) {
2709 		rtl_write_byte(rtlpriv, 0xd03, tmpreg);
2710 		rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS, rf_a_mode);
2711 
2712 		if (is2t)
2713 			rtl_set_rfreg(hw, RF90_PATH_B, 0x00, MASK12BITS,
2714 				      rf_b_mode);
2715 	} else {
2716 		rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
2717 	}
2718 }
2719 
2720 static void _rtl92ee_phy_set_rfpath_switch(struct ieee80211_hw *hw,
2721 					   bool bmain, bool is2t)
2722 {
2723 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2724 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2725 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2726 
2727 	RT_TRACE(rtlpriv, COMP_INIT , DBG_LOUD , "\n");
2728 
2729 	if (is_hal_stop(rtlhal)) {
2730 		u8 u1btmp;
2731 
2732 		u1btmp = rtl_read_byte(rtlpriv, REG_LEDCFG0);
2733 		rtl_write_byte(rtlpriv, REG_LEDCFG0, u1btmp | BIT(7));
2734 		rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(13), 0x01);
2735 	}
2736 	if (is2t) {
2737 		if (bmain)
2738 			rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
2739 				      BIT(5) | BIT(6), 0x1);
2740 		else
2741 			rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
2742 				      BIT(5) | BIT(6), 0x2);
2743 	} else {
2744 		rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BIT(8) | BIT(9), 0);
2745 		rtl_set_bbreg(hw, 0x914, MASKLWORD, 0x0201);
2746 
2747 		/* We use the RF definition of MAIN and AUX,
2748 		 * left antenna and right antenna repectively.
2749 		 * Default output at AUX.
2750 		 */
2751 		if (bmain) {
2752 			rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
2753 				      BIT(14) | BIT(13) | BIT(12), 0);
2754 			rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
2755 				      BIT(5) | BIT(4) | BIT(3), 0);
2756 			if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV)
2757 				rtl_set_bbreg(hw, RCONFIG_RAM64x16, BIT(31), 0);
2758 		} else {
2759 			rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
2760 				      BIT(14) | BIT(13) | BIT(12), 1);
2761 			rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
2762 				      BIT(5) | BIT(4) | BIT(3), 1);
2763 			if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV)
2764 				rtl_set_bbreg(hw, RCONFIG_RAM64x16, BIT(31), 1);
2765 		}
2766 	}
2767 }
2768 
2769 #undef IQK_ADDA_REG_NUM
2770 #undef IQK_DELAY_TIME
2771 
2772 static u8 rtl92ee_get_rightchnlplace_for_iqk(u8 chnl)
2773 {
2774 	u8 channel_all[59] = {
2775 		1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
2776 		36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
2777 		60, 62, 64, 100, 102, 104, 106, 108, 110, 112,
2778 		114, 116, 118, 120, 122, 124, 126, 128,	130,
2779 		132, 134, 136, 138, 140, 149, 151, 153, 155,
2780 		157, 159, 161, 163, 165
2781 	};
2782 	u8 place = chnl;
2783 
2784 	if (chnl > 14) {
2785 		for (place = 14; place < sizeof(channel_all); place++) {
2786 			if (channel_all[place] == chnl)
2787 				return place - 13;
2788 		}
2789 	}
2790 
2791 	return 0;
2792 }
2793 
2794 void rtl92ee_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery)
2795 {
2796 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2797 	struct rtl_phy *rtlphy = &rtlpriv->phy;
2798 	long result[4][8];
2799 	u8 i, final_candidate;
2800 	bool b_patha_ok, b_pathb_ok;
2801 	long reg_e94, reg_e9c, reg_ea4;
2802 	long reg_eb4, reg_ebc, reg_ec4;
2803 	bool is12simular, is13simular, is23simular;
2804 	u8 idx;
2805 	u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
2806 		ROFDM0_XARXIQIMBALANCE,
2807 		ROFDM0_XBRXIQIMBALANCE,
2808 		ROFDM0_ECCATHRESHOLD,
2809 		ROFDM0_AGCRSSITABLE,
2810 		ROFDM0_XATXIQIMBALANCE,
2811 		ROFDM0_XBTXIQIMBALANCE,
2812 		ROFDM0_XCTXAFE,
2813 		ROFDM0_XDTXAFE,
2814 		ROFDM0_RXIQEXTANTA
2815 	};
2816 
2817 	if (b_recovery) {
2818 		_rtl92ee_phy_reload_adda_registers(hw, iqk_bb_reg,
2819 						   rtlphy->iqk_bb_backup, 9);
2820 		return;
2821 	}
2822 
2823 	for (i = 0; i < 8; i++) {
2824 		result[0][i] = 0;
2825 		result[1][i] = 0;
2826 		result[2][i] = 0;
2827 
2828 		if ((i == 0) || (i == 2) || (i == 4)  || (i == 6))
2829 			result[3][i] = 0x100;
2830 		else
2831 			result[3][i] = 0;
2832 	}
2833 	final_candidate = 0xff;
2834 	b_patha_ok = false;
2835 	b_pathb_ok = false;
2836 	is12simular = false;
2837 	is23simular = false;
2838 	is13simular = false;
2839 	for (i = 0; i < 3; i++) {
2840 		_rtl92ee_phy_iq_calibrate(hw, result, i, true);
2841 		if (i == 1) {
2842 			is12simular = _rtl92ee_phy_simularity_compare(hw,
2843 								      result,
2844 								      0, 1);
2845 			if (is12simular) {
2846 				final_candidate = 0;
2847 				break;
2848 			}
2849 		}
2850 
2851 		if (i == 2) {
2852 			is13simular = _rtl92ee_phy_simularity_compare(hw,
2853 								      result,
2854 								      0, 2);
2855 			if (is13simular) {
2856 				final_candidate = 0;
2857 				break;
2858 			}
2859 			is23simular = _rtl92ee_phy_simularity_compare(hw,
2860 								      result,
2861 								      1, 2);
2862 			if (is23simular)
2863 				final_candidate = 1;
2864 			else
2865 				final_candidate = 3;
2866 		}
2867 	}
2868 
2869 	for (i = 0; i < 4; i++) {
2870 		reg_e94 = result[i][0];
2871 		reg_e9c = result[i][1];
2872 		reg_ea4 = result[i][2];
2873 		reg_eb4 = result[i][4];
2874 		reg_ebc = result[i][5];
2875 		reg_ec4 = result[i][6];
2876 	}
2877 
2878 	if (final_candidate != 0xff) {
2879 		reg_e94 = result[final_candidate][0];
2880 		rtlphy->reg_e94 = reg_e94;
2881 		reg_e9c = result[final_candidate][1];
2882 		rtlphy->reg_e9c = reg_e9c;
2883 		reg_ea4 = result[final_candidate][2];
2884 		reg_eb4 = result[final_candidate][4];
2885 		rtlphy->reg_eb4 = reg_eb4;
2886 		reg_ebc = result[final_candidate][5];
2887 		rtlphy->reg_ebc = reg_ebc;
2888 		reg_ec4 = result[final_candidate][6];
2889 		b_patha_ok = true;
2890 		b_pathb_ok = true;
2891 	} else {
2892 		rtlphy->reg_e94 = 0x100;
2893 		rtlphy->reg_eb4 = 0x100;
2894 		rtlphy->reg_e9c = 0x0;
2895 		rtlphy->reg_ebc = 0x0;
2896 	}
2897 
2898 	if (reg_e94 != 0)
2899 		_rtl92ee_phy_path_a_fill_iqk_matrix(hw, b_patha_ok, result,
2900 						    final_candidate,
2901 						    (reg_ea4 == 0));
2902 
2903 	_rtl92ee_phy_path_b_fill_iqk_matrix(hw, b_pathb_ok, result,
2904 					    final_candidate,
2905 					    (reg_ec4 == 0));
2906 
2907 	idx = rtl92ee_get_rightchnlplace_for_iqk(rtlphy->current_channel);
2908 
2909 	/* To Fix BSOD when final_candidate is 0xff */
2910 	if (final_candidate < 4) {
2911 		for (i = 0; i < IQK_MATRIX_REG_NUM; i++)
2912 			rtlphy->iqk_matrix[idx].value[0][i] =
2913 				result[final_candidate][i];
2914 
2915 		rtlphy->iqk_matrix[idx].iqk_done = true;
2916 	}
2917 	_rtl92ee_phy_save_adda_registers(hw, iqk_bb_reg,
2918 					 rtlphy->iqk_bb_backup, 9);
2919 }
2920 
2921 void rtl92ee_phy_lc_calibrate(struct ieee80211_hw *hw)
2922 {
2923 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2924 	struct rtl_phy *rtlphy = &rtlpriv->phy;
2925 	struct rtl_hal *rtlhal = &rtlpriv->rtlhal;
2926 	u32 timeout = 2000, timecount = 0;
2927 
2928 	while (rtlpriv->mac80211.act_scanning && timecount < timeout) {
2929 		udelay(50);
2930 		timecount += 50;
2931 	}
2932 
2933 	rtlphy->lck_inprogress = true;
2934 	RTPRINT(rtlpriv, FINIT, INIT_IQK,
2935 		"LCK:Start!!! currentband %x delay %d ms\n",
2936 		 rtlhal->current_bandtype, timecount);
2937 
2938 	_rtl92ee_phy_lc_calibrate(hw, false);
2939 
2940 	rtlphy->lck_inprogress = false;
2941 }
2942 
2943 void rtl92ee_phy_ap_calibrate(struct ieee80211_hw *hw, s8 delta)
2944 {
2945 }
2946 
2947 void rtl92ee_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain)
2948 {
2949 	_rtl92ee_phy_set_rfpath_switch(hw, bmain, false);
2950 }
2951 
2952 bool rtl92ee_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
2953 {
2954 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2955 	struct rtl_phy *rtlphy = &rtlpriv->phy;
2956 	bool postprocessing = false;
2957 
2958 	RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
2959 		 "-->IO Cmd(%#x), set_io_inprogress(%d)\n",
2960 		  iotype, rtlphy->set_io_inprogress);
2961 	do {
2962 		switch (iotype) {
2963 		case IO_CMD_RESUME_DM_BY_SCAN:
2964 			RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
2965 				 "[IO CMD] Resume DM after scan.\n");
2966 			postprocessing = true;
2967 			break;
2968 		case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
2969 			RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
2970 				 "[IO CMD] Pause DM before scan.\n");
2971 			postprocessing = true;
2972 			break;
2973 		default:
2974 			RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
2975 				 "switch case %#x not processed\n", iotype);
2976 			break;
2977 		}
2978 	} while (false);
2979 	if (postprocessing && !rtlphy->set_io_inprogress) {
2980 		rtlphy->set_io_inprogress = true;
2981 		rtlphy->current_io_type = iotype;
2982 	} else {
2983 		return false;
2984 	}
2985 	rtl92ee_phy_set_io(hw);
2986 	RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "IO Type(%#x)\n", iotype);
2987 	return true;
2988 }
2989 
2990 static void rtl92ee_phy_set_io(struct ieee80211_hw *hw)
2991 {
2992 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2993 	struct rtl_phy *rtlphy = &rtlpriv->phy;
2994 	struct dig_t *dm_dig = &rtlpriv->dm_digtable;
2995 
2996 	RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
2997 		 "--->Cmd(%#x), set_io_inprogress(%d)\n",
2998 		  rtlphy->current_io_type, rtlphy->set_io_inprogress);
2999 	switch (rtlphy->current_io_type) {
3000 	case IO_CMD_RESUME_DM_BY_SCAN:
3001 		rtl92ee_dm_write_dig(hw, rtlphy->initgain_backup.xaagccore1);
3002 		rtl92ee_dm_write_cck_cca_thres(hw, rtlphy->initgain_backup.cca);
3003 		RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE , "no set txpower\n");
3004 		rtl92ee_phy_set_txpower_level(hw, rtlphy->current_channel);
3005 		break;
3006 	case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
3007 		/* 8192eebt */
3008 		rtlphy->initgain_backup.xaagccore1 = dm_dig->cur_igvalue;
3009 		rtl92ee_dm_write_dig(hw, 0x17);
3010 		rtlphy->initgain_backup.cca = dm_dig->cur_cck_cca_thres;
3011 		rtl92ee_dm_write_cck_cca_thres(hw, 0x40);
3012 		break;
3013 	default:
3014 		RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
3015 			 "switch case %#x not processed\n",
3016 			 rtlphy->current_io_type);
3017 		break;
3018 	}
3019 	rtlphy->set_io_inprogress = false;
3020 	RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
3021 		 "(%#x)\n", rtlphy->current_io_type);
3022 }
3023 
3024 static void rtl92ee_phy_set_rf_on(struct ieee80211_hw *hw)
3025 {
3026 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3027 
3028 	rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b);
3029 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3030 	/*rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);*/
3031 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3032 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3033 	rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
3034 }
3035 
3036 static void _rtl92ee_phy_set_rf_sleep(struct ieee80211_hw *hw)
3037 {
3038 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3039 
3040 	rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
3041 	rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
3042 
3043 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3044 	rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22);
3045 }
3046 
3047 static bool _rtl92ee_phy_set_rf_power_state(struct ieee80211_hw *hw,
3048 					    enum rf_pwrstate rfpwr_state)
3049 {
3050 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3051 	struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
3052 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3053 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
3054 	bool bresult = true;
3055 	u8 i, queue_id;
3056 	struct rtl8192_tx_ring *ring = NULL;
3057 
3058 	switch (rfpwr_state) {
3059 	case ERFON:
3060 		if ((ppsc->rfpwr_state == ERFOFF) &&
3061 		    RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
3062 			bool rtstatus;
3063 			u32 initializecount = 0;
3064 
3065 			do {
3066 				initializecount++;
3067 				RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3068 					 "IPS Set eRf nic enable\n");
3069 				rtstatus = rtl_ps_enable_nic(hw);
3070 			} while (!rtstatus && (initializecount < 10));
3071 			RT_CLEAR_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
3072 		} else {
3073 			RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3074 				 "Set ERFON sleeping:%d ms\n",
3075 				  jiffies_to_msecs(jiffies -
3076 						   ppsc->last_sleep_jiffies));
3077 			ppsc->last_awake_jiffies = jiffies;
3078 			rtl92ee_phy_set_rf_on(hw);
3079 		}
3080 		if (mac->link_state == MAC80211_LINKED)
3081 			rtlpriv->cfg->ops->led_control(hw, LED_CTL_LINK);
3082 		else
3083 			rtlpriv->cfg->ops->led_control(hw, LED_CTL_NO_LINK);
3084 		break;
3085 	case ERFOFF:
3086 		for (queue_id = 0, i = 0;
3087 		     queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
3088 			ring = &pcipriv->dev.tx_ring[queue_id];
3089 			if (queue_id == BEACON_QUEUE ||
3090 			    skb_queue_len(&ring->queue) == 0) {
3091 				queue_id++;
3092 				continue;
3093 			} else {
3094 				RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3095 					 "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
3096 					 (i + 1), queue_id,
3097 					 skb_queue_len(&ring->queue));
3098 
3099 				udelay(10);
3100 				i++;
3101 			}
3102 			if (i >= MAX_DOZE_WAITING_TIMES_9x) {
3103 				RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3104 					 "\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
3105 					  MAX_DOZE_WAITING_TIMES_9x,
3106 					  queue_id,
3107 					  skb_queue_len(&ring->queue));
3108 				break;
3109 			}
3110 		}
3111 
3112 		if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
3113 			RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3114 				 "IPS Set eRf nic disable\n");
3115 			rtl_ps_disable_nic(hw);
3116 			RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
3117 		} else {
3118 			if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) {
3119 				rtlpriv->cfg->ops->led_control(hw,
3120 							LED_CTL_NO_LINK);
3121 			} else {
3122 				rtlpriv->cfg->ops->led_control(hw,
3123 							LED_CTL_POWER_OFF);
3124 			}
3125 		}
3126 		break;
3127 	case ERFSLEEP:
3128 		if (ppsc->rfpwr_state == ERFOFF)
3129 			break;
3130 		for (queue_id = 0, i = 0;
3131 		     queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
3132 			ring = &pcipriv->dev.tx_ring[queue_id];
3133 			if (skb_queue_len(&ring->queue) == 0) {
3134 				queue_id++;
3135 				continue;
3136 			} else {
3137 				RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3138 					 "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
3139 					 (i + 1), queue_id,
3140 					 skb_queue_len(&ring->queue));
3141 				udelay(10);
3142 				i++;
3143 			}
3144 			if (i >= MAX_DOZE_WAITING_TIMES_9x) {
3145 				RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3146 					 "\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
3147 					  MAX_DOZE_WAITING_TIMES_9x,
3148 					  queue_id,
3149 					  skb_queue_len(&ring->queue));
3150 				break;
3151 			}
3152 		}
3153 		RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3154 			 "Set ERFSLEEP awaked:%d ms\n",
3155 			  jiffies_to_msecs(jiffies -
3156 					   ppsc->last_awake_jiffies));
3157 		ppsc->last_sleep_jiffies = jiffies;
3158 		_rtl92ee_phy_set_rf_sleep(hw);
3159 		break;
3160 	default:
3161 		RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
3162 			 "switch case %#x not processed\n", rfpwr_state);
3163 		bresult = false;
3164 		break;
3165 	}
3166 	if (bresult)
3167 		ppsc->rfpwr_state = rfpwr_state;
3168 	return bresult;
3169 }
3170 
3171 bool rtl92ee_phy_set_rf_power_state(struct ieee80211_hw *hw,
3172 				    enum rf_pwrstate rfpwr_state)
3173 {
3174 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
3175 
3176 	bool bresult = false;
3177 
3178 	if (rfpwr_state == ppsc->rfpwr_state)
3179 		return bresult;
3180 	bresult = _rtl92ee_phy_set_rf_power_state(hw, rfpwr_state);
3181 	return bresult;
3182 }
3183