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