rtlwifi: rtl8192c: rtl8192ce: rtl8192cu: rtl8192de: rtl8723ae: Add changes required...
[deliverable/linux.git] / drivers / net / wireless / rtlwifi / rtl8192de / phy.c
1 /******************************************************************************
2 *
3 * Copyright(c) 2009-2012 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE.
20 *
21 * Contact Information:
22 * wlanfae <wlanfae@realtek.com>
23 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
24 * Hsinchu 300, Taiwan.
25 *
26 * Larry Finger <Larry.Finger@lwfinger.net>
27 *
28 *****************************************************************************/
29
30 #include "../wifi.h"
31 #include "../pci.h"
32 #include "../ps.h"
33 #include "reg.h"
34 #include "def.h"
35 #include "phy.h"
36 #include "rf.h"
37 #include "dm.h"
38 #include "table.h"
39 #include "sw.h"
40 #include "hw.h"
41
42 #define MAX_RF_IMR_INDEX 12
43 #define MAX_RF_IMR_INDEX_NORMAL 13
44 #define RF_REG_NUM_FOR_C_CUT_5G 6
45 #define RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA 7
46 #define RF_REG_NUM_FOR_C_CUT_2G 5
47 #define RF_CHNL_NUM_5G 19
48 #define RF_CHNL_NUM_5G_40M 17
49 #define TARGET_CHNL_NUM_5G 221
50 #define TARGET_CHNL_NUM_2G 14
51 #define CV_CURVE_CNT 64
52
53 static u32 rf_reg_for_5g_swchnl_normal[MAX_RF_IMR_INDEX_NORMAL] = {
54 0, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x0
55 };
56
57 static u8 rf_reg_for_c_cut_5g[RF_REG_NUM_FOR_C_CUT_5G] = {
58 RF_SYN_G1, RF_SYN_G2, RF_SYN_G3, RF_SYN_G4, RF_SYN_G5, RF_SYN_G6
59 };
60
61 static u8 rf_reg_for_c_cut_2g[RF_REG_NUM_FOR_C_CUT_2G] = {
62 RF_SYN_G1, RF_SYN_G2, RF_SYN_G3, RF_SYN_G7, RF_SYN_G8
63 };
64
65 static u8 rf_for_c_cut_5g_internal_pa[RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA] = {
66 0x0B, 0x48, 0x49, 0x4B, 0x03, 0x04, 0x0E
67 };
68
69 static u32 rf_reg_mask_for_c_cut_2g[RF_REG_NUM_FOR_C_CUT_2G] = {
70 BIT(19) | BIT(18) | BIT(17) | BIT(14) | BIT(1),
71 BIT(10) | BIT(9),
72 BIT(18) | BIT(17) | BIT(16) | BIT(1),
73 BIT(2) | BIT(1),
74 BIT(15) | BIT(14) | BIT(13) | BIT(12) | BIT(11)
75 };
76
77 static u8 rf_chnl_5g[RF_CHNL_NUM_5G] = {
78 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108,
79 112, 116, 120, 124, 128, 132, 136, 140
80 };
81
82 static u8 rf_chnl_5g_40m[RF_CHNL_NUM_5G_40M] = {
83 38, 42, 46, 50, 54, 58, 62, 102, 106, 110, 114,
84 118, 122, 126, 130, 134, 138
85 };
86 static u32 rf_reg_pram_c_5g[5][RF_REG_NUM_FOR_C_CUT_5G] = {
87 {0xE43BE, 0xFC638, 0x77C0A, 0xDE471, 0xd7110, 0x8EB04},
88 {0xE43BE, 0xFC078, 0xF7C1A, 0xE0C71, 0xD7550, 0xAEB04},
89 {0xE43BF, 0xFF038, 0xF7C0A, 0xDE471, 0xE5550, 0xAEB04},
90 {0xE43BF, 0xFF079, 0xF7C1A, 0xDE471, 0xE5550, 0xAEB04},
91 {0xE43BF, 0xFF038, 0xF7C1A, 0xDE471, 0xd7550, 0xAEB04}
92 };
93
94 static u32 rf_reg_param_for_c_cut_2g[3][RF_REG_NUM_FOR_C_CUT_2G] = {
95 {0x643BC, 0xFC038, 0x77C1A, 0x41289, 0x01840},
96 {0x643BC, 0xFC038, 0x07C1A, 0x41289, 0x01840},
97 {0x243BC, 0xFC438, 0x07C1A, 0x4128B, 0x0FC41}
98 };
99
100 static u32 rf_syn_g4_for_c_cut_2g = 0xD1C31 & 0x7FF;
101
102 static u32 rf_pram_c_5g_int_pa[3][RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA] = {
103 {0x01a00, 0x40443, 0x00eb5, 0x89bec, 0x94a12, 0x94a12, 0x94a12},
104 {0x01800, 0xc0443, 0x00730, 0x896ee, 0x94a52, 0x94a52, 0x94a52},
105 {0x01800, 0xc0443, 0x00730, 0x896ee, 0x94a12, 0x94a12, 0x94a12}
106 };
107
108 /* [mode][patha+b][reg] */
109 static u32 rf_imr_param_normal[1][3][MAX_RF_IMR_INDEX_NORMAL] = {
110 {
111 /* channel 1-14. */
112 {
113 0x70000, 0x00ff0, 0x4400f, 0x00ff0, 0x0, 0x0, 0x0,
114 0x0, 0x0, 0x64888, 0xe266c, 0x00090, 0x22fff
115 },
116 /* path 36-64 */
117 {
118 0x70000, 0x22880, 0x4470f, 0x55880, 0x00070, 0x88000,
119 0x0, 0x88080, 0x70000, 0x64a82, 0xe466c, 0x00090,
120 0x32c9a
121 },
122 /* 100 -165 */
123 {
124 0x70000, 0x44880, 0x4477f, 0x77880, 0x00070, 0x88000,
125 0x0, 0x880b0, 0x0, 0x64b82, 0xe466c, 0x00090, 0x32c9a
126 }
127 }
128 };
129
130 static u32 curveindex_5g[TARGET_CHNL_NUM_5G] = {0};
131
132 static u32 curveindex_2g[TARGET_CHNL_NUM_2G] = {0};
133
134 static u32 targetchnl_5g[TARGET_CHNL_NUM_5G] = {
135 25141, 25116, 25091, 25066, 25041,
136 25016, 24991, 24966, 24941, 24917,
137 24892, 24867, 24843, 24818, 24794,
138 24770, 24765, 24721, 24697, 24672,
139 24648, 24624, 24600, 24576, 24552,
140 24528, 24504, 24480, 24457, 24433,
141 24409, 24385, 24362, 24338, 24315,
142 24291, 24268, 24245, 24221, 24198,
143 24175, 24151, 24128, 24105, 24082,
144 24059, 24036, 24013, 23990, 23967,
145 23945, 23922, 23899, 23876, 23854,
146 23831, 23809, 23786, 23764, 23741,
147 23719, 23697, 23674, 23652, 23630,
148 23608, 23586, 23564, 23541, 23519,
149 23498, 23476, 23454, 23432, 23410,
150 23388, 23367, 23345, 23323, 23302,
151 23280, 23259, 23237, 23216, 23194,
152 23173, 23152, 23130, 23109, 23088,
153 23067, 23046, 23025, 23003, 22982,
154 22962, 22941, 22920, 22899, 22878,
155 22857, 22837, 22816, 22795, 22775,
156 22754, 22733, 22713, 22692, 22672,
157 22652, 22631, 22611, 22591, 22570,
158 22550, 22530, 22510, 22490, 22469,
159 22449, 22429, 22409, 22390, 22370,
160 22350, 22336, 22310, 22290, 22271,
161 22251, 22231, 22212, 22192, 22173,
162 22153, 22134, 22114, 22095, 22075,
163 22056, 22037, 22017, 21998, 21979,
164 21960, 21941, 21921, 21902, 21883,
165 21864, 21845, 21826, 21807, 21789,
166 21770, 21751, 21732, 21713, 21695,
167 21676, 21657, 21639, 21620, 21602,
168 21583, 21565, 21546, 21528, 21509,
169 21491, 21473, 21454, 21436, 21418,
170 21400, 21381, 21363, 21345, 21327,
171 21309, 21291, 21273, 21255, 21237,
172 21219, 21201, 21183, 21166, 21148,
173 21130, 21112, 21095, 21077, 21059,
174 21042, 21024, 21007, 20989, 20972,
175 25679, 25653, 25627, 25601, 25575,
176 25549, 25523, 25497, 25471, 25446,
177 25420, 25394, 25369, 25343, 25318,
178 25292, 25267, 25242, 25216, 25191,
179 25166
180 };
181
182 /* channel 1~14 */
183 static u32 targetchnl_2g[TARGET_CHNL_NUM_2G] = {
184 26084, 26030, 25976, 25923, 25869, 25816, 25764,
185 25711, 25658, 25606, 25554, 25502, 25451, 25328
186 };
187
188 static u32 _rtl92d_phy_calculate_bit_shift(u32 bitmask)
189 {
190 u32 i;
191
192 for (i = 0; i <= 31; i++) {
193 if (((bitmask >> i) & 0x1) == 1)
194 break;
195 }
196
197 return i;
198 }
199
200 u32 rtl92d_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask)
201 {
202 struct rtl_priv *rtlpriv = rtl_priv(hw);
203 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
204 u32 returnvalue, originalvalue, bitshift;
205 u8 dbi_direct;
206
207 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "regaddr(%#x), bitmask(%#x)\n",
208 regaddr, bitmask);
209 if (rtlhal->during_mac1init_radioa || rtlhal->during_mac0init_radiob) {
210 /* mac1 use phy0 read radio_b. */
211 /* mac0 use phy1 read radio_b. */
212 if (rtlhal->during_mac1init_radioa)
213 dbi_direct = BIT(3);
214 else if (rtlhal->during_mac0init_radiob)
215 dbi_direct = BIT(3) | BIT(2);
216 originalvalue = rtl92de_read_dword_dbi(hw, (u16)regaddr,
217 dbi_direct);
218 } else {
219 originalvalue = rtl_read_dword(rtlpriv, regaddr);
220 }
221 bitshift = _rtl92d_phy_calculate_bit_shift(bitmask);
222 returnvalue = (originalvalue & bitmask) >> bitshift;
223 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
224 "BBR MASK=0x%x Addr[0x%x]=0x%x\n",
225 bitmask, regaddr, originalvalue);
226 return returnvalue;
227 }
228
229 void rtl92d_phy_set_bb_reg(struct ieee80211_hw *hw,
230 u32 regaddr, u32 bitmask, u32 data)
231 {
232 struct rtl_priv *rtlpriv = rtl_priv(hw);
233 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
234 u8 dbi_direct = 0;
235 u32 originalvalue, bitshift;
236
237 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
238 "regaddr(%#x), bitmask(%#x), data(%#x)\n",
239 regaddr, bitmask, data);
240 if (rtlhal->during_mac1init_radioa)
241 dbi_direct = BIT(3);
242 else if (rtlhal->during_mac0init_radiob)
243 /* mac0 use phy1 write radio_b. */
244 dbi_direct = BIT(3) | BIT(2);
245 if (bitmask != BMASKDWORD) {
246 if (rtlhal->during_mac1init_radioa ||
247 rtlhal->during_mac0init_radiob)
248 originalvalue = rtl92de_read_dword_dbi(hw,
249 (u16) regaddr,
250 dbi_direct);
251 else
252 originalvalue = rtl_read_dword(rtlpriv, regaddr);
253 bitshift = _rtl92d_phy_calculate_bit_shift(bitmask);
254 data = ((originalvalue & (~bitmask)) | (data << bitshift));
255 }
256 if (rtlhal->during_mac1init_radioa || rtlhal->during_mac0init_radiob)
257 rtl92de_write_dword_dbi(hw, (u16) regaddr, data, dbi_direct);
258 else
259 rtl_write_dword(rtlpriv, regaddr, data);
260 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
261 "regaddr(%#x), bitmask(%#x), data(%#x)\n",
262 regaddr, bitmask, data);
263 }
264
265 static u32 _rtl92d_phy_rf_serial_read(struct ieee80211_hw *hw,
266 enum radio_path rfpath, u32 offset)
267 {
268
269 struct rtl_priv *rtlpriv = rtl_priv(hw);
270 struct rtl_phy *rtlphy = &(rtlpriv->phy);
271 struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
272 u32 newoffset;
273 u32 tmplong, tmplong2;
274 u8 rfpi_enable = 0;
275 u32 retvalue;
276
277 newoffset = offset;
278 tmplong = rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, BMASKDWORD);
279 if (rfpath == RF90_PATH_A)
280 tmplong2 = tmplong;
281 else
282 tmplong2 = rtl_get_bbreg(hw, pphyreg->rfhssi_para2, BMASKDWORD);
283 tmplong2 = (tmplong2 & (~BLSSIREADADDRESS)) |
284 (newoffset << 23) | BLSSIREADEDGE;
285 rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, BMASKDWORD,
286 tmplong & (~BLSSIREADEDGE));
287 udelay(10);
288 rtl_set_bbreg(hw, pphyreg->rfhssi_para2, BMASKDWORD, tmplong2);
289 udelay(50);
290 udelay(50);
291 rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, BMASKDWORD,
292 tmplong | BLSSIREADEDGE);
293 udelay(10);
294 if (rfpath == RF90_PATH_A)
295 rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1,
296 BIT(8));
297 else if (rfpath == RF90_PATH_B)
298 rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XB_HSSIPARAMETER1,
299 BIT(8));
300 if (rfpi_enable)
301 retvalue = rtl_get_bbreg(hw, pphyreg->rf_rbpi,
302 BLSSIREADBACKDATA);
303 else
304 retvalue = rtl_get_bbreg(hw, pphyreg->rf_rb,
305 BLSSIREADBACKDATA);
306 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "RFR-%d Addr[0x%x] = 0x%x\n",
307 rfpath, pphyreg->rf_rb, retvalue);
308 return retvalue;
309 }
310
311 static void _rtl92d_phy_rf_serial_write(struct ieee80211_hw *hw,
312 enum radio_path rfpath,
313 u32 offset, u32 data)
314 {
315 u32 data_and_addr;
316 u32 newoffset;
317 struct rtl_priv *rtlpriv = rtl_priv(hw);
318 struct rtl_phy *rtlphy = &(rtlpriv->phy);
319 struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
320
321 newoffset = offset;
322 /* T65 RF */
323 data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff;
324 rtl_set_bbreg(hw, pphyreg->rf3wire_offset, BMASKDWORD, data_and_addr);
325 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "RFW-%d Addr[0x%x]=0x%x\n",
326 rfpath, pphyreg->rf3wire_offset, data_and_addr);
327 }
328
329 u32 rtl92d_phy_query_rf_reg(struct ieee80211_hw *hw,
330 enum radio_path rfpath, u32 regaddr, u32 bitmask)
331 {
332 struct rtl_priv *rtlpriv = rtl_priv(hw);
333 u32 original_value, readback_value, bitshift;
334 unsigned long flags;
335
336 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
337 "regaddr(%#x), rfpath(%#x), bitmask(%#x)\n",
338 regaddr, rfpath, bitmask);
339 spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
340 original_value = _rtl92d_phy_rf_serial_read(hw, rfpath, regaddr);
341 bitshift = _rtl92d_phy_calculate_bit_shift(bitmask);
342 readback_value = (original_value & bitmask) >> bitshift;
343 spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
344 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
345 "regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n",
346 regaddr, rfpath, bitmask, original_value);
347 return readback_value;
348 }
349
350 void rtl92d_phy_set_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,
351 u32 regaddr, u32 bitmask, u32 data)
352 {
353 struct rtl_priv *rtlpriv = rtl_priv(hw);
354 struct rtl_phy *rtlphy = &(rtlpriv->phy);
355 u32 original_value, bitshift;
356 unsigned long flags;
357
358 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
359 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
360 regaddr, bitmask, data, rfpath);
361 if (bitmask == 0)
362 return;
363 spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
364 if (rtlphy->rf_mode != RF_OP_BY_FW) {
365 if (bitmask != BRFREGOFFSETMASK) {
366 original_value = _rtl92d_phy_rf_serial_read(hw,
367 rfpath, regaddr);
368 bitshift = _rtl92d_phy_calculate_bit_shift(bitmask);
369 data = ((original_value & (~bitmask)) |
370 (data << bitshift));
371 }
372 _rtl92d_phy_rf_serial_write(hw, rfpath, regaddr, data);
373 }
374 spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
375 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
376 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
377 regaddr, bitmask, data, rfpath);
378 }
379
380 bool rtl92d_phy_mac_config(struct ieee80211_hw *hw)
381 {
382 struct rtl_priv *rtlpriv = rtl_priv(hw);
383 u32 i;
384 u32 arraylength;
385 u32 *ptrarray;
386
387 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Read Rtl819XMACPHY_Array\n");
388 arraylength = MAC_2T_ARRAYLENGTH;
389 ptrarray = rtl8192de_mac_2tarray;
390 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Img:Rtl819XMAC_Array\n");
391 for (i = 0; i < arraylength; i = i + 2)
392 rtl_write_byte(rtlpriv, ptrarray[i], (u8) ptrarray[i + 1]);
393 if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY) {
394 /* improve 2-stream TX EVM */
395 /* rtl_write_byte(rtlpriv, 0x14,0x71); */
396 /* AMPDU aggregation number 9 */
397 /* rtl_write_word(rtlpriv, REG_MAX_AGGR_NUM, MAX_AGGR_NUM); */
398 rtl_write_byte(rtlpriv, REG_MAX_AGGR_NUM, 0x0B);
399 } else {
400 /* 92D need to test to decide the num. */
401 rtl_write_byte(rtlpriv, REG_MAX_AGGR_NUM, 0x07);
402 }
403 return true;
404 }
405
406 static void _rtl92d_phy_init_bb_rf_register_definition(struct ieee80211_hw *hw)
407 {
408 struct rtl_priv *rtlpriv = rtl_priv(hw);
409 struct rtl_phy *rtlphy = &(rtlpriv->phy);
410
411 /* RF Interface Sowrtware Control */
412 /* 16 LSBs if read 32-bit from 0x870 */
413 rtlphy->phyreg_def[RF90_PATH_A].rfintfs = RFPGA0_XAB_RFINTERFACESW;
414 /* 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872) */
415 rtlphy->phyreg_def[RF90_PATH_B].rfintfs = RFPGA0_XAB_RFINTERFACESW;
416 /* 16 LSBs if read 32-bit from 0x874 */
417 rtlphy->phyreg_def[RF90_PATH_C].rfintfs = RFPGA0_XCD_RFINTERFACESW;
418 /* 16 MSBs if read 32-bit from 0x874 (16-bit for 0x876) */
419
420 rtlphy->phyreg_def[RF90_PATH_D].rfintfs = RFPGA0_XCD_RFINTERFACESW;
421 /* RF Interface Readback Value */
422 /* 16 LSBs if read 32-bit from 0x8E0 */
423 rtlphy->phyreg_def[RF90_PATH_A].rfintfi = RFPGA0_XAB_RFINTERFACERB;
424 /* 16 MSBs if read 32-bit from 0x8E0 (16-bit for 0x8E2) */
425 rtlphy->phyreg_def[RF90_PATH_B].rfintfi = RFPGA0_XAB_RFINTERFACERB;
426 /* 16 LSBs if read 32-bit from 0x8E4 */
427 rtlphy->phyreg_def[RF90_PATH_C].rfintfi = RFPGA0_XCD_RFINTERFACERB;
428 /* 16 MSBs if read 32-bit from 0x8E4 (16-bit for 0x8E6) */
429 rtlphy->phyreg_def[RF90_PATH_D].rfintfi = RFPGA0_XCD_RFINTERFACERB;
430
431 /* RF Interface Output (and Enable) */
432 /* 16 LSBs if read 32-bit from 0x860 */
433 rtlphy->phyreg_def[RF90_PATH_A].rfintfo = RFPGA0_XA_RFINTERFACEOE;
434 /* 16 LSBs if read 32-bit from 0x864 */
435 rtlphy->phyreg_def[RF90_PATH_B].rfintfo = RFPGA0_XB_RFINTERFACEOE;
436
437 /* RF Interface (Output and) Enable */
438 /* 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862) */
439 rtlphy->phyreg_def[RF90_PATH_A].rfintfe = RFPGA0_XA_RFINTERFACEOE;
440 /* 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866) */
441 rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE;
442
443 /* Addr of LSSI. Wirte RF register by driver */
444 /* LSSI Parameter */
445 rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset =
446 RFPGA0_XA_LSSIPARAMETER;
447 rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset =
448 RFPGA0_XB_LSSIPARAMETER;
449
450 /* RF parameter */
451 /* BB Band Select */
452 rtlphy->phyreg_def[RF90_PATH_A].rflssi_select = RFPGA0_XAB_RFPARAMETER;
453 rtlphy->phyreg_def[RF90_PATH_B].rflssi_select = RFPGA0_XAB_RFPARAMETER;
454 rtlphy->phyreg_def[RF90_PATH_C].rflssi_select = RFPGA0_XCD_RFPARAMETER;
455 rtlphy->phyreg_def[RF90_PATH_D].rflssi_select = RFPGA0_XCD_RFPARAMETER;
456
457 /* Tx AGC Gain Stage (same for all path. Should we remove this?) */
458 /* Tx gain stage */
459 rtlphy->phyreg_def[RF90_PATH_A].rftxgain_stage = RFPGA0_TXGAINSTAGE;
460 /* Tx gain stage */
461 rtlphy->phyreg_def[RF90_PATH_B].rftxgain_stage = RFPGA0_TXGAINSTAGE;
462 /* Tx gain stage */
463 rtlphy->phyreg_def[RF90_PATH_C].rftxgain_stage = RFPGA0_TXGAINSTAGE;
464 /* Tx gain stage */
465 rtlphy->phyreg_def[RF90_PATH_D].rftxgain_stage = RFPGA0_TXGAINSTAGE;
466
467 /* Tranceiver A~D HSSI Parameter-1 */
468 /* wire control parameter1 */
469 rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para1 = RFPGA0_XA_HSSIPARAMETER1;
470 /* wire control parameter1 */
471 rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para1 = RFPGA0_XB_HSSIPARAMETER1;
472
473 /* Tranceiver A~D HSSI Parameter-2 */
474 /* wire control parameter2 */
475 rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para2 = RFPGA0_XA_HSSIPARAMETER2;
476 /* wire control parameter2 */
477 rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para2 = RFPGA0_XB_HSSIPARAMETER2;
478
479 /* RF switch Control */
480 /* TR/Ant switch control */
481 rtlphy->phyreg_def[RF90_PATH_A].rfsw_ctrl = RFPGA0_XAB_SWITCHCONTROL;
482 rtlphy->phyreg_def[RF90_PATH_B].rfsw_ctrl = RFPGA0_XAB_SWITCHCONTROL;
483 rtlphy->phyreg_def[RF90_PATH_C].rfsw_ctrl = RFPGA0_XCD_SWITCHCONTROL;
484 rtlphy->phyreg_def[RF90_PATH_D].rfsw_ctrl = RFPGA0_XCD_SWITCHCONTROL;
485
486 /* AGC control 1 */
487 rtlphy->phyreg_def[RF90_PATH_A].rfagc_control1 = ROFDM0_XAAGCCORE1;
488 rtlphy->phyreg_def[RF90_PATH_B].rfagc_control1 = ROFDM0_XBAGCCORE1;
489 rtlphy->phyreg_def[RF90_PATH_C].rfagc_control1 = ROFDM0_XCAGCCORE1;
490 rtlphy->phyreg_def[RF90_PATH_D].rfagc_control1 = ROFDM0_XDAGCCORE1;
491
492 /* AGC control 2 */
493 rtlphy->phyreg_def[RF90_PATH_A].rfagc_control2 = ROFDM0_XAAGCCORE2;
494 rtlphy->phyreg_def[RF90_PATH_B].rfagc_control2 = ROFDM0_XBAGCCORE2;
495 rtlphy->phyreg_def[RF90_PATH_C].rfagc_control2 = ROFDM0_XCAGCCORE2;
496 rtlphy->phyreg_def[RF90_PATH_D].rfagc_control2 = ROFDM0_XDAGCCORE2;
497
498 /* RX AFE control 1 */
499 rtlphy->phyreg_def[RF90_PATH_A].rfrxiq_imbal = ROFDM0_XARXIQIMBALANCE;
500 rtlphy->phyreg_def[RF90_PATH_B].rfrxiq_imbal = ROFDM0_XBRXIQIMBALANCE;
501 rtlphy->phyreg_def[RF90_PATH_C].rfrxiq_imbal = ROFDM0_XCRXIQIMBALANCE;
502 rtlphy->phyreg_def[RF90_PATH_D].rfrxiq_imbal = ROFDM0_XDRXIQIMBALANCE;
503
504 /*RX AFE control 1 */
505 rtlphy->phyreg_def[RF90_PATH_A].rfrx_afe = ROFDM0_XARXAFE;
506 rtlphy->phyreg_def[RF90_PATH_B].rfrx_afe = ROFDM0_XBRXAFE;
507 rtlphy->phyreg_def[RF90_PATH_C].rfrx_afe = ROFDM0_XCRXAFE;
508 rtlphy->phyreg_def[RF90_PATH_D].rfrx_afe = ROFDM0_XDRXAFE;
509
510 /* Tx AFE control 1 */
511 rtlphy->phyreg_def[RF90_PATH_A].rftxiq_imbal = ROFDM0_XATxIQIMBALANCE;
512 rtlphy->phyreg_def[RF90_PATH_B].rftxiq_imbal = ROFDM0_XBTxIQIMBALANCE;
513 rtlphy->phyreg_def[RF90_PATH_C].rftxiq_imbal = ROFDM0_XCTxIQIMBALANCE;
514 rtlphy->phyreg_def[RF90_PATH_D].rftxiq_imbal = ROFDM0_XDTxIQIMBALANCE;
515
516 /* Tx AFE control 2 */
517 rtlphy->phyreg_def[RF90_PATH_A].rftx_afe = ROFDM0_XATxAFE;
518 rtlphy->phyreg_def[RF90_PATH_B].rftx_afe = ROFDM0_XBTxAFE;
519 rtlphy->phyreg_def[RF90_PATH_C].rftx_afe = ROFDM0_XCTxAFE;
520 rtlphy->phyreg_def[RF90_PATH_D].rftx_afe = ROFDM0_XDTxAFE;
521
522 /* Tranceiver LSSI Readback SI mode */
523 rtlphy->phyreg_def[RF90_PATH_A].rf_rb = RFPGA0_XA_LSSIREADBACK;
524 rtlphy->phyreg_def[RF90_PATH_B].rf_rb = RFPGA0_XB_LSSIREADBACK;
525 rtlphy->phyreg_def[RF90_PATH_C].rf_rb = RFPGA0_XC_LSSIREADBACK;
526 rtlphy->phyreg_def[RF90_PATH_D].rf_rb = RFPGA0_XD_LSSIREADBACK;
527
528 /* Tranceiver LSSI Readback PI mode */
529 rtlphy->phyreg_def[RF90_PATH_A].rf_rbpi = TRANSCEIVERA_HSPI_READBACK;
530 rtlphy->phyreg_def[RF90_PATH_B].rf_rbpi = TRANSCEIVERB_HSPI_READBACK;
531 }
532
533 static bool _rtl92d_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
534 u8 configtype)
535 {
536 int i;
537 u32 *phy_regarray_table;
538 u32 *agctab_array_table = NULL;
539 u32 *agctab_5garray_table;
540 u16 phy_reg_arraylen, agctab_arraylen = 0, agctab_5garraylen;
541 struct rtl_priv *rtlpriv = rtl_priv(hw);
542 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
543
544 /* Normal chip,Mac0 use AGC_TAB.txt for 2G and 5G band. */
545 if (rtlhal->interfaceindex == 0) {
546 agctab_arraylen = AGCTAB_ARRAYLENGTH;
547 agctab_array_table = rtl8192de_agctab_array;
548 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
549 " ===> phy:MAC0, Rtl819XAGCTAB_Array\n");
550 } else {
551 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
552 agctab_arraylen = AGCTAB_2G_ARRAYLENGTH;
553 agctab_array_table = rtl8192de_agctab_2garray;
554 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
555 " ===> phy:MAC1, Rtl819XAGCTAB_2GArray\n");
556 } else {
557 agctab_5garraylen = AGCTAB_5G_ARRAYLENGTH;
558 agctab_5garray_table = rtl8192de_agctab_5garray;
559 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
560 " ===> phy:MAC1, Rtl819XAGCTAB_5GArray\n");
561
562 }
563 }
564 phy_reg_arraylen = PHY_REG_2T_ARRAYLENGTH;
565 phy_regarray_table = rtl8192de_phy_reg_2tarray;
566 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
567 " ===> phy:Rtl819XPHY_REG_Array_PG\n");
568 if (configtype == BASEBAND_CONFIG_PHY_REG) {
569 for (i = 0; i < phy_reg_arraylen; i = i + 2) {
570 if (phy_regarray_table[i] == 0xfe)
571 mdelay(50);
572 else if (phy_regarray_table[i] == 0xfd)
573 mdelay(5);
574 else if (phy_regarray_table[i] == 0xfc)
575 mdelay(1);
576 else if (phy_regarray_table[i] == 0xfb)
577 udelay(50);
578 else if (phy_regarray_table[i] == 0xfa)
579 udelay(5);
580 else if (phy_regarray_table[i] == 0xf9)
581 udelay(1);
582 rtl_set_bbreg(hw, phy_regarray_table[i], BMASKDWORD,
583 phy_regarray_table[i + 1]);
584 udelay(1);
585 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
586 "The phy_regarray_table[0] is %x Rtl819XPHY_REGArray[1] is %x\n",
587 phy_regarray_table[i],
588 phy_regarray_table[i + 1]);
589 }
590 } else if (configtype == BASEBAND_CONFIG_AGC_TAB) {
591 if (rtlhal->interfaceindex == 0) {
592 for (i = 0; i < agctab_arraylen; i = i + 2) {
593 rtl_set_bbreg(hw, agctab_array_table[i],
594 BMASKDWORD,
595 agctab_array_table[i + 1]);
596 /* Add 1us delay between BB/RF register
597 * setting. */
598 udelay(1);
599 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
600 "The Rtl819XAGCTAB_Array_Table[0] is %ul Rtl819XPHY_REGArray[1] is %ul\n",
601 agctab_array_table[i],
602 agctab_array_table[i + 1]);
603 }
604 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
605 "Normal Chip, MAC0, load Rtl819XAGCTAB_Array\n");
606 } else {
607 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
608 for (i = 0; i < agctab_arraylen; i = i + 2) {
609 rtl_set_bbreg(hw, agctab_array_table[i],
610 BMASKDWORD,
611 agctab_array_table[i + 1]);
612 /* Add 1us delay between BB/RF register
613 * setting. */
614 udelay(1);
615 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
616 "The Rtl819XAGCTAB_Array_Table[0] is %ul Rtl819XPHY_REGArray[1] is %ul\n",
617 agctab_array_table[i],
618 agctab_array_table[i + 1]);
619 }
620 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
621 "Load Rtl819XAGCTAB_2GArray\n");
622 } else {
623 for (i = 0; i < agctab_5garraylen; i = i + 2) {
624 rtl_set_bbreg(hw,
625 agctab_5garray_table[i],
626 BMASKDWORD,
627 agctab_5garray_table[i + 1]);
628 /* Add 1us delay between BB/RF registeri
629 * setting. */
630 udelay(1);
631 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
632 "The Rtl819XAGCTAB_5GArray_Table[0] is %ul Rtl819XPHY_REGArray[1] is %ul\n",
633 agctab_5garray_table[i],
634 agctab_5garray_table[i + 1]);
635 }
636 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
637 "Load Rtl819XAGCTAB_5GArray\n");
638 }
639 }
640 }
641 return true;
642 }
643
644 static void _rtl92d_store_pwrindex_diffrate_offset(struct ieee80211_hw *hw,
645 u32 regaddr, u32 bitmask,
646 u32 data)
647 {
648 struct rtl_priv *rtlpriv = rtl_priv(hw);
649 struct rtl_phy *rtlphy = &(rtlpriv->phy);
650 int index;
651
652 if (regaddr == RTXAGC_A_RATE18_06)
653 index = 0;
654 else if (regaddr == RTXAGC_A_RATE54_24)
655 index = 1;
656 else if (regaddr == RTXAGC_A_CCK1_MCS32)
657 index = 6;
658 else if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0xffffff00)
659 index = 7;
660 else if (regaddr == RTXAGC_A_MCS03_MCS00)
661 index = 2;
662 else if (regaddr == RTXAGC_A_MCS07_MCS04)
663 index = 3;
664 else if (regaddr == RTXAGC_A_MCS11_MCS08)
665 index = 4;
666 else if (regaddr == RTXAGC_A_MCS15_MCS12)
667 index = 5;
668 else if (regaddr == RTXAGC_B_RATE18_06)
669 index = 8;
670 else if (regaddr == RTXAGC_B_RATE54_24)
671 index = 9;
672 else if (regaddr == RTXAGC_B_CCK1_55_MCS32)
673 index = 14;
674 else if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0x000000ff)
675 index = 15;
676 else if (regaddr == RTXAGC_B_MCS03_MCS00)
677 index = 10;
678 else if (regaddr == RTXAGC_B_MCS07_MCS04)
679 index = 11;
680 else if (regaddr == RTXAGC_B_MCS11_MCS08)
681 index = 12;
682 else if (regaddr == RTXAGC_B_MCS15_MCS12)
683 index = 13;
684 else
685 return;
686
687 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][index] = data;
688 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
689 "MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%ulx\n",
690 rtlphy->pwrgroup_cnt, index,
691 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][index]);
692 if (index == 13)
693 rtlphy->pwrgroup_cnt++;
694 }
695
696 static bool _rtl92d_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
697 u8 configtype)
698 {
699 struct rtl_priv *rtlpriv = rtl_priv(hw);
700 int i;
701 u32 *phy_regarray_table_pg;
702 u16 phy_regarray_pg_len;
703
704 phy_regarray_pg_len = PHY_REG_ARRAY_PG_LENGTH;
705 phy_regarray_table_pg = rtl8192de_phy_reg_array_pg;
706 if (configtype == BASEBAND_CONFIG_PHY_REG) {
707 for (i = 0; i < phy_regarray_pg_len; i = i + 3) {
708 if (phy_regarray_table_pg[i] == 0xfe)
709 mdelay(50);
710 else if (phy_regarray_table_pg[i] == 0xfd)
711 mdelay(5);
712 else if (phy_regarray_table_pg[i] == 0xfc)
713 mdelay(1);
714 else if (phy_regarray_table_pg[i] == 0xfb)
715 udelay(50);
716 else if (phy_regarray_table_pg[i] == 0xfa)
717 udelay(5);
718 else if (phy_regarray_table_pg[i] == 0xf9)
719 udelay(1);
720 _rtl92d_store_pwrindex_diffrate_offset(hw,
721 phy_regarray_table_pg[i],
722 phy_regarray_table_pg[i + 1],
723 phy_regarray_table_pg[i + 2]);
724 }
725 } else {
726 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
727 "configtype != BaseBand_Config_PHY_REG\n");
728 }
729 return true;
730 }
731
732 static bool _rtl92d_phy_bb_config(struct ieee80211_hw *hw)
733 {
734 struct rtl_priv *rtlpriv = rtl_priv(hw);
735 struct rtl_phy *rtlphy = &(rtlpriv->phy);
736 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
737 bool rtstatus = true;
738
739 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "==>\n");
740 rtstatus = _rtl92d_phy_config_bb_with_headerfile(hw,
741 BASEBAND_CONFIG_PHY_REG);
742 if (!rtstatus) {
743 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Write BB Reg Fail!!\n");
744 return false;
745 }
746
747 /* if (rtlphy->rf_type == RF_1T2R) {
748 * _rtl92c_phy_bb_config_1t(hw);
749 * RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Config to 1T!!\n");
750 *} */
751
752 if (rtlefuse->autoload_failflag == false) {
753 rtlphy->pwrgroup_cnt = 0;
754 rtstatus = _rtl92d_phy_config_bb_with_pgheaderfile(hw,
755 BASEBAND_CONFIG_PHY_REG);
756 }
757 if (!rtstatus) {
758 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "BB_PG Reg Fail!!\n");
759 return false;
760 }
761 rtstatus = _rtl92d_phy_config_bb_with_headerfile(hw,
762 BASEBAND_CONFIG_AGC_TAB);
763 if (!rtstatus) {
764 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "AGC Table Fail\n");
765 return false;
766 }
767 rtlphy->cck_high_power = (bool) (rtl_get_bbreg(hw,
768 RFPGA0_XA_HSSIPARAMETER2, 0x200));
769
770 return true;
771 }
772
773 bool rtl92d_phy_bb_config(struct ieee80211_hw *hw)
774 {
775 struct rtl_priv *rtlpriv = rtl_priv(hw);
776 u16 regval;
777 u32 regvaldw;
778 u8 value;
779
780 _rtl92d_phy_init_bb_rf_register_definition(hw);
781 regval = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
782 rtl_write_word(rtlpriv, REG_SYS_FUNC_EN,
783 regval | BIT(13) | BIT(0) | BIT(1));
784 rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL, 0x83);
785 rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL + 1, 0xdb);
786 /* 0x1f bit7 bit6 represent for mac0/mac1 driver ready */
787 value = rtl_read_byte(rtlpriv, REG_RF_CTRL);
788 rtl_write_byte(rtlpriv, REG_RF_CTRL, value | RF_EN | RF_RSTB |
789 RF_SDMRSTB);
790 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, FEN_PPLL | FEN_PCIEA |
791 FEN_DIO_PCIE | FEN_BB_GLB_RSTn | FEN_BBRSTB);
792 rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL + 1, 0x80);
793 if (!(IS_92D_SINGLEPHY(rtlpriv->rtlhal.version))) {
794 regvaldw = rtl_read_dword(rtlpriv, REG_LEDCFG0);
795 rtl_write_dword(rtlpriv, REG_LEDCFG0, regvaldw | BIT(23));
796 }
797
798 return _rtl92d_phy_bb_config(hw);
799 }
800
801 bool rtl92d_phy_rf_config(struct ieee80211_hw *hw)
802 {
803 return rtl92d_phy_rf6052_config(hw);
804 }
805
806 bool rtl92d_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
807 enum rf_content content,
808 enum radio_path rfpath)
809 {
810 int i;
811 u32 *radioa_array_table;
812 u32 *radiob_array_table;
813 u16 radioa_arraylen, radiob_arraylen;
814 struct rtl_priv *rtlpriv = rtl_priv(hw);
815
816 radioa_arraylen = RADIOA_2T_ARRAYLENGTH;
817 radioa_array_table = rtl8192de_radioa_2tarray;
818 radiob_arraylen = RADIOB_2T_ARRAYLENGTH;
819 radiob_array_table = rtl8192de_radiob_2tarray;
820 if (rtlpriv->efuse.internal_pa_5g[0]) {
821 radioa_arraylen = RADIOA_2T_INT_PA_ARRAYLENGTH;
822 radioa_array_table = rtl8192de_radioa_2t_int_paarray;
823 }
824 if (rtlpriv->efuse.internal_pa_5g[1]) {
825 radiob_arraylen = RADIOB_2T_INT_PA_ARRAYLENGTH;
826 radiob_array_table = rtl8192de_radiob_2t_int_paarray;
827 }
828 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
829 "PHY_ConfigRFWithHeaderFile() Radio_A:Rtl819XRadioA_1TArray\n");
830 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
831 "PHY_ConfigRFWithHeaderFile() Radio_B:Rtl819XRadioB_1TArray\n");
832 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Radio No %x\n", rfpath);
833
834 /* this only happens when DMDP, mac0 start on 2.4G,
835 * mac1 start on 5G, mac 0 has to set phy0&phy1
836 * pathA or mac1 has to set phy0&phy1 pathA */
837 if ((content == radiob_txt) && (rfpath == RF90_PATH_A)) {
838 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
839 " ===> althougth Path A, we load radiob.txt\n");
840 radioa_arraylen = radiob_arraylen;
841 radioa_array_table = radiob_array_table;
842 }
843 switch (rfpath) {
844 case RF90_PATH_A:
845 for (i = 0; i < radioa_arraylen; i = i + 2) {
846 if (radioa_array_table[i] == 0xfe) {
847 mdelay(50);
848 } else if (radioa_array_table[i] == 0xfd) {
849 /* delay_ms(5); */
850 mdelay(5);
851 } else if (radioa_array_table[i] == 0xfc) {
852 /* delay_ms(1); */
853 mdelay(1);
854 } else if (radioa_array_table[i] == 0xfb) {
855 udelay(50);
856 } else if (radioa_array_table[i] == 0xfa) {
857 udelay(5);
858 } else if (radioa_array_table[i] == 0xf9) {
859 udelay(1);
860 } else {
861 rtl_set_rfreg(hw, rfpath, radioa_array_table[i],
862 BRFREGOFFSETMASK,
863 radioa_array_table[i + 1]);
864 /* Add 1us delay between BB/RF register set. */
865 udelay(1);
866 }
867 }
868 break;
869 case RF90_PATH_B:
870 for (i = 0; i < radiob_arraylen; i = i + 2) {
871 if (radiob_array_table[i] == 0xfe) {
872 /* Delay specific ms. Only RF configuration
873 * requires delay. */
874 mdelay(50);
875 } else if (radiob_array_table[i] == 0xfd) {
876 /* delay_ms(5); */
877 mdelay(5);
878 } else if (radiob_array_table[i] == 0xfc) {
879 /* delay_ms(1); */
880 mdelay(1);
881 } else if (radiob_array_table[i] == 0xfb) {
882 udelay(50);
883 } else if (radiob_array_table[i] == 0xfa) {
884 udelay(5);
885 } else if (radiob_array_table[i] == 0xf9) {
886 udelay(1);
887 } else {
888 rtl_set_rfreg(hw, rfpath, radiob_array_table[i],
889 BRFREGOFFSETMASK,
890 radiob_array_table[i + 1]);
891 /* Add 1us delay between BB/RF register set. */
892 udelay(1);
893 }
894 }
895 break;
896 case RF90_PATH_C:
897 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
898 "switch case not processed\n");
899 break;
900 case RF90_PATH_D:
901 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
902 "switch case not processed\n");
903 break;
904 }
905 return true;
906 }
907
908 void rtl92d_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
909 {
910 struct rtl_priv *rtlpriv = rtl_priv(hw);
911 struct rtl_phy *rtlphy = &(rtlpriv->phy);
912
913 rtlphy->default_initialgain[0] =
914 (u8) rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, BMASKBYTE0);
915 rtlphy->default_initialgain[1] =
916 (u8) rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, BMASKBYTE0);
917 rtlphy->default_initialgain[2] =
918 (u8) rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, BMASKBYTE0);
919 rtlphy->default_initialgain[3] =
920 (u8) rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, BMASKBYTE0);
921 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
922 "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n",
923 rtlphy->default_initialgain[0],
924 rtlphy->default_initialgain[1],
925 rtlphy->default_initialgain[2],
926 rtlphy->default_initialgain[3]);
927 rtlphy->framesync = (u8)rtl_get_bbreg(hw, ROFDM0_RXDETECTOR3,
928 BMASKBYTE0);
929 rtlphy->framesync_c34 = rtl_get_bbreg(hw, ROFDM0_RXDETECTOR2,
930 BMASKDWORD);
931 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
932 "Default framesync (0x%x) = 0x%x\n",
933 ROFDM0_RXDETECTOR3, rtlphy->framesync);
934 }
935
936 static void _rtl92d_get_txpower_index(struct ieee80211_hw *hw, u8 channel,
937 u8 *cckpowerlevel, u8 *ofdmpowerlevel)
938 {
939 struct rtl_priv *rtlpriv = rtl_priv(hw);
940 struct rtl_phy *rtlphy = &(rtlpriv->phy);
941 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
942 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
943 u8 index = (channel - 1);
944
945 /* 1. CCK */
946 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
947 /* RF-A */
948 cckpowerlevel[RF90_PATH_A] =
949 rtlefuse->txpwrlevel_cck[RF90_PATH_A][index];
950 /* RF-B */
951 cckpowerlevel[RF90_PATH_B] =
952 rtlefuse->txpwrlevel_cck[RF90_PATH_B][index];
953 } else {
954 cckpowerlevel[RF90_PATH_A] = 0;
955 cckpowerlevel[RF90_PATH_B] = 0;
956 }
957 /* 2. OFDM for 1S or 2S */
958 if (rtlphy->rf_type == RF_1T2R || rtlphy->rf_type == RF_1T1R) {
959 /* Read HT 40 OFDM TX power */
960 ofdmpowerlevel[RF90_PATH_A] =
961 rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_A][index];
962 ofdmpowerlevel[RF90_PATH_B] =
963 rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_B][index];
964 } else if (rtlphy->rf_type == RF_2T2R) {
965 /* Read HT 40 OFDM TX power */
966 ofdmpowerlevel[RF90_PATH_A] =
967 rtlefuse->txpwrlevel_ht40_2s[RF90_PATH_A][index];
968 ofdmpowerlevel[RF90_PATH_B] =
969 rtlefuse->txpwrlevel_ht40_2s[RF90_PATH_B][index];
970 }
971 }
972
973 static void _rtl92d_ccxpower_index_check(struct ieee80211_hw *hw,
974 u8 channel, u8 *cckpowerlevel, u8 *ofdmpowerlevel)
975 {
976 struct rtl_priv *rtlpriv = rtl_priv(hw);
977 struct rtl_phy *rtlphy = &(rtlpriv->phy);
978
979 rtlphy->cur_cck_txpwridx = cckpowerlevel[0];
980 rtlphy->cur_ofdm24g_txpwridx = ofdmpowerlevel[0];
981 }
982
983 static u8 _rtl92c_phy_get_rightchnlplace(u8 chnl)
984 {
985 u8 channel_5g[59] = {
986 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
987 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
988 60, 62, 64, 100, 102, 104, 106, 108, 110, 112,
989 114, 116, 118, 120, 122, 124, 126, 128,
990 130, 132, 134, 136, 138, 140, 149, 151,
991 153, 155, 157, 159, 161, 163, 165
992 };
993 u8 place = chnl;
994
995 if (chnl > 14) {
996 for (place = 14; place < sizeof(channel_5g); place++) {
997 if (channel_5g[place] == chnl) {
998 place++;
999 break;
1000 }
1001 }
1002 }
1003 return place;
1004 }
1005
1006 void rtl92d_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
1007 {
1008 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1009 struct rtl_priv *rtlpriv = rtl_priv(hw);
1010 u8 cckpowerlevel[2], ofdmpowerlevel[2];
1011
1012 if (!rtlefuse->txpwr_fromeprom)
1013 return;
1014 channel = _rtl92c_phy_get_rightchnlplace(channel);
1015 _rtl92d_get_txpower_index(hw, channel, &cckpowerlevel[0],
1016 &ofdmpowerlevel[0]);
1017 if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G)
1018 _rtl92d_ccxpower_index_check(hw, channel, &cckpowerlevel[0],
1019 &ofdmpowerlevel[0]);
1020 if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G)
1021 rtl92d_phy_rf6052_set_cck_txpower(hw, &cckpowerlevel[0]);
1022 rtl92d_phy_rf6052_set_ofdm_txpower(hw, &ofdmpowerlevel[0], channel);
1023 }
1024
1025 void rtl92d_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
1026 {
1027 struct rtl_priv *rtlpriv = rtl_priv(hw);
1028 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1029 enum io_type iotype;
1030
1031 if (!is_hal_stop(rtlhal)) {
1032 switch (operation) {
1033 case SCAN_OPT_BACKUP:
1034 rtlhal->current_bandtypebackup =
1035 rtlhal->current_bandtype;
1036 iotype = IO_CMD_PAUSE_DM_BY_SCAN;
1037 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_IO_CMD,
1038 (u8 *)&iotype);
1039 break;
1040 case SCAN_OPT_RESTORE:
1041 iotype = IO_CMD_RESUME_DM_BY_SCAN;
1042 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_IO_CMD,
1043 (u8 *)&iotype);
1044 break;
1045 default:
1046 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1047 "Unknown Scan Backup operation\n");
1048 break;
1049 }
1050 }
1051 }
1052
1053 void rtl92d_phy_set_bw_mode(struct ieee80211_hw *hw,
1054 enum nl80211_channel_type ch_type)
1055 {
1056 struct rtl_priv *rtlpriv = rtl_priv(hw);
1057 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1058 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1059 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1060 unsigned long flag = 0;
1061 u8 reg_prsr_rsc;
1062 u8 reg_bw_opmode;
1063
1064 if (rtlphy->set_bwmode_inprogress)
1065 return;
1066 if ((is_hal_stop(rtlhal)) || (RT_CANNOT_IO(hw))) {
1067 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1068 "FALSE driver sleep or unload\n");
1069 return;
1070 }
1071 rtlphy->set_bwmode_inprogress = true;
1072 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "Switch to %s bandwidth\n",
1073 rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
1074 "20MHz" : "40MHz");
1075 reg_bw_opmode = rtl_read_byte(rtlpriv, REG_BWOPMODE);
1076 reg_prsr_rsc = rtl_read_byte(rtlpriv, REG_RRSR + 2);
1077 switch (rtlphy->current_chan_bw) {
1078 case HT_CHANNEL_WIDTH_20:
1079 reg_bw_opmode |= BW_OPMODE_20MHZ;
1080 rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
1081 break;
1082 case HT_CHANNEL_WIDTH_20_40:
1083 reg_bw_opmode &= ~BW_OPMODE_20MHZ;
1084 rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
1085
1086 reg_prsr_rsc = (reg_prsr_rsc & 0x90) |
1087 (mac->cur_40_prime_sc << 5);
1088 rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_prsr_rsc);
1089 break;
1090 default:
1091 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1092 "unknown bandwidth: %#X\n", rtlphy->current_chan_bw);
1093 break;
1094 }
1095 switch (rtlphy->current_chan_bw) {
1096 case HT_CHANNEL_WIDTH_20:
1097 rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x0);
1098 rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x0);
1099 /* SET BIT10 BIT11 for receive cck */
1100 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10) |
1101 BIT(11), 3);
1102 break;
1103 case HT_CHANNEL_WIDTH_20_40:
1104 rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x1);
1105 rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x1);
1106 /* Set Control channel to upper or lower.
1107 * These settings are required only for 40MHz */
1108 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1109 rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag);
1110 rtl_set_bbreg(hw, RCCK0_SYSTEM, BCCKSIDEBAND,
1111 (mac->cur_40_prime_sc >> 1));
1112 rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
1113 }
1114 rtl_set_bbreg(hw, ROFDM1_LSTF, 0xC00, mac->cur_40_prime_sc);
1115 /* SET BIT10 BIT11 for receive cck */
1116 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10) |
1117 BIT(11), 0);
1118 rtl_set_bbreg(hw, 0x818, (BIT(26) | BIT(27)),
1119 (mac->cur_40_prime_sc ==
1120 HAL_PRIME_CHNL_OFFSET_LOWER) ? 2 : 1);
1121 break;
1122 default:
1123 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1124 "unknown bandwidth: %#X\n", rtlphy->current_chan_bw);
1125 break;
1126
1127 }
1128 rtl92d_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
1129 rtlphy->set_bwmode_inprogress = false;
1130 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "<==\n");
1131 }
1132
1133 static void _rtl92d_phy_stop_trx_before_changeband(struct ieee80211_hw *hw)
1134 {
1135 rtl_set_bbreg(hw, RFPGA0_RFMOD, BCCKEN, 0);
1136 rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 0);
1137 rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, BMASKBYTE0, 0x00);
1138 rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE, BDWORD, 0x0);
1139 }
1140
1141 static void rtl92d_phy_switch_wirelessband(struct ieee80211_hw *hw, u8 band)
1142 {
1143 struct rtl_priv *rtlpriv = rtl_priv(hw);
1144 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1145 u8 value8;
1146
1147 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "==>\n");
1148 rtlhal->bandset = band;
1149 rtlhal->current_bandtype = band;
1150 if (IS_92D_SINGLEPHY(rtlhal->version))
1151 rtlhal->bandset = BAND_ON_BOTH;
1152 /* stop RX/Tx */
1153 _rtl92d_phy_stop_trx_before_changeband(hw);
1154 /* reconfig BB/RF according to wireless mode */
1155 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1156 /* BB & RF Config */
1157 RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG, "====>2.4G\n");
1158 if (rtlhal->interfaceindex == 1)
1159 _rtl92d_phy_config_bb_with_headerfile(hw,
1160 BASEBAND_CONFIG_AGC_TAB);
1161 } else {
1162 /* 5G band */
1163 RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG, "====>5G\n");
1164 if (rtlhal->interfaceindex == 1)
1165 _rtl92d_phy_config_bb_with_headerfile(hw,
1166 BASEBAND_CONFIG_AGC_TAB);
1167 }
1168 rtl92d_update_bbrf_configuration(hw);
1169 if (rtlhal->current_bandtype == BAND_ON_2_4G)
1170 rtl_set_bbreg(hw, RFPGA0_RFMOD, BCCKEN, 0x1);
1171 rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 0x1);
1172
1173 /* 20M BW. */
1174 /* rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 1); */
1175 rtlhal->reloadtxpowerindex = true;
1176 /* notice fw know band status 0x81[1]/0x53[1] = 0: 5G, 1: 2G */
1177 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1178 value8 = rtl_read_byte(rtlpriv, (rtlhal->interfaceindex ==
1179 0 ? REG_MAC0 : REG_MAC1));
1180 value8 |= BIT(1);
1181 rtl_write_byte(rtlpriv, (rtlhal->interfaceindex ==
1182 0 ? REG_MAC0 : REG_MAC1), value8);
1183 } else {
1184 value8 = rtl_read_byte(rtlpriv, (rtlhal->interfaceindex ==
1185 0 ? REG_MAC0 : REG_MAC1));
1186 value8 &= (~BIT(1));
1187 rtl_write_byte(rtlpriv, (rtlhal->interfaceindex ==
1188 0 ? REG_MAC0 : REG_MAC1), value8);
1189 }
1190 mdelay(1);
1191 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "<==Switch Band OK\n");
1192 }
1193
1194 static void _rtl92d_phy_reload_imr_setting(struct ieee80211_hw *hw,
1195 u8 channel, u8 rfpath)
1196 {
1197 struct rtl_priv *rtlpriv = rtl_priv(hw);
1198 u32 imr_num = MAX_RF_IMR_INDEX;
1199 u32 rfmask = BRFREGOFFSETMASK;
1200 u8 group, i;
1201 unsigned long flag = 0;
1202
1203 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>path %d\n", rfpath);
1204 if (rtlpriv->rtlhal.current_bandtype == BAND_ON_5G) {
1205 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>5G\n");
1206 rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(25) | BIT(24), 0);
1207 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0x00f00000, 0xf);
1208 /* fc area 0xd2c */
1209 if (channel > 99)
1210 rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(13) |
1211 BIT(14), 2);
1212 else
1213 rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(13) |
1214 BIT(14), 1);
1215 /* leave 0 for channel1-14. */
1216 group = channel <= 64 ? 1 : 2;
1217 imr_num = MAX_RF_IMR_INDEX_NORMAL;
1218 for (i = 0; i < imr_num; i++)
1219 rtl_set_rfreg(hw, (enum radio_path)rfpath,
1220 rf_reg_for_5g_swchnl_normal[i], rfmask,
1221 rf_imr_param_normal[0][group][i]);
1222 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0x00f00000, 0);
1223 rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 1);
1224 } else {
1225 /* G band. */
1226 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
1227 "Load RF IMR parameters for G band. IMR already setting %d\n",
1228 rtlpriv->rtlhal.load_imrandiqk_setting_for2g);
1229 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>2.4G\n");
1230 if (!rtlpriv->rtlhal.load_imrandiqk_setting_for2g) {
1231 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
1232 "Load RF IMR parameters for G band. %d\n",
1233 rfpath);
1234 rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag);
1235 rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(25) | BIT(24), 0);
1236 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4,
1237 0x00f00000, 0xf);
1238 imr_num = MAX_RF_IMR_INDEX_NORMAL;
1239 for (i = 0; i < imr_num; i++) {
1240 rtl_set_rfreg(hw, (enum radio_path)rfpath,
1241 rf_reg_for_5g_swchnl_normal[i],
1242 BRFREGOFFSETMASK,
1243 rf_imr_param_normal[0][0][i]);
1244 }
1245 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4,
1246 0x00f00000, 0);
1247 rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN | BCCKEN, 3);
1248 rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
1249 }
1250 }
1251 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
1252 }
1253
1254 static void _rtl92d_phy_enable_rf_env(struct ieee80211_hw *hw,
1255 u8 rfpath, u32 *pu4_regval)
1256 {
1257 struct rtl_priv *rtlpriv = rtl_priv(hw);
1258 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1259 struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
1260
1261 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "====>\n");
1262 /*----Store original RFENV control type----*/
1263 switch (rfpath) {
1264 case RF90_PATH_A:
1265 case RF90_PATH_C:
1266 *pu4_regval = rtl_get_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV);
1267 break;
1268 case RF90_PATH_B:
1269 case RF90_PATH_D:
1270 *pu4_regval =
1271 rtl_get_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV << 16);
1272 break;
1273 }
1274 /*----Set RF_ENV enable----*/
1275 rtl_set_bbreg(hw, pphyreg->rfintfe, BRFSI_RFENV << 16, 0x1);
1276 udelay(1);
1277 /*----Set RF_ENV output high----*/
1278 rtl_set_bbreg(hw, pphyreg->rfintfo, BRFSI_RFENV, 0x1);
1279 udelay(1);
1280 /* Set bit number of Address and Data for RF register */
1281 /* Set 1 to 4 bits for 8255 */
1282 rtl_set_bbreg(hw, pphyreg->rfhssi_para2, B3WIREADDRESSLENGTH, 0x0);
1283 udelay(1);
1284 /*Set 0 to 12 bits for 8255 */
1285 rtl_set_bbreg(hw, pphyreg->rfhssi_para2, B3WIREDATALENGTH, 0x0);
1286 udelay(1);
1287 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "<====\n");
1288 }
1289
1290 static void _rtl92d_phy_restore_rf_env(struct ieee80211_hw *hw, u8 rfpath,
1291 u32 *pu4_regval)
1292 {
1293 struct rtl_priv *rtlpriv = rtl_priv(hw);
1294 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1295 struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
1296
1297 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "=====>\n");
1298 /*----Restore RFENV control type----*/
1299 switch (rfpath) {
1300 case RF90_PATH_A:
1301 case RF90_PATH_C:
1302 rtl_set_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV, *pu4_regval);
1303 break;
1304 case RF90_PATH_B:
1305 case RF90_PATH_D:
1306 rtl_set_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV << 16,
1307 *pu4_regval);
1308 break;
1309 }
1310 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "<=====\n");
1311 }
1312
1313 static void _rtl92d_phy_switch_rf_setting(struct ieee80211_hw *hw, u8 channel)
1314 {
1315 struct rtl_priv *rtlpriv = rtl_priv(hw);
1316 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1317 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
1318 u8 path = rtlhal->current_bandtype ==
1319 BAND_ON_5G ? RF90_PATH_A : RF90_PATH_B;
1320 u8 index = 0, i = 0, rfpath = RF90_PATH_A;
1321 bool need_pwr_down = false, internal_pa = false;
1322 u32 u4regvalue, mask = 0x1C000, value = 0, u4tmp, u4tmp2;
1323
1324 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>\n");
1325 /* config path A for 5G */
1326 if (rtlhal->current_bandtype == BAND_ON_5G) {
1327 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>5G\n");
1328 u4tmp = curveindex_5g[channel - 1];
1329 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1330 "ver 1 set RF-A, 5G, 0x28 = 0x%x !!\n", u4tmp);
1331 for (i = 0; i < RF_CHNL_NUM_5G; i++) {
1332 if (channel == rf_chnl_5g[i] && channel <= 140)
1333 index = 0;
1334 }
1335 for (i = 0; i < RF_CHNL_NUM_5G_40M; i++) {
1336 if (channel == rf_chnl_5g_40m[i] && channel <= 140)
1337 index = 1;
1338 }
1339 if (channel == 149 || channel == 155 || channel == 161)
1340 index = 2;
1341 else if (channel == 151 || channel == 153 || channel == 163
1342 || channel == 165)
1343 index = 3;
1344 else if (channel == 157 || channel == 159)
1345 index = 4;
1346
1347 if (rtlhal->macphymode == DUALMAC_DUALPHY
1348 && rtlhal->interfaceindex == 1) {
1349 need_pwr_down = rtl92d_phy_enable_anotherphy(hw, false);
1350 rtlhal->during_mac1init_radioa = true;
1351 /* asume no this case */
1352 if (need_pwr_down)
1353 _rtl92d_phy_enable_rf_env(hw, path,
1354 &u4regvalue);
1355 }
1356 for (i = 0; i < RF_REG_NUM_FOR_C_CUT_5G; i++) {
1357 if (i == 0 && (rtlhal->macphymode == DUALMAC_DUALPHY)) {
1358 rtl_set_rfreg(hw, (enum radio_path)path,
1359 rf_reg_for_c_cut_5g[i],
1360 BRFREGOFFSETMASK, 0xE439D);
1361 } else if (rf_reg_for_c_cut_5g[i] == RF_SYN_G4) {
1362 u4tmp2 = (rf_reg_pram_c_5g[index][i] &
1363 0x7FF) | (u4tmp << 11);
1364 if (channel == 36)
1365 u4tmp2 &= ~(BIT(7) | BIT(6));
1366 rtl_set_rfreg(hw, (enum radio_path)path,
1367 rf_reg_for_c_cut_5g[i],
1368 BRFREGOFFSETMASK, u4tmp2);
1369 } else {
1370 rtl_set_rfreg(hw, (enum radio_path)path,
1371 rf_reg_for_c_cut_5g[i],
1372 BRFREGOFFSETMASK,
1373 rf_reg_pram_c_5g[index][i]);
1374 }
1375 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
1376 "offset 0x%x value 0x%x path %d index %d readback 0x%x\n",
1377 rf_reg_for_c_cut_5g[i],
1378 rf_reg_pram_c_5g[index][i],
1379 path, index,
1380 rtl_get_rfreg(hw, (enum radio_path)path,
1381 rf_reg_for_c_cut_5g[i],
1382 BRFREGOFFSETMASK));
1383 }
1384 if (need_pwr_down)
1385 _rtl92d_phy_restore_rf_env(hw, path, &u4regvalue);
1386 if (rtlhal->during_mac1init_radioa)
1387 rtl92d_phy_powerdown_anotherphy(hw, false);
1388 if (channel < 149)
1389 value = 0x07;
1390 else if (channel >= 149)
1391 value = 0x02;
1392 if (channel >= 36 && channel <= 64)
1393 index = 0;
1394 else if (channel >= 100 && channel <= 140)
1395 index = 1;
1396 else
1397 index = 2;
1398 for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
1399 rfpath++) {
1400 if (rtlhal->macphymode == DUALMAC_DUALPHY &&
1401 rtlhal->interfaceindex == 1) /* MAC 1 5G */
1402 internal_pa = rtlpriv->efuse.internal_pa_5g[1];
1403 else
1404 internal_pa =
1405 rtlpriv->efuse.internal_pa_5g[rfpath];
1406 if (internal_pa) {
1407 for (i = 0;
1408 i < RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA;
1409 i++) {
1410 rtl_set_rfreg(hw, rfpath,
1411 rf_for_c_cut_5g_internal_pa[i],
1412 BRFREGOFFSETMASK,
1413 rf_pram_c_5g_int_pa[index][i]);
1414 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
1415 "offset 0x%x value 0x%x path %d index %d\n",
1416 rf_for_c_cut_5g_internal_pa[i],
1417 rf_pram_c_5g_int_pa[index][i],
1418 rfpath, index);
1419 }
1420 } else {
1421 rtl_set_rfreg(hw, (enum radio_path)rfpath, 0x0B,
1422 mask, value);
1423 }
1424 }
1425 } else if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1426 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>2.4G\n");
1427 u4tmp = curveindex_2g[channel - 1];
1428 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1429 "ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n", u4tmp);
1430 if (channel == 1 || channel == 2 || channel == 4 || channel == 9
1431 || channel == 10 || channel == 11 || channel == 12)
1432 index = 0;
1433 else if (channel == 3 || channel == 13 || channel == 14)
1434 index = 1;
1435 else if (channel >= 5 && channel <= 8)
1436 index = 2;
1437 if (rtlhal->macphymode == DUALMAC_DUALPHY) {
1438 path = RF90_PATH_A;
1439 if (rtlhal->interfaceindex == 0) {
1440 need_pwr_down =
1441 rtl92d_phy_enable_anotherphy(hw, true);
1442 rtlhal->during_mac0init_radiob = true;
1443
1444 if (need_pwr_down)
1445 _rtl92d_phy_enable_rf_env(hw, path,
1446 &u4regvalue);
1447 }
1448 }
1449 for (i = 0; i < RF_REG_NUM_FOR_C_CUT_2G; i++) {
1450 if (rf_reg_for_c_cut_2g[i] == RF_SYN_G7)
1451 rtl_set_rfreg(hw, (enum radio_path)path,
1452 rf_reg_for_c_cut_2g[i],
1453 BRFREGOFFSETMASK,
1454 (rf_reg_param_for_c_cut_2g[index][i] |
1455 BIT(17)));
1456 else
1457 rtl_set_rfreg(hw, (enum radio_path)path,
1458 rf_reg_for_c_cut_2g[i],
1459 BRFREGOFFSETMASK,
1460 rf_reg_param_for_c_cut_2g
1461 [index][i]);
1462 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
1463 "offset 0x%x value 0x%x mak 0x%x path %d index %d readback 0x%x\n",
1464 rf_reg_for_c_cut_2g[i],
1465 rf_reg_param_for_c_cut_2g[index][i],
1466 rf_reg_mask_for_c_cut_2g[i], path, index,
1467 rtl_get_rfreg(hw, (enum radio_path)path,
1468 rf_reg_for_c_cut_2g[i],
1469 BRFREGOFFSETMASK));
1470 }
1471 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1472 "cosa ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n",
1473 rf_syn_g4_for_c_cut_2g | (u4tmp << 11));
1474
1475 rtl_set_rfreg(hw, (enum radio_path)path, RF_SYN_G4,
1476 BRFREGOFFSETMASK,
1477 rf_syn_g4_for_c_cut_2g | (u4tmp << 11));
1478 if (need_pwr_down)
1479 _rtl92d_phy_restore_rf_env(hw, path, &u4regvalue);
1480 if (rtlhal->during_mac0init_radiob)
1481 rtl92d_phy_powerdown_anotherphy(hw, true);
1482 }
1483 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
1484 }
1485
1486 u8 rtl92d_get_rightchnlplace_for_iqk(u8 chnl)
1487 {
1488 u8 channel_all[59] = {
1489 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
1490 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
1491 60, 62, 64, 100, 102, 104, 106, 108, 110, 112,
1492 114, 116, 118, 120, 122, 124, 126, 128, 130,
1493 132, 134, 136, 138, 140, 149, 151, 153, 155,
1494 157, 159, 161, 163, 165
1495 };
1496 u8 place = chnl;
1497
1498 if (chnl > 14) {
1499 for (place = 14; place < sizeof(channel_all); place++) {
1500 if (channel_all[place] == chnl)
1501 return place - 13;
1502 }
1503 }
1504
1505 return 0;
1506 }
1507
1508 #define MAX_TOLERANCE 5
1509 #define IQK_DELAY_TIME 1 /* ms */
1510 #define MAX_TOLERANCE_92D 3
1511
1512 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
1513 static u8 _rtl92d_phy_patha_iqk(struct ieee80211_hw *hw, bool configpathb)
1514 {
1515 struct rtl_priv *rtlpriv = rtl_priv(hw);
1516 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1517 u32 regeac, rege94, rege9c, regea4;
1518 u8 result = 0;
1519
1520 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path A IQK!\n");
1521 /* path-A IQK setting */
1522 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path-A IQK setting!\n");
1523 if (rtlhal->interfaceindex == 0) {
1524 rtl_set_bbreg(hw, 0xe30, BMASKDWORD, 0x10008c1f);
1525 rtl_set_bbreg(hw, 0xe34, BMASKDWORD, 0x10008c1f);
1526 } else {
1527 rtl_set_bbreg(hw, 0xe30, BMASKDWORD, 0x10008c22);
1528 rtl_set_bbreg(hw, 0xe34, BMASKDWORD, 0x10008c22);
1529 }
1530 rtl_set_bbreg(hw, 0xe38, BMASKDWORD, 0x82140102);
1531 rtl_set_bbreg(hw, 0xe3c, BMASKDWORD, 0x28160206);
1532 /* path-B IQK setting */
1533 if (configpathb) {
1534 rtl_set_bbreg(hw, 0xe50, BMASKDWORD, 0x10008c22);
1535 rtl_set_bbreg(hw, 0xe54, BMASKDWORD, 0x10008c22);
1536 rtl_set_bbreg(hw, 0xe58, BMASKDWORD, 0x82140102);
1537 rtl_set_bbreg(hw, 0xe5c, BMASKDWORD, 0x28160206);
1538 }
1539 /* LO calibration setting */
1540 RTPRINT(rtlpriv, FINIT, INIT_IQK, "LO calibration setting!\n");
1541 rtl_set_bbreg(hw, 0xe4c, BMASKDWORD, 0x00462911);
1542 /* One shot, path A LOK & IQK */
1543 RTPRINT(rtlpriv, FINIT, INIT_IQK, "One shot, path A LOK & IQK!\n");
1544 rtl_set_bbreg(hw, 0xe48, BMASKDWORD, 0xf9000000);
1545 rtl_set_bbreg(hw, 0xe48, BMASKDWORD, 0xf8000000);
1546 /* delay x ms */
1547 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1548 "Delay %d ms for One shot, path A LOK & IQK\n",
1549 IQK_DELAY_TIME);
1550 mdelay(IQK_DELAY_TIME);
1551 /* Check failed */
1552 regeac = rtl_get_bbreg(hw, 0xeac, BMASKDWORD);
1553 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xeac = 0x%x\n", regeac);
1554 rege94 = rtl_get_bbreg(hw, 0xe94, BMASKDWORD);
1555 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xe94 = 0x%x\n", rege94);
1556 rege9c = rtl_get_bbreg(hw, 0xe9c, BMASKDWORD);
1557 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xe9c = 0x%x\n", rege9c);
1558 regea4 = rtl_get_bbreg(hw, 0xea4, BMASKDWORD);
1559 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xea4 = 0x%x\n", regea4);
1560 if (!(regeac & BIT(28)) && (((rege94 & 0x03FF0000) >> 16) != 0x142) &&
1561 (((rege9c & 0x03FF0000) >> 16) != 0x42))
1562 result |= 0x01;
1563 else /* if Tx not OK, ignore Rx */
1564 return result;
1565 /* if Tx is OK, check whether Rx is OK */
1566 if (!(regeac & BIT(27)) && (((regea4 & 0x03FF0000) >> 16) != 0x132) &&
1567 (((regeac & 0x03FF0000) >> 16) != 0x36))
1568 result |= 0x02;
1569 else
1570 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path A Rx IQK fail!!\n");
1571 return result;
1572 }
1573
1574 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
1575 static u8 _rtl92d_phy_patha_iqk_5g_normal(struct ieee80211_hw *hw,
1576 bool configpathb)
1577 {
1578 struct rtl_priv *rtlpriv = rtl_priv(hw);
1579 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1580 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1581 u32 regeac, rege94, rege9c, regea4;
1582 u8 result = 0;
1583 u8 i;
1584 u8 retrycount = 2;
1585 u32 TxOKBit = BIT(28), RxOKBit = BIT(27);
1586
1587 if (rtlhal->interfaceindex == 1) { /* PHY1 */
1588 TxOKBit = BIT(31);
1589 RxOKBit = BIT(30);
1590 }
1591 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path A IQK!\n");
1592 /* path-A IQK setting */
1593 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path-A IQK setting!\n");
1594 rtl_set_bbreg(hw, 0xe30, BMASKDWORD, 0x18008c1f);
1595 rtl_set_bbreg(hw, 0xe34, BMASKDWORD, 0x18008c1f);
1596 rtl_set_bbreg(hw, 0xe38, BMASKDWORD, 0x82140307);
1597 rtl_set_bbreg(hw, 0xe3c, BMASKDWORD, 0x68160960);
1598 /* path-B IQK setting */
1599 if (configpathb) {
1600 rtl_set_bbreg(hw, 0xe50, BMASKDWORD, 0x18008c2f);
1601 rtl_set_bbreg(hw, 0xe54, BMASKDWORD, 0x18008c2f);
1602 rtl_set_bbreg(hw, 0xe58, BMASKDWORD, 0x82110000);
1603 rtl_set_bbreg(hw, 0xe5c, BMASKDWORD, 0x68110000);
1604 }
1605 /* LO calibration setting */
1606 RTPRINT(rtlpriv, FINIT, INIT_IQK, "LO calibration setting!\n");
1607 rtl_set_bbreg(hw, 0xe4c, BMASKDWORD, 0x00462911);
1608 /* path-A PA on */
1609 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BMASKDWORD, 0x07000f60);
1610 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BMASKDWORD, 0x66e60e30);
1611 for (i = 0; i < retrycount; i++) {
1612 /* One shot, path A LOK & IQK */
1613 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1614 "One shot, path A LOK & IQK!\n");
1615 rtl_set_bbreg(hw, 0xe48, BMASKDWORD, 0xf9000000);
1616 rtl_set_bbreg(hw, 0xe48, BMASKDWORD, 0xf8000000);
1617 /* delay x ms */
1618 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1619 "Delay %d ms for One shot, path A LOK & IQK.\n",
1620 IQK_DELAY_TIME);
1621 mdelay(IQK_DELAY_TIME * 10);
1622 /* Check failed */
1623 regeac = rtl_get_bbreg(hw, 0xeac, BMASKDWORD);
1624 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xeac = 0x%x\n", regeac);
1625 rege94 = rtl_get_bbreg(hw, 0xe94, BMASKDWORD);
1626 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xe94 = 0x%x\n", rege94);
1627 rege9c = rtl_get_bbreg(hw, 0xe9c, BMASKDWORD);
1628 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xe9c = 0x%x\n", rege9c);
1629 regea4 = rtl_get_bbreg(hw, 0xea4, BMASKDWORD);
1630 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xea4 = 0x%x\n", regea4);
1631 if (!(regeac & TxOKBit) &&
1632 (((rege94 & 0x03FF0000) >> 16) != 0x142)) {
1633 result |= 0x01;
1634 } else { /* if Tx not OK, ignore Rx */
1635 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1636 "Path A Tx IQK fail!!\n");
1637 continue;
1638 }
1639
1640 /* if Tx is OK, check whether Rx is OK */
1641 if (!(regeac & RxOKBit) &&
1642 (((regea4 & 0x03FF0000) >> 16) != 0x132)) {
1643 result |= 0x02;
1644 break;
1645 } else {
1646 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1647 "Path A Rx IQK fail!!\n");
1648 }
1649 }
1650 /* path A PA off */
1651 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BMASKDWORD,
1652 rtlphy->iqk_bb_backup[0]);
1653 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BMASKDWORD,
1654 rtlphy->iqk_bb_backup[1]);
1655 return result;
1656 }
1657
1658 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
1659 static u8 _rtl92d_phy_pathb_iqk(struct ieee80211_hw *hw)
1660 {
1661 struct rtl_priv *rtlpriv = rtl_priv(hw);
1662 u32 regeac, regeb4, regebc, regec4, regecc;
1663 u8 result = 0;
1664
1665 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path B IQK!\n");
1666 /* One shot, path B LOK & IQK */
1667 RTPRINT(rtlpriv, FINIT, INIT_IQK, "One shot, path A LOK & IQK!\n");
1668 rtl_set_bbreg(hw, 0xe60, BMASKDWORD, 0x00000002);
1669 rtl_set_bbreg(hw, 0xe60, BMASKDWORD, 0x00000000);
1670 /* delay x ms */
1671 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1672 "Delay %d ms for One shot, path B LOK & IQK\n", IQK_DELAY_TIME);
1673 mdelay(IQK_DELAY_TIME);
1674 /* Check failed */
1675 regeac = rtl_get_bbreg(hw, 0xeac, BMASKDWORD);
1676 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xeac = 0x%x\n", regeac);
1677 regeb4 = rtl_get_bbreg(hw, 0xeb4, BMASKDWORD);
1678 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xeb4 = 0x%x\n", regeb4);
1679 regebc = rtl_get_bbreg(hw, 0xebc, BMASKDWORD);
1680 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xebc = 0x%x\n", regebc);
1681 regec4 = rtl_get_bbreg(hw, 0xec4, BMASKDWORD);
1682 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xec4 = 0x%x\n", regec4);
1683 regecc = rtl_get_bbreg(hw, 0xecc, BMASKDWORD);
1684 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xecc = 0x%x\n", regecc);
1685 if (!(regeac & BIT(31)) && (((regeb4 & 0x03FF0000) >> 16) != 0x142) &&
1686 (((regebc & 0x03FF0000) >> 16) != 0x42))
1687 result |= 0x01;
1688 else
1689 return result;
1690 if (!(regeac & BIT(30)) && (((regec4 & 0x03FF0000) >> 16) != 0x132) &&
1691 (((regecc & 0x03FF0000) >> 16) != 0x36))
1692 result |= 0x02;
1693 else
1694 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path B Rx IQK fail!!\n");
1695 return result;
1696 }
1697
1698 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
1699 static u8 _rtl92d_phy_pathb_iqk_5g_normal(struct ieee80211_hw *hw)
1700 {
1701 struct rtl_priv *rtlpriv = rtl_priv(hw);
1702 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1703 u32 regeac, regeb4, regebc, regec4, regecc;
1704 u8 result = 0;
1705 u8 i;
1706 u8 retrycount = 2;
1707
1708 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path B IQK!\n");
1709 /* path-A IQK setting */
1710 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path-A IQK setting!\n");
1711 rtl_set_bbreg(hw, 0xe30, BMASKDWORD, 0x18008c1f);
1712 rtl_set_bbreg(hw, 0xe34, BMASKDWORD, 0x18008c1f);
1713 rtl_set_bbreg(hw, 0xe38, BMASKDWORD, 0x82110000);
1714 rtl_set_bbreg(hw, 0xe3c, BMASKDWORD, 0x68110000);
1715
1716 /* path-B IQK setting */
1717 rtl_set_bbreg(hw, 0xe50, BMASKDWORD, 0x18008c2f);
1718 rtl_set_bbreg(hw, 0xe54, BMASKDWORD, 0x18008c2f);
1719 rtl_set_bbreg(hw, 0xe58, BMASKDWORD, 0x82140307);
1720 rtl_set_bbreg(hw, 0xe5c, BMASKDWORD, 0x68160960);
1721
1722 /* LO calibration setting */
1723 RTPRINT(rtlpriv, FINIT, INIT_IQK, "LO calibration setting!\n");
1724 rtl_set_bbreg(hw, 0xe4c, BMASKDWORD, 0x00462911);
1725
1726 /* path-B PA on */
1727 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BMASKDWORD, 0x0f600700);
1728 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, BMASKDWORD, 0x061f0d30);
1729
1730 for (i = 0; i < retrycount; i++) {
1731 /* One shot, path B LOK & IQK */
1732 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1733 "One shot, path A LOK & IQK!\n");
1734 rtl_set_bbreg(hw, 0xe48, BMASKDWORD, 0xfa000000);
1735 rtl_set_bbreg(hw, 0xe48, BMASKDWORD, 0xf8000000);
1736
1737 /* delay x ms */
1738 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1739 "Delay %d ms for One shot, path B LOK & IQK.\n", 10);
1740 mdelay(IQK_DELAY_TIME * 10);
1741
1742 /* Check failed */
1743 regeac = rtl_get_bbreg(hw, 0xeac, BMASKDWORD);
1744 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xeac = 0x%x\n", regeac);
1745 regeb4 = rtl_get_bbreg(hw, 0xeb4, BMASKDWORD);
1746 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xeb4 = 0x%x\n", regeb4);
1747 regebc = rtl_get_bbreg(hw, 0xebc, BMASKDWORD);
1748 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xebc = 0x%x\n", regebc);
1749 regec4 = rtl_get_bbreg(hw, 0xec4, BMASKDWORD);
1750 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xec4 = 0x%x\n", regec4);
1751 regecc = rtl_get_bbreg(hw, 0xecc, BMASKDWORD);
1752 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xecc = 0x%x\n", regecc);
1753 if (!(regeac & BIT(31)) &&
1754 (((regeb4 & 0x03FF0000) >> 16) != 0x142))
1755 result |= 0x01;
1756 else
1757 continue;
1758 if (!(regeac & BIT(30)) &&
1759 (((regec4 & 0x03FF0000) >> 16) != 0x132)) {
1760 result |= 0x02;
1761 break;
1762 } else {
1763 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1764 "Path B Rx IQK fail!!\n");
1765 }
1766 }
1767
1768 /* path B PA off */
1769 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BMASKDWORD,
1770 rtlphy->iqk_bb_backup[0]);
1771 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, BMASKDWORD,
1772 rtlphy->iqk_bb_backup[2]);
1773 return result;
1774 }
1775
1776 static void _rtl92d_phy_save_adda_registers(struct ieee80211_hw *hw,
1777 u32 *adda_reg, u32 *adda_backup,
1778 u32 regnum)
1779 {
1780 struct rtl_priv *rtlpriv = rtl_priv(hw);
1781 u32 i;
1782
1783 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Save ADDA parameters.\n");
1784 for (i = 0; i < regnum; i++)
1785 adda_backup[i] = rtl_get_bbreg(hw, adda_reg[i], BMASKDWORD);
1786 }
1787
1788 static void _rtl92d_phy_save_mac_registers(struct ieee80211_hw *hw,
1789 u32 *macreg, u32 *macbackup)
1790 {
1791 struct rtl_priv *rtlpriv = rtl_priv(hw);
1792 u32 i;
1793
1794 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Save MAC parameters.\n");
1795 for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
1796 macbackup[i] = rtl_read_byte(rtlpriv, macreg[i]);
1797 macbackup[i] = rtl_read_dword(rtlpriv, macreg[i]);
1798 }
1799
1800 static void _rtl92d_phy_reload_adda_registers(struct ieee80211_hw *hw,
1801 u32 *adda_reg, u32 *adda_backup,
1802 u32 regnum)
1803 {
1804 struct rtl_priv *rtlpriv = rtl_priv(hw);
1805 u32 i;
1806
1807 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1808 "Reload ADDA power saving parameters !\n");
1809 for (i = 0; i < regnum; i++)
1810 rtl_set_bbreg(hw, adda_reg[i], BMASKDWORD, adda_backup[i]);
1811 }
1812
1813 static void _rtl92d_phy_reload_mac_registers(struct ieee80211_hw *hw,
1814 u32 *macreg, u32 *macbackup)
1815 {
1816 struct rtl_priv *rtlpriv = rtl_priv(hw);
1817 u32 i;
1818
1819 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Reload MAC parameters !\n");
1820 for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
1821 rtl_write_byte(rtlpriv, macreg[i], (u8) macbackup[i]);
1822 rtl_write_byte(rtlpriv, macreg[i], macbackup[i]);
1823 }
1824
1825 static void _rtl92d_phy_path_adda_on(struct ieee80211_hw *hw,
1826 u32 *adda_reg, bool patha_on, bool is2t)
1827 {
1828 struct rtl_priv *rtlpriv = rtl_priv(hw);
1829 u32 pathon;
1830 u32 i;
1831
1832 RTPRINT(rtlpriv, FINIT, INIT_IQK, "ADDA ON.\n");
1833 pathon = patha_on ? 0x04db25a4 : 0x0b1b25a4;
1834 if (patha_on)
1835 pathon = rtlpriv->rtlhal.interfaceindex == 0 ?
1836 0x04db25a4 : 0x0b1b25a4;
1837 for (i = 0; i < IQK_ADDA_REG_NUM; i++)
1838 rtl_set_bbreg(hw, adda_reg[i], BMASKDWORD, pathon);
1839 }
1840
1841 static void _rtl92d_phy_mac_setting_calibration(struct ieee80211_hw *hw,
1842 u32 *macreg, u32 *macbackup)
1843 {
1844 struct rtl_priv *rtlpriv = rtl_priv(hw);
1845 u32 i;
1846
1847 RTPRINT(rtlpriv, FINIT, INIT_IQK, "MAC settings for Calibration.\n");
1848 rtl_write_byte(rtlpriv, macreg[0], 0x3F);
1849
1850 for (i = 1; i < (IQK_MAC_REG_NUM - 1); i++)
1851 rtl_write_byte(rtlpriv, macreg[i], (u8)(macbackup[i] &
1852 (~BIT(3))));
1853 rtl_write_byte(rtlpriv, macreg[i], (u8) (macbackup[i] & (~BIT(5))));
1854 }
1855
1856 static void _rtl92d_phy_patha_standby(struct ieee80211_hw *hw)
1857 {
1858 struct rtl_priv *rtlpriv = rtl_priv(hw);
1859 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path-A standby mode!\n");
1860
1861 rtl_set_bbreg(hw, 0xe28, BMASKDWORD, 0x0);
1862 rtl_set_bbreg(hw, RFPGA0_XA_LSSIPARAMETER, BMASKDWORD, 0x00010000);
1863 rtl_set_bbreg(hw, 0xe28, BMASKDWORD, 0x80800000);
1864 }
1865
1866 static void _rtl92d_phy_pimode_switch(struct ieee80211_hw *hw, bool pi_mode)
1867 {
1868 struct rtl_priv *rtlpriv = rtl_priv(hw);
1869 u32 mode;
1870
1871 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1872 "BB Switch to %s mode!\n", pi_mode ? "PI" : "SI");
1873 mode = pi_mode ? 0x01000100 : 0x01000000;
1874 rtl_set_bbreg(hw, 0x820, BMASKDWORD, mode);
1875 rtl_set_bbreg(hw, 0x828, BMASKDWORD, mode);
1876 }
1877
1878 static void _rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw, long result[][8],
1879 u8 t, bool is2t)
1880 {
1881 struct rtl_priv *rtlpriv = rtl_priv(hw);
1882 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1883 u32 i;
1884 u8 patha_ok, pathb_ok;
1885 static u32 adda_reg[IQK_ADDA_REG_NUM] = {
1886 RFPGA0_XCD_SWITCHCONTROL, 0xe6c, 0xe70, 0xe74,
1887 0xe78, 0xe7c, 0xe80, 0xe84,
1888 0xe88, 0xe8c, 0xed0, 0xed4,
1889 0xed8, 0xedc, 0xee0, 0xeec
1890 };
1891 static u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
1892 0x522, 0x550, 0x551, 0x040
1893 };
1894 static u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
1895 RFPGA0_XAB_RFINTERFACESW, RFPGA0_XA_RFINTERFACEOE,
1896 RFPGA0_XB_RFINTERFACEOE, ROFDM0_TRMUXPAR,
1897 RFPGA0_XCD_RFINTERFACESW, ROFDM0_TRXPATHENABLE,
1898 RFPGA0_RFMOD, RFPGA0_ANALOGPARAMETER4,
1899 ROFDM0_XAAGCCORE1, ROFDM0_XBAGCCORE1
1900 };
1901 const u32 retrycount = 2;
1902 u32 bbvalue;
1903
1904 RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQK for 2.4G :Start!!!\n");
1905 if (t == 0) {
1906 bbvalue = rtl_get_bbreg(hw, RFPGA0_RFMOD, BMASKDWORD);
1907 RTPRINT(rtlpriv, FINIT, INIT_IQK, "==>0x%08x\n", bbvalue);
1908 RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQ Calibration for %s\n",
1909 is2t ? "2T2R" : "1T1R");
1910
1911 /* Save ADDA parameters, turn Path A ADDA on */
1912 _rtl92d_phy_save_adda_registers(hw, adda_reg,
1913 rtlphy->adda_backup, IQK_ADDA_REG_NUM);
1914 _rtl92d_phy_save_mac_registers(hw, iqk_mac_reg,
1915 rtlphy->iqk_mac_backup);
1916 _rtl92d_phy_save_adda_registers(hw, iqk_bb_reg,
1917 rtlphy->iqk_bb_backup, IQK_BB_REG_NUM);
1918 }
1919 _rtl92d_phy_path_adda_on(hw, adda_reg, true, is2t);
1920 if (t == 0)
1921 rtlphy->rfpi_enable = (u8) rtl_get_bbreg(hw,
1922 RFPGA0_XA_HSSIPARAMETER1, BIT(8));
1923
1924 /* Switch BB to PI mode to do IQ Calibration. */
1925 if (!rtlphy->rfpi_enable)
1926 _rtl92d_phy_pimode_switch(hw, true);
1927
1928 rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(24), 0x00);
1929 rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, BMASKDWORD, 0x03a05600);
1930 rtl_set_bbreg(hw, ROFDM0_TRMUXPAR, BMASKDWORD, 0x000800e4);
1931 rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, BMASKDWORD, 0x22204000);
1932 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xf00000, 0x0f);
1933 if (is2t) {
1934 rtl_set_bbreg(hw, RFPGA0_XA_LSSIPARAMETER, BMASKDWORD,
1935 0x00010000);
1936 rtl_set_bbreg(hw, RFPGA0_XB_LSSIPARAMETER, BMASKDWORD,
1937 0x00010000);
1938 }
1939 /* MAC settings */
1940 _rtl92d_phy_mac_setting_calibration(hw, iqk_mac_reg,
1941 rtlphy->iqk_mac_backup);
1942 /* Page B init */
1943 rtl_set_bbreg(hw, 0xb68, BMASKDWORD, 0x0f600000);
1944 if (is2t)
1945 rtl_set_bbreg(hw, 0xb6c, BMASKDWORD, 0x0f600000);
1946 /* IQ calibration setting */
1947 RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQK setting!\n");
1948 rtl_set_bbreg(hw, 0xe28, BMASKDWORD, 0x80800000);
1949 rtl_set_bbreg(hw, 0xe40, BMASKDWORD, 0x01007c00);
1950 rtl_set_bbreg(hw, 0xe44, BMASKDWORD, 0x01004800);
1951 for (i = 0; i < retrycount; i++) {
1952 patha_ok = _rtl92d_phy_patha_iqk(hw, is2t);
1953 if (patha_ok == 0x03) {
1954 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1955 "Path A IQK Success!!\n");
1956 result[t][0] = (rtl_get_bbreg(hw, 0xe94, BMASKDWORD) &
1957 0x3FF0000) >> 16;
1958 result[t][1] = (rtl_get_bbreg(hw, 0xe9c, BMASKDWORD) &
1959 0x3FF0000) >> 16;
1960 result[t][2] = (rtl_get_bbreg(hw, 0xea4, BMASKDWORD) &
1961 0x3FF0000) >> 16;
1962 result[t][3] = (rtl_get_bbreg(hw, 0xeac, BMASKDWORD) &
1963 0x3FF0000) >> 16;
1964 break;
1965 } else if (i == (retrycount - 1) && patha_ok == 0x01) {
1966 /* Tx IQK OK */
1967 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1968 "Path A IQK Only Tx Success!!\n");
1969
1970 result[t][0] = (rtl_get_bbreg(hw, 0xe94, BMASKDWORD) &
1971 0x3FF0000) >> 16;
1972 result[t][1] = (rtl_get_bbreg(hw, 0xe9c, BMASKDWORD) &
1973 0x3FF0000) >> 16;
1974 }
1975 }
1976 if (0x00 == patha_ok)
1977 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path A IQK failed!!\n");
1978 if (is2t) {
1979 _rtl92d_phy_patha_standby(hw);
1980 /* Turn Path B ADDA on */
1981 _rtl92d_phy_path_adda_on(hw, adda_reg, false, is2t);
1982 for (i = 0; i < retrycount; i++) {
1983 pathb_ok = _rtl92d_phy_pathb_iqk(hw);
1984 if (pathb_ok == 0x03) {
1985 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1986 "Path B IQK Success!!\n");
1987 result[t][4] = (rtl_get_bbreg(hw, 0xeb4,
1988 BMASKDWORD) & 0x3FF0000) >> 16;
1989 result[t][5] = (rtl_get_bbreg(hw, 0xebc,
1990 BMASKDWORD) & 0x3FF0000) >> 16;
1991 result[t][6] = (rtl_get_bbreg(hw, 0xec4,
1992 BMASKDWORD) & 0x3FF0000) >> 16;
1993 result[t][7] = (rtl_get_bbreg(hw, 0xecc,
1994 BMASKDWORD) & 0x3FF0000) >> 16;
1995 break;
1996 } else if (i == (retrycount - 1) && pathb_ok == 0x01) {
1997 /* Tx IQK OK */
1998 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1999 "Path B Only Tx IQK Success!!\n");
2000 result[t][4] = (rtl_get_bbreg(hw, 0xeb4,
2001 BMASKDWORD) & 0x3FF0000) >> 16;
2002 result[t][5] = (rtl_get_bbreg(hw, 0xebc,
2003 BMASKDWORD) & 0x3FF0000) >> 16;
2004 }
2005 }
2006 if (0x00 == pathb_ok)
2007 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2008 "Path B IQK failed!!\n");
2009 }
2010
2011 /* Back to BB mode, load original value */
2012 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2013 "IQK:Back to BB mode, load original value!\n");
2014
2015 rtl_set_bbreg(hw, 0xe28, BMASKDWORD, 0);
2016 if (t != 0) {
2017 /* Switch back BB to SI mode after finish IQ Calibration. */
2018 if (!rtlphy->rfpi_enable)
2019 _rtl92d_phy_pimode_switch(hw, false);
2020 /* Reload ADDA power saving parameters */
2021 _rtl92d_phy_reload_adda_registers(hw, adda_reg,
2022 rtlphy->adda_backup, IQK_ADDA_REG_NUM);
2023 /* Reload MAC parameters */
2024 _rtl92d_phy_reload_mac_registers(hw, iqk_mac_reg,
2025 rtlphy->iqk_mac_backup);
2026 if (is2t)
2027 _rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
2028 rtlphy->iqk_bb_backup,
2029 IQK_BB_REG_NUM);
2030 else
2031 _rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
2032 rtlphy->iqk_bb_backup,
2033 IQK_BB_REG_NUM - 1);
2034 /* load 0xe30 IQC default value */
2035 rtl_set_bbreg(hw, 0xe30, BMASKDWORD, 0x01008c00);
2036 rtl_set_bbreg(hw, 0xe34, BMASKDWORD, 0x01008c00);
2037 }
2038 RTPRINT(rtlpriv, FINIT, INIT_IQK, "<==\n");
2039 }
2040
2041 static void _rtl92d_phy_iq_calibrate_5g_normal(struct ieee80211_hw *hw,
2042 long result[][8], u8 t)
2043 {
2044 struct rtl_priv *rtlpriv = rtl_priv(hw);
2045 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2046 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2047 u8 patha_ok, pathb_ok;
2048 static u32 adda_reg[IQK_ADDA_REG_NUM] = {
2049 RFPGA0_XCD_SWITCHCONTROL, 0xe6c, 0xe70, 0xe74,
2050 0xe78, 0xe7c, 0xe80, 0xe84,
2051 0xe88, 0xe8c, 0xed0, 0xed4,
2052 0xed8, 0xedc, 0xee0, 0xeec
2053 };
2054 static u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
2055 0x522, 0x550, 0x551, 0x040
2056 };
2057 static u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
2058 RFPGA0_XAB_RFINTERFACESW, RFPGA0_XA_RFINTERFACEOE,
2059 RFPGA0_XB_RFINTERFACEOE, ROFDM0_TRMUXPAR,
2060 RFPGA0_XCD_RFINTERFACESW, ROFDM0_TRXPATHENABLE,
2061 RFPGA0_RFMOD, RFPGA0_ANALOGPARAMETER4,
2062 ROFDM0_XAAGCCORE1, ROFDM0_XBAGCCORE1
2063 };
2064 u32 bbvalue;
2065 bool is2t = IS_92D_SINGLEPHY(rtlhal->version);
2066
2067 /* Note: IQ calibration must be performed after loading
2068 * PHY_REG.txt , and radio_a, radio_b.txt */
2069
2070 RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQK for 5G NORMAL:Start!!!\n");
2071 mdelay(IQK_DELAY_TIME * 20);
2072 if (t == 0) {
2073 bbvalue = rtl_get_bbreg(hw, RFPGA0_RFMOD, BMASKDWORD);
2074 RTPRINT(rtlpriv, FINIT, INIT_IQK, "==>0x%08x\n", bbvalue);
2075 RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQ Calibration for %s\n",
2076 is2t ? "2T2R" : "1T1R");
2077 /* Save ADDA parameters, turn Path A ADDA on */
2078 _rtl92d_phy_save_adda_registers(hw, adda_reg,
2079 rtlphy->adda_backup,
2080 IQK_ADDA_REG_NUM);
2081 _rtl92d_phy_save_mac_registers(hw, iqk_mac_reg,
2082 rtlphy->iqk_mac_backup);
2083 if (is2t)
2084 _rtl92d_phy_save_adda_registers(hw, iqk_bb_reg,
2085 rtlphy->iqk_bb_backup,
2086 IQK_BB_REG_NUM);
2087 else
2088 _rtl92d_phy_save_adda_registers(hw, iqk_bb_reg,
2089 rtlphy->iqk_bb_backup,
2090 IQK_BB_REG_NUM - 1);
2091 }
2092 _rtl92d_phy_path_adda_on(hw, adda_reg, true, is2t);
2093 /* MAC settings */
2094 _rtl92d_phy_mac_setting_calibration(hw, iqk_mac_reg,
2095 rtlphy->iqk_mac_backup);
2096 if (t == 0)
2097 rtlphy->rfpi_enable = (u8) rtl_get_bbreg(hw,
2098 RFPGA0_XA_HSSIPARAMETER1, BIT(8));
2099 /* Switch BB to PI mode to do IQ Calibration. */
2100 if (!rtlphy->rfpi_enable)
2101 _rtl92d_phy_pimode_switch(hw, true);
2102 rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(24), 0x00);
2103 rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, BMASKDWORD, 0x03a05600);
2104 rtl_set_bbreg(hw, ROFDM0_TRMUXPAR, BMASKDWORD, 0x000800e4);
2105 rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, BMASKDWORD, 0x22208000);
2106 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xf00000, 0x0f);
2107
2108 /* Page B init */
2109 rtl_set_bbreg(hw, 0xb68, BMASKDWORD, 0x0f600000);
2110 if (is2t)
2111 rtl_set_bbreg(hw, 0xb6c, BMASKDWORD, 0x0f600000);
2112 /* IQ calibration setting */
2113 RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQK setting!\n");
2114 rtl_set_bbreg(hw, 0xe28, BMASKDWORD, 0x80800000);
2115 rtl_set_bbreg(hw, 0xe40, BMASKDWORD, 0x10007c00);
2116 rtl_set_bbreg(hw, 0xe44, BMASKDWORD, 0x01004800);
2117 patha_ok = _rtl92d_phy_patha_iqk_5g_normal(hw, is2t);
2118 if (patha_ok == 0x03) {
2119 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path A IQK Success!!\n");
2120 result[t][0] = (rtl_get_bbreg(hw, 0xe94, BMASKDWORD) &
2121 0x3FF0000) >> 16;
2122 result[t][1] = (rtl_get_bbreg(hw, 0xe9c, BMASKDWORD) &
2123 0x3FF0000) >> 16;
2124 result[t][2] = (rtl_get_bbreg(hw, 0xea4, BMASKDWORD) &
2125 0x3FF0000) >> 16;
2126 result[t][3] = (rtl_get_bbreg(hw, 0xeac, BMASKDWORD) &
2127 0x3FF0000) >> 16;
2128 } else if (patha_ok == 0x01) { /* Tx IQK OK */
2129 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2130 "Path A IQK Only Tx Success!!\n");
2131
2132 result[t][0] = (rtl_get_bbreg(hw, 0xe94, BMASKDWORD) &
2133 0x3FF0000) >> 16;
2134 result[t][1] = (rtl_get_bbreg(hw, 0xe9c, BMASKDWORD) &
2135 0x3FF0000) >> 16;
2136 } else {
2137 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path A IQK Fail!!\n");
2138 }
2139 if (is2t) {
2140 /* _rtl92d_phy_patha_standby(hw); */
2141 /* Turn Path B ADDA on */
2142 _rtl92d_phy_path_adda_on(hw, adda_reg, false, is2t);
2143 pathb_ok = _rtl92d_phy_pathb_iqk_5g_normal(hw);
2144 if (pathb_ok == 0x03) {
2145 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2146 "Path B IQK Success!!\n");
2147 result[t][4] = (rtl_get_bbreg(hw, 0xeb4, BMASKDWORD) &
2148 0x3FF0000) >> 16;
2149 result[t][5] = (rtl_get_bbreg(hw, 0xebc, BMASKDWORD) &
2150 0x3FF0000) >> 16;
2151 result[t][6] = (rtl_get_bbreg(hw, 0xec4, BMASKDWORD) &
2152 0x3FF0000) >> 16;
2153 result[t][7] = (rtl_get_bbreg(hw, 0xecc, BMASKDWORD) &
2154 0x3FF0000) >> 16;
2155 } else if (pathb_ok == 0x01) { /* Tx IQK OK */
2156 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2157 "Path B Only Tx IQK Success!!\n");
2158 result[t][4] = (rtl_get_bbreg(hw, 0xeb4, BMASKDWORD) &
2159 0x3FF0000) >> 16;
2160 result[t][5] = (rtl_get_bbreg(hw, 0xebc, BMASKDWORD) &
2161 0x3FF0000) >> 16;
2162 } else {
2163 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2164 "Path B IQK failed!!\n");
2165 }
2166 }
2167
2168 /* Back to BB mode, load original value */
2169 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2170 "IQK:Back to BB mode, load original value!\n");
2171 rtl_set_bbreg(hw, 0xe28, BMASKDWORD, 0);
2172 if (t != 0) {
2173 if (is2t)
2174 _rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
2175 rtlphy->iqk_bb_backup,
2176 IQK_BB_REG_NUM);
2177 else
2178 _rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
2179 rtlphy->iqk_bb_backup,
2180 IQK_BB_REG_NUM - 1);
2181 /* Reload MAC parameters */
2182 _rtl92d_phy_reload_mac_registers(hw, iqk_mac_reg,
2183 rtlphy->iqk_mac_backup);
2184 /* Switch back BB to SI mode after finish IQ Calibration. */
2185 if (!rtlphy->rfpi_enable)
2186 _rtl92d_phy_pimode_switch(hw, false);
2187 /* Reload ADDA power saving parameters */
2188 _rtl92d_phy_reload_adda_registers(hw, adda_reg,
2189 rtlphy->adda_backup,
2190 IQK_ADDA_REG_NUM);
2191 }
2192 RTPRINT(rtlpriv, FINIT, INIT_IQK, "<==\n");
2193 }
2194
2195 static bool _rtl92d_phy_simularity_compare(struct ieee80211_hw *hw,
2196 long result[][8], u8 c1, u8 c2)
2197 {
2198 struct rtl_priv *rtlpriv = rtl_priv(hw);
2199 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2200 u32 i, j, diff, sim_bitmap, bound;
2201 u8 final_candidate[2] = {0xFF, 0xFF}; /* for path A and path B */
2202 bool bresult = true;
2203 bool is2t = IS_92D_SINGLEPHY(rtlhal->version);
2204
2205 if (is2t)
2206 bound = 8;
2207 else
2208 bound = 4;
2209 sim_bitmap = 0;
2210 for (i = 0; i < bound; i++) {
2211 diff = (result[c1][i] > result[c2][i]) ? (result[c1][i] -
2212 result[c2][i]) : (result[c2][i] - result[c1][i]);
2213 if (diff > MAX_TOLERANCE_92D) {
2214 if ((i == 2 || i == 6) && !sim_bitmap) {
2215 if (result[c1][i] + result[c1][i + 1] == 0)
2216 final_candidate[(i / 4)] = c2;
2217 else if (result[c2][i] + result[c2][i + 1] == 0)
2218 final_candidate[(i / 4)] = c1;
2219 else
2220 sim_bitmap = sim_bitmap | (1 << i);
2221 } else {
2222 sim_bitmap = sim_bitmap | (1 << i);
2223 }
2224 }
2225 }
2226 if (sim_bitmap == 0) {
2227 for (i = 0; i < (bound / 4); i++) {
2228 if (final_candidate[i] != 0xFF) {
2229 for (j = i * 4; j < (i + 1) * 4 - 2; j++)
2230 result[3][j] =
2231 result[final_candidate[i]][j];
2232 bresult = false;
2233 }
2234 }
2235 return bresult;
2236 }
2237 if (!(sim_bitmap & 0x0F)) { /* path A OK */
2238 for (i = 0; i < 4; i++)
2239 result[3][i] = result[c1][i];
2240 } else if (!(sim_bitmap & 0x03)) { /* path A, Tx OK */
2241 for (i = 0; i < 2; i++)
2242 result[3][i] = result[c1][i];
2243 }
2244 if (!(sim_bitmap & 0xF0) && is2t) { /* path B OK */
2245 for (i = 4; i < 8; i++)
2246 result[3][i] = result[c1][i];
2247 } else if (!(sim_bitmap & 0x30)) { /* path B, Tx OK */
2248 for (i = 4; i < 6; i++)
2249 result[3][i] = result[c1][i];
2250 }
2251 return false;
2252 }
2253
2254 static void _rtl92d_phy_patha_fill_iqk_matrix(struct ieee80211_hw *hw,
2255 bool iqk_ok, long result[][8],
2256 u8 final_candidate, bool txonly)
2257 {
2258 struct rtl_priv *rtlpriv = rtl_priv(hw);
2259 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2260 u32 oldval_0, val_x, tx0_a, reg;
2261 long val_y, tx0_c;
2262 bool is2t = IS_92D_SINGLEPHY(rtlhal->version) ||
2263 rtlhal->macphymode == DUALMAC_DUALPHY;
2264
2265 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2266 "Path A IQ Calibration %s !\n", iqk_ok ? "Success" : "Failed");
2267 if (final_candidate == 0xFF) {
2268 return;
2269 } else if (iqk_ok) {
2270 oldval_0 = (rtl_get_bbreg(hw, ROFDM0_XATxIQIMBALANCE,
2271 BMASKDWORD) >> 22) & 0x3FF; /* OFDM0_D */
2272 val_x = result[final_candidate][0];
2273 if ((val_x & 0x00000200) != 0)
2274 val_x = val_x | 0xFFFFFC00;
2275 tx0_a = (val_x * oldval_0) >> 8;
2276 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2277 "X = 0x%x, tx0_a = 0x%x, oldval_0 0x%x\n",
2278 val_x, tx0_a, oldval_0);
2279 rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, 0x3FF, tx0_a);
2280 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(24),
2281 ((val_x * oldval_0 >> 7) & 0x1));
2282 val_y = result[final_candidate][1];
2283 if ((val_y & 0x00000200) != 0)
2284 val_y = val_y | 0xFFFFFC00;
2285 /* path B IQK result + 3 */
2286 if (rtlhal->interfaceindex == 1 &&
2287 rtlhal->current_bandtype == BAND_ON_5G)
2288 val_y += 3;
2289 tx0_c = (val_y * oldval_0) >> 8;
2290 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2291 "Y = 0x%lx, tx0_c = 0x%lx\n",
2292 val_y, tx0_c);
2293 rtl_set_bbreg(hw, ROFDM0_XCTxAFE, 0xF0000000,
2294 ((tx0_c & 0x3C0) >> 6));
2295 rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, 0x003F0000,
2296 (tx0_c & 0x3F));
2297 if (is2t)
2298 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(26),
2299 ((val_y * oldval_0 >> 7) & 0x1));
2300 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xC80 = 0x%x\n",
2301 rtl_get_bbreg(hw, ROFDM0_XATxIQIMBALANCE,
2302 BMASKDWORD));
2303 if (txonly) {
2304 RTPRINT(rtlpriv, FINIT, INIT_IQK, "only Tx OK\n");
2305 return;
2306 }
2307 reg = result[final_candidate][2];
2308 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0x3FF, reg);
2309 reg = result[final_candidate][3] & 0x3F;
2310 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0xFC00, reg);
2311 reg = (result[final_candidate][3] >> 6) & 0xF;
2312 rtl_set_bbreg(hw, 0xca0, 0xF0000000, reg);
2313 }
2314 }
2315
2316 static void _rtl92d_phy_pathb_fill_iqk_matrix(struct ieee80211_hw *hw,
2317 bool iqk_ok, long result[][8], u8 final_candidate, bool txonly)
2318 {
2319 struct rtl_priv *rtlpriv = rtl_priv(hw);
2320 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2321 u32 oldval_1, val_x, tx1_a, reg;
2322 long val_y, tx1_c;
2323
2324 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path B IQ Calibration %s !\n",
2325 iqk_ok ? "Success" : "Failed");
2326 if (final_candidate == 0xFF) {
2327 return;
2328 } else if (iqk_ok) {
2329 oldval_1 = (rtl_get_bbreg(hw, ROFDM0_XBTxIQIMBALANCE,
2330 BMASKDWORD) >> 22) & 0x3FF;
2331 val_x = result[final_candidate][4];
2332 if ((val_x & 0x00000200) != 0)
2333 val_x = val_x | 0xFFFFFC00;
2334 tx1_a = (val_x * oldval_1) >> 8;
2335 RTPRINT(rtlpriv, FINIT, INIT_IQK, "X = 0x%x, tx1_a = 0x%x\n",
2336 val_x, tx1_a);
2337 rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, 0x3FF, tx1_a);
2338 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(28),
2339 ((val_x * oldval_1 >> 7) & 0x1));
2340 val_y = result[final_candidate][5];
2341 if ((val_y & 0x00000200) != 0)
2342 val_y = val_y | 0xFFFFFC00;
2343 if (rtlhal->current_bandtype == BAND_ON_5G)
2344 val_y += 3;
2345 tx1_c = (val_y * oldval_1) >> 8;
2346 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Y = 0x%lx, tx1_c = 0x%lx\n",
2347 val_y, tx1_c);
2348 rtl_set_bbreg(hw, ROFDM0_XDTxAFE, 0xF0000000,
2349 ((tx1_c & 0x3C0) >> 6));
2350 rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, 0x003F0000,
2351 (tx1_c & 0x3F));
2352 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(30),
2353 ((val_y * oldval_1 >> 7) & 0x1));
2354 if (txonly)
2355 return;
2356 reg = result[final_candidate][6];
2357 rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0x3FF, reg);
2358 reg = result[final_candidate][7] & 0x3F;
2359 rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0xFC00, reg);
2360 reg = (result[final_candidate][7] >> 6) & 0xF;
2361 rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0x0000F000, reg);
2362 }
2363 }
2364
2365 void rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw)
2366 {
2367 struct rtl_priv *rtlpriv = rtl_priv(hw);
2368 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2369 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2370 long result[4][8];
2371 u8 i, final_candidate, indexforchannel;
2372 bool patha_ok, pathb_ok;
2373 long rege94, rege9c, regea4, regeac, regeb4;
2374 long regebc, regec4, regecc, regtmp = 0;
2375 bool is12simular, is13simular, is23simular;
2376 unsigned long flag = 0;
2377
2378 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2379 "IQK:Start!!!channel %d\n", rtlphy->current_channel);
2380 for (i = 0; i < 8; i++) {
2381 result[0][i] = 0;
2382 result[1][i] = 0;
2383 result[2][i] = 0;
2384 result[3][i] = 0;
2385 }
2386 final_candidate = 0xff;
2387 patha_ok = false;
2388 pathb_ok = false;
2389 is12simular = false;
2390 is23simular = false;
2391 is13simular = false;
2392 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2393 "IQK !!!currentband %d\n", rtlhal->current_bandtype);
2394 rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag);
2395 for (i = 0; i < 3; i++) {
2396 if (rtlhal->current_bandtype == BAND_ON_5G) {
2397 _rtl92d_phy_iq_calibrate_5g_normal(hw, result, i);
2398 } else if (rtlhal->current_bandtype == BAND_ON_2_4G) {
2399 if (IS_92D_SINGLEPHY(rtlhal->version))
2400 _rtl92d_phy_iq_calibrate(hw, result, i, true);
2401 else
2402 _rtl92d_phy_iq_calibrate(hw, result, i, false);
2403 }
2404 if (i == 1) {
2405 is12simular = _rtl92d_phy_simularity_compare(hw, result,
2406 0, 1);
2407 if (is12simular) {
2408 final_candidate = 0;
2409 break;
2410 }
2411 }
2412 if (i == 2) {
2413 is13simular = _rtl92d_phy_simularity_compare(hw, result,
2414 0, 2);
2415 if (is13simular) {
2416 final_candidate = 0;
2417 break;
2418 }
2419 is23simular = _rtl92d_phy_simularity_compare(hw, result,
2420 1, 2);
2421 if (is23simular) {
2422 final_candidate = 1;
2423 } else {
2424 for (i = 0; i < 8; i++)
2425 regtmp += result[3][i];
2426
2427 if (regtmp != 0)
2428 final_candidate = 3;
2429 else
2430 final_candidate = 0xFF;
2431 }
2432 }
2433 }
2434 rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
2435 for (i = 0; i < 4; i++) {
2436 rege94 = result[i][0];
2437 rege9c = result[i][1];
2438 regea4 = result[i][2];
2439 regeac = result[i][3];
2440 regeb4 = result[i][4];
2441 regebc = result[i][5];
2442 regec4 = result[i][6];
2443 regecc = result[i][7];
2444 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2445 "IQK: rege94=%lx rege9c=%lx regea4=%lx regeac=%lx regeb4=%lx regebc=%lx regec4=%lx regecc=%lx\n",
2446 rege94, rege9c, regea4, regeac, regeb4, regebc, regec4,
2447 regecc);
2448 }
2449 if (final_candidate != 0xff) {
2450 rtlphy->reg_e94 = rege94 = result[final_candidate][0];
2451 rtlphy->reg_e9c = rege9c = result[final_candidate][1];
2452 regea4 = result[final_candidate][2];
2453 regeac = result[final_candidate][3];
2454 rtlphy->reg_eb4 = regeb4 = result[final_candidate][4];
2455 rtlphy->reg_ebc = regebc = result[final_candidate][5];
2456 regec4 = result[final_candidate][6];
2457 regecc = result[final_candidate][7];
2458 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2459 "IQK: final_candidate is %x\n", final_candidate);
2460 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2461 "IQK: rege94=%lx rege9c=%lx regea4=%lx regeac=%lx regeb4=%lx regebc=%lx regec4=%lx regecc=%lx\n",
2462 rege94, rege9c, regea4, regeac, regeb4, regebc, regec4,
2463 regecc);
2464 patha_ok = pathb_ok = true;
2465 } else {
2466 rtlphy->reg_e94 = rtlphy->reg_eb4 = 0x100; /* X default value */
2467 rtlphy->reg_e9c = rtlphy->reg_ebc = 0x0; /* Y default value */
2468 }
2469 if ((rege94 != 0) /*&&(regea4 != 0) */)
2470 _rtl92d_phy_patha_fill_iqk_matrix(hw, patha_ok, result,
2471 final_candidate, (regea4 == 0));
2472 if (IS_92D_SINGLEPHY(rtlhal->version)) {
2473 if ((regeb4 != 0) /*&&(regec4 != 0) */)
2474 _rtl92d_phy_pathb_fill_iqk_matrix(hw, pathb_ok, result,
2475 final_candidate, (regec4 == 0));
2476 }
2477 if (final_candidate != 0xFF) {
2478 indexforchannel = rtl92d_get_rightchnlplace_for_iqk(
2479 rtlphy->current_channel);
2480
2481 for (i = 0; i < IQK_MATRIX_REG_NUM; i++)
2482 rtlphy->iqk_matrix[indexforchannel].
2483 value[0][i] = result[final_candidate][i];
2484 rtlphy->iqk_matrix[indexforchannel].iqk_done =
2485 true;
2486
2487 RT_TRACE(rtlpriv, COMP_SCAN | COMP_MLME, DBG_LOUD,
2488 "IQK OK indexforchannel %d\n", indexforchannel);
2489 }
2490 }
2491
2492 void rtl92d_phy_reload_iqk_setting(struct ieee80211_hw *hw, u8 channel)
2493 {
2494 struct rtl_priv *rtlpriv = rtl_priv(hw);
2495 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2496 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2497 u8 indexforchannel;
2498
2499 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "channel %d\n", channel);
2500 /*------Do IQK for normal chip and test chip 5G band------- */
2501 indexforchannel = rtl92d_get_rightchnlplace_for_iqk(channel);
2502 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "indexforchannel %d done %d\n",
2503 indexforchannel,
2504 rtlphy->iqk_matrix[indexforchannel].iqk_done);
2505 if (0 && !rtlphy->iqk_matrix[indexforchannel].iqk_done &&
2506 rtlphy->need_iqk) {
2507 /* Re Do IQK. */
2508 RT_TRACE(rtlpriv, COMP_SCAN | COMP_INIT, DBG_LOUD,
2509 "Do IQK Matrix reg for channel:%d....\n", channel);
2510 rtl92d_phy_iq_calibrate(hw);
2511 } else {
2512 /* Just load the value. */
2513 /* 2G band just load once. */
2514 if (((!rtlhal->load_imrandiqk_setting_for2g) &&
2515 indexforchannel == 0) || indexforchannel > 0) {
2516 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
2517 "Just Read IQK Matrix reg for channel:%d....\n",
2518 channel);
2519 if ((rtlphy->iqk_matrix[indexforchannel].
2520 value[0] != NULL)
2521 /*&&(regea4 != 0) */)
2522 _rtl92d_phy_patha_fill_iqk_matrix(hw, true,
2523 rtlphy->iqk_matrix[
2524 indexforchannel].value, 0,
2525 (rtlphy->iqk_matrix[
2526 indexforchannel].value[0][2] == 0));
2527 if (IS_92D_SINGLEPHY(rtlhal->version)) {
2528 if ((rtlphy->iqk_matrix[
2529 indexforchannel].value[0][4] != 0)
2530 /*&&(regec4 != 0) */)
2531 _rtl92d_phy_pathb_fill_iqk_matrix(hw,
2532 true,
2533 rtlphy->iqk_matrix[
2534 indexforchannel].value, 0,
2535 (rtlphy->iqk_matrix[
2536 indexforchannel].value[0][6]
2537 == 0));
2538 }
2539 }
2540 }
2541 rtlphy->need_iqk = false;
2542 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
2543 }
2544
2545 static u32 _rtl92d_phy_get_abs(u32 val1, u32 val2)
2546 {
2547 u32 ret;
2548
2549 if (val1 >= val2)
2550 ret = val1 - val2;
2551 else
2552 ret = val2 - val1;
2553 return ret;
2554 }
2555
2556 static bool _rtl92d_is_legal_5g_channel(struct ieee80211_hw *hw, u8 channel)
2557 {
2558
2559 int i;
2560 u8 channel_5g[45] = {
2561 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
2562 60, 62, 64, 100, 102, 104, 106, 108, 110, 112,
2563 114, 116, 118, 120, 122, 124, 126, 128, 130, 132,
2564 134, 136, 138, 140, 149, 151, 153, 155, 157, 159,
2565 161, 163, 165
2566 };
2567
2568 for (i = 0; i < sizeof(channel_5g); i++)
2569 if (channel == channel_5g[i])
2570 return true;
2571 return false;
2572 }
2573
2574 static void _rtl92d_phy_calc_curvindex(struct ieee80211_hw *hw,
2575 u32 *targetchnl, u32 * curvecount_val,
2576 bool is5g, u32 *curveindex)
2577 {
2578 struct rtl_priv *rtlpriv = rtl_priv(hw);
2579 u32 smallest_abs_val = 0xffffffff, u4tmp;
2580 u8 i, j;
2581 u8 chnl_num = is5g ? TARGET_CHNL_NUM_5G : TARGET_CHNL_NUM_2G;
2582
2583 for (i = 0; i < chnl_num; i++) {
2584 if (is5g && !_rtl92d_is_legal_5g_channel(hw, i + 1))
2585 continue;
2586 curveindex[i] = 0;
2587 for (j = 0; j < (CV_CURVE_CNT * 2); j++) {
2588 u4tmp = _rtl92d_phy_get_abs(targetchnl[i],
2589 curvecount_val[j]);
2590
2591 if (u4tmp < smallest_abs_val) {
2592 curveindex[i] = j;
2593 smallest_abs_val = u4tmp;
2594 }
2595 }
2596 smallest_abs_val = 0xffffffff;
2597 RTPRINT(rtlpriv, FINIT, INIT_IQK, "curveindex[%d] = %x\n",
2598 i, curveindex[i]);
2599 }
2600 }
2601
2602 static void _rtl92d_phy_reload_lck_setting(struct ieee80211_hw *hw,
2603 u8 channel)
2604 {
2605 struct rtl_priv *rtlpriv = rtl_priv(hw);
2606 u8 erfpath = rtlpriv->rtlhal.current_bandtype ==
2607 BAND_ON_5G ? RF90_PATH_A :
2608 IS_92D_SINGLEPHY(rtlpriv->rtlhal.version) ?
2609 RF90_PATH_B : RF90_PATH_A;
2610 u32 u4tmp = 0, u4regvalue = 0;
2611 bool bneed_powerdown_radio = false;
2612
2613 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "path %d\n", erfpath);
2614 RTPRINT(rtlpriv, FINIT, INIT_IQK, "band type = %d\n",
2615 rtlpriv->rtlhal.current_bandtype);
2616 RTPRINT(rtlpriv, FINIT, INIT_IQK, "channel = %d\n", channel);
2617 if (rtlpriv->rtlhal.current_bandtype == BAND_ON_5G) {/* Path-A for 5G */
2618 u4tmp = curveindex_5g[channel-1];
2619 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2620 "ver 1 set RF-A, 5G, 0x28 = 0x%ulx !!\n", u4tmp);
2621 if (rtlpriv->rtlhal.macphymode == DUALMAC_DUALPHY &&
2622 rtlpriv->rtlhal.interfaceindex == 1) {
2623 bneed_powerdown_radio =
2624 rtl92d_phy_enable_anotherphy(hw, false);
2625 rtlpriv->rtlhal.during_mac1init_radioa = true;
2626 /* asume no this case */
2627 if (bneed_powerdown_radio)
2628 _rtl92d_phy_enable_rf_env(hw, erfpath,
2629 &u4regvalue);
2630 }
2631 rtl_set_rfreg(hw, erfpath, RF_SYN_G4, 0x3f800, u4tmp);
2632 if (bneed_powerdown_radio)
2633 _rtl92d_phy_restore_rf_env(hw, erfpath, &u4regvalue);
2634 if (rtlpriv->rtlhal.during_mac1init_radioa)
2635 rtl92d_phy_powerdown_anotherphy(hw, false);
2636 } else if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G) {
2637 u4tmp = curveindex_2g[channel-1];
2638 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2639 "ver 3 set RF-B, 2G, 0x28 = 0x%ulx !!\n", u4tmp);
2640 if (rtlpriv->rtlhal.macphymode == DUALMAC_DUALPHY &&
2641 rtlpriv->rtlhal.interfaceindex == 0) {
2642 bneed_powerdown_radio =
2643 rtl92d_phy_enable_anotherphy(hw, true);
2644 rtlpriv->rtlhal.during_mac0init_radiob = true;
2645 if (bneed_powerdown_radio)
2646 _rtl92d_phy_enable_rf_env(hw, erfpath,
2647 &u4regvalue);
2648 }
2649 rtl_set_rfreg(hw, erfpath, RF_SYN_G4, 0x3f800, u4tmp);
2650 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2651 "ver 3 set RF-B, 2G, 0x28 = 0x%ulx !!\n",
2652 rtl_get_rfreg(hw, erfpath, RF_SYN_G4, 0x3f800));
2653 if (bneed_powerdown_radio)
2654 _rtl92d_phy_restore_rf_env(hw, erfpath, &u4regvalue);
2655 if (rtlpriv->rtlhal.during_mac0init_radiob)
2656 rtl92d_phy_powerdown_anotherphy(hw, true);
2657 }
2658 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
2659 }
2660
2661 static void _rtl92d_phy_lc_calibrate_sw(struct ieee80211_hw *hw, bool is2t)
2662 {
2663 struct rtl_priv *rtlpriv = rtl_priv(hw);
2664 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2665 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2666 u8 tmpreg, index, rf_mode[2];
2667 u8 path = is2t ? 2 : 1;
2668 u8 i;
2669 u32 u4tmp, offset;
2670 u32 curvecount_val[CV_CURVE_CNT * 2] = {0};
2671 u16 timeout = 800, timecount = 0;
2672
2673 /* Check continuous TX and Packet TX */
2674 tmpreg = rtl_read_byte(rtlpriv, 0xd03);
2675 /* if Deal with contisuous TX case, disable all continuous TX */
2676 /* if Deal with Packet TX case, block all queues */
2677 if ((tmpreg & 0x70) != 0)
2678 rtl_write_byte(rtlpriv, 0xd03, tmpreg & 0x8F);
2679 else
2680 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
2681 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xF00000, 0x0F);
2682 for (index = 0; index < path; index++) {
2683 /* 1. Read original RF mode */
2684 offset = index == 0 ? ROFDM0_XAAGCCORE1 : ROFDM0_XBAGCCORE1;
2685 rf_mode[index] = rtl_read_byte(rtlpriv, offset);
2686 /* 2. Set RF mode = standby mode */
2687 rtl_set_rfreg(hw, (enum radio_path)index, RF_AC,
2688 BRFREGOFFSETMASK, 0x010000);
2689 if (rtlpci->init_ready) {
2690 /* switch CV-curve control by LC-calibration */
2691 rtl_set_rfreg(hw, (enum radio_path)index, RF_SYN_G7,
2692 BIT(17), 0x0);
2693 /* 4. Set LC calibration begin */
2694 rtl_set_rfreg(hw, (enum radio_path)index, RF_CHNLBW,
2695 0x08000, 0x01);
2696 }
2697 u4tmp = rtl_get_rfreg(hw, (enum radio_path)index, RF_SYN_G6,
2698 BRFREGOFFSETMASK);
2699 while ((!(u4tmp & BIT(11))) && timecount <= timeout) {
2700 mdelay(50);
2701 timecount += 50;
2702 u4tmp = rtl_get_rfreg(hw, (enum radio_path)index,
2703 RF_SYN_G6, BRFREGOFFSETMASK);
2704 }
2705 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2706 "PHY_LCK finish delay for %d ms=2\n", timecount);
2707 u4tmp = rtl_get_rfreg(hw, index, RF_SYN_G4, BRFREGOFFSETMASK);
2708 if (index == 0 && rtlhal->interfaceindex == 0) {
2709 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2710 "path-A / 5G LCK\n");
2711 } else {
2712 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2713 "path-B / 2.4G LCK\n");
2714 }
2715 memset(&curvecount_val[0], 0, CV_CURVE_CNT * 2);
2716 /* Set LC calibration off */
2717 rtl_set_rfreg(hw, (enum radio_path)index, RF_CHNLBW,
2718 0x08000, 0x0);
2719 RTPRINT(rtlpriv, FINIT, INIT_IQK, "set RF 0x18[15] = 0\n");
2720 /* save Curve-counting number */
2721 for (i = 0; i < CV_CURVE_CNT; i++) {
2722 u32 readval = 0, readval2 = 0;
2723 rtl_set_rfreg(hw, (enum radio_path)index, 0x3F,
2724 0x7f, i);
2725
2726 rtl_set_rfreg(hw, (enum radio_path)index, 0x4D,
2727 BRFREGOFFSETMASK, 0x0);
2728 readval = rtl_get_rfreg(hw, (enum radio_path)index,
2729 0x4F, BRFREGOFFSETMASK);
2730 curvecount_val[2 * i + 1] = (readval & 0xfffe0) >> 5;
2731 /* reg 0x4f [4:0] */
2732 /* reg 0x50 [19:10] */
2733 readval2 = rtl_get_rfreg(hw, (enum radio_path)index,
2734 0x50, 0xffc00);
2735 curvecount_val[2 * i] = (((readval & 0x1F) << 10) |
2736 readval2);
2737 }
2738 if (index == 0 && rtlhal->interfaceindex == 0)
2739 _rtl92d_phy_calc_curvindex(hw, targetchnl_5g,
2740 curvecount_val,
2741 true, curveindex_5g);
2742 else
2743 _rtl92d_phy_calc_curvindex(hw, targetchnl_2g,
2744 curvecount_val,
2745 false, curveindex_2g);
2746 /* switch CV-curve control mode */
2747 rtl_set_rfreg(hw, (enum radio_path)index, RF_SYN_G7,
2748 BIT(17), 0x1);
2749 }
2750
2751 /* Restore original situation */
2752 for (index = 0; index < path; index++) {
2753 offset = index == 0 ? ROFDM0_XAAGCCORE1 : ROFDM0_XBAGCCORE1;
2754 rtl_write_byte(rtlpriv, offset, 0x50);
2755 rtl_write_byte(rtlpriv, offset, rf_mode[index]);
2756 }
2757 if ((tmpreg & 0x70) != 0)
2758 rtl_write_byte(rtlpriv, 0xd03, tmpreg);
2759 else /*Deal with Packet TX case */
2760 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
2761 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xF00000, 0x00);
2762 _rtl92d_phy_reload_lck_setting(hw, rtlpriv->phy.current_channel);
2763 }
2764
2765 static void _rtl92d_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
2766 {
2767 struct rtl_priv *rtlpriv = rtl_priv(hw);
2768
2769 RTPRINT(rtlpriv, FINIT, INIT_IQK, "cosa PHY_LCK ver=2\n");
2770 _rtl92d_phy_lc_calibrate_sw(hw, is2t);
2771 }
2772
2773 void rtl92d_phy_lc_calibrate(struct ieee80211_hw *hw)
2774 {
2775 struct rtl_priv *rtlpriv = rtl_priv(hw);
2776 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2777 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2778 u32 timeout = 2000, timecount = 0;
2779
2780 while (rtlpriv->mac80211.act_scanning && timecount < timeout) {
2781 udelay(50);
2782 timecount += 50;
2783 }
2784
2785 rtlphy->lck_inprogress = true;
2786 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2787 "LCK:Start!!! currentband %x delay %d ms\n",
2788 rtlhal->current_bandtype, timecount);
2789 if (IS_92D_SINGLEPHY(rtlhal->version)) {
2790 _rtl92d_phy_lc_calibrate(hw, true);
2791 } else {
2792 /* For 1T1R */
2793 _rtl92d_phy_lc_calibrate(hw, false);
2794 }
2795 rtlphy->lck_inprogress = false;
2796 RTPRINT(rtlpriv, FINIT, INIT_IQK, "LCK:Finish!!!\n");
2797 }
2798
2799 void rtl92d_phy_ap_calibrate(struct ieee80211_hw *hw, char delta)
2800 {
2801 return;
2802 }
2803
2804 static bool _rtl92d_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
2805 u32 cmdtableidx, u32 cmdtablesz, enum swchnlcmd_id cmdid,
2806 u32 para1, u32 para2, u32 msdelay)
2807 {
2808 struct swchnlcmd *pcmd;
2809
2810 if (cmdtable == NULL) {
2811 RT_ASSERT(false, "cmdtable cannot be NULL\n");
2812 return false;
2813 }
2814 if (cmdtableidx >= cmdtablesz)
2815 return false;
2816
2817 pcmd = cmdtable + cmdtableidx;
2818 pcmd->cmdid = cmdid;
2819 pcmd->para1 = para1;
2820 pcmd->para2 = para2;
2821 pcmd->msdelay = msdelay;
2822 return true;
2823 }
2824
2825 void rtl92d_phy_reset_iqk_result(struct ieee80211_hw *hw)
2826 {
2827 struct rtl_priv *rtlpriv = rtl_priv(hw);
2828 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2829 u8 i;
2830
2831 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2832 "settings regs %d default regs %d\n",
2833 (int)(sizeof(rtlphy->iqk_matrix) /
2834 sizeof(struct iqk_matrix_regs)),
2835 IQK_MATRIX_REG_NUM);
2836 /* 0xe94, 0xe9c, 0xea4, 0xeac, 0xeb4, 0xebc, 0xec4, 0xecc */
2837 for (i = 0; i < IQK_MATRIX_SETTINGS_NUM; i++) {
2838 rtlphy->iqk_matrix[i].value[0][0] = 0x100;
2839 rtlphy->iqk_matrix[i].value[0][2] = 0x100;
2840 rtlphy->iqk_matrix[i].value[0][4] = 0x100;
2841 rtlphy->iqk_matrix[i].value[0][6] = 0x100;
2842 rtlphy->iqk_matrix[i].value[0][1] = 0x0;
2843 rtlphy->iqk_matrix[i].value[0][3] = 0x0;
2844 rtlphy->iqk_matrix[i].value[0][5] = 0x0;
2845 rtlphy->iqk_matrix[i].value[0][7] = 0x0;
2846 rtlphy->iqk_matrix[i].iqk_done = false;
2847 }
2848 }
2849
2850 static bool _rtl92d_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
2851 u8 channel, u8 *stage, u8 *step,
2852 u32 *delay)
2853 {
2854 struct rtl_priv *rtlpriv = rtl_priv(hw);
2855 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2856 struct swchnlcmd precommoncmd[MAX_PRECMD_CNT];
2857 u32 precommoncmdcnt;
2858 struct swchnlcmd postcommoncmd[MAX_POSTCMD_CNT];
2859 u32 postcommoncmdcnt;
2860 struct swchnlcmd rfdependcmd[MAX_RFDEPENDCMD_CNT];
2861 u32 rfdependcmdcnt;
2862 struct swchnlcmd *currentcmd = NULL;
2863 u8 rfpath;
2864 u8 num_total_rfpath = rtlphy->num_total_rfpath;
2865
2866 precommoncmdcnt = 0;
2867 _rtl92d_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
2868 MAX_PRECMD_CNT,
2869 CMDID_SET_TXPOWEROWER_LEVEL, 0, 0, 0);
2870 _rtl92d_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
2871 MAX_PRECMD_CNT, CMDID_END, 0, 0, 0);
2872 postcommoncmdcnt = 0;
2873 _rtl92d_phy_set_sw_chnl_cmdarray(postcommoncmd, postcommoncmdcnt++,
2874 MAX_POSTCMD_CNT, CMDID_END, 0, 0, 0);
2875 rfdependcmdcnt = 0;
2876 _rtl92d_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
2877 MAX_RFDEPENDCMD_CNT, CMDID_RF_WRITEREG,
2878 RF_CHNLBW, channel, 0);
2879 _rtl92d_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
2880 MAX_RFDEPENDCMD_CNT, CMDID_END,
2881 0, 0, 0);
2882
2883 do {
2884 switch (*stage) {
2885 case 0:
2886 currentcmd = &precommoncmd[*step];
2887 break;
2888 case 1:
2889 currentcmd = &rfdependcmd[*step];
2890 break;
2891 case 2:
2892 currentcmd = &postcommoncmd[*step];
2893 break;
2894 }
2895 if (currentcmd->cmdid == CMDID_END) {
2896 if ((*stage) == 2) {
2897 return true;
2898 } else {
2899 (*stage)++;
2900 (*step) = 0;
2901 continue;
2902 }
2903 }
2904 switch (currentcmd->cmdid) {
2905 case CMDID_SET_TXPOWEROWER_LEVEL:
2906 rtl92d_phy_set_txpower_level(hw, channel);
2907 break;
2908 case CMDID_WRITEPORT_ULONG:
2909 rtl_write_dword(rtlpriv, currentcmd->para1,
2910 currentcmd->para2);
2911 break;
2912 case CMDID_WRITEPORT_USHORT:
2913 rtl_write_word(rtlpriv, currentcmd->para1,
2914 (u16)currentcmd->para2);
2915 break;
2916 case CMDID_WRITEPORT_UCHAR:
2917 rtl_write_byte(rtlpriv, currentcmd->para1,
2918 (u8)currentcmd->para2);
2919 break;
2920 case CMDID_RF_WRITEREG:
2921 for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) {
2922 rtlphy->rfreg_chnlval[rfpath] =
2923 ((rtlphy->rfreg_chnlval[rfpath] &
2924 0xffffff00) | currentcmd->para2);
2925 if (rtlpriv->rtlhal.current_bandtype ==
2926 BAND_ON_5G) {
2927 if (currentcmd->para2 > 99)
2928 rtlphy->rfreg_chnlval[rfpath] =
2929 rtlphy->rfreg_chnlval
2930 [rfpath] | (BIT(18));
2931 else
2932 rtlphy->rfreg_chnlval[rfpath] =
2933 rtlphy->rfreg_chnlval
2934 [rfpath] & (~BIT(18));
2935 rtlphy->rfreg_chnlval[rfpath] |=
2936 (BIT(16) | BIT(8));
2937 } else {
2938 rtlphy->rfreg_chnlval[rfpath] &=
2939 ~(BIT(8) | BIT(16) | BIT(18));
2940 }
2941 rtl_set_rfreg(hw, (enum radio_path)rfpath,
2942 currentcmd->para1,
2943 BRFREGOFFSETMASK,
2944 rtlphy->rfreg_chnlval[rfpath]);
2945 _rtl92d_phy_reload_imr_setting(hw, channel,
2946 rfpath);
2947 }
2948 _rtl92d_phy_switch_rf_setting(hw, channel);
2949 /* do IQK when all parameters are ready */
2950 rtl92d_phy_reload_iqk_setting(hw, channel);
2951 break;
2952 default:
2953 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2954 "switch case not processed\n");
2955 break;
2956 }
2957 break;
2958 } while (true);
2959 (*delay) = currentcmd->msdelay;
2960 (*step)++;
2961 return false;
2962 }
2963
2964 u8 rtl92d_phy_sw_chnl(struct ieee80211_hw *hw)
2965 {
2966 struct rtl_priv *rtlpriv = rtl_priv(hw);
2967 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2968 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2969 u32 delay;
2970 u32 timeout = 1000, timecount = 0;
2971 u8 channel = rtlphy->current_channel;
2972 u32 ret_value;
2973
2974 if (rtlphy->sw_chnl_inprogress)
2975 return 0;
2976 if (rtlphy->set_bwmode_inprogress)
2977 return 0;
2978
2979 if ((is_hal_stop(rtlhal)) || (RT_CANNOT_IO(hw))) {
2980 RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
2981 "sw_chnl_inprogress false driver sleep or unload\n");
2982 return 0;
2983 }
2984 while (rtlphy->lck_inprogress && timecount < timeout) {
2985 mdelay(50);
2986 timecount += 50;
2987 }
2988 if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY &&
2989 rtlhal->bandset == BAND_ON_BOTH) {
2990 ret_value = rtl_get_bbreg(hw, RFPGA0_XAB_RFPARAMETER,
2991 BMASKDWORD);
2992 if (rtlphy->current_channel > 14 && !(ret_value & BIT(0)))
2993 rtl92d_phy_switch_wirelessband(hw, BAND_ON_5G);
2994 else if (rtlphy->current_channel <= 14 && (ret_value & BIT(0)))
2995 rtl92d_phy_switch_wirelessband(hw, BAND_ON_2_4G);
2996 }
2997 switch (rtlhal->current_bandtype) {
2998 case BAND_ON_5G:
2999 /* Get first channel error when change between
3000 * 5G and 2.4G band. */
3001 if (channel <= 14)
3002 return 0;
3003 RT_ASSERT((channel > 14), "5G but channel<=14\n");
3004 break;
3005 case BAND_ON_2_4G:
3006 /* Get first channel error when change between
3007 * 5G and 2.4G band. */
3008 if (channel > 14)
3009 return 0;
3010 RT_ASSERT((channel <= 14), "2G but channel>14\n");
3011 break;
3012 default:
3013 RT_ASSERT(false, "Invalid WirelessMode(%#x)!!\n",
3014 rtlpriv->mac80211.mode);
3015 break;
3016 }
3017 rtlphy->sw_chnl_inprogress = true;
3018 if (channel == 0)
3019 channel = 1;
3020 rtlphy->sw_chnl_stage = 0;
3021 rtlphy->sw_chnl_step = 0;
3022 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
3023 "switch to channel%d\n", rtlphy->current_channel);
3024
3025 do {
3026 if (!rtlphy->sw_chnl_inprogress)
3027 break;
3028 if (!_rtl92d_phy_sw_chnl_step_by_step(hw,
3029 rtlphy->current_channel,
3030 &rtlphy->sw_chnl_stage, &rtlphy->sw_chnl_step, &delay)) {
3031 if (delay > 0)
3032 mdelay(delay);
3033 else
3034 continue;
3035 } else {
3036 rtlphy->sw_chnl_inprogress = false;
3037 }
3038 break;
3039 } while (true);
3040 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "<==\n");
3041 rtlphy->sw_chnl_inprogress = false;
3042 return 1;
3043 }
3044
3045 static void rtl92d_phy_set_io(struct ieee80211_hw *hw)
3046 {
3047 struct rtl_priv *rtlpriv = rtl_priv(hw);
3048 struct dig_t *de_digtable = &rtlpriv->dm_digtable;
3049 struct rtl_phy *rtlphy = &(rtlpriv->phy);
3050
3051 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
3052 "--->Cmd(%#x), set_io_inprogress(%d)\n",
3053 rtlphy->current_io_type, rtlphy->set_io_inprogress);
3054 switch (rtlphy->current_io_type) {
3055 case IO_CMD_RESUME_DM_BY_SCAN:
3056 de_digtable->cur_igvalue = rtlphy->initgain_backup.xaagccore1;
3057 rtl92d_dm_write_dig(hw);
3058 rtl92d_phy_set_txpower_level(hw, rtlphy->current_channel);
3059 break;
3060 case IO_CMD_PAUSE_DM_BY_SCAN:
3061 rtlphy->initgain_backup.xaagccore1 = de_digtable->cur_igvalue;
3062 de_digtable->cur_igvalue = 0x37;
3063 rtl92d_dm_write_dig(hw);
3064 break;
3065 default:
3066 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3067 "switch case not processed\n");
3068 break;
3069 }
3070 rtlphy->set_io_inprogress = false;
3071 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "<---(%#x)\n",
3072 rtlphy->current_io_type);
3073 }
3074
3075 bool rtl92d_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
3076 {
3077 struct rtl_priv *rtlpriv = rtl_priv(hw);
3078 struct rtl_phy *rtlphy = &(rtlpriv->phy);
3079 bool postprocessing = false;
3080
3081 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
3082 "-->IO Cmd(%#x), set_io_inprogress(%d)\n",
3083 iotype, rtlphy->set_io_inprogress);
3084 do {
3085 switch (iotype) {
3086 case IO_CMD_RESUME_DM_BY_SCAN:
3087 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
3088 "[IO CMD] Resume DM after scan\n");
3089 postprocessing = true;
3090 break;
3091 case IO_CMD_PAUSE_DM_BY_SCAN:
3092 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
3093 "[IO CMD] Pause DM before scan\n");
3094 postprocessing = true;
3095 break;
3096 default:
3097 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3098 "switch case not processed\n");
3099 break;
3100 }
3101 } while (false);
3102 if (postprocessing && !rtlphy->set_io_inprogress) {
3103 rtlphy->set_io_inprogress = true;
3104 rtlphy->current_io_type = iotype;
3105 } else {
3106 return false;
3107 }
3108 rtl92d_phy_set_io(hw);
3109 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "<--IO Type(%#x)\n", iotype);
3110 return true;
3111 }
3112
3113 static void _rtl92d_phy_set_rfon(struct ieee80211_hw *hw)
3114 {
3115 struct rtl_priv *rtlpriv = rtl_priv(hw);
3116
3117 /* a. SYS_CLKR 0x08[11] = 1 restore MAC clock */
3118 /* b. SPS_CTRL 0x11[7:0] = 0x2b */
3119 if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY)
3120 rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b);
3121 /* c. For PCIE: SYS_FUNC_EN 0x02[7:0] = 0xE3 enable BB TRX function */
3122 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3123 /* RF_ON_EXCEP(d~g): */
3124 /* d. APSD_CTRL 0x600[7:0] = 0x00 */
3125 rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);
3126 /* e. SYS_FUNC_EN 0x02[7:0] = 0xE2 reset BB TRX function again */
3127 /* f. SYS_FUNC_EN 0x02[7:0] = 0xE3 enable BB TRX function*/
3128 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3129 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3130 /* g. txpause 0x522[7:0] = 0x00 enable mac tx queue */
3131 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
3132 }
3133
3134 static void _rtl92d_phy_set_rfsleep(struct ieee80211_hw *hw)
3135 {
3136 struct rtl_priv *rtlpriv = rtl_priv(hw);
3137 u32 u4btmp;
3138 u8 delay = 5;
3139
3140 /* a. TXPAUSE 0x522[7:0] = 0xFF Pause MAC TX queue */
3141 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
3142 /* b. RF path 0 offset 0x00 = 0x00 disable RF */
3143 rtl_set_rfreg(hw, RF90_PATH_A, 0x00, BRFREGOFFSETMASK, 0x00);
3144 /* c. APSD_CTRL 0x600[7:0] = 0x40 */
3145 rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40);
3146 /* d. APSD_CTRL 0x600[7:0] = 0x00
3147 * APSD_CTRL 0x600[7:0] = 0x00
3148 * RF path 0 offset 0x00 = 0x00
3149 * APSD_CTRL 0x600[7:0] = 0x40
3150 * */
3151 u4btmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, BRFREGOFFSETMASK);
3152 while (u4btmp != 0 && delay > 0) {
3153 rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x0);
3154 rtl_set_rfreg(hw, RF90_PATH_A, 0x00, BRFREGOFFSETMASK, 0x00);
3155 rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40);
3156 u4btmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, BRFREGOFFSETMASK);
3157 delay--;
3158 }
3159 if (delay == 0) {
3160 /* Jump out the LPS turn off sequence to RF_ON_EXCEP */
3161 rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);
3162
3163 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3164 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3165 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
3166 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
3167 "Fail !!! Switch RF timeout\n");
3168 return;
3169 }
3170 /* e. For PCIE: SYS_FUNC_EN 0x02[7:0] = 0xE2 reset BB TRX function */
3171 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3172 /* f. SPS_CTRL 0x11[7:0] = 0x22 */
3173 if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY)
3174 rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22);
3175 /* g. SYS_CLKR 0x08[11] = 0 gated MAC clock */
3176 }
3177
3178 bool rtl92d_phy_set_rf_power_state(struct ieee80211_hw *hw,
3179 enum rf_pwrstate rfpwr_state)
3180 {
3181
3182 bool bresult = true;
3183 struct rtl_priv *rtlpriv = rtl_priv(hw);
3184 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
3185 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3186 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
3187 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
3188 u8 i, queue_id;
3189 struct rtl8192_tx_ring *ring = NULL;
3190
3191 if (rfpwr_state == ppsc->rfpwr_state)
3192 return false;
3193 switch (rfpwr_state) {
3194 case ERFON:
3195 if ((ppsc->rfpwr_state == ERFOFF) &&
3196 RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
3197 bool rtstatus;
3198 u32 InitializeCount = 0;
3199 do {
3200 InitializeCount++;
3201 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3202 "IPS Set eRf nic enable\n");
3203 rtstatus = rtl_ps_enable_nic(hw);
3204 } while (!rtstatus && (InitializeCount < 10));
3205
3206 RT_CLEAR_PS_LEVEL(ppsc,
3207 RT_RF_OFF_LEVL_HALT_NIC);
3208 } else {
3209 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
3210 "awake, sleeped:%d ms state_inap:%x\n",
3211 jiffies_to_msecs(jiffies -
3212 ppsc->last_sleep_jiffies),
3213 rtlpriv->psc.state_inap);
3214 ppsc->last_awake_jiffies = jiffies;
3215 _rtl92d_phy_set_rfon(hw);
3216 }
3217
3218 if (mac->link_state == MAC80211_LINKED)
3219 rtlpriv->cfg->ops->led_control(hw,
3220 LED_CTL_LINK);
3221 else
3222 rtlpriv->cfg->ops->led_control(hw,
3223 LED_CTL_NO_LINK);
3224 break;
3225 case ERFOFF:
3226 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
3227 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3228 "IPS Set eRf nic disable\n");
3229 rtl_ps_disable_nic(hw);
3230 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
3231 } else {
3232 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS)
3233 rtlpriv->cfg->ops->led_control(hw,
3234 LED_CTL_NO_LINK);
3235 else
3236 rtlpriv->cfg->ops->led_control(hw,
3237 LED_CTL_POWER_OFF);
3238 }
3239 break;
3240 case ERFSLEEP:
3241 if (ppsc->rfpwr_state == ERFOFF)
3242 return false;
3243
3244 for (queue_id = 0, i = 0;
3245 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
3246 ring = &pcipriv->dev.tx_ring[queue_id];
3247 if (skb_queue_len(&ring->queue) == 0 ||
3248 queue_id == BEACON_QUEUE) {
3249 queue_id++;
3250 continue;
3251 } else if (rtlpci->pdev->current_state != PCI_D0) {
3252 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
3253 "eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 but lower power state!\n",
3254 i + 1, queue_id);
3255 break;
3256 } else {
3257 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3258 "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
3259 i + 1, queue_id,
3260 skb_queue_len(&ring->queue));
3261 udelay(10);
3262 i++;
3263 }
3264
3265 if (i >= MAX_DOZE_WAITING_TIMES_9x) {
3266 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3267 "ERFOFF: %d times TcbBusyQueue[%d] = %d !\n",
3268 MAX_DOZE_WAITING_TIMES_9x, queue_id,
3269 skb_queue_len(&ring->queue));
3270 break;
3271 }
3272 }
3273 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
3274 "Set rfsleep awaked:%d ms\n",
3275 jiffies_to_msecs(jiffies - ppsc->last_awake_jiffies));
3276 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
3277 "sleep awaked:%d ms state_inap:%x\n",
3278 jiffies_to_msecs(jiffies -
3279 ppsc->last_awake_jiffies),
3280 rtlpriv->psc.state_inap);
3281 ppsc->last_sleep_jiffies = jiffies;
3282 _rtl92d_phy_set_rfsleep(hw);
3283 break;
3284 default:
3285 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3286 "switch case not processed\n");
3287 bresult = false;
3288 break;
3289 }
3290 if (bresult)
3291 ppsc->rfpwr_state = rfpwr_state;
3292 return bresult;
3293 }
3294
3295 void rtl92d_phy_config_macphymode(struct ieee80211_hw *hw)
3296 {
3297 struct rtl_priv *rtlpriv = rtl_priv(hw);
3298 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3299 u8 offset = REG_MAC_PHY_CTRL_NORMAL;
3300
3301 switch (rtlhal->macphymode) {
3302 case DUALMAC_DUALPHY:
3303 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3304 "MacPhyMode: DUALMAC_DUALPHY\n");
3305 rtl_write_byte(rtlpriv, offset, 0xF3);
3306 break;
3307 case SINGLEMAC_SINGLEPHY:
3308 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3309 "MacPhyMode: SINGLEMAC_SINGLEPHY\n");
3310 rtl_write_byte(rtlpriv, offset, 0xF4);
3311 break;
3312 case DUALMAC_SINGLEPHY:
3313 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3314 "MacPhyMode: DUALMAC_SINGLEPHY\n");
3315 rtl_write_byte(rtlpriv, offset, 0xF1);
3316 break;
3317 }
3318 }
3319
3320 void rtl92d_phy_config_macphymode_info(struct ieee80211_hw *hw)
3321 {
3322 struct rtl_priv *rtlpriv = rtl_priv(hw);
3323 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3324 struct rtl_phy *rtlphy = &(rtlpriv->phy);
3325
3326 switch (rtlhal->macphymode) {
3327 case DUALMAC_SINGLEPHY:
3328 rtlphy->rf_type = RF_2T2R;
3329 rtlhal->version |= RF_TYPE_2T2R;
3330 rtlhal->bandset = BAND_ON_BOTH;
3331 rtlhal->current_bandtype = BAND_ON_2_4G;
3332 break;
3333
3334 case SINGLEMAC_SINGLEPHY:
3335 rtlphy->rf_type = RF_2T2R;
3336 rtlhal->version |= RF_TYPE_2T2R;
3337 rtlhal->bandset = BAND_ON_BOTH;
3338 rtlhal->current_bandtype = BAND_ON_2_4G;
3339 break;
3340
3341 case DUALMAC_DUALPHY:
3342 rtlphy->rf_type = RF_1T1R;
3343 rtlhal->version &= RF_TYPE_1T1R;
3344 /* Now we let MAC0 run on 5G band. */
3345 if (rtlhal->interfaceindex == 0) {
3346 rtlhal->bandset = BAND_ON_5G;
3347 rtlhal->current_bandtype = BAND_ON_5G;
3348 } else {
3349 rtlhal->bandset = BAND_ON_2_4G;
3350 rtlhal->current_bandtype = BAND_ON_2_4G;
3351 }
3352 break;
3353 default:
3354 break;
3355 }
3356 }
3357
3358 u8 rtl92d_get_chnlgroup_fromarray(u8 chnl)
3359 {
3360 u8 group;
3361 u8 channel_info[59] = {
3362 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
3363 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56,
3364 58, 60, 62, 64, 100, 102, 104, 106, 108,
3365 110, 112, 114, 116, 118, 120, 122, 124,
3366 126, 128, 130, 132, 134, 136, 138, 140,
3367 149, 151, 153, 155, 157, 159, 161, 163,
3368 165
3369 };
3370
3371 if (channel_info[chnl] <= 3)
3372 group = 0;
3373 else if (channel_info[chnl] <= 9)
3374 group = 1;
3375 else if (channel_info[chnl] <= 14)
3376 group = 2;
3377 else if (channel_info[chnl] <= 44)
3378 group = 3;
3379 else if (channel_info[chnl] <= 54)
3380 group = 4;
3381 else if (channel_info[chnl] <= 64)
3382 group = 5;
3383 else if (channel_info[chnl] <= 112)
3384 group = 6;
3385 else if (channel_info[chnl] <= 126)
3386 group = 7;
3387 else if (channel_info[chnl] <= 140)
3388 group = 8;
3389 else if (channel_info[chnl] <= 153)
3390 group = 9;
3391 else if (channel_info[chnl] <= 159)
3392 group = 10;
3393 else
3394 group = 11;
3395 return group;
3396 }
3397
3398 void rtl92d_phy_set_poweron(struct ieee80211_hw *hw)
3399 {
3400 struct rtl_priv *rtlpriv = rtl_priv(hw);
3401 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3402 unsigned long flags;
3403 u8 value8;
3404 u16 i;
3405 u32 mac_reg = (rtlhal->interfaceindex == 0 ? REG_MAC0 : REG_MAC1);
3406
3407 /* notice fw know band status 0x81[1]/0x53[1] = 0: 5G, 1: 2G */
3408 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
3409 value8 = rtl_read_byte(rtlpriv, mac_reg);
3410 value8 |= BIT(1);
3411 rtl_write_byte(rtlpriv, mac_reg, value8);
3412 } else {
3413 value8 = rtl_read_byte(rtlpriv, mac_reg);
3414 value8 &= (~BIT(1));
3415 rtl_write_byte(rtlpriv, mac_reg, value8);
3416 }
3417
3418 if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY) {
3419 value8 = rtl_read_byte(rtlpriv, REG_MAC0);
3420 rtl_write_byte(rtlpriv, REG_MAC0, value8 | MAC0_ON);
3421 } else {
3422 spin_lock_irqsave(&globalmutex_power, flags);
3423 if (rtlhal->interfaceindex == 0) {
3424 value8 = rtl_read_byte(rtlpriv, REG_MAC0);
3425 rtl_write_byte(rtlpriv, REG_MAC0, value8 | MAC0_ON);
3426 } else {
3427 value8 = rtl_read_byte(rtlpriv, REG_MAC1);
3428 rtl_write_byte(rtlpriv, REG_MAC1, value8 | MAC1_ON);
3429 }
3430 value8 = rtl_read_byte(rtlpriv, REG_POWER_OFF_IN_PROCESS);
3431 spin_unlock_irqrestore(&globalmutex_power, flags);
3432 for (i = 0; i < 200; i++) {
3433 if ((value8 & BIT(7)) == 0) {
3434 break;
3435 } else {
3436 udelay(500);
3437 spin_lock_irqsave(&globalmutex_power, flags);
3438 value8 = rtl_read_byte(rtlpriv,
3439 REG_POWER_OFF_IN_PROCESS);
3440 spin_unlock_irqrestore(&globalmutex_power,
3441 flags);
3442 }
3443 }
3444 if (i == 200)
3445 RT_ASSERT(false, "Another mac power off over time\n");
3446 }
3447 }
3448
3449 void rtl92d_phy_config_maccoexist_rfpage(struct ieee80211_hw *hw)
3450 {
3451 struct rtl_priv *rtlpriv = rtl_priv(hw);
3452
3453 switch (rtlpriv->rtlhal.macphymode) {
3454 case DUALMAC_DUALPHY:
3455 rtl_write_byte(rtlpriv, REG_DMC, 0x0);
3456 rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x08);
3457 rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, 0x13ff);
3458 break;
3459 case DUALMAC_SINGLEPHY:
3460 rtl_write_byte(rtlpriv, REG_DMC, 0xf8);
3461 rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x08);
3462 rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, 0x13ff);
3463 break;
3464 case SINGLEMAC_SINGLEPHY:
3465 rtl_write_byte(rtlpriv, REG_DMC, 0x0);
3466 rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x10);
3467 rtl_write_word(rtlpriv, (REG_TRXFF_BNDY + 2), 0x27FF);
3468 break;
3469 default:
3470 break;
3471 }
3472 }
3473
3474 void rtl92d_update_bbrf_configuration(struct ieee80211_hw *hw)
3475 {
3476 struct rtl_priv *rtlpriv = rtl_priv(hw);
3477 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3478 struct rtl_phy *rtlphy = &(rtlpriv->phy);
3479 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
3480 u8 rfpath, i;
3481
3482 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "==>\n");
3483 /* r_select_5G for path_A/B 0 for 2.4G, 1 for 5G */
3484 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
3485 /* r_select_5G for path_A/B,0x878 */
3486 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(0), 0x0);
3487 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15), 0x0);
3488 if (rtlhal->macphymode != DUALMAC_DUALPHY) {
3489 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(16), 0x0);
3490 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(31), 0x0);
3491 }
3492 /* rssi_table_select:index 0 for 2.4G.1~3 for 5G,0xc78 */
3493 rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, BIT(6) | BIT(7), 0x0);
3494 /* fc_area 0xd2c */
3495 rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(14) | BIT(13), 0x0);
3496 /* 5G LAN ON */
3497 rtl_set_bbreg(hw, 0xB30, 0x00F00000, 0xa);
3498 /* TX BB gain shift*1,Just for testchip,0xc80,0xc88 */
3499 rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, BMASKDWORD,
3500 0x40000100);
3501 rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, BMASKDWORD,
3502 0x40000100);
3503 if (rtlhal->macphymode == DUALMAC_DUALPHY) {
3504 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3505 BIT(10) | BIT(6) | BIT(5),
3506 ((rtlefuse->eeprom_c9 & BIT(3)) >> 3) |
3507 (rtlefuse->eeprom_c9 & BIT(1)) |
3508 ((rtlefuse->eeprom_cc & BIT(1)) << 4));
3509 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
3510 BIT(10) | BIT(6) | BIT(5),
3511 ((rtlefuse->eeprom_c9 & BIT(2)) >> 2) |
3512 ((rtlefuse->eeprom_c9 & BIT(0)) << 1) |
3513 ((rtlefuse->eeprom_cc & BIT(0)) << 5));
3514 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15), 0);
3515 } else {
3516 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3517 BIT(26) | BIT(22) | BIT(21) | BIT(10) |
3518 BIT(6) | BIT(5),
3519 ((rtlefuse->eeprom_c9 & BIT(3)) >> 3) |
3520 (rtlefuse->eeprom_c9 & BIT(1)) |
3521 ((rtlefuse->eeprom_cc & BIT(1)) << 4) |
3522 ((rtlefuse->eeprom_c9 & BIT(7)) << 9) |
3523 ((rtlefuse->eeprom_c9 & BIT(5)) << 12) |
3524 ((rtlefuse->eeprom_cc & BIT(3)) << 18));
3525 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
3526 BIT(10) | BIT(6) | BIT(5),
3527 ((rtlefuse->eeprom_c9 & BIT(2)) >> 2) |
3528 ((rtlefuse->eeprom_c9 & BIT(0)) << 1) |
3529 ((rtlefuse->eeprom_cc & BIT(0)) << 5));
3530 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
3531 BIT(10) | BIT(6) | BIT(5),
3532 ((rtlefuse->eeprom_c9 & BIT(6)) >> 6) |
3533 ((rtlefuse->eeprom_c9 & BIT(4)) >> 3) |
3534 ((rtlefuse->eeprom_cc & BIT(2)) << 3));
3535 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER,
3536 BIT(31) | BIT(15), 0);
3537 }
3538 /* 1.5V_LDO */
3539 } else {
3540 /* r_select_5G for path_A/B */
3541 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(0), 0x1);
3542 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15), 0x1);
3543 if (rtlhal->macphymode != DUALMAC_DUALPHY) {
3544 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(16), 0x1);
3545 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(31), 0x1);
3546 }
3547 /* rssi_table_select:index 0 for 2.4G.1~3 for 5G */
3548 rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, BIT(6) | BIT(7), 0x1);
3549 /* fc_area */
3550 rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(14) | BIT(13), 0x1);
3551 /* 5G LAN ON */
3552 rtl_set_bbreg(hw, 0xB30, 0x00F00000, 0x0);
3553 /* TX BB gain shift,Just for testchip,0xc80,0xc88 */
3554 if (rtlefuse->internal_pa_5g[0])
3555 rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, BMASKDWORD,
3556 0x2d4000b5);
3557 else
3558 rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, BMASKDWORD,
3559 0x20000080);
3560 if (rtlefuse->internal_pa_5g[1])
3561 rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, BMASKDWORD,
3562 0x2d4000b5);
3563 else
3564 rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, BMASKDWORD,
3565 0x20000080);
3566 if (rtlhal->macphymode == DUALMAC_DUALPHY) {
3567 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3568 BIT(10) | BIT(6) | BIT(5),
3569 (rtlefuse->eeprom_cc & BIT(5)));
3570 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(10),
3571 ((rtlefuse->eeprom_cc & BIT(4)) >> 4));
3572 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15),
3573 (rtlefuse->eeprom_cc & BIT(4)) >> 4);
3574 } else {
3575 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3576 BIT(26) | BIT(22) | BIT(21) | BIT(10) |
3577 BIT(6) | BIT(5),
3578 (rtlefuse->eeprom_cc & BIT(5)) |
3579 ((rtlefuse->eeprom_cc & BIT(7)) << 14));
3580 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(10),
3581 ((rtlefuse->eeprom_cc & BIT(4)) >> 4));
3582 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, BIT(10),
3583 ((rtlefuse->eeprom_cc & BIT(6)) >> 6));
3584 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER,
3585 BIT(31) | BIT(15),
3586 ((rtlefuse->eeprom_cc & BIT(4)) >> 4) |
3587 ((rtlefuse->eeprom_cc & BIT(6)) << 10));
3588 }
3589 }
3590 /* update IQK related settings */
3591 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, BMASKDWORD, 0x40000100);
3592 rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, BMASKDWORD, 0x40000100);
3593 rtl_set_bbreg(hw, ROFDM0_XCTxAFE, 0xF0000000, 0x00);
3594 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(30) | BIT(28) |
3595 BIT(26) | BIT(24), 0x00);
3596 rtl_set_bbreg(hw, ROFDM0_XDTxAFE, 0xF0000000, 0x00);
3597 rtl_set_bbreg(hw, 0xca0, 0xF0000000, 0x00);
3598 rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0x0000F000, 0x00);
3599
3600 /* Update RF */
3601 for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
3602 rfpath++) {
3603 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
3604 /* MOD_AG for RF paht_A 0x18 BIT8,BIT16 */
3605 rtl_set_rfreg(hw, rfpath, RF_CHNLBW, BIT(8) | BIT(16) |
3606 BIT(18), 0);
3607 /* RF0x0b[16:14] =3b'111 */
3608 rtl_set_rfreg(hw, (enum radio_path)rfpath, 0x0B,
3609 0x1c000, 0x07);
3610 } else {
3611 /* MOD_AG for RF paht_A 0x18 BIT8,BIT16 */
3612 rtl_set_rfreg(hw, rfpath, RF_CHNLBW, BIT(8) |
3613 BIT(16) | BIT(18),
3614 (BIT(16) | BIT(8)) >> 8);
3615 }
3616 }
3617 /* Update for all band. */
3618 /* DMDP */
3619 if (rtlphy->rf_type == RF_1T1R) {
3620 /* Use antenna 0,0xc04,0xd04 */
3621 rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, BMASKBYTE0, 0x11);
3622 rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE, BDWORD, 0x1);
3623
3624 /* enable ad/da clock1 for dual-phy reg0x888 */
3625 if (rtlhal->interfaceindex == 0) {
3626 rtl_set_bbreg(hw, RFPGA0_ADDALLOCKEN, BIT(12) |
3627 BIT(13), 0x3);
3628 } else {
3629 rtl92d_phy_enable_anotherphy(hw, false);
3630 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3631 "MAC1 use DBI to update 0x888\n");
3632 /* 0x888 */
3633 rtl92de_write_dword_dbi(hw, RFPGA0_ADDALLOCKEN,
3634 rtl92de_read_dword_dbi(hw,
3635 RFPGA0_ADDALLOCKEN,
3636 BIT(3)) | BIT(12) | BIT(13),
3637 BIT(3));
3638 rtl92d_phy_powerdown_anotherphy(hw, false);
3639 }
3640 } else {
3641 /* Single PHY */
3642 /* Use antenna 0 & 1,0xc04,0xd04 */
3643 rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, BMASKBYTE0, 0x33);
3644 rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE, BDWORD, 0x3);
3645 /* disable ad/da clock1,0x888 */
3646 rtl_set_bbreg(hw, RFPGA0_ADDALLOCKEN, BIT(12) | BIT(13), 0);
3647 }
3648 for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
3649 rfpath++) {
3650 rtlphy->rfreg_chnlval[rfpath] = rtl_get_rfreg(hw, rfpath,
3651 RF_CHNLBW, BRFREGOFFSETMASK);
3652 rtlphy->reg_rf3c[rfpath] = rtl_get_rfreg(hw, rfpath, 0x3C,
3653 BRFREGOFFSETMASK);
3654 }
3655 for (i = 0; i < 2; i++)
3656 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "RF 0x18 = 0x%x\n",
3657 rtlphy->rfreg_chnlval[i]);
3658 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "<==\n");
3659
3660 }
3661
3662 bool rtl92d_phy_check_poweroff(struct ieee80211_hw *hw)
3663 {
3664 struct rtl_priv *rtlpriv = rtl_priv(hw);
3665 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3666 u8 u1btmp;
3667 unsigned long flags;
3668
3669 if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY) {
3670 u1btmp = rtl_read_byte(rtlpriv, REG_MAC0);
3671 rtl_write_byte(rtlpriv, REG_MAC0, u1btmp & (~MAC0_ON));
3672 return true;
3673 }
3674 spin_lock_irqsave(&globalmutex_power, flags);
3675 if (rtlhal->interfaceindex == 0) {
3676 u1btmp = rtl_read_byte(rtlpriv, REG_MAC0);
3677 rtl_write_byte(rtlpriv, REG_MAC0, u1btmp & (~MAC0_ON));
3678 u1btmp = rtl_read_byte(rtlpriv, REG_MAC1);
3679 u1btmp &= MAC1_ON;
3680 } else {
3681 u1btmp = rtl_read_byte(rtlpriv, REG_MAC1);
3682 rtl_write_byte(rtlpriv, REG_MAC1, u1btmp & (~MAC1_ON));
3683 u1btmp = rtl_read_byte(rtlpriv, REG_MAC0);
3684 u1btmp &= MAC0_ON;
3685 }
3686 if (u1btmp) {
3687 spin_unlock_irqrestore(&globalmutex_power, flags);
3688 return false;
3689 }
3690 u1btmp = rtl_read_byte(rtlpriv, REG_POWER_OFF_IN_PROCESS);
3691 u1btmp |= BIT(7);
3692 rtl_write_byte(rtlpriv, REG_POWER_OFF_IN_PROCESS, u1btmp);
3693 spin_unlock_irqrestore(&globalmutex_power, flags);
3694 return true;
3695 }
This page took 0.142178 seconds and 5 git commands to generate.