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