Merge git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf-next
[linux-2.6-microblaze.git] / drivers / net / wireless / realtek / rtlwifi / rtl8821ae / phy.c
1 /******************************************************************************
2  *
3  * Copyright(c) 2009-2010  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  * The full GNU General Public License is included in this distribution in the
15  * file called LICENSE.
16  *
17  * Contact Information:
18  * wlanfae <wlanfae@realtek.com>
19  * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20  * Hsinchu 300, Taiwan.
21  *
22  * Larry Finger <Larry.Finger@lwfinger.net>
23  *
24  *****************************************************************************/
25
26 #include "../wifi.h"
27 #include "../pci.h"
28 #include "../ps.h"
29 #include "reg.h"
30 #include "def.h"
31 #include "phy.h"
32 #include "rf.h"
33 #include "dm.h"
34 #include "table.h"
35 #include "trx.h"
36 #include "../btcoexist/halbt_precomp.h"
37 #include "hw.h"
38 #include "../efuse.h"
39
40 #define READ_NEXT_PAIR(array_table, v1, v2, i) \
41         do { \
42                 i += 2; \
43                 v1 = array_table[i]; \
44                 v2 = array_table[i+1]; \
45         } while (0)
46
47 static u32 _rtl8821ae_phy_rf_serial_read(struct ieee80211_hw *hw,
48                                          enum radio_path rfpath, u32 offset);
49 static void _rtl8821ae_phy_rf_serial_write(struct ieee80211_hw *hw,
50                                            enum radio_path rfpath, u32 offset,
51                                            u32 data);
52 static u32 _rtl8821ae_phy_calculate_bit_shift(u32 bitmask);
53 static bool _rtl8821ae_phy_bb8821a_config_parafile(struct ieee80211_hw *hw);
54 /*static bool _rtl8812ae_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);*/
55 static bool _rtl8821ae_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);
56 static bool _rtl8821ae_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
57                                                      u8 configtype);
58 static bool _rtl8821ae_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
59                                                        u8 configtype);
60 static void phy_init_bb_rf_register_definition(struct ieee80211_hw *hw);
61
62 static long _rtl8821ae_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
63                                             enum wireless_mode wirelessmode,
64                                             u8 txpwridx);
65 static void rtl8821ae_phy_set_rf_on(struct ieee80211_hw *hw);
66 static void rtl8821ae_phy_set_io(struct ieee80211_hw *hw);
67
68 static void rtl8812ae_fixspur(struct ieee80211_hw *hw,
69                               enum ht_channel_width band_width, u8 channel)
70 {
71         struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
72
73         /*C cut Item12 ADC FIFO CLOCK*/
74         if (IS_VENDOR_8812A_C_CUT(rtlhal->version)) {
75                 if (band_width == HT_CHANNEL_WIDTH_20_40 && channel == 11)
76                         rtl_set_bbreg(hw, RRFMOD, 0xC00, 0x3);
77                         /* 0x8AC[11:10] = 2'b11*/
78                 else
79                         rtl_set_bbreg(hw, RRFMOD, 0xC00, 0x2);
80                         /* 0x8AC[11:10] = 2'b10*/
81
82                 /* <20120914, Kordan> A workarould to resolve
83                  * 2480Mhz spur by setting ADC clock as 160M. (Asked by Binson)
84                  */
85                 if (band_width == HT_CHANNEL_WIDTH_20 &&
86                     (channel == 13 || channel == 14)) {
87                         rtl_set_bbreg(hw, RRFMOD, 0x300, 0x3);
88                         /*0x8AC[9:8] = 2'b11*/
89                         rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 1);
90                         /* 0x8C4[30] = 1*/
91                 } else if (band_width == HT_CHANNEL_WIDTH_20_40 &&
92                            channel == 11) {
93                         rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 1);
94                         /*0x8C4[30] = 1*/
95                 } else if (band_width != HT_CHANNEL_WIDTH_80) {
96                         rtl_set_bbreg(hw, RRFMOD, 0x300, 0x2);
97                         /*0x8AC[9:8] = 2'b10*/
98                         rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 0);
99                         /*0x8C4[30] = 0*/
100                 }
101         } else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
102                 /* <20120914, Kordan> A workarould to resolve
103                  * 2480Mhz spur by setting ADC clock as 160M.
104                  */
105                 if (band_width == HT_CHANNEL_WIDTH_20 &&
106                     (channel == 13 || channel == 14))
107                         rtl_set_bbreg(hw, RRFMOD, 0x300, 0x3);
108                         /*0x8AC[9:8] = 11*/
109                 else if (channel  <= 14) /*2.4G only*/
110                         rtl_set_bbreg(hw, RRFMOD, 0x300, 0x2);
111                         /*0x8AC[9:8] = 10*/
112         }
113 }
114
115 u32 rtl8821ae_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr,
116                                u32 bitmask)
117 {
118         struct rtl_priv *rtlpriv = rtl_priv(hw);
119         u32 returnvalue, originalvalue, bitshift;
120
121         RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
122                  "regaddr(%#x), bitmask(%#x)\n",
123                  regaddr, bitmask);
124         originalvalue = rtl_read_dword(rtlpriv, regaddr);
125         bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask);
126         returnvalue = (originalvalue & bitmask) >> bitshift;
127
128         RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
129                  "BBR MASK=0x%x Addr[0x%x]=0x%x\n",
130                  bitmask, regaddr, originalvalue);
131         return returnvalue;
132 }
133
134 void rtl8821ae_phy_set_bb_reg(struct ieee80211_hw *hw,
135                               u32 regaddr, u32 bitmask, u32 data)
136 {
137         struct rtl_priv *rtlpriv = rtl_priv(hw);
138         u32 originalvalue, bitshift;
139
140         RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
141                  "regaddr(%#x), bitmask(%#x), data(%#x)\n",
142                  regaddr, bitmask, data);
143
144         if (bitmask != MASKDWORD) {
145                 originalvalue = rtl_read_dword(rtlpriv, regaddr);
146                 bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask);
147                 data = ((originalvalue & (~bitmask)) |
148                         ((data << bitshift) & bitmask));
149         }
150
151         rtl_write_dword(rtlpriv, regaddr, data);
152
153         RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
154                  "regaddr(%#x), bitmask(%#x), data(%#x)\n",
155                  regaddr, bitmask, data);
156 }
157
158 u32 rtl8821ae_phy_query_rf_reg(struct ieee80211_hw *hw,
159                                enum radio_path rfpath, u32 regaddr,
160                                u32 bitmask)
161 {
162         struct rtl_priv *rtlpriv = rtl_priv(hw);
163         u32 original_value, readback_value, bitshift;
164         unsigned long flags;
165
166         RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
167                  "regaddr(%#x), rfpath(%#x), bitmask(%#x)\n",
168                  regaddr, rfpath, bitmask);
169
170         spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
171
172         original_value = _rtl8821ae_phy_rf_serial_read(hw, rfpath, regaddr);
173         bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask);
174         readback_value = (original_value & bitmask) >> bitshift;
175
176         spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
177
178         RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
179                  "regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n",
180                  regaddr, rfpath, bitmask, original_value);
181
182         return readback_value;
183 }
184
185 void rtl8821ae_phy_set_rf_reg(struct ieee80211_hw *hw,
186                            enum radio_path rfpath,
187                            u32 regaddr, u32 bitmask, u32 data)
188 {
189         struct rtl_priv *rtlpriv = rtl_priv(hw);
190         u32 original_value, bitshift;
191         unsigned long flags;
192
193         RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
194                  "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
195                   regaddr, bitmask, data, rfpath);
196
197         spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
198
199         if (bitmask != RFREG_OFFSET_MASK) {
200                 original_value =
201                    _rtl8821ae_phy_rf_serial_read(hw, rfpath, regaddr);
202                 bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask);
203                 data = ((original_value & (~bitmask)) | (data << bitshift));
204         }
205
206         _rtl8821ae_phy_rf_serial_write(hw, rfpath, regaddr, data);
207
208         spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
209
210         RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
211                  "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
212                  regaddr, bitmask, data, rfpath);
213 }
214
215 static u32 _rtl8821ae_phy_rf_serial_read(struct ieee80211_hw *hw,
216                                          enum radio_path rfpath, u32 offset)
217 {
218         struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
219         bool is_pi_mode = false;
220         u32 retvalue = 0;
221
222         /* 2009/06/17 MH We can not execute IO for power
223         save or other accident mode.*/
224         if (RT_CANNOT_IO(hw)) {
225                 pr_err("return all one\n");
226                 return 0xFFFFFFFF;
227         }
228         /* <20120809, Kordan> CCA OFF(when entering),
229                 asked by James to avoid reading the wrong value.
230             <20120828, Kordan> Toggling CCA would affect RF 0x0, skip it!*/
231         if (offset != 0x0 &&
232             !((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) ||
233             (IS_VENDOR_8812A_C_CUT(rtlhal->version))))
234                 rtl_set_bbreg(hw, RCCAONSEC, 0x8, 1);
235         offset &= 0xff;
236
237         if (rfpath == RF90_PATH_A)
238                 is_pi_mode = (bool)rtl_get_bbreg(hw, 0xC00, 0x4);
239         else if (rfpath == RF90_PATH_B)
240                 is_pi_mode = (bool)rtl_get_bbreg(hw, 0xE00, 0x4);
241
242         rtl_set_bbreg(hw, RHSSIREAD_8821AE, 0xff, offset);
243
244         if ((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) ||
245             (IS_VENDOR_8812A_C_CUT(rtlhal->version)))
246                 udelay(20);
247
248         if (is_pi_mode) {
249                 if (rfpath == RF90_PATH_A)
250                         retvalue =
251                           rtl_get_bbreg(hw, RA_PIREAD_8821A, BLSSIREADBACKDATA);
252                 else if (rfpath == RF90_PATH_B)
253                         retvalue =
254                           rtl_get_bbreg(hw, RB_PIREAD_8821A, BLSSIREADBACKDATA);
255         } else {
256                 if (rfpath == RF90_PATH_A)
257                         retvalue =
258                           rtl_get_bbreg(hw, RA_SIREAD_8821A, BLSSIREADBACKDATA);
259                 else if (rfpath == RF90_PATH_B)
260                         retvalue =
261                           rtl_get_bbreg(hw, RB_SIREAD_8821A, BLSSIREADBACKDATA);
262         }
263
264         /*<20120809, Kordan> CCA ON(when exiting),
265          * asked by James to avoid reading the wrong value.
266          *   <20120828, Kordan> Toggling CCA would affect RF 0x0, skip it!
267          */
268         if (offset != 0x0 &&
269             !((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) ||
270             (IS_VENDOR_8812A_C_CUT(rtlhal->version))))
271                 rtl_set_bbreg(hw, RCCAONSEC, 0x8, 0);
272         return retvalue;
273 }
274
275 static void _rtl8821ae_phy_rf_serial_write(struct ieee80211_hw *hw,
276                                            enum radio_path rfpath, u32 offset,
277                                            u32 data)
278 {
279         struct rtl_priv *rtlpriv = rtl_priv(hw);
280         struct rtl_phy *rtlphy = &rtlpriv->phy;
281         struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
282         u32 data_and_addr;
283         u32 newoffset;
284
285         if (RT_CANNOT_IO(hw)) {
286                 pr_err("stop\n");
287                 return;
288         }
289         offset &= 0xff;
290         newoffset = offset;
291         data_and_addr = ((newoffset << 20) |
292                          (data & 0x000fffff)) & 0x0fffffff;
293         rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr);
294         RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
295                  "RFW-%d Addr[0x%x]=0x%x\n",
296                  rfpath, pphyreg->rf3wire_offset, data_and_addr);
297 }
298
299 static u32 _rtl8821ae_phy_calculate_bit_shift(u32 bitmask)
300 {
301         u32 i;
302
303         for (i = 0; i <= 31; i++) {
304                 if (((bitmask >> i) & 0x1) == 1)
305                         break;
306         }
307         return i;
308 }
309
310 bool rtl8821ae_phy_mac_config(struct ieee80211_hw *hw)
311 {
312         bool rtstatus = 0;
313
314         rtstatus = _rtl8821ae_phy_config_mac_with_headerfile(hw);
315
316         return rtstatus;
317 }
318
319 bool rtl8821ae_phy_bb_config(struct ieee80211_hw *hw)
320 {
321         bool rtstatus = true;
322         struct rtl_priv *rtlpriv = rtl_priv(hw);
323         struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
324         struct rtl_phy *rtlphy = &rtlpriv->phy;
325         struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
326         u8 regval;
327         u8 crystal_cap;
328
329         phy_init_bb_rf_register_definition(hw);
330
331         regval = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN);
332         regval |= FEN_PCIEA;
333         rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, regval);
334         rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN,
335                        regval | FEN_BB_GLB_RSTN | FEN_BBRSTB);
336
337         rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x7);
338         rtl_write_byte(rtlpriv, REG_OPT_CTRL + 2, 0x7);
339
340         rtstatus = _rtl8821ae_phy_bb8821a_config_parafile(hw);
341
342         if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
343                 crystal_cap = rtlefuse->crystalcap & 0x3F;
344                 rtl_set_bbreg(hw, REG_MAC_PHY_CTRL, 0x7FF80000,
345                               (crystal_cap | (crystal_cap << 6)));
346         } else {
347                 crystal_cap = rtlefuse->crystalcap & 0x3F;
348                 rtl_set_bbreg(hw, REG_MAC_PHY_CTRL, 0xFFF000,
349                               (crystal_cap | (crystal_cap << 6)));
350         }
351         rtlphy->reg_837 = rtl_read_byte(rtlpriv, 0x837);
352
353         return rtstatus;
354 }
355
356 bool rtl8821ae_phy_rf_config(struct ieee80211_hw *hw)
357 {
358         return rtl8821ae_phy_rf6052_config(hw);
359 }
360
361 static void _rtl8812ae_phy_set_rfe_reg_24g(struct ieee80211_hw *hw)
362 {
363         struct rtl_priv *rtlpriv = rtl_priv(hw);
364         struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
365         u8 tmp;
366
367         switch (rtlhal->rfe_type) {
368         case 3:
369                 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x54337770);
370                 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x54337770);
371                 rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x010);
372                 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010);
373                 rtl_set_bbreg(hw, 0x900, 0x00000303, 0x1);
374                 break;
375         case 4:
376                 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x77777777);
377                 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77777777);
378                 rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x001);
379                 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x001);
380                 break;
381         case 5:
382                 rtl_write_byte(rtlpriv, RA_RFE_PINMUX + 2, 0x77);
383                 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77777777);
384                 tmp = rtl_read_byte(rtlpriv, RA_RFE_INV + 3);
385                 rtl_write_byte(rtlpriv, RA_RFE_INV + 3, tmp & ~0x1);
386                 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000);
387                 break;
388         case 1:
389                 if (rtlpriv->btcoexist.bt_coexistence) {
390                         rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xffffff, 0x777777);
391                         rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD,
392                                       0x77777777);
393                         rtl_set_bbreg(hw, RA_RFE_INV, 0x33f00000, 0x000);
394                         rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000);
395                         break;
396                 }
397                 /* fall through */
398         case 0:
399         case 2:
400         default:
401                 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x77777777);
402                 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77777777);
403                 rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x000);
404                 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000);
405                 break;
406         }
407 }
408
409 static void _rtl8812ae_phy_set_rfe_reg_5g(struct ieee80211_hw *hw)
410 {
411         struct rtl_priv *rtlpriv = rtl_priv(hw);
412         struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
413         u8 tmp;
414
415         switch (rtlhal->rfe_type) {
416         case 0:
417                 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x77337717);
418                 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77337717);
419                 rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x010);
420                 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010);
421                 break;
422         case 1:
423                 if (rtlpriv->btcoexist.bt_coexistence) {
424                         rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xffffff, 0x337717);
425                         rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD,
426                                       0x77337717);
427                         rtl_set_bbreg(hw, RA_RFE_INV, 0x33f00000, 0x000);
428                         rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000);
429                 } else {
430                         rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD,
431                                       0x77337717);
432                         rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD,
433                                       0x77337717);
434                         rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x000);
435                         rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000);
436                 }
437                 break;
438         case 3:
439                 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x54337717);
440                 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x54337717);
441                 rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x010);
442                 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010);
443                 rtl_set_bbreg(hw, 0x900, 0x00000303, 0x1);
444                 break;
445         case 5:
446                 rtl_write_byte(rtlpriv, RA_RFE_PINMUX + 2, 0x33);
447                 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77337777);
448                 tmp = rtl_read_byte(rtlpriv, RA_RFE_INV + 3);
449                 rtl_write_byte(rtlpriv, RA_RFE_INV + 3, tmp | 0x1);
450                 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010);
451                 break;
452         case 2:
453         case 4:
454         default:
455                 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x77337777);
456                 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77337777);
457                 rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x010);
458                 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010);
459                 break;
460         }
461 }
462
463 u32 phy_get_tx_swing_8812A(struct ieee80211_hw *hw, u8  band,
464                            u8 rf_path)
465 {
466         struct rtl_priv *rtlpriv = rtl_priv(hw);
467         struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
468         struct rtl_dm *rtldm = rtl_dm(rtlpriv);
469         struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
470         s8 reg_swing_2g = -1;/* 0xff; */
471         s8 reg_swing_5g = -1;/* 0xff; */
472         s8 swing_2g = -1 * reg_swing_2g;
473         s8 swing_5g = -1 * reg_swing_5g;
474         u32  out = 0x200;
475         const s8 auto_temp = -1;
476
477         RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
478                  "===> PHY_GetTxBBSwing_8812A, bbSwing_2G: %d, bbSwing_5G: %d,autoload_failflag=%d.\n",
479                  (int)swing_2g, (int)swing_5g,
480                  (int)rtlefuse->autoload_failflag);
481
482         if (rtlefuse->autoload_failflag) {
483                 if (band == BAND_ON_2_4G) {
484                         rtldm->swing_diff_2g = swing_2g;
485                         if (swing_2g == 0) {
486                                 out = 0x200; /* 0 dB */
487                         } else if (swing_2g == -3) {
488                                 out = 0x16A; /* -3 dB */
489                         } else if (swing_2g == -6) {
490                                 out = 0x101; /* -6 dB */
491                         } else if (swing_2g == -9) {
492                                 out = 0x0B6; /* -9 dB */
493                         } else {
494                                 rtldm->swing_diff_2g = 0;
495                                 out = 0x200;
496                         }
497                 } else if (band == BAND_ON_5G) {
498                         rtldm->swing_diff_5g = swing_5g;
499                         if (swing_5g == 0) {
500                                 out = 0x200; /* 0 dB */
501                         } else if (swing_5g == -3) {
502                                 out = 0x16A; /* -3 dB */
503                         } else if (swing_5g == -6) {
504                                 out = 0x101; /* -6 dB */
505                         } else if (swing_5g == -9) {
506                                 out = 0x0B6; /* -9 dB */
507                         } else {
508                                 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
509                                         rtldm->swing_diff_5g = -3;
510                                         out = 0x16A;
511                                 } else {
512                                         rtldm->swing_diff_5g = 0;
513                                         out = 0x200;
514                                 }
515                         }
516                 } else {
517                         rtldm->swing_diff_2g = -3;
518                         rtldm->swing_diff_5g = -3;
519                         out = 0x16A; /* -3 dB */
520                 }
521         } else {
522                 u32 swing = 0, swing_a = 0, swing_b = 0;
523
524                 if (band == BAND_ON_2_4G) {
525                         if (reg_swing_2g == auto_temp) {
526                                 efuse_shadow_read(hw, 1, 0xC6, (u32 *)&swing);
527                                 swing = (swing == 0xFF) ? 0x00 : swing;
528                         } else if (swing_2g ==  0) {
529                                 swing = 0x00; /* 0 dB */
530                         } else if (swing_2g == -3) {
531                                 swing = 0x05; /* -3 dB */
532                         } else if (swing_2g == -6) {
533                                 swing = 0x0A; /* -6 dB */
534                         } else if (swing_2g == -9) {
535                                 swing = 0xFF; /* -9 dB */
536                         } else {
537                                 swing = 0x00;
538                         }
539                 } else {
540                         if (reg_swing_5g == auto_temp) {
541                                 efuse_shadow_read(hw, 1, 0xC7, (u32 *)&swing);
542                                 swing = (swing == 0xFF) ? 0x00 : swing;
543                         } else if (swing_5g ==  0) {
544                                 swing = 0x00; /* 0 dB */
545                         } else if (swing_5g == -3) {
546                                 swing = 0x05; /* -3 dB */
547                         } else if (swing_5g == -6) {
548                                 swing = 0x0A; /* -6 dB */
549                         } else if (swing_5g == -9) {
550                                 swing = 0xFF; /* -9 dB */
551                         } else {
552                                 swing = 0x00;
553                         }
554                 }
555
556                 swing_a = (swing & 0x3) >> 0; /* 0xC6/C7[1:0] */
557                 swing_b = (swing & 0xC) >> 2; /* 0xC6/C7[3:2] */
558                 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
559                          "===> PHY_GetTxBBSwing_8812A, swingA: 0x%X, swingB: 0x%X\n",
560                          swing_a, swing_b);
561
562                 /* 3 Path-A */
563                 if (swing_a == 0x0) {
564                         if (band == BAND_ON_2_4G)
565                                 rtldm->swing_diff_2g = 0;
566                         else
567                                 rtldm->swing_diff_5g = 0;
568                         out = 0x200; /* 0 dB */
569                 } else if (swing_a == 0x1) {
570                         if (band == BAND_ON_2_4G)
571                                 rtldm->swing_diff_2g = -3;
572                         else
573                                 rtldm->swing_diff_5g = -3;
574                         out = 0x16A; /* -3 dB */
575                 } else if (swing_a == 0x2) {
576                         if (band == BAND_ON_2_4G)
577                                 rtldm->swing_diff_2g = -6;
578                         else
579                                 rtldm->swing_diff_5g = -6;
580                         out = 0x101; /* -6 dB */
581                 } else if (swing_a == 0x3) {
582                         if (band == BAND_ON_2_4G)
583                                 rtldm->swing_diff_2g = -9;
584                         else
585                                 rtldm->swing_diff_5g = -9;
586                         out = 0x0B6; /* -9 dB */
587                 }
588                 /* 3 Path-B */
589                 if (swing_b == 0x0) {
590                         if (band == BAND_ON_2_4G)
591                                 rtldm->swing_diff_2g = 0;
592                         else
593                                 rtldm->swing_diff_5g = 0;
594                         out = 0x200; /* 0 dB */
595                 } else if (swing_b == 0x1) {
596                         if (band == BAND_ON_2_4G)
597                                 rtldm->swing_diff_2g = -3;
598                         else
599                                 rtldm->swing_diff_5g = -3;
600                         out = 0x16A; /* -3 dB */
601                 } else if (swing_b == 0x2) {
602                         if (band == BAND_ON_2_4G)
603                                 rtldm->swing_diff_2g = -6;
604                         else
605                                 rtldm->swing_diff_5g = -6;
606                         out = 0x101; /* -6 dB */
607                 } else if (swing_b == 0x3) {
608                         if (band == BAND_ON_2_4G)
609                                 rtldm->swing_diff_2g = -9;
610                         else
611                                 rtldm->swing_diff_5g = -9;
612                         out = 0x0B6; /* -9 dB */
613                 }
614         }
615
616         RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
617                  "<=== PHY_GetTxBBSwing_8812A, out = 0x%X\n", out);
618         return out;
619 }
620
621 void rtl8821ae_phy_switch_wirelessband(struct ieee80211_hw *hw, u8 band)
622 {
623         struct rtl_priv *rtlpriv = rtl_priv(hw);
624         struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
625         struct rtl_dm *rtldm = rtl_dm(rtlpriv);
626         u8 current_band = rtlhal->current_bandtype;
627         u32 txpath, rxpath;
628         s8 bb_diff_between_band;
629
630         txpath = rtl8821ae_phy_query_bb_reg(hw, RTXPATH, 0xf0);
631         rxpath = rtl8821ae_phy_query_bb_reg(hw, RCCK_RX, 0x0f000000);
632         rtlhal->current_bandtype = (enum band_type) band;
633         /* reconfig BB/RF according to wireless mode */
634         if (rtlhal->current_bandtype == BAND_ON_2_4G) {
635                 /* BB & RF Config */
636                 rtl_set_bbreg(hw, ROFDMCCKEN, BOFDMEN|BCCKEN, 0x03);
637
638                 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
639                         /* 0xCB0[15:12] = 0x7 (LNA_On)*/
640                         rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF000, 0x7);
641                         /* 0xCB0[7:4] = 0x7 (PAPE_A)*/
642                         rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF0, 0x7);
643                 }
644
645                 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
646                         /*0x834[1:0] = 0x1*/
647                         rtl_set_bbreg(hw, 0x834, 0x3, 0x1);
648                 }
649
650                 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
651                         /* 0xC1C[11:8] = 0 */
652                         rtl_set_bbreg(hw, RA_TXSCALE, 0xF00, 0);
653                 } else {
654                         /* 0x82C[1:0] = 2b'00 */
655                         rtl_set_bbreg(hw, 0x82c, 0x3, 0);
656                 }
657
658                 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
659                         _rtl8812ae_phy_set_rfe_reg_24g(hw);
660
661                 rtl_set_bbreg(hw, RTXPATH, 0xf0, 0x1);
662                 rtl_set_bbreg(hw, RCCK_RX, 0x0f000000, 0x1);
663
664                 rtl_write_byte(rtlpriv, REG_CCK_CHECK, 0x0);
665         } else {/* 5G band */
666                 u16 count, reg_41a;
667
668                 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
669                         /*0xCB0[15:12] = 0x5 (LNA_On)*/
670                         rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF000, 0x5);
671                         /*0xCB0[7:4] = 0x4 (PAPE_A)*/
672                         rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF0, 0x4);
673                 }
674                 /*CCK_CHECK_en*/
675                 rtl_write_byte(rtlpriv, REG_CCK_CHECK, 0x80);
676
677                 count = 0;
678                 reg_41a = rtl_read_word(rtlpriv, REG_TXPKT_EMPTY);
679                 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
680                          "Reg41A value %d\n", reg_41a);
681                 reg_41a &= 0x30;
682                 while ((reg_41a != 0x30) && (count < 50)) {
683                         udelay(50);
684                         RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD, "Delay 50us\n");
685
686                         reg_41a = rtl_read_word(rtlpriv, REG_TXPKT_EMPTY);
687                         reg_41a &= 0x30;
688                         count++;
689                         RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
690                                  "Reg41A value %d\n", reg_41a);
691                 }
692                 if (count != 0)
693                         RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
694                                  "PHY_SwitchWirelessBand8812(): Switch to 5G Band. Count = %d reg41A=0x%x\n",
695                                  count, reg_41a);
696
697                 /* 2012/02/01, Sinda add registry to switch workaround
698                 without long-run verification for scan issue. */
699                 rtl_set_bbreg(hw, ROFDMCCKEN, BOFDMEN|BCCKEN, 0x03);
700
701                 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
702                         /*0x834[1:0] = 0x2*/
703                         rtl_set_bbreg(hw, 0x834, 0x3, 0x2);
704                 }
705
706                 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
707                         /* AGC table select */
708                         /* 0xC1C[11:8] = 1*/
709                         rtl_set_bbreg(hw, RA_TXSCALE, 0xF00, 1);
710                 } else
711                         /* 0x82C[1:0] = 2'b00 */
712                         rtl_set_bbreg(hw, 0x82c, 0x3, 1);
713
714                 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
715                         _rtl8812ae_phy_set_rfe_reg_5g(hw);
716
717                 rtl_set_bbreg(hw, RTXPATH, 0xf0, 0);
718                 rtl_set_bbreg(hw, RCCK_RX, 0x0f000000, 0xf);
719
720                 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
721                          "==>PHY_SwitchWirelessBand8812() BAND_ON_5G settings OFDM index 0x%x\n",
722                          rtlpriv->dm.ofdm_index[RF90_PATH_A]);
723         }
724
725         if ((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) ||
726             (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)) {
727                 /* 0xC1C[31:21] */
728                 rtl_set_bbreg(hw, RA_TXSCALE, 0xFFE00000,
729                               phy_get_tx_swing_8812A(hw, band, RF90_PATH_A));
730                 /* 0xE1C[31:21] */
731                 rtl_set_bbreg(hw, RB_TXSCALE, 0xFFE00000,
732                               phy_get_tx_swing_8812A(hw, band, RF90_PATH_B));
733
734                 /* <20121005, Kordan> When TxPowerTrack is ON,
735                  *      we should take care of the change of BB swing.
736                  *   That is, reset all info to trigger Tx power tracking.
737                  */
738                 if (band != current_band) {
739                         bb_diff_between_band =
740                                 (rtldm->swing_diff_2g - rtldm->swing_diff_5g);
741                         bb_diff_between_band = (band == BAND_ON_2_4G) ?
742                                                 bb_diff_between_band :
743                                                 (-1 * bb_diff_between_band);
744                         rtldm->default_ofdm_index += bb_diff_between_band * 2;
745                 }
746                 rtl8821ae_dm_clear_txpower_tracking_state(hw);
747         }
748
749         RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
750                  "<==rtl8821ae_phy_switch_wirelessband():Switch Band OK.\n");
751         return;
752 }
753
754 static bool _rtl8821ae_check_positive(struct ieee80211_hw *hw,
755                                       const u32 condition1,
756                                       const u32 condition2)
757 {
758         struct rtl_priv *rtlpriv = rtl_priv(hw);
759         struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
760         u32 cut_ver = ((rtlhal->version & CHIP_VER_RTL_MASK)
761                                         >> CHIP_VER_RTL_SHIFT);
762         u32 intf = (rtlhal->interface == INTF_USB ? BIT(1) : BIT(0));
763
764         u8  board_type = ((rtlhal->board_type & BIT(4)) >> 4) << 0 | /* _GLNA */
765                          ((rtlhal->board_type & BIT(3)) >> 3) << 1 | /* _GPA  */
766                          ((rtlhal->board_type & BIT(7)) >> 7) << 2 | /* _ALNA */
767                          ((rtlhal->board_type & BIT(6)) >> 6) << 3 | /* _APA  */
768                          ((rtlhal->board_type & BIT(2)) >> 2) << 4;  /* _BT   */
769
770         u32 cond1 = condition1, cond2 = condition2;
771         u32 driver1 = cut_ver << 24 |   /* CUT ver */
772                       0 << 20 |                 /* interface 2/2 */
773                       0x04 << 16 |              /* platform */
774                       rtlhal->package_type << 12 |
775                       intf << 8 |                       /* interface 1/2 */
776                       board_type;
777
778         u32 driver2 = rtlhal->type_glna <<  0 |
779                       rtlhal->type_gpa  <<  8 |
780                       rtlhal->type_alna << 16 |
781                       rtlhal->type_apa  << 24;
782
783         RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
784                  "===> [8812A] CheckPositive (cond1, cond2) = (0x%X 0x%X)\n",
785                  cond1, cond2);
786         RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
787                  "===> [8812A] CheckPositive (driver1, driver2) = (0x%X 0x%X)\n",
788                  driver1, driver2);
789
790         RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
791                  "      (Platform, Interface) = (0x%X, 0x%X)\n", 0x04, intf);
792         RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
793                  "      (Board, Package) = (0x%X, 0x%X)\n",
794                  rtlhal->board_type, rtlhal->package_type);
795
796         /*============== Value Defined Check ===============*/
797         /*QFN Type [15:12] and Cut Version [27:24] need to do value check*/
798
799         if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) !=
800                 (driver1 & 0x0000F000)))
801                 return false;
802         if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) !=
803                 (driver1 & 0x0F000000)))
804                 return false;
805
806         /*=============== Bit Defined Check ================*/
807         /* We don't care [31:28] */
808
809         cond1   &= 0x00FF0FFF;
810         driver1 &= 0x00FF0FFF;
811
812         if ((cond1 & driver1) == cond1) {
813                 u32 mask = 0;
814
815                 if ((cond1 & 0x0F) == 0) /* BoardType is DONTCARE*/
816                         return true;
817
818                 if ((cond1 & BIT(0)) != 0) /*GLNA*/
819                         mask |= 0x000000FF;
820                 if ((cond1 & BIT(1)) != 0) /*GPA*/
821                         mask |= 0x0000FF00;
822                 if ((cond1 & BIT(2)) != 0) /*ALNA*/
823                         mask |= 0x00FF0000;
824                 if ((cond1 & BIT(3)) != 0) /*APA*/
825                         mask |= 0xFF000000;
826
827                 /* BoardType of each RF path is matched*/
828                 if ((cond2 & mask) == (driver2 & mask))
829                         return true;
830                 else
831                         return false;
832         } else
833                 return false;
834 }
835
836 static bool _rtl8821ae_check_condition(struct ieee80211_hw *hw,
837                                        const u32 condition)
838 {
839         struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
840         u32 _board = rtlefuse->board_type; /*need efuse define*/
841         u32 _interface = 0x01; /* ODM_ITRF_PCIE */
842         u32 _platform = 0x08;/* ODM_WIN */
843         u32 cond = condition;
844
845         if (condition == 0xCDCDCDCD)
846                 return true;
847
848         cond = condition & 0xFF;
849         if ((_board != cond) && cond != 0xFF)
850                 return false;
851
852         cond = condition & 0xFF00;
853         cond = cond >> 8;
854         if ((_interface & cond) == 0 && cond != 0x07)
855                 return false;
856
857         cond = condition & 0xFF0000;
858         cond = cond >> 16;
859         if ((_platform & cond) == 0 && cond != 0x0F)
860                 return false;
861         return true;
862 }
863
864 static void _rtl8821ae_config_rf_reg(struct ieee80211_hw *hw,
865                                      u32 addr, u32 data,
866                                      enum radio_path rfpath, u32 regaddr)
867 {
868         if (addr == 0xfe || addr == 0xffe) {
869                 /* In order not to disturb BT music when
870                  * wifi init.(1ant NIC only)
871                  */
872                 mdelay(50);
873         } else {
874                 rtl_set_rfreg(hw, rfpath, regaddr, RFREG_OFFSET_MASK, data);
875                 udelay(1);
876         }
877 }
878
879 static void _rtl8821ae_config_rf_radio_a(struct ieee80211_hw *hw,
880                                          u32 addr, u32 data)
881 {
882         u32 content = 0x1000; /*RF Content: radio_a_txt*/
883         u32 maskforphyset = (u32)(content & 0xE000);
884
885         _rtl8821ae_config_rf_reg(hw, addr, data,
886                                  RF90_PATH_A, addr | maskforphyset);
887 }
888
889 static void _rtl8821ae_config_rf_radio_b(struct ieee80211_hw *hw,
890                                          u32 addr, u32 data)
891 {
892         u32 content = 0x1001; /*RF Content: radio_b_txt*/
893         u32 maskforphyset = (u32)(content & 0xE000);
894
895         _rtl8821ae_config_rf_reg(hw, addr, data,
896                                  RF90_PATH_B, addr | maskforphyset);
897 }
898
899 static void _rtl8821ae_config_bb_reg(struct ieee80211_hw *hw,
900                                      u32 addr, u32 data)
901 {
902         if (addr == 0xfe)
903                 mdelay(50);
904         else if (addr == 0xfd)
905                 mdelay(5);
906         else if (addr == 0xfc)
907                 mdelay(1);
908         else if (addr == 0xfb)
909                 udelay(50);
910         else if (addr == 0xfa)
911                 udelay(5);
912         else if (addr == 0xf9)
913                 udelay(1);
914         else
915                 rtl_set_bbreg(hw, addr, MASKDWORD, data);
916
917         udelay(1);
918 }
919
920 static void _rtl8821ae_phy_init_tx_power_by_rate(struct ieee80211_hw *hw)
921 {
922         struct rtl_priv *rtlpriv = rtl_priv(hw);
923         struct rtl_phy *rtlphy = &rtlpriv->phy;
924         u8 band, rfpath, txnum, rate_section;
925
926         for (band = BAND_ON_2_4G; band <= BAND_ON_5G; ++band)
927                 for (rfpath = 0; rfpath < TX_PWR_BY_RATE_NUM_RF; ++rfpath)
928                         for (txnum = 0; txnum < TX_PWR_BY_RATE_NUM_RF; ++txnum)
929                                 for (rate_section = 0;
930                                      rate_section < TX_PWR_BY_RATE_NUM_SECTION;
931                                      ++rate_section)
932                                         rtlphy->tx_power_by_rate_offset[band]
933                                             [rfpath][txnum][rate_section] = 0;
934 }
935
936 static void _rtl8821ae_phy_set_txpower_by_rate_base(struct ieee80211_hw *hw,
937                                           u8 band, u8 path,
938                                           u8 rate_section,
939                                           u8 txnum, u8 value)
940 {
941         struct rtl_priv *rtlpriv = rtl_priv(hw);
942         struct rtl_phy *rtlphy = &rtlpriv->phy;
943
944         if (path > RF90_PATH_D) {
945                 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
946                         "Invalid Rf Path %d in phy_SetTxPowerByRatBase()\n", path);
947                 return;
948         }
949
950         if (band == BAND_ON_2_4G) {
951                 switch (rate_section) {
952                 case CCK:
953                         rtlphy->txpwr_by_rate_base_24g[path][txnum][0] = value;
954                         break;
955                 case OFDM:
956                         rtlphy->txpwr_by_rate_base_24g[path][txnum][1] = value;
957                         break;
958                 case HT_MCS0_MCS7:
959                         rtlphy->txpwr_by_rate_base_24g[path][txnum][2] = value;
960                         break;
961                 case HT_MCS8_MCS15:
962                         rtlphy->txpwr_by_rate_base_24g[path][txnum][3] = value;
963                         break;
964                 case VHT_1SSMCS0_1SSMCS9:
965                         rtlphy->txpwr_by_rate_base_24g[path][txnum][4] = value;
966                         break;
967                 case VHT_2SSMCS0_2SSMCS9:
968                         rtlphy->txpwr_by_rate_base_24g[path][txnum][5] = value;
969                         break;
970                 default:
971                         RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
972                                  "Invalid RateSection %d in Band 2.4G,Rf Path %d, %dTx in PHY_SetTxPowerByRateBase()\n",
973                                  rate_section, path, txnum);
974                         break;
975                 }
976         } else if (band == BAND_ON_5G) {
977                 switch (rate_section) {
978                 case OFDM:
979                         rtlphy->txpwr_by_rate_base_5g[path][txnum][0] = value;
980                         break;
981                 case HT_MCS0_MCS7:
982                         rtlphy->txpwr_by_rate_base_5g[path][txnum][1] = value;
983                         break;
984                 case HT_MCS8_MCS15:
985                         rtlphy->txpwr_by_rate_base_5g[path][txnum][2] = value;
986                         break;
987                 case VHT_1SSMCS0_1SSMCS9:
988                         rtlphy->txpwr_by_rate_base_5g[path][txnum][3] = value;
989                         break;
990                 case VHT_2SSMCS0_2SSMCS9:
991                         rtlphy->txpwr_by_rate_base_5g[path][txnum][4] = value;
992                         break;
993                 default:
994                         RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
995                                 "Invalid RateSection %d in Band 5G, Rf Path %d, %dTx in PHY_SetTxPowerByRateBase()\n",
996                                 rate_section, path, txnum);
997                         break;
998                 }
999         } else {
1000                 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1001                         "Invalid Band %d in PHY_SetTxPowerByRateBase()\n", band);
1002         }
1003 }
1004
1005 static u8 _rtl8821ae_phy_get_txpower_by_rate_base(struct ieee80211_hw *hw,
1006                                                   u8 band, u8 path,
1007                                                   u8 txnum, u8 rate_section)
1008 {
1009         struct rtl_priv *rtlpriv = rtl_priv(hw);
1010         struct rtl_phy *rtlphy = &rtlpriv->phy;
1011         u8 value = 0;
1012
1013         if (path > RF90_PATH_D) {
1014                 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1015                          "Invalid Rf Path %d in PHY_GetTxPowerByRateBase()\n",
1016                          path);
1017                 return 0;
1018         }
1019
1020         if (band == BAND_ON_2_4G) {
1021                 switch (rate_section) {
1022                 case CCK:
1023                         value = rtlphy->txpwr_by_rate_base_24g[path][txnum][0];
1024                         break;
1025                 case OFDM:
1026                         value = rtlphy->txpwr_by_rate_base_24g[path][txnum][1];
1027                         break;
1028                 case HT_MCS0_MCS7:
1029                         value = rtlphy->txpwr_by_rate_base_24g[path][txnum][2];
1030                         break;
1031                 case HT_MCS8_MCS15:
1032                         value = rtlphy->txpwr_by_rate_base_24g[path][txnum][3];
1033                         break;
1034                 case VHT_1SSMCS0_1SSMCS9:
1035                         value = rtlphy->txpwr_by_rate_base_24g[path][txnum][4];
1036                         break;
1037                 case VHT_2SSMCS0_2SSMCS9:
1038                         value = rtlphy->txpwr_by_rate_base_24g[path][txnum][5];
1039                         break;
1040                 default:
1041                         RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1042                                  "Invalid RateSection %d in Band 2.4G, Rf Path %d, %dTx in PHY_GetTxPowerByRateBase()\n",
1043                                  rate_section, path, txnum);
1044                         break;
1045                 }
1046         } else if (band == BAND_ON_5G) {
1047                 switch (rate_section) {
1048                 case OFDM:
1049                         value = rtlphy->txpwr_by_rate_base_5g[path][txnum][0];
1050                         break;
1051                 case HT_MCS0_MCS7:
1052                         value = rtlphy->txpwr_by_rate_base_5g[path][txnum][1];
1053                         break;
1054                 case HT_MCS8_MCS15:
1055                         value = rtlphy->txpwr_by_rate_base_5g[path][txnum][2];
1056                         break;
1057                 case VHT_1SSMCS0_1SSMCS9:
1058                         value = rtlphy->txpwr_by_rate_base_5g[path][txnum][3];
1059                         break;
1060                 case VHT_2SSMCS0_2SSMCS9:
1061                         value = rtlphy->txpwr_by_rate_base_5g[path][txnum][4];
1062                         break;
1063                 default:
1064                         RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1065                                  "Invalid RateSection %d in Band 5G, Rf Path %d, %dTx in PHY_GetTxPowerByRateBase()\n",
1066                                  rate_section, path, txnum);
1067                         break;
1068                 }
1069         } else {
1070                 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1071                          "Invalid Band %d in PHY_GetTxPowerByRateBase()\n", band);
1072         }
1073
1074         return value;
1075 }
1076
1077 static void _rtl8821ae_phy_store_txpower_by_rate_base(struct ieee80211_hw *hw)
1078 {
1079         struct rtl_priv *rtlpriv = rtl_priv(hw);
1080         struct rtl_phy *rtlphy = &rtlpriv->phy;
1081         u16 rawValue = 0;
1082         u8 base = 0, path = 0;
1083
1084         for (path = RF90_PATH_A; path <= RF90_PATH_B; ++path) {
1085                 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][0] >> 24) & 0xFF;
1086                 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
1087                 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, CCK, RF_1TX, base);
1088
1089                 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][2] >> 24) & 0xFF;
1090                 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
1091                 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, OFDM, RF_1TX, base);
1092
1093                 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][4] >> 24) & 0xFF;
1094                 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
1095                 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, HT_MCS0_MCS7, RF_1TX, base);
1096
1097                 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_2TX][6] >> 24) & 0xFF;
1098                 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
1099                 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, HT_MCS8_MCS15, RF_2TX, base);
1100
1101                 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][8] >> 24) & 0xFF;
1102                 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
1103                 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, VHT_1SSMCS0_1SSMCS9, RF_1TX, base);
1104
1105                 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_2TX][11] >> 8) & 0xFF;
1106                 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
1107                 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, VHT_2SSMCS0_2SSMCS9, RF_2TX, base);
1108
1109                 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_1TX][2] >> 24) & 0xFF;
1110                 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
1111                 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, OFDM, RF_1TX, base);
1112
1113                 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_1TX][4] >> 24) & 0xFF;
1114                 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
1115                 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, HT_MCS0_MCS7, RF_1TX, base);
1116
1117                 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_2TX][6] >> 24) & 0xFF;
1118                 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
1119                 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, HT_MCS8_MCS15, RF_2TX, base);
1120
1121                 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_1TX][8] >> 24) & 0xFF;
1122                 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
1123                 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, VHT_1SSMCS0_1SSMCS9, RF_1TX, base);
1124
1125                 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_2TX][11] >> 8) & 0xFF;
1126                 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
1127                 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, VHT_2SSMCS0_2SSMCS9, RF_2TX, base);
1128         }
1129 }
1130
1131 static void _phy_convert_txpower_dbm_to_relative_value(u32 *data, u8 start,
1132                                                 u8 end, u8 base_val)
1133 {
1134         int i;
1135         u8 temp_value = 0;
1136         u32 temp_data = 0;
1137
1138         for (i = 3; i >= 0; --i) {
1139                 if (i >= start && i <= end) {
1140                         /* Get the exact value */
1141                         temp_value = (u8)(*data >> (i * 8)) & 0xF;
1142                         temp_value += ((u8)((*data >> (i * 8 + 4)) & 0xF)) * 10;
1143
1144                         /* Change the value to a relative value */
1145                         temp_value = (temp_value > base_val) ? temp_value -
1146                                         base_val : base_val - temp_value;
1147                 } else {
1148                         temp_value = (u8)(*data >> (i * 8)) & 0xFF;
1149                 }
1150                 temp_data <<= 8;
1151                 temp_data |= temp_value;
1152         }
1153         *data = temp_data;
1154 }
1155
1156 static void _rtl8812ae_phy_cross_reference_ht_and_vht_txpower_limit(struct ieee80211_hw *hw)
1157 {
1158         struct rtl_priv *rtlpriv = rtl_priv(hw);
1159         struct rtl_phy *rtlphy = &rtlpriv->phy;
1160         u8 regulation, bw, channel, rate_section;
1161         s8 temp_pwrlmt = 0;
1162
1163         for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {
1164                 for (bw = 0; bw < MAX_5G_BANDWIDTH_NUM; ++bw) {
1165                         for (channel = 0; channel < CHANNEL_MAX_NUMBER_5G; ++channel) {
1166                                 for (rate_section = 0; rate_section < MAX_RATE_SECTION_NUM; ++rate_section) {
1167                                         temp_pwrlmt = rtlphy->txpwr_limit_5g[regulation]
1168                                                 [bw][rate_section][channel][RF90_PATH_A];
1169                                         if (temp_pwrlmt == MAX_POWER_INDEX) {
1170                                                 if (bw == 0 || bw == 1) { /*5G 20M 40M VHT and HT can cross reference*/
1171                                                         RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1172                                                                 "No power limit table of the specified band %d, bandwidth %d, ratesection %d, channel %d, rf path %d\n",
1173                                                                 1, bw, rate_section, channel, RF90_PATH_A);
1174                                                         if (rate_section == 2) {
1175                                                                 rtlphy->txpwr_limit_5g[regulation][bw][2][channel][RF90_PATH_A] =
1176                                                                         rtlphy->txpwr_limit_5g[regulation][bw][4][channel][RF90_PATH_A];
1177                                                         } else if (rate_section == 4) {
1178                                                                 rtlphy->txpwr_limit_5g[regulation][bw][4][channel][RF90_PATH_A] =
1179                                                                         rtlphy->txpwr_limit_5g[regulation][bw][2][channel][RF90_PATH_A];
1180                                                         } else if (rate_section == 3) {
1181                                                                 rtlphy->txpwr_limit_5g[regulation][bw][3][channel][RF90_PATH_A] =
1182                                                                         rtlphy->txpwr_limit_5g[regulation][bw][5][channel][RF90_PATH_A];
1183                                                         } else if (rate_section == 5) {
1184                                                                 rtlphy->txpwr_limit_5g[regulation][bw][5][channel][RF90_PATH_A] =
1185                                                                         rtlphy->txpwr_limit_5g[regulation][bw][3][channel][RF90_PATH_A];
1186                                                         }
1187
1188                                                         RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "use other value %d\n", temp_pwrlmt);
1189                                                 }
1190                                         }
1191                                 }
1192                         }
1193                 }
1194         }
1195 }
1196
1197 static u8 _rtl8812ae_phy_get_txpower_by_rate_base_index(struct ieee80211_hw *hw,
1198                                                    enum band_type band, u8 rate)
1199 {
1200         struct rtl_priv *rtlpriv = rtl_priv(hw);
1201         u8 index = 0;
1202         if (band == BAND_ON_2_4G) {
1203                 switch (rate) {
1204                 case MGN_1M:
1205                 case MGN_2M:
1206                 case MGN_5_5M:
1207                 case MGN_11M:
1208                         index = 0;
1209                         break;
1210
1211                 case MGN_6M:
1212                 case MGN_9M:
1213                 case MGN_12M:
1214                 case MGN_18M:
1215                 case MGN_24M:
1216                 case MGN_36M:
1217                 case MGN_48M:
1218                 case MGN_54M:
1219                         index = 1;
1220                         break;
1221
1222                 case MGN_MCS0:
1223                 case MGN_MCS1:
1224                 case MGN_MCS2:
1225                 case MGN_MCS3:
1226                 case MGN_MCS4:
1227                 case MGN_MCS5:
1228                 case MGN_MCS6:
1229                 case MGN_MCS7:
1230                         index = 2;
1231                         break;
1232
1233                 case MGN_MCS8:
1234                 case MGN_MCS9:
1235                 case MGN_MCS10:
1236                 case MGN_MCS11:
1237                 case MGN_MCS12:
1238                 case MGN_MCS13:
1239                 case MGN_MCS14:
1240                 case MGN_MCS15:
1241                         index = 3;
1242                         break;
1243
1244                 default:
1245                         RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1246                                 "Wrong rate 0x%x to obtain index in 2.4G in PHY_GetTxPowerByRateBaseIndex()\n",
1247                                 rate);
1248                         break;
1249                 }
1250         } else if (band == BAND_ON_5G) {
1251                 switch (rate) {
1252                 case MGN_6M:
1253                 case MGN_9M:
1254                 case MGN_12M:
1255                 case MGN_18M:
1256                 case MGN_24M:
1257                 case MGN_36M:
1258                 case MGN_48M:
1259                 case MGN_54M:
1260                         index = 0;
1261                         break;
1262
1263                 case MGN_MCS0:
1264                 case MGN_MCS1:
1265                 case MGN_MCS2:
1266                 case MGN_MCS3:
1267                 case MGN_MCS4:
1268                 case MGN_MCS5:
1269                 case MGN_MCS6:
1270                 case MGN_MCS7:
1271                         index = 1;
1272                         break;
1273
1274                 case MGN_MCS8:
1275                 case MGN_MCS9:
1276                 case MGN_MCS10:
1277                 case MGN_MCS11:
1278                 case MGN_MCS12:
1279                 case MGN_MCS13:
1280                 case MGN_MCS14:
1281                 case MGN_MCS15:
1282                         index = 2;
1283                         break;
1284
1285                 case MGN_VHT1SS_MCS0:
1286                 case MGN_VHT1SS_MCS1:
1287                 case MGN_VHT1SS_MCS2:
1288                 case MGN_VHT1SS_MCS3:
1289                 case MGN_VHT1SS_MCS4:
1290                 case MGN_VHT1SS_MCS5:
1291                 case MGN_VHT1SS_MCS6:
1292                 case MGN_VHT1SS_MCS7:
1293                 case MGN_VHT1SS_MCS8:
1294                 case MGN_VHT1SS_MCS9:
1295                         index = 3;
1296                         break;
1297
1298                 case MGN_VHT2SS_MCS0:
1299                 case MGN_VHT2SS_MCS1:
1300                 case MGN_VHT2SS_MCS2:
1301                 case MGN_VHT2SS_MCS3:
1302                 case MGN_VHT2SS_MCS4:
1303                 case MGN_VHT2SS_MCS5:
1304                 case MGN_VHT2SS_MCS6:
1305                 case MGN_VHT2SS_MCS7:
1306                 case MGN_VHT2SS_MCS8:
1307                 case MGN_VHT2SS_MCS9:
1308                         index = 4;
1309                         break;
1310
1311                 default:
1312                         RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1313                                 "Wrong rate 0x%x to obtain index in 5G in PHY_GetTxPowerByRateBaseIndex()\n",
1314                                 rate);
1315                         break;
1316                 }
1317         }
1318
1319         return index;
1320 }
1321
1322 static void _rtl8812ae_phy_convert_txpower_limit_to_power_index(struct ieee80211_hw *hw)
1323 {
1324         struct rtl_priv *rtlpriv = rtl_priv(hw);
1325         struct rtl_phy *rtlphy = &rtlpriv->phy;
1326         u8 bw40_pwr_base_dbm2_4G, bw40_pwr_base_dbm5G;
1327         u8 regulation, bw, channel, rate_section;
1328         u8 base_index2_4G = 0;
1329         u8 base_index5G = 0;
1330         s8 temp_value = 0, temp_pwrlmt = 0;
1331         u8 rf_path = 0;
1332
1333         RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1334                 "=====> _rtl8812ae_phy_convert_txpower_limit_to_power_index()\n");
1335
1336         _rtl8812ae_phy_cross_reference_ht_and_vht_txpower_limit(hw);
1337
1338         for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {
1339                 for (bw = 0; bw < MAX_2_4G_BANDWIDTH_NUM; ++bw) {
1340                         for (channel = 0; channel < CHANNEL_MAX_NUMBER_2G; ++channel) {
1341                                 for (rate_section = 0; rate_section < MAX_RATE_SECTION_NUM; ++rate_section) {
1342                                         /* obtain the base dBm values in 2.4G band
1343                                          CCK => 11M, OFDM => 54M, HT 1T => MCS7, HT 2T => MCS15*/
1344                                         if (rate_section == 0) { /*CCK*/
1345                                                 base_index2_4G =
1346                                                         _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1347                                                         BAND_ON_2_4G, MGN_11M);
1348                                         } else if (rate_section == 1) { /*OFDM*/
1349                                                 base_index2_4G =
1350                                                         _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1351                                                         BAND_ON_2_4G, MGN_54M);
1352                                         } else if (rate_section == 2) { /*HT IT*/
1353                                                 base_index2_4G =
1354                                                         _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1355                                                         BAND_ON_2_4G, MGN_MCS7);
1356                                         } else if (rate_section == 3) { /*HT 2T*/
1357                                                 base_index2_4G =
1358                                                         _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1359                                                         BAND_ON_2_4G, MGN_MCS15);
1360                                         }
1361
1362                                         temp_pwrlmt = rtlphy->txpwr_limit_2_4g[regulation]
1363                                                 [bw][rate_section][channel][RF90_PATH_A];
1364
1365                                         for (rf_path = RF90_PATH_A;
1366                                                 rf_path < MAX_RF_PATH_NUM;
1367                                                 ++rf_path) {
1368                                                 if (rate_section == 3)
1369                                                         bw40_pwr_base_dbm2_4G =
1370                                                         rtlphy->txpwr_by_rate_base_24g[rf_path][RF_2TX][base_index2_4G];
1371                                                 else
1372                                                         bw40_pwr_base_dbm2_4G =
1373                                                         rtlphy->txpwr_by_rate_base_24g[rf_path][RF_1TX][base_index2_4G];
1374
1375                                                 if (temp_pwrlmt != MAX_POWER_INDEX) {
1376                                                         temp_value = temp_pwrlmt - bw40_pwr_base_dbm2_4G;
1377                                                         rtlphy->txpwr_limit_2_4g[regulation]
1378                                                                 [bw][rate_section][channel][rf_path] =
1379                                                                 temp_value;
1380                                                 }
1381
1382                                                 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1383                                                         "TxPwrLimit_2_4G[regulation %d][bw %d][rateSection %d][channel %d] = %d\n(TxPwrLimit in dBm %d - BW40PwrLmt2_4G[channel %d][rfPath %d] %d)\n",
1384                                                         regulation, bw, rate_section, channel,
1385                                                         rtlphy->txpwr_limit_2_4g[regulation][bw]
1386                                                         [rate_section][channel][rf_path], (temp_pwrlmt == 63)
1387                                                         ? 0 : temp_pwrlmt/2, channel, rf_path,
1388                                                         bw40_pwr_base_dbm2_4G);
1389                                         }
1390                                 }
1391                         }
1392                 }
1393         }
1394         for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {
1395                 for (bw = 0; bw < MAX_5G_BANDWIDTH_NUM; ++bw) {
1396                         for (channel = 0; channel < CHANNEL_MAX_NUMBER_5G; ++channel) {
1397                                 for (rate_section = 0; rate_section < MAX_RATE_SECTION_NUM; ++rate_section) {
1398                                         /* obtain the base dBm values in 5G band
1399                                          OFDM => 54M, HT 1T => MCS7, HT 2T => MCS15,
1400                                         VHT => 1SSMCS7, VHT 2T => 2SSMCS7*/
1401                                         if (rate_section == 1) { /*OFDM*/
1402                                                 base_index5G =
1403                                                         _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1404                                                         BAND_ON_5G, MGN_54M);
1405                                         } else if (rate_section == 2) { /*HT 1T*/
1406                                                 base_index5G =
1407                                                         _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1408                                                         BAND_ON_5G, MGN_MCS7);
1409                                         } else if (rate_section == 3) { /*HT 2T*/
1410                                                 base_index5G =
1411                                                         _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1412                                                         BAND_ON_5G, MGN_MCS15);
1413                                         } else if (rate_section == 4) { /*VHT 1T*/
1414                                                 base_index5G =
1415                                                         _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1416                                                         BAND_ON_5G, MGN_VHT1SS_MCS7);
1417                                         } else if (rate_section == 5) { /*VHT 2T*/
1418                                                 base_index5G =
1419                                                         _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1420                                                         BAND_ON_5G, MGN_VHT2SS_MCS7);
1421                                         }
1422
1423                                         temp_pwrlmt = rtlphy->txpwr_limit_5g[regulation]
1424                                                 [bw][rate_section][channel]
1425                                                 [RF90_PATH_A];
1426
1427                                         for (rf_path = RF90_PATH_A;
1428                                              rf_path < MAX_RF_PATH_NUM;
1429                                              ++rf_path) {
1430                                                 if (rate_section == 3 || rate_section == 5)
1431                                                         bw40_pwr_base_dbm5G =
1432                                                         rtlphy->txpwr_by_rate_base_5g[rf_path]
1433                                                         [RF_2TX][base_index5G];
1434                                                 else
1435                                                         bw40_pwr_base_dbm5G =
1436                                                         rtlphy->txpwr_by_rate_base_5g[rf_path]
1437                                                         [RF_1TX][base_index5G];
1438
1439                                                 if (temp_pwrlmt != MAX_POWER_INDEX) {
1440                                                         temp_value =
1441                                                                 temp_pwrlmt - bw40_pwr_base_dbm5G;
1442                                                         rtlphy->txpwr_limit_5g[regulation]
1443                                                                 [bw][rate_section][channel]
1444                                                                 [rf_path] = temp_value;
1445                                                 }
1446
1447                                                 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1448                                                         "TxPwrLimit_5G[regulation %d][bw %d][rateSection %d][channel %d] =%d\n(TxPwrLimit in dBm %d - BW40PwrLmt5G[chnl group %d][rfPath %d] %d)\n",
1449                                                         regulation, bw, rate_section,
1450                                                         channel, rtlphy->txpwr_limit_5g[regulation]
1451                                                         [bw][rate_section][channel][rf_path],
1452                                                         temp_pwrlmt, channel, rf_path, bw40_pwr_base_dbm5G);
1453                                         }
1454                                 }
1455                         }
1456                 }
1457         }
1458         RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1459                  "<===== _rtl8812ae_phy_convert_txpower_limit_to_power_index()\n");
1460 }
1461
1462 static void _rtl8821ae_phy_init_txpower_limit(struct ieee80211_hw *hw)
1463 {
1464         struct rtl_priv *rtlpriv = rtl_priv(hw);
1465         struct rtl_phy *rtlphy = &rtlpriv->phy;
1466         u8 i, j, k, l, m;
1467
1468         RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1469                  "=====> _rtl8821ae_phy_init_txpower_limit()!\n");
1470
1471         for (i = 0; i < MAX_REGULATION_NUM; ++i) {
1472                 for (j = 0; j < MAX_2_4G_BANDWIDTH_NUM; ++j)
1473                         for (k = 0; k < MAX_RATE_SECTION_NUM; ++k)
1474                                 for (m = 0; m < CHANNEL_MAX_NUMBER_2G; ++m)
1475                                         for (l = 0; l < MAX_RF_PATH_NUM; ++l)
1476                                                 rtlphy->txpwr_limit_2_4g
1477                                                                 [i][j][k][m][l]
1478                                                         = MAX_POWER_INDEX;
1479         }
1480         for (i = 0; i < MAX_REGULATION_NUM; ++i) {
1481                 for (j = 0; j < MAX_5G_BANDWIDTH_NUM; ++j)
1482                         for (k = 0; k < MAX_RATE_SECTION_NUM; ++k)
1483                                 for (m = 0; m < CHANNEL_MAX_NUMBER_5G; ++m)
1484                                         for (l = 0; l < MAX_RF_PATH_NUM; ++l)
1485                                                 rtlphy->txpwr_limit_5g
1486                                                                 [i][j][k][m][l]
1487                                                         = MAX_POWER_INDEX;
1488         }
1489
1490         RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1491                  "<===== _rtl8821ae_phy_init_txpower_limit()!\n");
1492 }
1493
1494 static void _rtl8821ae_phy_convert_txpower_dbm_to_relative_value(struct ieee80211_hw *hw)
1495 {
1496         struct rtl_priv *rtlpriv = rtl_priv(hw);
1497         struct rtl_phy *rtlphy = &rtlpriv->phy;
1498         u8 base = 0, rfPath = 0;
1499
1500         for (rfPath = RF90_PATH_A; rfPath <= RF90_PATH_B; ++rfPath) {
1501                 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfPath, RF_1TX, CCK);
1502                 _phy_convert_txpower_dbm_to_relative_value(
1503                         &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][0],
1504                         0, 3, base);
1505
1506                 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfPath, RF_1TX, OFDM);
1507                 _phy_convert_txpower_dbm_to_relative_value(
1508                         &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][1],
1509                         0, 3, base);
1510                 _phy_convert_txpower_dbm_to_relative_value(
1511                         &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][2],
1512                         0, 3, base);
1513
1514                 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfPath, RF_1TX, HT_MCS0_MCS7);
1515                 _phy_convert_txpower_dbm_to_relative_value(
1516                         &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][3],
1517                         0, 3, base);
1518                 _phy_convert_txpower_dbm_to_relative_value(
1519                         &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][4],
1520                         0, 3, base);
1521
1522                 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfPath, RF_2TX, HT_MCS8_MCS15);
1523
1524                 _phy_convert_txpower_dbm_to_relative_value(
1525                         &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_2TX][5],
1526                         0, 3, base);
1527
1528                 _phy_convert_txpower_dbm_to_relative_value(
1529                         &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_2TX][6],
1530                         0, 3, base);
1531
1532                 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfPath, RF_1TX, VHT_1SSMCS0_1SSMCS9);
1533                 _phy_convert_txpower_dbm_to_relative_value(
1534                         &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][7],
1535                         0, 3, base);
1536                 _phy_convert_txpower_dbm_to_relative_value(
1537                         &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][8],
1538                         0, 3, base);
1539                 _phy_convert_txpower_dbm_to_relative_value(
1540                         &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][9],
1541                         0, 1, base);
1542
1543                 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfPath, RF_2TX, VHT_2SSMCS0_2SSMCS9);
1544                 _phy_convert_txpower_dbm_to_relative_value(
1545                         &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][9],
1546                         2, 3, base);
1547                 _phy_convert_txpower_dbm_to_relative_value(
1548                         &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_2TX][10],
1549                         0, 3, base);
1550                 _phy_convert_txpower_dbm_to_relative_value(
1551                         &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_2TX][11],
1552                         0, 3, base);
1553
1554                 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfPath, RF_1TX, OFDM);
1555                 _phy_convert_txpower_dbm_to_relative_value(
1556                         &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_1TX][1],
1557                         0, 3, base);
1558                 _phy_convert_txpower_dbm_to_relative_value(
1559                         &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_1TX][2],
1560                         0, 3, base);
1561
1562                 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfPath, RF_1TX, HT_MCS0_MCS7);
1563                 _phy_convert_txpower_dbm_to_relative_value(
1564                         &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_1TX][3],
1565                         0, 3, base);
1566                 _phy_convert_txpower_dbm_to_relative_value(
1567                         &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_1TX][4],
1568                         0, 3, base);
1569
1570                 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfPath, RF_2TX, HT_MCS8_MCS15);
1571                 _phy_convert_txpower_dbm_to_relative_value(
1572                         &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_2TX][5],
1573                         0, 3, base);
1574                 _phy_convert_txpower_dbm_to_relative_value(
1575                         &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_2TX][6],
1576                         0, 3, base);
1577
1578                 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfPath, RF_1TX, VHT_1SSMCS0_1SSMCS9);
1579                 _phy_convert_txpower_dbm_to_relative_value(
1580                         &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_1TX][7],
1581                         0, 3, base);
1582                 _phy_convert_txpower_dbm_to_relative_value(
1583                         &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_1TX][8],
1584                         0, 3, base);
1585                 _phy_convert_txpower_dbm_to_relative_value(
1586                         &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_1TX][9],
1587                         0, 1, base);
1588
1589                 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfPath, RF_2TX, VHT_2SSMCS0_2SSMCS9);
1590                 _phy_convert_txpower_dbm_to_relative_value(
1591                         &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_1TX][9],
1592                         2, 3, base);
1593                 _phy_convert_txpower_dbm_to_relative_value(
1594                         &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_2TX][10],
1595                         0, 3, base);
1596                 _phy_convert_txpower_dbm_to_relative_value(
1597                         &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_2TX][11],
1598                         0, 3, base);
1599         }
1600
1601         RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
1602                 "<===_rtl8821ae_phy_convert_txpower_dbm_to_relative_value()\n");
1603 }
1604
1605 static void _rtl8821ae_phy_txpower_by_rate_configuration(struct ieee80211_hw *hw)
1606 {
1607         _rtl8821ae_phy_store_txpower_by_rate_base(hw);
1608         _rtl8821ae_phy_convert_txpower_dbm_to_relative_value(hw);
1609 }
1610
1611 /* string is in decimal */
1612 static bool _rtl8812ae_get_integer_from_string(char *str, u8 *pint)
1613 {
1614         u16 i = 0;
1615         *pint = 0;
1616
1617         while (str[i] != '\0') {
1618                 if (str[i] >= '0' && str[i] <= '9') {
1619                         *pint *= 10;
1620                         *pint += (str[i] - '0');
1621                 } else {
1622                         return false;
1623                 }
1624                 ++i;
1625         }
1626
1627         return true;
1628 }
1629
1630 static bool _rtl8812ae_eq_n_byte(u8 *str1, u8 *str2, u32 num)
1631 {
1632         if (num == 0)
1633                 return false;
1634         while (num > 0) {
1635                 num--;
1636                 if (str1[num] != str2[num])
1637                         return false;
1638         }
1639         return true;
1640 }
1641
1642 static s8 _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(struct ieee80211_hw *hw,
1643                                               u8 band, u8 channel)
1644 {
1645         struct rtl_priv *rtlpriv = rtl_priv(hw);
1646         s8 channel_index = -1;
1647         u8  i = 0;
1648
1649         if (band == BAND_ON_2_4G)
1650                 channel_index = channel - 1;
1651         else if (band == BAND_ON_5G) {
1652                 for (i = 0; i < sizeof(channel5g)/sizeof(u8); ++i) {
1653                         if (channel5g[i] == channel)
1654                                 channel_index = i;
1655                 }
1656         } else
1657                 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "Invalid Band %d in %s\n",
1658                          band,  __func__);
1659
1660         if (channel_index == -1)
1661                 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1662                          "Invalid Channel %d of Band %d in %s\n", channel,
1663                          band, __func__);
1664
1665         return channel_index;
1666 }
1667
1668 static void _rtl8812ae_phy_set_txpower_limit(struct ieee80211_hw *hw, u8 *pregulation,
1669                                       u8 *pband, u8 *pbandwidth,
1670                                       u8 *prate_section, u8 *prf_path,
1671                                       u8 *pchannel, u8 *ppower_limit)
1672 {
1673         struct rtl_priv *rtlpriv = rtl_priv(hw);
1674         struct rtl_phy *rtlphy = &rtlpriv->phy;
1675         u8 regulation = 0, bandwidth = 0, rate_section = 0, channel;
1676         u8 channel_index;
1677         s8 power_limit = 0, prev_power_limit, ret;
1678
1679         if (!_rtl8812ae_get_integer_from_string((char *)pchannel, &channel) ||
1680             !_rtl8812ae_get_integer_from_string((char *)ppower_limit,
1681                                                 &power_limit)) {
1682                 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1683                          "Illegal index of pwr_lmt table [chnl %d][val %d]\n",
1684                           channel, power_limit);
1685         }
1686
1687         power_limit = power_limit > MAX_POWER_INDEX ?
1688                       MAX_POWER_INDEX : power_limit;
1689
1690         if (_rtl8812ae_eq_n_byte(pregulation, (u8 *)("FCC"), 3))
1691                 regulation = 0;
1692         else if (_rtl8812ae_eq_n_byte(pregulation, (u8 *)("MKK"), 3))
1693                 regulation = 1;
1694         else if (_rtl8812ae_eq_n_byte(pregulation, (u8 *)("ETSI"), 4))
1695                 regulation = 2;
1696         else if (_rtl8812ae_eq_n_byte(pregulation, (u8 *)("WW13"), 4))
1697                 regulation = 3;
1698
1699         if (_rtl8812ae_eq_n_byte(prate_section, (u8 *)("CCK"), 3))
1700                 rate_section = 0;
1701         else if (_rtl8812ae_eq_n_byte(prate_section, (u8 *)("OFDM"), 4))
1702                 rate_section = 1;
1703         else if (_rtl8812ae_eq_n_byte(prate_section, (u8 *)("HT"), 2) &&
1704                  _rtl8812ae_eq_n_byte(prf_path, (u8 *)("1T"), 2))
1705                 rate_section = 2;
1706         else if (_rtl8812ae_eq_n_byte(prate_section, (u8 *)("HT"), 2) &&
1707                  _rtl8812ae_eq_n_byte(prf_path, (u8 *)("2T"), 2))
1708                 rate_section = 3;
1709         else if (_rtl8812ae_eq_n_byte(prate_section, (u8 *)("VHT"), 3) &&
1710                  _rtl8812ae_eq_n_byte(prf_path, (u8 *)("1T"), 2))
1711                 rate_section = 4;
1712         else if (_rtl8812ae_eq_n_byte(prate_section, (u8 *)("VHT"), 3) &&
1713                  _rtl8812ae_eq_n_byte(prf_path, (u8 *)("2T"), 2))
1714                 rate_section = 5;
1715
1716         if (_rtl8812ae_eq_n_byte(pbandwidth, (u8 *)("20M"), 3))
1717                 bandwidth = 0;
1718         else if (_rtl8812ae_eq_n_byte(pbandwidth, (u8 *)("40M"), 3))
1719                 bandwidth = 1;
1720         else if (_rtl8812ae_eq_n_byte(pbandwidth, (u8 *)("80M"), 3))
1721                 bandwidth = 2;
1722         else if (_rtl8812ae_eq_n_byte(pbandwidth, (u8 *)("160M"), 4))
1723                 bandwidth = 3;
1724
1725         if (_rtl8812ae_eq_n_byte(pband, (u8 *)("2.4G"), 4)) {
1726                 ret = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw,
1727                                                                BAND_ON_2_4G,
1728                                                                channel);
1729
1730                 if (ret == -1)
1731                         return;
1732
1733                 channel_index = ret;
1734
1735                 prev_power_limit = rtlphy->txpwr_limit_2_4g[regulation]
1736                                                 [bandwidth][rate_section]
1737                                                 [channel_index][RF90_PATH_A];
1738
1739                 if (power_limit < prev_power_limit)
1740                         rtlphy->txpwr_limit_2_4g[regulation][bandwidth]
1741                                 [rate_section][channel_index][RF90_PATH_A] =
1742                                                                    power_limit;
1743
1744                 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1745                          "2.4G [regula %d][bw %d][sec %d][chnl %d][val %d]\n",
1746                           regulation, bandwidth, rate_section, channel_index,
1747                           rtlphy->txpwr_limit_2_4g[regulation][bandwidth]
1748                                 [rate_section][channel_index][RF90_PATH_A]);
1749         } else if (_rtl8812ae_eq_n_byte(pband, (u8 *)("5G"), 2)) {
1750                 ret = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw,
1751                                                                BAND_ON_5G,
1752                                                                channel);
1753
1754                 if (ret == -1)
1755                         return;
1756
1757                 channel_index = ret;
1758
1759                 prev_power_limit = rtlphy->txpwr_limit_5g[regulation][bandwidth]
1760                                                 [rate_section][channel_index]
1761                                                 [RF90_PATH_A];
1762
1763                 if (power_limit < prev_power_limit)
1764                         rtlphy->txpwr_limit_5g[regulation][bandwidth]
1765                         [rate_section][channel_index][RF90_PATH_A] = power_limit;
1766
1767                 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1768                          "5G: [regul %d][bw %d][sec %d][chnl %d][val %d]\n",
1769                           regulation, bandwidth, rate_section, channel,
1770                           rtlphy->txpwr_limit_5g[regulation][bandwidth]
1771                                 [rate_section][channel_index][RF90_PATH_A]);
1772         } else {
1773                 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1774                          "Cannot recognize the band info in %s\n", pband);
1775                 return;
1776         }
1777 }
1778
1779 static void _rtl8812ae_phy_config_bb_txpwr_lmt(struct ieee80211_hw *hw,
1780                                           u8 *regulation, u8 *band,
1781                                           u8 *bandwidth, u8 *rate_section,
1782                                           u8 *rf_path, u8 *channel,
1783                                           u8 *power_limit)
1784 {
1785         _rtl8812ae_phy_set_txpower_limit(hw, regulation, band, bandwidth,
1786                                          rate_section, rf_path, channel,
1787                                          power_limit);
1788 }
1789
1790 static void _rtl8821ae_phy_read_and_config_txpwr_lmt(struct ieee80211_hw *hw)
1791 {
1792         struct rtl_priv *rtlpriv = rtl_priv(hw);
1793         struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1794         u32 i = 0;
1795         u32 array_len;
1796         u8 **array;
1797
1798         if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
1799                 array_len = RTL8812AE_TXPWR_LMT_ARRAY_LEN;
1800                 array = RTL8812AE_TXPWR_LMT;
1801         } else {
1802                 array_len = RTL8821AE_TXPWR_LMT_ARRAY_LEN;
1803                 array = RTL8821AE_TXPWR_LMT;
1804         }
1805
1806         RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1807                  "\n");
1808
1809         for (i = 0; i < array_len; i += 7) {
1810                 u8 *regulation = array[i];
1811                 u8 *band = array[i+1];
1812                 u8 *bandwidth = array[i+2];
1813                 u8 *rate = array[i+3];
1814                 u8 *rf_path = array[i+4];
1815                 u8 *chnl = array[i+5];
1816                 u8 *val = array[i+6];
1817
1818                 _rtl8812ae_phy_config_bb_txpwr_lmt(hw, regulation, band,
1819                                                    bandwidth, rate, rf_path,
1820                                                    chnl, val);
1821         }
1822 }
1823
1824 static bool _rtl8821ae_phy_bb8821a_config_parafile(struct ieee80211_hw *hw)
1825 {
1826         struct rtl_priv *rtlpriv = rtl_priv(hw);
1827         struct rtl_phy *rtlphy = &rtlpriv->phy;
1828         struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1829         bool rtstatus;
1830
1831         _rtl8821ae_phy_init_txpower_limit(hw);
1832
1833         /* RegEnableTxPowerLimit == 1 for 8812a & 8821a */
1834         if (rtlefuse->eeprom_regulatory != 2)
1835                 _rtl8821ae_phy_read_and_config_txpwr_lmt(hw);
1836
1837         rtstatus = _rtl8821ae_phy_config_bb_with_headerfile(hw,
1838                                                        BASEBAND_CONFIG_PHY_REG);
1839         if (rtstatus != true) {
1840                 pr_err("Write BB Reg Fail!!\n");
1841                 return false;
1842         }
1843         _rtl8821ae_phy_init_tx_power_by_rate(hw);
1844         if (rtlefuse->autoload_failflag == false) {
1845                 rtstatus = _rtl8821ae_phy_config_bb_with_pgheaderfile(hw,
1846                                                     BASEBAND_CONFIG_PHY_REG);
1847         }
1848         if (rtstatus != true) {
1849                 pr_err("BB_PG Reg Fail!!\n");
1850                 return false;
1851         }
1852
1853         _rtl8821ae_phy_txpower_by_rate_configuration(hw);
1854
1855         /* RegEnableTxPowerLimit == 1 for 8812a & 8821a */
1856         if (rtlefuse->eeprom_regulatory != 2)
1857                 _rtl8812ae_phy_convert_txpower_limit_to_power_index(hw);
1858
1859         rtstatus = _rtl8821ae_phy_config_bb_with_headerfile(hw,
1860                                                 BASEBAND_CONFIG_AGC_TAB);
1861
1862         if (rtstatus != true) {
1863                 pr_err("AGC Table Fail\n");
1864                 return false;
1865         }
1866         rtlphy->cck_high_power = (bool)(rtl_get_bbreg(hw,
1867                         RFPGA0_XA_HSSIPARAMETER2, 0x200));
1868         return true;
1869 }
1870
1871 static bool
1872 __rtl8821ae_phy_config_with_headerfile(struct ieee80211_hw *hw,
1873                                        u32 *array_table, u16 arraylen,
1874                                        void (*set_reg)(struct ieee80211_hw *hw,
1875                                                        u32 regaddr, u32 data))
1876 {
1877         #define COND_ELSE  2
1878         #define COND_ENDIF 3
1879
1880         int i = 0;
1881         u8 cond;
1882         bool matched = true, skipped = false;
1883
1884         while ((i + 1) < arraylen) {
1885                 u32 v1 = array_table[i];
1886                 u32 v2 = array_table[i + 1];
1887
1888                 if (v1 & (BIT(31) | BIT(30))) {/*positive & negative condition*/
1889                         if (v1 & BIT(31)) {/* positive condition*/
1890                                 cond  = (u8)((v1 & (BIT(29) | BIT(28))) >> 28);
1891                                 if (cond == COND_ENDIF) {/*end*/
1892                                         matched = true;
1893                                         skipped = false;
1894                                 } else if (cond == COND_ELSE) /*else*/
1895                                         matched = skipped ? false : true;
1896                                 else {/*if , else if*/
1897                                         if (skipped) {
1898                                                 matched = false;
1899                                         } else {
1900                                                 if (_rtl8821ae_check_positive(
1901                                                                 hw, v1, v2)) {
1902                                                         matched = true;
1903                                                         skipped = true;
1904                                                 } else {
1905                                                         matched = false;
1906                                                         skipped = false;
1907                                                 }
1908                                         }
1909                                 }
1910                         } else if (v1 & BIT(30)) { /*negative condition*/
1911                         /*do nothing*/
1912                         }
1913                 } else {
1914                         if (matched)
1915                                 set_reg(hw, v1, v2);
1916                 }
1917                 i = i + 2;
1918         }
1919
1920         return true;
1921 }
1922
1923 static bool _rtl8821ae_phy_config_mac_with_headerfile(struct ieee80211_hw *hw)
1924 {
1925         struct rtl_priv *rtlpriv = rtl_priv(hw);
1926         struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1927         u32 arraylength;
1928         u32 *ptrarray;
1929
1930         RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Read MAC_REG_Array\n");
1931         if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1932                 arraylength = RTL8821AE_MAC_1T_ARRAYLEN;
1933                 ptrarray = RTL8821AE_MAC_REG_ARRAY;
1934         } else {
1935                 arraylength = RTL8812AE_MAC_1T_ARRAYLEN;
1936                 ptrarray = RTL8812AE_MAC_REG_ARRAY;
1937         }
1938         RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1939                  "Img: MAC_REG_ARRAY LEN %d\n", arraylength);
1940
1941         return __rtl8821ae_phy_config_with_headerfile(hw,
1942                         ptrarray, arraylength, rtl_write_byte_with_val32);
1943 }
1944
1945 static bool _rtl8821ae_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
1946                                                      u8 configtype)
1947 {
1948         struct rtl_priv *rtlpriv = rtl_priv(hw);
1949         struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1950         u32 *array_table;
1951         u16 arraylen;
1952
1953         if (configtype == BASEBAND_CONFIG_PHY_REG) {
1954                 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
1955                         arraylen = RTL8812AE_PHY_REG_1TARRAYLEN;
1956                         array_table = RTL8812AE_PHY_REG_ARRAY;
1957                 } else {
1958                         arraylen = RTL8821AE_PHY_REG_1TARRAYLEN;
1959                         array_table = RTL8821AE_PHY_REG_ARRAY;
1960                 }
1961
1962                 return __rtl8821ae_phy_config_with_headerfile(hw,
1963                                 array_table, arraylen,
1964                                 _rtl8821ae_config_bb_reg);
1965         } else if (configtype == BASEBAND_CONFIG_AGC_TAB) {
1966                 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
1967                         arraylen = RTL8812AE_AGC_TAB_1TARRAYLEN;
1968                         array_table = RTL8812AE_AGC_TAB_ARRAY;
1969                 } else {
1970                         arraylen = RTL8821AE_AGC_TAB_1TARRAYLEN;
1971                         array_table = RTL8821AE_AGC_TAB_ARRAY;
1972                 }
1973
1974                 return __rtl8821ae_phy_config_with_headerfile(hw,
1975                                 array_table, arraylen,
1976                                 rtl_set_bbreg_with_dwmask);
1977         }
1978         return true;
1979 }
1980
1981 static u8 _rtl8821ae_get_rate_section_index(u32 regaddr)
1982 {
1983         u8 index = 0;
1984         regaddr &= 0xFFF;
1985         if (regaddr >= 0xC20 && regaddr <= 0xC4C)
1986                 index = (u8)((regaddr - 0xC20) / 4);
1987         else if (regaddr >= 0xE20 && regaddr <= 0xE4C)
1988                 index = (u8)((regaddr - 0xE20) / 4);
1989         else
1990                 WARN_ONCE(true,
1991                           "rtl8821ae: Invalid RegAddr 0x%x\n", regaddr);
1992         return index;
1993 }
1994
1995 static void _rtl8821ae_store_tx_power_by_rate(struct ieee80211_hw *hw,
1996                                               u32 band, u32 rfpath,
1997                                               u32 txnum, u32 regaddr,
1998                                               u32 bitmask, u32 data)
1999 {
2000         struct rtl_priv *rtlpriv = rtl_priv(hw);
2001         struct rtl_phy *rtlphy = &rtlpriv->phy;
2002         u8 rate_section = _rtl8821ae_get_rate_section_index(regaddr);
2003
2004         if (band != BAND_ON_2_4G && band != BAND_ON_5G) {
2005                 RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid Band %d\n", band);
2006                 band = BAND_ON_2_4G;
2007         }
2008         if (rfpath >= MAX_RF_PATH) {
2009                 RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid RfPath %d\n", rfpath);
2010                 rfpath = MAX_RF_PATH - 1;
2011         }
2012         if (txnum >= MAX_RF_PATH) {
2013                 RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid TxNum %d\n", txnum);
2014                 txnum = MAX_RF_PATH - 1;
2015         }
2016         rtlphy->tx_power_by_rate_offset[band][rfpath][txnum][rate_section] = data;
2017         RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2018                  "TxPwrByRateOffset[Band %d][RfPath %d][TxNum %d][RateSection %d] = 0x%x\n",
2019                  band, rfpath, txnum, rate_section,
2020                  rtlphy->tx_power_by_rate_offset[band][rfpath][txnum][rate_section]);
2021 }
2022
2023 static bool _rtl8821ae_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
2024                                                         u8 configtype)
2025 {
2026         struct rtl_priv *rtlpriv = rtl_priv(hw);
2027         struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
2028         int i;
2029         u32 *array;
2030         u16 arraylen;
2031         u32 v1, v2, v3, v4, v5, v6;
2032
2033         if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
2034                 arraylen = RTL8812AE_PHY_REG_ARRAY_PGLEN;
2035                 array = RTL8812AE_PHY_REG_ARRAY_PG;
2036         } else {
2037                 arraylen = RTL8821AE_PHY_REG_ARRAY_PGLEN;
2038                 array = RTL8821AE_PHY_REG_ARRAY_PG;
2039         }
2040
2041         if (configtype != BASEBAND_CONFIG_PHY_REG) {
2042                 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
2043                          "configtype != BaseBand_Config_PHY_REG\n");
2044                 return true;
2045         }
2046         for (i = 0; i < arraylen; i += 6) {
2047                 v1 = array[i];
2048                 v2 = array[i+1];
2049                 v3 = array[i+2];
2050                 v4 = array[i+3];
2051                 v5 = array[i+4];
2052                 v6 = array[i+5];
2053
2054                 if (v1 < 0xCDCDCDCD) {
2055                         if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE &&
2056                                 (v4 == 0xfe || v4 == 0xffe)) {
2057                                 msleep(50);
2058                                 continue;
2059                         }
2060
2061                         if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
2062                                 if (v4 == 0xfe)
2063                                         msleep(50);
2064                                 else if (v4 == 0xfd)
2065                                         mdelay(5);
2066                                 else if (v4 == 0xfc)
2067                                         mdelay(1);
2068                                 else if (v4 == 0xfb)
2069                                         udelay(50);
2070                                 else if (v4 == 0xfa)
2071                                         udelay(5);
2072                                 else if (v4 == 0xf9)
2073                                         udelay(1);
2074                         }
2075                         _rtl8821ae_store_tx_power_by_rate(hw, v1, v2, v3,
2076                                                           v4, v5, v6);
2077                         continue;
2078                 } else {
2079                          /*don't need the hw_body*/
2080                         if (!_rtl8821ae_check_condition(hw, v1)) {
2081                                 i += 2; /* skip the pair of expression*/
2082                                 v1 = array[i];
2083                                 v2 = array[i+1];
2084                                 v3 = array[i+2];
2085                                 while (v2 != 0xDEAD) {
2086                                         i += 3;
2087                                         v1 = array[i];
2088                                         v2 = array[i+1];
2089                                         v3 = array[i+2];
2090                                 }
2091                         }
2092                 }
2093         }
2094
2095         return true;
2096 }
2097
2098 bool rtl8812ae_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
2099                                              enum radio_path rfpath)
2100 {
2101         bool rtstatus = true;
2102         u32 *radioa_array_table_a, *radioa_array_table_b;
2103         u16 radioa_arraylen_a, radioa_arraylen_b;
2104         struct rtl_priv *rtlpriv = rtl_priv(hw);
2105
2106         radioa_arraylen_a = RTL8812AE_RADIOA_1TARRAYLEN;
2107         radioa_array_table_a = RTL8812AE_RADIOA_ARRAY;
2108         radioa_arraylen_b = RTL8812AE_RADIOB_1TARRAYLEN;
2109         radioa_array_table_b = RTL8812AE_RADIOB_ARRAY;
2110         RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2111                  "Radio_A:RTL8821AE_RADIOA_ARRAY %d\n", radioa_arraylen_a);
2112         RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath);
2113         rtstatus = true;
2114         switch (rfpath) {
2115         case RF90_PATH_A:
2116                 return __rtl8821ae_phy_config_with_headerfile(hw,
2117                                 radioa_array_table_a, radioa_arraylen_a,
2118                                 _rtl8821ae_config_rf_radio_a);
2119                 break;
2120         case RF90_PATH_B:
2121                 return __rtl8821ae_phy_config_with_headerfile(hw,
2122                                 radioa_array_table_b, radioa_arraylen_b,
2123                                 _rtl8821ae_config_rf_radio_b);
2124                 break;
2125         case RF90_PATH_C:
2126         case RF90_PATH_D:
2127                 pr_err("switch case %#x not processed\n", rfpath);
2128                 break;
2129         }
2130         return true;
2131 }
2132
2133 bool rtl8821ae_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
2134                                                 enum radio_path rfpath)
2135 {
2136         bool rtstatus = true;
2137         u32 *radioa_array_table;
2138         u16 radioa_arraylen;
2139         struct rtl_priv *rtlpriv = rtl_priv(hw);
2140
2141         radioa_arraylen = RTL8821AE_RADIOA_1TARRAYLEN;
2142         radioa_array_table = RTL8821AE_RADIOA_ARRAY;
2143         RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2144                  "Radio_A:RTL8821AE_RADIOA_ARRAY %d\n", radioa_arraylen);
2145         RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath);
2146         rtstatus = true;
2147         switch (rfpath) {
2148         case RF90_PATH_A:
2149                 return __rtl8821ae_phy_config_with_headerfile(hw,
2150                         radioa_array_table, radioa_arraylen,
2151                         _rtl8821ae_config_rf_radio_a);
2152                 break;
2153
2154         case RF90_PATH_B:
2155         case RF90_PATH_C:
2156         case RF90_PATH_D:
2157                 pr_err("switch case %#x not processed\n", rfpath);
2158                 break;
2159         }
2160         return true;
2161 }
2162
2163 void rtl8821ae_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
2164 {
2165         struct rtl_priv *rtlpriv = rtl_priv(hw);
2166         struct rtl_phy *rtlphy = &rtlpriv->phy;
2167
2168         rtlphy->default_initialgain[0] =
2169             (u8)rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
2170         rtlphy->default_initialgain[1] =
2171             (u8)rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0);
2172         rtlphy->default_initialgain[2] =
2173             (u8)rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0);
2174         rtlphy->default_initialgain[3] =
2175             (u8)rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0);
2176
2177         RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
2178                  "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n",
2179                   rtlphy->default_initialgain[0],
2180                   rtlphy->default_initialgain[1],
2181                   rtlphy->default_initialgain[2],
2182                   rtlphy->default_initialgain[3]);
2183
2184         rtlphy->framesync = (u8)rtl_get_bbreg(hw,
2185                                                ROFDM0_RXDETECTOR3, MASKBYTE0);
2186         rtlphy->framesync_c34 = rtl_get_bbreg(hw,
2187                                               ROFDM0_RXDETECTOR2, MASKDWORD);
2188
2189         RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
2190                  "Default framesync (0x%x) = 0x%x\n",
2191                   ROFDM0_RXDETECTOR3, rtlphy->framesync);
2192 }
2193
2194 static void phy_init_bb_rf_register_definition(struct ieee80211_hw *hw)
2195 {
2196         struct rtl_priv *rtlpriv = rtl_priv(hw);
2197         struct rtl_phy *rtlphy = &rtlpriv->phy;
2198
2199         rtlphy->phyreg_def[RF90_PATH_A].rfintfs = RFPGA0_XAB_RFINTERFACESW;
2200         rtlphy->phyreg_def[RF90_PATH_B].rfintfs = RFPGA0_XAB_RFINTERFACESW;
2201
2202         rtlphy->phyreg_def[RF90_PATH_A].rfintfo = RFPGA0_XA_RFINTERFACEOE;
2203         rtlphy->phyreg_def[RF90_PATH_B].rfintfo = RFPGA0_XB_RFINTERFACEOE;
2204
2205         rtlphy->phyreg_def[RF90_PATH_A].rfintfe = RFPGA0_XA_RFINTERFACEOE;
2206         rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE;
2207
2208         rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset = RA_LSSIWRITE_8821A;
2209         rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset = RB_LSSIWRITE_8821A;
2210
2211         rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para2 = RHSSIREAD_8821AE;
2212         rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para2 = RHSSIREAD_8821AE;
2213
2214         rtlphy->phyreg_def[RF90_PATH_A].rf_rb = RA_SIREAD_8821A;
2215         rtlphy->phyreg_def[RF90_PATH_B].rf_rb = RB_SIREAD_8821A;
2216
2217         rtlphy->phyreg_def[RF90_PATH_A].rf_rbpi = RA_PIREAD_8821A;
2218         rtlphy->phyreg_def[RF90_PATH_B].rf_rbpi = RB_PIREAD_8821A;
2219 }
2220
2221 void rtl8821ae_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel)
2222 {
2223         struct rtl_priv *rtlpriv = rtl_priv(hw);
2224         struct rtl_phy *rtlphy = &rtlpriv->phy;
2225         u8 txpwr_level;
2226         long txpwr_dbm;
2227
2228         txpwr_level = rtlphy->cur_cck_txpwridx;
2229         txpwr_dbm = _rtl8821ae_phy_txpwr_idx_to_dbm(hw,
2230                                                  WIRELESS_MODE_B, txpwr_level);
2231         txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
2232         if (_rtl8821ae_phy_txpwr_idx_to_dbm(hw,
2233                                          WIRELESS_MODE_G,
2234                                          txpwr_level) > txpwr_dbm)
2235                 txpwr_dbm =
2236                     _rtl8821ae_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G,
2237                                                  txpwr_level);
2238         txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
2239         if (_rtl8821ae_phy_txpwr_idx_to_dbm(hw,
2240                                          WIRELESS_MODE_N_24G,
2241                                          txpwr_level) > txpwr_dbm)
2242                 txpwr_dbm =
2243                     _rtl8821ae_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_N_24G,
2244                                                  txpwr_level);
2245         *powerlevel = txpwr_dbm;
2246 }
2247
2248 static bool _rtl8821ae_phy_get_chnl_index(u8 channel, u8 *chnl_index)
2249 {
2250         u8 i = 0;
2251         bool in_24g = true;
2252
2253         if (channel <= 14) {
2254                 in_24g = true;
2255                 *chnl_index = channel - 1;
2256         } else {
2257                 in_24g = false;
2258
2259                 for (i = 0; i < CHANNEL_MAX_NUMBER_5G; ++i) {
2260                         if (channel5g[i] == channel) {
2261                                 *chnl_index = i;
2262                                 return in_24g;
2263                         }
2264                 }
2265         }
2266         return in_24g;
2267 }
2268
2269 static s8 _rtl8821ae_phy_get_ratesection_intxpower_byrate(u8 path, u8 rate)
2270 {
2271         s8 rate_section = 0;
2272         switch (rate) {
2273         case DESC_RATE1M:
2274         case DESC_RATE2M:
2275         case DESC_RATE5_5M:
2276         case DESC_RATE11M:
2277                 rate_section = 0;
2278                 break;
2279         case DESC_RATE6M:
2280         case DESC_RATE9M:
2281         case DESC_RATE12M:
2282         case DESC_RATE18M:
2283                 rate_section = 1;
2284                 break;
2285         case DESC_RATE24M:
2286         case DESC_RATE36M:
2287         case DESC_RATE48M:
2288         case DESC_RATE54M:
2289                 rate_section = 2;
2290                 break;
2291         case DESC_RATEMCS0:
2292         case DESC_RATEMCS1:
2293         case DESC_RATEMCS2:
2294         case DESC_RATEMCS3:
2295                 rate_section = 3;
2296                 break;
2297         case DESC_RATEMCS4:
2298         case DESC_RATEMCS5:
2299         case DESC_RATEMCS6:
2300         case DESC_RATEMCS7:
2301                 rate_section = 4;
2302                 break;
2303         case DESC_RATEMCS8:
2304         case DESC_RATEMCS9:
2305         case DESC_RATEMCS10:
2306         case DESC_RATEMCS11:
2307                 rate_section = 5;
2308                 break;
2309         case DESC_RATEMCS12:
2310         case DESC_RATEMCS13:
2311         case DESC_RATEMCS14:
2312         case DESC_RATEMCS15:
2313                 rate_section = 6;
2314                 break;
2315         case DESC_RATEVHT1SS_MCS0:
2316         case DESC_RATEVHT1SS_MCS1:
2317         case DESC_RATEVHT1SS_MCS2:
2318         case DESC_RATEVHT1SS_MCS3:
2319                 rate_section = 7;
2320                 break;
2321         case DESC_RATEVHT1SS_MCS4:
2322         case DESC_RATEVHT1SS_MCS5:
2323         case DESC_RATEVHT1SS_MCS6:
2324         case DESC_RATEVHT1SS_MCS7:
2325                 rate_section = 8;
2326                 break;
2327         case DESC_RATEVHT1SS_MCS8:
2328         case DESC_RATEVHT1SS_MCS9:
2329         case DESC_RATEVHT2SS_MCS0:
2330         case DESC_RATEVHT2SS_MCS1:
2331                 rate_section = 9;
2332                 break;
2333         case DESC_RATEVHT2SS_MCS2:
2334         case DESC_RATEVHT2SS_MCS3:
2335         case DESC_RATEVHT2SS_MCS4:
2336         case DESC_RATEVHT2SS_MCS5:
2337                 rate_section = 10;
2338                 break;
2339         case DESC_RATEVHT2SS_MCS6:
2340         case DESC_RATEVHT2SS_MCS7:
2341         case DESC_RATEVHT2SS_MCS8:
2342         case DESC_RATEVHT2SS_MCS9:
2343                 rate_section = 11;
2344                 break;
2345         default:
2346                 WARN_ONCE(true, "rtl8821ae: Rate_Section is Illegal\n");
2347                 break;
2348         }
2349
2350         return rate_section;
2351 }
2352
2353 static s8 _rtl8812ae_phy_get_world_wide_limit(s8  *limit_table)
2354 {
2355         s8 min = limit_table[0];
2356         u8 i = 0;
2357
2358         for (i = 0; i < MAX_REGULATION_NUM; ++i) {
2359                 if (limit_table[i] < min)
2360                         min = limit_table[i];
2361         }
2362         return min;
2363 }
2364
2365 static s8 _rtl8812ae_phy_get_txpower_limit(struct ieee80211_hw *hw,
2366                                              u8 band,
2367                                              enum ht_channel_width bandwidth,
2368                                              enum radio_path rf_path,
2369                                              u8 rate, u8 channel)
2370 {
2371         struct rtl_priv *rtlpriv = rtl_priv(hw);
2372         struct rtl_efuse *rtlefuse = rtl_efuse(rtlpriv);
2373         struct rtl_phy *rtlphy = &rtlpriv->phy;
2374         short band_temp = -1, regulation = -1, bandwidth_temp = -1,
2375                  rate_section = -1, channel_temp = -1;
2376         u16 bd, regu, bdwidth, sec, chnl;
2377         s8 power_limit = MAX_POWER_INDEX;
2378
2379         if (rtlefuse->eeprom_regulatory == 2)
2380                 return MAX_POWER_INDEX;
2381
2382         regulation = TXPWR_LMT_WW;
2383
2384         if (band == BAND_ON_2_4G)
2385                 band_temp = 0;
2386         else if (band == BAND_ON_5G)
2387                 band_temp = 1;
2388
2389         if (bandwidth == HT_CHANNEL_WIDTH_20)
2390                 bandwidth_temp = 0;
2391         else if (bandwidth == HT_CHANNEL_WIDTH_20_40)
2392                 bandwidth_temp = 1;
2393         else if (bandwidth == HT_CHANNEL_WIDTH_80)
2394                 bandwidth_temp = 2;
2395
2396         switch (rate) {
2397         case DESC_RATE1M:
2398         case DESC_RATE2M:
2399         case DESC_RATE5_5M:
2400         case DESC_RATE11M:
2401                 rate_section = 0;
2402                 break;
2403         case DESC_RATE6M:
2404         case DESC_RATE9M:
2405         case DESC_RATE12M:
2406         case DESC_RATE18M:
2407         case DESC_RATE24M:
2408         case DESC_RATE36M:
2409         case DESC_RATE48M:
2410         case DESC_RATE54M:
2411                 rate_section = 1;
2412                 break;
2413         case DESC_RATEMCS0:
2414         case DESC_RATEMCS1:
2415         case DESC_RATEMCS2:
2416         case DESC_RATEMCS3:
2417         case DESC_RATEMCS4:
2418         case DESC_RATEMCS5:
2419         case DESC_RATEMCS6:
2420         case DESC_RATEMCS7:
2421                 rate_section = 2;
2422                 break;
2423         case DESC_RATEMCS8:
2424         case DESC_RATEMCS9:
2425         case DESC_RATEMCS10:
2426         case DESC_RATEMCS11:
2427         case DESC_RATEMCS12:
2428         case DESC_RATEMCS13:
2429         case DESC_RATEMCS14:
2430         case DESC_RATEMCS15:
2431                 rate_section = 3;
2432                 break;
2433         case DESC_RATEVHT1SS_MCS0:
2434         case DESC_RATEVHT1SS_MCS1:
2435         case DESC_RATEVHT1SS_MCS2:
2436         case DESC_RATEVHT1SS_MCS3:
2437         case DESC_RATEVHT1SS_MCS4:
2438         case DESC_RATEVHT1SS_MCS5:
2439         case DESC_RATEVHT1SS_MCS6:
2440         case DESC_RATEVHT1SS_MCS7:
2441         case DESC_RATEVHT1SS_MCS8:
2442         case DESC_RATEVHT1SS_MCS9:
2443                 rate_section = 4;
2444                 break;
2445         case DESC_RATEVHT2SS_MCS0:
2446         case DESC_RATEVHT2SS_MCS1:
2447         case DESC_RATEVHT2SS_MCS2:
2448         case DESC_RATEVHT2SS_MCS3:
2449         case DESC_RATEVHT2SS_MCS4:
2450         case DESC_RATEVHT2SS_MCS5:
2451         case DESC_RATEVHT2SS_MCS6:
2452         case DESC_RATEVHT2SS_MCS7:
2453         case DESC_RATEVHT2SS_MCS8:
2454         case DESC_RATEVHT2SS_MCS9:
2455                 rate_section = 5;
2456                 break;
2457         default:
2458                 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
2459                         "Wrong rate 0x%x\n", rate);
2460                 break;
2461         }
2462
2463         if (band_temp == BAND_ON_5G  && rate_section == 0)
2464                 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
2465                          "Wrong rate 0x%x: No CCK in 5G Band\n", rate);
2466
2467         /*workaround for wrong index combination to obtain tx power limit,
2468           OFDM only exists in BW 20M*/
2469         if (rate_section == 1)
2470                 bandwidth_temp = 0;
2471
2472         /*workaround for wrong index combination to obtain tx power limit,
2473          *HT on 80M will reference to HT on 40M
2474          */
2475         if ((rate_section == 2 || rate_section == 3) && band == BAND_ON_5G &&
2476             bandwidth_temp == 2)
2477                 bandwidth_temp = 1;
2478
2479         if (band == BAND_ON_2_4G)
2480                 channel_temp = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw,
2481                 BAND_ON_2_4G, channel);
2482         else if (band == BAND_ON_5G)
2483                 channel_temp = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw,
2484                 BAND_ON_5G, channel);
2485         else if (band == BAND_ON_BOTH)
2486                 ;/* BAND_ON_BOTH don't care temporarily */
2487
2488         if (band_temp == -1 || regulation == -1 || bandwidth_temp == -1 ||
2489                 rate_section == -1 || channel_temp == -1) {
2490                 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
2491                          "Wrong index value to access power limit table [band %d][regulation %d][bandwidth %d][rf_path %d][rate_section %d][chnl %d]\n",
2492                          band_temp, regulation, bandwidth_temp, rf_path,
2493                          rate_section, channel_temp);
2494                 return MAX_POWER_INDEX;
2495         }
2496
2497         bd = band_temp;
2498         regu = regulation;
2499         bdwidth = bandwidth_temp;
2500         sec = rate_section;
2501         chnl = channel_temp;
2502
2503         if (band == BAND_ON_2_4G) {
2504                 s8 limits[10] = {0};
2505                 u8 i;
2506
2507                 for (i = 0; i < 4; ++i)
2508                         limits[i] = rtlphy->txpwr_limit_2_4g[i][bdwidth]
2509                         [sec][chnl][rf_path];
2510
2511                 power_limit = (regulation == TXPWR_LMT_WW) ?
2512                         _rtl8812ae_phy_get_world_wide_limit(limits) :
2513                         rtlphy->txpwr_limit_2_4g[regu][bdwidth]
2514                                         [sec][chnl][rf_path];
2515         } else if (band == BAND_ON_5G) {
2516                 s8 limits[10] = {0};
2517                 u8 i;
2518
2519                 for (i = 0; i < MAX_REGULATION_NUM; ++i)
2520                         limits[i] = rtlphy->txpwr_limit_5g[i][bdwidth]
2521                         [sec][chnl][rf_path];
2522
2523                 power_limit = (regulation == TXPWR_LMT_WW) ?
2524                         _rtl8812ae_phy_get_world_wide_limit(limits) :
2525                         rtlphy->txpwr_limit_5g[regu][chnl]
2526                         [sec][chnl][rf_path];
2527         } else {
2528                 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2529                          "No power limit table of the specified band\n");
2530         }
2531         return power_limit;
2532 }
2533
2534 static s8 _rtl8821ae_phy_get_txpower_by_rate(struct ieee80211_hw *hw,
2535                                         u8 band, u8 path, u8 rate)
2536 {
2537         struct rtl_priv *rtlpriv = rtl_priv(hw);
2538         struct rtl_phy *rtlphy = &rtlpriv->phy;
2539         u8 shift = 0, rate_section, tx_num;
2540         s8 tx_pwr_diff = 0;
2541         s8 limit = 0;
2542
2543         rate_section = _rtl8821ae_phy_get_ratesection_intxpower_byrate(path, rate);
2544         tx_num = RF_TX_NUM_NONIMPLEMENT;
2545
2546         if (tx_num == RF_TX_NUM_NONIMPLEMENT) {
2547                 if ((rate >= DESC_RATEMCS8 && rate <= DESC_RATEMCS15) ||
2548                         (rate >= DESC_RATEVHT2SS_MCS2 && rate <= DESC_RATEVHT2SS_MCS9))
2549                         tx_num = RF_2TX;
2550                 else
2551                         tx_num = RF_1TX;
2552         }
2553
2554         switch (rate) {
2555         case DESC_RATE1M:
2556         case DESC_RATE6M:
2557         case DESC_RATE24M:
2558         case DESC_RATEMCS0:
2559         case DESC_RATEMCS4:
2560         case DESC_RATEMCS8:
2561         case DESC_RATEMCS12:
2562         case DESC_RATEVHT1SS_MCS0:
2563         case DESC_RATEVHT1SS_MCS4:
2564         case DESC_RATEVHT1SS_MCS8:
2565         case DESC_RATEVHT2SS_MCS2:
2566         case DESC_RATEVHT2SS_MCS6:
2567                 shift = 0;
2568                 break;
2569         case DESC_RATE2M:
2570         case DESC_RATE9M:
2571         case DESC_RATE36M:
2572         case DESC_RATEMCS1:
2573         case DESC_RATEMCS5:
2574         case DESC_RATEMCS9:
2575         case DESC_RATEMCS13:
2576         case DESC_RATEVHT1SS_MCS1:
2577         case DESC_RATEVHT1SS_MCS5:
2578         case DESC_RATEVHT1SS_MCS9:
2579         case DESC_RATEVHT2SS_MCS3:
2580         case DESC_RATEVHT2SS_MCS7:
2581                 shift = 8;
2582                 break;
2583         case DESC_RATE5_5M:
2584         case DESC_RATE12M:
2585         case DESC_RATE48M:
2586         case DESC_RATEMCS2:
2587         case DESC_RATEMCS6:
2588         case DESC_RATEMCS10:
2589         case DESC_RATEMCS14:
2590         case DESC_RATEVHT1SS_MCS2:
2591         case DESC_RATEVHT1SS_MCS6:
2592         case DESC_RATEVHT2SS_MCS0:
2593         case DESC_RATEVHT2SS_MCS4:
2594         case DESC_RATEVHT2SS_MCS8:
2595                 shift = 16;
2596                 break;
2597         case DESC_RATE11M:
2598         case DESC_RATE18M:
2599         case DESC_RATE54M:
2600         case DESC_RATEMCS3:
2601         case DESC_RATEMCS7:
2602         case DESC_RATEMCS11:
2603         case DESC_RATEMCS15:
2604         case DESC_RATEVHT1SS_MCS3:
2605         case DESC_RATEVHT1SS_MCS7:
2606         case DESC_RATEVHT2SS_MCS1:
2607         case DESC_RATEVHT2SS_MCS5:
2608         case DESC_RATEVHT2SS_MCS9:
2609                 shift = 24;
2610                 break;
2611         default:
2612                 WARN_ONCE(true, "rtl8821ae: Rate_Section is Illegal\n");
2613                 break;
2614         }
2615
2616         tx_pwr_diff = (u8)(rtlphy->tx_power_by_rate_offset[band][path]
2617                 [tx_num][rate_section] >> shift) & 0xff;
2618
2619         /* RegEnableTxPowerLimit == 1 for 8812a & 8821a */
2620         if (rtlpriv->efuse.eeprom_regulatory != 2) {
2621                 limit = _rtl8812ae_phy_get_txpower_limit(hw, band,
2622                         rtlphy->current_chan_bw, path, rate,
2623                         rtlphy->current_channel);
2624
2625                 if (rate == DESC_RATEVHT1SS_MCS8 || rate == DESC_RATEVHT1SS_MCS9  ||
2626                          rate == DESC_RATEVHT2SS_MCS8 || rate == DESC_RATEVHT2SS_MCS9) {
2627                         if (limit < 0) {
2628                                 if (tx_pwr_diff < (-limit))
2629                                         tx_pwr_diff = -limit;
2630                         }
2631                 } else {
2632                         if (limit < 0)
2633                                 tx_pwr_diff = limit;
2634                         else
2635                                 tx_pwr_diff = tx_pwr_diff > limit ? limit : tx_pwr_diff;
2636                 }
2637                 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2638                         "Maximum power by rate %d, final power by rate %d\n",
2639                         limit, tx_pwr_diff);
2640         }
2641
2642         return  tx_pwr_diff;
2643 }
2644
2645 static u8 _rtl8821ae_get_txpower_index(struct ieee80211_hw *hw, u8 path,
2646                                         u8 rate, u8 bandwidth, u8 channel)
2647 {
2648         struct rtl_priv *rtlpriv = rtl_priv(hw);
2649         struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
2650         struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2651         u8 index = (channel - 1);
2652         u8 txpower = 0;
2653         bool in_24g = false;
2654         s8 powerdiff_byrate = 0;
2655
2656         if (((rtlhal->current_bandtype == BAND_ON_2_4G) &&
2657             (channel > 14 || channel < 1)) ||
2658             ((rtlhal->current_bandtype == BAND_ON_5G) && (channel <= 14))) {
2659                 index = 0;
2660                 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2661                         "Illegal channel!!\n");
2662         }
2663
2664         in_24g = _rtl8821ae_phy_get_chnl_index(channel, &index);
2665         if (in_24g) {
2666                 if (RTL8821AE_RX_HAL_IS_CCK_RATE(rate))
2667                         txpower = rtlefuse->txpwrlevel_cck[path][index];
2668                 else if (DESC_RATE6M <= rate)
2669                         txpower = rtlefuse->txpwrlevel_ht40_1s[path][index];
2670                 else
2671                         RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, "invalid rate\n");
2672
2673                 if (DESC_RATE6M <= rate && rate <= DESC_RATE54M &&
2674                     !RTL8821AE_RX_HAL_IS_CCK_RATE(rate))
2675                         txpower += rtlefuse->txpwr_legacyhtdiff[path][TX_1S];
2676
2677                 if (bandwidth == HT_CHANNEL_WIDTH_20) {
2678                         if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
2679                                 (DESC_RATEVHT1SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9))
2680                                 txpower += rtlefuse->txpwr_ht20diff[path][TX_1S];
2681                         if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
2682                                 (DESC_RATEVHT2SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9))
2683                                 txpower += rtlefuse->txpwr_ht20diff[path][TX_2S];
2684                 } else if (bandwidth == HT_CHANNEL_WIDTH_20_40) {
2685                         if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
2686                                 (DESC_RATEVHT1SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9))
2687                                 txpower += rtlefuse->txpwr_ht40diff[path][TX_1S];
2688                         if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
2689                                 (DESC_RATEVHT2SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9))
2690                                 txpower += rtlefuse->txpwr_ht40diff[path][TX_2S];
2691                 } else if (bandwidth == HT_CHANNEL_WIDTH_80) {
2692                         if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
2693                             (DESC_RATEVHT1SS_MCS0 <= rate &&
2694                              rate <= DESC_RATEVHT2SS_MCS9))
2695                                 txpower += rtlefuse->txpwr_ht40diff[path][TX_1S];
2696                         if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
2697                             (DESC_RATEVHT2SS_MCS0 <= rate &&
2698                              rate <= DESC_RATEVHT2SS_MCS9))
2699                                 txpower += rtlefuse->txpwr_ht40diff[path][TX_2S];
2700                 }
2701         } else {
2702                 if (DESC_RATE6M <= rate)
2703                         txpower = rtlefuse->txpwr_5g_bw40base[path][index];
2704                 else
2705                         RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_WARNING,
2706                                  "INVALID Rate.\n");
2707
2708                 if (DESC_RATE6M <= rate && rate <= DESC_RATE54M &&
2709                     !RTL8821AE_RX_HAL_IS_CCK_RATE(rate))
2710                         txpower += rtlefuse->txpwr_5g_ofdmdiff[path][TX_1S];
2711
2712                 if (bandwidth == HT_CHANNEL_WIDTH_20) {
2713                         if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
2714                             (DESC_RATEVHT1SS_MCS0 <= rate &&
2715                              rate <= DESC_RATEVHT2SS_MCS9))
2716                                 txpower += rtlefuse->txpwr_5g_bw20diff[path][TX_1S];
2717                         if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
2718                             (DESC_RATEVHT2SS_MCS0 <= rate &&
2719                              rate <= DESC_RATEVHT2SS_MCS9))
2720                                 txpower += rtlefuse->txpwr_5g_bw20diff[path][TX_2S];
2721                 } else if (bandwidth == HT_CHANNEL_WIDTH_20_40) {
2722                         if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
2723                             (DESC_RATEVHT1SS_MCS0 <= rate &&
2724                              rate <= DESC_RATEVHT2SS_MCS9))
2725                                 txpower += rtlefuse->txpwr_5g_bw40diff[path][TX_1S];
2726                         if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
2727                             (DESC_RATEVHT2SS_MCS0 <= rate &&
2728                              rate <= DESC_RATEVHT2SS_MCS9))
2729                                 txpower += rtlefuse->txpwr_5g_bw40diff[path][TX_2S];
2730                 } else if (bandwidth == HT_CHANNEL_WIDTH_80) {
2731                         u8 i;
2732
2733                         for (i = 0; i < sizeof(channel5g_80m) / sizeof(u8); ++i)
2734                                 if (channel5g_80m[i] == channel)
2735                                         index = i;
2736
2737                         if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
2738                             (DESC_RATEVHT1SS_MCS0 <= rate &&
2739                              rate <= DESC_RATEVHT2SS_MCS9))
2740                                 txpower = rtlefuse->txpwr_5g_bw80base[path][index]
2741                                         + rtlefuse->txpwr_5g_bw80diff[path][TX_1S];
2742                         if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
2743                             (DESC_RATEVHT2SS_MCS0 <= rate &&
2744                              rate <= DESC_RATEVHT2SS_MCS9))
2745                                 txpower = rtlefuse->txpwr_5g_bw80base[path][index]
2746                                         + rtlefuse->txpwr_5g_bw80diff[path][TX_1S]
2747                                         + rtlefuse->txpwr_5g_bw80diff[path][TX_2S];
2748                     }
2749         }
2750         if (rtlefuse->eeprom_regulatory != 2)
2751                 powerdiff_byrate =
2752                   _rtl8821ae_phy_get_txpower_by_rate(hw, (u8)(!in_24g),
2753                                                      path, rate);
2754
2755         if (rate == DESC_RATEVHT1SS_MCS8 || rate == DESC_RATEVHT1SS_MCS9 ||
2756             rate == DESC_RATEVHT2SS_MCS8 || rate == DESC_RATEVHT2SS_MCS9)
2757                 txpower -= powerdiff_byrate;
2758         else
2759                 txpower += powerdiff_byrate;
2760
2761         if (rate > DESC_RATE11M)
2762                 txpower += rtlpriv->dm.remnant_ofdm_swing_idx[path];
2763         else
2764                 txpower += rtlpriv->dm.remnant_cck_idx;
2765
2766         if (txpower > MAX_POWER_INDEX)
2767                 txpower = MAX_POWER_INDEX;
2768
2769         return txpower;
2770 }
2771
2772 static void _rtl8821ae_phy_set_txpower_index(struct ieee80211_hw *hw,
2773                                              u8 power_index, u8 path, u8 rate)
2774 {
2775         struct rtl_priv *rtlpriv = rtl_priv(hw);
2776
2777         if (path == RF90_PATH_A) {
2778                 switch (rate) {
2779                 case DESC_RATE1M:
2780                         rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1,
2781                                       MASKBYTE0, power_index);
2782                         break;
2783                 case DESC_RATE2M:
2784                         rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1,
2785                                       MASKBYTE1, power_index);
2786                         break;
2787                 case DESC_RATE5_5M:
2788                         rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1,
2789                                       MASKBYTE2, power_index);
2790                         break;
2791                 case DESC_RATE11M:
2792                         rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1,
2793                                       MASKBYTE3, power_index);
2794                         break;
2795                 case DESC_RATE6M:
2796                         rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6,
2797                                       MASKBYTE0, power_index);
2798                         break;
2799                 case DESC_RATE9M:
2800                         rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6,
2801                                       MASKBYTE1, power_index);
2802                         break;
2803                 case DESC_RATE12M:
2804                         rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6,
2805                                       MASKBYTE2, power_index);
2806                         break;
2807                 case DESC_RATE18M:
2808                         rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6,
2809                                       MASKBYTE3, power_index);
2810                         break;
2811                 case DESC_RATE24M:
2812                         rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24,
2813                                       MASKBYTE0, power_index);
2814                         break;
2815                 case DESC_RATE36M:
2816                         rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24,
2817                                       MASKBYTE1, power_index);
2818                         break;
2819                 case DESC_RATE48M:
2820                         rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24,
2821                                       MASKBYTE2, power_index);
2822                         break;
2823                 case DESC_RATE54M:
2824                         rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24,
2825                                       MASKBYTE3, power_index);
2826                         break;
2827                 case DESC_RATEMCS0:
2828                         rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
2829                                       MASKBYTE0, power_index);
2830                         break;
2831                 case DESC_RATEMCS1:
2832                         rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
2833                                       MASKBYTE1, power_index);
2834                         break;
2835                 case DESC_RATEMCS2:
2836                         rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
2837                                       MASKBYTE2, power_index);
2838                         break;
2839                 case DESC_RATEMCS3:
2840                         rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
2841                                       MASKBYTE3, power_index);
2842                         break;
2843                 case DESC_RATEMCS4:
2844                         rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
2845                                       MASKBYTE0, power_index);
2846                         break;
2847                 case DESC_RATEMCS5:
2848                         rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
2849                                       MASKBYTE1, power_index);
2850                         break;
2851                 case DESC_RATEMCS6:
2852                         rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
2853                                       MASKBYTE2, power_index);
2854                         break;
2855                 case DESC_RATEMCS7:
2856                         rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
2857                                       MASKBYTE3, power_index);
2858                         break;
2859                 case DESC_RATEMCS8:
2860                         rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
2861                                       MASKBYTE0, power_index);
2862                         break;
2863                 case DESC_RATEMCS9:
2864                         rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
2865                                       MASKBYTE1, power_index);
2866                         break;
2867                 case DESC_RATEMCS10:
2868                         rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
2869                                       MASKBYTE2, power_index);
2870                         break;
2871                 case DESC_RATEMCS11:
2872                         rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
2873                                       MASKBYTE3, power_index);
2874                         break;
2875                 case DESC_RATEMCS12:
2876                         rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
2877                                       MASKBYTE0, power_index);
2878                         break;
2879                 case DESC_RATEMCS13:
2880                         rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
2881                                       MASKBYTE1, power_index);
2882                         break;
2883                 case DESC_RATEMCS14:
2884                         rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
2885                                       MASKBYTE2, power_index);
2886                         break;
2887                 case DESC_RATEMCS15:
2888                         rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
2889                                       MASKBYTE3, power_index);
2890                         break;
2891                 case DESC_RATEVHT1SS_MCS0:
2892                         rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0,
2893                                       MASKBYTE0, power_index);
2894                         break;
2895                 case DESC_RATEVHT1SS_MCS1:
2896                         rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0,
2897                                       MASKBYTE1, power_index);
2898                         break;
2899                 case DESC_RATEVHT1SS_MCS2:
2900                         rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0,
2901                                       MASKBYTE2, power_index);
2902                         break;
2903                 case DESC_RATEVHT1SS_MCS3:
2904                         rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0,
2905                                       MASKBYTE3, power_index);
2906                         break;
2907                 case DESC_RATEVHT1SS_MCS4:
2908                         rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4,
2909                                       MASKBYTE0, power_index);
2910                         break;
2911                 case DESC_RATEVHT1SS_MCS5:
2912                         rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4,
2913                                       MASKBYTE1, power_index);
2914                         break;
2915                 case DESC_RATEVHT1SS_MCS6:
2916                         rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4,
2917                                       MASKBYTE2, power_index);
2918                         break;
2919                 case DESC_RATEVHT1SS_MCS7:
2920                         rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4,
2921                                       MASKBYTE3, power_index);
2922                         break;
2923                 case DESC_RATEVHT1SS_MCS8:
2924                         rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8,
2925                                       MASKBYTE0, power_index);
2926                         break;
2927                 case DESC_RATEVHT1SS_MCS9:
2928                         rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8,
2929                                       MASKBYTE1, power_index);
2930                         break;
2931                 case DESC_RATEVHT2SS_MCS0:
2932                         rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8,
2933                                       MASKBYTE2, power_index);
2934                         break;
2935                 case DESC_RATEVHT2SS_MCS1:
2936                         rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8,
2937                                       MASKBYTE3, power_index);
2938                         break;
2939                 case DESC_RATEVHT2SS_MCS2:
2940                         rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2,
2941                                       MASKBYTE0, power_index);
2942                         break;
2943                 case DESC_RATEVHT2SS_MCS3:
2944                         rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2,
2945                                       MASKBYTE1, power_index);
2946                         break;
2947                 case DESC_RATEVHT2SS_MCS4:
2948                         rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2,
2949                                       MASKBYTE2, power_index);
2950                         break;
2951                 case DESC_RATEVHT2SS_MCS5:
2952                         rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2,
2953                                       MASKBYTE3, power_index);
2954                         break;
2955                 case DESC_RATEVHT2SS_MCS6:
2956                         rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6,
2957                                       MASKBYTE0, power_index);
2958                         break;
2959                 case DESC_RATEVHT2SS_MCS7:
2960                         rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6,
2961                                       MASKBYTE1, power_index);
2962                         break;
2963                 case DESC_RATEVHT2SS_MCS8:
2964                         rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6,
2965                                       MASKBYTE2, power_index);
2966                         break;
2967                 case DESC_RATEVHT2SS_MCS9:
2968                         rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6,
2969                                       MASKBYTE3, power_index);
2970                         break;
2971                 default:
2972                         RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
2973                                 "Invalid Rate!!\n");
2974                         break;
2975                 }
2976         } else if (path == RF90_PATH_B) {
2977                 switch (rate) {
2978                 case DESC_RATE1M:
2979                         rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1,
2980                                       MASKBYTE0, power_index);
2981                         break;
2982                 case DESC_RATE2M:
2983                         rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1,
2984                                       MASKBYTE1, power_index);
2985                         break;
2986                 case DESC_RATE5_5M:
2987                         rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1,
2988                                       MASKBYTE2, power_index);
2989                         break;
2990                 case DESC_RATE11M:
2991                         rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1,
2992                                       MASKBYTE3, power_index);
2993                         break;
2994                 case DESC_RATE6M:
2995                         rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6,
2996                                       MASKBYTE0, power_index);
2997                         break;
2998                 case DESC_RATE9M:
2999                         rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6,
3000                                       MASKBYTE1, power_index);
3001                         break;
3002                 case DESC_RATE12M:
3003                         rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6,
3004                                       MASKBYTE2, power_index);
3005                         break;
3006                 case DESC_RATE18M:
3007                         rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6,
3008                                       MASKBYTE3, power_index);
3009                         break;
3010                 case DESC_RATE24M:
3011                         rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24,
3012                                       MASKBYTE0, power_index);
3013                         break;
3014                 case DESC_RATE36M:
3015                         rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24,
3016                                       MASKBYTE1, power_index);
3017                         break;
3018                 case DESC_RATE48M:
3019                         rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24,
3020                                       MASKBYTE2, power_index);
3021                         break;
3022                 case DESC_RATE54M:
3023                         rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24,
3024                                       MASKBYTE3, power_index);
3025                         break;
3026                 case DESC_RATEMCS0:
3027                         rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
3028                                       MASKBYTE0, power_index);
3029                         break;
3030                 case DESC_RATEMCS1:
3031                         rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
3032                                       MASKBYTE1, power_index);
3033                         break;
3034                 case DESC_RATEMCS2:
3035                         rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
3036                                       MASKBYTE2, power_index);
3037                         break;
3038                 case DESC_RATEMCS3:
3039                         rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
3040                                       MASKBYTE3, power_index);
3041                         break;
3042                 case DESC_RATEMCS4:
3043                         rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
3044                                       MASKBYTE0, power_index);
3045                         break;
3046                 case DESC_RATEMCS5:
3047                         rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
3048                                       MASKBYTE1, power_index);
3049                         break;
3050                 case DESC_RATEMCS6:
3051                         rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
3052                                       MASKBYTE2, power_index);
3053                         break;
3054                 case DESC_RATEMCS7:
3055                         rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
3056                                       MASKBYTE3, power_index);
3057                         break;
3058                 case DESC_RATEMCS8:
3059                         rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
3060                                       MASKBYTE0, power_index);
3061                         break;
3062                 case DESC_RATEMCS9:
3063                         rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
3064                                       MASKBYTE1, power_index);
3065                         break;
3066                 case DESC_RATEMCS10:
3067                         rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
3068                                       MASKBYTE2, power_index);
3069                         break;
3070                 case DESC_RATEMCS11:
3071                         rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
3072                                       MASKBYTE3, power_index);
3073                         break;
3074                 case DESC_RATEMCS12:
3075                         rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
3076                                       MASKBYTE0, power_index);
3077                         break;
3078                 case DESC_RATEMCS13:
3079                         rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
3080                                       MASKBYTE1, power_index);
3081                         break;
3082                 case DESC_RATEMCS14:
3083                         rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
3084                                       MASKBYTE2, power_index);
3085                         break;
3086                 case DESC_RATEMCS15:
3087                         rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
3088                                       MASKBYTE3, power_index);
3089                         break;
3090                 case DESC_RATEVHT1SS_MCS0:
3091                         rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0,
3092                                       MASKBYTE0, power_index);
3093                         break;
3094                 case DESC_RATEVHT1SS_MCS1:
3095                         rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0,
3096                                       MASKBYTE1, power_index);
3097                         break;
3098                 case DESC_RATEVHT1SS_MCS2:
3099                         rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0,
3100                                       MASKBYTE2, power_index);
3101                         break;
3102                 case DESC_RATEVHT1SS_MCS3:
3103                         rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0,
3104                                       MASKBYTE3, power_index);
3105                         break;
3106                 case DESC_RATEVHT1SS_MCS4:
3107                         rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4,
3108                                       MASKBYTE0, power_index);
3109                         break;
3110                 case DESC_RATEVHT1SS_MCS5:
3111                         rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4,
3112                                       MASKBYTE1, power_index);
3113                         break;
3114                 case DESC_RATEVHT1SS_MCS6:
3115                         rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4,
3116                                       MASKBYTE2, power_index);
3117                         break;
3118                 case DESC_RATEVHT1SS_MCS7:
3119                         rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4,
3120                                       MASKBYTE3, power_index);
3121                         break;
3122                 case DESC_RATEVHT1SS_MCS8:
3123                         rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8,
3124                                       MASKBYTE0, power_index);
3125                         break;
3126                 case DESC_RATEVHT1SS_MCS9:
3127                         rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8,
3128                                       MASKBYTE1, power_index);
3129                         break;
3130                 case DESC_RATEVHT2SS_MCS0:
3131                         rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8,
3132                                       MASKBYTE2, power_index);
3133                         break;
3134                 case DESC_RATEVHT2SS_MCS1:
3135                         rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8,
3136                                       MASKBYTE3, power_index);
3137                         break;
3138                 case DESC_RATEVHT2SS_MCS2:
3139                         rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2,
3140                                       MASKBYTE0, power_index);
3141                         break;
3142                 case DESC_RATEVHT2SS_MCS3:
3143                         rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2,
3144                                       MASKBYTE1, power_index);
3145                         break;
3146                 case DESC_RATEVHT2SS_MCS4:
3147                         rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2,
3148                                       MASKBYTE2, power_index);
3149                         break;
3150                 case DESC_RATEVHT2SS_MCS5:
3151                         rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2,
3152                                       MASKBYTE3, power_index);
3153                         break;
3154                 case DESC_RATEVHT2SS_MCS6:
3155                         rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6,
3156                                       MASKBYTE0, power_index);
3157                         break;
3158                 case DESC_RATEVHT2SS_MCS7:
3159                         rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6,
3160                                       MASKBYTE1, power_index);
3161                         break;
3162                 case DESC_RATEVHT2SS_MCS8:
3163                         rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6,
3164                                       MASKBYTE2, power_index);
3165                         break;
3166                 case DESC_RATEVHT2SS_MCS9:
3167                         rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6,
3168                                       MASKBYTE3, power_index);
3169                         break;
3170                 default:
3171                         RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
3172                                  "Invalid Rate!!\n");
3173                         break;
3174                 }
3175         } else {
3176                 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
3177                          "Invalid RFPath!!\n");
3178         }
3179 }
3180
3181 static void _rtl8821ae_phy_set_txpower_level_by_path(struct ieee80211_hw *hw,
3182                                                      u8 *array, u8 path,
3183                                                      u8 channel, u8 size)
3184 {
3185         struct rtl_priv *rtlpriv = rtl_priv(hw);
3186         struct rtl_phy *rtlphy = &rtlpriv->phy;
3187         u8 i;
3188         u8 power_index;
3189
3190         for (i = 0; i < size; i++) {
3191                 power_index =
3192                   _rtl8821ae_get_txpower_index(hw, path, array[i],
3193                                                rtlphy->current_chan_bw,
3194                                                channel);
3195                 _rtl8821ae_phy_set_txpower_index(hw, power_index, path,
3196                                                  array[i]);
3197         }
3198 }
3199
3200 static void _rtl8821ae_phy_txpower_training_by_path(struct ieee80211_hw *hw,
3201                                                     u8 bw, u8 channel, u8 path)
3202 {
3203         struct rtl_priv *rtlpriv = rtl_priv(hw);
3204         struct rtl_phy *rtlphy = &rtlpriv->phy;
3205
3206         u8 i;
3207         u32 power_level, data, offset;
3208
3209         if (path >= rtlphy->num_total_rfpath)
3210                 return;
3211
3212         data = 0;
3213         if (path == RF90_PATH_A) {
3214                 power_level =
3215                         _rtl8821ae_get_txpower_index(hw, RF90_PATH_A,
3216                         DESC_RATEMCS7, bw, channel);
3217                 offset =  RA_TXPWRTRAING;
3218         } else {
3219                 power_level =
3220                         _rtl8821ae_get_txpower_index(hw, RF90_PATH_B,
3221                         DESC_RATEMCS7, bw, channel);
3222                 offset =  RB_TXPWRTRAING;
3223         }
3224
3225         for (i = 0; i < 3; i++) {
3226                 if (i == 0)
3227                         power_level = power_level - 10;
3228                 else if (i == 1)
3229                         power_level = power_level - 8;
3230                 else
3231                         power_level = power_level - 6;
3232
3233                 data |= (((power_level > 2) ? (power_level) : 2) << (i * 8));
3234         }
3235         rtl_set_bbreg(hw, offset, 0xffffff, data);
3236 }
3237
3238 void rtl8821ae_phy_set_txpower_level_by_path(struct ieee80211_hw *hw,
3239                                              u8 channel, u8 path)
3240 {
3241         /* struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); */
3242         struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3243         struct rtl_priv *rtlpriv = rtl_priv(hw);
3244         struct rtl_phy *rtlphy = &rtlpriv->phy;
3245         u8 cck_rates[]  = {DESC_RATE1M, DESC_RATE2M, DESC_RATE5_5M,
3246                               DESC_RATE11M};
3247         u8 sizes_of_cck_retes = 4;
3248         u8 ofdm_rates[]  = {DESC_RATE6M, DESC_RATE9M, DESC_RATE12M,
3249                                 DESC_RATE18M, DESC_RATE24M, DESC_RATE36M,
3250                                 DESC_RATE48M, DESC_RATE54M};
3251         u8 sizes_of_ofdm_retes = 8;
3252         u8 ht_rates_1t[]  = {DESC_RATEMCS0, DESC_RATEMCS1, DESC_RATEMCS2,
3253                                 DESC_RATEMCS3, DESC_RATEMCS4, DESC_RATEMCS5,
3254                                 DESC_RATEMCS6, DESC_RATEMCS7};
3255         u8 sizes_of_ht_retes_1t = 8;
3256         u8 ht_rates_2t[]  = {DESC_RATEMCS8, DESC_RATEMCS9,
3257                                 DESC_RATEMCS10, DESC_RATEMCS11,
3258                                 DESC_RATEMCS12, DESC_RATEMCS13,
3259                                 DESC_RATEMCS14, DESC_RATEMCS15};
3260         u8 sizes_of_ht_retes_2t = 8;
3261         u8 vht_rates_1t[]  = {DESC_RATEVHT1SS_MCS0, DESC_RATEVHT1SS_MCS1,
3262                                 DESC_RATEVHT1SS_MCS2, DESC_RATEVHT1SS_MCS3,
3263                                 DESC_RATEVHT1SS_MCS4, DESC_RATEVHT1SS_MCS5,
3264                                 DESC_RATEVHT1SS_MCS6, DESC_RATEVHT1SS_MCS7,
3265                              DESC_RATEVHT1SS_MCS8, DESC_RATEVHT1SS_MCS9};
3266         u8 vht_rates_2t[]  = {DESC_RATEVHT2SS_MCS0, DESC_RATEVHT2SS_MCS1,
3267                                 DESC_RATEVHT2SS_MCS2, DESC_RATEVHT2SS_MCS3,
3268                                 DESC_RATEVHT2SS_MCS4, DESC_RATEVHT2SS_MCS5,
3269                                 DESC_RATEVHT2SS_MCS6, DESC_RATEVHT2SS_MCS7,
3270                                 DESC_RATEVHT2SS_MCS8, DESC_RATEVHT2SS_MCS9};
3271         u8 sizes_of_vht_retes = 10;
3272
3273         if (rtlhal->current_bandtype == BAND_ON_2_4G)
3274                 _rtl8821ae_phy_set_txpower_level_by_path(hw, cck_rates, path, channel,
3275                                                          sizes_of_cck_retes);
3276
3277         _rtl8821ae_phy_set_txpower_level_by_path(hw, ofdm_rates, path, channel,
3278                                                  sizes_of_ofdm_retes);
3279         _rtl8821ae_phy_set_txpower_level_by_path(hw, ht_rates_1t, path, channel,
3280                                                  sizes_of_ht_retes_1t);
3281         _rtl8821ae_phy_set_txpower_level_by_path(hw, vht_rates_1t, path, channel,
3282                                                  sizes_of_vht_retes);
3283
3284         if (rtlphy->num_total_rfpath >= 2) {
3285                 _rtl8821ae_phy_set_txpower_level_by_path(hw, ht_rates_2t, path,
3286                                                          channel,
3287                                                          sizes_of_ht_retes_2t);
3288                 _rtl8821ae_phy_set_txpower_level_by_path(hw, vht_rates_2t, path,
3289                                                          channel,
3290                                                          sizes_of_vht_retes);
3291         }
3292
3293         _rtl8821ae_phy_txpower_training_by_path(hw, rtlphy->current_chan_bw,
3294                                                 channel, path);
3295 }
3296
3297 /*just in case, write txpower in DW, to reduce time*/
3298 void rtl8821ae_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
3299 {
3300         struct rtl_priv *rtlpriv = rtl_priv(hw);
3301         struct rtl_phy *rtlphy = &rtlpriv->phy;
3302         u8 path = 0;
3303
3304         for (path = RF90_PATH_A; path < rtlphy->num_total_rfpath; ++path)
3305                 rtl8821ae_phy_set_txpower_level_by_path(hw, channel, path);
3306 }
3307
3308 static long _rtl8821ae_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
3309                                             enum wireless_mode wirelessmode,
3310                                             u8 txpwridx)
3311 {
3312         long offset;
3313         long pwrout_dbm;
3314
3315         switch (wirelessmode) {
3316         case WIRELESS_MODE_B:
3317                 offset = -7;
3318                 break;
3319         case WIRELESS_MODE_G:
3320         case WIRELESS_MODE_N_24G:
3321                 offset = -8;
3322                 break;
3323         default:
3324                 offset = -8;
3325                 break;
3326         }
3327         pwrout_dbm = txpwridx / 2 + offset;
3328         return pwrout_dbm;
3329 }
3330
3331 void rtl8821ae_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
3332 {
3333         struct rtl_priv *rtlpriv = rtl_priv(hw);
3334         struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3335         enum io_type iotype = IO_CMD_PAUSE_BAND0_DM_BY_SCAN;
3336
3337         if (!is_hal_stop(rtlhal)) {
3338                 switch (operation) {
3339                 case SCAN_OPT_BACKUP_BAND0:
3340                         iotype = IO_CMD_PAUSE_BAND0_DM_BY_SCAN;
3341                         rtlpriv->cfg->ops->set_hw_reg(hw,
3342                                                       HW_VAR_IO_CMD,
3343                                                       (u8 *)&iotype);
3344
3345                         break;
3346                 case SCAN_OPT_BACKUP_BAND1:
3347                         iotype = IO_CMD_PAUSE_BAND1_DM_BY_SCAN;
3348                         rtlpriv->cfg->ops->set_hw_reg(hw,
3349                                                       HW_VAR_IO_CMD,
3350                                                       (u8 *)&iotype);
3351
3352                         break;
3353                 case SCAN_OPT_RESTORE:
3354                         iotype = IO_CMD_RESUME_DM_BY_SCAN;
3355                         rtlpriv->cfg->ops->set_hw_reg(hw,
3356                                                       HW_VAR_IO_CMD,
3357                                                       (u8 *)&iotype);
3358                         break;
3359                 default:
3360                         pr_err("Unknown Scan Backup operation.\n");
3361                         break;
3362                 }
3363         }
3364 }
3365
3366 static void _rtl8821ae_phy_set_reg_bw(struct rtl_priv *rtlpriv, u8 bw)
3367 {
3368         u16 reg_rf_mode_bw, tmp = 0;
3369
3370         reg_rf_mode_bw = rtl_read_word(rtlpriv, REG_TRXPTCL_CTL);
3371         switch (bw) {
3372         case HT_CHANNEL_WIDTH_20:
3373                 rtl_write_word(rtlpriv, REG_TRXPTCL_CTL, reg_rf_mode_bw & 0xFE7F);
3374                 break;
3375         case HT_CHANNEL_WIDTH_20_40:
3376                 tmp = reg_rf_mode_bw | BIT(7);
3377                 rtl_write_word(rtlpriv, REG_TRXPTCL_CTL, tmp & 0xFEFF);
3378                 break;
3379         case HT_CHANNEL_WIDTH_80:
3380                 tmp = reg_rf_mode_bw | BIT(8);
3381                 rtl_write_word(rtlpriv, REG_TRXPTCL_CTL, tmp & 0xFF7F);
3382                 break;
3383         default:
3384                 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, "unknown Bandwidth: 0x%x\n", bw);
3385                 break;
3386         }
3387 }
3388
3389 static u8 _rtl8821ae_phy_get_secondary_chnl(struct rtl_priv *rtlpriv)
3390 {
3391         struct rtl_phy *rtlphy = &rtlpriv->phy;
3392         struct rtl_mac *mac = rtl_mac(rtlpriv);
3393         u8 sc_set_40 = 0, sc_set_20 = 0;
3394
3395         if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80) {
3396                 if (mac->cur_80_prime_sc == PRIME_CHNL_OFFSET_LOWER)
3397                         sc_set_40 = VHT_DATA_SC_40_LOWER_OF_80MHZ;
3398                 else if (mac->cur_80_prime_sc == PRIME_CHNL_OFFSET_UPPER)
3399                         sc_set_40 = VHT_DATA_SC_40_UPPER_OF_80MHZ;
3400                 else
3401                         pr_err("SCMapping: Not Correct Primary40MHz Setting\n");
3402
3403                 if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_LOWER) &&
3404                         (mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_LOWER))
3405                         sc_set_20 = VHT_DATA_SC_20_LOWEST_OF_80MHZ;
3406                 else if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_UPPER) &&
3407                         (mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_LOWER))
3408                         sc_set_20 = VHT_DATA_SC_20_LOWER_OF_80MHZ;
3409                 else if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_LOWER) &&
3410                         (mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_UPPER))
3411                         sc_set_20 = VHT_DATA_SC_20_UPPER_OF_80MHZ;
3412                 else if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_UPPER) &&
3413                         (mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_UPPER))
3414                         sc_set_20 = VHT_DATA_SC_20_UPPERST_OF_80MHZ;
3415                 else
3416                         pr_err("SCMapping: Not Correct Primary40MHz Setting\n");
3417         } else if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
3418                 if (mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_UPPER)
3419                         sc_set_20 = VHT_DATA_SC_20_UPPER_OF_80MHZ;
3420                 else if (mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_LOWER)
3421                         sc_set_20 = VHT_DATA_SC_20_LOWER_OF_80MHZ;
3422                 else
3423                         pr_err("SCMapping: Not Correct Primary40MHz Setting\n");
3424         }
3425         return (sc_set_40 << 4) | sc_set_20;
3426 }
3427
3428 void rtl8821ae_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
3429 {
3430         struct rtl_priv *rtlpriv = rtl_priv(hw);
3431         struct rtl_phy *rtlphy = &rtlpriv->phy;
3432         u8 sub_chnl = 0;
3433         u8 l1pk_val = 0;
3434
3435         RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
3436                  "Switch to %s bandwidth\n",
3437                   (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
3438                   "20MHz" :
3439                   (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40 ?
3440                   "40MHz" : "80MHz")));
3441
3442         _rtl8821ae_phy_set_reg_bw(rtlpriv, rtlphy->current_chan_bw);
3443         sub_chnl = _rtl8821ae_phy_get_secondary_chnl(rtlpriv);
3444         rtl_write_byte(rtlpriv, 0x0483, sub_chnl);
3445
3446         switch (rtlphy->current_chan_bw) {
3447         case HT_CHANNEL_WIDTH_20:
3448                 rtl_set_bbreg(hw, RRFMOD, 0x003003C3, 0x00300200);
3449                 rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 0);
3450
3451                 if (rtlphy->rf_type == RF_2T2R)
3452                         rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, 7);
3453                 else
3454                         rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, 8);
3455                 break;
3456         case HT_CHANNEL_WIDTH_20_40:
3457                 rtl_set_bbreg(hw, RRFMOD, 0x003003C3, 0x00300201);
3458                 rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 0);
3459                 rtl_set_bbreg(hw, RRFMOD, 0x3C, sub_chnl);
3460                 rtl_set_bbreg(hw, RCCAONSEC, 0xf0000000, sub_chnl);
3461
3462                 if (rtlphy->reg_837 & BIT(2))
3463                         l1pk_val = 6;
3464                 else {
3465                         if (rtlphy->rf_type == RF_2T2R)
3466                                 l1pk_val = 7;
3467                         else
3468                                 l1pk_val = 8;
3469                 }
3470                 /* 0x848[25:22] = 0x6 */
3471                 rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, l1pk_val);
3472
3473                 if (sub_chnl == VHT_DATA_SC_20_UPPER_OF_80MHZ)
3474                         rtl_set_bbreg(hw, RCCK_SYSTEM, BCCK_SYSTEM, 1);
3475                 else
3476                         rtl_set_bbreg(hw, RCCK_SYSTEM, BCCK_SYSTEM, 0);
3477                 break;
3478
3479         case HT_CHANNEL_WIDTH_80:
3480                  /* 0x8ac[21,20,9:6,1,0]=8'b11100010 */
3481                 rtl_set_bbreg(hw, RRFMOD, 0x003003C3, 0x00300202);
3482                 /* 0x8c4[30] = 1 */
3483                 rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 1);
3484                 rtl_set_bbreg(hw, RRFMOD, 0x3C, sub_chnl);
3485                 rtl_set_bbreg(hw, RCCAONSEC, 0xf0000000, sub_chnl);
3486
3487                 if (rtlphy->reg_837 & BIT(2))
3488                         l1pk_val = 5;
3489                 else {
3490                         if (rtlphy->rf_type == RF_2T2R)
3491                                 l1pk_val = 6;
3492                         else
3493                                 l1pk_val = 7;
3494                 }
3495                 rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, l1pk_val);
3496
3497                 break;
3498         default:
3499                 pr_err("unknown bandwidth: %#X\n",
3500                        rtlphy->current_chan_bw);
3501                 break;
3502         }
3503
3504         rtl8812ae_fixspur(hw, rtlphy->current_chan_bw, rtlphy->current_channel);
3505
3506         rtl8821ae_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
3507         rtlphy->set_bwmode_inprogress = false;
3508
3509         RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD, "\n");
3510 }
3511
3512 void rtl8821ae_phy_set_bw_mode(struct ieee80211_hw *hw,
3513                             enum nl80211_channel_type ch_type)
3514 {
3515         struct rtl_priv *rtlpriv = rtl_priv(hw);
3516         struct rtl_phy *rtlphy = &rtlpriv->phy;
3517         struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3518         u8 tmp_bw = rtlphy->current_chan_bw;
3519
3520         if (rtlphy->set_bwmode_inprogress)
3521                 return;
3522         rtlphy->set_bwmode_inprogress = true;
3523         if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw)))
3524                 rtl8821ae_phy_set_bw_mode_callback(hw);
3525         else {
3526                 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3527                          "FALSE driver sleep or unload\n");
3528                 rtlphy->set_bwmode_inprogress = false;
3529                 rtlphy->current_chan_bw = tmp_bw;
3530         }
3531 }
3532
3533 void rtl8821ae_phy_sw_chnl_callback(struct ieee80211_hw *hw)
3534 {
3535         struct rtl_priv *rtlpriv = rtl_priv(hw);
3536         struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3537         struct rtl_phy *rtlphy = &rtlpriv->phy;
3538         u8 channel = rtlphy->current_channel;
3539         u8 path;
3540         u32 data;
3541
3542         RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
3543                  "switch to channel%d\n", rtlphy->current_channel);
3544         if (is_hal_stop(rtlhal))
3545                 return;
3546
3547         if (36 <= channel && channel <= 48)
3548                 data = 0x494;
3549         else if (50 <= channel && channel <= 64)
3550                 data = 0x453;
3551         else if (100 <= channel && channel <= 116)
3552                 data = 0x452;
3553         else if (118 <= channel)
3554                 data = 0x412;
3555         else
3556                 data = 0x96a;
3557         rtl_set_bbreg(hw, RFC_AREA, 0x1ffe0000, data);
3558
3559         for (path = RF90_PATH_A; path < rtlphy->num_total_rfpath; path++) {
3560                 if (36 <= channel && channel <= 64)
3561                         data = 0x101;
3562                 else if (100 <= channel && channel <= 140)
3563                         data = 0x301;
3564                 else if (140 < channel)
3565                         data = 0x501;
3566                 else
3567                         data = 0x000;
3568                 rtl8821ae_phy_set_rf_reg(hw, path, RF_CHNLBW,
3569                         BIT(18)|BIT(17)|BIT(16)|BIT(9)|BIT(8), data);
3570
3571                 rtl8821ae_phy_set_rf_reg(hw, path, RF_CHNLBW,
3572                         BMASKBYTE0, channel);
3573
3574                 if (channel > 14) {
3575                         if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
3576                                 if (36 <= channel && channel <= 64)
3577                                         data = 0x114E9;
3578                                 else if (100 <= channel && channel <= 140)
3579                                         data = 0x110E9;
3580                                 else
3581                                         data = 0x110E9;
3582                                 rtl8821ae_phy_set_rf_reg(hw, path, RF_APK,
3583                                         BRFREGOFFSETMASK, data);
3584                         }
3585                 }
3586         }
3587         RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "\n");
3588 }
3589
3590 u8 rtl8821ae_phy_sw_chnl(struct ieee80211_hw *hw)
3591 {
3592         struct rtl_priv *rtlpriv = rtl_priv(hw);
3593         struct rtl_phy *rtlphy = &rtlpriv->phy;
3594         struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3595         u32 timeout = 1000, timecount = 0;
3596         u8 channel = rtlphy->current_channel;
3597
3598         if (rtlphy->sw_chnl_inprogress)
3599                 return 0;
3600         if (rtlphy->set_bwmode_inprogress)
3601                 return 0;
3602
3603         if ((is_hal_stop(rtlhal)) || (RT_CANNOT_IO(hw))) {
3604                 RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
3605                          "sw_chnl_inprogress false driver sleep or unload\n");
3606                 return 0;
3607         }
3608         while (rtlphy->lck_inprogress && timecount < timeout) {
3609                 mdelay(50);
3610                 timecount += 50;
3611         }
3612
3613         if (rtlphy->current_channel > 14 && rtlhal->current_bandtype != BAND_ON_5G)
3614                 rtl8821ae_phy_switch_wirelessband(hw, BAND_ON_5G);
3615         else if (rtlphy->current_channel <= 14 && rtlhal->current_bandtype != BAND_ON_2_4G)
3616                 rtl8821ae_phy_switch_wirelessband(hw, BAND_ON_2_4G);
3617
3618         rtlphy->sw_chnl_inprogress = true;
3619         if (channel == 0)
3620                 channel = 1;
3621
3622         RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
3623                  "switch to channel%d, band type is %d\n",
3624                  rtlphy->current_channel, rtlhal->current_bandtype);
3625
3626         rtl8821ae_phy_sw_chnl_callback(hw);
3627
3628         rtl8821ae_dm_clear_txpower_tracking_state(hw);
3629         rtl8821ae_phy_set_txpower_level(hw, rtlphy->current_channel);
3630
3631         RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "\n");
3632         rtlphy->sw_chnl_inprogress = false;
3633         return 1;
3634 }
3635
3636 u8 _rtl8812ae_get_right_chnl_place_for_iqk(u8 chnl)
3637 {
3638         u8 channel_all[TARGET_CHNL_NUM_2G_5G_8812] = {
3639                 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
3640                 14, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54,
3641                 56, 58, 60, 62, 64, 100, 102, 104, 106, 108,
3642                 110, 112, 114, 116, 118, 120, 122, 124, 126,
3643                 128, 130, 132, 134, 136, 138, 140, 149, 151,
3644                 153, 155, 157, 159, 161, 163, 165};
3645         u8 place = chnl;
3646
3647         if (chnl > 14) {
3648                 for (place = 14; place < sizeof(channel_all); place++)
3649                         if (channel_all[place] == chnl)
3650                                 return place-13;
3651         }
3652
3653         return 0;
3654 }
3655
3656 #define MACBB_REG_NUM 10
3657 #define AFE_REG_NUM 14
3658 #define RF_REG_NUM 3
3659
3660 static void _rtl8821ae_iqk_backup_macbb(struct ieee80211_hw *hw,
3661                                         u32 *macbb_backup,
3662                                         u32 *backup_macbb_reg, u32 mac_bb_num)
3663 {
3664         struct rtl_priv *rtlpriv = rtl_priv(hw);
3665         u32 i;
3666
3667         rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
3668         /*save MACBB default value*/
3669         for (i = 0; i < mac_bb_num; i++)
3670                 macbb_backup[i] = rtl_read_dword(rtlpriv, backup_macbb_reg[i]);
3671
3672         RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "BackupMacBB Success!!!!\n");
3673 }
3674
3675 static void _rtl8821ae_iqk_backup_afe(struct ieee80211_hw *hw, u32 *afe_backup,
3676                                       u32 *backup_afe_REG, u32 afe_num)
3677 {
3678         struct rtl_priv *rtlpriv = rtl_priv(hw);
3679         u32 i;
3680
3681         rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
3682         /*Save AFE Parameters */
3683         for (i = 0; i < afe_num; i++)
3684                 afe_backup[i] = rtl_read_dword(rtlpriv, backup_afe_REG[i]);
3685         RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "BackupAFE Success!!!!\n");
3686 }
3687
3688 static void _rtl8821ae_iqk_backup_rf(struct ieee80211_hw *hw, u32 *rfa_backup,
3689                                      u32 *rfb_backup, u32 *backup_rf_reg,
3690                                      u32 rf_num)
3691 {
3692         struct rtl_priv *rtlpriv = rtl_priv(hw);
3693         u32 i;
3694
3695         rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
3696         /*Save RF Parameters*/
3697         for (i = 0; i < rf_num; i++) {
3698                 rfa_backup[i] = rtl_get_rfreg(hw, RF90_PATH_A, backup_rf_reg[i],
3699                                               BMASKDWORD);
3700                 rfb_backup[i] = rtl_get_rfreg(hw, RF90_PATH_B, backup_rf_reg[i],
3701                                               BMASKDWORD);
3702         }
3703         RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "BackupRF Success!!!!\n");
3704 }
3705
3706 static void _rtl8821ae_iqk_configure_mac(
3707                 struct ieee80211_hw *hw
3708                 )
3709 {
3710         struct rtl_priv *rtlpriv = rtl_priv(hw);
3711         /* ========MAC register setting========*/
3712         rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
3713         rtl_write_byte(rtlpriv, 0x522, 0x3f);
3714         rtl_set_bbreg(hw, 0x550, BIT(11) | BIT(3), 0x0);
3715         rtl_write_byte(rtlpriv, 0x808, 0x00);           /*RX ante off*/
3716         rtl_set_bbreg(hw, 0x838, 0xf, 0xc);             /*CCA off*/
3717 }
3718
3719 static void _rtl8821ae_iqk_tx_fill_iqc(struct ieee80211_hw *hw,
3720                                        enum radio_path path, u32 tx_x, u32 tx_y)
3721 {
3722         struct rtl_priv *rtlpriv = rtl_priv(hw);
3723         switch (path) {
3724         case RF90_PATH_A:
3725                 /* [31] = 1 --> Page C1 */
3726                 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1);
3727                 rtl_write_dword(rtlpriv, 0xc90, 0x00000080);
3728                 rtl_write_dword(rtlpriv, 0xcc4, 0x20040000);
3729                 rtl_write_dword(rtlpriv, 0xcc8, 0x20000000);
3730                 rtl_set_bbreg(hw, 0xccc, 0x000007ff, tx_y);
3731                 rtl_set_bbreg(hw, 0xcd4, 0x000007ff, tx_x);
3732                 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
3733                          "TX_X = %x;;TX_Y = %x =====> fill to IQC\n",
3734                          tx_x, tx_y);
3735                 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
3736                          "0xcd4 = %x;;0xccc = %x ====>fill to IQC\n",
3737                          rtl_get_bbreg(hw, 0xcd4, 0x000007ff),
3738                          rtl_get_bbreg(hw, 0xccc, 0x000007ff));
3739                 break;
3740         default:
3741                 break;
3742         }
3743 }
3744
3745 static void _rtl8821ae_iqk_rx_fill_iqc(struct ieee80211_hw *hw,
3746                                        enum radio_path path, u32 rx_x, u32 rx_y)
3747 {
3748         struct rtl_priv *rtlpriv = rtl_priv(hw);
3749         switch (path) {
3750         case RF90_PATH_A:
3751                 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
3752                 rtl_set_bbreg(hw, 0xc10, 0x000003ff, rx_x>>1);
3753                 rtl_set_bbreg(hw, 0xc10, 0x03ff0000, rx_y>>1);
3754                 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
3755                          "rx_x = %x;;rx_y = %x ====>fill to IQC\n",
3756                          rx_x>>1, rx_y>>1);
3757                 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
3758                          "0xc10 = %x ====>fill to IQC\n",
3759                          rtl_read_dword(rtlpriv, 0xc10));
3760                 break;
3761         default:
3762                 break;
3763         }
3764 }
3765
3766 #define cal_num 10
3767
3768 static void _rtl8821ae_iqk_tx(struct ieee80211_hw *hw, enum radio_path path)
3769 {
3770         struct rtl_priv *rtlpriv = rtl_priv(hw);
3771         struct rtl_phy *rtlphy = &rtlpriv->phy;
3772         struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3773
3774         u32     tx_fail, rx_fail, delay_count, iqk_ready, cal_retry, cal = 0, temp_reg65;
3775         int     tx_x = 0, tx_y = 0, rx_x = 0, rx_y = 0, tx_average = 0, rx_average = 0;
3776         int     tx_x0[cal_num], tx_y0[cal_num], tx_x0_rxk[cal_num],
3777                 tx_y0_rxk[cal_num], rx_x0[cal_num], rx_y0[cal_num],
3778                 tx_dt[cal_num], rx_dt[cal_num];
3779         bool    tx0iqkok = false, rx0iqkok = false;
3780         bool    vdf_enable = false;
3781         int     i, k, vdf_y[3], vdf_x[3],
3782                 ii, dx = 0, dy = 0, tx_finish = 0, rx_finish = 0;
3783
3784         RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
3785                         "BandWidth = %d.\n",
3786                          rtlphy->current_chan_bw);
3787         if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80)
3788                 vdf_enable = true;
3789
3790         while (cal < cal_num) {
3791                 switch (path) {
3792                 case RF90_PATH_A:
3793                         temp_reg65 = rtl_get_rfreg(hw, path, 0x65, 0xffffffff);
3794                         /* Path-A LOK */
3795                         rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
3796                         /*========Path-A AFE all on========*/
3797                         /*Port 0 DAC/ADC on*/
3798                         rtl_write_dword(rtlpriv, 0xc60, 0x77777777);
3799                         rtl_write_dword(rtlpriv, 0xc64, 0x77777777);
3800                         rtl_write_dword(rtlpriv, 0xc68, 0x19791979);
3801                         rtl_write_dword(rtlpriv, 0xc6c, 0x19791979);
3802                         rtl_write_dword(rtlpriv, 0xc70, 0x19791979);
3803                         rtl_write_dword(rtlpriv, 0xc74, 0x19791979);
3804                         rtl_write_dword(rtlpriv, 0xc78, 0x19791979);
3805                         rtl_write_dword(rtlpriv, 0xc7c, 0x19791979);
3806                         rtl_write_dword(rtlpriv, 0xc80, 0x19791979);
3807                         rtl_write_dword(rtlpriv, 0xc84, 0x19791979);
3808
3809                         rtl_set_bbreg(hw, 0xc00, 0xf, 0x4); /*hardware 3-wire off*/
3810
3811                         /* LOK Setting */
3812                         /* ====== LOK ====== */
3813                         /*DAC/ADC sampling rate (160 MHz)*/
3814                         rtl_set_bbreg(hw, 0xc5c, BIT(26) | BIT(25) | BIT(24), 0x7);
3815
3816                         /* 2. LoK RF Setting (at BW = 20M) */
3817                         rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80002);
3818                         rtl_set_rfreg(hw, path, 0x18, 0x00c00, 0x3);     /* BW 20M */
3819                         rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x20000);
3820                         rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0003f);
3821                         rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xf3fc3);
3822                         rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d5);
3823                         rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001);
3824                         rtl_set_bbreg(hw, 0xcb8, 0xf, 0xd);
3825                         rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
3826                         rtl_write_dword(rtlpriv, 0xb00, 0x03000100);
3827                         rtl_set_bbreg(hw, 0xc94, BIT(0), 0x1);
3828                         rtl_write_dword(rtlpriv, 0x978, 0x29002000);/* TX (X,Y) */
3829                         rtl_write_dword(rtlpriv, 0x97c, 0xa9002000);/* RX (X,Y) */
3830                         rtl_write_dword(rtlpriv, 0x984, 0x00462910);/* [0]:AGC_en, [15]:idac_K_Mask */
3831
3832                         rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
3833                         rtl_write_dword(rtlpriv, 0xc88, 0x821403f4);
3834
3835                         if (rtlhal->current_bandtype)
3836                                 rtl_write_dword(rtlpriv, 0xc8c, 0x68163e96);
3837                         else
3838                                 rtl_write_dword(rtlpriv, 0xc8c, 0x28163e96);
3839
3840                         rtl_write_dword(rtlpriv, 0xc80, 0x18008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
3841                         rtl_write_dword(rtlpriv, 0xc84, 0x38008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */
3842                         rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8Ï¥\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
3843                         rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
3844                         rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
3845
3846                         mdelay(10); /* Delay 10ms */
3847                         rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
3848
3849                         rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
3850                         rtl_set_rfreg(hw, path, 0x58, 0x7fe00, rtl_get_rfreg(hw, path, 0x8, 0xffc00)); /* Load LOK */
3851
3852                         switch (rtlphy->current_chan_bw) {
3853                         case 1:
3854                                 rtl_set_rfreg(hw, path, 0x18, 0x00c00, 0x1);
3855                                 break;
3856                         case 2:
3857                                 rtl_set_rfreg(hw, path, 0x18, 0x00c00, 0x0);
3858                                 break;
3859                         default:
3860                                 break;
3861                         }
3862
3863                         rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
3864
3865                         /* 3. TX RF Setting */
3866                         rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
3867                         rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
3868                         rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x20000);
3869                         rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0003f);
3870                         rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xf3fc3);
3871                         rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d5);
3872                         rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001);
3873                         rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
3874                         /* ODM_SetBBReg(pDM_Odm, 0xcb8, 0xf, 0xd); */
3875                         rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
3876                         rtl_write_dword(rtlpriv, 0xb00, 0x03000100);
3877                         rtl_set_bbreg(hw, 0xc94, BIT(0), 0x1);
3878                         rtl_write_dword(rtlpriv, 0x978, 0x29002000);/* TX (X,Y) */
3879                         rtl_write_dword(rtlpriv, 0x97c, 0xa9002000);/* RX (X,Y) */
3880                         rtl_write_dword(rtlpriv, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */
3881
3882                         rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
3883                         rtl_write_dword(rtlpriv, 0xc88, 0x821403f1);
3884                         if (rtlhal->current_bandtype)
3885                                 rtl_write_dword(rtlpriv, 0xc8c, 0x40163e96);
3886                         else
3887                                 rtl_write_dword(rtlpriv, 0xc8c, 0x00163e96);
3888
3889                         if (vdf_enable == 1) {
3890                                 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "VDF_enable\n");
3891                                 for (k = 0; k <= 2; k++) {
3892                                         switch (k) {
3893                                         case 0:
3894                                                 rtl_write_dword(rtlpriv, 0xc80, 0x18008c38);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
3895                                                 rtl_write_dword(rtlpriv, 0xc84, 0x38008c38);/* RX_TONE_idx[9:0], RxK_Mask[29] */
3896                                                 rtl_set_bbreg(hw, 0xce8, BIT(31), 0x0);
3897                                                 break;
3898                                         case 1:
3899                                                 rtl_set_bbreg(hw, 0xc80, BIT(28), 0x0);
3900                                                 rtl_set_bbreg(hw, 0xc84, BIT(28), 0x0);
3901                                                 rtl_set_bbreg(hw, 0xce8, BIT(31), 0x0);
3902                                                 break;
3903                                         case 2:
3904                                                 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
3905                                                         "vdf_y[1] = %x;;;vdf_y[0] = %x\n", vdf_y[1]>>21 & 0x00007ff, vdf_y[0]>>21 & 0x00007ff);
3906                                                 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
3907                                                         "vdf_x[1] = %x;;;vdf_x[0] = %x\n", vdf_x[1]>>21 & 0x00007ff, vdf_x[0]>>21 & 0x00007ff);
3908                                                 tx_dt[cal] = (vdf_y[1]>>20)-(vdf_y[0]>>20);
3909                                                 tx_dt[cal] = ((16*tx_dt[cal])*10000/15708);
3910                                                 tx_dt[cal] = (tx_dt[cal] >> 1)+(tx_dt[cal] & BIT(0));
3911                                                 rtl_write_dword(rtlpriv, 0xc80, 0x18008c20);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
3912                                                 rtl_write_dword(rtlpriv, 0xc84, 0x38008c20);/* RX_TONE_idx[9:0], RxK_Mask[29] */
3913                                                 rtl_set_bbreg(hw, 0xce8, BIT(31), 0x1);
3914                                                 rtl_set_bbreg(hw, 0xce8, 0x3fff0000, tx_dt[cal] & 0x00003fff);
3915                                                 break;
3916                                         default:
3917                                                 break;
3918                                         }
3919                                         rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8Ï¥\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
3920                                         cal_retry = 0;
3921                                         while (1) {
3922                                                 /* one shot */
3923                                                 rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
3924                                                 rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
3925
3926                                                 mdelay(10); /* Delay 10ms */
3927                                                 rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
3928                                                 delay_count = 0;
3929                                                 while (1) {
3930                                                         iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
3931                                                         if ((~iqk_ready) || (delay_count > 20))
3932                                                                 break;
3933                                                         else{
3934                                                                 mdelay(1);
3935                                                                 delay_count++;
3936                                                         }
3937                                                 }
3938
3939                                                 if (delay_count < 20) {                                                 /* If 20ms No Result, then cal_retry++ */
3940                                                         /* ============TXIQK Check============== */
3941                                                         tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12));
3942
3943                                                         if (~tx_fail) {
3944                                                                 rtl_write_dword(rtlpriv, 0xcb8, 0x02000000);
3945                                                                 vdf_x[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
3946                                                                 rtl_write_dword(rtlpriv, 0xcb8, 0x04000000);
3947                                                                 vdf_y[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
3948                                                                 tx0iqkok = true;
3949                                                                 break;
3950                                                         } else {
3951                                                                 rtl_set_bbreg(hw, 0xccc, 0x000007ff, 0x0);
3952                                                                 rtl_set_bbreg(hw, 0xcd4, 0x000007ff, 0x200);
3953                                                                 tx0iqkok = false;
3954                                                                 cal_retry++;
3955                                                                 if (cal_retry == 10)
3956                                                                         break;
3957                                                         }
3958                                                 } else {
3959                                                         tx0iqkok = false;
3960                                                         cal_retry++;
3961                                                         if (cal_retry == 10)
3962                                                                 break;
3963                                                 }
3964                                         }
3965                                 }
3966                                 if (k == 3) {
3967                                         tx_x0[cal] = vdf_x[k-1];
3968                                         tx_y0[cal] = vdf_y[k-1];
3969                                 }
3970                         } else {
3971                                 rtl_write_dword(rtlpriv, 0xc80, 0x18008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
3972                                 rtl_write_dword(rtlpriv, 0xc84, 0x38008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */
3973                                 rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8Ï¥\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
3974                                 cal_retry = 0;
3975                                 while (1) {
3976                                         /* one shot */
3977                                         rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
3978                                         rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
3979
3980                                         mdelay(10); /* Delay 10ms */
3981                                         rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
3982                                         delay_count = 0;
3983                                         while (1) {
3984                                                 iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
3985                                                 if ((~iqk_ready) || (delay_count > 20))
3986                                                         break;
3987                                                 else{
3988                                                         mdelay(1);
3989                                                         delay_count++;
3990                                                 }
3991                                         }
3992
3993                                         if (delay_count < 20) {                                                 /* If 20ms No Result, then cal_retry++ */
3994                                                 /* ============TXIQK Check============== */
3995                                                 tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12));
3996
3997                                                 if (~tx_fail) {
3998                                                         rtl_write_dword(rtlpriv, 0xcb8, 0x02000000);
3999                                                         tx_x0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4000                                                         rtl_write_dword(rtlpriv, 0xcb8, 0x04000000);
4001                                                         tx_y0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4002                                                         tx0iqkok = true;
4003                                                         break;
4004                                                 } else {
4005                                                         rtl_set_bbreg(hw, 0xccc, 0x000007ff, 0x0);
4006                                                         rtl_set_bbreg(hw, 0xcd4, 0x000007ff, 0x200);
4007                                                         tx0iqkok = false;
4008                                                         cal_retry++;
4009                                                         if (cal_retry == 10)
4010                                                                 break;
4011                                                 }
4012                                         } else {
4013                                                 tx0iqkok = false;
4014                                                 cal_retry++;
4015                                                 if (cal_retry == 10)
4016                                                         break;
4017                                         }
4018                                 }
4019                         }
4020
4021                         if (tx0iqkok == false)
4022                                 break;                          /* TXK fail, Don't do RXK */
4023
4024                         if (vdf_enable == 1) {
4025                                 rtl_set_bbreg(hw, 0xce8, BIT(31), 0x0);    /* TX VDF Disable */
4026                                 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "RXVDF Start\n");
4027                                 for (k = 0; k <= 2; k++) {
4028                                         /* ====== RX mode TXK (RXK Step 1) ====== */
4029                                         rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4030                                         /* 1. TX RF Setting */
4031                                         rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
4032                                         rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000);
4033                                         rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x00029);
4034                                         rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xd7ffb);
4035                                         rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, temp_reg65);
4036                                         rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001);
4037                                         rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
4038
4039                                         rtl_set_bbreg(hw, 0xcb8, 0xf, 0xd);
4040                                         rtl_write_dword(rtlpriv, 0x978, 0x29002000);/* TX (X,Y) */
4041                                         rtl_write_dword(rtlpriv, 0x97c, 0xa9002000);/* RX (X,Y) */
4042                                         rtl_write_dword(rtlpriv, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */
4043                                         rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
4044                                         rtl_write_dword(rtlpriv, 0xb00, 0x03000100);
4045                                         rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
4046                                         switch (k) {
4047                                         case 0:
4048                                                 {
4049                                                         rtl_write_dword(rtlpriv, 0xc80, 0x18008c38);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
4050                                                         rtl_write_dword(rtlpriv, 0xc84, 0x38008c38);/* RX_TONE_idx[9:0], RxK_Mask[29] */
4051                                                         rtl_set_bbreg(hw, 0xce8, BIT(30), 0x0);
4052                                                 }
4053                                                 break;
4054                                         case 1:
4055                                                 {
4056                                                         rtl_write_dword(rtlpriv, 0xc80, 0x08008c38);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
4057                                                         rtl_write_dword(rtlpriv, 0xc84, 0x28008c38);/* RX_TONE_idx[9:0], RxK_Mask[29] */
4058                                                         rtl_set_bbreg(hw, 0xce8, BIT(30), 0x0);
4059                                                 }
4060                                                 break;
4061                                         case 2:
4062                                                 {
4063                                                         RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
4064                                                         "VDF_Y[1] = %x;;;VDF_Y[0] = %x\n",
4065                                                         vdf_y[1]>>21 & 0x00007ff, vdf_y[0]>>21 & 0x00007ff);
4066                                                         RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
4067                                                         "VDF_X[1] = %x;;;VDF_X[0] = %x\n",
4068                                                         vdf_x[1]>>21 & 0x00007ff, vdf_x[0]>>21 & 0x00007ff);
4069                                                         rx_dt[cal] = (vdf_y[1]>>20)-(vdf_y[0]>>20);
4070                                                         RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "Rx_dt = %d\n", rx_dt[cal]);
4071                                                         rx_dt[cal] = ((16*rx_dt[cal])*10000/13823);
4072                                                         rx_dt[cal] = (rx_dt[cal] >> 1)+(rx_dt[cal] & BIT(0));
4073                                                         rtl_write_dword(rtlpriv, 0xc80, 0x18008c20);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
4074                                                         rtl_write_dword(rtlpriv, 0xc84, 0x38008c20);/* RX_TONE_idx[9:0], RxK_Mask[29] */
4075                                                         rtl_set_bbreg(hw, 0xce8, 0x00003fff, rx_dt[cal] & 0x00003fff);
4076                                                 }
4077                                                 break;
4078                                         default:
4079                                                 break;
4080                                         }
4081                                         rtl_write_dword(rtlpriv, 0xc88, 0x821603e0);
4082                                         rtl_write_dword(rtlpriv, 0xc8c, 0x68163e96);
4083                                         rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8Ï¥\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
4084                                         cal_retry = 0;
4085                                         while (1) {
4086                                                 /* one shot */
4087                                                 rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
4088                                                 rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
4089
4090                                                 mdelay(10); /* Delay 10ms */
4091                                                 rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
4092                                                 delay_count = 0;
4093                                                 while (1) {
4094                                                         iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
4095                                                         if ((~iqk_ready) || (delay_count > 20))
4096                                                                 break;
4097                                                         else{
4098                                                                 mdelay(1);
4099                                                                 delay_count++;
4100                                                         }
4101                                                 }
4102
4103                                                 if (delay_count < 20) {                                                 /* If 20ms No Result, then cal_retry++ */
4104                                                         /* ============TXIQK Check============== */
4105                                                         tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12));
4106
4107                                                         if (~tx_fail) {
4108                                                                 rtl_write_dword(rtlpriv, 0xcb8, 0x02000000);
4109                                                                 tx_x0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4110                                                                 rtl_write_dword(rtlpriv, 0xcb8, 0x04000000);
4111                                                                 tx_y0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4112                                                                 tx0iqkok = true;
4113                                                                 break;
4114                                                         } else{
4115                                                                 tx0iqkok = false;
4116                                                                 cal_retry++;
4117                                                                 if (cal_retry == 10)
4118                                                                         break;
4119                                                         }
4120                                                 } else {
4121                                                         tx0iqkok = false;
4122                                                         cal_retry++;
4123                                                         if (cal_retry == 10)
4124                                                                 break;
4125                                                 }
4126                                         }
4127
4128                                         if (tx0iqkok == false) {   /* If RX mode TXK fail, then take TXK Result */
4129                                                 tx_x0_rxk[cal] = tx_x0[cal];
4130                                                 tx_y0_rxk[cal] = tx_y0[cal];
4131                                                 tx0iqkok = true;
4132                                                 RT_TRACE(rtlpriv,
4133                                                          COMP_IQK,
4134                                                          DBG_LOUD,
4135                                                          "RXK Step 1 fail\n");
4136                                         }
4137
4138                                         /* ====== RX IQK ====== */
4139                                         rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4140                                         /* 1. RX RF Setting */
4141                                         rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
4142                                         rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000);
4143                                         rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0002f);
4144                                         rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xfffbb);
4145                                         rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x88001);
4146                                         rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d8);
4147                                         rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
4148
4149                                         rtl_set_bbreg(hw, 0x978, 0x03FF8000, (tx_x0_rxk[cal])>>21&0x000007ff);
4150                                         rtl_set_bbreg(hw, 0x978, 0x000007FF, (tx_y0_rxk[cal])>>21&0x000007ff);
4151                                         rtl_set_bbreg(hw, 0x978, BIT(31), 0x1);
4152                                         rtl_set_bbreg(hw, 0x97c, BIT(31), 0x0);
4153                                         rtl_set_bbreg(hw, 0xcb8, 0xF, 0xe);
4154                                         rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
4155                                         rtl_write_dword(rtlpriv, 0x984, 0x0046a911);
4156
4157                                         rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
4158                                         rtl_set_bbreg(hw, 0xc80, BIT(29), 0x1);
4159                                         rtl_set_bbreg(hw, 0xc84, BIT(29), 0x0);
4160                                         rtl_write_dword(rtlpriv, 0xc88, 0x02140119);
4161
4162                                         rtl_write_dword(rtlpriv, 0xc8c, 0x28160d00); /* pDM_Odm->SupportInterface == 1 */
4163
4164                                         if (k == 2)
4165                                                 rtl_set_bbreg(hw, 0xce8, BIT(30), 0x1);  /* RX VDF Enable */
4166                                         rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8Ï¥\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
4167
4168                                         cal_retry = 0;
4169                                         while (1) {
4170                                                 /* one shot */
4171                                                 rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
4172                                                 rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
4173
4174                                                 mdelay(10); /* Delay 10ms */
4175                                                 rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
4176                                                 delay_count = 0;
4177                                                 while (1) {
4178                                                         iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
4179                                                         if ((~iqk_ready) || (delay_count > 20))
4180                                                                 break;
4181                                                         else{
4182                                                                 mdelay(1);
4183                                                                 delay_count++;
4184                                                         }
4185                                                 }
4186
4187                                                 if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */
4188                                                         /* ============RXIQK Check============== */
4189                                                         rx_fail = rtl_get_bbreg(hw, 0xd00, BIT(11));
4190                                                         if (rx_fail == 0) {
4191                                                                 rtl_write_dword(rtlpriv, 0xcb8, 0x06000000);
4192                                                                 vdf_x[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4193                                                                 rtl_write_dword(rtlpriv, 0xcb8, 0x08000000);
4194                                                                 vdf_y[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4195                                                                 rx0iqkok = true;
4196                                                                 break;
4197                                                         } else {
4198                                                                 rtl_set_bbreg(hw, 0xc10, 0x000003ff, 0x200>>1);
4199                                                                 rtl_set_bbreg(hw, 0xc10, 0x03ff0000, 0x0>>1);
4200                                                                 rx0iqkok = false;
4201                                                                 cal_retry++;
4202                                                                 if (cal_retry == 10)
4203                                                                         break;
4204
4205                                                         }
4206                                                 } else{
4207                                                         rx0iqkok = false;
4208                                                         cal_retry++;
4209                                                         if (cal_retry == 10)
4210                                                                 break;
4211                                                 }
4212                                         }
4213
4214                                 }
4215                                 if (k == 3) {
4216                                         rx_x0[cal] = vdf_x[k-1];
4217                                         rx_y0[cal] = vdf_y[k-1];
4218                                 }
4219                                 rtl_set_bbreg(hw, 0xce8, BIT(31), 0x1);    /* TX VDF Enable */
4220                         }
4221
4222                         else{
4223                                 /* ====== RX mode TXK (RXK Step 1) ====== */
4224                                 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4225                                 /* 1. TX RF Setting */
4226                                 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
4227                                 rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000);
4228                                 rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x00029);
4229                                 rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xd7ffb);
4230                                 rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, temp_reg65);
4231                                 rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001);
4232                                 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
4233                                 rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
4234                                 rtl_write_dword(rtlpriv, 0xb00, 0x03000100);
4235                                 rtl_write_dword(rtlpriv, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */
4236
4237                                 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
4238                                 rtl_write_dword(rtlpriv, 0xc80, 0x18008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
4239                                 rtl_write_dword(rtlpriv, 0xc84, 0x38008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */
4240                                 rtl_write_dword(rtlpriv, 0xc88, 0x821603e0);
4241                                 /* ODM_Write4Byte(pDM_Odm, 0xc8c, 0x68163e96); */
4242                                 rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8Ï¥\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
4243                                 cal_retry = 0;
4244                                 while (1) {
4245                                         /* one shot */
4246                                         rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
4247                                         rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
4248
4249                                         mdelay(10); /* Delay 10ms */
4250                                         rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
4251                                         delay_count = 0;
4252                                         while (1) {
4253                                                 iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
4254                                                 if ((~iqk_ready) || (delay_count > 20))
4255                                                         break;
4256                                                 else{
4257                                                         mdelay(1);
4258                                                         delay_count++;
4259                                                 }
4260                                         }
4261
4262                                         if (delay_count < 20) {                                                 /* If 20ms No Result, then cal_retry++ */
4263                                                 /* ============TXIQK Check============== */
4264                                                 tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12));
4265
4266                                                 if (~tx_fail) {
4267                                                         rtl_write_dword(rtlpriv, 0xcb8, 0x02000000);
4268                                                         tx_x0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4269                                                         rtl_write_dword(rtlpriv, 0xcb8, 0x04000000);
4270                                                         tx_y0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4271                                                         tx0iqkok = true;
4272                                                         break;
4273                                                 } else {
4274                                                         tx0iqkok = false;
4275                                                         cal_retry++;
4276                                                         if (cal_retry == 10)
4277                                                                 break;
4278                                                 }
4279                                         } else{
4280                                                 tx0iqkok = false;
4281                                                 cal_retry++;
4282                                                 if (cal_retry == 10)
4283                                                         break;
4284                                         }
4285                                 }
4286
4287                                 if (tx0iqkok == false) {   /* If RX mode TXK fail, then take TXK Result */
4288                                         tx_x0_rxk[cal] = tx_x0[cal];
4289                                         tx_y0_rxk[cal] = tx_y0[cal];
4290                                         tx0iqkok = true;
4291                                         RT_TRACE(rtlpriv, COMP_IQK,
4292                                                  DBG_LOUD, "1");
4293                                 }
4294
4295                                 /* ====== RX IQK ====== */
4296                                 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4297                                 /* 1. RX RF Setting */
4298                                 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
4299                                 rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000);
4300                                 rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0002f);
4301                                 rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xfffbb);
4302                                 rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x88001);
4303                                 rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d8);
4304                                 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
4305
4306                                 rtl_set_bbreg(hw, 0x978, 0x03FF8000, (tx_x0_rxk[cal])>>21&0x000007ff);
4307                                 rtl_set_bbreg(hw, 0x978, 0x000007FF, (tx_y0_rxk[cal])>>21&0x000007ff);
4308                                 rtl_set_bbreg(hw, 0x978, BIT(31), 0x1);
4309                                 rtl_set_bbreg(hw, 0x97c, BIT(31), 0x0);
4310                                 /* ODM_SetBBReg(pDM_Odm, 0xcb8, 0xF, 0xe); */
4311                                 rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
4312                                 rtl_write_dword(rtlpriv, 0x984, 0x0046a911);
4313
4314                                 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
4315                                 rtl_write_dword(rtlpriv, 0xc80, 0x38008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
4316                                 rtl_write_dword(rtlpriv, 0xc84, 0x18008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */
4317                                 rtl_write_dword(rtlpriv, 0xc88, 0x02140119);
4318
4319                                 rtl_write_dword(rtlpriv, 0xc8c, 0x28160d00); /*pDM_Odm->SupportInterface == 1*/
4320
4321                                 rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8Ï¥\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
4322
4323                                 cal_retry = 0;
4324                                 while (1) {
4325                                         /* one shot */
4326                                         rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
4327                                         rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
4328
4329                                         mdelay(10); /* Delay 10ms */
4330                                         rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
4331                                         delay_count = 0;
4332                                         while (1) {
4333                                                 iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
4334                                                 if ((~iqk_ready) || (delay_count > 20))
4335                                                         break;
4336                                                 else{
4337                                                         mdelay(1);
4338                                                         delay_count++;
4339                                                 }
4340                                         }
4341
4342                                         if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */
4343                                                 /* ============RXIQK Check============== */
4344                                                 rx_fail = rtl_get_bbreg(hw, 0xd00, BIT(11));
4345                                                 if (rx_fail == 0) {
4346                                                         rtl_write_dword(rtlpriv, 0xcb8, 0x06000000);
4347                                                         rx_x0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4348                                                         rtl_write_dword(rtlpriv, 0xcb8, 0x08000000);
4349                                                         rx_y0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4350                                                         rx0iqkok = true;
4351                                                         break;
4352                                                 } else{
4353                                                         rtl_set_bbreg(hw, 0xc10, 0x000003ff, 0x200>>1);
4354                                                         rtl_set_bbreg(hw, 0xc10, 0x03ff0000, 0x0>>1);
4355                                                         rx0iqkok = false;
4356                                                         cal_retry++;
4357                                                         if (cal_retry == 10)
4358                                                                 break;
4359
4360                                                 }
4361                                         } else{
4362                                                 rx0iqkok = false;
4363                                                 cal_retry++;
4364                                                 if (cal_retry == 10)
4365                                                         break;
4366                                         }
4367                                 }
4368                         }
4369
4370                         if (tx0iqkok)
4371                                 tx_average++;
4372                         if (rx0iqkok)
4373                                 rx_average++;
4374                         rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4375                         rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, temp_reg65);
4376                         break;
4377                 default:
4378                         break;
4379                 }
4380                 cal++;
4381         }
4382
4383         /* FillIQK Result */
4384         switch (path) {
4385         case RF90_PATH_A:
4386                 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
4387                          "========Path_A =======\n");
4388                 if (tx_average == 0)
4389                         break;
4390
4391                 for (i = 0; i < tx_average; i++) {
4392                         RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
4393                                  "TX_X0_RXK[%d] = %x ;; TX_Y0_RXK[%d] = %x\n", i,
4394                                  (tx_x0_rxk[i])>>21&0x000007ff, i,
4395                                  (tx_y0_rxk[i])>>21&0x000007ff);
4396                         RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
4397                                  "TX_X0[%d] = %x ;; TX_Y0[%d] = %x\n", i,
4398                                  (tx_x0[i])>>21&0x000007ff, i,
4399                                  (tx_y0[i])>>21&0x000007ff);
4400                 }
4401                 for (i = 0; i < tx_average; i++) {
4402                         for (ii = i+1; ii < tx_average; ii++) {
4403                                 dx = (tx_x0[i]>>21) - (tx_x0[ii]>>21);
4404                                 if (dx < 3 && dx > -3) {
4405                                         dy = (tx_y0[i]>>21) - (tx_y0[ii]>>21);
4406                                         if (dy < 3 && dy > -3) {
4407                                                 tx_x = ((tx_x0[i]>>21) + (tx_x0[ii]>>21))/2;
4408                                                 tx_y = ((tx_y0[i]>>21) + (tx_y0[ii]>>21))/2;
4409                                                 tx_finish = 1;
4410                                                 break;
4411                                         }
4412                                 }
4413                         }
4414                         if (tx_finish == 1)
4415                                 break;
4416                 }
4417
4418                 if (tx_finish == 1)
4419                         _rtl8821ae_iqk_tx_fill_iqc(hw, path, tx_x, tx_y); /* ? */
4420                 else
4421                         _rtl8821ae_iqk_tx_fill_iqc(hw, path, 0x200, 0x0);
4422
4423                 if (rx_average == 0)
4424                         break;
4425
4426                 for (i = 0; i < rx_average; i++)
4427                         RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
4428                                 "RX_X0[%d] = %x ;; RX_Y0[%d] = %x\n", i,
4429                                 (rx_x0[i])>>21&0x000007ff, i,
4430                                 (rx_y0[i])>>21&0x000007ff);
4431                 for (i = 0; i < rx_average; i++) {
4432                         for (ii = i+1; ii < rx_average; ii++) {
4433                                 dx = (rx_x0[i]>>21) - (rx_x0[ii]>>21);
4434                                 if (dx < 4 && dx > -4) {
4435                                         dy = (rx_y0[i]>>21) - (rx_y0[ii]>>21);
4436                                         if (dy < 4 && dy > -4) {
4437                                                 rx_x = ((rx_x0[i]>>21) + (rx_x0[ii]>>21))/2;
4438                                                 rx_y = ((rx_y0[i]>>21) + (rx_y0[ii]>>21))/2;
4439                                                 rx_finish = 1;
4440                                                 break;
4441                                         }
4442                                 }
4443                         }
4444                         if (rx_finish == 1)
4445                                 break;
4446                 }
4447
4448                 if (rx_finish == 1)
4449                         _rtl8821ae_iqk_rx_fill_iqc(hw, path, rx_x, rx_y);
4450                 else
4451                         _rtl8821ae_iqk_rx_fill_iqc(hw, path, 0x200, 0x0);
4452                 break;
4453         default:
4454                 break;
4455         }
4456 }
4457
4458 static void _rtl8821ae_iqk_restore_rf(struct ieee80211_hw *hw,
4459                                       enum radio_path path,
4460                                       u32 *backup_rf_reg,
4461                                       u32 *rf_backup, u32 rf_reg_num)
4462 {
4463         struct rtl_priv *rtlpriv = rtl_priv(hw);
4464         u32 i;
4465
4466         rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4467         for (i = 0; i < RF_REG_NUM; i++)
4468                 rtl_set_rfreg(hw, path, backup_rf_reg[i], RFREG_OFFSET_MASK,
4469                               rf_backup[i]);
4470
4471         switch (path) {
4472         case RF90_PATH_A:
4473                 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
4474                          "RestoreRF Path A Success!!!!\n");
4475                 break;
4476         default:
4477                         break;
4478         }
4479 }
4480
4481 static void _rtl8821ae_iqk_restore_afe(struct ieee80211_hw *hw,
4482                                        u32 *afe_backup, u32 *backup_afe_reg,
4483                                        u32 afe_num)
4484 {
4485         u32 i;
4486         struct rtl_priv *rtlpriv = rtl_priv(hw);
4487
4488         rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4489         /* Reload AFE Parameters */
4490         for (i = 0; i < afe_num; i++)
4491                 rtl_write_dword(rtlpriv, backup_afe_reg[i], afe_backup[i]);
4492         rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
4493         rtl_write_dword(rtlpriv, 0xc80, 0x0);
4494         rtl_write_dword(rtlpriv, 0xc84, 0x0);
4495         rtl_write_dword(rtlpriv, 0xc88, 0x0);
4496         rtl_write_dword(rtlpriv, 0xc8c, 0x3c000000);
4497         rtl_write_dword(rtlpriv, 0xc90, 0x00000080);
4498         rtl_write_dword(rtlpriv, 0xc94, 0x00000000);
4499         rtl_write_dword(rtlpriv, 0xcc4, 0x20040000);
4500         rtl_write_dword(rtlpriv, 0xcc8, 0x20000000);
4501         rtl_write_dword(rtlpriv, 0xcb8, 0x0);
4502         RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "RestoreAFE Success!!!!\n");
4503 }
4504
4505 static void _rtl8821ae_iqk_restore_macbb(struct ieee80211_hw *hw,
4506                                          u32 *macbb_backup,
4507                                          u32 *backup_macbb_reg,
4508                                          u32 macbb_num)
4509 {
4510         u32 i;
4511         struct rtl_priv *rtlpriv = rtl_priv(hw);
4512
4513         rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4514         /* Reload MacBB Parameters */
4515         for (i = 0; i < macbb_num; i++)
4516                 rtl_write_dword(rtlpriv, backup_macbb_reg[i], macbb_backup[i]);
4517         RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "RestoreMacBB Success!!!!\n");
4518 }
4519
4520 #undef MACBB_REG_NUM
4521 #undef AFE_REG_NUM
4522 #undef RF_REG_NUM
4523
4524 #define MACBB_REG_NUM 11
4525 #define AFE_REG_NUM 12
4526 #define RF_REG_NUM 3
4527
4528 static void _rtl8821ae_phy_iq_calibrate(struct ieee80211_hw *hw)
4529 {
4530         u32     macbb_backup[MACBB_REG_NUM];
4531         u32 afe_backup[AFE_REG_NUM];
4532         u32 rfa_backup[RF_REG_NUM];
4533         u32 rfb_backup[RF_REG_NUM];
4534         u32 backup_macbb_reg[MACBB_REG_NUM] = {
4535                 0xb00, 0x520, 0x550, 0x808, 0x90c, 0xc00, 0xc50,
4536                 0xe00, 0xe50, 0x838, 0x82c
4537         };
4538         u32 backup_afe_reg[AFE_REG_NUM] = {
4539                 0xc5c, 0xc60, 0xc64, 0xc68, 0xc6c, 0xc70, 0xc74,
4540                 0xc78, 0xc7c, 0xc80, 0xc84, 0xcb8
4541         };
4542         u32     backup_rf_reg[RF_REG_NUM] = {0x65, 0x8f, 0x0};
4543
4544         _rtl8821ae_iqk_backup_macbb(hw, macbb_backup, backup_macbb_reg,
4545                                     MACBB_REG_NUM);
4546         _rtl8821ae_iqk_backup_afe(hw, afe_backup, backup_afe_reg, AFE_REG_NUM);
4547         _rtl8821ae_iqk_backup_rf(hw, rfa_backup, rfb_backup, backup_rf_reg,
4548                                  RF_REG_NUM);
4549
4550         _rtl8821ae_iqk_configure_mac(hw);
4551         _rtl8821ae_iqk_tx(hw, RF90_PATH_A);
4552         _rtl8821ae_iqk_restore_rf(hw, RF90_PATH_A, backup_rf_reg, rfa_backup,
4553                                   RF_REG_NUM);
4554
4555         _rtl8821ae_iqk_restore_afe(hw, afe_backup, backup_afe_reg, AFE_REG_NUM);
4556         _rtl8821ae_iqk_restore_macbb(hw, macbb_backup, backup_macbb_reg,
4557                                      MACBB_REG_NUM);
4558 }
4559
4560 static void _rtl8821ae_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool main)
4561 {
4562         struct rtl_priv *rtlpriv = rtl_priv(hw);
4563         /* struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); */
4564         /* struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); */
4565         RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "\n");
4566
4567         if (main)
4568                 rtl_set_bbreg(hw, RA_RFE_PINMUX + 4, BIT(29) | BIT(28), 0x1);
4569         else
4570                 rtl_set_bbreg(hw, RA_RFE_PINMUX + 4, BIT(29) | BIT(28), 0x2);
4571 }
4572
4573 #undef IQK_ADDA_REG_NUM
4574 #undef IQK_DELAY_TIME
4575
4576 void rtl8812ae_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery)
4577 {
4578 }
4579
4580 void rtl8812ae_do_iqk(struct ieee80211_hw *hw, u8 delta_thermal_index,
4581                       u8 thermal_value, u8 threshold)
4582 {
4583         struct rtl_dm   *rtldm = rtl_dm(rtl_priv(hw));
4584
4585         rtldm->thermalvalue_iqk = thermal_value;
4586         rtl8812ae_phy_iq_calibrate(hw, false);
4587 }
4588
4589 void rtl8821ae_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery)
4590 {
4591         struct rtl_priv *rtlpriv = rtl_priv(hw);
4592         struct rtl_phy *rtlphy = &rtlpriv->phy;
4593
4594         if (!rtlphy->lck_inprogress) {
4595                 spin_lock(&rtlpriv->locks.iqk_lock);
4596                 rtlphy->lck_inprogress = true;
4597                 spin_unlock(&rtlpriv->locks.iqk_lock);
4598
4599                 _rtl8821ae_phy_iq_calibrate(hw);
4600
4601                 spin_lock(&rtlpriv->locks.iqk_lock);
4602                 rtlphy->lck_inprogress = false;
4603                 spin_unlock(&rtlpriv->locks.iqk_lock);
4604         }
4605 }
4606
4607 void rtl8821ae_reset_iqk_result(struct ieee80211_hw *hw)
4608 {
4609         struct rtl_priv *rtlpriv = rtl_priv(hw);
4610         struct rtl_phy *rtlphy = &rtlpriv->phy;
4611         u8 i;
4612
4613         RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
4614                  "rtl8812ae_dm_reset_iqk_result:: settings regs %d default regs %d\n",
4615                  (int)(sizeof(rtlphy->iqk_matrix) /
4616                  sizeof(struct iqk_matrix_regs)),
4617                  IQK_MATRIX_SETTINGS_NUM);
4618
4619         for (i = 0; i < IQK_MATRIX_SETTINGS_NUM; i++) {
4620                 rtlphy->iqk_matrix[i].value[0][0] = 0x100;
4621                 rtlphy->iqk_matrix[i].value[0][2] = 0x100;
4622                 rtlphy->iqk_matrix[i].value[0][4] = 0x100;
4623                 rtlphy->iqk_matrix[i].value[0][6] = 0x100;
4624
4625                 rtlphy->iqk_matrix[i].value[0][1] = 0x0;
4626                 rtlphy->iqk_matrix[i].value[0][3] = 0x0;
4627                 rtlphy->iqk_matrix[i].value[0][5] = 0x0;
4628                 rtlphy->iqk_matrix[i].value[0][7] = 0x0;
4629
4630                 rtlphy->iqk_matrix[i].iqk_done = false;
4631         }
4632 }
4633
4634 void rtl8821ae_do_iqk(struct ieee80211_hw *hw, u8 delta_thermal_index,
4635                       u8 thermal_value, u8 threshold)
4636 {
4637         struct rtl_dm   *rtldm = rtl_dm(rtl_priv(hw));
4638
4639         rtl8821ae_reset_iqk_result(hw);
4640
4641         rtldm->thermalvalue_iqk = thermal_value;
4642         rtl8821ae_phy_iq_calibrate(hw, false);
4643 }
4644
4645 void rtl8821ae_phy_lc_calibrate(struct ieee80211_hw *hw)
4646 {
4647 }
4648
4649 void rtl8821ae_phy_ap_calibrate(struct ieee80211_hw *hw, s8 delta)
4650 {
4651 }
4652
4653 void rtl8821ae_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain)
4654 {
4655         _rtl8821ae_phy_set_rfpath_switch(hw, bmain);
4656 }
4657
4658 bool rtl8821ae_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
4659 {
4660         struct rtl_priv *rtlpriv = rtl_priv(hw);
4661         struct rtl_phy *rtlphy = &rtlpriv->phy;
4662         bool postprocessing = false;
4663
4664         RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
4665                  "-->IO Cmd(%#x), set_io_inprogress(%d)\n",
4666                   iotype, rtlphy->set_io_inprogress);
4667         do {
4668                 switch (iotype) {
4669                 case IO_CMD_RESUME_DM_BY_SCAN:
4670                         RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
4671                                  "[IO CMD] Resume DM after scan.\n");
4672                         postprocessing = true;
4673                         break;
4674                 case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
4675                 case IO_CMD_PAUSE_BAND1_DM_BY_SCAN:
4676                         RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
4677                                  "[IO CMD] Pause DM before scan.\n");
4678                         postprocessing = true;
4679                         break;
4680                 default:
4681                         pr_err("switch case %#x not processed\n",
4682                                iotype);
4683                         break;
4684                 }
4685         } while (false);
4686         if (postprocessing && !rtlphy->set_io_inprogress) {
4687                 rtlphy->set_io_inprogress = true;
4688                 rtlphy->current_io_type = iotype;
4689         } else {
4690                 return false;
4691         }
4692         rtl8821ae_phy_set_io(hw);
4693         RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "IO Type(%#x)\n", iotype);
4694         return true;
4695 }
4696
4697 static void rtl8821ae_phy_set_io(struct ieee80211_hw *hw)
4698 {
4699         struct rtl_priv *rtlpriv = rtl_priv(hw);
4700         struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
4701         struct rtl_phy *rtlphy = &rtlpriv->phy;
4702
4703         RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
4704                  "--->Cmd(%#x), set_io_inprogress(%d)\n",
4705                   rtlphy->current_io_type, rtlphy->set_io_inprogress);
4706         switch (rtlphy->current_io_type) {
4707         case IO_CMD_RESUME_DM_BY_SCAN:
4708                 if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC)
4709                         _rtl8821ae_resume_tx_beacon(hw);
4710                 rtl8821ae_dm_write_dig(hw, rtlphy->initgain_backup.xaagccore1);
4711                 rtl8821ae_dm_write_cck_cca_thres(hw,
4712                                                  rtlphy->initgain_backup.cca);
4713                 break;
4714         case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
4715                 if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC)
4716                         _rtl8821ae_stop_tx_beacon(hw);
4717                 rtlphy->initgain_backup.xaagccore1 = dm_digtable->cur_igvalue;
4718                 rtl8821ae_dm_write_dig(hw, 0x17);
4719                 rtlphy->initgain_backup.cca = dm_digtable->cur_cck_cca_thres;
4720                 rtl8821ae_dm_write_cck_cca_thres(hw, 0x40);
4721                 break;
4722         case IO_CMD_PAUSE_BAND1_DM_BY_SCAN:
4723                 break;
4724         default:
4725                 pr_err("switch case %#x not processed\n",
4726                        rtlphy->current_io_type);
4727                 break;
4728         }
4729         rtlphy->set_io_inprogress = false;
4730         RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
4731                  "(%#x)\n", rtlphy->current_io_type);
4732 }
4733
4734 static void rtl8821ae_phy_set_rf_on(struct ieee80211_hw *hw)
4735 {
4736         struct rtl_priv *rtlpriv = rtl_priv(hw);
4737
4738         rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b);
4739         rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
4740         rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
4741         rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
4742         rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
4743 }
4744
4745 static bool _rtl8821ae_phy_set_rf_power_state(struct ieee80211_hw *hw,
4746                                               enum rf_pwrstate rfpwr_state)
4747 {
4748         struct rtl_priv *rtlpriv = rtl_priv(hw);
4749         struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
4750         struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
4751         struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
4752         bool bresult = true;
4753         u8 i, queue_id;
4754         struct rtl8192_tx_ring *ring = NULL;
4755
4756         switch (rfpwr_state) {
4757         case ERFON:
4758                 if ((ppsc->rfpwr_state == ERFOFF) &&
4759                     RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
4760                         bool rtstatus = false;
4761                         u32 initializecount = 0;
4762
4763                         do {
4764                                 initializecount++;
4765                                 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
4766                                          "IPS Set eRf nic enable\n");
4767                                 rtstatus = rtl_ps_enable_nic(hw);
4768                         } while (!rtstatus && (initializecount < 10));
4769                         RT_CLEAR_PS_LEVEL(ppsc,
4770                                           RT_RF_OFF_LEVL_HALT_NIC);
4771                 } else {
4772                         RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
4773                                  "Set ERFON sleeped:%d ms\n",
4774                                   jiffies_to_msecs(jiffies -
4775                                                    ppsc->
4776                                                    last_sleep_jiffies));
4777                         ppsc->last_awake_jiffies = jiffies;
4778                         rtl8821ae_phy_set_rf_on(hw);
4779                 }
4780                 if (mac->link_state == MAC80211_LINKED) {
4781                         rtlpriv->cfg->ops->led_control(hw,
4782                                                        LED_CTL_LINK);
4783                 } else {
4784                         rtlpriv->cfg->ops->led_control(hw,
4785                                                        LED_CTL_NO_LINK);
4786                 }
4787                 break;
4788         case ERFOFF:
4789                 for (queue_id = 0, i = 0;
4790                      queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
4791                         ring = &pcipriv->dev.tx_ring[queue_id];
4792                         if (queue_id == BEACON_QUEUE ||
4793                             skb_queue_len(&ring->queue) == 0) {
4794                                 queue_id++;
4795                                 continue;
4796                         } else {
4797                                 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
4798                                          "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
4799                                          (i + 1), queue_id,
4800                                          skb_queue_len(&ring->queue));
4801
4802                                 udelay(10);
4803                                 i++;
4804                         }
4805                         if (i >= MAX_DOZE_WAITING_TIMES_9x) {
4806                                 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
4807                                          "\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
4808                                           MAX_DOZE_WAITING_TIMES_9x,
4809                                           queue_id,
4810                                           skb_queue_len(&ring->queue));
4811                                 break;
4812                         }
4813                 }
4814
4815                 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
4816                         RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
4817                                  "IPS Set eRf nic disable\n");
4818                         rtl_ps_disable_nic(hw);
4819                         RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
4820                 } else {
4821                         if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) {
4822                                 rtlpriv->cfg->ops->led_control(hw,
4823                                                                LED_CTL_NO_LINK);
4824                         } else {
4825                                 rtlpriv->cfg->ops->led_control(hw,
4826                                                                LED_CTL_POWER_OFF);
4827                         }
4828                 }
4829                 break;
4830         default:
4831                 pr_err("switch case %#x not processed\n",
4832                        rfpwr_state);
4833                 bresult = false;
4834                 break;
4835         }
4836         if (bresult)
4837                 ppsc->rfpwr_state = rfpwr_state;
4838         return bresult;
4839 }
4840
4841 bool rtl8821ae_phy_set_rf_power_state(struct ieee80211_hw *hw,
4842                                       enum rf_pwrstate rfpwr_state)
4843 {
4844         struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
4845
4846         bool bresult = false;
4847
4848         if (rfpwr_state == ppsc->rfpwr_state)
4849                 return bresult;
4850         bresult = _rtl8821ae_phy_set_rf_power_state(hw, rfpwr_state);
4851         return bresult;
4852 }