spi-topcliff-pch: supports a spi mode setup and bit order setup by IO control
[zen-stable.git] / drivers / net / wireless / rtlwifi / rtl8192de / phy.c
blob2cf4c5f25cf0c709a04f8bb8039dc8932ac58317
1 /******************************************************************************
3 * Copyright(c) 2009-2010 Realtek Corporation.
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.
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.
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
18 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE.
21 * Contact Information:
22 * wlanfae <wlanfae@realtek.com>
23 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
24 * Hsinchu 300, Taiwan.
26 * Larry Finger <Larry.Finger@lwfinger.net>
28 *****************************************************************************/
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"
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
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
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
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
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
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)
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
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
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}
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}
100 static u32 rf_syn_g4_for_c_cut_2g = 0xD1C31 & 0x7FF;
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}
108 /* [mode][patha+b][reg] */
109 static u32 rf_imr_param_normal[1][3][MAX_RF_IMR_INDEX_NORMAL] = {
111 /* channel 1-14. */
113 0x70000, 0x00ff0, 0x4400f, 0x00ff0, 0x0, 0x0, 0x0,
114 0x0, 0x0, 0x64888, 0xe266c, 0x00090, 0x22fff
116 /* path 36-64 */
118 0x70000, 0x22880, 0x4470f, 0x55880, 0x00070, 0x88000,
119 0x0, 0x88080, 0x70000, 0x64a82, 0xe466c, 0x00090,
120 0x32c9a
122 /* 100 -165 */
124 0x70000, 0x44880, 0x4477f, 0x77880, 0x00070, 0x88000,
125 0x0, 0x880b0, 0x0, 0x64b82, 0xe466c, 0x00090, 0x32c9a
130 static u32 curveindex_5g[TARGET_CHNL_NUM_5G] = {0};
132 static u32 curveindex_2g[TARGET_CHNL_NUM_2G] = {0};
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
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
188 static u32 _rtl92d_phy_calculate_bit_shift(u32 bitmask)
190 u32 i;
192 for (i = 0; i <= 31; i++) {
193 if (((bitmask >> i) & 0x1) == 1)
194 break;
197 return i;
200 u32 rtl92d_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask)
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;
207 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), "
208 "bitmask(%#x)\n", 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);
221 bitshift = _rtl92d_phy_calculate_bit_shift(bitmask);
222 returnvalue = (originalvalue & bitmask) >> bitshift;
223 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("BBR MASK=0x%x "
224 "Addr[0x%x]=0x%x\n", bitmask, regaddr, originalvalue));
225 return returnvalue;
228 void rtl92d_phy_set_bb_reg(struct ieee80211_hw *hw,
229 u32 regaddr, u32 bitmask, u32 data)
231 struct rtl_priv *rtlpriv = rtl_priv(hw);
232 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
233 u8 dbi_direct = 0;
234 u32 originalvalue, bitshift;
236 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), bitmask(%#x),"
237 " data(%#x)\n", regaddr, bitmask, data));
238 if (rtlhal->during_mac1init_radioa)
239 dbi_direct = BIT(3);
240 else if (rtlhal->during_mac0init_radiob)
241 /* mac0 use phy1 write radio_b. */
242 dbi_direct = BIT(3) | BIT(2);
243 if (bitmask != BMASKDWORD) {
244 if (rtlhal->during_mac1init_radioa ||
245 rtlhal->during_mac0init_radiob)
246 originalvalue = rtl92de_read_dword_dbi(hw,
247 (u16) regaddr,
248 dbi_direct);
249 else
250 originalvalue = rtl_read_dword(rtlpriv, regaddr);
251 bitshift = _rtl92d_phy_calculate_bit_shift(bitmask);
252 data = ((originalvalue & (~bitmask)) | (data << bitshift));
254 if (rtlhal->during_mac1init_radioa || rtlhal->during_mac0init_radiob)
255 rtl92de_write_dword_dbi(hw, (u16) regaddr, data, dbi_direct);
256 else
257 rtl_write_dword(rtlpriv, regaddr, data);
258 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), bitmask(%#x),"
259 " data(%#x)\n", regaddr, bitmask, data));
262 static u32 _rtl92d_phy_rf_serial_read(struct ieee80211_hw *hw,
263 enum radio_path rfpath, u32 offset)
266 struct rtl_priv *rtlpriv = rtl_priv(hw);
267 struct rtl_phy *rtlphy = &(rtlpriv->phy);
268 struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
269 u32 newoffset;
270 u32 tmplong, tmplong2;
271 u8 rfpi_enable = 0;
272 u32 retvalue;
274 newoffset = offset;
275 tmplong = rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, BMASKDWORD);
276 if (rfpath == RF90_PATH_A)
277 tmplong2 = tmplong;
278 else
279 tmplong2 = rtl_get_bbreg(hw, pphyreg->rfhssi_para2, BMASKDWORD);
280 tmplong2 = (tmplong2 & (~BLSSIREADADDRESS)) |
281 (newoffset << 23) | BLSSIREADEDGE;
282 rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, BMASKDWORD,
283 tmplong & (~BLSSIREADEDGE));
284 udelay(10);
285 rtl_set_bbreg(hw, pphyreg->rfhssi_para2, BMASKDWORD, tmplong2);
286 udelay(50);
287 udelay(50);
288 rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, BMASKDWORD,
289 tmplong | BLSSIREADEDGE);
290 udelay(10);
291 if (rfpath == RF90_PATH_A)
292 rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1,
293 BIT(8));
294 else if (rfpath == RF90_PATH_B)
295 rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XB_HSSIPARAMETER1,
296 BIT(8));
297 if (rfpi_enable)
298 retvalue = rtl_get_bbreg(hw, pphyreg->rflssi_readbackpi,
299 BLSSIREADBACKDATA);
300 else
301 retvalue = rtl_get_bbreg(hw, pphyreg->rflssi_readback,
302 BLSSIREADBACKDATA);
303 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("RFR-%d Addr[0x%x] = 0x%x\n",
304 rfpath, pphyreg->rflssi_readback, retvalue));
305 return retvalue;
308 static void _rtl92d_phy_rf_serial_write(struct ieee80211_hw *hw,
309 enum radio_path rfpath,
310 u32 offset, u32 data)
312 u32 data_and_addr;
313 u32 newoffset;
314 struct rtl_priv *rtlpriv = rtl_priv(hw);
315 struct rtl_phy *rtlphy = &(rtlpriv->phy);
316 struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
318 newoffset = offset;
319 /* T65 RF */
320 data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff;
321 rtl_set_bbreg(hw, pphyreg->rf3wire_offset, BMASKDWORD, data_and_addr);
322 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("RFW-%d Addr[0x%x]=0x%x\n",
323 rfpath, pphyreg->rf3wire_offset, data_and_addr));
326 u32 rtl92d_phy_query_rf_reg(struct ieee80211_hw *hw,
327 enum radio_path rfpath, u32 regaddr, u32 bitmask)
329 struct rtl_priv *rtlpriv = rtl_priv(hw);
330 u32 original_value, readback_value, bitshift;
331 unsigned long flags;
333 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), "
334 "rfpath(%#x), bitmask(%#x)\n",
335 regaddr, rfpath, bitmask));
336 spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
337 original_value = _rtl92d_phy_rf_serial_read(hw, rfpath, regaddr);
338 bitshift = _rtl92d_phy_calculate_bit_shift(bitmask);
339 readback_value = (original_value & bitmask) >> bitshift;
340 spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
341 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), rfpath(%#x), "
342 "bitmask(%#x), original_value(%#x)\n",
343 regaddr, rfpath, bitmask, original_value));
344 return readback_value;
347 void rtl92d_phy_set_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,
348 u32 regaddr, u32 bitmask, u32 data)
350 struct rtl_priv *rtlpriv = rtl_priv(hw);
351 struct rtl_phy *rtlphy = &(rtlpriv->phy);
352 u32 original_value, bitshift;
353 unsigned long flags;
355 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
356 ("regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
357 regaddr, bitmask, data, rfpath));
358 if (bitmask == 0)
359 return;
360 spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
361 if (rtlphy->rf_mode != RF_OP_BY_FW) {
362 if (bitmask != BRFREGOFFSETMASK) {
363 original_value = _rtl92d_phy_rf_serial_read(hw,
364 rfpath, regaddr);
365 bitshift = _rtl92d_phy_calculate_bit_shift(bitmask);
366 data = ((original_value & (~bitmask)) |
367 (data << bitshift));
369 _rtl92d_phy_rf_serial_write(hw, rfpath, regaddr, data);
371 spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
372 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), "
373 "bitmask(%#x), data(%#x), rfpath(%#x)\n",
374 regaddr, bitmask, data, rfpath));
377 bool rtl92d_phy_mac_config(struct ieee80211_hw *hw)
379 struct rtl_priv *rtlpriv = rtl_priv(hw);
380 u32 i;
381 u32 arraylength;
382 u32 *ptrarray;
384 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("Read Rtl819XMACPHY_Array\n"));
385 arraylength = MAC_2T_ARRAYLENGTH;
386 ptrarray = rtl8192de_mac_2tarray;
387 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("Img:Rtl819XMAC_Array\n"));
388 for (i = 0; i < arraylength; i = i + 2)
389 rtl_write_byte(rtlpriv, ptrarray[i], (u8) ptrarray[i + 1]);
390 if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY) {
391 /* improve 2-stream TX EVM */
392 /* rtl_write_byte(rtlpriv, 0x14,0x71); */
393 /* AMPDU aggregation number 9 */
394 /* rtl_write_word(rtlpriv, REG_MAX_AGGR_NUM, MAX_AGGR_NUM); */
395 rtl_write_byte(rtlpriv, REG_MAX_AGGR_NUM, 0x0B);
396 } else {
397 /* 92D need to test to decide the num. */
398 rtl_write_byte(rtlpriv, REG_MAX_AGGR_NUM, 0x07);
400 return true;
403 static void _rtl92d_phy_init_bb_rf_register_definition(struct ieee80211_hw *hw)
405 struct rtl_priv *rtlpriv = rtl_priv(hw);
406 struct rtl_phy *rtlphy = &(rtlpriv->phy);
408 /* RF Interface Sowrtware Control */
409 /* 16 LSBs if read 32-bit from 0x870 */
410 rtlphy->phyreg_def[RF90_PATH_A].rfintfs = RFPGA0_XAB_RFINTERFACESW;
411 /* 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872) */
412 rtlphy->phyreg_def[RF90_PATH_B].rfintfs = RFPGA0_XAB_RFINTERFACESW;
413 /* 16 LSBs if read 32-bit from 0x874 */
414 rtlphy->phyreg_def[RF90_PATH_C].rfintfs = RFPGA0_XCD_RFINTERFACESW;
415 /* 16 MSBs if read 32-bit from 0x874 (16-bit for 0x876) */
417 rtlphy->phyreg_def[RF90_PATH_D].rfintfs = RFPGA0_XCD_RFINTERFACESW;
418 /* RF Interface Readback Value */
419 /* 16 LSBs if read 32-bit from 0x8E0 */
420 rtlphy->phyreg_def[RF90_PATH_A].rfintfi = RFPGA0_XAB_RFINTERFACERB;
421 /* 16 MSBs if read 32-bit from 0x8E0 (16-bit for 0x8E2) */
422 rtlphy->phyreg_def[RF90_PATH_B].rfintfi = RFPGA0_XAB_RFINTERFACERB;
423 /* 16 LSBs if read 32-bit from 0x8E4 */
424 rtlphy->phyreg_def[RF90_PATH_C].rfintfi = RFPGA0_XCD_RFINTERFACERB;
425 /* 16 MSBs if read 32-bit from 0x8E4 (16-bit for 0x8E6) */
426 rtlphy->phyreg_def[RF90_PATH_D].rfintfi = RFPGA0_XCD_RFINTERFACERB;
428 /* RF Interface Output (and Enable) */
429 /* 16 LSBs if read 32-bit from 0x860 */
430 rtlphy->phyreg_def[RF90_PATH_A].rfintfo = RFPGA0_XA_RFINTERFACEOE;
431 /* 16 LSBs if read 32-bit from 0x864 */
432 rtlphy->phyreg_def[RF90_PATH_B].rfintfo = RFPGA0_XB_RFINTERFACEOE;
434 /* RF Interface (Output and) Enable */
435 /* 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862) */
436 rtlphy->phyreg_def[RF90_PATH_A].rfintfe = RFPGA0_XA_RFINTERFACEOE;
437 /* 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866) */
438 rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE;
440 /* Addr of LSSI. Wirte RF register by driver */
441 /* LSSI Parameter */
442 rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset =
443 RFPGA0_XA_LSSIPARAMETER;
444 rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset =
445 RFPGA0_XB_LSSIPARAMETER;
447 /* RF parameter */
448 /* BB Band Select */
449 rtlphy->phyreg_def[RF90_PATH_A].rflssi_select = RFPGA0_XAB_RFPARAMETER;
450 rtlphy->phyreg_def[RF90_PATH_B].rflssi_select = RFPGA0_XAB_RFPARAMETER;
451 rtlphy->phyreg_def[RF90_PATH_C].rflssi_select = RFPGA0_XCD_RFPARAMETER;
452 rtlphy->phyreg_def[RF90_PATH_D].rflssi_select = RFPGA0_XCD_RFPARAMETER;
454 /* Tx AGC Gain Stage (same for all path. Should we remove this?) */
455 /* Tx gain stage */
456 rtlphy->phyreg_def[RF90_PATH_A].rftxgain_stage = RFPGA0_TXGAINSTAGE;
457 /* Tx gain stage */
458 rtlphy->phyreg_def[RF90_PATH_B].rftxgain_stage = RFPGA0_TXGAINSTAGE;
459 /* Tx gain stage */
460 rtlphy->phyreg_def[RF90_PATH_C].rftxgain_stage = RFPGA0_TXGAINSTAGE;
461 /* Tx gain stage */
462 rtlphy->phyreg_def[RF90_PATH_D].rftxgain_stage = RFPGA0_TXGAINSTAGE;
464 /* Tranceiver A~D HSSI Parameter-1 */
465 /* wire control parameter1 */
466 rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para1 = RFPGA0_XA_HSSIPARAMETER1;
467 /* wire control parameter1 */
468 rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para1 = RFPGA0_XB_HSSIPARAMETER1;
470 /* Tranceiver A~D HSSI Parameter-2 */
471 /* wire control parameter2 */
472 rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para2 = RFPGA0_XA_HSSIPARAMETER2;
473 /* wire control parameter2 */
474 rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para2 = RFPGA0_XB_HSSIPARAMETER2;
476 /* RF switch Control */
477 /* TR/Ant switch control */
478 rtlphy->phyreg_def[RF90_PATH_A].rfswitch_control =
479 RFPGA0_XAB_SWITCHCONTROL;
480 rtlphy->phyreg_def[RF90_PATH_B].rfswitch_control =
481 RFPGA0_XAB_SWITCHCONTROL;
482 rtlphy->phyreg_def[RF90_PATH_C].rfswitch_control =
483 RFPGA0_XCD_SWITCHCONTROL;
484 rtlphy->phyreg_def[RF90_PATH_D].rfswitch_control =
485 RFPGA0_XCD_SWITCHCONTROL;
487 /* AGC control 1 */
488 rtlphy->phyreg_def[RF90_PATH_A].rfagc_control1 = ROFDM0_XAAGCCORE1;
489 rtlphy->phyreg_def[RF90_PATH_B].rfagc_control1 = ROFDM0_XBAGCCORE1;
490 rtlphy->phyreg_def[RF90_PATH_C].rfagc_control1 = ROFDM0_XCAGCCORE1;
491 rtlphy->phyreg_def[RF90_PATH_D].rfagc_control1 = ROFDM0_XDAGCCORE1;
493 /* AGC control 2 */
494 rtlphy->phyreg_def[RF90_PATH_A].rfagc_control2 = ROFDM0_XAAGCCORE2;
495 rtlphy->phyreg_def[RF90_PATH_B].rfagc_control2 = ROFDM0_XBAGCCORE2;
496 rtlphy->phyreg_def[RF90_PATH_C].rfagc_control2 = ROFDM0_XCAGCCORE2;
497 rtlphy->phyreg_def[RF90_PATH_D].rfagc_control2 = ROFDM0_XDAGCCORE2;
499 /* RX AFE control 1 */
500 rtlphy->phyreg_def[RF90_PATH_A].rfrxiq_imbalance =
501 ROFDM0_XARXIQIMBALANCE;
502 rtlphy->phyreg_def[RF90_PATH_B].rfrxiq_imbalance =
503 ROFDM0_XBRXIQIMBALANCE;
504 rtlphy->phyreg_def[RF90_PATH_C].rfrxiq_imbalance =
505 ROFDM0_XCRXIQIMBALANCE;
506 rtlphy->phyreg_def[RF90_PATH_D].rfrxiq_imbalance =
507 ROFDM0_XDRXIQIMBALANCE;
509 /*RX AFE control 1 */
510 rtlphy->phyreg_def[RF90_PATH_A].rfrx_afe = ROFDM0_XARXAFE;
511 rtlphy->phyreg_def[RF90_PATH_B].rfrx_afe = ROFDM0_XBRXAFE;
512 rtlphy->phyreg_def[RF90_PATH_C].rfrx_afe = ROFDM0_XCRXAFE;
513 rtlphy->phyreg_def[RF90_PATH_D].rfrx_afe = ROFDM0_XDRXAFE;
515 /* Tx AFE control 1 */
516 rtlphy->phyreg_def[RF90_PATH_A].rftxiq_imbalance =
517 ROFDM0_XATxIQIMBALANCE;
518 rtlphy->phyreg_def[RF90_PATH_B].rftxiq_imbalance =
519 ROFDM0_XBTxIQIMBALANCE;
520 rtlphy->phyreg_def[RF90_PATH_C].rftxiq_imbalance =
521 ROFDM0_XCTxIQIMBALANCE;
522 rtlphy->phyreg_def[RF90_PATH_D].rftxiq_imbalance =
523 ROFDM0_XDTxIQIMBALANCE;
525 /* Tx AFE control 2 */
526 rtlphy->phyreg_def[RF90_PATH_A].rftx_afe = ROFDM0_XATxAFE;
527 rtlphy->phyreg_def[RF90_PATH_B].rftx_afe = ROFDM0_XBTxAFE;
528 rtlphy->phyreg_def[RF90_PATH_C].rftx_afe = ROFDM0_XCTxAFE;
529 rtlphy->phyreg_def[RF90_PATH_D].rftx_afe = ROFDM0_XDTxAFE;
531 /* Tranceiver LSSI Readback SI mode */
532 rtlphy->phyreg_def[RF90_PATH_A].rflssi_readback =
533 RFPGA0_XA_LSSIREADBACK;
534 rtlphy->phyreg_def[RF90_PATH_B].rflssi_readback =
535 RFPGA0_XB_LSSIREADBACK;
536 rtlphy->phyreg_def[RF90_PATH_C].rflssi_readback =
537 RFPGA0_XC_LSSIREADBACK;
538 rtlphy->phyreg_def[RF90_PATH_D].rflssi_readback =
539 RFPGA0_XD_LSSIREADBACK;
541 /* Tranceiver LSSI Readback PI mode */
542 rtlphy->phyreg_def[RF90_PATH_A].rflssi_readbackpi =
543 TRANSCEIVERA_HSPI_READBACK;
544 rtlphy->phyreg_def[RF90_PATH_B].rflssi_readbackpi =
545 TRANSCEIVERB_HSPI_READBACK;
548 static bool _rtl92d_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
549 u8 configtype)
551 int i;
552 u32 *phy_regarray_table;
553 u32 *agctab_array_table = NULL;
554 u32 *agctab_5garray_table;
555 u16 phy_reg_arraylen, agctab_arraylen = 0, agctab_5garraylen;
556 struct rtl_priv *rtlpriv = rtl_priv(hw);
557 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
559 /* Normal chip,Mac0 use AGC_TAB.txt for 2G and 5G band. */
560 if (rtlhal->interfaceindex == 0) {
561 agctab_arraylen = AGCTAB_ARRAYLENGTH;
562 agctab_array_table = rtl8192de_agctab_array;
563 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
564 (" ===> phy:MAC0, Rtl819XAGCTAB_Array\n"));
565 } else {
566 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
567 agctab_arraylen = AGCTAB_2G_ARRAYLENGTH;
568 agctab_array_table = rtl8192de_agctab_2garray;
569 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
570 (" ===> phy:MAC1, Rtl819XAGCTAB_2GArray\n"));
571 } else {
572 agctab_5garraylen = AGCTAB_5G_ARRAYLENGTH;
573 agctab_5garray_table = rtl8192de_agctab_5garray;
574 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
575 (" ===> phy:MAC1, Rtl819XAGCTAB_5GArray\n"));
579 phy_reg_arraylen = PHY_REG_2T_ARRAYLENGTH;
580 phy_regarray_table = rtl8192de_phy_reg_2tarray;
581 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
582 (" ===> phy:Rtl819XPHY_REG_Array_PG\n"));
583 if (configtype == BASEBAND_CONFIG_PHY_REG) {
584 for (i = 0; i < phy_reg_arraylen; i = i + 2) {
585 if (phy_regarray_table[i] == 0xfe)
586 mdelay(50);
587 else if (phy_regarray_table[i] == 0xfd)
588 mdelay(5);
589 else if (phy_regarray_table[i] == 0xfc)
590 mdelay(1);
591 else if (phy_regarray_table[i] == 0xfb)
592 udelay(50);
593 else if (phy_regarray_table[i] == 0xfa)
594 udelay(5);
595 else if (phy_regarray_table[i] == 0xf9)
596 udelay(1);
597 rtl_set_bbreg(hw, phy_regarray_table[i], BMASKDWORD,
598 phy_regarray_table[i + 1]);
599 udelay(1);
600 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
601 ("The phy_regarray_table[0] is %x"
602 " Rtl819XPHY_REGArray[1] is %x\n",
603 phy_regarray_table[i],
604 phy_regarray_table[i + 1]));
606 } else if (configtype == BASEBAND_CONFIG_AGC_TAB) {
607 if (rtlhal->interfaceindex == 0) {
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_"
617 "Table[0] is %ul "
618 "Rtl819XPHY_REGArray[1] is %ul\n",
619 agctab_array_table[i],
620 agctab_array_table[i + 1]));
622 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
623 ("Normal Chip, MAC0, load "
624 "Rtl819XAGCTAB_Array\n"));
625 } else {
626 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
627 for (i = 0; i < agctab_arraylen; i = i + 2) {
628 rtl_set_bbreg(hw, agctab_array_table[i],
629 BMASKDWORD,
630 agctab_array_table[i + 1]);
631 /* Add 1us delay between BB/RF register
632 * setting. */
633 udelay(1);
634 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
635 ("The Rtl819XAGCTAB_Array_"
636 "Table[0] is %ul Rtl819XPHY_"
637 "REGArray[1] is %ul\n",
638 agctab_array_table[i],
639 agctab_array_table[i + 1]));
641 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
642 ("Load Rtl819XAGCTAB_2GArray\n"));
643 } else {
644 for (i = 0; i < agctab_5garraylen; i = i + 2) {
645 rtl_set_bbreg(hw,
646 agctab_5garray_table[i],
647 BMASKDWORD,
648 agctab_5garray_table[i + 1]);
649 /* Add 1us delay between BB/RF registeri
650 * setting. */
651 udelay(1);
652 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
653 ("The Rtl819XAGCTAB_5GArray_"
654 "Table[0] is %ul Rtl819XPHY_"
655 "REGArray[1] is %ul\n",
656 agctab_5garray_table[i],
657 agctab_5garray_table[i + 1]));
659 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
660 ("Load Rtl819XAGCTAB_5GArray\n"));
664 return true;
667 static void _rtl92d_store_pwrindex_diffrate_offset(struct ieee80211_hw *hw,
668 u32 regaddr, u32 bitmask,
669 u32 data)
671 struct rtl_priv *rtlpriv = rtl_priv(hw);
672 struct rtl_phy *rtlphy = &(rtlpriv->phy);
674 if (regaddr == RTXAGC_A_RATE18_06) {
675 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][0] =
676 data;
677 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
678 ("MCSTxPowerLevelOriginalOffset[%d][0] = 0x%ulx\n",
679 rtlphy->pwrgroup_cnt,
680 rtlphy->mcs_txpwrlevel_origoffset
681 [rtlphy->pwrgroup_cnt][0]));
683 if (regaddr == RTXAGC_A_RATE54_24) {
684 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][1] =
685 data;
686 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
687 ("MCSTxPowerLevelOriginalOffset[%d][1] = 0x%ulx\n",
688 rtlphy->pwrgroup_cnt,
689 rtlphy->mcs_txpwrlevel_origoffset
690 [rtlphy->pwrgroup_cnt][1]));
692 if (regaddr == RTXAGC_A_CCK1_MCS32) {
693 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][6] =
694 data;
695 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
696 ("MCSTxPowerLevelOriginalOffset[%d][6] = 0x%ulx\n",
697 rtlphy->pwrgroup_cnt,
698 rtlphy->mcs_txpwrlevel_origoffset
699 [rtlphy->pwrgroup_cnt][6]));
701 if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0xffffff00) {
702 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][7] =
703 data;
704 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
705 ("MCSTxPowerLevelOriginalOffset[%d][7] = 0x%ulx\n",
706 rtlphy->pwrgroup_cnt,
707 rtlphy->mcs_txpwrlevel_origoffset
708 [rtlphy->pwrgroup_cnt][7]));
710 if (regaddr == RTXAGC_A_MCS03_MCS00) {
711 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][2] =
712 data;
713 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
714 ("MCSTxPowerLevelOriginalOffset[%d][2] = 0x%ulx\n",
715 rtlphy->pwrgroup_cnt,
716 rtlphy->mcs_txpwrlevel_origoffset
717 [rtlphy->pwrgroup_cnt][2]));
719 if (regaddr == RTXAGC_A_MCS07_MCS04) {
720 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][3] =
721 data;
722 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
723 ("MCSTxPowerLevelOriginalOffset[%d][3] = 0x%ulx\n",
724 rtlphy->pwrgroup_cnt,
725 rtlphy->mcs_txpwrlevel_origoffset
726 [rtlphy->pwrgroup_cnt][3]));
728 if (regaddr == RTXAGC_A_MCS11_MCS08) {
729 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][4] =
730 data;
731 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
732 ("MCSTxPowerLevelOriginalOffset[%d][4] = 0x%ulx\n",
733 rtlphy->pwrgroup_cnt,
734 rtlphy->mcs_txpwrlevel_origoffset
735 [rtlphy->pwrgroup_cnt][4]));
737 if (regaddr == RTXAGC_A_MCS15_MCS12) {
738 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][5] =
739 data;
740 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
741 ("MCSTxPowerLevelOriginalOffset[%d][5] = 0x%ulx\n",
742 rtlphy->pwrgroup_cnt,
743 rtlphy->mcs_txpwrlevel_origoffset
744 [rtlphy->pwrgroup_cnt][5]));
746 if (regaddr == RTXAGC_B_RATE18_06) {
747 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][8] =
748 data;
749 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
750 ("MCSTxPowerLevelOriginalOffset[%d][8] = 0x%ulx\n",
751 rtlphy->pwrgroup_cnt,
752 rtlphy->mcs_txpwrlevel_origoffset
753 [rtlphy->pwrgroup_cnt][8]));
755 if (regaddr == RTXAGC_B_RATE54_24) {
756 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][9] =
757 data;
758 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
759 ("MCSTxPowerLevelOriginalOffset[%d][9] = 0x%ulx\n",
760 rtlphy->pwrgroup_cnt,
761 rtlphy->mcs_txpwrlevel_origoffset
762 [rtlphy->pwrgroup_cnt][9]));
764 if (regaddr == RTXAGC_B_CCK1_55_MCS32) {
765 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][14] =
766 data;
767 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
768 ("MCSTxPowerLevelOriginalOffset[%d][14] = 0x%ulx\n",
769 rtlphy->pwrgroup_cnt,
770 rtlphy->mcs_txpwrlevel_origoffset
771 [rtlphy->pwrgroup_cnt][14]));
773 if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0x000000ff) {
774 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][15] =
775 data;
776 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
777 ("MCSTxPowerLevelOriginalOffset[%d][15] = 0x%ulx\n",
778 rtlphy->pwrgroup_cnt,
779 rtlphy->mcs_txpwrlevel_origoffset
780 [rtlphy->pwrgroup_cnt][15]));
782 if (regaddr == RTXAGC_B_MCS03_MCS00) {
783 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][10] =
784 data;
785 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
786 ("MCSTxPowerLevelOriginalOffset[%d][10] = 0x%ulx\n",
787 rtlphy->pwrgroup_cnt,
788 rtlphy->mcs_txpwrlevel_origoffset
789 [rtlphy->pwrgroup_cnt][10]));
791 if (regaddr == RTXAGC_B_MCS07_MCS04) {
792 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][11] =
793 data;
794 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
795 ("MCSTxPowerLevelOriginalOffset[%d][11] = 0x%ulx\n",
796 rtlphy->pwrgroup_cnt,
797 rtlphy->mcs_txpwrlevel_origoffset
798 [rtlphy->pwrgroup_cnt][11]));
800 if (regaddr == RTXAGC_B_MCS11_MCS08) {
801 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][12] =
802 data;
803 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
804 ("MCSTxPowerLevelOriginalOffset[%d][12] = 0x%ulx\n",
805 rtlphy->pwrgroup_cnt,
806 rtlphy->mcs_txpwrlevel_origoffset
807 [rtlphy->pwrgroup_cnt][12]));
809 if (regaddr == RTXAGC_B_MCS15_MCS12) {
810 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][13] =
811 data;
812 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
813 ("MCSTxPowerLevelOriginalOffset[%d][13] = 0x%ulx\n",
814 rtlphy->pwrgroup_cnt,
815 rtlphy->mcs_txpwrlevel_origoffset
816 [rtlphy->pwrgroup_cnt][13]));
817 rtlphy->pwrgroup_cnt++;
821 static bool _rtl92d_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
822 u8 configtype)
824 struct rtl_priv *rtlpriv = rtl_priv(hw);
825 int i;
826 u32 *phy_regarray_table_pg;
827 u16 phy_regarray_pg_len;
829 phy_regarray_pg_len = PHY_REG_ARRAY_PG_LENGTH;
830 phy_regarray_table_pg = rtl8192de_phy_reg_array_pg;
831 if (configtype == BASEBAND_CONFIG_PHY_REG) {
832 for (i = 0; i < phy_regarray_pg_len; i = i + 3) {
833 if (phy_regarray_table_pg[i] == 0xfe)
834 mdelay(50);
835 else if (phy_regarray_table_pg[i] == 0xfd)
836 mdelay(5);
837 else if (phy_regarray_table_pg[i] == 0xfc)
838 mdelay(1);
839 else if (phy_regarray_table_pg[i] == 0xfb)
840 udelay(50);
841 else if (phy_regarray_table_pg[i] == 0xfa)
842 udelay(5);
843 else if (phy_regarray_table_pg[i] == 0xf9)
844 udelay(1);
845 _rtl92d_store_pwrindex_diffrate_offset(hw,
846 phy_regarray_table_pg[i],
847 phy_regarray_table_pg[i + 1],
848 phy_regarray_table_pg[i + 2]);
850 } else {
851 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
852 ("configtype != BaseBand_Config_PHY_REG\n"));
854 return true;
857 static bool _rtl92d_phy_bb_config(struct ieee80211_hw *hw)
859 struct rtl_priv *rtlpriv = rtl_priv(hw);
860 struct rtl_phy *rtlphy = &(rtlpriv->phy);
861 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
862 bool rtstatus = true;
864 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("==>\n"));
865 rtstatus = _rtl92d_phy_config_bb_with_headerfile(hw,
866 BASEBAND_CONFIG_PHY_REG);
867 if (rtstatus != true) {
868 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("Write BB Reg Fail!!"));
869 return false;
872 /* if (rtlphy->rf_type == RF_1T2R) {
873 * _rtl92c_phy_bb_config_1t(hw);
874 * RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("Config to 1T!!\n"));
875 *} */
877 if (rtlefuse->autoload_failflag == false) {
878 rtlphy->pwrgroup_cnt = 0;
879 rtstatus = _rtl92d_phy_config_bb_with_pgheaderfile(hw,
880 BASEBAND_CONFIG_PHY_REG);
882 if (rtstatus != true) {
883 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("BB_PG Reg Fail!!"));
884 return false;
886 rtstatus = _rtl92d_phy_config_bb_with_headerfile(hw,
887 BASEBAND_CONFIG_AGC_TAB);
888 if (rtstatus != true) {
889 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("AGC Table Fail\n"));
890 return false;
892 rtlphy->cck_high_power = (bool) (rtl_get_bbreg(hw,
893 RFPGA0_XA_HSSIPARAMETER2, 0x200));
895 return true;
898 bool rtl92d_phy_bb_config(struct ieee80211_hw *hw)
900 struct rtl_priv *rtlpriv = rtl_priv(hw);
901 u16 regval;
902 u32 regvaldw;
903 u8 value;
905 _rtl92d_phy_init_bb_rf_register_definition(hw);
906 regval = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
907 rtl_write_word(rtlpriv, REG_SYS_FUNC_EN,
908 regval | BIT(13) | BIT(0) | BIT(1));
909 rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL, 0x83);
910 rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL + 1, 0xdb);
911 /* 0x1f bit7 bit6 represent for mac0/mac1 driver ready */
912 value = rtl_read_byte(rtlpriv, REG_RF_CTRL);
913 rtl_write_byte(rtlpriv, REG_RF_CTRL, value | RF_EN | RF_RSTB |
914 RF_SDMRSTB);
915 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, FEN_PPLL | FEN_PCIEA |
916 FEN_DIO_PCIE | FEN_BB_GLB_RSTn | FEN_BBRSTB);
917 rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL + 1, 0x80);
918 if (!(IS_92D_SINGLEPHY(rtlpriv->rtlhal.version))) {
919 regvaldw = rtl_read_dword(rtlpriv, REG_LEDCFG0);
920 rtl_write_dword(rtlpriv, REG_LEDCFG0, regvaldw | BIT(23));
923 return _rtl92d_phy_bb_config(hw);
926 bool rtl92d_phy_rf_config(struct ieee80211_hw *hw)
928 return rtl92d_phy_rf6052_config(hw);
931 bool rtl92d_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
932 enum rf_content content,
933 enum radio_path rfpath)
935 int i;
936 u32 *radioa_array_table;
937 u32 *radiob_array_table;
938 u16 radioa_arraylen, radiob_arraylen;
939 struct rtl_priv *rtlpriv = rtl_priv(hw);
941 radioa_arraylen = RADIOA_2T_ARRAYLENGTH;
942 radioa_array_table = rtl8192de_radioa_2tarray;
943 radiob_arraylen = RADIOB_2T_ARRAYLENGTH;
944 radiob_array_table = rtl8192de_radiob_2tarray;
945 if (rtlpriv->efuse.internal_pa_5g[0]) {
946 radioa_arraylen = RADIOA_2T_INT_PA_ARRAYLENGTH;
947 radioa_array_table = rtl8192de_radioa_2t_int_paarray;
949 if (rtlpriv->efuse.internal_pa_5g[1]) {
950 radiob_arraylen = RADIOB_2T_INT_PA_ARRAYLENGTH;
951 radiob_array_table = rtl8192de_radiob_2t_int_paarray;
953 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
954 ("PHY_ConfigRFWithHeaderFile() "
955 "Radio_A:Rtl819XRadioA_1TArray\n"));
956 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
957 ("PHY_ConfigRFWithHeaderFile() "
958 "Radio_B:Rtl819XRadioB_1TArray\n"));
959 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("Radio No %x\n", rfpath));
961 /* this only happens when DMDP, mac0 start on 2.4G,
962 * mac1 start on 5G, mac 0 has to set phy0&phy1
963 * pathA or mac1 has to set phy0&phy1 pathA */
964 if ((content == radiob_txt) && (rfpath == RF90_PATH_A)) {
965 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
966 (" ===> althougth Path A, we load radiob.txt\n"));
967 radioa_arraylen = radiob_arraylen;
968 radioa_array_table = radiob_array_table;
970 switch (rfpath) {
971 case RF90_PATH_A:
972 for (i = 0; i < radioa_arraylen; i = i + 2) {
973 if (radioa_array_table[i] == 0xfe) {
974 mdelay(50);
975 } else if (radioa_array_table[i] == 0xfd) {
976 /* delay_ms(5); */
977 mdelay(5);
978 } else if (radioa_array_table[i] == 0xfc) {
979 /* delay_ms(1); */
980 mdelay(1);
981 } else if (radioa_array_table[i] == 0xfb) {
982 udelay(50);
983 } else if (radioa_array_table[i] == 0xfa) {
984 udelay(5);
985 } else if (radioa_array_table[i] == 0xf9) {
986 udelay(1);
987 } else {
988 rtl_set_rfreg(hw, rfpath, radioa_array_table[i],
989 BRFREGOFFSETMASK,
990 radioa_array_table[i + 1]);
991 /* Add 1us delay between BB/RF register set. */
992 udelay(1);
995 break;
996 case RF90_PATH_B:
997 for (i = 0; i < radiob_arraylen; i = i + 2) {
998 if (radiob_array_table[i] == 0xfe) {
999 /* Delay specific ms. Only RF configuration
1000 * requires delay. */
1001 mdelay(50);
1002 } else if (radiob_array_table[i] == 0xfd) {
1003 /* delay_ms(5); */
1004 mdelay(5);
1005 } else if (radiob_array_table[i] == 0xfc) {
1006 /* delay_ms(1); */
1007 mdelay(1);
1008 } else if (radiob_array_table[i] == 0xfb) {
1009 udelay(50);
1010 } else if (radiob_array_table[i] == 0xfa) {
1011 udelay(5);
1012 } else if (radiob_array_table[i] == 0xf9) {
1013 udelay(1);
1014 } else {
1015 rtl_set_rfreg(hw, rfpath, radiob_array_table[i],
1016 BRFREGOFFSETMASK,
1017 radiob_array_table[i + 1]);
1018 /* Add 1us delay between BB/RF register set. */
1019 udelay(1);
1022 break;
1023 case RF90_PATH_C:
1024 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1025 ("switch case not process\n"));
1026 break;
1027 case RF90_PATH_D:
1028 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1029 ("switch case not process\n"));
1030 break;
1032 return true;
1035 void rtl92d_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
1037 struct rtl_priv *rtlpriv = rtl_priv(hw);
1038 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1040 rtlphy->default_initialgain[0] =
1041 (u8) rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, BMASKBYTE0);
1042 rtlphy->default_initialgain[1] =
1043 (u8) rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, BMASKBYTE0);
1044 rtlphy->default_initialgain[2] =
1045 (u8) rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, BMASKBYTE0);
1046 rtlphy->default_initialgain[3] =
1047 (u8) rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, BMASKBYTE0);
1048 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1049 ("Default initial gain (c50=0x%x, "
1050 "c58=0x%x, c60=0x%x, c68=0x%x\n",
1051 rtlphy->default_initialgain[0],
1052 rtlphy->default_initialgain[1],
1053 rtlphy->default_initialgain[2],
1054 rtlphy->default_initialgain[3]));
1055 rtlphy->framesync = (u8)rtl_get_bbreg(hw, ROFDM0_RXDETECTOR3,
1056 BMASKBYTE0);
1057 rtlphy->framesync_c34 = rtl_get_bbreg(hw, ROFDM0_RXDETECTOR2,
1058 BMASKDWORD);
1059 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1060 ("Default framesync (0x%x) = 0x%x\n",
1061 ROFDM0_RXDETECTOR3, rtlphy->framesync));
1064 static void _rtl92d_get_txpower_index(struct ieee80211_hw *hw, u8 channel,
1065 u8 *cckpowerlevel, u8 *ofdmpowerlevel)
1067 struct rtl_priv *rtlpriv = rtl_priv(hw);
1068 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1069 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
1070 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1071 u8 index = (channel - 1);
1073 /* 1. CCK */
1074 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1075 /* RF-A */
1076 cckpowerlevel[RF90_PATH_A] =
1077 rtlefuse->txpwrlevel_cck[RF90_PATH_A][index];
1078 /* RF-B */
1079 cckpowerlevel[RF90_PATH_B] =
1080 rtlefuse->txpwrlevel_cck[RF90_PATH_B][index];
1081 } else {
1082 cckpowerlevel[RF90_PATH_A] = 0;
1083 cckpowerlevel[RF90_PATH_B] = 0;
1085 /* 2. OFDM for 1S or 2S */
1086 if (rtlphy->rf_type == RF_1T2R || rtlphy->rf_type == RF_1T1R) {
1087 /* Read HT 40 OFDM TX power */
1088 ofdmpowerlevel[RF90_PATH_A] =
1089 rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_A][index];
1090 ofdmpowerlevel[RF90_PATH_B] =
1091 rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_B][index];
1092 } else if (rtlphy->rf_type == RF_2T2R) {
1093 /* Read HT 40 OFDM TX power */
1094 ofdmpowerlevel[RF90_PATH_A] =
1095 rtlefuse->txpwrlevel_ht40_2s[RF90_PATH_A][index];
1096 ofdmpowerlevel[RF90_PATH_B] =
1097 rtlefuse->txpwrlevel_ht40_2s[RF90_PATH_B][index];
1101 static void _rtl92d_ccxpower_index_check(struct ieee80211_hw *hw,
1102 u8 channel, u8 *cckpowerlevel, u8 *ofdmpowerlevel)
1104 struct rtl_priv *rtlpriv = rtl_priv(hw);
1105 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1107 rtlphy->cur_cck_txpwridx = cckpowerlevel[0];
1108 rtlphy->cur_ofdm24g_txpwridx = ofdmpowerlevel[0];
1111 static u8 _rtl92c_phy_get_rightchnlplace(u8 chnl)
1113 u8 channel_5g[59] = {
1114 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
1115 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
1116 60, 62, 64, 100, 102, 104, 106, 108, 110, 112,
1117 114, 116, 118, 120, 122, 124, 126, 128,
1118 130, 132, 134, 136, 138, 140, 149, 151,
1119 153, 155, 157, 159, 161, 163, 165
1121 u8 place = chnl;
1123 if (chnl > 14) {
1124 for (place = 14; place < sizeof(channel_5g); place++) {
1125 if (channel_5g[place] == chnl) {
1126 place++;
1127 break;
1131 return place;
1134 void rtl92d_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
1136 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1137 struct rtl_priv *rtlpriv = rtl_priv(hw);
1138 u8 cckpowerlevel[2], ofdmpowerlevel[2];
1140 if (rtlefuse->txpwr_fromeprom == false)
1141 return;
1142 channel = _rtl92c_phy_get_rightchnlplace(channel);
1143 _rtl92d_get_txpower_index(hw, channel, &cckpowerlevel[0],
1144 &ofdmpowerlevel[0]);
1145 if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G)
1146 _rtl92d_ccxpower_index_check(hw, channel, &cckpowerlevel[0],
1147 &ofdmpowerlevel[0]);
1148 if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G)
1149 rtl92d_phy_rf6052_set_cck_txpower(hw, &cckpowerlevel[0]);
1150 rtl92d_phy_rf6052_set_ofdm_txpower(hw, &ofdmpowerlevel[0], channel);
1153 void rtl92d_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
1155 struct rtl_priv *rtlpriv = rtl_priv(hw);
1156 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1157 enum io_type iotype;
1159 if (!is_hal_stop(rtlhal)) {
1160 switch (operation) {
1161 case SCAN_OPT_BACKUP:
1162 rtlhal->current_bandtypebackup =
1163 rtlhal->current_bandtype;
1164 iotype = IO_CMD_PAUSE_DM_BY_SCAN;
1165 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_IO_CMD,
1166 (u8 *)&iotype);
1167 break;
1168 case SCAN_OPT_RESTORE:
1169 iotype = IO_CMD_RESUME_DM_BY_SCAN;
1170 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_IO_CMD,
1171 (u8 *)&iotype);
1172 break;
1173 default:
1174 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1175 ("Unknown Scan Backup operation.\n"));
1176 break;
1181 void rtl92d_phy_set_bw_mode(struct ieee80211_hw *hw,
1182 enum nl80211_channel_type ch_type)
1184 struct rtl_priv *rtlpriv = rtl_priv(hw);
1185 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1186 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1187 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1188 unsigned long flag = 0;
1189 u8 reg_prsr_rsc;
1190 u8 reg_bw_opmode;
1192 if (rtlphy->set_bwmode_inprogress)
1193 return;
1194 if ((is_hal_stop(rtlhal)) || (RT_CANNOT_IO(hw))) {
1195 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1196 ("FALSE driver sleep or unload\n"));
1197 return;
1199 rtlphy->set_bwmode_inprogress = true;
1200 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
1201 ("Switch to %s bandwidth\n",
1202 rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
1203 "20MHz" : "40MHz"));
1204 reg_bw_opmode = rtl_read_byte(rtlpriv, REG_BWOPMODE);
1205 reg_prsr_rsc = rtl_read_byte(rtlpriv, REG_RRSR + 2);
1206 switch (rtlphy->current_chan_bw) {
1207 case HT_CHANNEL_WIDTH_20:
1208 reg_bw_opmode |= BW_OPMODE_20MHZ;
1209 rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
1210 break;
1211 case HT_CHANNEL_WIDTH_20_40:
1212 reg_bw_opmode &= ~BW_OPMODE_20MHZ;
1213 rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
1215 reg_prsr_rsc = (reg_prsr_rsc & 0x90) |
1216 (mac->cur_40_prime_sc << 5);
1217 rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_prsr_rsc);
1218 break;
1219 default:
1220 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1221 ("unknown bandwidth: %#X\n", rtlphy->current_chan_bw));
1222 break;
1224 switch (rtlphy->current_chan_bw) {
1225 case HT_CHANNEL_WIDTH_20:
1226 rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x0);
1227 rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x0);
1228 /* SET BIT10 BIT11 for receive cck */
1229 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10) |
1230 BIT(11), 3);
1231 break;
1232 case HT_CHANNEL_WIDTH_20_40:
1233 rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x1);
1234 rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x1);
1235 /* Set Control channel to upper or lower.
1236 * These settings are required only for 40MHz */
1237 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1238 rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag);
1239 rtl_set_bbreg(hw, RCCK0_SYSTEM, BCCKSIDEBAND,
1240 (mac->cur_40_prime_sc >> 1));
1241 rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
1243 rtl_set_bbreg(hw, ROFDM1_LSTF, 0xC00, mac->cur_40_prime_sc);
1244 /* SET BIT10 BIT11 for receive cck */
1245 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10) |
1246 BIT(11), 0);
1247 rtl_set_bbreg(hw, 0x818, (BIT(26) | BIT(27)),
1248 (mac->cur_40_prime_sc ==
1249 HAL_PRIME_CHNL_OFFSET_LOWER) ? 2 : 1);
1250 break;
1251 default:
1252 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1253 ("unknown bandwidth: %#X\n", rtlphy->current_chan_bw));
1254 break;
1257 rtl92d_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
1258 rtlphy->set_bwmode_inprogress = false;
1259 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, ("<==\n"));
1262 static void _rtl92d_phy_stop_trx_before_changeband(struct ieee80211_hw *hw)
1264 rtl_set_bbreg(hw, RFPGA0_RFMOD, BCCKEN, 0);
1265 rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 0);
1266 rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, BMASKBYTE0, 0x00);
1267 rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE, BDWORD, 0x0);
1270 static void rtl92d_phy_switch_wirelessband(struct ieee80211_hw *hw, u8 band)
1272 struct rtl_priv *rtlpriv = rtl_priv(hw);
1273 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1274 u8 value8;
1276 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("==>\n"));
1277 rtlhal->bandset = band;
1278 rtlhal->current_bandtype = band;
1279 if (IS_92D_SINGLEPHY(rtlhal->version))
1280 rtlhal->bandset = BAND_ON_BOTH;
1281 /* stop RX/Tx */
1282 _rtl92d_phy_stop_trx_before_changeband(hw);
1283 /* reconfig BB/RF according to wireless mode */
1284 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1285 /* BB & RF Config */
1286 RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG, ("====>2.4G\n"));
1287 if (rtlhal->interfaceindex == 1)
1288 _rtl92d_phy_config_bb_with_headerfile(hw,
1289 BASEBAND_CONFIG_AGC_TAB);
1290 } else {
1291 /* 5G band */
1292 RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG, ("====>5G\n"));
1293 if (rtlhal->interfaceindex == 1)
1294 _rtl92d_phy_config_bb_with_headerfile(hw,
1295 BASEBAND_CONFIG_AGC_TAB);
1297 rtl92d_update_bbrf_configuration(hw);
1298 if (rtlhal->current_bandtype == BAND_ON_2_4G)
1299 rtl_set_bbreg(hw, RFPGA0_RFMOD, BCCKEN, 0x1);
1300 rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 0x1);
1302 /* 20M BW. */
1303 /* rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 1); */
1304 rtlhal->reloadtxpowerindex = true;
1305 /* notice fw know band status 0x81[1]/0x53[1] = 0: 5G, 1: 2G */
1306 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1307 value8 = rtl_read_byte(rtlpriv, (rtlhal->interfaceindex ==
1308 0 ? REG_MAC0 : REG_MAC1));
1309 value8 |= BIT(1);
1310 rtl_write_byte(rtlpriv, (rtlhal->interfaceindex ==
1311 0 ? REG_MAC0 : REG_MAC1), value8);
1312 } else {
1313 value8 = rtl_read_byte(rtlpriv, (rtlhal->interfaceindex ==
1314 0 ? REG_MAC0 : REG_MAC1));
1315 value8 &= (~BIT(1));
1316 rtl_write_byte(rtlpriv, (rtlhal->interfaceindex ==
1317 0 ? REG_MAC0 : REG_MAC1), value8);
1319 mdelay(1);
1320 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("<==Switch Band OK.\n"));
1323 static void _rtl92d_phy_reload_imr_setting(struct ieee80211_hw *hw,
1324 u8 channel, u8 rfpath)
1326 struct rtl_priv *rtlpriv = rtl_priv(hw);
1327 u32 imr_num = MAX_RF_IMR_INDEX;
1328 u32 rfmask = BRFREGOFFSETMASK;
1329 u8 group, i;
1330 unsigned long flag = 0;
1332 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("====>path %d\n", rfpath));
1333 if (rtlpriv->rtlhal.current_bandtype == BAND_ON_5G) {
1334 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("====>5G\n"));
1335 rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(25) | BIT(24), 0);
1336 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0x00f00000, 0xf);
1337 /* fc area 0xd2c */
1338 if (channel > 99)
1339 rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(13) |
1340 BIT(14), 2);
1341 else
1342 rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(13) |
1343 BIT(14), 1);
1344 /* leave 0 for channel1-14. */
1345 group = channel <= 64 ? 1 : 2;
1346 imr_num = MAX_RF_IMR_INDEX_NORMAL;
1347 for (i = 0; i < imr_num; i++)
1348 rtl_set_rfreg(hw, (enum radio_path)rfpath,
1349 rf_reg_for_5g_swchnl_normal[i], rfmask,
1350 rf_imr_param_normal[0][group][i]);
1351 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0x00f00000, 0);
1352 rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 1);
1353 } else {
1354 /* G band. */
1355 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
1356 ("Load RF IMR parameters for G band. IMR already "
1357 "setting %d\n",
1358 rtlpriv->rtlhal.load_imrandiqk_setting_for2g));
1359 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("====>2.4G\n"));
1360 if (!rtlpriv->rtlhal.load_imrandiqk_setting_for2g) {
1361 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
1362 ("Load RF IMR parameters "
1363 "for G band. %d\n", rfpath));
1364 rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag);
1365 rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(25) | BIT(24), 0);
1366 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4,
1367 0x00f00000, 0xf);
1368 imr_num = MAX_RF_IMR_INDEX_NORMAL;
1369 for (i = 0; i < imr_num; i++) {
1370 rtl_set_rfreg(hw, (enum radio_path)rfpath,
1371 rf_reg_for_5g_swchnl_normal[i],
1372 BRFREGOFFSETMASK,
1373 rf_imr_param_normal[0][0][i]);
1375 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4,
1376 0x00f00000, 0);
1377 rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN | BCCKEN, 3);
1378 rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
1381 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("<====\n"));
1384 static void _rtl92d_phy_enable_rf_env(struct ieee80211_hw *hw,
1385 u8 rfpath, u32 *pu4_regval)
1387 struct rtl_priv *rtlpriv = rtl_priv(hw);
1388 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1389 struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
1391 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, ("====>\n"));
1392 /*----Store original RFENV control type----*/
1393 switch (rfpath) {
1394 case RF90_PATH_A:
1395 case RF90_PATH_C:
1396 *pu4_regval = rtl_get_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV);
1397 break;
1398 case RF90_PATH_B:
1399 case RF90_PATH_D:
1400 *pu4_regval =
1401 rtl_get_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV << 16);
1402 break;
1404 /*----Set RF_ENV enable----*/
1405 rtl_set_bbreg(hw, pphyreg->rfintfe, BRFSI_RFENV << 16, 0x1);
1406 udelay(1);
1407 /*----Set RF_ENV output high----*/
1408 rtl_set_bbreg(hw, pphyreg->rfintfo, BRFSI_RFENV, 0x1);
1409 udelay(1);
1410 /* Set bit number of Address and Data for RF register */
1411 /* Set 1 to 4 bits for 8255 */
1412 rtl_set_bbreg(hw, pphyreg->rfhssi_para2, B3WIREADDRESSLENGTH, 0x0);
1413 udelay(1);
1414 /*Set 0 to 12 bits for 8255 */
1415 rtl_set_bbreg(hw, pphyreg->rfhssi_para2, B3WIREDATALENGTH, 0x0);
1416 udelay(1);
1417 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, ("<====\n"));
1420 static void _rtl92d_phy_restore_rf_env(struct ieee80211_hw *hw, u8 rfpath,
1421 u32 *pu4_regval)
1423 struct rtl_priv *rtlpriv = rtl_priv(hw);
1424 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1425 struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
1427 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, ("=====>\n"));
1428 /*----Restore RFENV control type----*/ ;
1429 switch (rfpath) {
1430 case RF90_PATH_A:
1431 case RF90_PATH_C:
1432 rtl_set_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV, *pu4_regval);
1433 break;
1434 case RF90_PATH_B:
1435 case RF90_PATH_D:
1436 rtl_set_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV << 16,
1437 *pu4_regval);
1438 break;
1440 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, ("<=====\n"));
1443 static void _rtl92d_phy_switch_rf_setting(struct ieee80211_hw *hw, u8 channel)
1445 struct rtl_priv *rtlpriv = rtl_priv(hw);
1446 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1447 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
1448 u8 path = rtlhal->current_bandtype ==
1449 BAND_ON_5G ? RF90_PATH_A : RF90_PATH_B;
1450 u8 index = 0, i = 0, rfpath = RF90_PATH_A;
1451 bool need_pwr_down = false, internal_pa = false;
1452 u32 u4regvalue, mask = 0x1C000, value = 0, u4tmp, u4tmp2;
1454 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("====>\n"));
1455 /* config path A for 5G */
1456 if (rtlhal->current_bandtype == BAND_ON_5G) {
1457 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("====>5G\n"));
1458 u4tmp = curveindex_5g[channel - 1];
1459 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("ver 1 set RF-A, 5G, "
1460 "0x28 = 0x%x !!\n", u4tmp));
1461 for (i = 0; i < RF_CHNL_NUM_5G; i++) {
1462 if (channel == rf_chnl_5g[i] && channel <= 140)
1463 index = 0;
1465 for (i = 0; i < RF_CHNL_NUM_5G_40M; i++) {
1466 if (channel == rf_chnl_5g_40m[i] && channel <= 140)
1467 index = 1;
1469 if (channel == 149 || channel == 155 || channel == 161)
1470 index = 2;
1471 else if (channel == 151 || channel == 153 || channel == 163
1472 || channel == 165)
1473 index = 3;
1474 else if (channel == 157 || channel == 159)
1475 index = 4;
1477 if (rtlhal->macphymode == DUALMAC_DUALPHY
1478 && rtlhal->interfaceindex == 1) {
1479 need_pwr_down = rtl92d_phy_enable_anotherphy(hw, false);
1480 rtlhal->during_mac1init_radioa = true;
1481 /* asume no this case */
1482 if (need_pwr_down)
1483 _rtl92d_phy_enable_rf_env(hw, path,
1484 &u4regvalue);
1486 for (i = 0; i < RF_REG_NUM_FOR_C_CUT_5G; i++) {
1487 if (i == 0 && (rtlhal->macphymode == DUALMAC_DUALPHY)) {
1488 rtl_set_rfreg(hw, (enum radio_path)path,
1489 rf_reg_for_c_cut_5g[i],
1490 BRFREGOFFSETMASK, 0xE439D);
1491 } else if (rf_reg_for_c_cut_5g[i] == RF_SYN_G4) {
1492 u4tmp2 = (rf_reg_pram_c_5g[index][i] &
1493 0x7FF) | (u4tmp << 11);
1494 if (channel == 36)
1495 u4tmp2 &= ~(BIT(7) | BIT(6));
1496 rtl_set_rfreg(hw, (enum radio_path)path,
1497 rf_reg_for_c_cut_5g[i],
1498 BRFREGOFFSETMASK, u4tmp2);
1499 } else {
1500 rtl_set_rfreg(hw, (enum radio_path)path,
1501 rf_reg_for_c_cut_5g[i],
1502 BRFREGOFFSETMASK,
1503 rf_reg_pram_c_5g[index][i]);
1505 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
1506 ("offset 0x%x value 0x%x "
1507 "path %d index %d readback 0x%x\n",
1508 rf_reg_for_c_cut_5g[i],
1509 rf_reg_pram_c_5g[index][i], path,
1510 index, rtl_get_rfreg(hw, (enum radio_path)path,
1511 rf_reg_for_c_cut_5g[i], BRFREGOFFSETMASK)));
1513 if (need_pwr_down)
1514 _rtl92d_phy_restore_rf_env(hw, path, &u4regvalue);
1515 if (rtlhal->during_mac1init_radioa)
1516 rtl92d_phy_powerdown_anotherphy(hw, false);
1517 if (channel < 149)
1518 value = 0x07;
1519 else if (channel >= 149)
1520 value = 0x02;
1521 if (channel >= 36 && channel <= 64)
1522 index = 0;
1523 else if (channel >= 100 && channel <= 140)
1524 index = 1;
1525 else
1526 index = 2;
1527 for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
1528 rfpath++) {
1529 if (rtlhal->macphymode == DUALMAC_DUALPHY &&
1530 rtlhal->interfaceindex == 1) /* MAC 1 5G */
1531 internal_pa = rtlpriv->efuse.internal_pa_5g[1];
1532 else
1533 internal_pa =
1534 rtlpriv->efuse.internal_pa_5g[rfpath];
1535 if (internal_pa) {
1536 for (i = 0;
1537 i < RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA;
1538 i++) {
1539 rtl_set_rfreg(hw, rfpath,
1540 rf_for_c_cut_5g_internal_pa[i],
1541 BRFREGOFFSETMASK,
1542 rf_pram_c_5g_int_pa[index][i]);
1543 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
1544 ("offset 0x%x value 0x%x "
1545 "path %d index %d\n",
1546 rf_for_c_cut_5g_internal_pa[i],
1547 rf_pram_c_5g_int_pa[index][i],
1548 rfpath, index));
1550 } else {
1551 rtl_set_rfreg(hw, (enum radio_path)rfpath, 0x0B,
1552 mask, value);
1555 } else if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1556 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("====>2.4G\n"));
1557 u4tmp = curveindex_2g[channel - 1];
1558 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("ver 3 set RF-B, 2G, "
1559 "0x28 = 0x%x !!\n", u4tmp));
1560 if (channel == 1 || channel == 2 || channel == 4 || channel == 9
1561 || channel == 10 || channel == 11 || channel == 12)
1562 index = 0;
1563 else if (channel == 3 || channel == 13 || channel == 14)
1564 index = 1;
1565 else if (channel >= 5 && channel <= 8)
1566 index = 2;
1567 if (rtlhal->macphymode == DUALMAC_DUALPHY) {
1568 path = RF90_PATH_A;
1569 if (rtlhal->interfaceindex == 0) {
1570 need_pwr_down =
1571 rtl92d_phy_enable_anotherphy(hw, true);
1572 rtlhal->during_mac0init_radiob = true;
1574 if (need_pwr_down)
1575 _rtl92d_phy_enable_rf_env(hw, path,
1576 &u4regvalue);
1579 for (i = 0; i < RF_REG_NUM_FOR_C_CUT_2G; i++) {
1580 if (rf_reg_for_c_cut_2g[i] == RF_SYN_G7)
1581 rtl_set_rfreg(hw, (enum radio_path)path,
1582 rf_reg_for_c_cut_2g[i],
1583 BRFREGOFFSETMASK,
1584 (rf_reg_param_for_c_cut_2g[index][i] |
1585 BIT(17)));
1586 else
1587 rtl_set_rfreg(hw, (enum radio_path)path,
1588 rf_reg_for_c_cut_2g[i],
1589 BRFREGOFFSETMASK,
1590 rf_reg_param_for_c_cut_2g
1591 [index][i]);
1592 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
1593 ("offset 0x%x value 0x%x mak 0x%x path %d "
1594 "index %d readback 0x%x\n",
1595 rf_reg_for_c_cut_2g[i],
1596 rf_reg_param_for_c_cut_2g[index][i],
1597 rf_reg_mask_for_c_cut_2g[i], path, index,
1598 rtl_get_rfreg(hw, (enum radio_path)path,
1599 rf_reg_for_c_cut_2g[i],
1600 BRFREGOFFSETMASK)));
1602 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1603 ("cosa ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n",
1604 rf_syn_g4_for_c_cut_2g | (u4tmp << 11)));
1606 rtl_set_rfreg(hw, (enum radio_path)path, RF_SYN_G4,
1607 BRFREGOFFSETMASK,
1608 rf_syn_g4_for_c_cut_2g | (u4tmp << 11));
1609 if (need_pwr_down)
1610 _rtl92d_phy_restore_rf_env(hw, path, &u4regvalue);
1611 if (rtlhal->during_mac0init_radiob)
1612 rtl92d_phy_powerdown_anotherphy(hw, true);
1614 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("<====\n"));
1617 u8 rtl92d_get_rightchnlplace_for_iqk(u8 chnl)
1619 u8 channel_all[59] = {
1620 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
1621 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
1622 60, 62, 64, 100, 102, 104, 106, 108, 110, 112,
1623 114, 116, 118, 120, 122, 124, 126, 128, 130,
1624 132, 134, 136, 138, 140, 149, 151, 153, 155,
1625 157, 159, 161, 163, 165
1627 u8 place = chnl;
1629 if (chnl > 14) {
1630 for (place = 14; place < sizeof(channel_all); place++) {
1631 if (channel_all[place] == chnl)
1632 return place - 13;
1636 return 0;
1639 #define MAX_TOLERANCE 5
1640 #define IQK_DELAY_TIME 1 /* ms */
1641 #define MAX_TOLERANCE_92D 3
1643 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
1644 static u8 _rtl92d_phy_patha_iqk(struct ieee80211_hw *hw, bool configpathb)
1646 struct rtl_priv *rtlpriv = rtl_priv(hw);
1647 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1648 u32 regeac, rege94, rege9c, regea4;
1649 u8 result = 0;
1651 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path A IQK!\n"));
1652 /* path-A IQK setting */
1653 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path-A IQK setting!\n"));
1654 if (rtlhal->interfaceindex == 0) {
1655 rtl_set_bbreg(hw, 0xe30, BMASKDWORD, 0x10008c1f);
1656 rtl_set_bbreg(hw, 0xe34, BMASKDWORD, 0x10008c1f);
1657 } else {
1658 rtl_set_bbreg(hw, 0xe30, BMASKDWORD, 0x10008c22);
1659 rtl_set_bbreg(hw, 0xe34, BMASKDWORD, 0x10008c22);
1661 rtl_set_bbreg(hw, 0xe38, BMASKDWORD, 0x82140102);
1662 rtl_set_bbreg(hw, 0xe3c, BMASKDWORD, 0x28160206);
1663 /* path-B IQK setting */
1664 if (configpathb) {
1665 rtl_set_bbreg(hw, 0xe50, BMASKDWORD, 0x10008c22);
1666 rtl_set_bbreg(hw, 0xe54, BMASKDWORD, 0x10008c22);
1667 rtl_set_bbreg(hw, 0xe58, BMASKDWORD, 0x82140102);
1668 rtl_set_bbreg(hw, 0xe5c, BMASKDWORD, 0x28160206);
1670 /* LO calibration setting */
1671 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("LO calibration setting!\n"));
1672 rtl_set_bbreg(hw, 0xe4c, BMASKDWORD, 0x00462911);
1673 /* One shot, path A LOK & IQK */
1674 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("One shot, path A LOK & IQK!\n"));
1675 rtl_set_bbreg(hw, 0xe48, BMASKDWORD, 0xf9000000);
1676 rtl_set_bbreg(hw, 0xe48, BMASKDWORD, 0xf8000000);
1677 /* delay x ms */
1678 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1679 ("Delay %d ms for One shot, path A LOK & IQK.\n",
1680 IQK_DELAY_TIME));
1681 mdelay(IQK_DELAY_TIME);
1682 /* Check failed */
1683 regeac = rtl_get_bbreg(hw, 0xeac, BMASKDWORD);
1684 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xeac = 0x%x\n", regeac));
1685 rege94 = rtl_get_bbreg(hw, 0xe94, BMASKDWORD);
1686 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xe94 = 0x%x\n", rege94));
1687 rege9c = rtl_get_bbreg(hw, 0xe9c, BMASKDWORD);
1688 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xe9c = 0x%x\n", rege9c));
1689 regea4 = rtl_get_bbreg(hw, 0xea4, BMASKDWORD);
1690 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xea4 = 0x%x\n", regea4));
1691 if (!(regeac & BIT(28)) && (((rege94 & 0x03FF0000) >> 16) != 0x142) &&
1692 (((rege9c & 0x03FF0000) >> 16) != 0x42))
1693 result |= 0x01;
1694 else /* if Tx not OK, ignore Rx */
1695 return result;
1696 /* if Tx is OK, check whether Rx is OK */
1697 if (!(regeac & BIT(27)) && (((regea4 & 0x03FF0000) >> 16) != 0x132) &&
1698 (((regeac & 0x03FF0000) >> 16) != 0x36))
1699 result |= 0x02;
1700 else
1701 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path A Rx IQK fail!!\n"));
1702 return result;
1705 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
1706 static u8 _rtl92d_phy_patha_iqk_5g_normal(struct ieee80211_hw *hw,
1707 bool configpathb)
1709 struct rtl_priv *rtlpriv = rtl_priv(hw);
1710 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1711 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1712 u32 regeac, rege94, rege9c, regea4;
1713 u8 result = 0;
1714 u8 i;
1715 u8 retrycount = 2;
1716 u32 TxOKBit = BIT(28), RxOKBit = BIT(27);
1718 if (rtlhal->interfaceindex == 1) { /* PHY1 */
1719 TxOKBit = BIT(31);
1720 RxOKBit = BIT(30);
1722 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path A IQK!\n"));
1723 /* path-A IQK setting */
1724 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path-A IQK setting!\n"));
1725 rtl_set_bbreg(hw, 0xe30, BMASKDWORD, 0x18008c1f);
1726 rtl_set_bbreg(hw, 0xe34, BMASKDWORD, 0x18008c1f);
1727 rtl_set_bbreg(hw, 0xe38, BMASKDWORD, 0x82140307);
1728 rtl_set_bbreg(hw, 0xe3c, BMASKDWORD, 0x68160960);
1729 /* path-B IQK setting */
1730 if (configpathb) {
1731 rtl_set_bbreg(hw, 0xe50, BMASKDWORD, 0x18008c2f);
1732 rtl_set_bbreg(hw, 0xe54, BMASKDWORD, 0x18008c2f);
1733 rtl_set_bbreg(hw, 0xe58, BMASKDWORD, 0x82110000);
1734 rtl_set_bbreg(hw, 0xe5c, BMASKDWORD, 0x68110000);
1736 /* LO calibration setting */
1737 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("LO calibration setting!\n"));
1738 rtl_set_bbreg(hw, 0xe4c, BMASKDWORD, 0x00462911);
1739 /* path-A PA on */
1740 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BMASKDWORD, 0x07000f60);
1741 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BMASKDWORD, 0x66e60e30);
1742 for (i = 0; i < retrycount; i++) {
1743 /* One shot, path A LOK & IQK */
1744 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1745 ("One shot, path A LOK & IQK!\n"));
1746 rtl_set_bbreg(hw, 0xe48, BMASKDWORD, 0xf9000000);
1747 rtl_set_bbreg(hw, 0xe48, BMASKDWORD, 0xf8000000);
1748 /* delay x ms */
1749 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1750 ("Delay %d ms for One shot, path A LOK & IQK.\n",
1751 IQK_DELAY_TIME));
1752 mdelay(IQK_DELAY_TIME * 10);
1753 /* Check failed */
1754 regeac = rtl_get_bbreg(hw, 0xeac, BMASKDWORD);
1755 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xeac = 0x%x\n", regeac));
1756 rege94 = rtl_get_bbreg(hw, 0xe94, BMASKDWORD);
1757 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xe94 = 0x%x\n", rege94));
1758 rege9c = rtl_get_bbreg(hw, 0xe9c, BMASKDWORD);
1759 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xe9c = 0x%x\n", rege9c));
1760 regea4 = rtl_get_bbreg(hw, 0xea4, BMASKDWORD);
1761 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xea4 = 0x%x\n", regea4));
1762 if (!(regeac & TxOKBit) &&
1763 (((rege94 & 0x03FF0000) >> 16) != 0x142)) {
1764 result |= 0x01;
1765 } else { /* if Tx not OK, ignore Rx */
1766 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1767 ("Path A Tx IQK fail!!\n"));
1768 continue;
1771 /* if Tx is OK, check whether Rx is OK */
1772 if (!(regeac & RxOKBit) &&
1773 (((regea4 & 0x03FF0000) >> 16) != 0x132)) {
1774 result |= 0x02;
1775 break;
1776 } else {
1777 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1778 ("Path A Rx IQK fail!!\n"));
1781 /* path A PA off */
1782 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BMASKDWORD,
1783 rtlphy->iqk_bb_backup[0]);
1784 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BMASKDWORD,
1785 rtlphy->iqk_bb_backup[1]);
1786 return result;
1789 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
1790 static u8 _rtl92d_phy_pathb_iqk(struct ieee80211_hw *hw)
1792 struct rtl_priv *rtlpriv = rtl_priv(hw);
1793 u32 regeac, regeb4, regebc, regec4, regecc;
1794 u8 result = 0;
1796 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path B IQK!\n"));
1797 /* One shot, path B LOK & IQK */
1798 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("One shot, path A LOK & IQK!\n"));
1799 rtl_set_bbreg(hw, 0xe60, BMASKDWORD, 0x00000002);
1800 rtl_set_bbreg(hw, 0xe60, BMASKDWORD, 0x00000000);
1801 /* delay x ms */
1802 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1803 ("Delay %d ms for One shot, path B LOK & IQK.\n",
1804 IQK_DELAY_TIME));
1805 mdelay(IQK_DELAY_TIME);
1806 /* Check failed */
1807 regeac = rtl_get_bbreg(hw, 0xeac, BMASKDWORD);
1808 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xeac = 0x%x\n", regeac));
1809 regeb4 = rtl_get_bbreg(hw, 0xeb4, BMASKDWORD);
1810 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xeb4 = 0x%x\n", regeb4));
1811 regebc = rtl_get_bbreg(hw, 0xebc, BMASKDWORD);
1812 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xebc = 0x%x\n", regebc));
1813 regec4 = rtl_get_bbreg(hw, 0xec4, BMASKDWORD);
1814 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xec4 = 0x%x\n", regec4));
1815 regecc = rtl_get_bbreg(hw, 0xecc, BMASKDWORD);
1816 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xecc = 0x%x\n", regecc));
1817 if (!(regeac & BIT(31)) && (((regeb4 & 0x03FF0000) >> 16) != 0x142) &&
1818 (((regebc & 0x03FF0000) >> 16) != 0x42))
1819 result |= 0x01;
1820 else
1821 return result;
1822 if (!(regeac & BIT(30)) && (((regec4 & 0x03FF0000) >> 16) != 0x132) &&
1823 (((regecc & 0x03FF0000) >> 16) != 0x36))
1824 result |= 0x02;
1825 else
1826 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path B Rx IQK fail!!\n"));
1827 return result;
1830 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
1831 static u8 _rtl92d_phy_pathb_iqk_5g_normal(struct ieee80211_hw *hw)
1833 struct rtl_priv *rtlpriv = rtl_priv(hw);
1834 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1835 u32 regeac, regeb4, regebc, regec4, regecc;
1836 u8 result = 0;
1837 u8 i;
1838 u8 retrycount = 2;
1840 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path B IQK!\n"));
1841 /* path-A IQK setting */
1842 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path-A IQK setting!\n"));
1843 rtl_set_bbreg(hw, 0xe30, BMASKDWORD, 0x18008c1f);
1844 rtl_set_bbreg(hw, 0xe34, BMASKDWORD, 0x18008c1f);
1845 rtl_set_bbreg(hw, 0xe38, BMASKDWORD, 0x82110000);
1846 rtl_set_bbreg(hw, 0xe3c, BMASKDWORD, 0x68110000);
1848 /* path-B IQK setting */
1849 rtl_set_bbreg(hw, 0xe50, BMASKDWORD, 0x18008c2f);
1850 rtl_set_bbreg(hw, 0xe54, BMASKDWORD, 0x18008c2f);
1851 rtl_set_bbreg(hw, 0xe58, BMASKDWORD, 0x82140307);
1852 rtl_set_bbreg(hw, 0xe5c, BMASKDWORD, 0x68160960);
1854 /* LO calibration setting */
1855 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("LO calibration setting!\n"));
1856 rtl_set_bbreg(hw, 0xe4c, BMASKDWORD, 0x00462911);
1858 /* path-B PA on */
1859 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BMASKDWORD, 0x0f600700);
1860 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, BMASKDWORD, 0x061f0d30);
1862 for (i = 0; i < retrycount; i++) {
1863 /* One shot, path B LOK & IQK */
1864 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1865 ("One shot, path A LOK & IQK!\n"));
1866 rtl_set_bbreg(hw, 0xe48, BMASKDWORD, 0xfa000000);
1867 rtl_set_bbreg(hw, 0xe48, BMASKDWORD, 0xf8000000);
1869 /* delay x ms */
1870 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1871 ("Delay %d ms for One shot, path B LOK & IQK.\n", 10));
1872 mdelay(IQK_DELAY_TIME * 10);
1874 /* Check failed */
1875 regeac = rtl_get_bbreg(hw, 0xeac, BMASKDWORD);
1876 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xeac = 0x%x\n", regeac));
1877 regeb4 = rtl_get_bbreg(hw, 0xeb4, BMASKDWORD);
1878 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xeb4 = 0x%x\n", regeb4));
1879 regebc = rtl_get_bbreg(hw, 0xebc, BMASKDWORD);
1880 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xebc = 0x%x\n", regebc));
1881 regec4 = rtl_get_bbreg(hw, 0xec4, BMASKDWORD);
1882 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xec4 = 0x%x\n", regec4));
1883 regecc = rtl_get_bbreg(hw, 0xecc, BMASKDWORD);
1884 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xecc = 0x%x\n", regecc));
1885 if (!(regeac & BIT(31)) &&
1886 (((regeb4 & 0x03FF0000) >> 16) != 0x142))
1887 result |= 0x01;
1888 else
1889 continue;
1890 if (!(regeac & BIT(30)) &&
1891 (((regec4 & 0x03FF0000) >> 16) != 0x132)) {
1892 result |= 0x02;
1893 break;
1894 } else {
1895 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1896 ("Path B Rx IQK fail!!\n"));
1900 /* path B PA off */
1901 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BMASKDWORD,
1902 rtlphy->iqk_bb_backup[0]);
1903 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, BMASKDWORD,
1904 rtlphy->iqk_bb_backup[2]);
1905 return result;
1908 static void _rtl92d_phy_save_adda_registers(struct ieee80211_hw *hw,
1909 u32 *adda_reg, u32 *adda_backup,
1910 u32 regnum)
1912 struct rtl_priv *rtlpriv = rtl_priv(hw);
1913 u32 i;
1915 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Save ADDA parameters.\n"));
1916 for (i = 0; i < regnum; i++)
1917 adda_backup[i] = rtl_get_bbreg(hw, adda_reg[i], BMASKDWORD);
1920 static void _rtl92d_phy_save_mac_registers(struct ieee80211_hw *hw,
1921 u32 *macreg, u32 *macbackup)
1923 struct rtl_priv *rtlpriv = rtl_priv(hw);
1924 u32 i;
1926 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Save MAC parameters.\n"));
1927 for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
1928 macbackup[i] = rtl_read_byte(rtlpriv, macreg[i]);
1929 macbackup[i] = rtl_read_dword(rtlpriv, macreg[i]);
1932 static void _rtl92d_phy_reload_adda_registers(struct ieee80211_hw *hw,
1933 u32 *adda_reg, u32 *adda_backup,
1934 u32 regnum)
1936 struct rtl_priv *rtlpriv = rtl_priv(hw);
1937 u32 i;
1939 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1940 ("Reload ADDA power saving parameters !\n"));
1941 for (i = 0; i < regnum; i++)
1942 rtl_set_bbreg(hw, adda_reg[i], BMASKDWORD, adda_backup[i]);
1945 static void _rtl92d_phy_reload_mac_registers(struct ieee80211_hw *hw,
1946 u32 *macreg, u32 *macbackup)
1948 struct rtl_priv *rtlpriv = rtl_priv(hw);
1949 u32 i;
1951 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Reload MAC parameters !\n"));
1952 for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
1953 rtl_write_byte(rtlpriv, macreg[i], (u8) macbackup[i]);
1954 rtl_write_byte(rtlpriv, macreg[i], macbackup[i]);
1957 static void _rtl92d_phy_path_adda_on(struct ieee80211_hw *hw,
1958 u32 *adda_reg, bool patha_on, bool is2t)
1960 struct rtl_priv *rtlpriv = rtl_priv(hw);
1961 u32 pathon;
1962 u32 i;
1964 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("ADDA ON.\n"));
1965 pathon = patha_on ? 0x04db25a4 : 0x0b1b25a4;
1966 if (patha_on)
1967 pathon = rtlpriv->rtlhal.interfaceindex == 0 ?
1968 0x04db25a4 : 0x0b1b25a4;
1969 for (i = 0; i < IQK_ADDA_REG_NUM; i++)
1970 rtl_set_bbreg(hw, adda_reg[i], BMASKDWORD, pathon);
1973 static void _rtl92d_phy_mac_setting_calibration(struct ieee80211_hw *hw,
1974 u32 *macreg, u32 *macbackup)
1976 struct rtl_priv *rtlpriv = rtl_priv(hw);
1977 u32 i;
1979 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("MAC settings for Calibration.\n"));
1980 rtl_write_byte(rtlpriv, macreg[0], 0x3F);
1982 for (i = 1; i < (IQK_MAC_REG_NUM - 1); i++)
1983 rtl_write_byte(rtlpriv, macreg[i], (u8)(macbackup[i] &
1984 (~BIT(3))));
1985 rtl_write_byte(rtlpriv, macreg[i], (u8) (macbackup[i] & (~BIT(5))));
1988 static void _rtl92d_phy_patha_standby(struct ieee80211_hw *hw)
1990 struct rtl_priv *rtlpriv = rtl_priv(hw);
1991 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path-A standby mode!\n"));
1993 rtl_set_bbreg(hw, 0xe28, BMASKDWORD, 0x0);
1994 rtl_set_bbreg(hw, RFPGA0_XA_LSSIPARAMETER, BMASKDWORD, 0x00010000);
1995 rtl_set_bbreg(hw, 0xe28, BMASKDWORD, 0x80800000);
1998 static void _rtl92d_phy_pimode_switch(struct ieee80211_hw *hw, bool pi_mode)
2000 struct rtl_priv *rtlpriv = rtl_priv(hw);
2001 u32 mode;
2003 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2004 ("BB Switch to %s mode!\n", (pi_mode ? "PI" : "SI")));
2005 mode = pi_mode ? 0x01000100 : 0x01000000;
2006 rtl_set_bbreg(hw, 0x820, BMASKDWORD, mode);
2007 rtl_set_bbreg(hw, 0x828, BMASKDWORD, mode);
2010 static void _rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw, long result[][8],
2011 u8 t, bool is2t)
2013 struct rtl_priv *rtlpriv = rtl_priv(hw);
2014 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2015 u32 i;
2016 u8 patha_ok, pathb_ok;
2017 static u32 adda_reg[IQK_ADDA_REG_NUM] = {
2018 RFPGA0_XCD_SWITCHCONTROL, 0xe6c, 0xe70, 0xe74,
2019 0xe78, 0xe7c, 0xe80, 0xe84,
2020 0xe88, 0xe8c, 0xed0, 0xed4,
2021 0xed8, 0xedc, 0xee0, 0xeec
2023 static u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
2024 0x522, 0x550, 0x551, 0x040
2026 static u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
2027 RFPGA0_XAB_RFINTERFACESW, RFPGA0_XA_RFINTERFACEOE,
2028 RFPGA0_XB_RFINTERFACEOE, ROFDM0_TRMUXPAR,
2029 RFPGA0_XCD_RFINTERFACESW, ROFDM0_TRXPATHENABLE,
2030 RFPGA0_RFMOD, RFPGA0_ANALOGPARAMETER4,
2031 ROFDM0_XAAGCCORE1, ROFDM0_XBAGCCORE1
2033 const u32 retrycount = 2;
2034 u32 bbvalue;
2036 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("IQK for 2.4G :Start!!!\n"));
2037 if (t == 0) {
2038 bbvalue = rtl_get_bbreg(hw, RFPGA0_RFMOD, BMASKDWORD);
2039 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("==>0x%08x\n", bbvalue));
2040 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("IQ Calibration for %s\n",
2041 (is2t ? "2T2R" : "1T1R")));
2043 /* Save ADDA parameters, turn Path A ADDA on */
2044 _rtl92d_phy_save_adda_registers(hw, adda_reg,
2045 rtlphy->adda_backup, IQK_ADDA_REG_NUM);
2046 _rtl92d_phy_save_mac_registers(hw, iqk_mac_reg,
2047 rtlphy->iqk_mac_backup);
2048 _rtl92d_phy_save_adda_registers(hw, iqk_bb_reg,
2049 rtlphy->iqk_bb_backup, IQK_BB_REG_NUM);
2051 _rtl92d_phy_path_adda_on(hw, adda_reg, true, is2t);
2052 if (t == 0)
2053 rtlphy->rfpi_enable = (u8) rtl_get_bbreg(hw,
2054 RFPGA0_XA_HSSIPARAMETER1, BIT(8));
2056 /* Switch BB to PI mode to do IQ Calibration. */
2057 if (!rtlphy->rfpi_enable)
2058 _rtl92d_phy_pimode_switch(hw, true);
2060 rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(24), 0x00);
2061 rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, BMASKDWORD, 0x03a05600);
2062 rtl_set_bbreg(hw, ROFDM0_TRMUXPAR, BMASKDWORD, 0x000800e4);
2063 rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, BMASKDWORD, 0x22204000);
2064 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xf00000, 0x0f);
2065 if (is2t) {
2066 rtl_set_bbreg(hw, RFPGA0_XA_LSSIPARAMETER, BMASKDWORD,
2067 0x00010000);
2068 rtl_set_bbreg(hw, RFPGA0_XB_LSSIPARAMETER, BMASKDWORD,
2069 0x00010000);
2071 /* MAC settings */
2072 _rtl92d_phy_mac_setting_calibration(hw, iqk_mac_reg,
2073 rtlphy->iqk_mac_backup);
2074 /* Page B init */
2075 rtl_set_bbreg(hw, 0xb68, BMASKDWORD, 0x0f600000);
2076 if (is2t)
2077 rtl_set_bbreg(hw, 0xb6c, BMASKDWORD, 0x0f600000);
2078 /* IQ calibration setting */
2079 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("IQK setting!\n"));
2080 rtl_set_bbreg(hw, 0xe28, BMASKDWORD, 0x80800000);
2081 rtl_set_bbreg(hw, 0xe40, BMASKDWORD, 0x01007c00);
2082 rtl_set_bbreg(hw, 0xe44, BMASKDWORD, 0x01004800);
2083 for (i = 0; i < retrycount; i++) {
2084 patha_ok = _rtl92d_phy_patha_iqk(hw, is2t);
2085 if (patha_ok == 0x03) {
2086 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2087 ("Path A IQK Success!!\n"));
2088 result[t][0] = (rtl_get_bbreg(hw, 0xe94, BMASKDWORD) &
2089 0x3FF0000) >> 16;
2090 result[t][1] = (rtl_get_bbreg(hw, 0xe9c, BMASKDWORD) &
2091 0x3FF0000) >> 16;
2092 result[t][2] = (rtl_get_bbreg(hw, 0xea4, BMASKDWORD) &
2093 0x3FF0000) >> 16;
2094 result[t][3] = (rtl_get_bbreg(hw, 0xeac, BMASKDWORD) &
2095 0x3FF0000) >> 16;
2096 break;
2097 } else if (i == (retrycount - 1) && patha_ok == 0x01) {
2098 /* Tx IQK OK */
2099 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2100 ("Path A IQK Only Tx Success!!\n"));
2102 result[t][0] = (rtl_get_bbreg(hw, 0xe94, BMASKDWORD) &
2103 0x3FF0000) >> 16;
2104 result[t][1] = (rtl_get_bbreg(hw, 0xe9c, BMASKDWORD) &
2105 0x3FF0000) >> 16;
2108 if (0x00 == patha_ok)
2109 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path A IQK failed!!\n"));
2110 if (is2t) {
2111 _rtl92d_phy_patha_standby(hw);
2112 /* Turn Path B ADDA on */
2113 _rtl92d_phy_path_adda_on(hw, adda_reg, false, is2t);
2114 for (i = 0; i < retrycount; i++) {
2115 pathb_ok = _rtl92d_phy_pathb_iqk(hw);
2116 if (pathb_ok == 0x03) {
2117 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2118 ("Path B IQK Success!!\n"));
2119 result[t][4] = (rtl_get_bbreg(hw, 0xeb4,
2120 BMASKDWORD) & 0x3FF0000) >> 16;
2121 result[t][5] = (rtl_get_bbreg(hw, 0xebc,
2122 BMASKDWORD) & 0x3FF0000) >> 16;
2123 result[t][6] = (rtl_get_bbreg(hw, 0xec4,
2124 BMASKDWORD) & 0x3FF0000) >> 16;
2125 result[t][7] = (rtl_get_bbreg(hw, 0xecc,
2126 BMASKDWORD) & 0x3FF0000) >> 16;
2127 break;
2128 } else if (i == (retrycount - 1) && pathb_ok == 0x01) {
2129 /* Tx IQK OK */
2130 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2131 ("Path B Only Tx IQK Success!!\n"));
2132 result[t][4] = (rtl_get_bbreg(hw, 0xeb4,
2133 BMASKDWORD) & 0x3FF0000) >> 16;
2134 result[t][5] = (rtl_get_bbreg(hw, 0xebc,
2135 BMASKDWORD) & 0x3FF0000) >> 16;
2138 if (0x00 == pathb_ok)
2139 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2140 ("Path B IQK failed!!\n"));
2143 /* Back to BB mode, load original value */
2144 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2145 ("IQK:Back to BB mode, load original value!\n"));
2147 rtl_set_bbreg(hw, 0xe28, BMASKDWORD, 0);
2148 if (t != 0) {
2149 /* Switch back BB to SI mode after finish IQ Calibration. */
2150 if (!rtlphy->rfpi_enable)
2151 _rtl92d_phy_pimode_switch(hw, false);
2152 /* Reload ADDA power saving parameters */
2153 _rtl92d_phy_reload_adda_registers(hw, adda_reg,
2154 rtlphy->adda_backup, IQK_ADDA_REG_NUM);
2155 /* Reload MAC parameters */
2156 _rtl92d_phy_reload_mac_registers(hw, iqk_mac_reg,
2157 rtlphy->iqk_mac_backup);
2158 if (is2t)
2159 _rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
2160 rtlphy->iqk_bb_backup,
2161 IQK_BB_REG_NUM);
2162 else
2163 _rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
2164 rtlphy->iqk_bb_backup,
2165 IQK_BB_REG_NUM - 1);
2166 /* load 0xe30 IQC default value */
2167 rtl_set_bbreg(hw, 0xe30, BMASKDWORD, 0x01008c00);
2168 rtl_set_bbreg(hw, 0xe34, BMASKDWORD, 0x01008c00);
2170 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("<==\n"));
2173 static void _rtl92d_phy_iq_calibrate_5g_normal(struct ieee80211_hw *hw,
2174 long result[][8], u8 t)
2176 struct rtl_priv *rtlpriv = rtl_priv(hw);
2177 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2178 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2179 u8 patha_ok, pathb_ok;
2180 static u32 adda_reg[IQK_ADDA_REG_NUM] = {
2181 RFPGA0_XCD_SWITCHCONTROL, 0xe6c, 0xe70, 0xe74,
2182 0xe78, 0xe7c, 0xe80, 0xe84,
2183 0xe88, 0xe8c, 0xed0, 0xed4,
2184 0xed8, 0xedc, 0xee0, 0xeec
2186 static u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
2187 0x522, 0x550, 0x551, 0x040
2189 static u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
2190 RFPGA0_XAB_RFINTERFACESW, RFPGA0_XA_RFINTERFACEOE,
2191 RFPGA0_XB_RFINTERFACEOE, ROFDM0_TRMUXPAR,
2192 RFPGA0_XCD_RFINTERFACESW, ROFDM0_TRXPATHENABLE,
2193 RFPGA0_RFMOD, RFPGA0_ANALOGPARAMETER4,
2194 ROFDM0_XAAGCCORE1, ROFDM0_XBAGCCORE1
2196 u32 bbvalue;
2197 bool is2t = IS_92D_SINGLEPHY(rtlhal->version);
2199 /* Note: IQ calibration must be performed after loading
2200 * PHY_REG.txt , and radio_a, radio_b.txt */
2202 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("IQK for 5G NORMAL:Start!!!\n"));
2203 mdelay(IQK_DELAY_TIME * 20);
2204 if (t == 0) {
2205 bbvalue = rtl_get_bbreg(hw, RFPGA0_RFMOD, BMASKDWORD);
2206 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("==>0x%08x\n", bbvalue));
2207 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("IQ Calibration for %s\n",
2208 (is2t ? "2T2R" : "1T1R")));
2209 /* Save ADDA parameters, turn Path A ADDA on */
2210 _rtl92d_phy_save_adda_registers(hw, adda_reg,
2211 rtlphy->adda_backup,
2212 IQK_ADDA_REG_NUM);
2213 _rtl92d_phy_save_mac_registers(hw, iqk_mac_reg,
2214 rtlphy->iqk_mac_backup);
2215 if (is2t)
2216 _rtl92d_phy_save_adda_registers(hw, iqk_bb_reg,
2217 rtlphy->iqk_bb_backup,
2218 IQK_BB_REG_NUM);
2219 else
2220 _rtl92d_phy_save_adda_registers(hw, iqk_bb_reg,
2221 rtlphy->iqk_bb_backup,
2222 IQK_BB_REG_NUM - 1);
2224 _rtl92d_phy_path_adda_on(hw, adda_reg, true, is2t);
2225 /* MAC settings */
2226 _rtl92d_phy_mac_setting_calibration(hw, iqk_mac_reg,
2227 rtlphy->iqk_mac_backup);
2228 if (t == 0)
2229 rtlphy->rfpi_enable = (u8) rtl_get_bbreg(hw,
2230 RFPGA0_XA_HSSIPARAMETER1, BIT(8));
2231 /* Switch BB to PI mode to do IQ Calibration. */
2232 if (!rtlphy->rfpi_enable)
2233 _rtl92d_phy_pimode_switch(hw, true);
2234 rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(24), 0x00);
2235 rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, BMASKDWORD, 0x03a05600);
2236 rtl_set_bbreg(hw, ROFDM0_TRMUXPAR, BMASKDWORD, 0x000800e4);
2237 rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, BMASKDWORD, 0x22208000);
2238 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xf00000, 0x0f);
2240 /* Page B init */
2241 rtl_set_bbreg(hw, 0xb68, BMASKDWORD, 0x0f600000);
2242 if (is2t)
2243 rtl_set_bbreg(hw, 0xb6c, BMASKDWORD, 0x0f600000);
2244 /* IQ calibration setting */
2245 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("IQK setting!\n"));
2246 rtl_set_bbreg(hw, 0xe28, BMASKDWORD, 0x80800000);
2247 rtl_set_bbreg(hw, 0xe40, BMASKDWORD, 0x10007c00);
2248 rtl_set_bbreg(hw, 0xe44, BMASKDWORD, 0x01004800);
2249 patha_ok = _rtl92d_phy_patha_iqk_5g_normal(hw, is2t);
2250 if (patha_ok == 0x03) {
2251 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path A IQK Success!!\n"));
2252 result[t][0] = (rtl_get_bbreg(hw, 0xe94, BMASKDWORD) &
2253 0x3FF0000) >> 16;
2254 result[t][1] = (rtl_get_bbreg(hw, 0xe9c, BMASKDWORD) &
2255 0x3FF0000) >> 16;
2256 result[t][2] = (rtl_get_bbreg(hw, 0xea4, BMASKDWORD) &
2257 0x3FF0000) >> 16;
2258 result[t][3] = (rtl_get_bbreg(hw, 0xeac, BMASKDWORD) &
2259 0x3FF0000) >> 16;
2260 } else if (patha_ok == 0x01) { /* Tx IQK OK */
2261 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2262 ("Path A IQK Only Tx Success!!\n"));
2264 result[t][0] = (rtl_get_bbreg(hw, 0xe94, BMASKDWORD) &
2265 0x3FF0000) >> 16;
2266 result[t][1] = (rtl_get_bbreg(hw, 0xe9c, BMASKDWORD) &
2267 0x3FF0000) >> 16;
2268 } else {
2269 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path A IQK Fail!!\n"));
2271 if (is2t) {
2272 /* _rtl92d_phy_patha_standby(hw); */
2273 /* Turn Path B ADDA on */
2274 _rtl92d_phy_path_adda_on(hw, adda_reg, false, is2t);
2275 pathb_ok = _rtl92d_phy_pathb_iqk_5g_normal(hw);
2276 if (pathb_ok == 0x03) {
2277 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2278 ("Path B IQK Success!!\n"));
2279 result[t][4] = (rtl_get_bbreg(hw, 0xeb4, BMASKDWORD) &
2280 0x3FF0000) >> 16;
2281 result[t][5] = (rtl_get_bbreg(hw, 0xebc, BMASKDWORD) &
2282 0x3FF0000) >> 16;
2283 result[t][6] = (rtl_get_bbreg(hw, 0xec4, BMASKDWORD) &
2284 0x3FF0000) >> 16;
2285 result[t][7] = (rtl_get_bbreg(hw, 0xecc, BMASKDWORD) &
2286 0x3FF0000) >> 16;
2287 } else if (pathb_ok == 0x01) { /* Tx IQK OK */
2288 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2289 ("Path B Only Tx IQK Success!!\n"));
2290 result[t][4] = (rtl_get_bbreg(hw, 0xeb4, BMASKDWORD) &
2291 0x3FF0000) >> 16;
2292 result[t][5] = (rtl_get_bbreg(hw, 0xebc, BMASKDWORD) &
2293 0x3FF0000) >> 16;
2294 } else {
2295 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2296 ("Path B IQK failed!!\n"));
2300 /* Back to BB mode, load original value */
2301 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2302 ("IQK:Back to BB mode, load original value!\n"));
2303 rtl_set_bbreg(hw, 0xe28, BMASKDWORD, 0);
2304 if (t != 0) {
2305 if (is2t)
2306 _rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
2307 rtlphy->iqk_bb_backup,
2308 IQK_BB_REG_NUM);
2309 else
2310 _rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
2311 rtlphy->iqk_bb_backup,
2312 IQK_BB_REG_NUM - 1);
2313 /* Reload MAC parameters */
2314 _rtl92d_phy_reload_mac_registers(hw, iqk_mac_reg,
2315 rtlphy->iqk_mac_backup);
2316 /* Switch back BB to SI mode after finish IQ Calibration. */
2317 if (!rtlphy->rfpi_enable)
2318 _rtl92d_phy_pimode_switch(hw, false);
2319 /* Reload ADDA power saving parameters */
2320 _rtl92d_phy_reload_adda_registers(hw, adda_reg,
2321 rtlphy->adda_backup,
2322 IQK_ADDA_REG_NUM);
2324 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("<==\n"));
2327 static bool _rtl92d_phy_simularity_compare(struct ieee80211_hw *hw,
2328 long result[][8], u8 c1, u8 c2)
2330 struct rtl_priv *rtlpriv = rtl_priv(hw);
2331 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2332 u32 i, j, diff, sim_bitmap, bound;
2333 u8 final_candidate[2] = {0xFF, 0xFF}; /* for path A and path B */
2334 bool bresult = true;
2335 bool is2t = IS_92D_SINGLEPHY(rtlhal->version);
2337 if (is2t)
2338 bound = 8;
2339 else
2340 bound = 4;
2341 sim_bitmap = 0;
2342 for (i = 0; i < bound; i++) {
2343 diff = (result[c1][i] > result[c2][i]) ? (result[c1][i] -
2344 result[c2][i]) : (result[c2][i] - result[c1][i]);
2345 if (diff > MAX_TOLERANCE_92D) {
2346 if ((i == 2 || i == 6) && !sim_bitmap) {
2347 if (result[c1][i] + result[c1][i + 1] == 0)
2348 final_candidate[(i / 4)] = c2;
2349 else if (result[c2][i] + result[c2][i + 1] == 0)
2350 final_candidate[(i / 4)] = c1;
2351 else
2352 sim_bitmap = sim_bitmap | (1 << i);
2353 } else {
2354 sim_bitmap = sim_bitmap | (1 << i);
2358 if (sim_bitmap == 0) {
2359 for (i = 0; i < (bound / 4); i++) {
2360 if (final_candidate[i] != 0xFF) {
2361 for (j = i * 4; j < (i + 1) * 4 - 2; j++)
2362 result[3][j] =
2363 result[final_candidate[i]][j];
2364 bresult = false;
2367 return bresult;
2369 if (!(sim_bitmap & 0x0F)) { /* path A OK */
2370 for (i = 0; i < 4; i++)
2371 result[3][i] = result[c1][i];
2372 } else if (!(sim_bitmap & 0x03)) { /* path A, Tx OK */
2373 for (i = 0; i < 2; i++)
2374 result[3][i] = result[c1][i];
2376 if (!(sim_bitmap & 0xF0) && is2t) { /* path B OK */
2377 for (i = 4; i < 8; i++)
2378 result[3][i] = result[c1][i];
2379 } else if (!(sim_bitmap & 0x30)) { /* path B, Tx OK */
2380 for (i = 4; i < 6; i++)
2381 result[3][i] = result[c1][i];
2383 return false;
2386 static void _rtl92d_phy_patha_fill_iqk_matrix(struct ieee80211_hw *hw,
2387 bool iqk_ok, long result[][8],
2388 u8 final_candidate, bool txonly)
2390 struct rtl_priv *rtlpriv = rtl_priv(hw);
2391 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2392 u32 oldval_0, val_x, tx0_a, reg;
2393 long val_y, tx0_c;
2394 bool is2t = IS_92D_SINGLEPHY(rtlhal->version) ||
2395 rtlhal->macphymode == DUALMAC_DUALPHY;
2397 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2398 ("Path A IQ Calibration %s !\n",
2399 (iqk_ok) ? "Success" : "Failed"));
2400 if (final_candidate == 0xFF) {
2401 return;
2402 } else if (iqk_ok) {
2403 oldval_0 = (rtl_get_bbreg(hw, ROFDM0_XATxIQIMBALANCE,
2404 BMASKDWORD) >> 22) & 0x3FF; /* OFDM0_D */
2405 val_x = result[final_candidate][0];
2406 if ((val_x & 0x00000200) != 0)
2407 val_x = val_x | 0xFFFFFC00;
2408 tx0_a = (val_x * oldval_0) >> 8;
2409 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("X = 0x%x, tx0_a = 0x%x,"
2410 " oldval_0 0x%x\n", val_x, tx0_a, oldval_0));
2411 rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, 0x3FF, tx0_a);
2412 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(24),
2413 ((val_x * oldval_0 >> 7) & 0x1));
2414 val_y = result[final_candidate][1];
2415 if ((val_y & 0x00000200) != 0)
2416 val_y = val_y | 0xFFFFFC00;
2417 /* path B IQK result + 3 */
2418 if (rtlhal->interfaceindex == 1 &&
2419 rtlhal->current_bandtype == BAND_ON_5G)
2420 val_y += 3;
2421 tx0_c = (val_y * oldval_0) >> 8;
2422 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Y = 0x%lx, tx0_c = 0x%lx\n",
2423 val_y, tx0_c));
2424 rtl_set_bbreg(hw, ROFDM0_XCTxAFE, 0xF0000000,
2425 ((tx0_c & 0x3C0) >> 6));
2426 rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, 0x003F0000,
2427 (tx0_c & 0x3F));
2428 if (is2t)
2429 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(26),
2430 ((val_y * oldval_0 >> 7) & 0x1));
2431 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("0xC80 = 0x%x\n",
2432 rtl_get_bbreg(hw, ROFDM0_XATxIQIMBALANCE,
2433 BMASKDWORD)));
2434 if (txonly) {
2435 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("only Tx OK\n"));
2436 return;
2438 reg = result[final_candidate][2];
2439 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0x3FF, reg);
2440 reg = result[final_candidate][3] & 0x3F;
2441 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0xFC00, reg);
2442 reg = (result[final_candidate][3] >> 6) & 0xF;
2443 rtl_set_bbreg(hw, 0xca0, 0xF0000000, reg);
2447 static void _rtl92d_phy_pathb_fill_iqk_matrix(struct ieee80211_hw *hw,
2448 bool iqk_ok, long result[][8], u8 final_candidate, bool txonly)
2450 struct rtl_priv *rtlpriv = rtl_priv(hw);
2451 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2452 u32 oldval_1, val_x, tx1_a, reg;
2453 long val_y, tx1_c;
2455 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Path B IQ Calibration %s !\n",
2456 (iqk_ok) ? "Success" : "Failed"));
2457 if (final_candidate == 0xFF) {
2458 return;
2459 } else if (iqk_ok) {
2460 oldval_1 = (rtl_get_bbreg(hw, ROFDM0_XBTxIQIMBALANCE,
2461 BMASKDWORD) >> 22) & 0x3FF;
2462 val_x = result[final_candidate][4];
2463 if ((val_x & 0x00000200) != 0)
2464 val_x = val_x | 0xFFFFFC00;
2465 tx1_a = (val_x * oldval_1) >> 8;
2466 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("X = 0x%x, tx1_a = 0x%x\n",
2467 val_x, tx1_a));
2468 rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, 0x3FF, tx1_a);
2469 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(28),
2470 ((val_x * oldval_1 >> 7) & 0x1));
2471 val_y = result[final_candidate][5];
2472 if ((val_y & 0x00000200) != 0)
2473 val_y = val_y | 0xFFFFFC00;
2474 if (rtlhal->current_bandtype == BAND_ON_5G)
2475 val_y += 3;
2476 tx1_c = (val_y * oldval_1) >> 8;
2477 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("Y = 0x%lx, tx1_c = 0x%lx\n",
2478 val_y, tx1_c));
2479 rtl_set_bbreg(hw, ROFDM0_XDTxAFE, 0xF0000000,
2480 ((tx1_c & 0x3C0) >> 6));
2481 rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, 0x003F0000,
2482 (tx1_c & 0x3F));
2483 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(30),
2484 ((val_y * oldval_1 >> 7) & 0x1));
2485 if (txonly)
2486 return;
2487 reg = result[final_candidate][6];
2488 rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0x3FF, reg);
2489 reg = result[final_candidate][7] & 0x3F;
2490 rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0xFC00, reg);
2491 reg = (result[final_candidate][7] >> 6) & 0xF;
2492 rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0x0000F000, reg);
2496 void rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw)
2498 struct rtl_priv *rtlpriv = rtl_priv(hw);
2499 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2500 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2501 long result[4][8];
2502 u8 i, final_candidate, indexforchannel;
2503 bool patha_ok, pathb_ok;
2504 long rege94, rege9c, regea4, regeac, regeb4;
2505 long regebc, regec4, regecc, regtmp = 0;
2506 bool is12simular, is13simular, is23simular;
2507 unsigned long flag = 0;
2509 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2510 ("IQK:Start!!!channel %d\n", rtlphy->current_channel));
2511 for (i = 0; i < 8; i++) {
2512 result[0][i] = 0;
2513 result[1][i] = 0;
2514 result[2][i] = 0;
2515 result[3][i] = 0;
2517 final_candidate = 0xff;
2518 patha_ok = false;
2519 pathb_ok = false;
2520 is12simular = false;
2521 is23simular = false;
2522 is13simular = false;
2523 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2524 ("IQK !!!currentband %d\n", rtlhal->current_bandtype));
2525 rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag);
2526 for (i = 0; i < 3; i++) {
2527 if (rtlhal->current_bandtype == BAND_ON_5G) {
2528 _rtl92d_phy_iq_calibrate_5g_normal(hw, result, i);
2529 } else if (rtlhal->current_bandtype == BAND_ON_2_4G) {
2530 if (IS_92D_SINGLEPHY(rtlhal->version))
2531 _rtl92d_phy_iq_calibrate(hw, result, i, true);
2532 else
2533 _rtl92d_phy_iq_calibrate(hw, result, i, false);
2535 if (i == 1) {
2536 is12simular = _rtl92d_phy_simularity_compare(hw, result,
2537 0, 1);
2538 if (is12simular) {
2539 final_candidate = 0;
2540 break;
2543 if (i == 2) {
2544 is13simular = _rtl92d_phy_simularity_compare(hw, result,
2545 0, 2);
2546 if (is13simular) {
2547 final_candidate = 0;
2548 break;
2550 is23simular = _rtl92d_phy_simularity_compare(hw, result,
2551 1, 2);
2552 if (is23simular) {
2553 final_candidate = 1;
2554 } else {
2555 for (i = 0; i < 8; i++)
2556 regtmp += result[3][i];
2558 if (regtmp != 0)
2559 final_candidate = 3;
2560 else
2561 final_candidate = 0xFF;
2565 rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
2566 for (i = 0; i < 4; i++) {
2567 rege94 = result[i][0];
2568 rege9c = result[i][1];
2569 regea4 = result[i][2];
2570 regeac = result[i][3];
2571 regeb4 = result[i][4];
2572 regebc = result[i][5];
2573 regec4 = result[i][6];
2574 regecc = result[i][7];
2575 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2576 ("IQK: rege94=%lx rege9c=%lx regea4=%lx regeac=%lx "
2577 "regeb4=%lx regebc=%lx regec4=%lx regecc=%lx\n ",
2578 rege94, rege9c, regea4, regeac, regeb4, regebc, regec4,
2579 regecc));
2581 if (final_candidate != 0xff) {
2582 rtlphy->reg_e94 = rege94 = result[final_candidate][0];
2583 rtlphy->reg_e9c = rege9c = result[final_candidate][1];
2584 regea4 = result[final_candidate][2];
2585 regeac = result[final_candidate][3];
2586 rtlphy->reg_eb4 = regeb4 = result[final_candidate][4];
2587 rtlphy->reg_ebc = regebc = result[final_candidate][5];
2588 regec4 = result[final_candidate][6];
2589 regecc = result[final_candidate][7];
2590 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2591 ("IQK: final_candidate is %x\n", final_candidate));
2592 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2593 ("IQK: rege94=%lx rege9c=%lx regea4=%lx regeac=%lx "
2594 "regeb4=%lx regebc=%lx regec4=%lx regecc=%lx\n ",
2595 rege94, rege9c, regea4, regeac, regeb4, regebc, regec4,
2596 regecc));
2597 patha_ok = pathb_ok = true;
2598 } else {
2599 rtlphy->reg_e94 = rtlphy->reg_eb4 = 0x100; /* X default value */
2600 rtlphy->reg_e9c = rtlphy->reg_ebc = 0x0; /* Y default value */
2602 if ((rege94 != 0) /*&&(regea4 != 0) */)
2603 _rtl92d_phy_patha_fill_iqk_matrix(hw, patha_ok, result,
2604 final_candidate, (regea4 == 0));
2605 if (IS_92D_SINGLEPHY(rtlhal->version)) {
2606 if ((regeb4 != 0) /*&&(regec4 != 0) */)
2607 _rtl92d_phy_pathb_fill_iqk_matrix(hw, pathb_ok, result,
2608 final_candidate, (regec4 == 0));
2610 if (final_candidate != 0xFF) {
2611 indexforchannel = rtl92d_get_rightchnlplace_for_iqk(
2612 rtlphy->current_channel);
2614 for (i = 0; i < IQK_MATRIX_REG_NUM; i++)
2615 rtlphy->iqk_matrix_regsetting[indexforchannel].
2616 value[0][i] = result[final_candidate][i];
2617 rtlphy->iqk_matrix_regsetting[indexforchannel].iqk_done =
2618 true;
2620 RT_TRACE(rtlpriv, COMP_SCAN | COMP_MLME, DBG_LOUD,
2621 ("\nIQK OK indexforchannel %d.\n", indexforchannel));
2625 void rtl92d_phy_reload_iqk_setting(struct ieee80211_hw *hw, u8 channel)
2627 struct rtl_priv *rtlpriv = rtl_priv(hw);
2628 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2629 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2630 u8 indexforchannel;
2632 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("channel %d\n", channel));
2633 /*------Do IQK for normal chip and test chip 5G band------- */
2634 indexforchannel = rtl92d_get_rightchnlplace_for_iqk(channel);
2635 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
2636 ("indexforchannel %d done %d\n", indexforchannel,
2637 rtlphy->iqk_matrix_regsetting[indexforchannel].iqk_done));
2638 if (0 && !rtlphy->iqk_matrix_regsetting[indexforchannel].iqk_done &&
2639 rtlphy->need_iqk) {
2640 /* Re Do IQK. */
2641 RT_TRACE(rtlpriv, COMP_SCAN | COMP_INIT, DBG_LOUD,
2642 ("Do IQK Matrix reg for channel:%d....\n", channel));
2643 rtl92d_phy_iq_calibrate(hw);
2644 } else {
2645 /* Just load the value. */
2646 /* 2G band just load once. */
2647 if (((!rtlhal->load_imrandiqk_setting_for2g) &&
2648 indexforchannel == 0) || indexforchannel > 0) {
2649 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
2650 ("Just Read IQK Matrix reg for channel:%d"
2651 "....\n", channel));
2652 if ((rtlphy->iqk_matrix_regsetting[indexforchannel].
2653 value[0] != NULL)
2654 /*&&(regea4 != 0) */)
2655 _rtl92d_phy_patha_fill_iqk_matrix(hw, true,
2656 rtlphy->iqk_matrix_regsetting[
2657 indexforchannel].value, 0,
2658 (rtlphy->iqk_matrix_regsetting[
2659 indexforchannel].value[0][2] == 0));
2660 if (IS_92D_SINGLEPHY(rtlhal->version)) {
2661 if ((rtlphy->iqk_matrix_regsetting[
2662 indexforchannel].value[0][4] != 0)
2663 /*&&(regec4 != 0) */)
2664 _rtl92d_phy_pathb_fill_iqk_matrix(hw,
2665 true,
2666 rtlphy->iqk_matrix_regsetting[
2667 indexforchannel].value, 0,
2668 (rtlphy->iqk_matrix_regsetting[
2669 indexforchannel].value[0][6]
2670 == 0));
2674 rtlphy->need_iqk = false;
2675 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("<====\n"));
2678 static u32 _rtl92d_phy_get_abs(u32 val1, u32 val2)
2680 u32 ret;
2682 if (val1 >= val2)
2683 ret = val1 - val2;
2684 else
2685 ret = val2 - val1;
2686 return ret;
2689 static bool _rtl92d_is_legal_5g_channel(struct ieee80211_hw *hw, u8 channel)
2692 int i;
2693 u8 channel_5g[45] = {
2694 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
2695 60, 62, 64, 100, 102, 104, 106, 108, 110, 112,
2696 114, 116, 118, 120, 122, 124, 126, 128, 130, 132,
2697 134, 136, 138, 140, 149, 151, 153, 155, 157, 159,
2698 161, 163, 165
2701 for (i = 0; i < sizeof(channel_5g); i++)
2702 if (channel == channel_5g[i])
2703 return true;
2704 return false;
2707 static void _rtl92d_phy_calc_curvindex(struct ieee80211_hw *hw,
2708 u32 *targetchnl, u32 * curvecount_val,
2709 bool is5g, u32 *curveindex)
2711 struct rtl_priv *rtlpriv = rtl_priv(hw);
2712 u32 smallest_abs_val = 0xffffffff, u4tmp;
2713 u8 i, j;
2714 u8 chnl_num = is5g ? TARGET_CHNL_NUM_5G : TARGET_CHNL_NUM_2G;
2716 for (i = 0; i < chnl_num; i++) {
2717 if (is5g && !_rtl92d_is_legal_5g_channel(hw, i + 1))
2718 continue;
2719 curveindex[i] = 0;
2720 for (j = 0; j < (CV_CURVE_CNT * 2); j++) {
2721 u4tmp = _rtl92d_phy_get_abs(targetchnl[i],
2722 curvecount_val[j]);
2724 if (u4tmp < smallest_abs_val) {
2725 curveindex[i] = j;
2726 smallest_abs_val = u4tmp;
2729 smallest_abs_val = 0xffffffff;
2730 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("curveindex[%d] = %x\n", i,
2731 curveindex[i]));
2735 static void _rtl92d_phy_reload_lck_setting(struct ieee80211_hw *hw,
2736 u8 channel)
2738 struct rtl_priv *rtlpriv = rtl_priv(hw);
2739 u8 erfpath = rtlpriv->rtlhal.current_bandtype ==
2740 BAND_ON_5G ? RF90_PATH_A :
2741 IS_92D_SINGLEPHY(rtlpriv->rtlhal.version) ?
2742 RF90_PATH_B : RF90_PATH_A;
2743 u32 u4tmp = 0, u4regvalue = 0;
2744 bool bneed_powerdown_radio = false;
2746 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("path %d\n", erfpath));
2747 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("band type = %d\n",
2748 rtlpriv->rtlhal.current_bandtype));
2749 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("channel = %d\n", channel));
2750 if (rtlpriv->rtlhal.current_bandtype == BAND_ON_5G) {/* Path-A for 5G */
2751 u4tmp = curveindex_5g[channel-1];
2752 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2753 ("ver 1 set RF-A, 5G, 0x28 = 0x%ulx !!\n", u4tmp));
2754 if (rtlpriv->rtlhal.macphymode == DUALMAC_DUALPHY &&
2755 rtlpriv->rtlhal.interfaceindex == 1) {
2756 bneed_powerdown_radio =
2757 rtl92d_phy_enable_anotherphy(hw, false);
2758 rtlpriv->rtlhal.during_mac1init_radioa = true;
2759 /* asume no this case */
2760 if (bneed_powerdown_radio)
2761 _rtl92d_phy_enable_rf_env(hw, erfpath,
2762 &u4regvalue);
2764 rtl_set_rfreg(hw, erfpath, RF_SYN_G4, 0x3f800, u4tmp);
2765 if (bneed_powerdown_radio)
2766 _rtl92d_phy_restore_rf_env(hw, erfpath, &u4regvalue);
2767 if (rtlpriv->rtlhal.during_mac1init_radioa)
2768 rtl92d_phy_powerdown_anotherphy(hw, false);
2769 } else if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G) {
2770 u4tmp = curveindex_2g[channel-1];
2771 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2772 ("ver 3 set RF-B, 2G, 0x28 = 0x%ulx !!\n", u4tmp));
2773 if (rtlpriv->rtlhal.macphymode == DUALMAC_DUALPHY &&
2774 rtlpriv->rtlhal.interfaceindex == 0) {
2775 bneed_powerdown_radio =
2776 rtl92d_phy_enable_anotherphy(hw, true);
2777 rtlpriv->rtlhal.during_mac0init_radiob = true;
2778 if (bneed_powerdown_radio)
2779 _rtl92d_phy_enable_rf_env(hw, erfpath,
2780 &u4regvalue);
2782 rtl_set_rfreg(hw, erfpath, RF_SYN_G4, 0x3f800, u4tmp);
2783 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2784 ("ver 3 set RF-B, 2G, 0x28 = 0x%ulx !!\n",
2785 rtl_get_rfreg(hw, erfpath, RF_SYN_G4, 0x3f800)));
2786 if (bneed_powerdown_radio)
2787 _rtl92d_phy_restore_rf_env(hw, erfpath, &u4regvalue);
2788 if (rtlpriv->rtlhal.during_mac0init_radiob)
2789 rtl92d_phy_powerdown_anotherphy(hw, true);
2791 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("<====\n"));
2794 static void _rtl92d_phy_lc_calibrate_sw(struct ieee80211_hw *hw, bool is2t)
2796 struct rtl_priv *rtlpriv = rtl_priv(hw);
2797 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2798 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2799 u8 tmpreg, index, rf_mode[2];
2800 u8 path = is2t ? 2 : 1;
2801 u8 i;
2802 u32 u4tmp, offset;
2803 u32 curvecount_val[CV_CURVE_CNT * 2] = {0};
2804 u16 timeout = 800, timecount = 0;
2806 /* Check continuous TX and Packet TX */
2807 tmpreg = rtl_read_byte(rtlpriv, 0xd03);
2808 /* if Deal with contisuous TX case, disable all continuous TX */
2809 /* if Deal with Packet TX case, block all queues */
2810 if ((tmpreg & 0x70) != 0)
2811 rtl_write_byte(rtlpriv, 0xd03, tmpreg & 0x8F);
2812 else
2813 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
2814 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xF00000, 0x0F);
2815 for (index = 0; index < path; index++) {
2816 /* 1. Read original RF mode */
2817 offset = index == 0 ? ROFDM0_XAAGCCORE1 : ROFDM0_XBAGCCORE1;
2818 rf_mode[index] = rtl_read_byte(rtlpriv, offset);
2819 /* 2. Set RF mode = standby mode */
2820 rtl_set_rfreg(hw, (enum radio_path)index, RF_AC,
2821 BRFREGOFFSETMASK, 0x010000);
2822 if (rtlpci->init_ready) {
2823 /* switch CV-curve control by LC-calibration */
2824 rtl_set_rfreg(hw, (enum radio_path)index, RF_SYN_G7,
2825 BIT(17), 0x0);
2826 /* 4. Set LC calibration begin */
2827 rtl_set_rfreg(hw, (enum radio_path)index, RF_CHNLBW,
2828 0x08000, 0x01);
2830 u4tmp = rtl_get_rfreg(hw, (enum radio_path)index, RF_SYN_G6,
2831 BRFREGOFFSETMASK);
2832 while ((!(u4tmp & BIT(11))) && timecount <= timeout) {
2833 mdelay(50);
2834 timecount += 50;
2835 u4tmp = rtl_get_rfreg(hw, (enum radio_path)index,
2836 RF_SYN_G6, BRFREGOFFSETMASK);
2838 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2839 ("PHY_LCK finish delay for %d ms=2\n", timecount));
2840 u4tmp = rtl_get_rfreg(hw, index, RF_SYN_G4, BRFREGOFFSETMASK);
2841 if (index == 0 && rtlhal->interfaceindex == 0) {
2842 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2843 ("path-A / 5G LCK\n"));
2844 } else {
2845 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2846 ("path-B / 2.4G LCK\n"));
2848 memset(&curvecount_val[0], 0, CV_CURVE_CNT * 2);
2849 /* Set LC calibration off */
2850 rtl_set_rfreg(hw, (enum radio_path)index, RF_CHNLBW,
2851 0x08000, 0x0);
2852 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("set RF 0x18[15] = 0\n"));
2853 /* save Curve-counting number */
2854 for (i = 0; i < CV_CURVE_CNT; i++) {
2855 u32 readval = 0, readval2 = 0;
2856 rtl_set_rfreg(hw, (enum radio_path)index, 0x3F,
2857 0x7f, i);
2859 rtl_set_rfreg(hw, (enum radio_path)index, 0x4D,
2860 BRFREGOFFSETMASK, 0x0);
2861 readval = rtl_get_rfreg(hw, (enum radio_path)index,
2862 0x4F, BRFREGOFFSETMASK);
2863 curvecount_val[2 * i + 1] = (readval & 0xfffe0) >> 5;
2864 /* reg 0x4f [4:0] */
2865 /* reg 0x50 [19:10] */
2866 readval2 = rtl_get_rfreg(hw, (enum radio_path)index,
2867 0x50, 0xffc00);
2868 curvecount_val[2 * i] = (((readval & 0x1F) << 10) |
2869 readval2);
2871 if (index == 0 && rtlhal->interfaceindex == 0)
2872 _rtl92d_phy_calc_curvindex(hw, targetchnl_5g,
2873 curvecount_val,
2874 true, curveindex_5g);
2875 else
2876 _rtl92d_phy_calc_curvindex(hw, targetchnl_2g,
2877 curvecount_val,
2878 false, curveindex_2g);
2879 /* switch CV-curve control mode */
2880 rtl_set_rfreg(hw, (enum radio_path)index, RF_SYN_G7,
2881 BIT(17), 0x1);
2884 /* Restore original situation */
2885 for (index = 0; index < path; index++) {
2886 offset = index == 0 ? ROFDM0_XAAGCCORE1 : ROFDM0_XBAGCCORE1;
2887 rtl_write_byte(rtlpriv, offset, 0x50);
2888 rtl_write_byte(rtlpriv, offset, rf_mode[index]);
2890 if ((tmpreg & 0x70) != 0)
2891 rtl_write_byte(rtlpriv, 0xd03, tmpreg);
2892 else /*Deal with Packet TX case */
2893 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
2894 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xF00000, 0x00);
2895 _rtl92d_phy_reload_lck_setting(hw, rtlpriv->phy.current_channel);
2898 static void _rtl92d_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
2900 struct rtl_priv *rtlpriv = rtl_priv(hw);
2902 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("cosa PHY_LCK ver=2\n"));
2903 _rtl92d_phy_lc_calibrate_sw(hw, is2t);
2906 void rtl92d_phy_lc_calibrate(struct ieee80211_hw *hw)
2908 struct rtl_priv *rtlpriv = rtl_priv(hw);
2909 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2910 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2911 u32 timeout = 2000, timecount = 0;
2913 while (rtlpriv->mac80211.act_scanning && timecount < timeout) {
2914 udelay(50);
2915 timecount += 50;
2918 rtlphy->lck_inprogress = true;
2919 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2920 ("LCK:Start!!! currentband %x delay %d ms\n",
2921 rtlhal->current_bandtype, timecount));
2922 if (IS_92D_SINGLEPHY(rtlhal->version)) {
2923 _rtl92d_phy_lc_calibrate(hw, true);
2924 } else {
2925 /* For 1T1R */
2926 _rtl92d_phy_lc_calibrate(hw, false);
2928 rtlphy->lck_inprogress = false;
2929 RTPRINT(rtlpriv, FINIT, INIT_IQK, ("LCK:Finish!!!\n"));
2932 void rtl92d_phy_ap_calibrate(struct ieee80211_hw *hw, char delta)
2934 return;
2937 static bool _rtl92d_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
2938 u32 cmdtableidx, u32 cmdtablesz, enum swchnlcmd_id cmdid,
2939 u32 para1, u32 para2, u32 msdelay)
2941 struct swchnlcmd *pcmd;
2943 if (cmdtable == NULL) {
2944 RT_ASSERT(false, ("cmdtable cannot be NULL.\n"));
2945 return false;
2947 if (cmdtableidx >= cmdtablesz)
2948 return false;
2950 pcmd = cmdtable + cmdtableidx;
2951 pcmd->cmdid = cmdid;
2952 pcmd->para1 = para1;
2953 pcmd->para2 = para2;
2954 pcmd->msdelay = msdelay;
2955 return true;
2958 void rtl92d_phy_reset_iqk_result(struct ieee80211_hw *hw)
2960 struct rtl_priv *rtlpriv = rtl_priv(hw);
2961 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2962 u8 i;
2964 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2965 ("settings regs %d default regs %d\n",
2966 (int)(sizeof(rtlphy->iqk_matrix_regsetting) /
2967 sizeof(struct iqk_matrix_regs)),
2968 IQK_MATRIX_REG_NUM));
2969 /* 0xe94, 0xe9c, 0xea4, 0xeac, 0xeb4, 0xebc, 0xec4, 0xecc */
2970 for (i = 0; i < IQK_MATRIX_SETTINGS_NUM; i++) {
2971 rtlphy->iqk_matrix_regsetting[i].value[0][0] = 0x100;
2972 rtlphy->iqk_matrix_regsetting[i].value[0][2] = 0x100;
2973 rtlphy->iqk_matrix_regsetting[i].value[0][4] = 0x100;
2974 rtlphy->iqk_matrix_regsetting[i].value[0][6] = 0x100;
2975 rtlphy->iqk_matrix_regsetting[i].value[0][1] = 0x0;
2976 rtlphy->iqk_matrix_regsetting[i].value[0][3] = 0x0;
2977 rtlphy->iqk_matrix_regsetting[i].value[0][5] = 0x0;
2978 rtlphy->iqk_matrix_regsetting[i].value[0][7] = 0x0;
2979 rtlphy->iqk_matrix_regsetting[i].iqk_done = false;
2983 static bool _rtl92d_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
2984 u8 channel, u8 *stage, u8 *step,
2985 u32 *delay)
2987 struct rtl_priv *rtlpriv = rtl_priv(hw);
2988 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2989 struct swchnlcmd precommoncmd[MAX_PRECMD_CNT];
2990 u32 precommoncmdcnt;
2991 struct swchnlcmd postcommoncmd[MAX_POSTCMD_CNT];
2992 u32 postcommoncmdcnt;
2993 struct swchnlcmd rfdependcmd[MAX_RFDEPENDCMD_CNT];
2994 u32 rfdependcmdcnt;
2995 struct swchnlcmd *currentcmd = NULL;
2996 u8 rfpath;
2997 u8 num_total_rfpath = rtlphy->num_total_rfpath;
2999 precommoncmdcnt = 0;
3000 _rtl92d_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
3001 MAX_PRECMD_CNT,
3002 CMDID_SET_TXPOWEROWER_LEVEL, 0, 0, 0);
3003 _rtl92d_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
3004 MAX_PRECMD_CNT, CMDID_END, 0, 0, 0);
3005 postcommoncmdcnt = 0;
3006 _rtl92d_phy_set_sw_chnl_cmdarray(postcommoncmd, postcommoncmdcnt++,
3007 MAX_POSTCMD_CNT, CMDID_END, 0, 0, 0);
3008 rfdependcmdcnt = 0;
3009 _rtl92d_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
3010 MAX_RFDEPENDCMD_CNT, CMDID_RF_WRITEREG,
3011 RF_CHNLBW, channel, 0);
3012 _rtl92d_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
3013 MAX_RFDEPENDCMD_CNT, CMDID_END,
3014 0, 0, 0);
3016 do {
3017 switch (*stage) {
3018 case 0:
3019 currentcmd = &precommoncmd[*step];
3020 break;
3021 case 1:
3022 currentcmd = &rfdependcmd[*step];
3023 break;
3024 case 2:
3025 currentcmd = &postcommoncmd[*step];
3026 break;
3028 if (currentcmd->cmdid == CMDID_END) {
3029 if ((*stage) == 2) {
3030 return true;
3031 } else {
3032 (*stage)++;
3033 (*step) = 0;
3034 continue;
3037 switch (currentcmd->cmdid) {
3038 case CMDID_SET_TXPOWEROWER_LEVEL:
3039 rtl92d_phy_set_txpower_level(hw, channel);
3040 break;
3041 case CMDID_WRITEPORT_ULONG:
3042 rtl_write_dword(rtlpriv, currentcmd->para1,
3043 currentcmd->para2);
3044 break;
3045 case CMDID_WRITEPORT_USHORT:
3046 rtl_write_word(rtlpriv, currentcmd->para1,
3047 (u16)currentcmd->para2);
3048 break;
3049 case CMDID_WRITEPORT_UCHAR:
3050 rtl_write_byte(rtlpriv, currentcmd->para1,
3051 (u8)currentcmd->para2);
3052 break;
3053 case CMDID_RF_WRITEREG:
3054 for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) {
3055 rtlphy->rfreg_chnlval[rfpath] =
3056 ((rtlphy->rfreg_chnlval[rfpath] &
3057 0xffffff00) | currentcmd->para2);
3058 if (rtlpriv->rtlhal.current_bandtype ==
3059 BAND_ON_5G) {
3060 if (currentcmd->para2 > 99)
3061 rtlphy->rfreg_chnlval[rfpath] =
3062 rtlphy->rfreg_chnlval
3063 [rfpath] | (BIT(18));
3064 else
3065 rtlphy->rfreg_chnlval[rfpath] =
3066 rtlphy->rfreg_chnlval
3067 [rfpath] & (~BIT(18));
3068 rtlphy->rfreg_chnlval[rfpath] |=
3069 (BIT(16) | BIT(8));
3070 } else {
3071 rtlphy->rfreg_chnlval[rfpath] &=
3072 ~(BIT(8) | BIT(16) | BIT(18));
3074 rtl_set_rfreg(hw, (enum radio_path)rfpath,
3075 currentcmd->para1,
3076 BRFREGOFFSETMASK,
3077 rtlphy->rfreg_chnlval[rfpath]);
3078 _rtl92d_phy_reload_imr_setting(hw, channel,
3079 rfpath);
3081 _rtl92d_phy_switch_rf_setting(hw, channel);
3082 /* do IQK when all parameters are ready */
3083 rtl92d_phy_reload_iqk_setting(hw, channel);
3084 break;
3085 default:
3086 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3087 ("switch case not process\n"));
3088 break;
3090 break;
3091 } while (true);
3092 (*delay) = currentcmd->msdelay;
3093 (*step)++;
3094 return false;
3097 u8 rtl92d_phy_sw_chnl(struct ieee80211_hw *hw)
3099 struct rtl_priv *rtlpriv = rtl_priv(hw);
3100 struct rtl_phy *rtlphy = &(rtlpriv->phy);
3101 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3102 u32 delay;
3103 u32 timeout = 1000, timecount = 0;
3104 u8 channel = rtlphy->current_channel;
3105 u32 ret_value;
3107 if (rtlphy->sw_chnl_inprogress)
3108 return 0;
3109 if (rtlphy->set_bwmode_inprogress)
3110 return 0;
3112 if ((is_hal_stop(rtlhal)) || (RT_CANNOT_IO(hw))) {
3113 RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
3114 ("sw_chnl_inprogress false driver sleep or unload\n"));
3115 return 0;
3117 while (rtlphy->lck_inprogress && timecount < timeout) {
3118 mdelay(50);
3119 timecount += 50;
3121 if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY &&
3122 rtlhal->bandset == BAND_ON_BOTH) {
3123 ret_value = rtl_get_bbreg(hw, RFPGA0_XAB_RFPARAMETER,
3124 BMASKDWORD);
3125 if (rtlphy->current_channel > 14 && !(ret_value & BIT(0)))
3126 rtl92d_phy_switch_wirelessband(hw, BAND_ON_5G);
3127 else if (rtlphy->current_channel <= 14 && (ret_value & BIT(0)))
3128 rtl92d_phy_switch_wirelessband(hw, BAND_ON_2_4G);
3130 switch (rtlhal->current_bandtype) {
3131 case BAND_ON_5G:
3132 /* Get first channel error when change between
3133 * 5G and 2.4G band. */
3134 if (channel <= 14)
3135 return 0;
3136 RT_ASSERT((channel > 14), ("5G but channel<=14"));
3137 break;
3138 case BAND_ON_2_4G:
3139 /* Get first channel error when change between
3140 * 5G and 2.4G band. */
3141 if (channel > 14)
3142 return 0;
3143 RT_ASSERT((channel <= 14), ("2G but channel>14"));
3144 break;
3145 default:
3146 RT_ASSERT(false,
3147 ("Invalid WirelessMode(%#x)!!\n",
3148 rtlpriv->mac80211.mode));
3149 break;
3151 rtlphy->sw_chnl_inprogress = true;
3152 if (channel == 0)
3153 channel = 1;
3154 rtlphy->sw_chnl_stage = 0;
3155 rtlphy->sw_chnl_step = 0;
3156 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
3157 ("switch to channel%d\n", rtlphy->current_channel));
3159 do {
3160 if (!rtlphy->sw_chnl_inprogress)
3161 break;
3162 if (!_rtl92d_phy_sw_chnl_step_by_step(hw,
3163 rtlphy->current_channel,
3164 &rtlphy->sw_chnl_stage, &rtlphy->sw_chnl_step, &delay)) {
3165 if (delay > 0)
3166 mdelay(delay);
3167 else
3168 continue;
3169 } else {
3170 rtlphy->sw_chnl_inprogress = false;
3172 break;
3173 } while (true);
3174 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, ("<==\n"));
3175 rtlphy->sw_chnl_inprogress = false;
3176 return 1;
3179 static void rtl92d_phy_set_io(struct ieee80211_hw *hw)
3181 struct rtl_priv *rtlpriv = rtl_priv(hw);
3182 struct rtl_phy *rtlphy = &(rtlpriv->phy);
3184 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
3185 ("--->Cmd(%#x), set_io_inprogress(%d)\n",
3186 rtlphy->current_io_type, rtlphy->set_io_inprogress));
3187 switch (rtlphy->current_io_type) {
3188 case IO_CMD_RESUME_DM_BY_SCAN:
3189 de_digtable.cur_igvalue = rtlphy->initgain_backup.xaagccore1;
3190 rtl92d_dm_write_dig(hw);
3191 rtl92d_phy_set_txpower_level(hw, rtlphy->current_channel);
3192 break;
3193 case IO_CMD_PAUSE_DM_BY_SCAN:
3194 rtlphy->initgain_backup.xaagccore1 = de_digtable.cur_igvalue;
3195 de_digtable.cur_igvalue = 0x37;
3196 rtl92d_dm_write_dig(hw);
3197 break;
3198 default:
3199 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3200 ("switch case not process\n"));
3201 break;
3203 rtlphy->set_io_inprogress = false;
3204 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
3205 ("<---(%#x)\n", rtlphy->current_io_type));
3208 bool rtl92d_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
3210 struct rtl_priv *rtlpriv = rtl_priv(hw);
3211 struct rtl_phy *rtlphy = &(rtlpriv->phy);
3212 bool postprocessing = false;
3214 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
3215 ("-->IO Cmd(%#x), set_io_inprogress(%d)\n",
3216 iotype, rtlphy->set_io_inprogress));
3217 do {
3218 switch (iotype) {
3219 case IO_CMD_RESUME_DM_BY_SCAN:
3220 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
3221 ("[IO CMD] Resume DM after scan.\n"));
3222 postprocessing = true;
3223 break;
3224 case IO_CMD_PAUSE_DM_BY_SCAN:
3225 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
3226 ("[IO CMD] Pause DM before scan.\n"));
3227 postprocessing = true;
3228 break;
3229 default:
3230 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3231 ("switch case not process\n"));
3232 break;
3234 } while (false);
3235 if (postprocessing && !rtlphy->set_io_inprogress) {
3236 rtlphy->set_io_inprogress = true;
3237 rtlphy->current_io_type = iotype;
3238 } else {
3239 return false;
3241 rtl92d_phy_set_io(hw);
3242 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, ("<--IO Type(%#x)\n", iotype));
3243 return true;
3246 static void _rtl92d_phy_set_rfon(struct ieee80211_hw *hw)
3248 struct rtl_priv *rtlpriv = rtl_priv(hw);
3250 /* a. SYS_CLKR 0x08[11] = 1 restore MAC clock */
3251 /* b. SPS_CTRL 0x11[7:0] = 0x2b */
3252 if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY)
3253 rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b);
3254 /* c. For PCIE: SYS_FUNC_EN 0x02[7:0] = 0xE3 enable BB TRX function */
3255 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3256 /* RF_ON_EXCEP(d~g): */
3257 /* d. APSD_CTRL 0x600[7:0] = 0x00 */
3258 rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);
3259 /* e. SYS_FUNC_EN 0x02[7:0] = 0xE2 reset BB TRX function again */
3260 /* f. SYS_FUNC_EN 0x02[7:0] = 0xE3 enable BB TRX function*/
3261 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3262 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3263 /* g. txpause 0x522[7:0] = 0x00 enable mac tx queue */
3264 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
3267 static void _rtl92d_phy_set_rfsleep(struct ieee80211_hw *hw)
3269 struct rtl_priv *rtlpriv = rtl_priv(hw);
3270 u32 u4btmp;
3271 u8 delay = 5;
3273 /* a. TXPAUSE 0x522[7:0] = 0xFF Pause MAC TX queue */
3274 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
3275 /* b. RF path 0 offset 0x00 = 0x00 disable RF */
3276 rtl_set_rfreg(hw, RF90_PATH_A, 0x00, BRFREGOFFSETMASK, 0x00);
3277 /* c. APSD_CTRL 0x600[7:0] = 0x40 */
3278 rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40);
3279 /* d. APSD_CTRL 0x600[7:0] = 0x00
3280 * APSD_CTRL 0x600[7:0] = 0x00
3281 * RF path 0 offset 0x00 = 0x00
3282 * APSD_CTRL 0x600[7:0] = 0x40
3283 * */
3284 u4btmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, BRFREGOFFSETMASK);
3285 while (u4btmp != 0 && delay > 0) {
3286 rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x0);
3287 rtl_set_rfreg(hw, RF90_PATH_A, 0x00, BRFREGOFFSETMASK, 0x00);
3288 rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40);
3289 u4btmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, BRFREGOFFSETMASK);
3290 delay--;
3292 if (delay == 0) {
3293 /* Jump out the LPS turn off sequence to RF_ON_EXCEP */
3294 rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);
3296 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3297 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3298 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
3299 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
3300 ("Fail !!! Switch RF timeout.\n"));
3301 return;
3303 /* e. For PCIE: SYS_FUNC_EN 0x02[7:0] = 0xE2 reset BB TRX function */
3304 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3305 /* f. SPS_CTRL 0x11[7:0] = 0x22 */
3306 if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY)
3307 rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22);
3308 /* g. SYS_CLKR 0x08[11] = 0 gated MAC clock */
3311 bool rtl92d_phy_set_rf_power_state(struct ieee80211_hw *hw,
3312 enum rf_pwrstate rfpwr_state)
3315 bool bresult = true;
3316 struct rtl_priv *rtlpriv = rtl_priv(hw);
3317 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
3318 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3319 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
3320 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
3321 u8 i, queue_id;
3322 struct rtl8192_tx_ring *ring = NULL;
3324 if (rfpwr_state == ppsc->rfpwr_state)
3325 return false;
3326 switch (rfpwr_state) {
3327 case ERFON:
3328 if ((ppsc->rfpwr_state == ERFOFF) &&
3329 RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
3330 bool rtstatus;
3331 u32 InitializeCount = 0;
3332 do {
3333 InitializeCount++;
3334 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3335 ("IPS Set eRf nic enable\n"));
3336 rtstatus = rtl_ps_enable_nic(hw);
3337 } while ((rtstatus != true) &&
3338 (InitializeCount < 10));
3340 RT_CLEAR_PS_LEVEL(ppsc,
3341 RT_RF_OFF_LEVL_HALT_NIC);
3342 } else {
3343 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
3344 ("awake, sleeped:%d ms state_"
3345 "inap:%x\n",
3346 jiffies_to_msecs(jiffies -
3347 ppsc->last_sleep_jiffies),
3348 rtlpriv->psc.state_inap));
3349 ppsc->last_awake_jiffies = jiffies;
3350 _rtl92d_phy_set_rfon(hw);
3353 if (mac->link_state == MAC80211_LINKED)
3354 rtlpriv->cfg->ops->led_control(hw,
3355 LED_CTL_LINK);
3356 else
3357 rtlpriv->cfg->ops->led_control(hw,
3358 LED_CTL_NO_LINK);
3359 break;
3360 case ERFOFF:
3361 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
3362 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3363 ("IPS Set eRf nic disable\n"));
3364 rtl_ps_disable_nic(hw);
3365 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
3366 } else {
3367 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS)
3368 rtlpriv->cfg->ops->led_control(hw,
3369 LED_CTL_NO_LINK);
3370 else
3371 rtlpriv->cfg->ops->led_control(hw,
3372 LED_CTL_POWER_OFF);
3374 break;
3375 case ERFSLEEP:
3376 if (ppsc->rfpwr_state == ERFOFF)
3377 return false;
3379 for (queue_id = 0, i = 0;
3380 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
3381 ring = &pcipriv->dev.tx_ring[queue_id];
3382 if (skb_queue_len(&ring->queue) == 0 ||
3383 queue_id == BEACON_QUEUE) {
3384 queue_id++;
3385 continue;
3386 } else if (rtlpci->pdev->current_state != PCI_D0) {
3387 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
3388 ("eRf Off/Sleep: %d times TcbBusyQueu"
3389 "e[%d] !=0 but lower power state!\n",
3390 (i + 1), queue_id));
3391 break;
3392 } else {
3393 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3394 ("eRf Off/Sleep: %d times TcbBusyQueu"
3395 "e[%d] =%d "
3396 "before doze!\n", (i + 1), queue_id,
3397 skb_queue_len(&ring->queue)));
3398 udelay(10);
3399 i++;
3402 if (i >= MAX_DOZE_WAITING_TIMES_9x) {
3403 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3404 ("\nERFOFF: %d times TcbBusyQueue[%d] "
3405 "= %d !\n",
3406 MAX_DOZE_WAITING_TIMES_9x, queue_id,
3407 skb_queue_len(&ring->queue)));
3408 break;
3411 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
3412 ("Set rfsleep awaked:%d ms\n",
3413 jiffies_to_msecs(jiffies - ppsc->last_awake_jiffies)));
3414 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, ("sleep awaked:%d ms "
3415 "state_inap:%x\n", jiffies_to_msecs(jiffies -
3416 ppsc->last_awake_jiffies), rtlpriv->psc.state_inap));
3417 ppsc->last_sleep_jiffies = jiffies;
3418 _rtl92d_phy_set_rfsleep(hw);
3419 break;
3420 default:
3421 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3422 ("switch case not process\n"));
3423 bresult = false;
3424 break;
3426 if (bresult)
3427 ppsc->rfpwr_state = rfpwr_state;
3428 return bresult;
3431 void rtl92d_phy_config_macphymode(struct ieee80211_hw *hw)
3433 struct rtl_priv *rtlpriv = rtl_priv(hw);
3434 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3435 u8 offset = REG_MAC_PHY_CTRL_NORMAL;
3437 switch (rtlhal->macphymode) {
3438 case DUALMAC_DUALPHY:
3439 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3440 ("MacPhyMode: DUALMAC_DUALPHY\n"));
3441 rtl_write_byte(rtlpriv, offset, 0xF3);
3442 break;
3443 case SINGLEMAC_SINGLEPHY:
3444 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3445 ("MacPhyMode: SINGLEMAC_SINGLEPHY\n"));
3446 rtl_write_byte(rtlpriv, offset, 0xF4);
3447 break;
3448 case DUALMAC_SINGLEPHY:
3449 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3450 ("MacPhyMode: DUALMAC_SINGLEPHY\n"));
3451 rtl_write_byte(rtlpriv, offset, 0xF1);
3452 break;
3456 void rtl92d_phy_config_macphymode_info(struct ieee80211_hw *hw)
3458 struct rtl_priv *rtlpriv = rtl_priv(hw);
3459 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3460 struct rtl_phy *rtlphy = &(rtlpriv->phy);
3462 switch (rtlhal->macphymode) {
3463 case DUALMAC_SINGLEPHY:
3464 rtlphy->rf_type = RF_2T2R;
3465 rtlhal->version |= CHIP_92D_SINGLEPHY;
3466 rtlhal->bandset = BAND_ON_BOTH;
3467 rtlhal->current_bandtype = BAND_ON_2_4G;
3468 break;
3470 case SINGLEMAC_SINGLEPHY:
3471 rtlphy->rf_type = RF_2T2R;
3472 rtlhal->version |= CHIP_92D_SINGLEPHY;
3473 rtlhal->bandset = BAND_ON_BOTH;
3474 rtlhal->current_bandtype = BAND_ON_2_4G;
3475 break;
3477 case DUALMAC_DUALPHY:
3478 rtlphy->rf_type = RF_1T1R;
3479 rtlhal->version &= (~CHIP_92D_SINGLEPHY);
3480 /* Now we let MAC0 run on 5G band. */
3481 if (rtlhal->interfaceindex == 0) {
3482 rtlhal->bandset = BAND_ON_5G;
3483 rtlhal->current_bandtype = BAND_ON_5G;
3484 } else {
3485 rtlhal->bandset = BAND_ON_2_4G;
3486 rtlhal->current_bandtype = BAND_ON_2_4G;
3488 break;
3489 default:
3490 break;
3494 u8 rtl92d_get_chnlgroup_fromarray(u8 chnl)
3496 u8 group;
3497 u8 channel_info[59] = {
3498 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
3499 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56,
3500 58, 60, 62, 64, 100, 102, 104, 106, 108,
3501 110, 112, 114, 116, 118, 120, 122, 124,
3502 126, 128, 130, 132, 134, 136, 138, 140,
3503 149, 151, 153, 155, 157, 159, 161, 163,
3507 if (channel_info[chnl] <= 3)
3508 group = 0;
3509 else if (channel_info[chnl] <= 9)
3510 group = 1;
3511 else if (channel_info[chnl] <= 14)
3512 group = 2;
3513 else if (channel_info[chnl] <= 44)
3514 group = 3;
3515 else if (channel_info[chnl] <= 54)
3516 group = 4;
3517 else if (channel_info[chnl] <= 64)
3518 group = 5;
3519 else if (channel_info[chnl] <= 112)
3520 group = 6;
3521 else if (channel_info[chnl] <= 126)
3522 group = 7;
3523 else if (channel_info[chnl] <= 140)
3524 group = 8;
3525 else if (channel_info[chnl] <= 153)
3526 group = 9;
3527 else if (channel_info[chnl] <= 159)
3528 group = 10;
3529 else
3530 group = 11;
3531 return group;
3534 void rtl92d_phy_set_poweron(struct ieee80211_hw *hw)
3536 struct rtl_priv *rtlpriv = rtl_priv(hw);
3537 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3538 unsigned long flags;
3539 u8 value8;
3540 u16 i;
3541 u32 mac_reg = (rtlhal->interfaceindex == 0 ? REG_MAC0 : REG_MAC1);
3543 /* notice fw know band status 0x81[1]/0x53[1] = 0: 5G, 1: 2G */
3544 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
3545 value8 = rtl_read_byte(rtlpriv, mac_reg);
3546 value8 |= BIT(1);
3547 rtl_write_byte(rtlpriv, mac_reg, value8);
3548 } else {
3549 value8 = rtl_read_byte(rtlpriv, mac_reg);
3550 value8 &= (~BIT(1));
3551 rtl_write_byte(rtlpriv, mac_reg, value8);
3554 if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY) {
3555 value8 = rtl_read_byte(rtlpriv, REG_MAC0);
3556 rtl_write_byte(rtlpriv, REG_MAC0, value8 | MAC0_ON);
3557 } else {
3558 spin_lock_irqsave(&globalmutex_power, flags);
3559 if (rtlhal->interfaceindex == 0) {
3560 value8 = rtl_read_byte(rtlpriv, REG_MAC0);
3561 rtl_write_byte(rtlpriv, REG_MAC0, value8 | MAC0_ON);
3562 } else {
3563 value8 = rtl_read_byte(rtlpriv, REG_MAC1);
3564 rtl_write_byte(rtlpriv, REG_MAC1, value8 | MAC1_ON);
3566 value8 = rtl_read_byte(rtlpriv, REG_POWER_OFF_IN_PROCESS);
3567 spin_unlock_irqrestore(&globalmutex_power, flags);
3568 for (i = 0; i < 200; i++) {
3569 if ((value8 & BIT(7)) == 0) {
3570 break;
3571 } else {
3572 udelay(500);
3573 spin_lock_irqsave(&globalmutex_power, flags);
3574 value8 = rtl_read_byte(rtlpriv,
3575 REG_POWER_OFF_IN_PROCESS);
3576 spin_unlock_irqrestore(&globalmutex_power,
3577 flags);
3580 if (i == 200)
3581 RT_ASSERT(false, ("Another mac power off over time\n"));
3585 void rtl92d_phy_config_maccoexist_rfpage(struct ieee80211_hw *hw)
3587 struct rtl_priv *rtlpriv = rtl_priv(hw);
3589 switch (rtlpriv->rtlhal.macphymode) {
3590 case DUALMAC_DUALPHY:
3591 rtl_write_byte(rtlpriv, REG_DMC, 0x0);
3592 rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x08);
3593 rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, 0x13ff);
3594 break;
3595 case DUALMAC_SINGLEPHY:
3596 rtl_write_byte(rtlpriv, REG_DMC, 0xf8);
3597 rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x08);
3598 rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, 0x13ff);
3599 break;
3600 case SINGLEMAC_SINGLEPHY:
3601 rtl_write_byte(rtlpriv, REG_DMC, 0x0);
3602 rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x10);
3603 rtl_write_word(rtlpriv, (REG_TRXFF_BNDY + 2), 0x27FF);
3604 break;
3605 default:
3606 break;
3610 void rtl92d_update_bbrf_configuration(struct ieee80211_hw *hw)
3612 struct rtl_priv *rtlpriv = rtl_priv(hw);
3613 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3614 struct rtl_phy *rtlphy = &(rtlpriv->phy);
3615 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
3616 u8 rfpath, i;
3618 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("==>\n"));
3619 /* r_select_5G for path_A/B 0 for 2.4G, 1 for 5G */
3620 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
3621 /* r_select_5G for path_A/B,0x878 */
3622 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(0), 0x0);
3623 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15), 0x0);
3624 if (rtlhal->macphymode != DUALMAC_DUALPHY) {
3625 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(16), 0x0);
3626 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(31), 0x0);
3628 /* rssi_table_select:index 0 for 2.4G.1~3 for 5G,0xc78 */
3629 rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, BIT(6) | BIT(7), 0x0);
3630 /* fc_area 0xd2c */
3631 rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(14) | BIT(13), 0x0);
3632 /* 5G LAN ON */
3633 rtl_set_bbreg(hw, 0xB30, 0x00F00000, 0xa);
3634 /* TX BB gain shift*1,Just for testchip,0xc80,0xc88 */
3635 rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, BMASKDWORD,
3636 0x40000100);
3637 rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, BMASKDWORD,
3638 0x40000100);
3639 if (rtlhal->macphymode == DUALMAC_DUALPHY) {
3640 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3641 BIT(10) | BIT(6) | BIT(5),
3642 ((rtlefuse->eeprom_c9 & BIT(3)) >> 3) |
3643 (rtlefuse->eeprom_c9 & BIT(1)) |
3644 ((rtlefuse->eeprom_cc & BIT(1)) << 4));
3645 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
3646 BIT(10) | BIT(6) | BIT(5),
3647 ((rtlefuse->eeprom_c9 & BIT(2)) >> 2) |
3648 ((rtlefuse->eeprom_c9 & BIT(0)) << 1) |
3649 ((rtlefuse->eeprom_cc & BIT(0)) << 5));
3650 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15), 0);
3651 } else {
3652 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3653 BIT(26) | BIT(22) | BIT(21) | BIT(10) |
3654 BIT(6) | BIT(5),
3655 ((rtlefuse->eeprom_c9 & BIT(3)) >> 3) |
3656 (rtlefuse->eeprom_c9 & BIT(1)) |
3657 ((rtlefuse->eeprom_cc & BIT(1)) << 4) |
3658 ((rtlefuse->eeprom_c9 & BIT(7)) << 9) |
3659 ((rtlefuse->eeprom_c9 & BIT(5)) << 12) |
3660 ((rtlefuse->eeprom_cc & BIT(3)) << 18));
3661 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
3662 BIT(10) | BIT(6) | BIT(5),
3663 ((rtlefuse->eeprom_c9 & BIT(2)) >> 2) |
3664 ((rtlefuse->eeprom_c9 & BIT(0)) << 1) |
3665 ((rtlefuse->eeprom_cc & BIT(0)) << 5));
3666 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
3667 BIT(10) | BIT(6) | BIT(5),
3668 ((rtlefuse->eeprom_c9 & BIT(6)) >> 6) |
3669 ((rtlefuse->eeprom_c9 & BIT(4)) >> 3) |
3670 ((rtlefuse->eeprom_cc & BIT(2)) << 3));
3671 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER,
3672 BIT(31) | BIT(15), 0);
3674 /* 1.5V_LDO */
3675 } else {
3676 /* r_select_5G for path_A/B */
3677 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(0), 0x1);
3678 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15), 0x1);
3679 if (rtlhal->macphymode != DUALMAC_DUALPHY) {
3680 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(16), 0x1);
3681 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(31), 0x1);
3683 /* rssi_table_select:index 0 for 2.4G.1~3 for 5G */
3684 rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, BIT(6) | BIT(7), 0x1);
3685 /* fc_area */
3686 rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(14) | BIT(13), 0x1);
3687 /* 5G LAN ON */
3688 rtl_set_bbreg(hw, 0xB30, 0x00F00000, 0x0);
3689 /* TX BB gain shift,Just for testchip,0xc80,0xc88 */
3690 if (rtlefuse->internal_pa_5g[0])
3691 rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, BMASKDWORD,
3692 0x2d4000b5);
3693 else
3694 rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, BMASKDWORD,
3695 0x20000080);
3696 if (rtlefuse->internal_pa_5g[1])
3697 rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, BMASKDWORD,
3698 0x2d4000b5);
3699 else
3700 rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, BMASKDWORD,
3701 0x20000080);
3702 if (rtlhal->macphymode == DUALMAC_DUALPHY) {
3703 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3704 BIT(10) | BIT(6) | BIT(5),
3705 (rtlefuse->eeprom_cc & BIT(5)));
3706 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(10),
3707 ((rtlefuse->eeprom_cc & BIT(4)) >> 4));
3708 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15),
3709 (rtlefuse->eeprom_cc & BIT(4)) >> 4);
3710 } else {
3711 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3712 BIT(26) | BIT(22) | BIT(21) | BIT(10) |
3713 BIT(6) | BIT(5),
3714 (rtlefuse->eeprom_cc & BIT(5)) |
3715 ((rtlefuse->eeprom_cc & BIT(7)) << 14));
3716 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(10),
3717 ((rtlefuse->eeprom_cc & BIT(4)) >> 4));
3718 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, BIT(10),
3719 ((rtlefuse->eeprom_cc & BIT(6)) >> 6));
3720 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER,
3721 BIT(31) | BIT(15),
3722 ((rtlefuse->eeprom_cc & BIT(4)) >> 4) |
3723 ((rtlefuse->eeprom_cc & BIT(6)) << 10));
3726 /* update IQK related settings */
3727 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, BMASKDWORD, 0x40000100);
3728 rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, BMASKDWORD, 0x40000100);
3729 rtl_set_bbreg(hw, ROFDM0_XCTxAFE, 0xF0000000, 0x00);
3730 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(30) | BIT(28) |
3731 BIT(26) | BIT(24), 0x00);
3732 rtl_set_bbreg(hw, ROFDM0_XDTxAFE, 0xF0000000, 0x00);
3733 rtl_set_bbreg(hw, 0xca0, 0xF0000000, 0x00);
3734 rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0x0000F000, 0x00);
3736 /* Update RF */
3737 for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
3738 rfpath++) {
3739 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
3740 /* MOD_AG for RF paht_A 0x18 BIT8,BIT16 */
3741 rtl_set_rfreg(hw, rfpath, RF_CHNLBW, BIT(8) | BIT(16) |
3742 BIT(18), 0);
3743 /* RF0x0b[16:14] =3b'111 */
3744 rtl_set_rfreg(hw, (enum radio_path)rfpath, 0x0B,
3745 0x1c000, 0x07);
3746 } else {
3747 /* MOD_AG for RF paht_A 0x18 BIT8,BIT16 */
3748 rtl_set_rfreg(hw, rfpath, RF_CHNLBW, BIT(8) |
3749 BIT(16) | BIT(18),
3750 (BIT(16) | BIT(8)) >> 8);
3753 /* Update for all band. */
3754 /* DMDP */
3755 if (rtlphy->rf_type == RF_1T1R) {
3756 /* Use antenna 0,0xc04,0xd04 */
3757 rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, BMASKBYTE0, 0x11);
3758 rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE, BDWORD, 0x1);
3760 /* enable ad/da clock1 for dual-phy reg0x888 */
3761 if (rtlhal->interfaceindex == 0) {
3762 rtl_set_bbreg(hw, RFPGA0_ADDALLOCKEN, BIT(12) |
3763 BIT(13), 0x3);
3764 } else {
3765 rtl92d_phy_enable_anotherphy(hw, false);
3766 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3767 ("MAC1 use DBI to update 0x888"));
3768 /* 0x888 */
3769 rtl92de_write_dword_dbi(hw, RFPGA0_ADDALLOCKEN,
3770 rtl92de_read_dword_dbi(hw,
3771 RFPGA0_ADDALLOCKEN,
3772 BIT(3)) | BIT(12) | BIT(13),
3773 BIT(3));
3774 rtl92d_phy_powerdown_anotherphy(hw, false);
3776 } else {
3777 /* Single PHY */
3778 /* Use antenna 0 & 1,0xc04,0xd04 */
3779 rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, BMASKBYTE0, 0x33);
3780 rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE, BDWORD, 0x3);
3781 /* disable ad/da clock1,0x888 */
3782 rtl_set_bbreg(hw, RFPGA0_ADDALLOCKEN, BIT(12) | BIT(13), 0);
3784 for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
3785 rfpath++) {
3786 rtlphy->rfreg_chnlval[rfpath] = rtl_get_rfreg(hw, rfpath,
3787 RF_CHNLBW, BRFREGOFFSETMASK);
3788 rtlphy->reg_rf3c[rfpath] = rtl_get_rfreg(hw, rfpath, 0x3C,
3789 BRFREGOFFSETMASK);
3791 for (i = 0; i < 2; i++)
3792 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, ("RF 0x18 = 0x%x\n",
3793 rtlphy->rfreg_chnlval[i]));
3794 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("<==\n"));
3798 bool rtl92d_phy_check_poweroff(struct ieee80211_hw *hw)
3800 struct rtl_priv *rtlpriv = rtl_priv(hw);
3801 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3802 u8 u1btmp;
3803 unsigned long flags;
3805 if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY) {
3806 u1btmp = rtl_read_byte(rtlpriv, REG_MAC0);
3807 rtl_write_byte(rtlpriv, REG_MAC0, u1btmp & (~MAC0_ON));
3808 return true;
3810 spin_lock_irqsave(&globalmutex_power, flags);
3811 if (rtlhal->interfaceindex == 0) {
3812 u1btmp = rtl_read_byte(rtlpriv, REG_MAC0);
3813 rtl_write_byte(rtlpriv, REG_MAC0, u1btmp & (~MAC0_ON));
3814 u1btmp = rtl_read_byte(rtlpriv, REG_MAC1);
3815 u1btmp &= MAC1_ON;
3816 } else {
3817 u1btmp = rtl_read_byte(rtlpriv, REG_MAC1);
3818 rtl_write_byte(rtlpriv, REG_MAC1, u1btmp & (~MAC1_ON));
3819 u1btmp = rtl_read_byte(rtlpriv, REG_MAC0);
3820 u1btmp &= MAC0_ON;
3822 if (u1btmp) {
3823 spin_unlock_irqrestore(&globalmutex_power, flags);
3824 return false;
3826 u1btmp = rtl_read_byte(rtlpriv, REG_POWER_OFF_IN_PROCESS);
3827 u1btmp |= BIT(7);
3828 rtl_write_byte(rtlpriv, REG_POWER_OFF_IN_PROCESS, u1btmp);
3829 spin_unlock_irqrestore(&globalmutex_power, flags);
3830 return true;