xref: /linux/drivers/net/wireless/realtek/rtlwifi/rtl8192d/phy_common.c (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2009-2012  Realtek Corporation.*/
3 
4 #include "../wifi.h"
5 #include "../core.h"
6 #include "def.h"
7 #include "reg.h"
8 #include "dm_common.h"
9 #include "phy_common.h"
10 #include "rf_common.h"
11 
12 static const u8 channel_all[59] = {
13 	1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
14 	36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
15 	60, 62, 64, 100, 102, 104, 106, 108, 110, 112,
16 	114, 116, 118, 120, 122, 124, 126, 128,	130,
17 	132, 134, 136, 138, 140, 149, 151, 153, 155,
18 	157, 159, 161, 163, 165
19 };
20 
21 static u32 _rtl92d_phy_rf_serial_read(struct ieee80211_hw *hw,
22 				      enum radio_path rfpath, u32 offset)
23 {
24 	struct rtl_priv *rtlpriv = rtl_priv(hw);
25 	struct rtl_phy *rtlphy = &rtlpriv->phy;
26 	struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
27 	u32 newoffset;
28 	u32 tmplong, tmplong2;
29 	u8 rfpi_enable = 0;
30 	u32 retvalue;
31 
32 	newoffset = offset;
33 	tmplong = rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD);
34 	if (rfpath == RF90_PATH_A)
35 		tmplong2 = tmplong;
36 	else
37 		tmplong2 = rtl_get_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD);
38 	tmplong2 = (tmplong2 & (~BLSSIREADADDRESS)) |
39 		(newoffset << 23) | BLSSIREADEDGE;
40 	rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
41 		      tmplong & (~BLSSIREADEDGE));
42 	udelay(10);
43 	rtl_set_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD, tmplong2);
44 	udelay(100);
45 	rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
46 		      tmplong | BLSSIREADEDGE);
47 	udelay(10);
48 	if (rfpath == RF90_PATH_A)
49 		rfpi_enable = (u8)rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1,
50 						BIT(8));
51 	else if (rfpath == RF90_PATH_B)
52 		rfpi_enable = (u8)rtl_get_bbreg(hw, RFPGA0_XB_HSSIPARAMETER1,
53 						BIT(8));
54 	if (rfpi_enable)
55 		retvalue = rtl_get_bbreg(hw, pphyreg->rf_rbpi,
56 					 BLSSIREADBACKDATA);
57 	else
58 		retvalue = rtl_get_bbreg(hw, pphyreg->rf_rb,
59 					 BLSSIREADBACKDATA);
60 	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, "RFR-%d Addr[0x%x] = 0x%x\n",
61 		rfpath, pphyreg->rf_rb, retvalue);
62 	return retvalue;
63 }
64 
65 static void _rtl92d_phy_rf_serial_write(struct ieee80211_hw *hw,
66 					enum radio_path rfpath,
67 					u32 offset, u32 data)
68 {
69 	struct rtl_priv *rtlpriv = rtl_priv(hw);
70 	struct rtl_phy *rtlphy = &rtlpriv->phy;
71 	struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
72 	u32 data_and_addr;
73 	u32 newoffset;
74 
75 	newoffset = offset;
76 	/* T65 RF */
77 	data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff;
78 	rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr);
79 	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, "RFW-%d Addr[0x%x]=0x%x\n",
80 		rfpath, pphyreg->rf3wire_offset, data_and_addr);
81 }
82 
83 u32 rtl92d_phy_query_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,
84 			    u32 regaddr, u32 bitmask)
85 {
86 	struct rtl_priv *rtlpriv = rtl_priv(hw);
87 	u32 original_value, readback_value, bitshift;
88 
89 	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
90 		"regaddr(%#x), rfpath(%#x), bitmask(%#x)\n",
91 		regaddr, rfpath, bitmask);
92 	rtl92d_pci_lock(rtlpriv);
93 	original_value = _rtl92d_phy_rf_serial_read(hw, rfpath, regaddr);
94 	bitshift = calculate_bit_shift(bitmask);
95 	readback_value = (original_value & bitmask) >> bitshift;
96 	rtl92d_pci_unlock(rtlpriv);
97 	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
98 		"regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n",
99 		regaddr, rfpath, bitmask, original_value);
100 	return readback_value;
101 }
102 EXPORT_SYMBOL_GPL(rtl92d_phy_query_rf_reg);
103 
104 void rtl92d_phy_set_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,
105 			   u32 regaddr, u32 bitmask, u32 data)
106 {
107 	struct rtl_priv *rtlpriv = rtl_priv(hw);
108 	struct rtl_phy *rtlphy = &rtlpriv->phy;
109 	u32 original_value, bitshift;
110 
111 	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
112 		"regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
113 		regaddr, bitmask, data, rfpath);
114 	if (bitmask == 0)
115 		return;
116 	rtl92d_pci_lock(rtlpriv);
117 	if (rtlphy->rf_mode != RF_OP_BY_FW) {
118 		if (bitmask != RFREG_OFFSET_MASK) {
119 			original_value = _rtl92d_phy_rf_serial_read(hw,
120 								    rfpath,
121 								    regaddr);
122 			bitshift = calculate_bit_shift(bitmask);
123 			data = ((original_value & (~bitmask)) |
124 				(data << bitshift));
125 		}
126 		_rtl92d_phy_rf_serial_write(hw, rfpath, regaddr, data);
127 	}
128 	rtl92d_pci_unlock(rtlpriv);
129 	rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
130 		"regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
131 		regaddr, bitmask, data, rfpath);
132 }
133 EXPORT_SYMBOL_GPL(rtl92d_phy_set_rf_reg);
134 
135 void rtl92d_phy_init_bb_rf_register_definition(struct ieee80211_hw *hw)
136 {
137 	struct rtl_priv *rtlpriv = rtl_priv(hw);
138 	struct rtl_phy *rtlphy = &rtlpriv->phy;
139 
140 	/* RF Interface Sowrtware Control */
141 	/* 16 LSBs if read 32-bit from 0x870 */
142 	rtlphy->phyreg_def[RF90_PATH_A].rfintfs = RFPGA0_XAB_RFINTERFACESW;
143 	/* 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872) */
144 	rtlphy->phyreg_def[RF90_PATH_B].rfintfs = RFPGA0_XAB_RFINTERFACESW;
145 	/* 16 LSBs if read 32-bit from 0x874 */
146 	rtlphy->phyreg_def[RF90_PATH_C].rfintfs = RFPGA0_XCD_RFINTERFACESW;
147 	/* 16 MSBs if read 32-bit from 0x874 (16-bit for 0x876) */
148 
149 	rtlphy->phyreg_def[RF90_PATH_D].rfintfs = RFPGA0_XCD_RFINTERFACESW;
150 	/* RF Interface Readback Value */
151 	/* 16 LSBs if read 32-bit from 0x8E0 */
152 	rtlphy->phyreg_def[RF90_PATH_A].rfintfi = RFPGA0_XAB_RFINTERFACERB;
153 	/* 16 MSBs if read 32-bit from 0x8E0 (16-bit for 0x8E2) */
154 	rtlphy->phyreg_def[RF90_PATH_B].rfintfi = RFPGA0_XAB_RFINTERFACERB;
155 	/* 16 LSBs if read 32-bit from 0x8E4 */
156 	rtlphy->phyreg_def[RF90_PATH_C].rfintfi = RFPGA0_XCD_RFINTERFACERB;
157 	/* 16 MSBs if read 32-bit from 0x8E4 (16-bit for 0x8E6) */
158 	rtlphy->phyreg_def[RF90_PATH_D].rfintfi = RFPGA0_XCD_RFINTERFACERB;
159 
160 	/* RF Interface Output (and Enable) */
161 	/* 16 LSBs if read 32-bit from 0x860 */
162 	rtlphy->phyreg_def[RF90_PATH_A].rfintfo = RFPGA0_XA_RFINTERFACEOE;
163 	/* 16 LSBs if read 32-bit from 0x864 */
164 	rtlphy->phyreg_def[RF90_PATH_B].rfintfo = RFPGA0_XB_RFINTERFACEOE;
165 
166 	/* RF Interface (Output and)  Enable */
167 	/* 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862) */
168 	rtlphy->phyreg_def[RF90_PATH_A].rfintfe = RFPGA0_XA_RFINTERFACEOE;
169 	/* 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866) */
170 	rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE;
171 
172 	/* Addr of LSSI. Write RF register by driver */
173 	/* LSSI Parameter */
174 	rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset =
175 				 RFPGA0_XA_LSSIPARAMETER;
176 	rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset =
177 				 RFPGA0_XB_LSSIPARAMETER;
178 
179 	/* RF parameter */
180 	/* BB Band Select */
181 	rtlphy->phyreg_def[RF90_PATH_A].rflssi_select = RFPGA0_XAB_RFPARAMETER;
182 	rtlphy->phyreg_def[RF90_PATH_B].rflssi_select = RFPGA0_XAB_RFPARAMETER;
183 	rtlphy->phyreg_def[RF90_PATH_C].rflssi_select = RFPGA0_XCD_RFPARAMETER;
184 	rtlphy->phyreg_def[RF90_PATH_D].rflssi_select = RFPGA0_XCD_RFPARAMETER;
185 
186 	/* Tx AGC Gain Stage (same for all path. Should we remove this?) */
187 	/* Tx gain stage */
188 	rtlphy->phyreg_def[RF90_PATH_A].rftxgain_stage = RFPGA0_TXGAINSTAGE;
189 	/* Tx gain stage */
190 	rtlphy->phyreg_def[RF90_PATH_B].rftxgain_stage = RFPGA0_TXGAINSTAGE;
191 	/* Tx gain stage */
192 	rtlphy->phyreg_def[RF90_PATH_C].rftxgain_stage = RFPGA0_TXGAINSTAGE;
193 	/* Tx gain stage */
194 	rtlphy->phyreg_def[RF90_PATH_D].rftxgain_stage = RFPGA0_TXGAINSTAGE;
195 
196 	/* Transceiver A~D HSSI Parameter-1 */
197 	/* wire control parameter1 */
198 	rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para1 = RFPGA0_XA_HSSIPARAMETER1;
199 	/* wire control parameter1 */
200 	rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para1 = RFPGA0_XB_HSSIPARAMETER1;
201 
202 	/* Transceiver A~D HSSI Parameter-2 */
203 	/* wire control parameter2 */
204 	rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para2 = RFPGA0_XA_HSSIPARAMETER2;
205 	/* wire control parameter2 */
206 	rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para2 = RFPGA0_XB_HSSIPARAMETER2;
207 
208 	/* RF switch Control */
209 	/* TR/Ant switch control */
210 	rtlphy->phyreg_def[RF90_PATH_A].rfsw_ctrl = RFPGA0_XAB_SWITCHCONTROL;
211 	rtlphy->phyreg_def[RF90_PATH_B].rfsw_ctrl = RFPGA0_XAB_SWITCHCONTROL;
212 	rtlphy->phyreg_def[RF90_PATH_C].rfsw_ctrl = RFPGA0_XCD_SWITCHCONTROL;
213 	rtlphy->phyreg_def[RF90_PATH_D].rfsw_ctrl = RFPGA0_XCD_SWITCHCONTROL;
214 
215 	/* AGC control 1 */
216 	rtlphy->phyreg_def[RF90_PATH_A].rfagc_control1 = ROFDM0_XAAGCCORE1;
217 	rtlphy->phyreg_def[RF90_PATH_B].rfagc_control1 = ROFDM0_XBAGCCORE1;
218 	rtlphy->phyreg_def[RF90_PATH_C].rfagc_control1 = ROFDM0_XCAGCCORE1;
219 	rtlphy->phyreg_def[RF90_PATH_D].rfagc_control1 = ROFDM0_XDAGCCORE1;
220 
221 	/* AGC control 2  */
222 	rtlphy->phyreg_def[RF90_PATH_A].rfagc_control2 = ROFDM0_XAAGCCORE2;
223 	rtlphy->phyreg_def[RF90_PATH_B].rfagc_control2 = ROFDM0_XBAGCCORE2;
224 	rtlphy->phyreg_def[RF90_PATH_C].rfagc_control2 = ROFDM0_XCAGCCORE2;
225 	rtlphy->phyreg_def[RF90_PATH_D].rfagc_control2 = ROFDM0_XDAGCCORE2;
226 
227 	/* RX AFE control 1 */
228 	rtlphy->phyreg_def[RF90_PATH_A].rfrxiq_imbal = ROFDM0_XARXIQIMBALANCE;
229 	rtlphy->phyreg_def[RF90_PATH_B].rfrxiq_imbal = ROFDM0_XBRXIQIMBALANCE;
230 	rtlphy->phyreg_def[RF90_PATH_C].rfrxiq_imbal = ROFDM0_XCRXIQIMBALANCE;
231 	rtlphy->phyreg_def[RF90_PATH_D].rfrxiq_imbal = ROFDM0_XDRXIQIMBALANCE;
232 
233 	/*RX AFE control 1 */
234 	rtlphy->phyreg_def[RF90_PATH_A].rfrx_afe = ROFDM0_XARXAFE;
235 	rtlphy->phyreg_def[RF90_PATH_B].rfrx_afe = ROFDM0_XBRXAFE;
236 	rtlphy->phyreg_def[RF90_PATH_C].rfrx_afe = ROFDM0_XCRXAFE;
237 	rtlphy->phyreg_def[RF90_PATH_D].rfrx_afe = ROFDM0_XDRXAFE;
238 
239 	/* Tx AFE control 1 */
240 	rtlphy->phyreg_def[RF90_PATH_A].rftxiq_imbal = ROFDM0_XATXIQIMBALANCE;
241 	rtlphy->phyreg_def[RF90_PATH_B].rftxiq_imbal = ROFDM0_XBTXIQIMBALANCE;
242 	rtlphy->phyreg_def[RF90_PATH_C].rftxiq_imbal = ROFDM0_XCTXIQIMBALANCE;
243 	rtlphy->phyreg_def[RF90_PATH_D].rftxiq_imbal = ROFDM0_XDTXIQIMBALANCE;
244 
245 	/* Tx AFE control 2 */
246 	rtlphy->phyreg_def[RF90_PATH_A].rftx_afe = ROFDM0_XATXAFE;
247 	rtlphy->phyreg_def[RF90_PATH_B].rftx_afe = ROFDM0_XBTXAFE;
248 	rtlphy->phyreg_def[RF90_PATH_C].rftx_afe = ROFDM0_XCTXAFE;
249 	rtlphy->phyreg_def[RF90_PATH_D].rftx_afe = ROFDM0_XDTXAFE;
250 
251 	/* Transceiver LSSI Readback SI mode */
252 	rtlphy->phyreg_def[RF90_PATH_A].rf_rb = RFPGA0_XA_LSSIREADBACK;
253 	rtlphy->phyreg_def[RF90_PATH_B].rf_rb = RFPGA0_XB_LSSIREADBACK;
254 	rtlphy->phyreg_def[RF90_PATH_C].rf_rb = RFPGA0_XC_LSSIREADBACK;
255 	rtlphy->phyreg_def[RF90_PATH_D].rf_rb = RFPGA0_XD_LSSIREADBACK;
256 
257 	/* Transceiver LSSI Readback PI mode */
258 	rtlphy->phyreg_def[RF90_PATH_A].rf_rbpi = TRANSCEIVERA_HSPI_READBACK;
259 	rtlphy->phyreg_def[RF90_PATH_B].rf_rbpi = TRANSCEIVERB_HSPI_READBACK;
260 }
261 EXPORT_SYMBOL_GPL(rtl92d_phy_init_bb_rf_register_definition);
262 
263 void rtl92d_store_pwrindex_diffrate_offset(struct ieee80211_hw *hw,
264 					   u32 regaddr, u32 bitmask, u32 data)
265 {
266 	struct rtl_priv *rtlpriv = rtl_priv(hw);
267 	struct rtl_phy *rtlphy = &rtlpriv->phy;
268 	int index;
269 
270 	if (regaddr == RTXAGC_A_RATE18_06)
271 		index = 0;
272 	else if (regaddr == RTXAGC_A_RATE54_24)
273 		index = 1;
274 	else if (regaddr == RTXAGC_A_CCK1_MCS32)
275 		index = 6;
276 	else if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0xffffff00)
277 		index = 7;
278 	else if (regaddr == RTXAGC_A_MCS03_MCS00)
279 		index = 2;
280 	else if (regaddr == RTXAGC_A_MCS07_MCS04)
281 		index = 3;
282 	else if (regaddr == RTXAGC_A_MCS11_MCS08)
283 		index = 4;
284 	else if (regaddr == RTXAGC_A_MCS15_MCS12)
285 		index = 5;
286 	else if (regaddr == RTXAGC_B_RATE18_06)
287 		index = 8;
288 	else if (regaddr == RTXAGC_B_RATE54_24)
289 		index = 9;
290 	else if (regaddr == RTXAGC_B_CCK1_55_MCS32)
291 		index = 14;
292 	else if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0x000000ff)
293 		index = 15;
294 	else if (regaddr == RTXAGC_B_MCS03_MCS00)
295 		index = 10;
296 	else if (regaddr == RTXAGC_B_MCS07_MCS04)
297 		index = 11;
298 	else if (regaddr == RTXAGC_B_MCS11_MCS08)
299 		index = 12;
300 	else if (regaddr == RTXAGC_B_MCS15_MCS12)
301 		index = 13;
302 	else
303 		return;
304 
305 	rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][index] = data;
306 	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
307 		"MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n",
308 		rtlphy->pwrgroup_cnt, index,
309 		rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][index]);
310 	if (index == 13)
311 		rtlphy->pwrgroup_cnt++;
312 }
313 EXPORT_SYMBOL_GPL(rtl92d_store_pwrindex_diffrate_offset);
314 
315 void rtl92d_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
316 {
317 	struct rtl_priv *rtlpriv = rtl_priv(hw);
318 	struct rtl_phy *rtlphy = &rtlpriv->phy;
319 
320 	rtlphy->default_initialgain[0] =
321 	    rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
322 	rtlphy->default_initialgain[1] =
323 	    rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0);
324 	rtlphy->default_initialgain[2] =
325 	    rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0);
326 	rtlphy->default_initialgain[3] =
327 	    rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0);
328 	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
329 		"Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n",
330 		rtlphy->default_initialgain[0],
331 		rtlphy->default_initialgain[1],
332 		rtlphy->default_initialgain[2],
333 		rtlphy->default_initialgain[3]);
334 	rtlphy->framesync = rtl_get_bbreg(hw, ROFDM0_RXDETECTOR3, MASKBYTE0);
335 	rtlphy->framesync_c34 = rtl_get_bbreg(hw, ROFDM0_RXDETECTOR2, MASKDWORD);
336 	rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
337 		"Default framesync (0x%x) = 0x%x\n",
338 		ROFDM0_RXDETECTOR3, rtlphy->framesync);
339 }
340 EXPORT_SYMBOL_GPL(rtl92d_phy_get_hw_reg_originalvalue);
341 
342 static void _rtl92d_get_txpower_index(struct ieee80211_hw *hw, u8 channel,
343 				      u8 *cckpowerlevel, u8 *ofdmpowerlevel)
344 {
345 	struct rtl_priv *rtlpriv = rtl_priv(hw);
346 	struct rtl_phy *rtlphy = &rtlpriv->phy;
347 	struct rtl_hal *rtlhal = &rtlpriv->rtlhal;
348 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
349 	u8 index = channel - 1;
350 
351 	/* 1. CCK */
352 	if (rtlhal->current_bandtype == BAND_ON_2_4G) {
353 		/* RF-A */
354 		cckpowerlevel[RF90_PATH_A] =
355 				 rtlefuse->txpwrlevel_cck[RF90_PATH_A][index];
356 		/* RF-B */
357 		cckpowerlevel[RF90_PATH_B] =
358 				 rtlefuse->txpwrlevel_cck[RF90_PATH_B][index];
359 	} else {
360 		cckpowerlevel[RF90_PATH_A] = 0;
361 		cckpowerlevel[RF90_PATH_B] = 0;
362 	}
363 	/* 2. OFDM for 1S or 2S */
364 	if (rtlphy->rf_type == RF_1T2R || rtlphy->rf_type == RF_1T1R) {
365 		/*  Read HT 40 OFDM TX power */
366 		ofdmpowerlevel[RF90_PATH_A] =
367 		    rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_A][index];
368 		ofdmpowerlevel[RF90_PATH_B] =
369 		    rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_B][index];
370 	} else if (rtlphy->rf_type == RF_2T2R) {
371 		/* Read HT 40 OFDM TX power */
372 		ofdmpowerlevel[RF90_PATH_A] =
373 		    rtlefuse->txpwrlevel_ht40_2s[RF90_PATH_A][index];
374 		ofdmpowerlevel[RF90_PATH_B] =
375 		    rtlefuse->txpwrlevel_ht40_2s[RF90_PATH_B][index];
376 	}
377 }
378 
379 static void _rtl92d_ccxpower_index_check(struct ieee80211_hw *hw,
380 					 u8 channel, u8 *cckpowerlevel,
381 					 u8 *ofdmpowerlevel)
382 {
383 	struct rtl_priv *rtlpriv = rtl_priv(hw);
384 	struct rtl_phy *rtlphy = &rtlpriv->phy;
385 
386 	rtlphy->cur_cck_txpwridx = cckpowerlevel[0];
387 	rtlphy->cur_ofdm24g_txpwridx = ofdmpowerlevel[0];
388 }
389 
390 static u8 _rtl92c_phy_get_rightchnlplace(u8 chnl)
391 {
392 	u8 place = chnl;
393 
394 	if (chnl > 14) {
395 		for (place = 14; place < ARRAY_SIZE(channel_all); place++) {
396 			if (channel_all[place] == chnl) {
397 				place++;
398 				break;
399 			}
400 		}
401 	}
402 	return place;
403 }
404 
405 void rtl92d_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
406 {
407 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
408 	struct rtl_priv *rtlpriv = rtl_priv(hw);
409 	u8 cckpowerlevel[2], ofdmpowerlevel[2];
410 
411 	if (!rtlefuse->txpwr_fromeprom)
412 		return;
413 	channel = _rtl92c_phy_get_rightchnlplace(channel);
414 	_rtl92d_get_txpower_index(hw, channel, &cckpowerlevel[0],
415 				  &ofdmpowerlevel[0]);
416 	if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G)
417 		_rtl92d_ccxpower_index_check(hw, channel, &cckpowerlevel[0],
418 					     &ofdmpowerlevel[0]);
419 	if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G)
420 		rtl92d_phy_rf6052_set_cck_txpower(hw, &cckpowerlevel[0]);
421 	rtl92d_phy_rf6052_set_ofdm_txpower(hw, &ofdmpowerlevel[0], channel);
422 }
423 EXPORT_SYMBOL_GPL(rtl92d_phy_set_txpower_level);
424 
425 void rtl92d_phy_enable_rf_env(struct ieee80211_hw *hw, u8 rfpath,
426 			      u32 *pu4_regval)
427 {
428 	struct rtl_priv *rtlpriv = rtl_priv(hw);
429 	struct rtl_phy *rtlphy = &rtlpriv->phy;
430 	struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
431 
432 	rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, "====>\n");
433 	/*----Store original RFENV control type----*/
434 	switch (rfpath) {
435 	case RF90_PATH_A:
436 	case RF90_PATH_C:
437 		*pu4_regval = rtl_get_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV);
438 		break;
439 	case RF90_PATH_B:
440 	case RF90_PATH_D:
441 		*pu4_regval =
442 		    rtl_get_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV << 16);
443 		break;
444 	}
445 	/*----Set RF_ENV enable----*/
446 	rtl_set_bbreg(hw, pphyreg->rfintfe, BRFSI_RFENV << 16, 0x1);
447 	udelay(1);
448 	/*----Set RF_ENV output high----*/
449 	rtl_set_bbreg(hw, pphyreg->rfintfo, BRFSI_RFENV, 0x1);
450 	udelay(1);
451 	/* Set bit number of Address and Data for RF register */
452 	/* Set 1 to 4 bits for 8255 */
453 	rtl_set_bbreg(hw, pphyreg->rfhssi_para2, B3WIREADDRESSLENGTH, 0x0);
454 	udelay(1);
455 	/*Set 0 to 12 bits for 8255 */
456 	rtl_set_bbreg(hw, pphyreg->rfhssi_para2, B3WIREDATALENGTH, 0x0);
457 	udelay(1);
458 	rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, "<====\n");
459 }
460 EXPORT_SYMBOL_GPL(rtl92d_phy_enable_rf_env);
461 
462 void rtl92d_phy_restore_rf_env(struct ieee80211_hw *hw, u8 rfpath,
463 			       u32 *pu4_regval)
464 {
465 	struct rtl_priv *rtlpriv = rtl_priv(hw);
466 	struct rtl_phy *rtlphy = &rtlpriv->phy;
467 	struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
468 
469 	rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, "=====>\n");
470 	/*----Restore RFENV control type----*/
471 	switch (rfpath) {
472 	case RF90_PATH_A:
473 	case RF90_PATH_C:
474 		rtl_set_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV, *pu4_regval);
475 		break;
476 	case RF90_PATH_B:
477 	case RF90_PATH_D:
478 		rtl_set_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV << 16,
479 			      *pu4_regval);
480 		break;
481 	}
482 	rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, "<=====\n");
483 }
484 EXPORT_SYMBOL_GPL(rtl92d_phy_restore_rf_env);
485 
486 u8 rtl92d_get_rightchnlplace_for_iqk(u8 chnl)
487 {
488 	u8 place;
489 
490 	if (chnl > 14) {
491 		for (place = 14; place < ARRAY_SIZE(channel_all); place++) {
492 			if (channel_all[place] == chnl)
493 				return place - 13;
494 		}
495 	}
496 
497 	return 0;
498 }
499 EXPORT_SYMBOL_GPL(rtl92d_get_rightchnlplace_for_iqk);
500 
501 void rtl92d_phy_save_adda_registers(struct ieee80211_hw *hw, const u32 *adda_reg,
502 				    u32 *adda_backup, u32 regnum)
503 {
504 	struct rtl_priv *rtlpriv = rtl_priv(hw);
505 	u32 i;
506 
507 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Save ADDA parameters.\n");
508 	for (i = 0; i < regnum; i++)
509 		adda_backup[i] = rtl_get_bbreg(hw, adda_reg[i], MASKDWORD);
510 }
511 EXPORT_SYMBOL_GPL(rtl92d_phy_save_adda_registers);
512 
513 void rtl92d_phy_save_mac_registers(struct ieee80211_hw *hw,
514 				   const u32 *macreg, u32 *macbackup)
515 {
516 	struct rtl_priv *rtlpriv = rtl_priv(hw);
517 	u32 i;
518 
519 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Save MAC parameters.\n");
520 	for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
521 		macbackup[i] = rtl_read_byte(rtlpriv, macreg[i]);
522 	macbackup[i] = rtl_read_dword(rtlpriv, macreg[i]);
523 }
524 EXPORT_SYMBOL_GPL(rtl92d_phy_save_mac_registers);
525 
526 void rtl92d_phy_path_adda_on(struct ieee80211_hw *hw,
527 			     const u32 *adda_reg, bool patha_on, bool is2t)
528 {
529 	struct rtl_priv *rtlpriv = rtl_priv(hw);
530 	u32 pathon;
531 	u32 i;
532 
533 	RTPRINT(rtlpriv, FINIT, INIT_IQK,  "ADDA ON.\n");
534 	pathon = patha_on ? 0x04db25a4 : 0x0b1b25a4;
535 	if (patha_on)
536 		pathon = rtlpriv->rtlhal.interfaceindex == 0 ?
537 		    0x04db25a4 : 0x0b1b25a4;
538 	for (i = 0; i < IQK_ADDA_REG_NUM; i++)
539 		rtl_set_bbreg(hw, adda_reg[i], MASKDWORD, pathon);
540 }
541 EXPORT_SYMBOL_GPL(rtl92d_phy_path_adda_on);
542 
543 void rtl92d_phy_mac_setting_calibration(struct ieee80211_hw *hw,
544 					const u32 *macreg, u32 *macbackup)
545 {
546 	struct rtl_priv *rtlpriv = rtl_priv(hw);
547 	u32 i;
548 
549 	RTPRINT(rtlpriv, FINIT, INIT_IQK, "MAC settings for Calibration.\n");
550 	rtl_write_byte(rtlpriv, macreg[0], 0x3F);
551 
552 	for (i = 1; i < (IQK_MAC_REG_NUM - 1); i++)
553 		rtl_write_byte(rtlpriv, macreg[i], (u8)(macbackup[i] &
554 			       (~BIT(3))));
555 	rtl_write_byte(rtlpriv, macreg[i], (u8)(macbackup[i] & (~BIT(5))));
556 }
557 EXPORT_SYMBOL_GPL(rtl92d_phy_mac_setting_calibration);
558 
559 static u32 _rtl92d_phy_get_abs(u32 val1, u32 val2)
560 {
561 	u32 ret;
562 
563 	if (val1 >= val2)
564 		ret = val1 - val2;
565 	else
566 		ret = val2 - val1;
567 	return ret;
568 }
569 
570 static bool _rtl92d_is_legal_5g_channel(struct ieee80211_hw *hw, u8 channel)
571 {
572 	int i;
573 
574 	for (i = 0; i < ARRAY_SIZE(channel5g); i++)
575 		if (channel == channel5g[i])
576 			return true;
577 	return false;
578 }
579 
580 void rtl92d_phy_calc_curvindex(struct ieee80211_hw *hw,
581 			       const u32 *targetchnl, u32 *curvecount_val,
582 			       bool is5g, u32 *curveindex)
583 {
584 	struct rtl_priv *rtlpriv = rtl_priv(hw);
585 	u32 smallest_abs_val = 0xffffffff, u4tmp;
586 	u8 i, j;
587 	u8 chnl_num = is5g ? TARGET_CHNL_NUM_5G : TARGET_CHNL_NUM_2G;
588 
589 	for (i = 0; i < chnl_num; i++) {
590 		if (is5g && !_rtl92d_is_legal_5g_channel(hw, i + 1))
591 			continue;
592 		curveindex[i] = 0;
593 		for (j = 0; j < (CV_CURVE_CNT * 2); j++) {
594 			u4tmp = _rtl92d_phy_get_abs(targetchnl[i],
595 						    curvecount_val[j]);
596 
597 			if (u4tmp < smallest_abs_val) {
598 				curveindex[i] = j;
599 				smallest_abs_val = u4tmp;
600 			}
601 		}
602 		smallest_abs_val = 0xffffffff;
603 		RTPRINT(rtlpriv, FINIT, INIT_IQK, "curveindex[%d] = %x\n",
604 			i, curveindex[i]);
605 	}
606 }
607 EXPORT_SYMBOL_GPL(rtl92d_phy_calc_curvindex);
608 
609 void rtl92d_phy_reset_iqk_result(struct ieee80211_hw *hw)
610 {
611 	struct rtl_priv *rtlpriv = rtl_priv(hw);
612 	struct rtl_phy *rtlphy = &rtlpriv->phy;
613 	u8 i;
614 
615 	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
616 		"settings regs %zu default regs %d\n",
617 		ARRAY_SIZE(rtlphy->iqk_matrix),
618 		IQK_MATRIX_REG_NUM);
619 	/* 0xe94, 0xe9c, 0xea4, 0xeac, 0xeb4, 0xebc, 0xec4, 0xecc */
620 	for (i = 0; i < IQK_MATRIX_SETTINGS_NUM; i++) {
621 		rtlphy->iqk_matrix[i].value[0][0] = 0x100;
622 		rtlphy->iqk_matrix[i].value[0][2] = 0x100;
623 		rtlphy->iqk_matrix[i].value[0][4] = 0x100;
624 		rtlphy->iqk_matrix[i].value[0][6] = 0x100;
625 		rtlphy->iqk_matrix[i].value[0][1] = 0x0;
626 		rtlphy->iqk_matrix[i].value[0][3] = 0x0;
627 		rtlphy->iqk_matrix[i].value[0][5] = 0x0;
628 		rtlphy->iqk_matrix[i].value[0][7] = 0x0;
629 		rtlphy->iqk_matrix[i].iqk_done = false;
630 	}
631 }
632 EXPORT_SYMBOL_GPL(rtl92d_phy_reset_iqk_result);
633 
634 static void rtl92d_phy_set_io(struct ieee80211_hw *hw)
635 {
636 	struct rtl_priv *rtlpriv = rtl_priv(hw);
637 	struct dig_t *de_digtable = &rtlpriv->dm_digtable;
638 	struct rtl_phy *rtlphy = &rtlpriv->phy;
639 
640 	rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
641 		"--->Cmd(%#x), set_io_inprogress(%d)\n",
642 		rtlphy->current_io_type, rtlphy->set_io_inprogress);
643 
644 	switch (rtlphy->current_io_type) {
645 	case IO_CMD_RESUME_DM_BY_SCAN:
646 		de_digtable->cur_igvalue = rtlphy->initgain_backup.xaagccore1;
647 		rtl92d_dm_write_dig(hw);
648 		rtl92d_phy_set_txpower_level(hw, rtlphy->current_channel);
649 		break;
650 	case IO_CMD_PAUSE_DM_BY_SCAN:
651 		rtlphy->initgain_backup.xaagccore1 = de_digtable->cur_igvalue;
652 		de_digtable->cur_igvalue = 0x37;
653 		if (rtlpriv->rtlhal.interface == INTF_USB)
654 			de_digtable->cur_igvalue = 0x17;
655 		rtl92d_dm_write_dig(hw);
656 		break;
657 	default:
658 		pr_err("switch case %#x not processed\n",
659 		       rtlphy->current_io_type);
660 		break;
661 	}
662 
663 	rtlphy->set_io_inprogress = false;
664 	rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE, "<---(%#x)\n",
665 		rtlphy->current_io_type);
666 }
667 
668 bool rtl92d_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
669 {
670 	struct rtl_priv *rtlpriv = rtl_priv(hw);
671 	struct rtl_phy *rtlphy = &rtlpriv->phy;
672 	bool postprocessing = false;
673 
674 	rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
675 		"-->IO Cmd(%#x), set_io_inprogress(%d)\n",
676 		 iotype, rtlphy->set_io_inprogress);
677 
678 	do {
679 		switch (iotype) {
680 		case IO_CMD_RESUME_DM_BY_SCAN:
681 			rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
682 				"[IO CMD] Resume DM after scan\n");
683 			postprocessing = true;
684 			break;
685 		case IO_CMD_PAUSE_DM_BY_SCAN:
686 			rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
687 				"[IO CMD] Pause DM before scan\n");
688 			postprocessing = true;
689 			break;
690 		default:
691 			pr_err("switch case %#x not processed\n",
692 			       iotype);
693 			break;
694 		}
695 	} while (false);
696 
697 	if (postprocessing && !rtlphy->set_io_inprogress) {
698 		rtlphy->set_io_inprogress = true;
699 		rtlphy->current_io_type = iotype;
700 	} else {
701 		return false;
702 	}
703 
704 	rtl92d_phy_set_io(hw);
705 	rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE, "<--IO Type(%#x)\n", iotype);
706 	return true;
707 }
708 EXPORT_SYMBOL_GPL(rtl92d_phy_set_io_cmd);
709 
710 void rtl92d_phy_config_macphymode(struct ieee80211_hw *hw)
711 {
712 	struct rtl_priv *rtlpriv = rtl_priv(hw);
713 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
714 	u8 offset = REG_MAC_PHY_CTRL_NORMAL;
715 	u8 phy_ctrl = 0xf0;
716 
717 	if (rtlhal->interface == INTF_USB) {
718 		phy_ctrl = rtl_read_byte(rtlpriv, offset);
719 		phy_ctrl &= ~(BIT(0) | BIT(1) | BIT(2));
720 	}
721 
722 	switch (rtlhal->macphymode) {
723 	case DUALMAC_DUALPHY:
724 		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
725 			"MacPhyMode: DUALMAC_DUALPHY\n");
726 		rtl_write_byte(rtlpriv, offset, phy_ctrl | BIT(0) | BIT(1));
727 		break;
728 	case SINGLEMAC_SINGLEPHY:
729 		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
730 			"MacPhyMode: SINGLEMAC_SINGLEPHY\n");
731 		rtl_write_byte(rtlpriv, offset, phy_ctrl | BIT(2));
732 		break;
733 	case DUALMAC_SINGLEPHY:
734 		rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
735 			"MacPhyMode: DUALMAC_SINGLEPHY\n");
736 		rtl_write_byte(rtlpriv, offset, phy_ctrl | BIT(0));
737 		break;
738 	}
739 }
740 EXPORT_SYMBOL_GPL(rtl92d_phy_config_macphymode);
741 
742 void rtl92d_phy_config_macphymode_info(struct ieee80211_hw *hw)
743 {
744 	struct rtl_priv *rtlpriv = rtl_priv(hw);
745 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
746 	struct rtl_phy *rtlphy = &rtlpriv->phy;
747 
748 	switch (rtlhal->macphymode) {
749 	case DUALMAC_SINGLEPHY:
750 		rtlphy->rf_type = RF_2T2R;
751 		rtlhal->version |= RF_TYPE_2T2R;
752 		rtlhal->bandset = BAND_ON_BOTH;
753 		rtlhal->current_bandtype = BAND_ON_2_4G;
754 		break;
755 
756 	case SINGLEMAC_SINGLEPHY:
757 		rtlphy->rf_type = RF_2T2R;
758 		rtlhal->version |= RF_TYPE_2T2R;
759 		rtlhal->bandset = BAND_ON_BOTH;
760 		rtlhal->current_bandtype = BAND_ON_2_4G;
761 		break;
762 
763 	case DUALMAC_DUALPHY:
764 		rtlphy->rf_type = RF_1T1R;
765 		rtlhal->version &= RF_TYPE_1T1R;
766 		/* Now we let MAC0 run on 5G band. */
767 		if (rtlhal->interfaceindex == 0) {
768 			rtlhal->bandset = BAND_ON_5G;
769 			rtlhal->current_bandtype = BAND_ON_5G;
770 		} else {
771 			rtlhal->bandset = BAND_ON_2_4G;
772 			rtlhal->current_bandtype = BAND_ON_2_4G;
773 		}
774 		break;
775 	default:
776 		break;
777 	}
778 }
779 EXPORT_SYMBOL_GPL(rtl92d_phy_config_macphymode_info);
780 
781 u8 rtl92d_get_chnlgroup_fromarray(u8 chnl)
782 {
783 	u8 group;
784 
785 	if (channel_all[chnl] <= 3)
786 		group = 0;
787 	else if (channel_all[chnl] <= 9)
788 		group = 1;
789 	else if (channel_all[chnl] <= 14)
790 		group = 2;
791 	else if (channel_all[chnl] <= 44)
792 		group = 3;
793 	else if (channel_all[chnl] <= 54)
794 		group = 4;
795 	else if (channel_all[chnl] <= 64)
796 		group = 5;
797 	else if (channel_all[chnl] <= 112)
798 		group = 6;
799 	else if (channel_all[chnl] <= 126)
800 		group = 7;
801 	else if (channel_all[chnl] <= 140)
802 		group = 8;
803 	else if (channel_all[chnl] <= 153)
804 		group = 9;
805 	else if (channel_all[chnl] <= 159)
806 		group = 10;
807 	else
808 		group = 11;
809 	return group;
810 }
811 EXPORT_SYMBOL_GPL(rtl92d_get_chnlgroup_fromarray);
812 
813 u8 rtl92d_phy_get_chnlgroup_bypg(u8 chnlindex)
814 {
815 	u8 group;
816 
817 	if (channel_all[chnlindex] <= 3)	/* Chanel 1-3 */
818 		group = 0;
819 	else if (channel_all[chnlindex] <= 9)	/* Channel 4-9 */
820 		group = 1;
821 	else if (channel_all[chnlindex] <= 14)	/* Channel 10-14 */
822 		group = 2;
823 	else if (channel_all[chnlindex] <= 64)
824 		group = 6;
825 	else if (channel_all[chnlindex] <= 140)
826 		group = 7;
827 	else
828 		group = 8;
829 	return group;
830 }
831 
832 void rtl92d_phy_config_maccoexist_rfpage(struct ieee80211_hw *hw)
833 {
834 	struct rtl_priv *rtlpriv = rtl_priv(hw);
835 
836 	switch (rtlpriv->rtlhal.macphymode) {
837 	case DUALMAC_DUALPHY:
838 		rtl_write_byte(rtlpriv, REG_DMC, 0x0);
839 		rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x08);
840 		rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, 0x13ff);
841 		break;
842 	case DUALMAC_SINGLEPHY:
843 		rtl_write_byte(rtlpriv, REG_DMC, 0xf8);
844 		rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x08);
845 		rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, 0x13ff);
846 		break;
847 	case SINGLEMAC_SINGLEPHY:
848 		rtl_write_byte(rtlpriv, REG_DMC, 0x0);
849 		rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x10);
850 		rtl_write_word(rtlpriv, (REG_TRXFF_BNDY + 2), 0x27FF);
851 		break;
852 	default:
853 		break;
854 	}
855 }
856 EXPORT_SYMBOL_GPL(rtl92d_phy_config_maccoexist_rfpage);
857