xref: /linux/drivers/net/wireless/realtek/rtlwifi/rtl8723be/phy.c (revision 55d0969c451159cff86949b38c39171cab962069)
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 "../rtl8723com/phy_common.h"
11 #include "rf.h"
12 #include "dm.h"
13 #include "../rtl8723com/dm_common.h"
14 #include "table.h"
15 #include "trx.h"
16 #include <linux/kernel.h>
17 
18 static bool _rtl8723be_phy_bb8723b_config_parafile(struct ieee80211_hw *hw);
19 static bool _rtl8723be_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);
20 static bool _rtl8723be_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
21 						     u8 configtype);
22 static bool _rtl8723be_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
23 						       u8 configtype);
24 static bool _rtl8723be_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
25 						u8 channel, u8 *stage,
26 						u8 *step, u32 *delay);
27 
28 static void rtl8723be_phy_set_rf_on(struct ieee80211_hw *hw);
29 static void rtl8723be_phy_set_io(struct ieee80211_hw *hw);
30 
31 u32 rtl8723be_phy_query_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,
32 			       u32 regaddr, u32 bitmask)
33 {
34 	struct rtl_priv *rtlpriv = rtl_priv(hw);
35 	u32 original_value, readback_value, bitshift;
36 
37 	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
38 		"regaddr(%#x), rfpath(%#x), bitmask(%#x)\n",
39 		regaddr, rfpath, bitmask);
40 
41 	spin_lock(&rtlpriv->locks.rf_lock);
42 
43 	original_value = rtl8723_phy_rf_serial_read(hw, rfpath, regaddr);
44 	bitshift = calculate_bit_shift(bitmask);
45 	readback_value = (original_value & bitmask) >> bitshift;
46 
47 	spin_unlock(&rtlpriv->locks.rf_lock);
48 
49 	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
50 		"regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n",
51 		regaddr, rfpath, bitmask, original_value);
52 
53 	return readback_value;
54 }
55 
56 void rtl8723be_phy_set_rf_reg(struct ieee80211_hw *hw, enum radio_path path,
57 			      u32 regaddr, u32 bitmask, u32 data)
58 {
59 	struct rtl_priv *rtlpriv = rtl_priv(hw);
60 	u32 original_value, bitshift;
61 
62 	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
63 		"regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
64 		regaddr, bitmask, data, path);
65 
66 	spin_lock(&rtlpriv->locks.rf_lock);
67 
68 	if (bitmask != RFREG_OFFSET_MASK) {
69 			original_value = rtl8723_phy_rf_serial_read(hw, path,
70 								    regaddr);
71 			bitshift = calculate_bit_shift(bitmask);
72 			data = ((original_value & (~bitmask)) |
73 				(data << bitshift));
74 		}
75 
76 	rtl8723_phy_rf_serial_write(hw, path, regaddr, data);
77 
78 	spin_unlock(&rtlpriv->locks.rf_lock);
79 
80 	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
81 		"regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
82 		regaddr, bitmask, data, path);
83 
84 }
85 
86 bool rtl8723be_phy_mac_config(struct ieee80211_hw *hw)
87 {
88 	struct rtl_priv *rtlpriv = rtl_priv(hw);
89 	bool rtstatus = _rtl8723be_phy_config_mac_with_headerfile(hw);
90 
91 	rtl_write_byte(rtlpriv, 0x04CA, 0x0B);
92 	return rtstatus;
93 }
94 
95 bool rtl8723be_phy_bb_config(struct ieee80211_hw *hw)
96 {
97 	bool rtstatus = true;
98 	struct rtl_priv *rtlpriv = rtl_priv(hw);
99 	u16 regval;
100 	u8 b_reg_hwparafile = 1;
101 	u32 tmp;
102 	u8 crystalcap = rtlpriv->efuse.crystalcap;
103 	rtl8723_phy_init_bb_rf_reg_def(hw);
104 	regval = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
105 	rtl_write_word(rtlpriv, REG_SYS_FUNC_EN,
106 		       regval | BIT(13) | BIT(0) | BIT(1));
107 
108 	rtl_write_byte(rtlpriv, REG_RF_CTRL, RF_EN | RF_RSTB | RF_SDMRSTB);
109 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN,
110 		       FEN_PPLL | FEN_PCIEA | FEN_DIO_PCIE |
111 		       FEN_BB_GLB_RSTN | FEN_BBRSTB);
112 	tmp = rtl_read_dword(rtlpriv, 0x4c);
113 	rtl_write_dword(rtlpriv, 0x4c, tmp | BIT(23));
114 
115 	rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL + 1, 0x80);
116 
117 	if (b_reg_hwparafile == 1)
118 		rtstatus = _rtl8723be_phy_bb8723b_config_parafile(hw);
119 
120 	crystalcap = crystalcap & 0x3F;
121 	rtl_set_bbreg(hw, REG_MAC_PHY_CTRL, 0xFFF000,
122 		      (crystalcap | crystalcap << 6));
123 
124 	return rtstatus;
125 }
126 
127 bool rtl8723be_phy_rf_config(struct ieee80211_hw *hw)
128 {
129 	return rtl8723be_phy_rf6052_config(hw);
130 }
131 
132 static bool _rtl8723be_check_positive(struct ieee80211_hw *hw,
133 				      const u32 condition1,
134 				      const u32 condition2)
135 {
136 	struct rtl_priv *rtlpriv = rtl_priv(hw);
137 	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
138 	u32 cut_ver = ((rtlhal->version & CHIP_VER_RTL_MASK)
139 					>> CHIP_VER_RTL_SHIFT);
140 	u32 intf = (rtlhal->interface == INTF_USB ? BIT(1) : BIT(0));
141 
142 	u8  board_type = ((rtlhal->board_type & BIT(4)) >> 4) << 0 | /* _GLNA */
143 			 ((rtlhal->board_type & BIT(3)) >> 3) << 1 | /* _GPA  */
144 			 ((rtlhal->board_type & BIT(7)) >> 7) << 2 | /* _ALNA */
145 			 ((rtlhal->board_type & BIT(6)) >> 6) << 3 | /* _APA  */
146 			 ((rtlhal->board_type & BIT(2)) >> 2) << 4;  /* _BT   */
147 
148 	u32 cond1 = condition1, cond2 = condition2;
149 	u32 driver1 = cut_ver << 24 |	/* CUT ver */
150 		      0 << 20 |			/* interface 2/2 */
151 		      0x04 << 16 |		/* platform */
152 		      rtlhal->package_type << 12 |
153 		      intf << 8 |			/* interface 1/2 */
154 		      board_type;
155 
156 	u32 driver2 = rtlhal->type_glna <<  0 |
157 		      rtlhal->type_gpa  <<  8 |
158 		      rtlhal->type_alna << 16 |
159 		      rtlhal->type_apa  << 24;
160 
161 	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
162 		"===> [8812A] CheckPositive (cond1, cond2) = (0x%X 0x%X)\n",
163 		cond1, cond2);
164 	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
165 		"===> [8812A] CheckPositive (driver1, driver2) = (0x%X 0x%X)\n",
166 		driver1, driver2);
167 
168 	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
169 		"(Platform, Interface) = (0x%X, 0x%X)\n", 0x04, intf);
170 	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
171 		"(Board, Package) = (0x%X, 0x%X)\n",
172 		rtlhal->board_type, rtlhal->package_type);
173 
174 	/*============== Value Defined Check ===============*/
175 	/*QFN Type [15:12] and Cut Version [27:24] need to do value check*/
176 
177 	if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) !=
178 		(driver1 & 0x0000F000)))
179 		return false;
180 	if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) !=
181 		(driver1 & 0x0F000000)))
182 		return false;
183 
184 	/*=============== Bit Defined Check ================*/
185 	/* We don't care [31:28] */
186 
187 	cond1   &= 0x00FF0FFF;
188 	driver1 &= 0x00FF0FFF;
189 
190 	if ((cond1 & driver1) == cond1) {
191 		u32 mask = 0;
192 
193 		if ((cond1 & 0x0F) == 0) /* BoardType is DONTCARE*/
194 			return true;
195 
196 		if ((cond1 & BIT(0)) != 0) /*GLNA*/
197 			mask |= 0x000000FF;
198 		if ((cond1 & BIT(1)) != 0) /*GPA*/
199 			mask |= 0x0000FF00;
200 		if ((cond1 & BIT(2)) != 0) /*ALNA*/
201 			mask |= 0x00FF0000;
202 		if ((cond1 & BIT(3)) != 0) /*APA*/
203 			mask |= 0xFF000000;
204 
205 		/* BoardType of each RF path is matched*/
206 		if ((cond2 & mask) == (driver2 & mask))
207 			return true;
208 		else
209 			return false;
210 	}
211 	return false;
212 }
213 
214 static void _rtl8723be_config_rf_reg(struct ieee80211_hw *hw, u32 addr,
215 				     u32 data, enum radio_path rfpath,
216 				     u32 regaddr)
217 {
218 	if (addr == 0xfe || addr == 0xffe) {
219 		/* In order not to disturb BT music
220 		 *	when wifi init.(1ant NIC only)
221 		 */
222 		mdelay(50);
223 	} else {
224 		rtl_set_rfreg(hw, rfpath, regaddr, RFREG_OFFSET_MASK, data);
225 		udelay(1);
226 	}
227 }
228 static void _rtl8723be_config_rf_radio_a(struct ieee80211_hw *hw,
229 					 u32 addr, u32 data)
230 {
231 	u32 content = 0x1000; /*RF Content: radio_a_txt*/
232 	u32 maskforphyset = (u32)(content & 0xE000);
233 
234 	_rtl8723be_config_rf_reg(hw, addr, data, RF90_PATH_A,
235 				 addr | maskforphyset);
236 
237 }
238 
239 static void _rtl8723be_phy_init_tx_power_by_rate(struct ieee80211_hw *hw)
240 {
241 	struct rtl_priv *rtlpriv = rtl_priv(hw);
242 	struct rtl_phy *rtlphy = &rtlpriv->phy;
243 
244 	u8 band, path, txnum, section;
245 
246 	for (band = BAND_ON_2_4G; band <= BAND_ON_5G; ++band)
247 		for (path = 0; path < TX_PWR_BY_RATE_NUM_RF; ++path)
248 			for (txnum = 0; txnum < TX_PWR_BY_RATE_NUM_RF; ++txnum)
249 				for (section = 0;
250 				     section < TX_PWR_BY_RATE_NUM_SECTION;
251 				     ++section)
252 					rtlphy->tx_power_by_rate_offset
253 					  [band][path][txnum][section] = 0;
254 }
255 
256 static void _rtl8723be_config_bb_reg(struct ieee80211_hw *hw,
257 				     u32 addr, u32 data)
258 {
259 	if (addr == 0xfe) {
260 		mdelay(50);
261 	} else if (addr == 0xfd) {
262 		mdelay(5);
263 	} else if (addr == 0xfc) {
264 		mdelay(1);
265 	} else if (addr == 0xfb) {
266 		udelay(50);
267 	} else if (addr == 0xfa) {
268 		udelay(5);
269 	} else if (addr == 0xf9) {
270 		udelay(1);
271 	} else {
272 		rtl_set_bbreg(hw, addr, MASKDWORD, data);
273 		udelay(1);
274 	}
275 }
276 
277 static void _rtl8723be_phy_set_txpower_by_rate_base(struct ieee80211_hw *hw,
278 						    u8 band,
279 						    u8 path, u8 rate_section,
280 						    u8 txnum, u8 value)
281 {
282 	struct rtl_priv *rtlpriv = rtl_priv(hw);
283 	struct rtl_phy *rtlphy = &rtlpriv->phy;
284 
285 	if (path > RF90_PATH_D) {
286 		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
287 			"Invalid Rf Path %d in phy_SetTxPowerByRatBase()\n",
288 			path);
289 		return;
290 	}
291 
292 	if (band == BAND_ON_2_4G) {
293 		switch (rate_section) {
294 		case CCK:
295 			rtlphy->txpwr_by_rate_base_24g[path][txnum][0] = value;
296 			break;
297 		case OFDM:
298 			rtlphy->txpwr_by_rate_base_24g[path][txnum][1] = value;
299 			break;
300 		case HT_MCS0_MCS7:
301 			rtlphy->txpwr_by_rate_base_24g[path][txnum][2] = value;
302 			break;
303 		case HT_MCS8_MCS15:
304 			rtlphy->txpwr_by_rate_base_24g[path][txnum][3] = value;
305 			break;
306 		default:
307 			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
308 				"Invalid RateSection %d in Band 2.4G, Rf Path %d, %dTx in PHY_SetTxPowerByRateBase()\n",
309 				rate_section, path, txnum);
310 			break;
311 		}
312 	} else {
313 		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
314 			"Invalid Band %d in PHY_SetTxPowerByRateBase()\n",
315 			band);
316 	}
317 
318 }
319 
320 static u8 _rtl8723be_phy_get_txpower_by_rate_base(struct ieee80211_hw *hw,
321 						  u8 band, u8 path, u8 txnum,
322 						  u8 rate_section)
323 {
324 	struct rtl_priv *rtlpriv = rtl_priv(hw);
325 	struct rtl_phy *rtlphy = &rtlpriv->phy;
326 	u8 value = 0;
327 	if (path > RF90_PATH_D) {
328 		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
329 			"Invalid Rf Path %d in PHY_GetTxPowerByRateBase()\n",
330 			path);
331 		return 0;
332 	}
333 
334 	if (band == BAND_ON_2_4G) {
335 		switch (rate_section) {
336 		case CCK:
337 			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][0];
338 			break;
339 		case OFDM:
340 			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][1];
341 			break;
342 		case HT_MCS0_MCS7:
343 			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][2];
344 			break;
345 		case HT_MCS8_MCS15:
346 			value = rtlphy->txpwr_by_rate_base_24g[path][txnum][3];
347 			break;
348 		default:
349 			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
350 				"Invalid RateSection %d in Band 2.4G, Rf Path %d, %dTx in PHY_GetTxPowerByRateBase()\n",
351 				rate_section, path, txnum);
352 			break;
353 		}
354 	} else {
355 		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
356 			"Invalid Band %d in PHY_GetTxPowerByRateBase()\n",
357 			band);
358 	}
359 
360 	return value;
361 }
362 
363 static void _rtl8723be_phy_store_txpower_by_rate_base(struct ieee80211_hw *hw)
364 {
365 	struct rtl_priv *rtlpriv = rtl_priv(hw);
366 	struct rtl_phy *rtlphy = &rtlpriv->phy;
367 	u16 rawvalue = 0;
368 	u8 base = 0, path = 0;
369 
370 	for (path = RF90_PATH_A; path <= RF90_PATH_B; ++path) {
371 		if (path == RF90_PATH_A) {
372 			rawvalue = (u16)(rtlphy->tx_power_by_rate_offset
373 				[BAND_ON_2_4G][path][RF_1TX][3] >> 24) & 0xFF;
374 			base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
375 			_rtl8723be_phy_set_txpower_by_rate_base(hw,
376 				BAND_ON_2_4G, path, CCK, RF_1TX, base);
377 		} else if (path == RF90_PATH_B) {
378 			rawvalue = (u16)(rtlphy->tx_power_by_rate_offset
379 				[BAND_ON_2_4G][path][RF_1TX][3] >> 0) & 0xFF;
380 			base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
381 			_rtl8723be_phy_set_txpower_by_rate_base(hw,
382 								BAND_ON_2_4G,
383 								path, CCK,
384 								RF_1TX, base);
385 		}
386 		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset
387 				[BAND_ON_2_4G][path][RF_1TX][1] >> 24) & 0xFF;
388 		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
389 		_rtl8723be_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G,
390 							path, OFDM, RF_1TX,
391 							base);
392 
393 		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset
394 				[BAND_ON_2_4G][path][RF_1TX][5] >> 24) & 0xFF;
395 		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
396 		_rtl8723be_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G,
397 							path, HT_MCS0_MCS7,
398 							RF_1TX, base);
399 
400 		rawvalue = (u16)(rtlphy->tx_power_by_rate_offset
401 				[BAND_ON_2_4G][path][RF_2TX][7] >> 24) & 0xFF;
402 		base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
403 		_rtl8723be_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G,
404 							path, HT_MCS8_MCS15,
405 							RF_2TX, base);
406 	}
407 }
408 
409 static void _phy_convert_txpower_dbm_to_relative_value(u32 *data, u8 start,
410 						u8 end, u8 base_val)
411 {
412 	s8 i = 0;
413 	u8 temp_value = 0;
414 	u32 temp_data = 0;
415 
416 	for (i = 3; i >= 0; --i) {
417 		if (i >= start && i <= end) {
418 			/* Get the exact value */
419 			temp_value = (u8)(*data >> (i * 8)) & 0xF;
420 			temp_value += ((u8)((*data >> (i*8 + 4)) & 0xF)) * 10;
421 
422 			/* Change the value to a relative value */
423 			temp_value = (temp_value > base_val) ?
424 				     temp_value - base_val :
425 				     base_val - temp_value;
426 		} else {
427 			temp_value = (u8)(*data >> (i * 8)) & 0xFF;
428 		}
429 		temp_data <<= 8;
430 		temp_data |= temp_value;
431 	}
432 	*data = temp_data;
433 }
434 
435 static void _rtl8723be_phy_convert_txpower_dbm_to_relative_value(
436 							struct ieee80211_hw *hw)
437 {
438 	struct rtl_priv *rtlpriv = rtl_priv(hw);
439 	struct rtl_phy *rtlphy = &rtlpriv->phy;
440 	u8 base = 0, rfpath = RF90_PATH_A;
441 
442 	base = _rtl8723be_phy_get_txpower_by_rate_base(hw,
443 			BAND_ON_2_4G, rfpath, RF_1TX, CCK);
444 	_phy_convert_txpower_dbm_to_relative_value(
445 	    &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][2],
446 	    1, 1, base);
447 	_phy_convert_txpower_dbm_to_relative_value(
448 	    &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][3],
449 	    1, 3, base);
450 
451 	base = _rtl8723be_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath,
452 						       RF_1TX, OFDM);
453 	_phy_convert_txpower_dbm_to_relative_value(
454 	    &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][0],
455 	    0, 3, base);
456 	_phy_convert_txpower_dbm_to_relative_value(
457 	    &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][1],
458 	    0, 3, base);
459 
460 	base = _rtl8723be_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G,
461 						rfpath, RF_1TX, HT_MCS0_MCS7);
462 	_phy_convert_txpower_dbm_to_relative_value(
463 	    &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][4],
464 	    0, 3, base);
465 	_phy_convert_txpower_dbm_to_relative_value(
466 	    &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][5],
467 	    0, 3, base);
468 
469 	base = _rtl8723be_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G,
470 						       rfpath, RF_2TX,
471 						       HT_MCS8_MCS15);
472 	_phy_convert_txpower_dbm_to_relative_value(
473 	    &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_2TX][6],
474 	    0, 3, base);
475 
476 	_phy_convert_txpower_dbm_to_relative_value(
477 	    &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_2TX][7],
478 	    0, 3, base);
479 
480 	rtl_dbg(rtlpriv, COMP_POWER, DBG_TRACE,
481 		"<===%s\n", __func__);
482 }
483 
484 static void phy_txpower_by_rate_config(struct ieee80211_hw *hw)
485 {
486 	_rtl8723be_phy_store_txpower_by_rate_base(hw);
487 	_rtl8723be_phy_convert_txpower_dbm_to_relative_value(hw);
488 }
489 
490 static bool _rtl8723be_phy_bb8723b_config_parafile(struct ieee80211_hw *hw)
491 {
492 	struct rtl_priv *rtlpriv = rtl_priv(hw);
493 	struct rtl_phy *rtlphy = &rtlpriv->phy;
494 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
495 	bool rtstatus;
496 
497 	/* switch ant to BT */
498 	if (rtlpriv->rtlhal.interface == INTF_USB) {
499 		rtl_write_dword(rtlpriv, 0x948, 0x0);
500 	} else {
501 		if (rtlpriv->btcoexist.btc_info.single_ant_path == 0)
502 			rtl_write_dword(rtlpriv, 0x948, 0x280);
503 		else
504 			rtl_write_dword(rtlpriv, 0x948, 0x0);
505 	}
506 
507 	rtstatus = _rtl8723be_phy_config_bb_with_headerfile(hw,
508 						BASEBAND_CONFIG_PHY_REG);
509 	if (!rtstatus) {
510 		pr_err("Write BB Reg Fail!!\n");
511 		return false;
512 	}
513 	_rtl8723be_phy_init_tx_power_by_rate(hw);
514 	if (!rtlefuse->autoload_failflag) {
515 		rtlphy->pwrgroup_cnt = 0;
516 		rtstatus = _rtl8723be_phy_config_bb_with_pgheaderfile(hw,
517 						BASEBAND_CONFIG_PHY_REG);
518 	}
519 	phy_txpower_by_rate_config(hw);
520 	if (!rtstatus) {
521 		pr_err("BB_PG Reg Fail!!\n");
522 		return false;
523 	}
524 	rtstatus = _rtl8723be_phy_config_bb_with_headerfile(hw,
525 						BASEBAND_CONFIG_AGC_TAB);
526 	if (!rtstatus) {
527 		pr_err("AGC Table Fail\n");
528 		return false;
529 	}
530 	rtlphy->cck_high_power = (bool)(rtl_get_bbreg(hw,
531 						      RFPGA0_XA_HSSIPARAMETER2,
532 						      0x200));
533 	return true;
534 }
535 
536 static bool rtl8723be_phy_config_with_headerfile(struct ieee80211_hw *hw,
537 						 u32 *array_table,
538 						 u16 arraylen,
539 		void (*set_reg)(struct ieee80211_hw *hw, u32 regaddr, u32 data))
540 {
541 	#define COND_ELSE  2
542 	#define COND_ENDIF 3
543 
544 	int i = 0;
545 	u8 cond;
546 	bool matched = true, skipped = false;
547 
548 	while ((i + 1) < arraylen) {
549 		u32 v1 = array_table[i];
550 		u32 v2 = array_table[i + 1];
551 
552 		if (v1 & (BIT(31) | BIT(30))) {/*positive & negative condition*/
553 			if (v1 & BIT(31)) {/* positive condition*/
554 				cond  = (u8)((v1 & (BIT(29) | BIT(28))) >> 28);
555 				if (cond == COND_ENDIF) { /*end*/
556 					matched = true;
557 					skipped = false;
558 				} else if (cond == COND_ELSE) { /*else*/
559 					matched = skipped ? false : true;
560 				} else {/*if , else if*/
561 					if (skipped) {
562 						matched = false;
563 					} else {
564 						if (_rtl8723be_check_positive(
565 								hw, v1, v2)) {
566 							matched = true;
567 							skipped = true;
568 						} else {
569 							matched = false;
570 							skipped = false;
571 						}
572 					}
573 				}
574 			} else if (v1 & BIT(30)) { /*negative condition*/
575 			/*do nothing*/
576 			}
577 		} else {
578 			if (matched)
579 				set_reg(hw, v1, v2);
580 		}
581 		i = i + 2;
582 	}
583 
584 	return true;
585 }
586 
587 static bool _rtl8723be_phy_config_mac_with_headerfile(struct ieee80211_hw *hw)
588 {
589 	struct rtl_priv *rtlpriv = rtl_priv(hw);
590 
591 	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "Read rtl8723beMACPHY_Array\n");
592 
593 	return rtl8723be_phy_config_with_headerfile(hw,
594 			RTL8723BEMAC_1T_ARRAY, RTL8723BEMAC_1T_ARRAYLEN,
595 			rtl_write_byte_with_val32);
596 }
597 
598 static bool _rtl8723be_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
599 						     u8 configtype)
600 {
601 
602 	if (configtype == BASEBAND_CONFIG_PHY_REG)
603 		return rtl8723be_phy_config_with_headerfile(hw,
604 				RTL8723BEPHY_REG_1TARRAY,
605 				RTL8723BEPHY_REG_1TARRAYLEN,
606 				_rtl8723be_config_bb_reg);
607 	else if (configtype == BASEBAND_CONFIG_AGC_TAB)
608 		return rtl8723be_phy_config_with_headerfile(hw,
609 				RTL8723BEAGCTAB_1TARRAY,
610 				RTL8723BEAGCTAB_1TARRAYLEN,
611 				rtl_set_bbreg_with_dwmask);
612 
613 	return false;
614 }
615 
616 static u8 _rtl8723be_get_rate_section_index(u32 regaddr)
617 {
618 	u8 index = 0;
619 
620 	switch (regaddr) {
621 	case RTXAGC_A_RATE18_06:
622 		index = 0;
623 	break;
624 	case RTXAGC_A_RATE54_24:
625 		index = 1;
626 	break;
627 	case RTXAGC_A_CCK1_MCS32:
628 		index = 2;
629 	break;
630 	case RTXAGC_B_CCK11_A_CCK2_11:
631 		index = 3;
632 	break;
633 	case RTXAGC_A_MCS03_MCS00:
634 		index = 4;
635 	break;
636 	case RTXAGC_A_MCS07_MCS04:
637 		index = 5;
638 	break;
639 	case RTXAGC_A_MCS11_MCS08:
640 		index = 6;
641 	break;
642 	case RTXAGC_A_MCS15_MCS12:
643 		index = 7;
644 	break;
645 	case RTXAGC_B_RATE18_06:
646 		index = 0;
647 	break;
648 	case RTXAGC_B_RATE54_24:
649 		index = 1;
650 	break;
651 	case RTXAGC_B_CCK1_55_MCS32:
652 		index = 2;
653 	break;
654 	case RTXAGC_B_MCS03_MCS00:
655 		index = 4;
656 	break;
657 	case RTXAGC_B_MCS07_MCS04:
658 		index = 5;
659 	break;
660 	case RTXAGC_B_MCS11_MCS08:
661 		index = 6;
662 	break;
663 	case RTXAGC_B_MCS15_MCS12:
664 		index = 7;
665 	break;
666 	default:
667 		regaddr &= 0xFFF;
668 		if (regaddr >= 0xC20 && regaddr <= 0xC4C)
669 			index = (u8)((regaddr - 0xC20) / 4);
670 		else if (regaddr >= 0xE20 && regaddr <= 0xE4C)
671 			index = (u8)((regaddr - 0xE20) / 4);
672 		break;
673 	}
674 	return index;
675 }
676 
677 static void _rtl8723be_store_tx_power_by_rate(struct ieee80211_hw *hw,
678 					      u32 band, u32 rfpath,
679 					      u32 txnum, u32 regaddr,
680 					      u32 bitmask, u32 data)
681 {
682 	struct rtl_priv *rtlpriv = rtl_priv(hw);
683 	struct rtl_phy *rtlphy = &rtlpriv->phy;
684 	u8 rate_section = _rtl8723be_get_rate_section_index(regaddr);
685 
686 	if (band != BAND_ON_2_4G && band != BAND_ON_5G) {
687 		rtl_dbg(rtlpriv, FPHY, PHY_TXPWR, "Invalid Band %d\n", band);
688 		return;
689 	}
690 	if (rfpath > MAX_RF_PATH - 1) {
691 		rtl_dbg(rtlpriv, FPHY, PHY_TXPWR,
692 			"Invalid RfPath %d\n", rfpath);
693 		return;
694 	}
695 	if (txnum > MAX_RF_PATH - 1) {
696 		rtl_dbg(rtlpriv, FPHY, PHY_TXPWR, "Invalid TxNum %d\n", txnum);
697 		return;
698 	}
699 
700 	rtlphy->tx_power_by_rate_offset[band][rfpath][txnum][rate_section] =
701 									data;
702 
703 }
704 
705 static bool _rtl8723be_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
706 						       u8 configtype)
707 {
708 	struct rtl_priv *rtlpriv = rtl_priv(hw);
709 	int i;
710 	u32 *phy_regarray_table_pg;
711 	u16 phy_regarray_pg_len;
712 	u32 v1 = 0, v2 = 0, v3 = 0, v4 = 0, v5 = 0, v6 = 0;
713 
714 	phy_regarray_pg_len = RTL8723BEPHY_REG_ARRAY_PGLEN;
715 	phy_regarray_table_pg = RTL8723BEPHY_REG_ARRAY_PG;
716 
717 	if (configtype == BASEBAND_CONFIG_PHY_REG) {
718 		for (i = 0; i < phy_regarray_pg_len; i = i + 6) {
719 			v1 = phy_regarray_table_pg[i];
720 			v2 = phy_regarray_table_pg[i+1];
721 			v3 = phy_regarray_table_pg[i+2];
722 			v4 = phy_regarray_table_pg[i+3];
723 			v5 = phy_regarray_table_pg[i+4];
724 			v6 = phy_regarray_table_pg[i+5];
725 
726 			if (v1 < 0xcdcdcdcd) {
727 				if (phy_regarray_table_pg[i] == 0xfe ||
728 				    phy_regarray_table_pg[i] == 0xffe)
729 					mdelay(50);
730 				else
731 					_rtl8723be_store_tx_power_by_rate(hw,
732 							v1, v2, v3, v4, v5, v6);
733 				continue;
734 			}
735 		}
736 	} else {
737 		rtl_dbg(rtlpriv, COMP_SEND, DBG_TRACE,
738 			"configtype != BaseBand_Config_PHY_REG\n");
739 	}
740 	return true;
741 }
742 
743 bool rtl8723be_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
744 					     enum radio_path rfpath)
745 {
746 	struct rtl_priv *rtlpriv = rtl_priv(hw);
747 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
748 	bool ret = true;
749 
750 	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath);
751 	switch (rfpath) {
752 	case RF90_PATH_A:
753 		ret =  rtl8723be_phy_config_with_headerfile(hw,
754 				RTL8723BE_RADIOA_1TARRAY,
755 				RTL8723BE_RADIOA_1TARRAYLEN,
756 				_rtl8723be_config_rf_radio_a);
757 
758 		if (rtlhal->oem_id == RT_CID_819X_HP)
759 			_rtl8723be_config_rf_radio_a(hw, 0x52, 0x7E4BD);
760 		break;
761 	case RF90_PATH_B:
762 	case RF90_PATH_C:
763 		break;
764 	case RF90_PATH_D:
765 		rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
766 			"switch case %#x not processed\n", rfpath);
767 		break;
768 	}
769 	return ret;
770 }
771 
772 void rtl8723be_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
773 {
774 	struct rtl_priv *rtlpriv = rtl_priv(hw);
775 	struct rtl_phy *rtlphy = &rtlpriv->phy;
776 
777 	rtlphy->default_initialgain[0] =
778 	    (u8)rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
779 	rtlphy->default_initialgain[1] =
780 	    (u8)rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0);
781 	rtlphy->default_initialgain[2] =
782 	    (u8)rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0);
783 	rtlphy->default_initialgain[3] =
784 	    (u8)rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0);
785 
786 	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
787 		"Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n",
788 		rtlphy->default_initialgain[0],
789 		rtlphy->default_initialgain[1],
790 		rtlphy->default_initialgain[2],
791 		rtlphy->default_initialgain[3]);
792 
793 	rtlphy->framesync = (u8)rtl_get_bbreg(hw, ROFDM0_RXDETECTOR3,
794 					       MASKBYTE0);
795 	rtlphy->framesync_c34 = rtl_get_bbreg(hw, ROFDM0_RXDETECTOR2,
796 					      MASKDWORD);
797 
798 	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
799 		"Default framesync (0x%x) = 0x%x\n",
800 		ROFDM0_RXDETECTOR3, rtlphy->framesync);
801 }
802 
803 static u8 _rtl8723be_phy_get_ratesection_intxpower_byrate(enum radio_path path,
804 							  u8 rate)
805 {
806 	u8 rate_section = 0;
807 
808 	switch (rate) {
809 	case DESC92C_RATE1M:
810 		rate_section = 2;
811 		break;
812 
813 	case DESC92C_RATE2M:
814 	case DESC92C_RATE5_5M:
815 		if (path == RF90_PATH_A)
816 			rate_section = 3;
817 		else if (path == RF90_PATH_B)
818 			rate_section = 2;
819 		break;
820 
821 	case DESC92C_RATE11M:
822 		rate_section = 3;
823 		break;
824 
825 	case DESC92C_RATE6M:
826 	case DESC92C_RATE9M:
827 	case DESC92C_RATE12M:
828 	case DESC92C_RATE18M:
829 		rate_section = 0;
830 		break;
831 
832 	case DESC92C_RATE24M:
833 	case DESC92C_RATE36M:
834 	case DESC92C_RATE48M:
835 	case DESC92C_RATE54M:
836 		rate_section = 1;
837 		break;
838 
839 	case DESC92C_RATEMCS0:
840 	case DESC92C_RATEMCS1:
841 	case DESC92C_RATEMCS2:
842 	case DESC92C_RATEMCS3:
843 		rate_section = 4;
844 		break;
845 
846 	case DESC92C_RATEMCS4:
847 	case DESC92C_RATEMCS5:
848 	case DESC92C_RATEMCS6:
849 	case DESC92C_RATEMCS7:
850 		rate_section = 5;
851 		break;
852 
853 	case DESC92C_RATEMCS8:
854 	case DESC92C_RATEMCS9:
855 	case DESC92C_RATEMCS10:
856 	case DESC92C_RATEMCS11:
857 		rate_section = 6;
858 		break;
859 
860 	case DESC92C_RATEMCS12:
861 	case DESC92C_RATEMCS13:
862 	case DESC92C_RATEMCS14:
863 	case DESC92C_RATEMCS15:
864 		rate_section = 7;
865 		break;
866 
867 	default:
868 		WARN_ONCE(true, "rtl8723be: Rate_Section is Illegal\n");
869 		break;
870 	}
871 
872 	return rate_section;
873 }
874 
875 static u8 _rtl8723be_get_txpower_by_rate(struct ieee80211_hw *hw,
876 					 enum band_type band,
877 					 enum radio_path rfpath, u8 rate)
878 {
879 	struct rtl_priv *rtlpriv = rtl_priv(hw);
880 	struct rtl_phy *rtlphy = &rtlpriv->phy;
881 	u8 shift = 0, rate_section, tx_num;
882 	s8 tx_pwr_diff = 0;
883 
884 	rate_section = _rtl8723be_phy_get_ratesection_intxpower_byrate(rfpath,
885 								       rate);
886 	tx_num = RF_TX_NUM_NONIMPLEMENT;
887 
888 	if (tx_num == RF_TX_NUM_NONIMPLEMENT) {
889 		if (rate >= DESC92C_RATEMCS8 && rate <= DESC92C_RATEMCS15)
890 			tx_num = RF_2TX;
891 		else
892 			tx_num = RF_1TX;
893 	}
894 
895 	switch (rate) {
896 	case DESC92C_RATE6M:
897 	case DESC92C_RATE24M:
898 	case DESC92C_RATEMCS0:
899 	case DESC92C_RATEMCS4:
900 	case DESC92C_RATEMCS8:
901 	case DESC92C_RATEMCS12:
902 		shift = 0;
903 		break;
904 	case DESC92C_RATE1M:
905 	case DESC92C_RATE2M:
906 	case DESC92C_RATE9M:
907 	case DESC92C_RATE36M:
908 	case DESC92C_RATEMCS1:
909 	case DESC92C_RATEMCS5:
910 	case DESC92C_RATEMCS9:
911 	case DESC92C_RATEMCS13:
912 		shift = 8;
913 		break;
914 	case DESC92C_RATE5_5M:
915 	case DESC92C_RATE12M:
916 	case DESC92C_RATE48M:
917 	case DESC92C_RATEMCS2:
918 	case DESC92C_RATEMCS6:
919 	case DESC92C_RATEMCS10:
920 	case DESC92C_RATEMCS14:
921 		shift = 16;
922 		break;
923 	case DESC92C_RATE11M:
924 	case DESC92C_RATE18M:
925 	case DESC92C_RATE54M:
926 	case DESC92C_RATEMCS3:
927 	case DESC92C_RATEMCS7:
928 	case DESC92C_RATEMCS11:
929 	case DESC92C_RATEMCS15:
930 		shift = 24;
931 		break;
932 	default:
933 		WARN_ONCE(true, "rtl8723be: Rate_Section is Illegal\n");
934 		break;
935 	}
936 	tx_pwr_diff = (u8)(rtlphy->tx_power_by_rate_offset[band][rfpath][tx_num]
937 					  [rate_section] >> shift) & 0xff;
938 
939 	return	tx_pwr_diff;
940 }
941 
942 static u8 _rtl8723be_get_txpower_index(struct ieee80211_hw *hw, u8 path,
943 				       u8 rate, u8 bandwidth, u8 channel)
944 {
945 	struct rtl_priv *rtlpriv = rtl_priv(hw);
946 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
947 	u8 index = (channel - 1);
948 	u8 txpower = 0;
949 	u8 power_diff_byrate = 0;
950 
951 	if (channel > 14 || channel < 1) {
952 		index = 0;
953 		rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
954 			"Illegal channel!\n");
955 	}
956 	if (RX_HAL_IS_CCK_RATE(rate))
957 		txpower = rtlefuse->txpwrlevel_cck[path][index];
958 	else if (DESC92C_RATE6M <= rate)
959 		txpower = rtlefuse->txpwrlevel_ht40_1s[path][index];
960 	else
961 		rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
962 			"invalid rate\n");
963 
964 	if (DESC92C_RATE6M <= rate && rate <= DESC92C_RATE54M &&
965 	    !RX_HAL_IS_CCK_RATE(rate))
966 		txpower += rtlefuse->txpwr_legacyhtdiff[0][TX_1S];
967 
968 	if (bandwidth == HT_CHANNEL_WIDTH_20) {
969 		if (DESC92C_RATEMCS0 <= rate && rate <= DESC92C_RATEMCS15)
970 			txpower += rtlefuse->txpwr_ht20diff[0][TX_1S];
971 		if (DESC92C_RATEMCS8 <= rate && rate <= DESC92C_RATEMCS15)
972 			txpower += rtlefuse->txpwr_ht20diff[0][TX_2S];
973 	} else if (bandwidth == HT_CHANNEL_WIDTH_20_40) {
974 		if (DESC92C_RATEMCS0 <= rate && rate <= DESC92C_RATEMCS15)
975 			txpower += rtlefuse->txpwr_ht40diff[0][TX_1S];
976 		if (DESC92C_RATEMCS8 <= rate && rate <= DESC92C_RATEMCS15)
977 			txpower += rtlefuse->txpwr_ht40diff[0][TX_2S];
978 	}
979 
980 	if (rtlefuse->eeprom_regulatory != 2)
981 		power_diff_byrate = _rtl8723be_get_txpower_by_rate(hw,
982 								   BAND_ON_2_4G,
983 								   path, rate);
984 
985 	txpower += power_diff_byrate;
986 
987 	if (txpower > MAX_POWER_INDEX)
988 		txpower = MAX_POWER_INDEX;
989 
990 	return txpower;
991 }
992 
993 static void _rtl8723be_phy_set_txpower_index(struct ieee80211_hw *hw,
994 					     u8 power_index, u8 path, u8 rate)
995 {
996 	struct rtl_priv *rtlpriv = rtl_priv(hw);
997 	if (path == RF90_PATH_A) {
998 		switch (rate) {
999 		case DESC92C_RATE1M:
1000 			rtl8723_phy_set_bb_reg(hw, RTXAGC_A_CCK1_MCS32,
1001 					       MASKBYTE1, power_index);
1002 			break;
1003 		case DESC92C_RATE2M:
1004 			rtl8723_phy_set_bb_reg(hw, RTXAGC_B_CCK11_A_CCK2_11,
1005 					       MASKBYTE1, power_index);
1006 			break;
1007 		case DESC92C_RATE5_5M:
1008 			rtl8723_phy_set_bb_reg(hw, RTXAGC_B_CCK11_A_CCK2_11,
1009 					       MASKBYTE2, power_index);
1010 			break;
1011 		case DESC92C_RATE11M:
1012 			rtl8723_phy_set_bb_reg(hw, RTXAGC_B_CCK11_A_CCK2_11,
1013 					       MASKBYTE3, power_index);
1014 			break;
1015 
1016 		case DESC92C_RATE6M:
1017 			rtl8723_phy_set_bb_reg(hw, RTXAGC_A_RATE18_06,
1018 					       MASKBYTE0, power_index);
1019 			break;
1020 		case DESC92C_RATE9M:
1021 			rtl8723_phy_set_bb_reg(hw, RTXAGC_A_RATE18_06,
1022 					       MASKBYTE1, power_index);
1023 			break;
1024 		case DESC92C_RATE12M:
1025 			rtl8723_phy_set_bb_reg(hw, RTXAGC_A_RATE18_06,
1026 					       MASKBYTE2, power_index);
1027 			break;
1028 		case DESC92C_RATE18M:
1029 			rtl8723_phy_set_bb_reg(hw, RTXAGC_A_RATE18_06,
1030 					       MASKBYTE3, power_index);
1031 			break;
1032 
1033 		case DESC92C_RATE24M:
1034 			rtl8723_phy_set_bb_reg(hw, RTXAGC_A_RATE54_24,
1035 					       MASKBYTE0, power_index);
1036 			break;
1037 		case DESC92C_RATE36M:
1038 			rtl8723_phy_set_bb_reg(hw, RTXAGC_A_RATE54_24,
1039 					       MASKBYTE1, power_index);
1040 			break;
1041 		case DESC92C_RATE48M:
1042 			rtl8723_phy_set_bb_reg(hw, RTXAGC_A_RATE54_24,
1043 					       MASKBYTE2, power_index);
1044 			break;
1045 		case DESC92C_RATE54M:
1046 			rtl8723_phy_set_bb_reg(hw, RTXAGC_A_RATE54_24,
1047 					       MASKBYTE3, power_index);
1048 			break;
1049 
1050 		case DESC92C_RATEMCS0:
1051 			rtl8723_phy_set_bb_reg(hw, RTXAGC_A_MCS03_MCS00,
1052 					       MASKBYTE0, power_index);
1053 			break;
1054 		case DESC92C_RATEMCS1:
1055 			rtl8723_phy_set_bb_reg(hw, RTXAGC_A_MCS03_MCS00,
1056 					       MASKBYTE1, power_index);
1057 			break;
1058 		case DESC92C_RATEMCS2:
1059 			rtl8723_phy_set_bb_reg(hw, RTXAGC_A_MCS03_MCS00,
1060 					       MASKBYTE2, power_index);
1061 			break;
1062 		case DESC92C_RATEMCS3:
1063 			rtl8723_phy_set_bb_reg(hw, RTXAGC_A_MCS03_MCS00,
1064 					       MASKBYTE3, power_index);
1065 			break;
1066 
1067 		case DESC92C_RATEMCS4:
1068 			rtl8723_phy_set_bb_reg(hw, RTXAGC_A_MCS07_MCS04,
1069 					       MASKBYTE0, power_index);
1070 			break;
1071 		case DESC92C_RATEMCS5:
1072 			rtl8723_phy_set_bb_reg(hw, RTXAGC_A_MCS07_MCS04,
1073 					       MASKBYTE1, power_index);
1074 			break;
1075 		case DESC92C_RATEMCS6:
1076 			rtl8723_phy_set_bb_reg(hw, RTXAGC_A_MCS07_MCS04,
1077 					       MASKBYTE2, power_index);
1078 			break;
1079 		case DESC92C_RATEMCS7:
1080 			rtl8723_phy_set_bb_reg(hw, RTXAGC_A_MCS07_MCS04,
1081 					       MASKBYTE3, power_index);
1082 			break;
1083 
1084 		case DESC92C_RATEMCS8:
1085 			rtl8723_phy_set_bb_reg(hw, RTXAGC_A_MCS11_MCS08,
1086 					       MASKBYTE0, power_index);
1087 			break;
1088 		case DESC92C_RATEMCS9:
1089 			rtl8723_phy_set_bb_reg(hw, RTXAGC_A_MCS11_MCS08,
1090 					       MASKBYTE1, power_index);
1091 			break;
1092 		case DESC92C_RATEMCS10:
1093 			rtl8723_phy_set_bb_reg(hw, RTXAGC_A_MCS11_MCS08,
1094 					       MASKBYTE2, power_index);
1095 			break;
1096 		case DESC92C_RATEMCS11:
1097 			rtl8723_phy_set_bb_reg(hw, RTXAGC_A_MCS11_MCS08,
1098 					       MASKBYTE3, power_index);
1099 			break;
1100 
1101 		default:
1102 			rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, "Invalid Rate!!\n");
1103 			break;
1104 		}
1105 	} else {
1106 		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, "Invalid RFPath!!\n");
1107 	}
1108 }
1109 
1110 void rtl8723be_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
1111 {
1112 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1113 	static const u8 cck_rates[]  = {
1114 		DESC92C_RATE1M, DESC92C_RATE2M,
1115 		DESC92C_RATE5_5M, DESC92C_RATE11M
1116 	};
1117 	static const u8 ofdm_rates[]  = {
1118 		DESC92C_RATE6M, DESC92C_RATE9M,
1119 		DESC92C_RATE12M, DESC92C_RATE18M,
1120 		DESC92C_RATE24M, DESC92C_RATE36M,
1121 		DESC92C_RATE48M, DESC92C_RATE54M
1122 	};
1123 	static const u8 ht_rates_1t[]  = {
1124 		DESC92C_RATEMCS0, DESC92C_RATEMCS1,
1125 		DESC92C_RATEMCS2, DESC92C_RATEMCS3,
1126 		DESC92C_RATEMCS4, DESC92C_RATEMCS5,
1127 		DESC92C_RATEMCS6, DESC92C_RATEMCS7
1128 	};
1129 	u8 i;
1130 	u8 power_index;
1131 
1132 	if (!rtlefuse->txpwr_fromeprom)
1133 		return;
1134 
1135 	for (i = 0; i < ARRAY_SIZE(cck_rates); i++) {
1136 		power_index = _rtl8723be_get_txpower_index(hw, RF90_PATH_A,
1137 					cck_rates[i],
1138 					rtl_priv(hw)->phy.current_chan_bw,
1139 					channel);
1140 		_rtl8723be_phy_set_txpower_index(hw, power_index, RF90_PATH_A,
1141 						 cck_rates[i]);
1142 	}
1143 	for (i = 0; i < ARRAY_SIZE(ofdm_rates); i++) {
1144 		power_index = _rtl8723be_get_txpower_index(hw, RF90_PATH_A,
1145 					ofdm_rates[i],
1146 					rtl_priv(hw)->phy.current_chan_bw,
1147 					channel);
1148 		_rtl8723be_phy_set_txpower_index(hw, power_index, RF90_PATH_A,
1149 						 ofdm_rates[i]);
1150 	}
1151 	for (i = 0; i < ARRAY_SIZE(ht_rates_1t); i++) {
1152 		power_index = _rtl8723be_get_txpower_index(hw, RF90_PATH_A,
1153 					ht_rates_1t[i],
1154 					rtl_priv(hw)->phy.current_chan_bw,
1155 					channel);
1156 		_rtl8723be_phy_set_txpower_index(hw, power_index, RF90_PATH_A,
1157 						 ht_rates_1t[i]);
1158 	}
1159 }
1160 
1161 void rtl8723be_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
1162 {
1163 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1164 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1165 	enum io_type iotype;
1166 
1167 	if (!is_hal_stop(rtlhal)) {
1168 		switch (operation) {
1169 		case SCAN_OPT_BACKUP_BAND0:
1170 			iotype = IO_CMD_PAUSE_BAND0_DM_BY_SCAN;
1171 			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_IO_CMD,
1172 						      (u8 *)&iotype);
1173 
1174 			break;
1175 		case SCAN_OPT_RESTORE:
1176 			iotype = IO_CMD_RESUME_DM_BY_SCAN;
1177 			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_IO_CMD,
1178 						      (u8 *)&iotype);
1179 			break;
1180 		default:
1181 			pr_err("Unknown Scan Backup operation.\n");
1182 			break;
1183 		}
1184 	}
1185 }
1186 
1187 void rtl8723be_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
1188 {
1189 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1190 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1191 	struct rtl_phy *rtlphy = &rtlpriv->phy;
1192 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1193 	u8 reg_bw_opmode;
1194 	u8 reg_prsr_rsc;
1195 
1196 	rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE,
1197 		"Switch to %s bandwidth\n",
1198 		rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
1199 		"20MHz" : "40MHz");
1200 
1201 	if (is_hal_stop(rtlhal)) {
1202 		rtlphy->set_bwmode_inprogress = false;
1203 		return;
1204 	}
1205 
1206 	reg_bw_opmode = rtl_read_byte(rtlpriv, REG_BWOPMODE);
1207 	reg_prsr_rsc = rtl_read_byte(rtlpriv, REG_RRSR + 2);
1208 
1209 	switch (rtlphy->current_chan_bw) {
1210 	case HT_CHANNEL_WIDTH_20:
1211 		reg_bw_opmode |= BW_OPMODE_20MHZ;
1212 		rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
1213 		break;
1214 	case HT_CHANNEL_WIDTH_20_40:
1215 		reg_bw_opmode &= ~BW_OPMODE_20MHZ;
1216 		rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
1217 		reg_prsr_rsc = (reg_prsr_rsc & 0x90) |
1218 			       (mac->cur_40_prime_sc << 5);
1219 		rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_prsr_rsc);
1220 		break;
1221 	default:
1222 		pr_err("unknown bandwidth: %#X\n",
1223 		       rtlphy->current_chan_bw);
1224 		break;
1225 	}
1226 
1227 	switch (rtlphy->current_chan_bw) {
1228 	case HT_CHANNEL_WIDTH_20:
1229 		rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x0);
1230 		rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x0);
1231 	/*	rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 1);*/
1232 		break;
1233 	case HT_CHANNEL_WIDTH_20_40:
1234 		rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x1);
1235 		rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x1);
1236 
1237 		rtl_set_bbreg(hw, RCCK0_SYSTEM, BCCK_SIDEBAND,
1238 			      (mac->cur_40_prime_sc >> 1));
1239 		rtl_set_bbreg(hw, ROFDM1_LSTF, 0xC00, mac->cur_40_prime_sc);
1240 		/*rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 0);*/
1241 
1242 		rtl_set_bbreg(hw, 0x818, (BIT(26) | BIT(27)),
1243 			      (mac->cur_40_prime_sc ==
1244 			       HAL_PRIME_CHNL_OFFSET_LOWER) ? 2 : 1);
1245 		break;
1246 	default:
1247 		pr_err("unknown bandwidth: %#X\n",
1248 		       rtlphy->current_chan_bw);
1249 		break;
1250 	}
1251 	rtl8723be_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
1252 	rtlphy->set_bwmode_inprogress = false;
1253 	rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD, "\n");
1254 }
1255 
1256 void rtl8723be_phy_set_bw_mode(struct ieee80211_hw *hw,
1257 			    enum nl80211_channel_type ch_type)
1258 {
1259 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1260 	struct rtl_phy *rtlphy = &rtlpriv->phy;
1261 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1262 	u8 tmp_bw = rtlphy->current_chan_bw;
1263 
1264 	if (rtlphy->set_bwmode_inprogress)
1265 		return;
1266 	rtlphy->set_bwmode_inprogress = true;
1267 	if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
1268 		rtl8723be_phy_set_bw_mode_callback(hw);
1269 	} else {
1270 		rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
1271 			"false driver sleep or unload\n");
1272 		rtlphy->set_bwmode_inprogress = false;
1273 		rtlphy->current_chan_bw = tmp_bw;
1274 	}
1275 }
1276 
1277 void rtl8723be_phy_sw_chnl_callback(struct ieee80211_hw *hw)
1278 {
1279 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1280 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1281 	struct rtl_phy *rtlphy = &rtlpriv->phy;
1282 	u32 delay = 0;
1283 
1284 	rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE,
1285 		"switch to channel%d\n", rtlphy->current_channel);
1286 	if (is_hal_stop(rtlhal))
1287 		return;
1288 	do {
1289 		if (!rtlphy->sw_chnl_inprogress)
1290 			break;
1291 		if (!_rtl8723be_phy_sw_chnl_step_by_step(hw,
1292 							 rtlphy->current_channel,
1293 							 &rtlphy->sw_chnl_stage,
1294 							 &rtlphy->sw_chnl_step,
1295 							 &delay)) {
1296 			if (delay > 0)
1297 				mdelay(delay);
1298 			else
1299 				continue;
1300 		} else {
1301 			rtlphy->sw_chnl_inprogress = false;
1302 		}
1303 		break;
1304 	} while (true);
1305 	rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE, "\n");
1306 }
1307 
1308 u8 rtl8723be_phy_sw_chnl(struct ieee80211_hw *hw)
1309 {
1310 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1311 	struct rtl_phy *rtlphy = &rtlpriv->phy;
1312 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1313 
1314 	if (rtlphy->sw_chnl_inprogress)
1315 		return 0;
1316 	if (rtlphy->set_bwmode_inprogress)
1317 		return 0;
1318 	WARN_ONCE((rtlphy->current_channel > 14),
1319 		  "rtl8723be: WIRELESS_MODE_G but channel>14");
1320 	rtlphy->sw_chnl_inprogress = true;
1321 	rtlphy->sw_chnl_stage = 0;
1322 	rtlphy->sw_chnl_step = 0;
1323 	if (!(is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
1324 		rtl8723be_phy_sw_chnl_callback(hw);
1325 		rtl_dbg(rtlpriv, COMP_CHAN, DBG_LOUD,
1326 			"sw_chnl_inprogress false schedule workitem current channel %d\n",
1327 			rtlphy->current_channel);
1328 		rtlphy->sw_chnl_inprogress = false;
1329 	} else {
1330 		rtl_dbg(rtlpriv, COMP_CHAN, DBG_LOUD,
1331 			"sw_chnl_inprogress false driver sleep or unload\n");
1332 		rtlphy->sw_chnl_inprogress = false;
1333 	}
1334 	return 1;
1335 }
1336 
1337 static bool _rtl8723be_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
1338 						u8 channel, u8 *stage,
1339 						u8 *step, u32 *delay)
1340 {
1341 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1342 	struct rtl_phy *rtlphy = &rtlpriv->phy;
1343 	struct swchnlcmd precommoncmd[MAX_PRECMD_CNT];
1344 	u32 precommoncmdcnt;
1345 	struct swchnlcmd postcommoncmd[MAX_POSTCMD_CNT];
1346 	u32 postcommoncmdcnt;
1347 	struct swchnlcmd rfdependcmd[MAX_RFDEPENDCMD_CNT];
1348 	u32 rfdependcmdcnt;
1349 	struct swchnlcmd *currentcmd = NULL;
1350 	u8 rfpath;
1351 	u8 num_total_rfpath = rtlphy->num_total_rfpath;
1352 
1353 	precommoncmdcnt = 0;
1354 	rtl8723_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
1355 					 MAX_PRECMD_CNT,
1356 					 CMDID_SET_TXPOWEROWER_LEVEL,
1357 					 0, 0, 0);
1358 	rtl8723_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
1359 					 MAX_PRECMD_CNT, CMDID_END, 0, 0, 0);
1360 
1361 	postcommoncmdcnt = 0;
1362 
1363 	rtl8723_phy_set_sw_chnl_cmdarray(postcommoncmd, postcommoncmdcnt++,
1364 					 MAX_POSTCMD_CNT, CMDID_END,
1365 					    0, 0, 0);
1366 
1367 	rfdependcmdcnt = 0;
1368 
1369 	WARN_ONCE((channel < 1 || channel > 14),
1370 		  "rtl8723be: illegal channel for Zebra: %d\n", channel);
1371 
1372 	rtl8723_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
1373 					 MAX_RFDEPENDCMD_CNT,
1374 					 CMDID_RF_WRITEREG,
1375 					 RF_CHNLBW, channel, 10);
1376 
1377 	rtl8723_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
1378 					 MAX_RFDEPENDCMD_CNT,
1379 					    CMDID_END, 0, 0, 0);
1380 
1381 	do {
1382 		switch (*stage) {
1383 		case 0:
1384 			currentcmd = &precommoncmd[*step];
1385 			break;
1386 		case 1:
1387 			currentcmd = &rfdependcmd[*step];
1388 			break;
1389 		case 2:
1390 			currentcmd = &postcommoncmd[*step];
1391 			break;
1392 		default:
1393 			pr_err("Invalid 'stage' = %d, Check it!\n",
1394 			       *stage);
1395 			return true;
1396 		}
1397 
1398 		if (currentcmd->cmdid == CMDID_END) {
1399 			if ((*stage) == 2) {
1400 				return true;
1401 			} else {
1402 				(*stage)++;
1403 				(*step) = 0;
1404 				continue;
1405 			}
1406 		}
1407 
1408 		switch (currentcmd->cmdid) {
1409 		case CMDID_SET_TXPOWEROWER_LEVEL:
1410 			rtl8723be_phy_set_txpower_level(hw, channel);
1411 			break;
1412 		case CMDID_WRITEPORT_ULONG:
1413 			rtl_write_dword(rtlpriv, currentcmd->para1,
1414 					currentcmd->para2);
1415 			break;
1416 		case CMDID_WRITEPORT_USHORT:
1417 			rtl_write_word(rtlpriv, currentcmd->para1,
1418 				       (u16)currentcmd->para2);
1419 			break;
1420 		case CMDID_WRITEPORT_UCHAR:
1421 			rtl_write_byte(rtlpriv, currentcmd->para1,
1422 				       (u8)currentcmd->para2);
1423 			break;
1424 		case CMDID_RF_WRITEREG:
1425 			for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) {
1426 				rtlphy->rfreg_chnlval[rfpath] =
1427 				    ((rtlphy->rfreg_chnlval[rfpath] &
1428 				      0xfffffc00) | currentcmd->para2);
1429 
1430 				rtl_set_rfreg(hw, (enum radio_path)rfpath,
1431 					      currentcmd->para1,
1432 					      RFREG_OFFSET_MASK,
1433 					      rtlphy->rfreg_chnlval[rfpath]);
1434 			}
1435 			break;
1436 		default:
1437 			rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
1438 				"switch case %#x not processed\n",
1439 				currentcmd->cmdid);
1440 			break;
1441 		}
1442 
1443 		break;
1444 	} while (true);
1445 
1446 	(*delay) = currentcmd->msdelay;
1447 	(*step)++;
1448 	return false;
1449 }
1450 
1451 static u8 _rtl8723be_phy_path_a_iqk(struct ieee80211_hw *hw)
1452 {
1453 	u32 reg_eac, reg_e94, reg_e9c, tmp;
1454 	u8 result = 0x00;
1455 
1456 	/* leave IQK mode */
1457 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1458 	/* switch to path A */
1459 	rtl_set_bbreg(hw, 0x948, MASKDWORD, 0x00000000);
1460 	/* enable path A PA in TXIQK mode */
1461 	rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
1462 	rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK_OS, RFREG_OFFSET_MASK, 0x20000);
1463 	rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0003f);
1464 	rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xc7f87);
1465 
1466 	/* 1. TX IQK */
1467 	/* path-A IQK setting */
1468 	/* IQK setting */
1469 	rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
1470 	rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
1471 	/* path-A IQK setting */
1472 	rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
1473 	rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
1474 	rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1475 	rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1476 
1477 	rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x821403ea);
1478 	rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x28160000);
1479 	rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x82110000);
1480 	rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x28110000);
1481 	/* LO calibration setting */
1482 	rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x00462911);
1483 	/* enter IQK mode */
1484 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
1485 
1486 	/* One shot, path A LOK & IQK */
1487 	rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000);
1488 	rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
1489 
1490 	mdelay(IQK_DELAY_TIME);
1491 
1492 	/* leave IQK mode */
1493 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1494 
1495 	/* Check failed */
1496 	reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1497 	reg_e94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD);
1498 	reg_e9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD);
1499 
1500 	if (!(reg_eac & BIT(28)) &&
1501 	    (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
1502 	    (((reg_e9c & 0x03FF0000) >> 16) != 0x42))
1503 		result |= 0x01;
1504 	else /* if Tx not OK, ignore Rx */
1505 		return result;
1506 
1507 	/* Allen 20131125 */
1508 	tmp = (reg_e9c & 0x03FF0000) >> 16;
1509 	if ((tmp & 0x200) > 0)
1510 		tmp = 0x400 - tmp;
1511 
1512 	if (!(reg_eac & BIT(28)) &&
1513 	    (((reg_e94 & 0x03FF0000) >> 16) < 0x110) &&
1514 	    (((reg_e94 & 0x03FF0000) >> 16) > 0xf0) &&
1515 	    (tmp < 0xf))
1516 		result |= 0x01;
1517 	else /* if Tx not OK, ignore Rx */
1518 		return result;
1519 
1520 	return result;
1521 }
1522 
1523 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
1524 static u8 _rtl8723be_phy_path_a_rx_iqk(struct ieee80211_hw *hw)
1525 {
1526 	u32 reg_eac, reg_e94, reg_e9c, reg_ea4, u32tmp, tmp;
1527 	u8 result = 0x00;
1528 
1529 	/* leave IQK mode */
1530 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1531 
1532 	/* switch to path A */
1533 	rtl_set_bbreg(hw, 0x948, MASKDWORD, 0x00000000);
1534 
1535 	/* 1 Get TXIMR setting */
1536 	/* modify RXIQK mode table */
1537 	rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, 0x80000, 0x1);
1538 	rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
1539 	rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0001f);
1540 	/* LNA2 off, PA on for Dcut */
1541 	rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf7fb7);
1542 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
1543 
1544 	/* IQK setting */
1545 	rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
1546 	rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
1547 
1548 	/* path-A IQK setting */
1549 	rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
1550 	rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
1551 	rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1552 	rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1553 
1554 	rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82160ff0);
1555 	rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x28110000);
1556 	rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x82110000);
1557 	rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x28110000);
1558 
1559 	/* LO calibration setting */
1560 	rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a911);
1561 
1562 	/* enter IQK mode */
1563 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
1564 
1565 	/* One shot, path A LOK & IQK */
1566 	rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000);
1567 	rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
1568 
1569 	mdelay(IQK_DELAY_TIME);
1570 
1571 	/* leave IQK mode */
1572 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1573 
1574 	/* Check failed */
1575 	reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
1576 	reg_e94 = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_A, MASKDWORD);
1577 	reg_e9c = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A, MASKDWORD);
1578 
1579 	if (!(reg_eac & BIT(28)) &&
1580 	    (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
1581 	    (((reg_e9c & 0x03FF0000) >> 16) != 0x42))
1582 		result |= 0x01;
1583 	else /* if Tx not OK, ignore Rx */
1584 		return result;
1585 
1586 	/* Allen 20131125 */
1587 	tmp = (reg_e9c & 0x03FF0000) >> 16;
1588 	if ((tmp & 0x200) > 0)
1589 		tmp = 0x400 - tmp;
1590 
1591 	if (!(reg_eac & BIT(28)) &&
1592 	    (((reg_e94 & 0x03FF0000) >> 16) < 0x110) &&
1593 	    (((reg_e94 & 0x03FF0000) >> 16) > 0xf0) &&
1594 	    (tmp < 0xf))
1595 		result |= 0x01;
1596 	else /* if Tx not OK, ignore Rx */
1597 		return result;
1598 
1599 	u32tmp = 0x80007C00 | (reg_e94 & 0x3FF0000) |
1600 		 ((reg_e9c & 0x3FF0000) >> 16);
1601 	rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, u32tmp);
1602 
1603 	/* 1 RX IQK */
1604 	/* modify RXIQK mode table */
1605 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1606 	rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, 0x80000, 0x1);
1607 	rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
1608 	rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0001f);
1609 	/* LAN2 on, PA off for Dcut */
1610 	rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf7d77);
1611 
1612 	/* PA, PAD setting */
1613 	rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0xf80);
1614 	rtl_set_rfreg(hw, RF90_PATH_A, 0x55, RFREG_OFFSET_MASK, 0x4021f);
1615 
1616 	/* IQK setting */
1617 	rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
1618 
1619 	/* path-A IQK setting */
1620 	rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
1621 	rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
1622 	rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1623 	rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1624 
1625 	rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82110000);
1626 	rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x2816001f);
1627 	rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x82110000);
1628 	rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x28110000);
1629 
1630 	/* LO calibration setting */
1631 	rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a8d1);
1632 
1633 	/* enter IQK mode */
1634 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
1635 
1636 	/* One shot, path A LOK & IQK */
1637 	rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000);
1638 	rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
1639 
1640 	mdelay(IQK_DELAY_TIME);
1641 
1642 	/* leave IQK mode */
1643 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1644 
1645 	/* Check failed */
1646 	reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
1647 	reg_ea4 = rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_A_2, MASKDWORD);
1648 
1649 	/* leave IQK mode */
1650 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1651 	rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x780);
1652 
1653 	/* Allen 20131125 */
1654 	tmp = (reg_eac & 0x03FF0000) >> 16;
1655 	if ((tmp & 0x200) > 0)
1656 		tmp = 0x400 - tmp;
1657 	/* if Tx is OK, check whether Rx is OK */
1658 	if (!(reg_eac & BIT(27)) &&
1659 	    (((reg_ea4 & 0x03FF0000) >> 16) != 0x132) &&
1660 	    (((reg_eac & 0x03FF0000) >> 16) != 0x36))
1661 		result |= 0x02;
1662 	else if (!(reg_eac & BIT(27)) &&
1663 		 (((reg_ea4 & 0x03FF0000) >> 16) < 0x110) &&
1664 		 (((reg_ea4 & 0x03FF0000) >> 16) > 0xf0) &&
1665 		 (tmp < 0xf))
1666 		result |= 0x02;
1667 
1668 	return result;
1669 }
1670 
1671 static u8 _rtl8723be_phy_path_b_iqk(struct ieee80211_hw *hw)
1672 {
1673 	u32 reg_eac, reg_e94, reg_e9c, tmp;
1674 	u8 result = 0x00;
1675 
1676 	/* leave IQK mode */
1677 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1678 	/* switch to path B */
1679 	rtl_set_bbreg(hw, 0x948, MASKDWORD, 0x00000280);
1680 
1681 	/* enable path B PA in TXIQK mode */
1682 	rtl_set_rfreg(hw, RF90_PATH_A, 0xed, RFREG_OFFSET_MASK, 0x00020);
1683 	rtl_set_rfreg(hw, RF90_PATH_A, 0x43, RFREG_OFFSET_MASK, 0x40fc1);
1684 
1685 	/* 1 Tx IQK */
1686 	/* IQK setting */
1687 	rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
1688 	rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
1689 	/* path-A IQK setting */
1690 	rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
1691 	rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
1692 	rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1693 	rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1694 
1695 	rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x821403ea);
1696 	rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x28110000);
1697 	rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x82110000);
1698 	rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x28110000);
1699 
1700 	/* LO calibration setting */
1701 	rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x00462911);
1702 
1703 	/* enter IQK mode */
1704 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
1705 
1706 	/* One shot, path B LOK & IQK */
1707 	rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000);
1708 	rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
1709 
1710 	mdelay(IQK_DELAY_TIME);
1711 
1712 	/* leave IQK mode */
1713 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1714 
1715 	/* Check failed */
1716 	reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
1717 	reg_e94 = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_A, MASKDWORD);
1718 	reg_e9c = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A, MASKDWORD);
1719 
1720 	if (!(reg_eac & BIT(28)) &&
1721 	    (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
1722 	    (((reg_e9c & 0x03FF0000) >> 16) != 0x42))
1723 		result |= 0x01;
1724 	else
1725 		return result;
1726 
1727 	/* Allen 20131125 */
1728 	tmp = (reg_e9c & 0x03FF0000) >> 16;
1729 	if ((tmp & 0x200) > 0)
1730 		tmp = 0x400 - tmp;
1731 
1732 	if (!(reg_eac & BIT(28)) &&
1733 	    (((reg_e94 & 0x03FF0000) >> 16) < 0x110) &&
1734 	    (((reg_e94 & 0x03FF0000) >> 16) > 0xf0) &&
1735 	    (tmp < 0xf))
1736 		result |= 0x01;
1737 	else
1738 		return result;
1739 
1740 	return result;
1741 }
1742 
1743 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
1744 static u8 _rtl8723be_phy_path_b_rx_iqk(struct ieee80211_hw *hw)
1745 {
1746 	u32 reg_e94, reg_e9c, reg_ea4, reg_eac, u32tmp, tmp;
1747 	u8 result = 0x00;
1748 
1749 	/* leave IQK mode */
1750 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1751 	/* switch to path B */
1752 	rtl_set_bbreg(hw, 0x948, MASKDWORD, 0x00000280);
1753 
1754 	/* 1 Get TXIMR setting */
1755 	/* modify RXIQK mode table */
1756 	rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
1757 	rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
1758 	rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0001f);
1759 	rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf7ff7);
1760 
1761 	/* open PA S1 & SMIXER */
1762 	rtl_set_rfreg(hw, RF90_PATH_A, 0xed, RFREG_OFFSET_MASK, 0x00020);
1763 	rtl_set_rfreg(hw, RF90_PATH_A, 0x43, RFREG_OFFSET_MASK, 0x60fed);
1764 
1765 	/* IQK setting */
1766 	rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
1767 	rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
1768 
1769 	/* path-B IQK setting */
1770 	rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
1771 	rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
1772 	rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1773 	rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1774 
1775 	rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82160ff0);
1776 	rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x28110000);
1777 	rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x82110000);
1778 	rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x28110000);
1779 
1780 	/* LO calibration setting */
1781 	rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a911);
1782 	/* enter IQK mode */
1783 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
1784 
1785 	/* One shot, path B TXIQK @ RXIQK */
1786 	rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000);
1787 	rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
1788 
1789 	mdelay(IQK_DELAY_TIME);
1790 
1791 	/* leave IQK mode */
1792 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1793 	/* Check failed */
1794 	reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
1795 	reg_e94 = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_A, MASKDWORD);
1796 	reg_e9c = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A, MASKDWORD);
1797 
1798 	if (!(reg_eac & BIT(28)) &&
1799 	    (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
1800 	    (((reg_e9c & 0x03FF0000) >> 16) != 0x42))
1801 		result |= 0x01;
1802 	else	/* if Tx not OK, ignore Rx */
1803 		return result;
1804 
1805 	/* Allen 20131125 */
1806 	tmp = (reg_e9c & 0x03FF0000) >> 16;
1807 	if ((tmp & 0x200) > 0)
1808 		tmp = 0x400 - tmp;
1809 
1810 	if (!(reg_eac & BIT(28)) &&
1811 	    (((reg_e94 & 0x03FF0000) >> 16) < 0x110) &&
1812 	    (((reg_e94 & 0x03FF0000) >> 16) > 0xf0) &&
1813 	    (tmp < 0xf))
1814 		result |= 0x01;
1815 	else
1816 		return result;
1817 
1818 	u32tmp = 0x80007C00 | (reg_e94 & 0x3FF0000)  |
1819 		 ((reg_e9c & 0x3FF0000) >> 16);
1820 	rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, u32tmp);
1821 
1822 	/* 1 RX IQK */
1823 
1824 	/* <20121009, Kordan> RF Mode = 3 */
1825 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1826 	rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, 0x80000, 0x1);
1827 	rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
1828 	rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0001f);
1829 	rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf7d77);
1830 	rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, 0x80000, 0x0);
1831 
1832 	/* open PA S1 & close SMIXER */
1833 	rtl_set_rfreg(hw, RF90_PATH_A, 0xed, RFREG_OFFSET_MASK, 0x00020);
1834 	rtl_set_rfreg(hw, RF90_PATH_A, 0x43, RFREG_OFFSET_MASK, 0x60fbd);
1835 
1836 	/* IQK setting */
1837 	rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
1838 
1839 	/* path-B IQK setting */
1840 	rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
1841 	rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
1842 	rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1843 	rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1844 
1845 	rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82110000);
1846 	rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x2816001f);
1847 	rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x82110000);
1848 	rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x28110000);
1849 
1850 	/* LO calibration setting */
1851 	rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a8d1);
1852 	/* enter IQK mode */
1853 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
1854 
1855 	/* One shot, path B LOK & IQK */
1856 	rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000);
1857 	rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
1858 
1859 	mdelay(IQK_DELAY_TIME);
1860 
1861 	/* leave IQK mode */
1862 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1863 	/* Check failed */
1864 	reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
1865 	reg_ea4 = rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_A_2, MASKDWORD);
1866 
1867 	/* Allen 20131125 */
1868 	tmp = (reg_eac & 0x03FF0000) >> 16;
1869 	if ((tmp & 0x200) > 0)
1870 		tmp = 0x400 - tmp;
1871 
1872 	/* if Tx is OK, check whether Rx is OK */
1873 	if (!(reg_eac & BIT(27)) &&
1874 	    (((reg_ea4 & 0x03FF0000) >> 16) != 0x132) &&
1875 	    (((reg_eac & 0x03FF0000) >> 16) != 0x36))
1876 		result |= 0x02;
1877 	else if (!(reg_eac & BIT(27)) &&
1878 		 (((reg_ea4 & 0x03FF0000) >> 16) < 0x110) &&
1879 		 (((reg_ea4 & 0x03FF0000) >> 16) > 0xf0) &&
1880 		 (tmp < 0xf))
1881 		result |= 0x02;
1882 	else
1883 		return result;
1884 
1885 	return result;
1886 }
1887 
1888 static void _rtl8723be_phy_path_b_fill_iqk_matrix(struct ieee80211_hw *hw,
1889 						  bool b_iqk_ok,
1890 						  long result[][8],
1891 						  u8 final_candidate,
1892 						  bool btxonly)
1893 {
1894 	u32 oldval_1, x, tx1_a, reg;
1895 	long y, tx1_c;
1896 
1897 	if (final_candidate == 0xFF) {
1898 		return;
1899 	} else if (b_iqk_ok) {
1900 		oldval_1 = (rtl_get_bbreg(hw, ROFDM0_XBTXIQIMBALANCE,
1901 					  MASKDWORD) >> 22) & 0x3FF;
1902 		x = result[final_candidate][4];
1903 		if ((x & 0x00000200) != 0)
1904 			x = x | 0xFFFFFC00;
1905 		tx1_a = (x * oldval_1) >> 8;
1906 		rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 0x3FF, tx1_a);
1907 		rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(27),
1908 			      ((x * oldval_1 >> 7) & 0x1));
1909 		y = result[final_candidate][5];
1910 		if ((y & 0x00000200) != 0)
1911 			y = y | 0xFFFFFC00;
1912 		tx1_c = (y * oldval_1) >> 8;
1913 		rtl_set_bbreg(hw, ROFDM0_XDTXAFE, 0xF0000000,
1914 			      ((tx1_c & 0x3C0) >> 6));
1915 		rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 0x003F0000,
1916 			      (tx1_c & 0x3F));
1917 		rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(25),
1918 			      ((y * oldval_1 >> 7) & 0x1));
1919 		if (btxonly)
1920 			return;
1921 		reg = result[final_candidate][6];
1922 		rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0x3FF, reg);
1923 		reg = result[final_candidate][7] & 0x3F;
1924 		rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0xFC00, reg);
1925 		reg = (result[final_candidate][7] >> 6) & 0xF;
1926 		/* rtl_set_bbreg(hw, 0xca0, 0xF0000000, reg); */
1927 	}
1928 }
1929 
1930 static bool _rtl8723be_phy_simularity_compare(struct ieee80211_hw *hw,
1931 					      long result[][8], u8 c1, u8 c2)
1932 {
1933 	u32 i, j, diff, simularity_bitmap, bound = 0;
1934 
1935 	u8 final_candidate[2] = {0xFF, 0xFF}; /* for path A and path B */
1936 	bool bresult = true; /* is2t = true*/
1937 	s32 tmp1 = 0, tmp2 = 0;
1938 
1939 	bound = 8;
1940 
1941 	simularity_bitmap = 0;
1942 
1943 	for (i = 0; i < bound; i++) {
1944 		if ((i == 1) || (i == 3) || (i == 5) || (i == 7)) {
1945 			if ((result[c1][i] & 0x00000200) != 0)
1946 				tmp1 = result[c1][i] | 0xFFFFFC00;
1947 			else
1948 				tmp1 = result[c1][i];
1949 
1950 			if ((result[c2][i] & 0x00000200) != 0)
1951 				tmp2 = result[c2][i] | 0xFFFFFC00;
1952 			else
1953 				tmp2 = result[c2][i];
1954 		} else {
1955 			tmp1 = result[c1][i];
1956 			tmp2 = result[c2][i];
1957 		}
1958 
1959 		diff = (tmp1 > tmp2) ? (tmp1 - tmp2) : (tmp2 - tmp1);
1960 
1961 		if (diff > MAX_TOLERANCE) {
1962 			if ((i == 2 || i == 6) && !simularity_bitmap) {
1963 				if (result[c1][i] + result[c1][i + 1] == 0)
1964 					final_candidate[(i / 4)] = c2;
1965 				else if (result[c2][i] + result[c2][i + 1] == 0)
1966 					final_candidate[(i / 4)] = c1;
1967 				else
1968 					simularity_bitmap |= (1 << i);
1969 			} else
1970 				simularity_bitmap |= (1 << i);
1971 		}
1972 	}
1973 
1974 	if (simularity_bitmap == 0) {
1975 		for (i = 0; i < (bound / 4); i++) {
1976 			if (final_candidate[i] != 0xFF) {
1977 				for (j = i * 4; j < (i + 1) * 4 - 2; j++)
1978 					result[3][j] =
1979 						result[final_candidate[i]][j];
1980 				bresult = false;
1981 			}
1982 		}
1983 		return bresult;
1984 	} else {
1985 		if (!(simularity_bitmap & 0x03)) { /* path A TX OK */
1986 			for (i = 0; i < 2; i++)
1987 				result[3][i] = result[c1][i];
1988 		}
1989 		if (!(simularity_bitmap & 0x0c)) { /* path A RX OK */
1990 			for (i = 2; i < 4; i++)
1991 				result[3][i] = result[c1][i];
1992 		}
1993 		if (!(simularity_bitmap & 0x30)) { /* path B TX OK */
1994 			for (i = 4; i < 6; i++)
1995 				result[3][i] = result[c1][i];
1996 		}
1997 		if (!(simularity_bitmap & 0xc0)) { /* path B RX OK */
1998 			for (i = 6; i < 8; i++)
1999 				result[3][i] = result[c1][i];
2000 		}
2001 		return false;
2002 	}
2003 }
2004 
2005 static void _rtl8723be_phy_iq_calibrate(struct ieee80211_hw *hw,
2006 					long result[][8], u8 t, bool is2t)
2007 {
2008 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2009 	struct rtl_phy *rtlphy = &rtlpriv->phy;
2010 	u32 i;
2011 	u8 patha_ok, pathb_ok;
2012 	u32 adda_reg[IQK_ADDA_REG_NUM] = {
2013 		0x85c, 0xe6c, 0xe70, 0xe74,
2014 		0xe78, 0xe7c, 0xe80, 0xe84,
2015 		0xe88, 0xe8c, 0xed0, 0xed4,
2016 		0xed8, 0xedc, 0xee0, 0xeec
2017 	};
2018 
2019 	u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
2020 		0x522, 0x550, 0x551, 0x040
2021 	};
2022 	u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
2023 		ROFDM0_TRXPATHENABLE, ROFDM0_TRMUXPAR,
2024 		RFPGA0_XCD_RFINTERFACESW, 0xb68, 0xb6c,
2025 		0x870, 0x860,
2026 		0x864, 0xa04
2027 	};
2028 	const u32 retrycount = 2;
2029 
2030 	u32 path_sel_bb;/* path_sel_rf */
2031 
2032 	u8 tmp_reg_c50, tmp_reg_c58;
2033 
2034 	tmp_reg_c50 = rtl_get_bbreg(hw, 0xc50, MASKBYTE0);
2035 	tmp_reg_c58 = rtl_get_bbreg(hw, 0xc58, MASKBYTE0);
2036 
2037 	if (t == 0) {
2038 		rtl8723_save_adda_registers(hw, adda_reg,
2039 					    rtlphy->adda_backup, 16);
2040 		rtl8723_phy_save_mac_registers(hw, iqk_mac_reg,
2041 					       rtlphy->iqk_mac_backup);
2042 		rtl8723_save_adda_registers(hw, iqk_bb_reg,
2043 					    rtlphy->iqk_bb_backup,
2044 					    IQK_BB_REG_NUM);
2045 	}
2046 	rtl8723_phy_path_adda_on(hw, adda_reg, true, is2t);
2047 	if (t == 0) {
2048 		rtlphy->rfpi_enable = (u8)rtl_get_bbreg(hw,
2049 						RFPGA0_XA_HSSIPARAMETER1,
2050 						BIT(8));
2051 	}
2052 
2053 	path_sel_bb = rtl_get_bbreg(hw, 0x948, MASKDWORD);
2054 
2055 	rtl8723_phy_mac_setting_calibration(hw, iqk_mac_reg,
2056 					    rtlphy->iqk_mac_backup);
2057 	/*BB Setting*/
2058 	rtl_set_bbreg(hw, 0xa04, 0x0f000000, 0xf);
2059 	rtl_set_bbreg(hw, 0xc04, MASKDWORD, 0x03a05600);
2060 	rtl_set_bbreg(hw, 0xc08, MASKDWORD, 0x000800e4);
2061 	rtl_set_bbreg(hw, 0x874, MASKDWORD, 0x22204000);
2062 
2063 	/* path A TX IQK */
2064 	for (i = 0; i < retrycount; i++) {
2065 		patha_ok = _rtl8723be_phy_path_a_iqk(hw);
2066 		if (patha_ok == 0x01) {
2067 			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2068 				"Path A Tx IQK Success!!\n");
2069 			result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
2070 					0x3FF0000) >> 16;
2071 			result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
2072 					0x3FF0000) >> 16;
2073 			break;
2074 		} else {
2075 			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2076 				"Path A Tx IQK Fail!!\n");
2077 		}
2078 	}
2079 	/* path A RX IQK */
2080 	for (i = 0; i < retrycount; i++) {
2081 		patha_ok = _rtl8723be_phy_path_a_rx_iqk(hw);
2082 		if (patha_ok == 0x03) {
2083 			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2084 				"Path A Rx IQK Success!!\n");
2085 			result[t][2] = (rtl_get_bbreg(hw, 0xea4, MASKDWORD) &
2086 					0x3FF0000) >> 16;
2087 			result[t][3] = (rtl_get_bbreg(hw, 0xeac, MASKDWORD) &
2088 					0x3FF0000) >> 16;
2089 			break;
2090 		}
2091 		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2092 			"Path A Rx IQK Fail!!\n");
2093 	}
2094 
2095 	if (0x00 == patha_ok)
2096 		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "Path A IQK Fail!!\n");
2097 
2098 	if (is2t) {
2099 		/* path B TX IQK */
2100 		for (i = 0; i < retrycount; i++) {
2101 			pathb_ok = _rtl8723be_phy_path_b_iqk(hw);
2102 			if (pathb_ok == 0x01) {
2103 				rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2104 					"Path B Tx IQK Success!!\n");
2105 				result[t][4] = (rtl_get_bbreg(hw, 0xe94,
2106 							      MASKDWORD) &
2107 							      0x3FF0000) >> 16;
2108 				result[t][5] = (rtl_get_bbreg(hw, 0xe9c,
2109 							      MASKDWORD) &
2110 							      0x3FF0000) >> 16;
2111 				break;
2112 			}
2113 			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2114 				"Path B Tx IQK Fail!!\n");
2115 		}
2116 		/* path B RX IQK */
2117 		for (i = 0; i < retrycount; i++) {
2118 			pathb_ok = _rtl8723be_phy_path_b_rx_iqk(hw);
2119 			if (pathb_ok == 0x03) {
2120 				rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2121 					"Path B Rx IQK Success!!\n");
2122 				result[t][6] = (rtl_get_bbreg(hw, 0xea4,
2123 							      MASKDWORD) &
2124 							      0x3FF0000) >> 16;
2125 				result[t][7] = (rtl_get_bbreg(hw, 0xeac,
2126 							      MASKDWORD) &
2127 							      0x3FF0000) >> 16;
2128 				break;
2129 			}
2130 			rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2131 				"Path B Rx IQK Fail!!\n");
2132 		}
2133 	}
2134 
2135 	/* Back to BB mode, load original value */
2136 	rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0);
2137 
2138 	if (t != 0) {
2139 		rtl8723_phy_reload_adda_registers(hw, adda_reg,
2140 						  rtlphy->adda_backup, 16);
2141 		rtl8723_phy_reload_mac_registers(hw, iqk_mac_reg,
2142 						 rtlphy->iqk_mac_backup);
2143 		rtl8723_phy_reload_adda_registers(hw, iqk_bb_reg,
2144 						  rtlphy->iqk_bb_backup,
2145 						  IQK_BB_REG_NUM);
2146 
2147 		rtl_set_bbreg(hw, 0x948, MASKDWORD, path_sel_bb);
2148 		/*rtl_set_rfreg(hw, RF90_PATH_B, 0xb0, 0xfffff, path_sel_rf);*/
2149 
2150 		rtl_set_bbreg(hw, 0xc50, MASKBYTE0, 0x50);
2151 		rtl_set_bbreg(hw, 0xc50, MASKBYTE0, tmp_reg_c50);
2152 		if (is2t) {
2153 			rtl_set_bbreg(hw, 0xc58, MASKBYTE0, 0x50);
2154 			rtl_set_bbreg(hw, 0xc58, MASKBYTE0, tmp_reg_c58);
2155 		}
2156 		rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x01008c00);
2157 		rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x01008c00);
2158 	}
2159 	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "8723be IQK Finish!!\n");
2160 }
2161 
2162 static u8 _get_right_chnl_place_for_iqk(u8 chnl)
2163 {
2164 	static const u8 channel_all[TARGET_CHNL_NUM_2G_5G] = {
2165 		1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
2166 		13, 14, 36, 38, 40, 42, 44, 46,
2167 		48, 50, 52, 54, 56, 58, 60, 62, 64,
2168 		100, 102, 104, 106, 108, 110,
2169 		112, 114, 116, 118, 120, 122,
2170 		124, 126, 128, 130, 132, 134, 136,
2171 		138, 140, 149, 151, 153, 155, 157,
2172 		159, 161, 163, 165
2173 	};
2174 	u8 place = chnl;
2175 
2176 	if (chnl > 14) {
2177 		for (place = 14; place < sizeof(channel_all); place++) {
2178 			if (channel_all[place] == chnl)
2179 				return place - 13;
2180 		}
2181 	}
2182 	return 0;
2183 }
2184 
2185 static void _rtl8723be_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
2186 {
2187 	u8 tmpreg;
2188 	u32 rf_a_mode = 0, rf_b_mode = 0;
2189 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2190 
2191 	tmpreg = rtl_read_byte(rtlpriv, 0xd03);
2192 
2193 	if ((tmpreg & 0x70) != 0)
2194 		rtl_write_byte(rtlpriv, 0xd03, tmpreg & 0x8F);
2195 	else
2196 		rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
2197 
2198 	if ((tmpreg & 0x70) != 0) {
2199 		rf_a_mode = rtl_get_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS);
2200 
2201 		if (is2t)
2202 			rf_b_mode = rtl_get_rfreg(hw, RF90_PATH_B, 0x00,
2203 						  MASK12BITS);
2204 
2205 		rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS,
2206 			      (rf_a_mode & 0x8FFFF) | 0x10000);
2207 
2208 		if (is2t)
2209 			rtl_set_rfreg(hw, RF90_PATH_B, 0x00, MASK12BITS,
2210 				      (rf_b_mode & 0x8FFFF) | 0x10000);
2211 	}
2212 	rtl_get_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS);
2213 
2214 	rtl_set_rfreg(hw, RF90_PATH_A, 0xb0, RFREG_OFFSET_MASK, 0xdfbe0);
2215 	rtl_set_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS, 0x8c0a);
2216 
2217 	/* In order not to disturb BT music when wifi init.(1ant NIC only) */
2218 	/*mdelay(100);*/
2219 	/* In order not to disturb BT music when wifi init.(1ant NIC only) */
2220 	mdelay(50);
2221 
2222 	rtl_set_rfreg(hw, RF90_PATH_A, 0xb0, RFREG_OFFSET_MASK, 0xdffe0);
2223 
2224 	if ((tmpreg & 0x70) != 0) {
2225 		rtl_write_byte(rtlpriv, 0xd03, tmpreg);
2226 		rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS, rf_a_mode);
2227 
2228 		if (is2t)
2229 			rtl_set_rfreg(hw, RF90_PATH_B, 0x00,
2230 				      MASK12BITS, rf_b_mode);
2231 	} else {
2232 		rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
2233 	}
2234 	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "\n");
2235 }
2236 
2237 static void _rtl8723be_phy_set_rfpath_switch(struct ieee80211_hw *hw,
2238 					     bool bmain, bool is2t)
2239 {
2240 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2241 	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "\n");
2242 
2243 	if (bmain) /* left antenna */
2244 		rtl_set_bbreg(hw, 0x92C, MASKDWORD, 0x1);
2245 	else
2246 		rtl_set_bbreg(hw, 0x92C, MASKDWORD, 0x2);
2247 }
2248 
2249 #undef IQK_ADDA_REG_NUM
2250 #undef IQK_DELAY_TIME
2251 /* IQK is merge from Merge Temp */
2252 void rtl8723be_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery)
2253 {
2254 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2255 	struct rtl_phy *rtlphy = &rtlpriv->phy;
2256 	long result[4][8];
2257 	u8 i, final_candidate, idx;
2258 	bool b_patha_ok, b_pathb_ok;
2259 	long reg_e94, reg_e9c, reg_ea4, reg_eb4, reg_ebc, reg_ec4;
2260 	long reg_tmp = 0;
2261 	bool is12simular, is13simular, is23simular;
2262 	u32 iqk_bb_reg[9] = {
2263 		ROFDM0_XARXIQIMBALANCE,
2264 		ROFDM0_XBRXIQIMBALANCE,
2265 		ROFDM0_ECCATHRESHOLD,
2266 		ROFDM0_AGCRSSITABLE,
2267 		ROFDM0_XATXIQIMBALANCE,
2268 		ROFDM0_XBTXIQIMBALANCE,
2269 		ROFDM0_XCTXAFE,
2270 		ROFDM0_XDTXAFE,
2271 		ROFDM0_RXIQEXTANTA
2272 	};
2273 	u32 path_sel_bb = 0; /* path_sel_rf = 0 */
2274 
2275 	if (rtlphy->lck_inprogress)
2276 		return;
2277 
2278 	spin_lock(&rtlpriv->locks.iqk_lock);
2279 	rtlphy->lck_inprogress = true;
2280 	spin_unlock(&rtlpriv->locks.iqk_lock);
2281 
2282 	if (b_recovery) {
2283 		rtl8723_phy_reload_adda_registers(hw, iqk_bb_reg,
2284 						  rtlphy->iqk_bb_backup, 9);
2285 		goto label_done;
2286 	}
2287 	/* Save RF Path */
2288 	path_sel_bb = rtl_get_bbreg(hw, 0x948, MASKDWORD);
2289 	/* path_sel_rf = rtl_get_rfreg(hw, RF90_PATH_A, 0xb0, 0xfffff); */
2290 
2291 	for (i = 0; i < 8; i++) {
2292 		result[0][i] = 0;
2293 		result[1][i] = 0;
2294 		result[2][i] = 0;
2295 		result[3][i] = 0;
2296 	}
2297 	final_candidate = 0xff;
2298 	b_patha_ok = false;
2299 	b_pathb_ok = false;
2300 	is12simular = false;
2301 	is23simular = false;
2302 	is13simular = false;
2303 	for (i = 0; i < 3; i++) {
2304 		_rtl8723be_phy_iq_calibrate(hw, result, i, true);
2305 		if (i == 1) {
2306 			is12simular = _rtl8723be_phy_simularity_compare(hw,
2307 									result,
2308 									0, 1);
2309 			if (is12simular) {
2310 				final_candidate = 0;
2311 				break;
2312 			}
2313 		}
2314 		if (i == 2) {
2315 			is13simular = _rtl8723be_phy_simularity_compare(hw,
2316 									result,
2317 									0, 2);
2318 			if (is13simular) {
2319 				final_candidate = 0;
2320 				break;
2321 			}
2322 			is23simular = _rtl8723be_phy_simularity_compare(hw,
2323 									result,
2324 									1, 2);
2325 			if (is23simular) {
2326 				final_candidate = 1;
2327 			} else {
2328 				for (i = 0; i < 8; i++)
2329 					reg_tmp += result[3][i];
2330 
2331 				if (reg_tmp != 0)
2332 					final_candidate = 3;
2333 				else
2334 					final_candidate = 0xFF;
2335 			}
2336 		}
2337 	}
2338 	for (i = 0; i < 4; i++) {
2339 		reg_e94 = result[i][0];
2340 		reg_e9c = result[i][1];
2341 		reg_ea4 = result[i][2];
2342 		reg_eb4 = result[i][4];
2343 		reg_ebc = result[i][5];
2344 		reg_ec4 = result[i][6];
2345 	}
2346 	if (final_candidate != 0xff) {
2347 		reg_e94 = result[final_candidate][0];
2348 		rtlphy->reg_e94 = reg_e94;
2349 		reg_e9c = result[final_candidate][1];
2350 		rtlphy->reg_e9c = reg_e9c;
2351 		reg_ea4 = result[final_candidate][2];
2352 		reg_eb4 = result[final_candidate][4];
2353 		rtlphy->reg_eb4 = reg_eb4;
2354 		reg_ebc = result[final_candidate][5];
2355 		rtlphy->reg_ebc = reg_ebc;
2356 		reg_ec4 = result[final_candidate][6];
2357 		b_patha_ok = true;
2358 		b_pathb_ok = true;
2359 	} else {
2360 		rtlphy->reg_e94 = 0x100;
2361 		rtlphy->reg_eb4 = 0x100;
2362 		rtlphy->reg_e9c = 0x0;
2363 		rtlphy->reg_ebc = 0x0;
2364 	}
2365 	if (reg_e94 != 0)
2366 		rtl8723_phy_path_a_fill_iqk_matrix(hw, b_patha_ok, result,
2367 						   final_candidate,
2368 						   (reg_ea4 == 0));
2369 	if (reg_eb4 != 0)
2370 		_rtl8723be_phy_path_b_fill_iqk_matrix(hw, b_pathb_ok, result,
2371 						      final_candidate,
2372 						      (reg_ec4 == 0));
2373 
2374 	idx = _get_right_chnl_place_for_iqk(rtlphy->current_channel);
2375 
2376 	if (final_candidate < 4) {
2377 		for (i = 0; i < IQK_MATRIX_REG_NUM; i++)
2378 			rtlphy->iqk_matrix[idx].value[0][i] =
2379 						result[final_candidate][i];
2380 		rtlphy->iqk_matrix[idx].iqk_done = true;
2381 
2382 	}
2383 	rtl8723_save_adda_registers(hw, iqk_bb_reg,
2384 				    rtlphy->iqk_bb_backup, 9);
2385 
2386 	rtl_set_bbreg(hw, 0x948, MASKDWORD, path_sel_bb);
2387 	/* rtl_set_rfreg(hw, RF90_PATH_A, 0xb0, 0xfffff, path_sel_rf); */
2388 
2389 label_done:
2390 	spin_lock(&rtlpriv->locks.iqk_lock);
2391 	rtlphy->lck_inprogress = false;
2392 	spin_unlock(&rtlpriv->locks.iqk_lock);
2393 }
2394 
2395 void rtl8723be_phy_lc_calibrate(struct ieee80211_hw *hw)
2396 {
2397 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2398 	struct rtl_phy *rtlphy = &rtlpriv->phy;
2399 	struct rtl_hal *rtlhal = &rtlpriv->rtlhal;
2400 	u32 timeout = 2000, timecount = 0;
2401 
2402 	while (rtlpriv->mac80211.act_scanning && timecount < timeout) {
2403 		udelay(50);
2404 		timecount += 50;
2405 	}
2406 
2407 	rtlphy->lck_inprogress = true;
2408 	RTPRINT(rtlpriv, FINIT, INIT_IQK,
2409 		"LCK:Start!!! currentband %x delay %d ms\n",
2410 		 rtlhal->current_bandtype, timecount);
2411 
2412 	_rtl8723be_phy_lc_calibrate(hw, false);
2413 
2414 	rtlphy->lck_inprogress = false;
2415 }
2416 
2417 void rtl8723be_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain)
2418 {
2419 	_rtl8723be_phy_set_rfpath_switch(hw, bmain, true);
2420 }
2421 
2422 bool rtl8723be_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
2423 {
2424 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2425 	struct rtl_phy *rtlphy = &rtlpriv->phy;
2426 	bool b_postprocessing = false;
2427 
2428 	rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
2429 		"-->IO Cmd(%#x), set_io_inprogress(%d)\n",
2430 		iotype, rtlphy->set_io_inprogress);
2431 	do {
2432 		switch (iotype) {
2433 		case IO_CMD_RESUME_DM_BY_SCAN:
2434 			rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
2435 				"[IO CMD] Resume DM after scan.\n");
2436 			b_postprocessing = true;
2437 			break;
2438 		case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
2439 			rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
2440 				"[IO CMD] Pause DM before scan.\n");
2441 			b_postprocessing = true;
2442 			break;
2443 		default:
2444 			rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
2445 				"switch case %#x not processed\n", iotype);
2446 			break;
2447 		}
2448 	} while (false);
2449 	if (b_postprocessing && !rtlphy->set_io_inprogress) {
2450 		rtlphy->set_io_inprogress = true;
2451 		rtlphy->current_io_type = iotype;
2452 	} else {
2453 		return false;
2454 	}
2455 	rtl8723be_phy_set_io(hw);
2456 	rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE, "IO Type(%#x)\n", iotype);
2457 	return true;
2458 }
2459 
2460 static void rtl8723be_phy_set_io(struct ieee80211_hw *hw)
2461 {
2462 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2463 	struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
2464 	struct rtl_phy *rtlphy = &rtlpriv->phy;
2465 
2466 	rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
2467 		"--->Cmd(%#x), set_io_inprogress(%d)\n",
2468 		rtlphy->current_io_type, rtlphy->set_io_inprogress);
2469 	switch (rtlphy->current_io_type) {
2470 	case IO_CMD_RESUME_DM_BY_SCAN:
2471 		dm_digtable->cur_igvalue = rtlphy->initgain_backup.xaagccore1;
2472 		/*rtl92c_dm_write_dig(hw);*/
2473 		rtl8723be_phy_set_txpower_level(hw, rtlphy->current_channel);
2474 		rtl_set_bbreg(hw, RCCK0_CCA, 0xff0000, 0x83);
2475 		break;
2476 	case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
2477 		rtlphy->initgain_backup.xaagccore1 = dm_digtable->cur_igvalue;
2478 		dm_digtable->cur_igvalue = 0x17;
2479 		rtl_set_bbreg(hw, RCCK0_CCA, 0xff0000, 0x40);
2480 		break;
2481 	default:
2482 		rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
2483 			"switch case %#x not processed\n",
2484 			rtlphy->current_io_type);
2485 		break;
2486 	}
2487 	rtlphy->set_io_inprogress = false;
2488 	rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
2489 		"(%#x)\n", rtlphy->current_io_type);
2490 }
2491 
2492 static void rtl8723be_phy_set_rf_on(struct ieee80211_hw *hw)
2493 {
2494 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2495 
2496 	rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b);
2497 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
2498 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
2499 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
2500 	rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
2501 }
2502 
2503 static void _rtl8723be_phy_set_rf_sleep(struct ieee80211_hw *hw)
2504 {
2505 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2506 
2507 	rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
2508 	rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
2509 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
2510 	rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22);
2511 }
2512 
2513 static bool _rtl8723be_phy_set_rf_power_state(struct ieee80211_hw *hw,
2514 					      enum rf_pwrstate rfpwr_state)
2515 {
2516 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2517 	struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
2518 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2519 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
2520 	bool bresult = true;
2521 	u8 i, queue_id;
2522 	struct rtl8192_tx_ring *ring = NULL;
2523 
2524 	switch (rfpwr_state) {
2525 	case ERFON:
2526 		if ((ppsc->rfpwr_state == ERFOFF) &&
2527 		     RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
2528 			bool rtstatus;
2529 			u32 initializecount = 0;
2530 			do {
2531 				initializecount++;
2532 				rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
2533 					"IPS Set eRf nic enable\n");
2534 				rtstatus = rtl_ps_enable_nic(hw);
2535 			} while (!rtstatus && (initializecount < 10));
2536 			RT_CLEAR_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
2537 		} else {
2538 			rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
2539 				"Set ERFON slept:%d ms\n",
2540 				jiffies_to_msecs(jiffies -
2541 						 ppsc->last_sleep_jiffies));
2542 			ppsc->last_awake_jiffies = jiffies;
2543 			rtl8723be_phy_set_rf_on(hw);
2544 		}
2545 		if (mac->link_state == MAC80211_LINKED)
2546 			rtlpriv->cfg->ops->led_control(hw, LED_CTL_LINK);
2547 		else
2548 			rtlpriv->cfg->ops->led_control(hw, LED_CTL_NO_LINK);
2549 
2550 		break;
2551 
2552 	case ERFOFF:
2553 		for (queue_id = 0, i = 0;
2554 		     queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
2555 			ring = &pcipriv->dev.tx_ring[queue_id];
2556 			/* Don't check BEACON Q.
2557 			 * BEACON Q is always not empty,
2558 			 * because '_rtl8723be_cmd_send_packet'
2559 			 */
2560 			if (queue_id == BEACON_QUEUE ||
2561 			    skb_queue_len(&ring->queue) == 0) {
2562 				queue_id++;
2563 				continue;
2564 			} else {
2565 				rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
2566 					"eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
2567 					(i + 1), queue_id,
2568 					skb_queue_len(&ring->queue));
2569 
2570 				udelay(10);
2571 				i++;
2572 			}
2573 			if (i >= MAX_DOZE_WAITING_TIMES_9x) {
2574 				rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
2575 					"ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
2576 					MAX_DOZE_WAITING_TIMES_9x,
2577 					queue_id,
2578 					skb_queue_len(&ring->queue));
2579 				break;
2580 			}
2581 		}
2582 
2583 		if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
2584 			rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
2585 				"IPS Set eRf nic disable\n");
2586 			rtl_ps_disable_nic(hw);
2587 			RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
2588 		} else {
2589 			if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) {
2590 				rtlpriv->cfg->ops->led_control(hw,
2591 							       LED_CTL_NO_LINK);
2592 			} else {
2593 				rtlpriv->cfg->ops->led_control(hw,
2594 							     LED_CTL_POWER_OFF);
2595 			}
2596 		}
2597 		break;
2598 
2599 	case ERFSLEEP:
2600 		if (ppsc->rfpwr_state == ERFOFF)
2601 			break;
2602 		for (queue_id = 0, i = 0;
2603 		     queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
2604 			ring = &pcipriv->dev.tx_ring[queue_id];
2605 			if (skb_queue_len(&ring->queue) == 0) {
2606 				queue_id++;
2607 				continue;
2608 			} else {
2609 				rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
2610 					"eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
2611 					(i + 1), queue_id,
2612 					skb_queue_len(&ring->queue));
2613 
2614 				udelay(10);
2615 				i++;
2616 			}
2617 			if (i >= MAX_DOZE_WAITING_TIMES_9x) {
2618 				rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
2619 					"ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
2620 					MAX_DOZE_WAITING_TIMES_9x,
2621 					queue_id,
2622 					skb_queue_len(&ring->queue));
2623 				break;
2624 			}
2625 		}
2626 		rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
2627 			"Set ERFSLEEP awaked:%d ms\n",
2628 			jiffies_to_msecs(jiffies -
2629 					 ppsc->last_awake_jiffies));
2630 		ppsc->last_sleep_jiffies = jiffies;
2631 		_rtl8723be_phy_set_rf_sleep(hw);
2632 		break;
2633 
2634 	default:
2635 		rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
2636 			"switch case %#x not processed\n", rfpwr_state);
2637 		bresult = false;
2638 		break;
2639 	}
2640 	if (bresult)
2641 		ppsc->rfpwr_state = rfpwr_state;
2642 	return bresult;
2643 }
2644 
2645 bool rtl8723be_phy_set_rf_power_state(struct ieee80211_hw *hw,
2646 				      enum rf_pwrstate rfpwr_state)
2647 {
2648 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
2649 
2650 	bool bresult = false;
2651 
2652 	if (rfpwr_state == ppsc->rfpwr_state)
2653 		return bresult;
2654 	bresult = _rtl8723be_phy_set_rf_power_state(hw, rfpwr_state);
2655 	return bresult;
2656 }
2657