Merge remote-tracking branches 'asoc/fix/fsl-dma', 'asoc/fix/fsl-spdif', 'asoc/fix...
[cascardo/linux.git] / drivers / staging / rtl8192ee / rtl8192ee / 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
36 static u32 _rtl92ee_phy_rf_serial_read(struct ieee80211_hw *hw,
37                                        enum radio_path rfpath, u32 offset);
38 static void _rtl92ee_phy_rf_serial_write(struct ieee80211_hw *hw,
39                                          enum radio_path rfpath, u32 offset,
40                                          u32 data);
41 static u32 _rtl92ee_phy_calculate_bit_shift(u32 bitmask);
42 static bool _rtl92ee_phy_bb8192ee_config_parafile(struct ieee80211_hw *hw);
43 static bool _rtl92ee_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);
44 static bool _rtl92ee_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
45                                                    u8 configtype);
46 static bool _rtl92ee_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
47                                                      u8 configtype);
48 static void _rtl92ee_phy_init_bb_rf_register_definition(struct ieee80211_hw *hw);
49 static bool _rtl92ee_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
50                                               u32 cmdtableidx, u32 cmdtablesz,
51                                               enum swchnlcmd_id cmdid,
52                                               u32 para1, u32 para2,
53                                               u32 msdelay);
54 static bool _rtl92ee_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
55                                               u8 channel, u8 *stage,
56                                               u8 *step, u32 *delay);
57 static long _rtl92ee_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
58                                           enum wireless_mode wirelessmode,
59                                           u8 txpwridx);
60 static void rtl92ee_phy_set_rf_on(struct ieee80211_hw *hw);
61 static void rtl92ee_phy_set_io(struct ieee80211_hw *hw);
62
63 u32 rtl92ee_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask)
64 {
65         struct rtl_priv *rtlpriv = rtl_priv(hw);
66         u32 returnvalue, originalvalue, bitshift;
67
68         RT_TRACE(COMP_RF, DBG_TRACE,
69                  ("regaddr(%#x), bitmask(%#x)\n", regaddr, bitmask));
70         originalvalue = rtl_read_dword(rtlpriv, regaddr);
71         bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask);
72         returnvalue = (originalvalue & bitmask) >> bitshift;
73
74         RT_TRACE(COMP_RF, DBG_TRACE,
75                  ("BBR MASK = 0x%x Addr[0x%x]= 0x%x\n",
76                   bitmask, regaddr, originalvalue));
77
78         return returnvalue;
79 }
80
81 void rtl92ee_phy_set_bb_reg(struct ieee80211_hw *hw, u32 regaddr,
82                             u32 bitmask, u32 data)
83 {
84         struct rtl_priv *rtlpriv = rtl_priv(hw);
85         u32 originalvalue, bitshift;
86
87         RT_TRACE(COMP_RF, DBG_TRACE,
88                  ("regaddr(%#x), bitmask(%#x), data(%#x)\n",
89                   regaddr, bitmask, data));
90
91         if (bitmask != MASKDWORD) {
92                 originalvalue = rtl_read_dword(rtlpriv, regaddr);
93                 bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask);
94                 data = ((originalvalue & (~bitmask)) | (data << bitshift));
95         }
96
97         rtl_write_dword(rtlpriv, regaddr, data);
98
99         RT_TRACE(COMP_RF, DBG_TRACE,
100                  ("regaddr(%#x), bitmask(%#x), data(%#x)\n",
101                   regaddr, bitmask, data));
102 }
103
104 u32 rtl92ee_phy_query_rf_reg(struct ieee80211_hw *hw,
105                              enum radio_path rfpath, u32 regaddr, u32 bitmask)
106 {
107         struct rtl_priv *rtlpriv = rtl_priv(hw);
108         u32 original_value, readback_value, bitshift;
109         unsigned long flags;
110
111         RT_TRACE(COMP_RF, DBG_TRACE,
112                  ("regaddr(%#x), rfpath(%#x), bitmask(%#x)\n",
113                   regaddr, rfpath, bitmask));
114
115         spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
116
117
118         original_value = _rtl92ee_phy_rf_serial_read(hw , rfpath, regaddr);
119         bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask);
120         readback_value = (original_value & bitmask) >> bitshift;
121
122         spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
123
124         RT_TRACE(COMP_RF, DBG_TRACE,
125                  ("regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n",
126                   regaddr, rfpath, bitmask, original_value));
127
128         return readback_value;
129 }
130
131 void rtl92ee_phy_set_rf_reg(struct ieee80211_hw *hw,
132                             enum radio_path rfpath,
133                             u32 addr, u32 bitmask, u32 data)
134 {
135         struct rtl_priv *rtlpriv = rtl_priv(hw);
136         u32 original_value, bitshift;
137         unsigned long flags;
138
139         RT_TRACE(COMP_RF, DBG_TRACE,
140                  ("regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
141                   addr, bitmask, data, rfpath));
142
143         spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
144
145         if (bitmask != RFREG_OFFSET_MASK) {
146                 original_value = _rtl92ee_phy_rf_serial_read(hw, rfpath, addr);
147                 bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask);
148                 data = (original_value & (~bitmask)) | (data << bitshift);
149         }
150
151         _rtl92ee_phy_rf_serial_write(hw, rfpath, addr, data);
152
153         spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
154
155         RT_TRACE(COMP_RF, DBG_TRACE,
156                  ("regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
157                   addr, bitmask, data, rfpath));
158 }
159
160 static u32 _rtl92ee_phy_rf_serial_read(struct ieee80211_hw *hw,
161                                        enum radio_path rfpath, u32 offset)
162 {
163         struct rtl_priv *rtlpriv = rtl_priv(hw);
164         struct rtl_phy *rtlphy = &(rtlpriv->phy);
165         struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
166         u32 newoffset;
167         u32 tmplong, tmplong2;
168         u8 rfpi_enable = 0;
169         u32 retvalue;
170
171         offset &= 0xff;
172         newoffset = offset;
173         if (RT_CANNOT_IO(hw)) {
174                 RT_TRACE(COMP_ERR, DBG_EMERG, ("return all one\n"));
175                 return 0xFFFFFFFF;
176         }
177         tmplong = rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD);
178         if (rfpath == RF90_PATH_A)
179                 tmplong2 = tmplong;
180         else
181                 tmplong2 = rtl_get_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD);
182         tmplong2 = (tmplong2 & (~BLSSIREADADDRESS)) |
183                    (newoffset << 23) | BLSSIREADEDGE;
184         rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
185                       tmplong & (~BLSSIREADEDGE));
186         mdelay(1);
187         rtl_set_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD, tmplong2);
188         mdelay(1);
189         mdelay(1);
190         if (rfpath == RF90_PATH_A)
191                 rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1,
192                                                  BIT(8));
193         else if (rfpath == RF90_PATH_B)
194                 rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XB_HSSIPARAMETER1,
195                                                  BIT(8));
196         if (rfpi_enable)
197                 retvalue = rtl_get_bbreg(hw, pphyreg->rflssi_readbackpi,
198                                          BLSSIREADBACKDATA);
199         else
200                 retvalue = rtl_get_bbreg(hw, pphyreg->rflssi_readback,
201                                          BLSSIREADBACKDATA);
202         RT_TRACE(COMP_RF, DBG_TRACE,
203                  ("RFR-%d Addr[0x%x]= 0x%x\n",
204                   rfpath, pphyreg->rflssi_readback, retvalue));
205         return retvalue;
206 }
207
208 static void _rtl92ee_phy_rf_serial_write(struct ieee80211_hw *hw,
209                                          enum radio_path rfpath, u32 offset,
210                                          u32 data)
211 {
212         u32 data_and_addr;
213         u32 newoffset;
214         struct rtl_priv *rtlpriv = rtl_priv(hw);
215         struct rtl_phy *rtlphy = &(rtlpriv->phy);
216         struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
217
218         if (RT_CANNOT_IO(hw)) {
219                 RT_TRACE(COMP_ERR, DBG_EMERG, ("stop\n"));
220                 return;
221         }
222         offset &= 0xff;
223         newoffset = offset;
224         data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff;
225         rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr);
226         RT_TRACE(COMP_RF, DBG_TRACE,
227                  ("RFW-%d Addr[0x%x]= 0x%x\n", rfpath,
228                   pphyreg->rf3wire_offset, data_and_addr));
229 }
230
231 static u32 _rtl92ee_phy_calculate_bit_shift(u32 bitmask)
232 {
233         u32 i;
234
235         for (i = 0; i <= 31; i++) {
236                 if (((bitmask >> i) & 0x1) == 1)
237                         break;
238         }
239         return i;
240 }
241
242 bool rtl92ee_phy_mac_config(struct ieee80211_hw *hw)
243 {
244         bool rtstatus = _rtl92ee_phy_config_mac_with_headerfile(hw);
245
246         return rtstatus;
247 }
248
249 bool rtl92ee_phy_bb_config(struct ieee80211_hw *hw)
250 {
251         bool rtstatus = true;
252         struct rtl_priv *rtlpriv = rtl_priv(hw);
253         u16 regval;
254         u32 tmp;
255         u8 crystal_cap;
256
257         _rtl92ee_phy_init_bb_rf_register_definition(hw);
258         regval = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
259         rtl_write_word(rtlpriv, REG_SYS_FUNC_EN,
260                        regval | BIT(13) | BIT(0) | BIT(1));
261
262         rtl_write_byte(rtlpriv, REG_RF_CTRL, RF_EN | RF_RSTB | RF_SDMRSTB);
263         rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN,
264                        FEN_PPLL | FEN_PCIEA | FEN_DIO_PCIE |
265                        FEN_BB_GLB_RSTn | FEN_BBRSTB);
266
267         rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL + 1, 0x80);
268
269         tmp = rtl_read_dword(rtlpriv, 0x4c);
270         rtl_write_dword(rtlpriv, 0x4c, tmp | BIT(23));
271
272         rtstatus = _rtl92ee_phy_bb8192ee_config_parafile(hw);
273
274         crystal_cap = rtlpriv->efuse.eeprom_crystalcap & 0x3F;
275         rtl_set_bbreg(hw, REG_MAC_PHY_CTRL, 0xFFF000,
276                       (crystal_cap | (crystal_cap << 6)));
277         return rtstatus;
278 }
279
280 bool rtl92ee_phy_rf_config(struct ieee80211_hw *hw)
281 {
282         return rtl92ee_phy_rf6052_config(hw);
283 }
284
285 static bool _check_condition(struct ieee80211_hw *hw,
286                                      const u32  condition)
287 {
288         struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
289         struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
290         u32 _board = rtlefuse->board_type; /*need efuse define*/
291         u32 _interface = rtlhal->interface;
292         u32 _platform = 0x08;/*SupportPlatform */
293         u32 cond = condition;
294
295         if (condition == 0xCDCDCDCD)
296                 return true;
297         cond = condition & 0xFF;
298         if ((_board != cond) && (cond != 0xFF))
299                 return false;
300         cond = condition & 0xFF00;
301         cond = cond >> 8;
302         if ((_interface & cond) == 0 && cond != 0x07)
303                 return false;
304         cond = condition & 0xFF0000;
305         cond = cond >> 16;
306         if ((_platform & cond) == 0 && cond != 0x0F)
307                 return false;
308         return true;
309 }
310
311 static void _rtl92ee_config_rf_reg(struct ieee80211_hw *hw, u32 addr, u32 data,
312                                    enum radio_path rfpath, u32 regaddr)
313 {
314         if (addr == 0xfe || addr == 0xffe) {
315                 mdelay(50);
316         } else {
317                 rtl_set_rfreg(hw, rfpath, regaddr, RFREG_OFFSET_MASK, data);
318                 udelay(1);
319
320                 if (addr == 0xb6) {
321                         u32 getvalue;
322                         u8 count = 0;
323                         getvalue = rtl_get_rfreg(hw, rfpath, addr, MASKDWORD);
324                         udelay(1);
325
326                         while ((getvalue >> 8) != (data >> 8)) {
327                                 count++;
328                                 rtl_set_rfreg(hw, rfpath, regaddr,
329                                               RFREG_OFFSET_MASK, data);
330                                 udelay(1);
331                                 getvalue = rtl_get_rfreg(hw, rfpath, addr,
332                                                          MASKDWORD);
333                                 if (count > 5)
334                                         break;
335                         }
336                 }
337
338                 if (addr == 0xb2) {
339                         u32 getvalue;
340                         u8 count = 0;
341                         getvalue = rtl_get_rfreg(hw, rfpath, addr, MASKDWORD);
342
343                         udelay(1);
344
345                         while (getvalue != data) {
346                                 count++;
347                                 rtl_set_rfreg(hw, rfpath, regaddr,
348                                               RFREG_OFFSET_MASK, data);
349                                 udelay(1);
350                                 rtl_set_rfreg(hw, rfpath, 0x18,
351                                               RFREG_OFFSET_MASK, 0x0fc07);
352                                 udelay(1);
353                                 getvalue = rtl_get_rfreg(hw, rfpath, addr,
354                                                          MASKDWORD);
355                                 if (count > 5)
356                                         break;
357                         }
358                 }
359         }
360 }
361
362 static void _rtl92ee_config_rf_radio_a(struct ieee80211_hw *hw,
363                                        u32 addr, u32 data)
364 {
365         u32 content = 0x1000; /*RF Content: radio_a_txt*/
366         u32 maskforphyset = (u32)(content & 0xE000);
367
368         _rtl92ee_config_rf_reg(hw, addr, data, RF90_PATH_A,
369                                addr | maskforphyset);
370 }
371
372 static void _rtl92ee_config_rf_radio_b(struct ieee80211_hw *hw,
373                                        u32 addr, u32 data)
374 {
375         u32 content = 0x1001; /*RF Content: radio_b_txt*/
376         u32 maskforphyset = (u32)(content & 0xE000);
377
378         _rtl92ee_config_rf_reg(hw, addr, data, RF90_PATH_B,
379                                addr | maskforphyset);
380 }
381
382 static void _rtl92ee_config_bb_reg(struct ieee80211_hw *hw,
383                                    u32 addr, u32 data)
384 {
385         if (addr == 0xfe)
386                 mdelay(50);
387         else if (addr == 0xfd)
388                 mdelay(5);
389         else if (addr == 0xfc)
390                 mdelay(1);
391         else if (addr == 0xfb)
392                 udelay(50);
393         else if (addr == 0xfa)
394                 udelay(5);
395         else if (addr == 0xf9)
396                 udelay(1);
397         else
398                 rtl_set_bbreg(hw, addr, MASKDWORD , data);
399
400         udelay(1);
401 }
402
403 static void _rtl92ee_phy_init_tx_power_by_rate(struct ieee80211_hw *hw)
404 {
405         struct rtl_priv *rtlpriv = rtl_priv(hw);
406         struct rtl_phy *rtlphy = &(rtlpriv->phy);
407
408         u8 band = BAND_ON_2_4G, rf = 0, txnum = 0, sec = 0;
409
410         for (; band <= BAND_ON_5G; ++band)
411                 for (; rf < TX_PWR_BY_RATE_NUM_RF; ++rf)
412                         for (; txnum < TX_PWR_BY_RATE_NUM_RF; ++txnum)
413                                 for (; sec < TX_PWR_BY_RATE_NUM_SECTION; ++sec)
414                                         rtlphy->tx_power_by_rate_offset
415                                                      [band][rf][txnum][sec] = 0;
416 }
417
418 static void _rtl92ee_phy_set_txpower_by_rate_base(struct ieee80211_hw *hw,
419                                                   u8 band, u8 path,
420                                                   u8 rate_section, u8 txnum, u8 value)
421 {
422         struct rtl_priv *rtlpriv = rtl_priv(hw);
423         struct rtl_phy *rtlphy = &(rtlpriv->phy);
424
425         if (path > RF90_PATH_D) {
426                 RT_TRACE(COMP_INIT, DBG_LOUD, ("Invalid Rf Path %d\n", path));
427                 return;
428         }
429         if (band == BAND_ON_2_4G) {
430                 switch (rate_section) {
431                 case CCK:
432                         rtlphy->txpwr_by_rate_base_24g[path][txnum][0] = value;
433                         break;
434                 case OFDM:
435                         rtlphy->txpwr_by_rate_base_24g[path][txnum][1] = value;
436                         break;
437                 case HT_MCS0_MCS7:
438                         rtlphy->txpwr_by_rate_base_24g[path][txnum][2] = value;
439                         break;
440                 case HT_MCS8_MCS15:
441                         rtlphy->txpwr_by_rate_base_24g[path][txnum][3] = value;
442                         break;
443                 default:
444                         RT_TRACE(COMP_INIT, DBG_LOUD,
445                                  ("Invalid RateSection %d in 2.4G, Rf %d,%dTx\n",
446                                   rate_section, path, txnum));
447                         break;
448                 };
449         } else {
450                 RT_TRACE(COMP_INIT, DBG_LOUD, ("Invalid Band %d\n", band));
451         }
452 }
453
454 static u8 _rtl92ee_phy_get_txpower_by_rate_base(struct ieee80211_hw *hw, u8 band,
455                                                 u8 path, u8 txnum, u8 rate_section)
456 {
457         struct rtl_priv *rtlpriv = rtl_priv(hw);
458         struct rtl_phy *rtlphy = &(rtlpriv->phy);
459         u8 value = 0;
460         if (path > RF90_PATH_D) {
461                 RT_TRACE(COMP_INIT, DBG_LOUD, ("Invalid Rf Path %d\n", path));
462                 return 0;
463         }
464         if (band == BAND_ON_2_4G) {
465                 switch (rate_section) {
466                 case CCK:
467                         value = rtlphy->txpwr_by_rate_base_24g[path][txnum][0];
468                         break;
469                 case OFDM:
470                         value = rtlphy->txpwr_by_rate_base_24g[path][txnum][1];
471                         break;
472                 case HT_MCS0_MCS7:
473                         value = rtlphy->txpwr_by_rate_base_24g[path][txnum][2];
474                         break;
475                 case HT_MCS8_MCS15:
476                         value = rtlphy->txpwr_by_rate_base_24g[path][txnum][3];
477                         break;
478                 default:
479                         RT_TRACE(COMP_INIT, DBG_LOUD,
480                                  ("Invalid RateSection %d in 2.4G, Rf %d,%dTx\n",
481                                   rate_section, path, txnum));
482                         break;
483                 };
484         } else {
485                 RT_TRACE(COMP_INIT, DBG_LOUD, ("Invalid Band %d()\n", band));
486         }
487         return value;
488 }
489
490 static void _rtl92ee_phy_store_txpower_by_rate_base(struct ieee80211_hw *hw)
491 {
492         struct rtl_priv *rtlpriv = rtl_priv(hw);
493         struct rtl_phy *rtlphy = &(rtlpriv->phy);
494         u16 raw = 0;
495         u8 base = 0, path = 0;
496
497         for (path = RF90_PATH_A; path <= RF90_PATH_B; ++path) {
498                 if (path == RF90_PATH_A) {
499                         raw = (u16) (rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][3] >> 24) & 0xFF;
500                         base = (raw >> 4) * 10 + (raw & 0xF);
501                         _rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G,
502                                                               path, CCK, RF_1TX,
503                                                               base);
504                 } else if (path == RF90_PATH_B) {
505                         raw = (u16) (rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][3] >> 0) & 0xFF;
506                         base = (raw >> 4) * 10 + (raw & 0xF);
507                         _rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G,
508                                                               path, CCK, RF_1TX,
509                                                               base);
510                 }
511                 raw = (u16) (rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][1] >> 24) & 0xFF;
512                 base = (raw >> 4) * 10 + (raw & 0xF);
513                 _rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path,
514                                                       OFDM, RF_1TX, base);
515
516                 raw = (u16) (rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][5] >> 24) & 0xFF;
517                 base = (raw >> 4) * 10 + (raw & 0xF);
518                 _rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path,
519                                                       HT_MCS0_MCS7, RF_1TX,
520                                                       base);
521
522                 raw = (u16) (rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_2TX][7] >> 24) & 0xFF;
523                 base = (raw >> 4) * 10 + (raw & 0xF);
524                 _rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path,
525                                                       HT_MCS8_MCS15, RF_2TX,
526                                                       base);
527         }
528 }
529
530 static void _phy_convert_txpower_dbm_to_relative_value(u32 *data, u8 start,
531                                                        u8 end, u8 base)
532 {
533         char i = 0;
534         u8 tmp = 0;
535         u32 temp_data = 0;
536
537         for (i = 3; i >= 0; --i) {
538                 if (i >= start && i <= end) {
539                         /* Get the exact value */
540                         tmp = (u8) (*data >> (i * 8)) & 0xF;
541                         tmp += ((u8) ((*data >> (i * 8 + 4)) & 0xF)) * 10;
542
543                         /* Change the value to a relative value */
544                         tmp = (tmp > base) ? tmp - base : base - tmp;
545                 } else {
546                         tmp = (u8) (*data >> (i * 8)) & 0xFF;
547                 }
548                 temp_data <<= 8;
549                 temp_data |= tmp;
550         }
551         *data = temp_data;
552 }
553
554 static void _rtl92ee_phy_convert_txpower_dbm_to_relative_value(struct ieee80211_hw *hw)
555 {
556         struct rtl_priv *rtlpriv = rtl_priv(hw);
557         struct rtl_phy *rtlphy = &(rtlpriv->phy);
558         u8 base = 0, rf = 0, band = BAND_ON_2_4G;
559
560         for (rf = RF90_PATH_A; rf <= RF90_PATH_B; ++rf) {
561                 if (rf == RF90_PATH_A) {
562                         base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band,
563                                                                      rf, RF_1TX,
564                                                                      CCK);
565                         _phy_convert_txpower_dbm_to_relative_value(
566                                 &(rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][2]),
567                                 1, 1, base);
568                         _phy_convert_txpower_dbm_to_relative_value(
569                                 &(rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][3]),
570                                 1, 3, base);
571                 } else if (rf == RF90_PATH_B) {
572                         base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band,
573                                                                      rf, RF_1TX,
574                                                                      CCK);
575                         _phy_convert_txpower_dbm_to_relative_value(
576                                 &(rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][3]),
577                                 0, 0, base);
578                         _phy_convert_txpower_dbm_to_relative_value(
579                                 &(rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][2]),
580                                 1, 3, base);
581                 }
582                 base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band, rf,
583                                                              RF_1TX, OFDM);
584                 _phy_convert_txpower_dbm_to_relative_value(
585                         &(rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][0]),
586                         0, 3, base);
587                 _phy_convert_txpower_dbm_to_relative_value(
588                         &(rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][1]),
589                         0, 3, base);
590
591                 base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band, rf,
592                                                              RF_1TX,
593                                                              HT_MCS0_MCS7);
594                 _phy_convert_txpower_dbm_to_relative_value(
595                         &(rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][4]),
596                         0, 3, base);
597                 _phy_convert_txpower_dbm_to_relative_value(
598                         &(rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][5]),
599                         0, 3, base);
600                 base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band, rf,
601                                                              RF_2TX,
602                                                              HT_MCS8_MCS15);
603                 _phy_convert_txpower_dbm_to_relative_value(
604                         &(rtlphy->tx_power_by_rate_offset[band][rf][RF_2TX][6]),
605                         0, 3, base);
606                 _phy_convert_txpower_dbm_to_relative_value(
607                         &(rtlphy->tx_power_by_rate_offset[band][rf][RF_2TX][7]),
608                         0, 3, base);
609         }
610         RT_TRACE(COMP_POWER, DBG_TRACE,
611                  ("<== _rtl92ee_phy_convert_txpower_dbm_to_relative_value()\n"));
612 }
613
614 static void _rtl92ee_phy_txpower_by_rate_configuration(struct ieee80211_hw *hw)
615 {
616         _rtl92ee_phy_store_txpower_by_rate_base(hw);
617         _rtl92ee_phy_convert_txpower_dbm_to_relative_value(hw);
618 }
619
620 static bool _rtl92ee_phy_bb8192ee_config_parafile(struct ieee80211_hw *hw)
621 {
622         struct rtl_priv *rtlpriv = rtl_priv(hw);
623         struct rtl_phy *rtlphy = &(rtlpriv->phy);
624         struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
625         bool rtstatus;
626
627         rtstatus = _rtl92ee_phy_config_bb_with_headerfile(hw,
628                                                        BASEBAND_CONFIG_PHY_REG);
629         if (!rtstatus) {
630                 RT_TRACE(COMP_ERR, DBG_EMERG, ("Write BB Reg Fail!!"));
631                 return false;
632         }
633
634         _rtl92ee_phy_init_tx_power_by_rate(hw);
635         if (rtlefuse->autoload_failflag == false) {
636                 rtlphy->pwrgroup_cnt = 0;
637                 rtstatus = _rtl92ee_phy_config_bb_with_pgheaderfile(hw,
638                                                        BASEBAND_CONFIG_PHY_REG);
639         }
640         _rtl92ee_phy_txpower_by_rate_configuration(hw);
641         if (!rtstatus) {
642                 RT_TRACE(COMP_ERR, DBG_EMERG, ("BB_PG Reg Fail!!"));
643                 return false;
644         }
645         rtstatus = _rtl92ee_phy_config_bb_with_headerfile(hw,
646                                                        BASEBAND_CONFIG_AGC_TAB);
647         if (!rtstatus) {
648                 RT_TRACE(COMP_ERR, DBG_EMERG, ("AGC Table Fail\n"));
649                 return false;
650         }
651         rtlphy->bcck_high_power = (bool) (rtl_get_bbreg(hw,
652                                                        RFPGA0_XA_HSSIPARAMETER2,
653                                                        0x200));
654
655         return true;
656 }
657
658 static bool _rtl92ee_phy_config_mac_with_headerfile(struct ieee80211_hw *hw)
659 {
660         struct rtl_priv *rtlpriv = rtl_priv(hw);
661         u32 i;
662         u32 arraylength;
663         u32 *ptrarray;
664
665         RT_TRACE(COMP_INIT, DBG_TRACE, ("Read Rtl8192EMACPHY_Array\n"));
666         arraylength = RTL8192EE_MAC_ARRAY_LEN;
667         ptrarray = RTL8192EE_MAC_ARRAY;
668         RT_TRACE(COMP_INIT, DBG_LOUD,
669                  ("Img:RTL8192EE_MAC_ARRAY LEN %d\n" , arraylength));
670         for (i = 0; i < arraylength; i = i + 2)
671                 rtl_write_byte(rtlpriv, ptrarray[i], (u8) ptrarray[i + 1]);
672         return true;
673 }
674
675 static bool _rtl92ee_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
676                                                    u8 configtype)
677 {
678         #define READ_NEXT_PAIR(v1, v2, i) \
679                 do { \
680                         i += 2; \
681                         v1 = array[i]; \
682                         v2 = array[i+1]; \
683                 } while (0)
684
685         int i;
686         u32 *array;
687         u16 len;
688         struct rtl_priv *rtlpriv = rtl_priv(hw);
689         u32 v1 = 0, v2 = 0;
690
691         if (configtype == BASEBAND_CONFIG_PHY_REG) {
692                 len = RTL8192EE_PHY_REG_ARRAY_LEN;
693                 array = RTL8192EE_PHY_REG_ARRAY;
694
695                 for (i = 0; i < len; i = i + 2) {
696                         v1 = array[i];
697                         v2 = array[i+1];
698                         if (v1 < 0xcdcdcdcd) {
699                                 _rtl92ee_config_bb_reg(hw, v1, v2);
700                         } else {/*This line is the start line of branch.*/
701                                 /* to protect READ_NEXT_PAIR not overrun */
702                                 if (i >= len - 2)
703                                         break;
704
705                                 if (!_check_condition(hw , array[i])) {
706                                         /*Discard the following pairs*/
707                                         READ_NEXT_PAIR(v1, v2, i);
708                                         while (v2 != 0xDEAD &&
709                                                v2 != 0xCDEF &&
710                                                v2 != 0xCDCD && i < len - 2)
711                                             READ_NEXT_PAIR(v1, v2, i);
712                                         i -= 2; /* prevent from for-loop += 2*/
713                                 } else{/* Configure matched pairs and
714                                        * skip to end of if-else. */
715                                         READ_NEXT_PAIR(v1, v2, i);
716                                         while (v2 != 0xDEAD &&
717                                                v2 != 0xCDEF &&
718                                                v2 != 0xCDCD && i < len - 2) {
719                                                 _rtl92ee_config_bb_reg(hw, v1,
720                                                                        v2);
721                                                 READ_NEXT_PAIR(v1, v2, i);
722                                         }
723
724                                         while (v2 != 0xDEAD && i < len - 2)
725                                                 READ_NEXT_PAIR(v1, v2, i);
726                                 }
727                         }
728                 }
729         } else if (configtype == BASEBAND_CONFIG_AGC_TAB) {
730                         len = RTL8192EE_AGC_TAB_ARRAY_LEN;
731                         array = RTL8192EE_AGC_TAB_ARRAY;
732
733                         for (i = 0; i < len; i = i + 2) {
734                                 v1 = array[i];
735                                 v2 = array[i+1];
736                                 if (v1 < 0xCDCDCDCD) {
737                                         rtl_set_bbreg(hw, array[i], MASKDWORD,
738                                                       array[i + 1]);
739                                         udelay(1);
740                                         continue;
741                             } else{/*This line is the start line of branch.*/
742                                   /* to protect READ_NEXT_PAIR not overrun */
743                                         if (i >= len - 2)
744                                                 break;
745
746                                         if (!_check_condition(hw , array[i])) {
747                                                 /*Discard the following pairs*/
748                                                 READ_NEXT_PAIR(v1, v2, i);
749                                                 while (v2 != 0xDEAD &&
750                                                        v2 != 0xCDEF &&
751                                                        v2 != 0xCDCD &&
752                                                        i < len - 2)
753                                                     READ_NEXT_PAIR(v1, v2, i);
754                                                 i -= 2; /* prevent from for-loop += 2*/
755                                         } else {/* Configure matched pairs and
756                                                * skip to end of if-else.*/
757                                                 READ_NEXT_PAIR(v1, v2, i);
758                                                 while (v2 != 0xDEAD &&
759                                                        v2 != 0xCDEF &&
760                                                        v2 != 0xCDCD &&
761                                                        i < len - 2) {
762                                                         rtl_set_bbreg(hw,
763                                                                       array[i],
764                                                                       MASKDWORD,
765                                                                       array[i + 1]);
766                                                         udelay(1);
767                                                         READ_NEXT_PAIR(v1 , v2 , i);
768                                                 }
769
770                                                 while (v2 != 0xDEAD &&
771                                                        i < len - 2)
772                                                         READ_NEXT_PAIR(v1 , v2 , i);
773                                         }
774                                 }
775                                 RT_TRACE(COMP_INIT, DBG_TRACE,
776                                          ("The agctab_array_table[0] is %x Rtl818EEPHY_REGArray[1] is %x\n",
777                                           array[i],
778                                           array[i + 1]));
779                 }
780         }
781         return true;
782 }
783
784 static u8 _rtl92ee_get_rate_section_index(u32 regaddr)
785 {
786         u8 index = 0;
787
788         switch (regaddr) {
789         case RTXAGC_A_RATE18_06:
790                 index = 0;
791                 break;
792         case RTXAGC_A_RATE54_24:
793                 index = 1;
794                 break;
795         case RTXAGC_A_CCK1_MCS32:
796                 index = 2;
797                 break;
798         case RTXAGC_B_CCK11_A_CCK2_11:
799                 index = 3;
800                 break;
801         case RTXAGC_A_MCS03_MCS00:
802                 index = 4;
803                 break;
804         case RTXAGC_A_MCS07_MCS04:
805                 index = 5;
806                 break;
807         case RTXAGC_A_MCS11_MCS08:
808                 index = 6;
809                 break;
810         case RTXAGC_A_MCS15_MCS12:
811                 index = 7;
812                 break;
813         case RTXAGC_B_RATE18_06:
814                 index = 0;
815                 break;
816         case RTXAGC_B_RATE54_24:
817                 index = 1;
818                 break;
819         case RTXAGC_B_CCK1_55_MCS32:
820                 index = 2;
821                 break;
822         case RTXAGC_B_MCS03_MCS00:
823                 index = 4;
824                 break;
825         case RTXAGC_B_MCS07_MCS04:
826                 index = 5;
827                 break;
828         case RTXAGC_B_MCS11_MCS08:
829                 index = 6;
830                 break;
831         case RTXAGC_B_MCS15_MCS12:
832                 index = 7;
833                 break;
834         default:
835                 regaddr &= 0xFFF;
836                 if (regaddr >= 0xC20 && regaddr <= 0xC4C)
837                         index = (u8) ((regaddr - 0xC20) / 4);
838                 else if (regaddr >= 0xE20 && regaddr <= 0xE4C)
839                         index = (u8) ((regaddr - 0xE20) / 4);
840                 break;
841         };
842         return index;
843 }
844
845 static void _rtl92ee_store_tx_power_by_rate(struct ieee80211_hw *hw,
846                                             enum band_type band,
847                                             enum radio_path rfpath,
848                                             u32 txnum, u32 regaddr,
849                                             u32 bitmask, u32 data)
850 {
851         struct rtl_priv *rtlpriv = rtl_priv(hw);
852         struct rtl_phy *rtlphy = &(rtlpriv->phy);
853         u8 section = _rtl92ee_get_rate_section_index(regaddr);
854
855         if (band != BAND_ON_2_4G && band != BAND_ON_5G) {
856                 RT_TRACE(FPHY, PHY_TXPWR, ("Invalid Band %d\n", band));
857                 return;
858         }
859
860         if (rfpath > MAX_RF_PATH - 1) {
861                 RT_TRACE(FPHY, PHY_TXPWR, ("Invalid RfPath %d\n", rfpath));
862                 return;
863         }
864         if (txnum > MAX_RF_PATH - 1) {
865                 RT_TRACE(FPHY, PHY_TXPWR, ("Invalid TxNum %d\n", txnum));
866                 return;
867         }
868
869         rtlphy->tx_power_by_rate_offset[band][rfpath][txnum][section] = data;
870 }
871
872 static bool _rtl92ee_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
873                                                      u8 configtype)
874 {
875         struct rtl_priv *rtlpriv = rtl_priv(hw);
876         int i;
877         u32 *phy_regarray_table_pg;
878         u16 phy_regarray_pg_len;
879         u32 v1 = 0, v2 = 0, v3 = 0, v4 = 0, v5 = 0, v6 = 0;
880
881         phy_regarray_pg_len = RTL8192EE_PHY_REG_ARRAY_PG_LEN;
882         phy_regarray_table_pg = RTL8192EE_PHY_REG_ARRAY_PG;
883
884         if (configtype == BASEBAND_CONFIG_PHY_REG) {
885                 for (i = 0; i < phy_regarray_pg_len; i = i + 6) {
886                         v1 = phy_regarray_table_pg[i];
887                         v2 = phy_regarray_table_pg[i+1];
888                         v3 = phy_regarray_table_pg[i+2];
889                         v4 = phy_regarray_table_pg[i+3];
890                         v5 = phy_regarray_table_pg[i+4];
891                         v6 = phy_regarray_table_pg[i+5];
892
893                         if (v1 < 0xcdcdcdcd) {
894                                 _rtl92ee_store_tx_power_by_rate(hw, v1, v2, v3,
895                                                                 v4, v5, v6);
896                                 continue;
897                         }
898                 }
899         } else {
900                 RT_TRACE(COMP_SEND, DBG_TRACE,
901                          ("configtype != BaseBand_Config_PHY_REG\n"));
902         }
903         return true;
904 }
905
906 bool rtl92ee_phy_config_rf_with_headerfile(struct ieee80211_hw  *hw,
907                                            enum radio_path rfpath)
908 {
909         #define READ_NEXT_RF_PAIR(v1, v2, i) \
910                 do { \
911                         i += 2; \
912                         v1 = array[i]; \
913                         v2 = array[i+1]; \
914                 } while (0)
915
916         int i;
917         u32 *array;
918         u16 len;
919         struct rtl_priv *rtlpriv = rtl_priv(hw);
920         u32 v1 = 0, v2 = 0;
921
922         switch (rfpath) {
923         case RF90_PATH_A:
924                 len = RTL8192EE_RADIOA_ARRAY_LEN;
925                 array = RTL8192EE_RADIOA_ARRAY;
926                 RT_TRACE(COMP_INIT, DBG_LOUD,
927                          ("Radio_A:RTL8192EE_RADIOA_ARRAY %d\n" , len));
928                 RT_TRACE(COMP_INIT, DBG_LOUD, ("Radio No %x\n", rfpath));
929                 for (i = 0; i < len; i = i + 2) {
930                         v1 = array[i];
931                         v2 = array[i+1];
932                         if (v1 < 0xcdcdcdcd) {
933                                 _rtl92ee_config_rf_radio_a(hw, v1, v2);
934                                 continue;
935                         } else {/*This line is the start line of branch.*/
936                                 /* to protect READ_NEXT_PAIR not overrun */
937                                 if (i >= len - 2)
938                                         break;
939
940                                 if (!_check_condition(hw , array[i])) {
941                                         /*Discard the following pairs*/
942                                         READ_NEXT_RF_PAIR(v1, v2, i);
943                                         while (v2 != 0xDEAD &&
944                                                v2 != 0xCDEF &&
945                                                v2 != 0xCDCD && i < len - 2)
946                                                 READ_NEXT_RF_PAIR(v1, v2, i);
947                                         i -= 2; /* prevent from for-loop += 2*/
948                                 } else {/* Configure matched pairs and
949                                          * skip to end of if-else.*/
950                                         READ_NEXT_RF_PAIR(v1, v2, i);
951                                         while (v2 != 0xDEAD &&
952                                                v2 != 0xCDEF &&
953                                                v2 != 0xCDCD && i < len - 2) {
954                                                 _rtl92ee_config_rf_radio_a(hw,
955                                                                            v1,
956                                                                            v2);
957                                                 READ_NEXT_RF_PAIR(v1, v2, i);
958                                         }
959
960                                         while (v2 != 0xDEAD && i < len - 2)
961                                                 READ_NEXT_RF_PAIR(v1, v2, i);
962                                 }
963                         }
964                 }
965                 break;
966
967         case RF90_PATH_B:
968                 len = RTL8192EE_RADIOB_ARRAY_LEN;
969                 array = RTL8192EE_RADIOB_ARRAY;
970                 RT_TRACE(COMP_INIT, DBG_LOUD,
971                          ("Radio_A:RTL8192EE_RADIOB_ARRAY %d\n" , len));
972                 RT_TRACE(COMP_INIT, DBG_LOUD, ("Radio No %x\n", rfpath));
973                 for (i = 0; i < len; i = i + 2) {
974                         v1 = array[i];
975                         v2 = array[i+1];
976                         if (v1 < 0xcdcdcdcd) {
977                                 _rtl92ee_config_rf_radio_b(hw, v1, v2);
978                                 continue;
979                         } else {/*This line is the start line of branch.*/
980                                 /* to protect READ_NEXT_PAIR not overrun */
981                                 if (i >= len - 2)
982                                         break;
983
984                                 if (!_check_condition(hw , array[i])) {
985                                         /*Discard the following pairs*/
986                                         READ_NEXT_RF_PAIR(v1, v2, i);
987                                         while (v2 != 0xDEAD &&
988                                                v2 != 0xCDEF &&
989                                                v2 != 0xCDCD && i < len - 2)
990                                                 READ_NEXT_RF_PAIR(v1, v2, i);
991                                         i -= 2; /* prevent from for-loop += 2*/
992                                 } else {/* Configure matched pairs and
993                                          * skip to end of if-else.*/
994                                         READ_NEXT_RF_PAIR(v1, v2, i);
995                                         while (v2 != 0xDEAD &&
996                                                v2 != 0xCDEF &&
997                                                v2 != 0xCDCD && i < len - 2) {
998                                                 _rtl92ee_config_rf_radio_b(hw,
999                                                                            v1,
1000                                                                            v2);
1001                                                 READ_NEXT_RF_PAIR(v1, v2, i);
1002                                         }
1003
1004                                         while (v2 != 0xDEAD && i < len - 2)
1005                                                 READ_NEXT_RF_PAIR(v1, v2, i);
1006                                 }
1007                         }
1008                 }
1009                 break;
1010         case RF90_PATH_C:
1011                 RT_TRACE(COMP_ERR, DBG_EMERG,
1012                          ("switch case not process\n"));
1013                 break;
1014         case RF90_PATH_D:
1015                 RT_TRACE(COMP_ERR, DBG_EMERG,
1016                          ("switch case not process\n"));
1017                 break;
1018         }
1019         return true;
1020 }
1021
1022 void rtl92ee_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
1023 {
1024         struct rtl_priv *rtlpriv = rtl_priv(hw);
1025         struct rtl_phy *rtlphy = &(rtlpriv->phy);
1026
1027         rtlphy->default_initialgain[0] =
1028                 (u8) rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
1029         rtlphy->default_initialgain[1] =
1030                 (u8) rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0);
1031         rtlphy->default_initialgain[2] =
1032                 (u8) rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0);
1033         rtlphy->default_initialgain[3] =
1034                 (u8) rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0);
1035
1036         RT_TRACE(COMP_INIT, DBG_TRACE,
1037                  ("Default initial gain (c50 = 0x%x, c58 = 0x%x, c60 = 0x%x, c68 = 0x%x\n",
1038                   rtlphy->default_initialgain[0],
1039                   rtlphy->default_initialgain[1],
1040                   rtlphy->default_initialgain[2],
1041                   rtlphy->default_initialgain[3]));
1042
1043         rtlphy->framesync = (u8) rtl_get_bbreg(hw,
1044                                                ROFDM0_RXDETECTOR3, MASKBYTE0);
1045         rtlphy->framesync_c34 = rtl_get_bbreg(hw,
1046                                               ROFDM0_RXDETECTOR2, MASKDWORD);
1047
1048         RT_TRACE(COMP_INIT, DBG_TRACE,
1049                  ("Default framesync (0x%x) = 0x%x\n",
1050                   ROFDM0_RXDETECTOR3, rtlphy->framesync));
1051 }
1052
1053 static void _rtl92ee_phy_init_bb_rf_register_definition(struct ieee80211_hw *hw)
1054 {
1055         struct rtl_priv *rtlpriv = rtl_priv(hw);
1056         struct rtl_phy *rtlphy = &(rtlpriv->phy);
1057
1058         rtlphy->phyreg_def[RF90_PATH_A].rfintfs = RFPGA0_XAB_RFINTERFACESW;
1059         rtlphy->phyreg_def[RF90_PATH_B].rfintfs = RFPGA0_XAB_RFINTERFACESW;
1060
1061         rtlphy->phyreg_def[RF90_PATH_A].rfintfo = RFPGA0_XA_RFINTERFACEOE;
1062         rtlphy->phyreg_def[RF90_PATH_B].rfintfo = RFPGA0_XB_RFINTERFACEOE;
1063
1064         rtlphy->phyreg_def[RF90_PATH_A].rfintfe = RFPGA0_XA_RFINTERFACEOE;
1065         rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE;
1066
1067         rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset =
1068                                                         RFPGA0_XA_LSSIPARAMETER;
1069         rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset =
1070                                                         RFPGA0_XB_LSSIPARAMETER;
1071
1072         rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para2 = RFPGA0_XA_HSSIPARAMETER2;
1073         rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para2 = RFPGA0_XB_HSSIPARAMETER2;
1074
1075         rtlphy->phyreg_def[RF90_PATH_A].rflssi_readback =
1076                                                          RFPGA0_XA_LSSIREADBACK;
1077         rtlphy->phyreg_def[RF90_PATH_B].rflssi_readback =
1078                                                          RFPGA0_XB_LSSIREADBACK;
1079
1080         rtlphy->phyreg_def[RF90_PATH_A].rflssi_readbackpi =
1081                                                       TRANSCEIVEA_HSPI_READBACK;
1082         rtlphy->phyreg_def[RF90_PATH_B].rflssi_readbackpi =
1083                                                       TRANSCEIVEB_HSPI_READBACK;
1084 }
1085
1086 void rtl92ee_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel)
1087 {
1088         struct rtl_priv *rtlpriv = rtl_priv(hw);
1089         struct rtl_phy *rtlphy = &(rtlpriv->phy);
1090         u8 txpwr_level;
1091         long txpwr_dbm;
1092
1093         txpwr_level = rtlphy->cur_cck_txpwridx;
1094         txpwr_dbm = _rtl92ee_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_B,
1095                                                   txpwr_level);
1096         txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
1097         if (_rtl92ee_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G, txpwr_level) >
1098             txpwr_dbm)
1099                 txpwr_dbm = _rtl92ee_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G,
1100                                                           txpwr_level);
1101         txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
1102         if (_rtl92ee_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_N_24G,
1103                                           txpwr_level) > txpwr_dbm)
1104                 txpwr_dbm = _rtl92ee_phy_txpwr_idx_to_dbm(hw,
1105                                                           WIRELESS_MODE_N_24G,
1106                                                           txpwr_level);
1107         *powerlevel = txpwr_dbm;
1108 }
1109
1110 static u8 _rtl92ee_phy_get_ratesection_intxpower_byrate(enum radio_path path,
1111                                                         u8 rate)
1112 {
1113         u8 rate_section = 0;
1114
1115         switch (rate) {
1116         case DESC92C_RATE1M:
1117                 rate_section = 2;
1118                 break;
1119
1120         case DESC92C_RATE2M:
1121         case DESC92C_RATE5_5M:
1122                 if (path == RF90_PATH_A)
1123                         rate_section = 3;
1124                 else if (path == RF90_PATH_B)
1125                         rate_section = 2;
1126                 break;
1127
1128         case DESC92C_RATE11M:
1129                 rate_section = 3;
1130                 break;
1131
1132         case DESC92C_RATE6M:
1133         case DESC92C_RATE9M:
1134         case DESC92C_RATE12M:
1135         case DESC92C_RATE18M:
1136                 rate_section = 0;
1137                 break;
1138
1139         case DESC92C_RATE24M:
1140         case DESC92C_RATE36M:
1141         case DESC92C_RATE48M:
1142         case DESC92C_RATE54M:
1143                 rate_section = 1;
1144                 break;
1145
1146         case DESC92C_RATEMCS0:
1147         case DESC92C_RATEMCS1:
1148         case DESC92C_RATEMCS2:
1149         case DESC92C_RATEMCS3:
1150                 rate_section = 4;
1151                 break;
1152
1153         case DESC92C_RATEMCS4:
1154         case DESC92C_RATEMCS5:
1155         case DESC92C_RATEMCS6:
1156         case DESC92C_RATEMCS7:
1157                 rate_section = 5;
1158                 break;
1159
1160         case DESC92C_RATEMCS8:
1161         case DESC92C_RATEMCS9:
1162         case DESC92C_RATEMCS10:
1163         case DESC92C_RATEMCS11:
1164                 rate_section = 6;
1165                 break;
1166
1167         case DESC92C_RATEMCS12:
1168         case DESC92C_RATEMCS13:
1169         case DESC92C_RATEMCS14:
1170         case DESC92C_RATEMCS15:
1171                 rate_section = 7;
1172                 break;
1173
1174         default:
1175                 RT_ASSERT(true, ("Rate_Section is Illegal\n"));
1176                 break;
1177         }
1178
1179         return rate_section;
1180 }
1181
1182 static u8 _rtl92ee_get_txpower_by_rate(struct ieee80211_hw *hw,
1183                                        enum band_type band,
1184                                        enum radio_path rf, u8 rate)
1185 {
1186         struct rtl_priv *rtlpriv = rtl_priv(hw);
1187         struct rtl_phy *rtlphy = &(rtlpriv->phy);
1188         u8 shift = 0, sec, tx_num;
1189         char diff = 0;
1190
1191         sec = _rtl92ee_phy_get_ratesection_intxpower_byrate(rf, rate);
1192         tx_num = RF_TX_NUM_NONIMPLEMENT;
1193
1194         if (tx_num == RF_TX_NUM_NONIMPLEMENT) {
1195                 if ((rate >= DESC92C_RATEMCS8 && rate <= DESC92C_RATEMCS15))
1196                         tx_num = RF_2TX;
1197                 else
1198                         tx_num = RF_1TX;
1199         }
1200
1201         switch (rate) {
1202         case DESC92C_RATE1M:
1203                 shift = 0;
1204                 break;
1205         case DESC92C_RATE2M:
1206                 shift = 8;
1207                 break;
1208         case DESC92C_RATE5_5M:
1209                 shift = 16;
1210                 break;
1211         case DESC92C_RATE11M:
1212                 shift = 24;
1213                 break;
1214
1215         case DESC92C_RATE6M:
1216                 shift = 0;
1217                 break;
1218         case DESC92C_RATE9M:
1219                 shift = 8;
1220                 break;
1221         case DESC92C_RATE12M:
1222                 shift = 16;
1223                 break;
1224         case DESC92C_RATE18M:
1225                 shift = 24;
1226                 break;
1227
1228         case DESC92C_RATE24M:
1229                 shift = 0;
1230                 break;
1231         case DESC92C_RATE36M:
1232                 shift = 8;
1233                 break;
1234         case DESC92C_RATE48M:
1235                 shift = 16;
1236                 break;
1237         case DESC92C_RATE54M:
1238                 shift = 24;
1239                 break;
1240
1241         case DESC92C_RATEMCS0:
1242                 shift = 0;
1243                 break;
1244         case DESC92C_RATEMCS1:
1245                 shift = 8;
1246                 break;
1247         case DESC92C_RATEMCS2:
1248                 shift = 16;
1249                 break;
1250         case DESC92C_RATEMCS3:
1251                 shift = 24;
1252                 break;
1253
1254         case DESC92C_RATEMCS4:
1255                 shift = 0;
1256                 break;
1257         case DESC92C_RATEMCS5:
1258                 shift = 8;
1259                 break;
1260         case DESC92C_RATEMCS6:
1261                 shift = 16;
1262                 break;
1263         case DESC92C_RATEMCS7:
1264                 shift = 24;
1265                 break;
1266
1267         case DESC92C_RATEMCS8:
1268                 shift = 0;
1269                 break;
1270         case DESC92C_RATEMCS9:
1271                 shift = 8;
1272                 break;
1273         case DESC92C_RATEMCS10:
1274                 shift = 16;
1275                 break;
1276         case DESC92C_RATEMCS11:
1277                 shift = 24;
1278                 break;
1279
1280         case DESC92C_RATEMCS12:
1281                 shift = 0;
1282                 break;
1283         case DESC92C_RATEMCS13:
1284                 shift = 8;
1285                 break;
1286         case DESC92C_RATEMCS14:
1287                 shift = 16;
1288                 break;
1289         case DESC92C_RATEMCS15:
1290                 shift = 24;
1291                 break;
1292
1293         default:
1294                 RT_ASSERT(true, ("Rate_Section is Illegal\n"));
1295                 break;
1296         }
1297
1298         diff = (u8) (rtlphy->tx_power_by_rate_offset[band][rf][tx_num][sec] >>
1299                      shift) & 0xff;
1300
1301         return  diff;
1302 }
1303
1304 static u8 _rtl92ee_get_txpower_index(struct ieee80211_hw *hw,
1305                                      enum radio_path rfpath, u8 rate,
1306                                      u8 bw, u8 channel)
1307 {
1308         struct rtl_priv *rtlpriv = rtl_priv(hw);
1309         struct rtl_efuse *rtlefuse = rtl_efuse(rtlpriv);
1310         u8 index = (channel - 1);
1311         u8 tx_power = 0;
1312         u8 diff = 0;
1313
1314         if (channel < 1 || channel > 14) {
1315                 index = 0;
1316                 RT_TRACE(COMP_POWER_TRACKING, DBG_DMESG,
1317                          ("Illegal channel!!\n"));
1318         }
1319
1320         if (IS_CCK_RATE(rate))
1321                 tx_power = rtlefuse->txpwrlevel_cck[rfpath][index];
1322         else if (DESC92C_RATE6M <= rate)
1323                 tx_power = rtlefuse->txpwrlevel_ht40_1s[rfpath][index];
1324
1325         /* OFDM-1T*/
1326         if (DESC92C_RATE6M <= rate && rate <= DESC92C_RATE54M &&
1327             !IS_CCK_RATE(rate))
1328                 tx_power += rtlefuse->txpwr_legacyhtdiff[rfpath][TX_1S];
1329
1330         /* BW20-1S, BW20-2S */
1331         if (bw == HT_CHANNEL_WIDTH_20) {
1332                 if (DESC92C_RATEMCS0 <= rate && rate <= DESC92C_RATEMCS15)
1333                         tx_power += rtlefuse->txpwr_ht20diff[rfpath][TX_1S];
1334                 if (DESC92C_RATEMCS8 <= rate && rate <= DESC92C_RATEMCS15)
1335                         tx_power += rtlefuse->txpwr_ht20diff[rfpath][TX_2S];
1336         } else if (bw == HT_CHANNEL_WIDTH_20_40) {/* BW40-1S, BW40-2S */
1337                 if (DESC92C_RATEMCS0 <= rate && rate <= DESC92C_RATEMCS15)
1338                         tx_power += rtlefuse->txpwr_ht40diff[rfpath][TX_1S];
1339                 if (DESC92C_RATEMCS8 <= rate && rate <= DESC92C_RATEMCS15)
1340                         tx_power += rtlefuse->txpwr_ht40diff[rfpath][TX_2S];
1341         }
1342
1343         if (rtlefuse->eeprom_regulatory != 2)
1344                 diff = _rtl92ee_get_txpower_by_rate(hw, BAND_ON_2_4G,
1345                                                     rfpath, rate);
1346
1347         tx_power += diff;
1348
1349         if (tx_power > MAX_POWER_INDEX)
1350                 tx_power = MAX_POWER_INDEX;
1351
1352         return tx_power;
1353 }
1354
1355 static void _rtl92ee_set_txpower_index(struct ieee80211_hw *hw, u8 pwr_idx,
1356                                        enum radio_path rfpath, u8 rate)
1357 {
1358         struct rtl_priv *rtlpriv = rtl_priv(hw);
1359
1360         if (rfpath == RF90_PATH_A) {
1361                 switch (rate) {
1362                 case DESC92C_RATE1M:
1363                         rtl_set_bbreg(hw, RTXAGC_A_CCK1_MCS32,
1364                                       MASKBYTE1, pwr_idx);
1365                         break;
1366                 case DESC92C_RATE2M:
1367                         rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11,
1368                                       MASKBYTE1, pwr_idx);
1369                         break;
1370                 case DESC92C_RATE5_5M:
1371                         rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11,
1372                                       MASKBYTE2, pwr_idx);
1373                         break;
1374                 case DESC92C_RATE11M:
1375                         rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11,
1376                                       MASKBYTE3, pwr_idx);
1377                         break;
1378                 case DESC92C_RATE6M:
1379                         rtl_set_bbreg(hw, RTXAGC_A_RATE18_06,
1380                                       MASKBYTE0, pwr_idx);
1381                         break;
1382                 case DESC92C_RATE9M:
1383                         rtl_set_bbreg(hw, RTXAGC_A_RATE18_06,
1384                                       MASKBYTE1, pwr_idx);
1385                         break;
1386                 case DESC92C_RATE12M:
1387                         rtl_set_bbreg(hw, RTXAGC_A_RATE18_06,
1388                                       MASKBYTE2, pwr_idx);
1389                         break;
1390                 case DESC92C_RATE18M:
1391                         rtl_set_bbreg(hw, RTXAGC_A_RATE18_06,
1392                                       MASKBYTE3, pwr_idx);
1393                         break;
1394                 case DESC92C_RATE24M:
1395                         rtl_set_bbreg(hw, RTXAGC_A_RATE54_24,
1396                                       MASKBYTE0, pwr_idx);
1397                         break;
1398                 case DESC92C_RATE36M:
1399                         rtl_set_bbreg(hw, RTXAGC_A_RATE54_24,
1400                                       MASKBYTE1, pwr_idx);
1401                         break;
1402                 case DESC92C_RATE48M:
1403                         rtl_set_bbreg(hw, RTXAGC_A_RATE54_24,
1404                                       MASKBYTE2, pwr_idx);
1405                         break;
1406                 case DESC92C_RATE54M:
1407                         rtl_set_bbreg(hw, RTXAGC_A_RATE54_24,
1408                                       MASKBYTE3, pwr_idx);
1409                         break;
1410                 case DESC92C_RATEMCS0:
1411                         rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
1412                                       MASKBYTE0, pwr_idx);
1413                         break;
1414                 case DESC92C_RATEMCS1:
1415                         rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
1416                                       MASKBYTE1, pwr_idx);
1417                         break;
1418                 case DESC92C_RATEMCS2:
1419                         rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
1420                                       MASKBYTE2, pwr_idx);
1421                         break;
1422                 case DESC92C_RATEMCS3:
1423                         rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
1424                                       MASKBYTE3, pwr_idx);
1425                         break;
1426                 case DESC92C_RATEMCS4:
1427                         rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
1428                                       MASKBYTE0, pwr_idx);
1429                         break;
1430                 case DESC92C_RATEMCS5:
1431                         rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
1432                                       MASKBYTE1, pwr_idx);
1433                         break;
1434                 case DESC92C_RATEMCS6:
1435                         rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
1436                                       MASKBYTE2, pwr_idx);
1437                         break;
1438                 case DESC92C_RATEMCS7:
1439                         rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
1440                                       MASKBYTE3, pwr_idx);
1441                         break;
1442                 case DESC92C_RATEMCS8:
1443                         rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
1444                                       MASKBYTE0, pwr_idx);
1445                         break;
1446                 case DESC92C_RATEMCS9:
1447                         rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
1448                                       MASKBYTE1, pwr_idx);
1449                         break;
1450                 case DESC92C_RATEMCS10:
1451                         rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
1452                                       MASKBYTE2, pwr_idx);
1453                         break;
1454                 case DESC92C_RATEMCS11:
1455                         rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
1456                                       MASKBYTE3, pwr_idx);
1457                         break;
1458                 case DESC92C_RATEMCS12:
1459                         rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
1460                                       MASKBYTE0, pwr_idx);
1461                         break;
1462                 case DESC92C_RATEMCS13:
1463                         rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
1464                                       MASKBYTE1, pwr_idx);
1465                         break;
1466                 case DESC92C_RATEMCS14:
1467                         rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
1468                                       MASKBYTE2, pwr_idx);
1469                         break;
1470                 case DESC92C_RATEMCS15:
1471                         rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
1472                                       MASKBYTE3, pwr_idx);
1473                         break;
1474                 default:
1475                         RT_TRACE(COMP_POWER, DBG_LOUD, ("Invalid Rate!!\n"));
1476                         break;
1477                 }
1478         } else if (rfpath == RF90_PATH_B) {
1479                 switch (rate) {
1480                 case DESC92C_RATE1M:
1481                         rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32,
1482                                       MASKBYTE1, pwr_idx);
1483                         break;
1484                 case DESC92C_RATE2M:
1485                         rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32,
1486                                       MASKBYTE2, pwr_idx);
1487                         break;
1488                 case DESC92C_RATE5_5M:
1489                         rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32,
1490                                       MASKBYTE3, pwr_idx);
1491                         break;
1492                 case DESC92C_RATE11M:
1493                         rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11,
1494                                       MASKBYTE0, pwr_idx);
1495                         break;
1496                 case DESC92C_RATE6M:
1497                         rtl_set_bbreg(hw, RTXAGC_B_RATE18_06,
1498                                       MASKBYTE0, pwr_idx);
1499                         break;
1500                 case DESC92C_RATE9M:
1501                         rtl_set_bbreg(hw, RTXAGC_B_RATE18_06,
1502                                       MASKBYTE1, pwr_idx);
1503                         break;
1504                 case DESC92C_RATE12M:
1505                         rtl_set_bbreg(hw, RTXAGC_B_RATE18_06,
1506                                       MASKBYTE2, pwr_idx);
1507                         break;
1508                 case DESC92C_RATE18M:
1509                         rtl_set_bbreg(hw, RTXAGC_B_RATE18_06,
1510                                       MASKBYTE3, pwr_idx);
1511                         break;
1512                 case DESC92C_RATE24M:
1513                         rtl_set_bbreg(hw, RTXAGC_B_RATE54_24,
1514                                       MASKBYTE0, pwr_idx);
1515                         break;
1516                 case DESC92C_RATE36M:
1517                         rtl_set_bbreg(hw, RTXAGC_B_RATE54_24,
1518                                       MASKBYTE1, pwr_idx);
1519                         break;
1520                 case DESC92C_RATE48M:
1521                         rtl_set_bbreg(hw, RTXAGC_B_RATE54_24,
1522                                       MASKBYTE2, pwr_idx);
1523                         break;
1524                 case DESC92C_RATE54M:
1525                         rtl_set_bbreg(hw, RTXAGC_B_RATE54_24,
1526                                       MASKBYTE3, pwr_idx);
1527                         break;
1528                 case DESC92C_RATEMCS0:
1529                         rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
1530                                       MASKBYTE0, pwr_idx);
1531                         break;
1532                 case DESC92C_RATEMCS1:
1533                         rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
1534                                       MASKBYTE1, pwr_idx);
1535                         break;
1536                 case DESC92C_RATEMCS2:
1537                         rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
1538                                       MASKBYTE2, pwr_idx);
1539                         break;
1540                 case DESC92C_RATEMCS3:
1541                         rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
1542                                       MASKBYTE3, pwr_idx);
1543                         break;
1544                 case DESC92C_RATEMCS4:
1545                         rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
1546                                       MASKBYTE0, pwr_idx);
1547                         break;
1548                 case DESC92C_RATEMCS5:
1549                         rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
1550                                       MASKBYTE1, pwr_idx);
1551                         break;
1552                 case DESC92C_RATEMCS6:
1553                         rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
1554                                       MASKBYTE2, pwr_idx);
1555                         break;
1556                 case DESC92C_RATEMCS7:
1557                         rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
1558                                       MASKBYTE3, pwr_idx);
1559                         break;
1560                 case DESC92C_RATEMCS8:
1561                         rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
1562                                       MASKBYTE0, pwr_idx);
1563                         break;
1564                 case DESC92C_RATEMCS9:
1565                         rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
1566                                       MASKBYTE1, pwr_idx);
1567                         break;
1568                 case DESC92C_RATEMCS10:
1569                         rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
1570                                       MASKBYTE2, pwr_idx);
1571                         break;
1572                 case DESC92C_RATEMCS11:
1573                         rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
1574                                       MASKBYTE3, pwr_idx);
1575                         break;
1576                 case DESC92C_RATEMCS12:
1577                         rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
1578                                       MASKBYTE0, pwr_idx);
1579                         break;
1580                 case DESC92C_RATEMCS13:
1581                         rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
1582                                       MASKBYTE1, pwr_idx);
1583                         break;
1584                 case DESC92C_RATEMCS14:
1585                         rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
1586                                       MASKBYTE2, pwr_idx);
1587                         break;
1588                 case DESC92C_RATEMCS15:
1589                         rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
1590                                       MASKBYTE3, pwr_idx);
1591                         break;
1592                 default:
1593                         RT_TRACE(COMP_POWER, DBG_LOUD, ("Invalid Rate!!\n"));
1594                         break;
1595                 }
1596         } else {
1597                 RT_TRACE(COMP_POWER, DBG_LOUD, ("Invalid RFPath!!\n"));
1598         }
1599 }
1600
1601 static void rtl92ee_phy_set_txpower_index_by_rate_array(struct ieee80211_hw *hw,
1602                                                         enum radio_path rfpath, u8 bw,
1603                                                         u8 channel, u8 *rates, u8 size)
1604 {
1605         u8 i;
1606         u8 power_index;
1607         for (i = 0; i < size; i++) {
1608                 power_index = _rtl92ee_get_txpower_index(hw, rfpath, rates[i],
1609                                                          bw, channel);
1610                 _rtl92ee_set_txpower_index(hw, power_index, rfpath, rates[i]);
1611         }
1612 }
1613
1614 static void rtl92ee_phy_set_txpower_index_by_rate_section(struct ieee80211_hw *hw,
1615                                                           enum radio_path rfpath,
1616                                                           u8 channel,
1617                                                           enum rate_section section)
1618 {
1619         struct rtl_priv *rtlpriv = rtl_priv(hw);
1620         struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1621         struct rtl_phy *rtlphy = &(rtlpriv->phy);
1622
1623         if (section == CCK) {
1624                 u8 cck_rates[] = {DESC92C_RATE1M, DESC92C_RATE2M,
1625                                   DESC92C_RATE5_5M, DESC92C_RATE11M};
1626                 if (rtlhal->current_bandtype == BAND_ON_2_4G)
1627                         rtl92ee_phy_set_txpower_index_by_rate_array(hw, rfpath,
1628                                                         rtlphy->current_chan_bw,
1629                                                         channel, cck_rates, 4);
1630         } else if (section == OFDM) {
1631                 u8 ofdm_rates[] = {DESC92C_RATE6M, DESC92C_RATE9M,
1632                                    DESC92C_RATE12M, DESC92C_RATE18M,
1633                                    DESC92C_RATE24M, DESC92C_RATE36M,
1634                                    DESC92C_RATE48M, DESC92C_RATE54M};
1635                 rtl92ee_phy_set_txpower_index_by_rate_array(hw, rfpath,
1636                                                         rtlphy->current_chan_bw,
1637                                                         channel, ofdm_rates, 8);
1638         } else if (section == HT_MCS0_MCS7) {
1639                 u8 ht_rates1t[]  = {DESC92C_RATEMCS0, DESC92C_RATEMCS1,
1640                                     DESC92C_RATEMCS2, DESC92C_RATEMCS3,
1641                                     DESC92C_RATEMCS4, DESC92C_RATEMCS5,
1642                                     DESC92C_RATEMCS6, DESC92C_RATEMCS7};
1643                 rtl92ee_phy_set_txpower_index_by_rate_array(hw, rfpath,
1644                                                         rtlphy->current_chan_bw,
1645                                                         channel, ht_rates1t, 8);
1646         } else if (section == HT_MCS8_MCS15) {
1647                 u8 ht_rates2t[]  = {DESC92C_RATEMCS8, DESC92C_RATEMCS9,
1648                                     DESC92C_RATEMCS10, DESC92C_RATEMCS11,
1649                                     DESC92C_RATEMCS12, DESC92C_RATEMCS13,
1650                                     DESC92C_RATEMCS14, DESC92C_RATEMCS15};
1651                 rtl92ee_phy_set_txpower_index_by_rate_array(hw, rfpath,
1652                                                         rtlphy->current_chan_bw,
1653                                                         channel, ht_rates2t, 8);
1654         } else
1655                 RT_TRACE(FPHY, PHY_TXPWR,
1656                          ("Invalid RateSection %d\n", section));
1657 }
1658
1659 void rtl92ee_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
1660 {
1661         struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1662         struct rtl_phy *rtlphy = &(rtl_priv(hw)->phy);
1663         enum radio_path rfpath;
1664
1665         if (rtlefuse->b_txpwr_fromeprom == false)
1666                 return;
1667         for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
1668              rfpath++) {
1669                 rtl92ee_phy_set_txpower_index_by_rate_section(hw, rfpath,
1670                                                               channel, CCK);
1671                 rtl92ee_phy_set_txpower_index_by_rate_section(hw, rfpath,
1672                                                               channel, OFDM);
1673                 rtl92ee_phy_set_txpower_index_by_rate_section(hw, rfpath,
1674                                                               channel,
1675                                                               HT_MCS0_MCS7);
1676                 if (rtlphy->num_total_rfpath >= 2)
1677                         rtl92ee_phy_set_txpower_index_by_rate_section(hw,
1678                                                                 rfpath, channel,
1679                                                                 HT_MCS8_MCS15);
1680         }
1681 }
1682
1683 static long _rtl92ee_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
1684                                           enum wireless_mode wirelessmode,
1685                                           u8 txpwridx)
1686 {
1687         long offset;
1688         long pwrout_dbm;
1689
1690         switch (wirelessmode) {
1691         case WIRELESS_MODE_B:
1692                 offset = -7;
1693                 break;
1694         case WIRELESS_MODE_G:
1695         case WIRELESS_MODE_N_24G:
1696                 offset = -8;
1697                 break;
1698         default:
1699                 offset = -8;
1700                 break;
1701         }
1702         pwrout_dbm = txpwridx / 2 + offset;
1703         return pwrout_dbm;
1704 }
1705
1706 void rtl92ee_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
1707 {
1708         struct rtl_priv *rtlpriv = rtl_priv(hw);
1709         struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1710         enum io_type iotype;
1711
1712         if (!is_hal_stop(rtlhal)) {
1713                 switch (operation) {
1714                 case SCAN_OPT_BACKUP_BAND0:
1715                         iotype = IO_CMD_PAUSE_BAND0_DM_BY_SCAN;
1716                         rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_IO_CMD,
1717                                                       (u8 *)&iotype);
1718
1719                         break;
1720                 case SCAN_OPT_RESTORE:
1721                         iotype = IO_CMD_RESUME_DM_BY_SCAN;
1722                         rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_IO_CMD,
1723                                                       (u8 *)&iotype);
1724                         break;
1725                 default:
1726                         RT_TRACE(COMP_ERR, DBG_EMERG,
1727                                  ("Unknown Scan Backup operation.\n"));
1728                         break;
1729                 }
1730         }
1731 }
1732
1733 void rtl92ee_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
1734 {
1735         struct rtl_priv *rtlpriv = rtl_priv(hw);
1736         struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1737         struct rtl_phy *rtlphy = &(rtlpriv->phy);
1738         struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1739         u8 reg_bw_opmode;
1740         u8 reg_prsr_rsc;
1741
1742         RT_TRACE(COMP_SCAN, DBG_TRACE,
1743                  ("Switch to %s bandwidth\n",
1744                   rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
1745                   "20MHz" : "40MHz"));
1746
1747         if (is_hal_stop(rtlhal)) {
1748                 rtlphy->set_bwmode_inprogress = false;
1749                 return;
1750         }
1751
1752         reg_bw_opmode = rtl_read_byte(rtlpriv, REG_BWOPMODE);
1753         reg_prsr_rsc = rtl_read_byte(rtlpriv, REG_RRSR + 2);
1754
1755         switch (rtlphy->current_chan_bw) {
1756         case HT_CHANNEL_WIDTH_20:
1757                 reg_bw_opmode |= BW_OPMODE_20MHZ;
1758                 rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
1759                 break;
1760         case HT_CHANNEL_WIDTH_20_40:
1761                 reg_bw_opmode &= ~BW_OPMODE_20MHZ;
1762                 rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
1763                 reg_prsr_rsc = (reg_prsr_rsc & 0x90) |
1764                                (mac->cur_40_prime_sc << 5);
1765                 rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_prsr_rsc);
1766                 break;
1767         default:
1768                 RT_TRACE(COMP_ERR, DBG_EMERG,
1769                          ("unknown bandwidth: %#X\n", rtlphy->current_chan_bw));
1770                 break;
1771         }
1772
1773         switch (rtlphy->current_chan_bw) {
1774         case HT_CHANNEL_WIDTH_20:
1775                 rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x0);
1776                 rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x0);
1777                 rtl_set_bbreg(hw, ROFDM0_TXPSEUDONOISEWGT,
1778                               (BIT(31) | BIT(30)), 0);
1779                 break;
1780         case HT_CHANNEL_WIDTH_20_40:
1781                 rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x1);
1782                 rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x1);
1783                 rtl_set_bbreg(hw, RCCK0_SYSTEM, BCCK_SIDEBAND,
1784                               (mac->cur_40_prime_sc >> 1));
1785                 rtl_set_bbreg(hw, ROFDM1_LSTF, 0xC00,
1786                               mac->cur_40_prime_sc);
1787
1788                 rtl_set_bbreg(hw, 0x818, (BIT(26) | BIT(27)),
1789                               (mac->cur_40_prime_sc ==
1790                                HAL_PRIME_CHNL_OFFSET_LOWER) ? 2 : 1);
1791                 break;
1792         default:
1793                 RT_TRACE(COMP_ERR, DBG_EMERG,
1794                          ("unknown bandwidth: %#X\n", rtlphy->current_chan_bw));
1795                 break;
1796         }
1797         rtl92ee_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
1798         rtlphy->set_bwmode_inprogress = false;
1799         RT_TRACE(COMP_SCAN, DBG_LOUD, ("\n"));
1800 }
1801
1802 void rtl92ee_phy_set_bw_mode(struct ieee80211_hw *hw,
1803                              enum nl80211_channel_type ch_type)
1804 {
1805         struct rtl_priv *rtlpriv = rtl_priv(hw);
1806         struct rtl_phy *rtlphy = &(rtlpriv->phy);
1807         struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1808         u8 tmp_bw = rtlphy->current_chan_bw;
1809
1810         if (rtlphy->set_bwmode_inprogress)
1811                 return;
1812         rtlphy->set_bwmode_inprogress = true;
1813         if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
1814                 rtl92ee_phy_set_bw_mode_callback(hw);
1815         } else {
1816                 RT_TRACE(COMP_ERR, DBG_WARNING,
1817                          ("false driver sleep or unload\n"));
1818                 rtlphy->set_bwmode_inprogress = false;
1819                 rtlphy->current_chan_bw = tmp_bw;
1820         }
1821 }
1822
1823 void rtl92ee_phy_sw_chnl_callback(struct ieee80211_hw *hw)
1824 {
1825         struct rtl_priv *rtlpriv = rtl_priv(hw);
1826         struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1827         struct rtl_phy *rtlphy = &(rtlpriv->phy);
1828         u32 delay;
1829
1830         RT_TRACE(COMP_SCAN, DBG_TRACE,
1831                  ("switch to channel%d\n", rtlphy->current_channel));
1832         if (is_hal_stop(rtlhal))
1833                 return;
1834         do {
1835                 if (!rtlphy->sw_chnl_inprogress)
1836                         break;
1837                 if (!_rtl92ee_phy_sw_chnl_step_by_step
1838                     (hw, rtlphy->current_channel, &rtlphy->sw_chnl_stage,
1839                      &rtlphy->sw_chnl_step, &delay)) {
1840                         if (delay > 0)
1841                                 mdelay(delay);
1842                         else
1843                                 continue;
1844                 } else {
1845                         rtlphy->sw_chnl_inprogress = false;
1846                 }
1847                 break;
1848         } while (true);
1849         RT_TRACE(COMP_SCAN, DBG_TRACE, ("\n"));
1850 }
1851
1852 u8 rtl92ee_phy_sw_chnl(struct ieee80211_hw *hw)
1853 {
1854         struct rtl_priv *rtlpriv = rtl_priv(hw);
1855         struct rtl_phy *rtlphy = &(rtlpriv->phy);
1856         struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1857
1858         if (rtlphy->sw_chnl_inprogress)
1859                 return 0;
1860         if (rtlphy->set_bwmode_inprogress)
1861                 return 0;
1862         RT_ASSERT((rtlphy->current_channel <= 14),
1863                   ("WIRELESS_MODE_G but channel>14"));
1864         rtlphy->sw_chnl_inprogress = true;
1865         rtlphy->sw_chnl_stage = 0;
1866         rtlphy->sw_chnl_step = 0;
1867         if (!(is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
1868                 rtl92ee_phy_sw_chnl_callback(hw);
1869                 RT_TRACE(COMP_CHAN, DBG_LOUD,
1870                          ("sw_chnl_inprogress false schdule workitem current channel %d\n",
1871                          rtlphy->current_channel));
1872                 rtlphy->sw_chnl_inprogress = false;
1873         } else {
1874                 RT_TRACE(COMP_CHAN, DBG_LOUD,
1875                          ("sw_chnl_inprogress false driver sleep or unload\n"));
1876                 rtlphy->sw_chnl_inprogress = false;
1877         }
1878         return 1;
1879 }
1880
1881 static bool _rtl92ee_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
1882                                               u8 channel, u8 *stage, u8 *step,
1883                                               u32 *delay)
1884 {
1885         struct rtl_priv *rtlpriv = rtl_priv(hw);
1886         struct rtl_phy *rtlphy = &(rtlpriv->phy);
1887         struct swchnlcmd precommoncmd[MAX_PRECMD_CNT];
1888         u32 precommoncmdcnt;
1889         struct swchnlcmd postcommoncmd[MAX_POSTCMD_CNT];
1890         u32 postcommoncmdcnt;
1891         struct swchnlcmd rfdependcmd[MAX_RFDEPENDCMD_CNT];
1892         u32 rfdependcmdcnt;
1893         struct swchnlcmd *currentcmd = NULL;
1894         u8 rfpath;
1895         u8 num_total_rfpath = rtlphy->num_total_rfpath;
1896
1897         precommoncmdcnt = 0;
1898         _rtl92ee_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
1899                                           MAX_PRECMD_CNT,
1900                                           CMDID_SET_TXPOWEROWER_LEVEL, 0, 0, 0);
1901         _rtl92ee_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
1902                                           MAX_PRECMD_CNT, CMDID_END, 0, 0, 0);
1903
1904         postcommoncmdcnt = 0;
1905
1906         _rtl92ee_phy_set_sw_chnl_cmdarray(postcommoncmd, postcommoncmdcnt++,
1907                                           MAX_POSTCMD_CNT, CMDID_END, 0, 0, 0);
1908
1909         rfdependcmdcnt = 0;
1910
1911         RT_ASSERT((channel >= 1 && channel <= 14),
1912                   ("illegal channel for Zebra: %d\n", channel));
1913
1914         _rtl92ee_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
1915                                           MAX_RFDEPENDCMD_CNT,
1916                                           CMDID_RF_WRITEREG,
1917                                           RF_CHNLBW, channel, 10);
1918
1919         _rtl92ee_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
1920                                           MAX_RFDEPENDCMD_CNT, CMDID_END,
1921                                           0, 0, 0);
1922
1923         do {
1924                 switch (*stage) {
1925                 case 0:
1926                         currentcmd = &precommoncmd[*step];
1927                         break;
1928                 case 1:
1929                         currentcmd = &rfdependcmd[*step];
1930                         break;
1931                 case 2:
1932                         currentcmd = &postcommoncmd[*step];
1933                         break;
1934                 default:
1935                         RT_TRACE(COMP_ERR, DBG_EMERG,
1936                                  ("Invalid 'stage' = %d, Check it!\n" ,
1937                                   *stage));
1938                         return true;
1939                         break;
1940                 }
1941
1942                 if (currentcmd->cmdid == CMDID_END) {
1943                         if ((*stage) == 2) {
1944                                 return true;
1945                         } else {
1946                                 (*stage)++;
1947                                 (*step) = 0;
1948                                 continue;
1949                         }
1950                 }
1951
1952                 switch (currentcmd->cmdid) {
1953                 case CMDID_SET_TXPOWEROWER_LEVEL:
1954                         rtl92ee_phy_set_txpower_level(hw, channel);
1955                         break;
1956                 case CMDID_WRITEPORT_ULONG:
1957                         rtl_write_dword(rtlpriv, currentcmd->para1,
1958                                         currentcmd->para2);
1959                         break;
1960                 case CMDID_WRITEPORT_USHORT:
1961                         rtl_write_word(rtlpriv, currentcmd->para1,
1962                                        (u16) currentcmd->para2);
1963                         break;
1964                 case CMDID_WRITEPORT_UCHAR:
1965                         rtl_write_byte(rtlpriv, currentcmd->para1,
1966                                        (u8) currentcmd->para2);
1967                         break;
1968                 case CMDID_RF_WRITEREG:
1969                         for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) {
1970                                 rtlphy->rfreg_chnlval[rfpath] =
1971                                         ((rtlphy->rfreg_chnlval[rfpath] &
1972                                           0xfffff00) | currentcmd->para2);
1973
1974                                 rtl_set_rfreg(hw, (enum radio_path)rfpath,
1975                                               currentcmd->para1,
1976                                               0x3ff,
1977                                               rtlphy->rfreg_chnlval[rfpath]);
1978                         }
1979                         break;
1980                 default:
1981                         RT_TRACE(COMP_ERR, DBG_EMERG,
1982                                  ("switch case not process\n"));
1983                         break;
1984                 }
1985
1986                 break;
1987         } while (true);
1988
1989         (*delay) = currentcmd->msdelay;
1990         (*step)++;
1991         return false;
1992 }
1993
1994 static bool _rtl92ee_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
1995                                               u32 cmdtableidx, u32 cmdtablesz,
1996                                               enum swchnlcmd_id cmdid,
1997                                               u32 para1, u32 para2, u32 msdelay)
1998 {
1999         struct swchnlcmd *pcmd;
2000
2001         if (cmdtable == NULL) {
2002                 RT_ASSERT(false, ("cmdtable cannot be NULL.\n"));
2003                 return false;
2004         }
2005
2006         if (cmdtableidx >= cmdtablesz)
2007                 return false;
2008
2009         pcmd = cmdtable + cmdtableidx;
2010         pcmd->cmdid = cmdid;
2011         pcmd->para1 = para1;
2012         pcmd->para2 = para2;
2013         pcmd->msdelay = msdelay;
2014         return true;
2015 }
2016
2017 static u8 _rtl92ee_phy_path_a_iqk(struct ieee80211_hw *hw, bool config_pathb)
2018 {
2019         u32 reg_eac, reg_e94, reg_e9c;
2020         u8 result = 0x00;
2021         /* path-A IQK setting */
2022         /* PA/PAD controlled by 0x0 */
2023         rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2024         rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x180);
2025         rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2026
2027         rtl_set_bbreg(hw, RTx_IQK_Tone_A, MASKDWORD, 0x18008c1c);
2028         rtl_set_bbreg(hw, RRx_IQK_Tone_A, MASKDWORD, 0x38008c1c);
2029         rtl_set_bbreg(hw, RTx_IQK_Tone_B, MASKDWORD, 0x38008c1c);
2030         rtl_set_bbreg(hw, RRx_IQK_Tone_B, MASKDWORD, 0x38008c1c);
2031
2032         rtl_set_bbreg(hw, RTx_IQK_PI_A, MASKDWORD, 0x82140303);
2033         rtl_set_bbreg(hw, RRx_IQK_PI_A, MASKDWORD, 0x68160000);
2034
2035         /*LO calibration setting*/
2036         rtl_set_bbreg(hw, RIQK_AGC_Rsp, MASKDWORD, 0x00462911);
2037
2038         /*One shot, path A LOK & IQK*/
2039         rtl_set_bbreg(hw, RIQK_AGC_Pts, MASKDWORD, 0xf9000000);
2040         rtl_set_bbreg(hw, RIQK_AGC_Pts, MASKDWORD, 0xf8000000);
2041
2042         mdelay(IQK_DELAY_TIME);
2043
2044         reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
2045         reg_e94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD);
2046         reg_e9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD);
2047
2048         if (!(reg_eac & BIT(28)) &&
2049             (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
2050             (((reg_e9c & 0x03FF0000) >> 16) != 0x42))
2051                 result |= 0x01;
2052         else
2053                 return result;
2054
2055         return result;
2056 }
2057
2058 static u8 _rtl92ee_phy_path_b_iqk(struct ieee80211_hw *hw)
2059 {
2060         u32 reg_eac, reg_eb4, reg_ebc;
2061         u8 result = 0x00;
2062
2063         /* PA/PAD controlled by 0x0 */
2064         rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2065         rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x180);
2066         rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2067
2068         rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x00000000);
2069         rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
2070
2071         rtl_set_bbreg(hw, RTx_IQK_Tone_A, MASKDWORD, 0x38008c1c);
2072         rtl_set_bbreg(hw, RRx_IQK_Tone_A, MASKDWORD, 0x38008c1c);
2073         rtl_set_bbreg(hw, RTx_IQK_Tone_B, MASKDWORD, 0x18008c1c);
2074         rtl_set_bbreg(hw, RRx_IQK_Tone_B, MASKDWORD, 0x38008c1c);
2075
2076         rtl_set_bbreg(hw, RTx_IQK_PI_B, MASKDWORD, 0x821403e2);
2077         rtl_set_bbreg(hw, RRx_IQK_PI_B, MASKDWORD, 0x68160000);
2078
2079         /* LO calibration setting */
2080         rtl_set_bbreg(hw, RIQK_AGC_Rsp, MASKDWORD, 0x00462911);
2081
2082         /*One shot, path B LOK & IQK*/
2083         rtl_set_bbreg(hw, RIQK_AGC_Pts, MASKDWORD, 0xfa000000);
2084         rtl_set_bbreg(hw, RIQK_AGC_Pts, MASKDWORD, 0xf8000000);
2085
2086         mdelay(IQK_DELAY_TIME);
2087
2088         reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
2089         reg_eb4 = rtl_get_bbreg(hw, 0xeb4, MASKDWORD);
2090         reg_ebc = rtl_get_bbreg(hw, 0xebc, MASKDWORD);
2091
2092         if (!(reg_eac & BIT(31)) &&
2093             (((reg_eb4 & 0x03FF0000) >> 16) != 0x142) &&
2094             (((reg_ebc & 0x03FF0000) >> 16) != 0x42))
2095                 result |= 0x01;
2096         else
2097                 return result;
2098
2099         return result;
2100 }
2101
2102 static u8 _rtl92ee_phy_path_a_rx_iqk(struct ieee80211_hw *hw, bool config_pathb)
2103 {
2104         u32 reg_eac, reg_e94, reg_e9c, reg_ea4 , u32temp;
2105         u8 result = 0x00;
2106
2107         /*Get TXIMR Setting*/
2108         /*Modify RX IQK mode table*/
2109         rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2110
2111         rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
2112         rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
2113         rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
2114         rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf117b);
2115
2116         /*PA/PAD control by 0x56, and set = 0x0*/
2117         rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x980);
2118         rtl_set_rfreg(hw, RF90_PATH_A, 0x56, RFREG_OFFSET_MASK, 0x51000);
2119
2120         /*enter IQK mode*/
2121         rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2122
2123         /*IQK Setting*/
2124         rtl_set_bbreg(hw, RTx_IQK, MASKDWORD, 0x01007c00);
2125         rtl_set_bbreg(hw, RRx_IQK, MASKDWORD, 0x01004800);
2126
2127         /*path a IQK setting*/
2128         rtl_set_bbreg(hw, RTx_IQK_Tone_A, MASKDWORD, 0x18008c1c);
2129         rtl_set_bbreg(hw, RRx_IQK_Tone_A, MASKDWORD, 0x38008c1c);
2130         rtl_set_bbreg(hw, RTx_IQK_Tone_B, MASKDWORD, 0x38008c1c);
2131         rtl_set_bbreg(hw, RRx_IQK_Tone_B, MASKDWORD, 0x38008c1c);
2132
2133         rtl_set_bbreg(hw, RTx_IQK_PI_A, MASKDWORD, 0x82160c1f);
2134         rtl_set_bbreg(hw, RRx_IQK_PI_A, MASKDWORD, 0x68160c1f);
2135
2136         /*LO calibration Setting*/
2137         rtl_set_bbreg(hw, RIQK_AGC_Rsp, MASKDWORD, 0x0046a911);
2138
2139         /*one shot, path A LOK & iqk*/
2140         rtl_set_bbreg(hw, RIQK_AGC_Pts, MASKDWORD, 0xfa000000);
2141         rtl_set_bbreg(hw, RIQK_AGC_Pts, MASKDWORD, 0xf8000000);
2142
2143         mdelay(IQK_DELAY_TIME);
2144
2145         /* Check failed */
2146         reg_eac = rtl_get_bbreg(hw, RRx_Power_After_IQK_A_2, MASKDWORD);
2147         reg_e94 = rtl_get_bbreg(hw, RTx_Power_Before_IQK_A, MASKDWORD);
2148         reg_e9c = rtl_get_bbreg(hw, RTx_Power_After_IQK_A, MASKDWORD);
2149
2150         if (!(reg_eac & BIT(28)) &&
2151             (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
2152             (((reg_e9c & 0x03FF0000) >> 16) != 0x42)) {
2153                 result |= 0x01;
2154         } else {
2155                 /*      PA/PAD controlled by 0x0 */
2156                 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2157                 rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x180);
2158                 return result;
2159         }
2160
2161         u32temp = 0x80007C00 | (reg_e94 & 0x3FF0000)  |
2162                   ((reg_e9c & 0x3FF0000) >> 16);
2163         rtl_set_bbreg(hw, RTx_IQK, MASKDWORD, u32temp);
2164         /*RX IQK*/
2165         /*Modify RX IQK mode table*/
2166         rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2167
2168         rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
2169
2170         rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
2171         rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
2172         rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf7ffa);
2173
2174         /*PA/PAD control by 0x56, and set = 0x0*/
2175         rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x980);
2176         rtl_set_rfreg(hw, RF90_PATH_A, 0x56, RFREG_OFFSET_MASK, 0x51000);
2177
2178         /*enter IQK mode*/
2179         rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2180
2181         /*IQK Setting*/
2182         rtl_set_bbreg(hw, RRx_IQK, MASKDWORD, 0x01004800);
2183
2184         /*path a IQK setting*/
2185         rtl_set_bbreg(hw, RTx_IQK_Tone_A, MASKDWORD, 0x38008c1c);
2186         rtl_set_bbreg(hw, RRx_IQK_Tone_A, MASKDWORD, 0x18008c1c);
2187         rtl_set_bbreg(hw, RTx_IQK_Tone_B, MASKDWORD, 0x38008c1c);
2188         rtl_set_bbreg(hw, RRx_IQK_Tone_B, MASKDWORD, 0x38008c1c);
2189
2190         rtl_set_bbreg(hw, RTx_IQK_PI_A, MASKDWORD, 0x82160c1f);
2191         rtl_set_bbreg(hw, RRx_IQK_PI_A, MASKDWORD, 0x28160c1f);
2192
2193         /*LO calibration Setting*/
2194         rtl_set_bbreg(hw, RIQK_AGC_Rsp, MASKDWORD, 0x0046a891);
2195         /*one shot, path A LOK & iqk*/
2196         rtl_set_bbreg(hw, RIQK_AGC_Pts, MASKDWORD, 0xfa000000);
2197         rtl_set_bbreg(hw, RIQK_AGC_Pts, MASKDWORD, 0xf8000000);
2198
2199         mdelay(IQK_DELAY_TIME);
2200         /*Check failed*/
2201         reg_eac = rtl_get_bbreg(hw, RRx_Power_After_IQK_A_2, MASKDWORD);
2202         reg_ea4 = rtl_get_bbreg(hw, RRx_Power_Before_IQK_A_2, MASKDWORD);
2203
2204         /*PA/PAD controlled by 0x0*/
2205         /*leave IQK mode*/
2206         rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2207         rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x180);
2208         /*if Tx is OK, check whether Rx is OK*/
2209         if (!(reg_eac & BIT(27)) &&
2210             (((reg_ea4 & 0x03FF0000) >> 16) != 0x132) &&
2211             (((reg_eac & 0x03FF0000) >> 16) != 0x36))
2212                 result |= 0x02;
2213
2214         return result;
2215 }
2216
2217 static u8 _rtl92ee_phy_path_b_rx_iqk(struct ieee80211_hw *hw, bool config_pathb)
2218 {
2219         struct rtl_priv *rtlpriv = rtl_priv(hw);
2220         u32 reg_eac, reg_eb4, reg_ebc, reg_ecc, reg_ec4, u32temp;
2221         u8 result = 0x00;
2222
2223         /*Get TXIMR Setting*/
2224         /*Modify RX IQK mode table*/
2225         rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2226
2227         rtl_set_rfreg(hw, RF90_PATH_B, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
2228         rtl_set_rfreg(hw, RF90_PATH_B, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
2229         rtl_set_rfreg(hw, RF90_PATH_B, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
2230         rtl_set_rfreg(hw, RF90_PATH_B, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf117b);
2231
2232         /*PA/PAD all off*/
2233         rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x980);
2234         rtl_set_rfreg(hw, RF90_PATH_B, 0x56, RFREG_OFFSET_MASK, 0x51000);
2235
2236         rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2237
2238         /*IQK Setting*/
2239         rtl_set_bbreg(hw, RTx_IQK, MASKDWORD, 0x01007c00);
2240         rtl_set_bbreg(hw, RRx_IQK, MASKDWORD, 0x01004800);
2241
2242         /*path a IQK setting*/
2243         rtl_set_bbreg(hw, RTx_IQK_Tone_A, MASKDWORD, 0x38008c1c);
2244         rtl_set_bbreg(hw, RRx_IQK_Tone_A, MASKDWORD, 0x38008c1c);
2245         rtl_set_bbreg(hw, RTx_IQK_Tone_B, MASKDWORD, 0x18008c1c);
2246         rtl_set_bbreg(hw, RRx_IQK_Tone_B, MASKDWORD, 0x38008c1c);
2247
2248         rtl_set_bbreg(hw, RTx_IQK_PI_B, MASKDWORD, 0x82160c1f);
2249         rtl_set_bbreg(hw, RRx_IQK_PI_B, MASKDWORD, 0x68160c1f);
2250
2251         /*LO calibration Setting*/
2252         rtl_set_bbreg(hw, RIQK_AGC_Rsp, MASKDWORD, 0x0046a911);
2253
2254         /*one shot, path A LOK & iqk*/
2255         rtl_set_bbreg(hw, RIQK_AGC_Pts, MASKDWORD, 0xfa000000);
2256         rtl_set_bbreg(hw, RIQK_AGC_Pts, MASKDWORD, 0xf8000000);
2257
2258         mdelay(IQK_DELAY_TIME);
2259
2260         /* Check failed */
2261         reg_eac = rtl_get_bbreg(hw, RRx_Power_After_IQK_A_2, MASKDWORD);
2262         reg_eb4 = rtl_get_bbreg(hw, RTx_Power_Before_IQK_B, MASKDWORD);
2263         reg_ebc = rtl_get_bbreg(hw, RTx_Power_After_IQK_B, MASKDWORD);
2264
2265         if (!(reg_eac & BIT(31)) &&
2266             (((reg_eb4 & 0x03FF0000) >> 16) != 0x142) &&
2267             (((reg_ebc & 0x03FF0000) >> 16) != 0x42)) {
2268                 result |= 0x01;
2269         } else {
2270                 /*      PA/PAD controlled by 0x0 */
2271                 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2272                 rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x180);
2273                 return result;
2274         }
2275
2276         u32temp = 0x80007C00 | (reg_eb4 & 0x3FF0000) |
2277                   ((reg_ebc & 0x3FF0000) >> 16);
2278         rtl_set_bbreg(hw, RTx_IQK, MASKDWORD, u32temp);
2279         /*RX IQK*/
2280         /*Modify RX IQK mode table*/
2281         rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2282         rtl_set_rfreg(hw, RF90_PATH_B, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
2283
2284         rtl_set_rfreg(hw, RF90_PATH_B, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
2285         rtl_set_rfreg(hw, RF90_PATH_B, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
2286         rtl_set_rfreg(hw, RF90_PATH_B, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf7ffa);
2287
2288         /*PA/PAD all off*/
2289         rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x980);
2290         rtl_set_rfreg(hw, RF90_PATH_B, 0x56, RFREG_OFFSET_MASK, 0x51000);
2291
2292         /*enter IQK mode*/
2293         rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2294
2295         /*IQK Setting*/
2296         rtl_set_bbreg(hw, RRx_IQK, MASKDWORD, 0x01004800);
2297
2298         /*path b IQK setting*/
2299         rtl_set_bbreg(hw, RTx_IQK_Tone_A, MASKDWORD, 0x38008c1c);
2300         rtl_set_bbreg(hw, RRx_IQK_Tone_A, MASKDWORD, 0x38008c1c);
2301         rtl_set_bbreg(hw, RTx_IQK_Tone_B, MASKDWORD, 0x38008c1c);
2302         rtl_set_bbreg(hw, RRx_IQK_Tone_B, MASKDWORD, 0x18008c1c);
2303
2304         rtl_set_bbreg(hw, RTx_IQK_PI_B, MASKDWORD, 0x82160c1f);
2305         rtl_set_bbreg(hw, RRx_IQK_PI_B, MASKDWORD, 0x28160c1f);
2306
2307         /*LO calibration Setting*/
2308         rtl_set_bbreg(hw, RIQK_AGC_Rsp, MASKDWORD, 0x0046a891);
2309         /*one shot, path A LOK & iqk*/
2310         rtl_set_bbreg(hw, RIQK_AGC_Pts, MASKDWORD, 0xfa000000);
2311         rtl_set_bbreg(hw, RIQK_AGC_Pts, MASKDWORD, 0xf8000000);
2312
2313         mdelay(IQK_DELAY_TIME);
2314         /*Check failed*/
2315         reg_eac = rtl_get_bbreg(hw, RRx_Power_After_IQK_A_2, MASKDWORD);
2316         reg_ec4 = rtl_get_bbreg(hw, RRx_Power_Before_IQK_B_2, MASKDWORD);
2317         reg_ecc = rtl_get_bbreg(hw, RRx_Power_After_IQK_B_2, MASKDWORD);
2318         /*PA/PAD controlled by 0x0*/
2319         /*leave IQK mode*/
2320         rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2321         rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x180);
2322         /*if Tx is OK, check whether Rx is OK*/
2323         if (!(reg_eac & BIT(30)) &&
2324             (((reg_ec4 & 0x03FF0000) >> 16) != 0x132) &&
2325             (((reg_ecc & 0x03FF0000) >> 16) != 0x36))
2326                 result |= 0x02;
2327         else
2328                 RT_TRACE(COMP_RF, DBG_LOUD, ("Path B Rx IQK fail!!\n"));
2329
2330         return result;
2331 }
2332
2333 static void _rtl92ee_phy_path_a_fill_iqk_matrix(struct ieee80211_hw *hw,
2334                                                 bool b_iqk_ok, long result[][8],
2335                                                 u8 final_candidate,
2336                                                 bool btxonly)
2337 {
2338         u32 oldval_0, x, tx0_a, reg;
2339         long y, tx0_c;
2340
2341         if (final_candidate == 0xFF) {
2342                 return;
2343         } else if (b_iqk_ok) {
2344                 oldval_0 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
2345                                           MASKDWORD) >> 22) & 0x3FF;
2346                 x = result[final_candidate][0];
2347                 if ((x & 0x00000200) != 0)
2348                         x = x | 0xFFFFFC00;
2349                 tx0_a = (x * oldval_0) >> 8;
2350                 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x3FF, tx0_a);
2351                 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(31),
2352                               ((x * oldval_0 >> 7) & 0x1));
2353                 y = result[final_candidate][1];
2354                 if ((y & 0x00000200) != 0)
2355                         y = y | 0xFFFFFC00;
2356                 tx0_c = (y * oldval_0) >> 8;
2357                 rtl_set_bbreg(hw, ROFDM0_XCTXAFE, 0xF0000000,
2358                               ((tx0_c & 0x3C0) >> 6));
2359                 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x003F0000,
2360                               (tx0_c & 0x3F));
2361                 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(29),
2362                               ((y * oldval_0 >> 7) & 0x1));
2363
2364                 if (btxonly)
2365                         return;
2366
2367                 reg = result[final_candidate][2];
2368                 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0x3FF, reg);
2369
2370                 reg = result[final_candidate][3] & 0x3F;
2371                 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0xFC00, reg);
2372
2373                 reg = (result[final_candidate][3] >> 6) & 0xF;
2374                 rtl_set_bbreg(hw, ROFDM0_RXIQEXTANTA, 0xF0000000, reg);
2375         }
2376 }
2377
2378 static void _rtl92ee_phy_path_b_fill_iqk_matrix(struct ieee80211_hw *hw,
2379                                                 bool b_iqk_ok, long result[][8],
2380                                                 u8 final_candidate,
2381                                                 bool btxonly)
2382 {
2383         u32 oldval_1, x, tx1_a, reg;
2384         long y, tx1_c;
2385
2386         if (final_candidate == 0xFF) {
2387                 return;
2388         } else if (b_iqk_ok) {
2389                 oldval_1 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
2390                                           MASKDWORD) >> 22) & 0x3FF;
2391                 x = result[final_candidate][4];
2392                 if ((x & 0x00000200) != 0)
2393                         x = x | 0xFFFFFC00;
2394                 tx1_a = (x * oldval_1) >> 8;
2395                 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x3FF, tx1_a);
2396                 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(27),
2397                               ((x * oldval_1 >> 7) & 0x1));
2398                 y = result[final_candidate][5];
2399                 if ((y & 0x00000200) != 0)
2400                         y = y | 0xFFFFFC00;
2401                 tx1_c = (y * oldval_1) >> 8;
2402                 rtl_set_bbreg(hw, ROFDM0_XDTXAFE, 0xF0000000,
2403                               ((tx1_c & 0x3C0) >> 6));
2404                 rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 0x003F0000,
2405                               (tx1_c & 0x3F));
2406                 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(25),
2407                               ((y * oldval_1 >> 7) & 0x1));
2408
2409                 if (btxonly)
2410                         return;
2411
2412                 reg = result[final_candidate][6];
2413                 rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0x3FF, reg);
2414
2415                 reg = result[final_candidate][7] & 0x3F;
2416                 rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0xFC00, reg);
2417
2418                 reg = (result[final_candidate][7] >> 6) & 0xF;
2419                 rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0xF0000000, reg);
2420         }
2421 }
2422
2423 static void _rtl92ee_phy_save_adda_registers(struct ieee80211_hw *hw,
2424                                              u32 *addareg, u32 *addabackup,
2425                                              u32 registernum)
2426 {
2427         u32 i;
2428
2429         for (i = 0; i < registernum; i++)
2430                 addabackup[i] = rtl_get_bbreg(hw, addareg[i], MASKDWORD);
2431 }
2432
2433 static void _rtl92ee_phy_save_mac_registers(struct ieee80211_hw *hw,
2434                                             u32 *macreg, u32 *macbackup)
2435 {
2436         struct rtl_priv *rtlpriv = rtl_priv(hw);
2437         u32 i;
2438
2439         for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
2440                 macbackup[i] = rtl_read_byte(rtlpriv, macreg[i]);
2441
2442         macbackup[i] = rtl_read_dword(rtlpriv, macreg[i]);
2443 }
2444
2445 static void _rtl92ee_phy_reload_adda_registers(struct ieee80211_hw *hw,
2446                                                u32 *addareg, u32 *addabackup,
2447                                                u32 regiesternum)
2448 {
2449         u32 i;
2450
2451         for (i = 0; i < regiesternum; i++)
2452                 rtl_set_bbreg(hw, addareg[i], MASKDWORD, addabackup[i]);
2453 }
2454
2455 static void _rtl92ee_phy_reload_mac_registers(struct ieee80211_hw *hw,
2456                                               u32 *macreg, u32 *macbackup)
2457 {
2458         struct rtl_priv *rtlpriv = rtl_priv(hw);
2459         u32 i;
2460
2461         for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
2462                 rtl_write_byte(rtlpriv, macreg[i], (u8) macbackup[i]);
2463         rtl_write_dword(rtlpriv, macreg[i], macbackup[i]);
2464 }
2465
2466 static void _rtl92ee_phy_path_adda_on(struct ieee80211_hw *hw, u32 *addareg,
2467                                       bool is_patha_on, bool is2t)
2468 {
2469         u32 pathon;
2470         u32 i;
2471
2472         pathon = is_patha_on ? 0x0fc01616 : 0x0fc01616;
2473         if (!is2t) {
2474                 pathon = 0x0fc01616;
2475                 rtl_set_bbreg(hw, addareg[0], MASKDWORD, 0x0fc01616);
2476         } else {
2477                 rtl_set_bbreg(hw, addareg[0], MASKDWORD, pathon);
2478         }
2479
2480         for (i = 1; i < IQK_ADDA_REG_NUM; i++)
2481                 rtl_set_bbreg(hw, addareg[i], MASKDWORD, pathon);
2482 }
2483
2484 static void _rtl92ee_phy_mac_setting_calibration(struct ieee80211_hw *hw,
2485                                                  u32 *macreg, u32 *macbackup)
2486 {
2487         rtl_set_bbreg(hw, 0x520, 0x00ff0000, 0xff);
2488 }
2489
2490 static void _rtl92ee_phy_path_a_standby(struct ieee80211_hw *hw)
2491 {
2492         rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x0);
2493         rtl_set_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK, 0x10000);
2494         rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
2495 }
2496
2497 static bool _rtl92ee_phy_simularity_compare(struct ieee80211_hw *hw,
2498                                             long result[][8], u8 c1, u8 c2)
2499 {
2500         u32 i, j, diff, simularity_bitmap, bound;
2501
2502         u8 final_candidate[2] = { 0xFF, 0xFF };
2503         bool bresult = true/*, is2t = true*/;
2504         s32 tmp1, tmp2;
2505
2506         bound = 8;
2507
2508         simularity_bitmap = 0;
2509
2510         for (i = 0; i < bound; i++) {
2511                 if ((i == 1) || (i == 3) || (i == 5) || (i == 7)) {
2512                         if ((result[c1][i] & 0x00000200) != 0)
2513                                 tmp1 = result[c1][i] | 0xFFFFFC00;
2514                         else
2515                                 tmp1 = result[c1][i];
2516
2517                         if ((result[c2][i] & 0x00000200) != 0)
2518                                 tmp2 = result[c2][i] | 0xFFFFFC00;
2519                         else
2520                                 tmp2 = result[c2][i];
2521                 } else {
2522                         tmp1 = result[c1][i];
2523                         tmp2 = result[c2][i];
2524                 }
2525
2526                 diff = (tmp1 > tmp2) ? (tmp1 - tmp2) : (tmp2 - tmp1);
2527
2528                 if (diff > MAX_TOLERANCE) {
2529                         if ((i == 2 || i == 6) && !simularity_bitmap) {
2530                                 if (result[c1][i] + result[c1][i + 1] == 0)
2531                                         final_candidate[(i / 4)] = c2;
2532                                 else if (result[c2][i] + result[c2][i + 1] == 0)
2533                                         final_candidate[(i / 4)] = c1;
2534                                 else
2535                                         simularity_bitmap |= (1 << i);
2536                         } else {
2537                                 simularity_bitmap |= (1 << i);
2538                         }
2539                 }
2540         }
2541
2542         if (simularity_bitmap == 0) {
2543                 for (i = 0; i < (bound / 4); i++) {
2544                         if (final_candidate[i] != 0xFF) {
2545                                 for (j = i * 4; j < (i + 1) * 4 - 2; j++)
2546                                         result[3][j] =
2547                                                 result[final_candidate[i]][j];
2548                                 bresult = false;
2549                         }
2550                 }
2551                 return bresult;
2552         } else {
2553                 if (!(simularity_bitmap & 0x03)) {/*path A TX OK*/
2554                         for (i = 0; i < 2; i++)
2555                                 result[3][i] = result[c1][i];
2556                 }
2557                 if (!(simularity_bitmap & 0x0c)) {/*path A RX OK*/
2558                         for (i = 2; i < 4; i++)
2559                                 result[3][i] = result[c1][i];
2560                 }
2561                 if (!(simularity_bitmap & 0x30)) {/*path B TX OK*/
2562                         for (i = 4; i < 6; i++)
2563                                 result[3][i] = result[c1][i];
2564                 }
2565                 if (!(simularity_bitmap & 0xc0)) {/*path B RX OK*/
2566                         for (i = 6; i < 8; i++)
2567                                 result[3][i] = result[c1][i];
2568                 }
2569                 return false;
2570         }
2571 }
2572
2573 static void _rtl92ee_phy_iq_calibrate(struct ieee80211_hw *hw,
2574                                       long result[][8], u8 t, bool is2t)
2575 {
2576         struct rtl_priv *rtlpriv = rtl_priv(hw);
2577         struct rtl_phy *rtlphy = &(rtlpriv->phy);
2578         u32 i;
2579         u8 patha_ok, pathb_ok;
2580         u8 tmp_0xc50 = (u8) rtl_get_bbreg(hw, 0xc50, MASKBYTE0);
2581         u8 tmp_0xc58 = (u8) rtl_get_bbreg(hw, 0xc58, MASKBYTE0);
2582         u32 adda_reg[IQK_ADDA_REG_NUM] = {
2583                 0x85c, 0xe6c, 0xe70, 0xe74,
2584                 0xe78, 0xe7c, 0xe80, 0xe84,
2585                 0xe88, 0xe8c, 0xed0, 0xed4,
2586                 0xed8, 0xedc, 0xee0, 0xeec
2587         };
2588
2589         u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
2590                 0x522, 0x550, 0x551, 0x040
2591         };
2592
2593         u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
2594                 ROFDM0_TRXPATHENABLE, ROFDM0_TRMUXPAR,
2595                 RFPGA0_XCD_RFINTERFACESW, 0xb68, 0xb6c,
2596                 0x870, 0x860,
2597                 0x864, 0x800
2598         };
2599
2600         const u32 retrycount = 2;
2601
2602
2603         if (t == 0) {
2604                 _rtl92ee_phy_save_adda_registers(hw, adda_reg,
2605                                                  rtlphy->adda_backup,
2606                                                  IQK_ADDA_REG_NUM);
2607                 _rtl92ee_phy_save_mac_registers(hw, iqk_mac_reg,
2608                                                 rtlphy->iqk_mac_backup);
2609                 _rtl92ee_phy_save_adda_registers(hw, iqk_bb_reg,
2610                                                  rtlphy->iqk_bb_backup,
2611                                                  IQK_BB_REG_NUM);
2612         }
2613
2614         _rtl92ee_phy_path_adda_on(hw, adda_reg, true, is2t);
2615
2616         /*BB setting*/
2617         rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(24), 0x00);
2618         rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKDWORD, 0x03a05600);
2619         rtl_set_bbreg(hw, ROFDM0_TRMUXPAR, MASKDWORD, 0x000800e4);
2620         rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, MASKDWORD, 0x22208200);
2621
2622         rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BIT(10), 0x01);
2623         rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BIT(26), 0x01);
2624         rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(10), 0x01);
2625         rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, BIT(10), 0x01);
2626
2627         _rtl92ee_phy_mac_setting_calibration(hw, iqk_mac_reg,
2628                                              rtlphy->iqk_mac_backup);
2629         /* Page B init*/
2630         /* IQ calibration setting*/
2631         rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2632         rtl_set_bbreg(hw, RTx_IQK, MASKDWORD, 0x01007c00);
2633         rtl_set_bbreg(hw, RRx_IQK, MASKDWORD, 0x01004800);
2634
2635         for (i = 0; i < retrycount; i++) {
2636                 patha_ok = _rtl92ee_phy_path_a_iqk(hw, is2t);
2637
2638                 if (patha_ok == 0x01) {
2639                         RT_TRACE(COMP_RF, DBG_LOUD,
2640                                  ("Path A Tx IQK Success!!\n"));
2641                         result[t][0] = (rtl_get_bbreg(hw,
2642                                                       RTx_Power_Before_IQK_A,
2643                                                       MASKDWORD) & 0x3FF0000)
2644                                                       >> 16;
2645                         result[t][1] = (rtl_get_bbreg(hw, RTx_Power_After_IQK_A,
2646                                                       MASKDWORD) & 0x3FF0000)
2647                                                       >> 16;
2648                         break;
2649                 } else {
2650                         RT_TRACE(COMP_RF, DBG_LOUD,
2651                                  ("Path A Tx IQK Fail!!, ret = 0x%x\n",
2652                                   patha_ok));
2653                 }
2654         }
2655
2656         for (i = 0 ; i < retrycount ; i++) {
2657                 patha_ok = _rtl92ee_phy_path_a_rx_iqk(hw, is2t);
2658
2659                 if (patha_ok == 0x03) {
2660                         RT_TRACE(COMP_RF, DBG_LOUD,
2661                                  ("Path A Rx IQK Success!!\n"));
2662                         result[t][2] = (rtl_get_bbreg(hw,
2663                                                       RRx_Power_Before_IQK_A_2,
2664                                                       MASKDWORD) & 0x3FF0000)
2665                                                       >> 16;
2666                         result[t][3] = (rtl_get_bbreg(hw,
2667                                                       RRx_Power_After_IQK_A_2,
2668                                                       MASKDWORD) & 0x3FF0000)
2669                                                       >> 16;
2670                         break;
2671                 } else {
2672                         RT_TRACE(COMP_RF, DBG_LOUD,
2673                                  ("Path A Rx IQK Fail!!, ret = 0x%x\n",
2674                                   patha_ok));
2675                 }
2676         }
2677
2678         if (0x00 == patha_ok)
2679                 RT_TRACE(COMP_RF, DBG_LOUD, ("Path A IQK failed!!, ret = 0\n"));
2680
2681         if (is2t) {
2682                 _rtl92ee_phy_path_a_standby(hw);
2683                 /* Turn Path B ADDA on */
2684                 _rtl92ee_phy_path_adda_on(hw, adda_reg, false, is2t);
2685
2686                 /* IQ calibration setting */
2687                 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2688                 rtl_set_bbreg(hw, RTx_IQK, MASKDWORD, 0x01007c00);
2689                 rtl_set_bbreg(hw, RRx_IQK, MASKDWORD, 0x01004800);
2690
2691                 for (i = 0 ; i < retrycount ; i++) {
2692                         pathb_ok = _rtl92ee_phy_path_b_iqk(hw);
2693                         if (pathb_ok == 0x01) {
2694                                 RT_TRACE(COMP_RF, DBG_LOUD,
2695                                          ("Path B Tx IQK Success!!\n"));
2696                                 result[t][4] = (rtl_get_bbreg(hw,
2697                                                         RTx_Power_Before_IQK_B,
2698                                                         MASKDWORD) & 0x3FF0000)
2699                                                         >> 16;
2700                                 result[t][5] = (rtl_get_bbreg(hw,
2701                                                         RTx_Power_After_IQK_B,
2702                                                         MASKDWORD) & 0x3FF0000)
2703                                                         >> 16;
2704                                 break;
2705                         } else {
2706                                 RT_TRACE(COMP_RF, DBG_LOUD,
2707                                          ("Path B Tx IQK Fail!!, ret = 0x%x\n",
2708                                            pathb_ok));
2709                         }
2710                 }
2711
2712                 for (i = 0 ; i < retrycount ; i++) {
2713                         pathb_ok = _rtl92ee_phy_path_b_rx_iqk(hw, is2t);
2714                         if (pathb_ok == 0x03) {
2715                                 RT_TRACE(COMP_RF, DBG_LOUD,
2716                                          ("Path B Rx IQK Success!!\n"));
2717                                 result[t][6] = (rtl_get_bbreg(hw,
2718                                                        RRx_Power_Before_IQK_B_2,
2719                                                        MASKDWORD) & 0x3FF0000)
2720                                                        >> 16;
2721                                 result[t][7] = (rtl_get_bbreg(hw,
2722                                                        RRx_Power_After_IQK_B_2,
2723                                                        MASKDWORD) & 0x3FF0000)
2724                                                        >> 16;
2725                                 break;
2726                         } else {
2727                                 RT_TRACE(COMP_RF, DBG_LOUD,
2728                                          ("Path B Rx IQK Fail!!, ret = 0x%x\n",
2729                                          pathb_ok));
2730                         }
2731                 }
2732
2733                 if (0x00 == pathb_ok)
2734                         RT_TRACE(COMP_RF, DBG_LOUD,
2735                                  ("Path B IQK failed!!, ret = 0\n"));
2736         }
2737         /* Back to BB mode, load original value */
2738         RT_TRACE(COMP_RF, DBG_LOUD,
2739                  ("IQK:Back to BB mode, load original value!\n"));
2740         rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0);
2741
2742         if (t != 0) {
2743                 /* Reload ADDA power saving parameters */
2744                 _rtl92ee_phy_reload_adda_registers(hw, adda_reg,
2745                                                    rtlphy->adda_backup,
2746                                                    IQK_ADDA_REG_NUM);
2747
2748                 /* Reload MAC parameters */
2749                 _rtl92ee_phy_reload_mac_registers(hw, iqk_mac_reg,
2750                                                   rtlphy->iqk_mac_backup);
2751
2752                 _rtl92ee_phy_reload_adda_registers(hw, iqk_bb_reg,
2753                                                    rtlphy->iqk_bb_backup,
2754                                                    IQK_BB_REG_NUM);
2755
2756                 /* Restore RX initial gain */
2757                 rtl_set_bbreg(hw, 0xc50, MASKBYTE0, 0x50);
2758                 rtl_set_bbreg(hw, 0xc50, MASKBYTE0, tmp_0xc50);
2759                 if (is2t) {
2760                         rtl_set_bbreg(hw, 0xc50, MASKBYTE0, 0x50);
2761                         rtl_set_bbreg(hw, 0xc58, MASKBYTE0, tmp_0xc58);
2762                 }
2763
2764                 /* load 0xe30 IQC default value */
2765                 rtl_set_bbreg(hw, RTx_IQK_Tone_A, MASKDWORD, 0x01008c00);
2766                 rtl_set_bbreg(hw, RRx_IQK_Tone_A, MASKDWORD, 0x01008c00);
2767         }
2768         RT_TRACE(COMP_RF, DBG_LOUD, ("_rtl92ee_phy_iq_calibrate() <==\n"));
2769 }
2770
2771 static void _rtl92ee_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
2772 {
2773         u8 tmpreg;
2774         u32 rf_a_mode = 0, rf_b_mode = 0, lc_cal;
2775         struct rtl_priv *rtlpriv = rtl_priv(hw);
2776
2777         tmpreg = rtl_read_byte(rtlpriv, 0xd03);
2778
2779         if ((tmpreg & 0x70) != 0)
2780                 rtl_write_byte(rtlpriv, 0xd03, tmpreg & 0x8F);
2781         else
2782                 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
2783
2784         if ((tmpreg & 0x70) != 0) {
2785                 rf_a_mode = rtl_get_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS);
2786
2787                 if (is2t)
2788                         rf_b_mode = rtl_get_rfreg(hw, RF90_PATH_B, 0x00,
2789                                                   MASK12BITS);
2790
2791                 rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS,
2792                               (rf_a_mode & 0x8FFFF) | 0x10000);
2793
2794                 if (is2t)
2795                         rtl_set_rfreg(hw, RF90_PATH_B, 0x00, MASK12BITS,
2796                                       (rf_b_mode & 0x8FFFF) | 0x10000);
2797         }
2798         lc_cal = rtl_get_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS);
2799
2800         rtl_set_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS, lc_cal | 0x08000);
2801
2802         mdelay(100);
2803
2804         if ((tmpreg & 0x70) != 0) {
2805                 rtl_write_byte(rtlpriv, 0xd03, tmpreg);
2806                 rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS, rf_a_mode);
2807
2808                 if (is2t)
2809                         rtl_set_rfreg(hw, RF90_PATH_B, 0x00, MASK12BITS,
2810                                       rf_b_mode);
2811         } else {
2812                 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
2813         }
2814         RT_TRACE(COMP_INIT , DBG_LOUD , ("\n"));
2815 }
2816
2817 static void _rtl92ee_phy_set_rfpath_switch(struct ieee80211_hw *hw,
2818                                            bool bmain, bool is2t)
2819 {
2820         struct rtl_priv *rtlpriv = rtl_priv(hw);
2821         struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2822         struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2823         RT_TRACE(COMP_INIT , DBG_LOUD , ("\n"));
2824
2825         if (is_hal_stop(rtlhal)) {
2826                 u8 u1btmp;
2827                 u1btmp = rtl_read_byte(rtlpriv, REG_LEDCFG0);
2828                 rtl_write_byte(rtlpriv, REG_LEDCFG0, u1btmp | BIT(7));
2829                 rtl_set_bbreg(hw, rFPGA0_XAB_RFPARAMETER, BIT(13), 0x01);
2830         }
2831         if (is2t) {
2832                 if (bmain)
2833                         rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
2834                                       BIT(5) | BIT(6), 0x1);
2835                 else
2836                         rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
2837                                       BIT(5) | BIT(6), 0x2);
2838         } else {
2839                 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BIT(8) | BIT(9), 0);
2840                 rtl_set_bbreg(hw, 0x914, MASKLWORD, 0x0201);
2841
2842                 /* We use the RF definition of MAIN and AUX,
2843                  * left antenna and right antenna repectively.
2844                  * Default output at AUX.*/
2845                 if (bmain) {
2846                         rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
2847                                       BIT(14) | BIT(13) | BIT(12), 0);
2848                         rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
2849                                       BIT(5) | BIT(4) | BIT(3), 0);
2850                         if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV)
2851                                 rtl_set_bbreg(hw, rConfig_ram64x16, BIT(31), 0);
2852                 } else {
2853                         rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
2854                                       BIT(14) | BIT(13) | BIT(12), 1);
2855                         rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
2856                                       BIT(5) | BIT(4) | BIT(3), 1);
2857                         if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV)
2858                                 rtl_set_bbreg(hw, rConfig_ram64x16, BIT(31), 1);
2859                 }
2860         }
2861 }
2862
2863 #undef IQK_ADDA_REG_NUM
2864 #undef IQK_DELAY_TIME
2865
2866 static u8 rtl92ee_get_rightchnlplace_for_iqk(u8 chnl)
2867 {
2868         u8 channel_all[59] = {
2869                 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
2870                 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
2871                 60, 62, 64, 100, 102, 104, 106, 108, 110, 112,
2872                 114, 116, 118, 120, 122, 124, 126, 128, 130,
2873                 132, 134, 136, 138, 140, 149, 151, 153, 155,
2874                 157, 159, 161, 163, 165
2875         };
2876         u8 place = chnl;
2877
2878         if (chnl > 14) {
2879                 for (place = 14; place < sizeof(channel_all); place++) {
2880                         if (channel_all[place] == chnl)
2881                                 return place - 13;
2882                 }
2883         }
2884
2885         return 0;
2886 }
2887
2888 void rtl92ee_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery)
2889 {
2890         struct rtl_priv *rtlpriv = rtl_priv(hw);
2891         struct rtl_phy *rtlphy = &(rtlpriv->phy);
2892         long result[4][8];
2893         u8 i, final_candidate;
2894         bool b_patha_ok, b_pathb_ok;
2895         long reg_e94, reg_e9c, reg_ea4, reg_eac;
2896         long reg_eb4, reg_ebc, reg_ec4, reg_ecc;
2897         bool is12simular, is13simular, is23simular;
2898         u8 idx;
2899         u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
2900                 ROFDM0_XARXIQIMBALANCE,
2901                 ROFDM0_XBRXIQIMBALANCE,
2902                 ROFDM0_ECCATHRESHOLD,
2903                 ROFDM0_AGCRSSITABLE,
2904                 ROFDM0_XATXIQIMBALANCE,
2905                 ROFDM0_XBTXIQIMBALANCE,
2906                 ROFDM0_XCTXAFE,
2907                 ROFDM0_XDTXAFE,
2908                 ROFDM0_RXIQEXTANTA
2909         };
2910
2911         if (b_recovery) {
2912                 _rtl92ee_phy_reload_adda_registers(hw, iqk_bb_reg,
2913                                                    rtlphy->iqk_bb_backup, 9);
2914                 return;
2915         }
2916
2917         for (i = 0; i < 8; i++) {
2918                 result[0][i] = 0;
2919                 result[1][i] = 0;
2920                 result[2][i] = 0;
2921
2922                 if ((i == 0) || (i == 2) || (i == 4)  || (i == 6))
2923                         result[3][i] = 0x100;
2924                 else
2925                         result[3][i] = 0;
2926         }
2927         final_candidate = 0xff;
2928         b_patha_ok = false;
2929         b_pathb_ok = false;
2930         is12simular = false;
2931         is23simular = false;
2932         is13simular = false;
2933         for (i = 0; i < 3; i++) {
2934                 _rtl92ee_phy_iq_calibrate(hw, result, i, true);
2935                 if (i == 1) {
2936                         is12simular = _rtl92ee_phy_simularity_compare(hw,
2937                                                                       result,
2938                                                                       0, 1);
2939                         if (is12simular) {
2940                                 final_candidate = 0;
2941                                 break;
2942                         }
2943                 }
2944
2945                 if (i == 2) {
2946                         is13simular = _rtl92ee_phy_simularity_compare(hw,
2947                                                                       result,
2948                                                                       0, 2);
2949                         if (is13simular) {
2950                                 final_candidate = 0;
2951                                 break;
2952                         }
2953                         is23simular = _rtl92ee_phy_simularity_compare(hw,
2954                                                                       result,
2955                                                                       1, 2);
2956                         if (is23simular)
2957                                 final_candidate = 1;
2958                         else
2959                                 final_candidate = 3;
2960                 }
2961         }
2962         for (i = 0; i < 4; i++) {
2963                 reg_e94 = result[i][0];
2964                 reg_e9c = result[i][1];
2965                 reg_ea4 = result[i][2];
2966                 reg_eac = result[i][3];
2967                 reg_eb4 = result[i][4];
2968                 reg_ebc = result[i][5];
2969                 reg_ec4 = result[i][6];
2970                 reg_ecc = result[i][7];
2971         }
2972         if (final_candidate != 0xff) {
2973                 reg_e94 = result[final_candidate][0];
2974                 rtlphy->reg_e94 = reg_e94;
2975                 reg_e9c = result[final_candidate][1];
2976                 rtlphy->reg_e9c = reg_e9c;
2977                 reg_ea4 = result[final_candidate][2];
2978                 reg_eac = result[final_candidate][3];
2979                 reg_eb4 = result[final_candidate][4];
2980                 rtlphy->reg_eb4 = reg_eb4;
2981                 reg_ebc = result[final_candidate][5];
2982                 rtlphy->reg_ebc = reg_ebc;
2983                 reg_ec4 = result[final_candidate][6];
2984                 reg_ecc = result[final_candidate][7];
2985                 b_patha_ok = true;
2986                 b_pathb_ok = true;
2987         } else {
2988                 rtlphy->reg_e94 = 0x100;
2989                 rtlphy->reg_eb4 = 0x100;
2990                 rtlphy->reg_e9c = 0x0;
2991                 rtlphy->reg_ebc = 0x0;
2992         }
2993
2994         if (reg_e94 != 0) /*&&(reg_ea4 != 0) */
2995                 _rtl92ee_phy_path_a_fill_iqk_matrix(hw, b_patha_ok, result,
2996                                                     final_candidate,
2997                                                     (reg_ea4 == 0));
2998
2999         _rtl92ee_phy_path_b_fill_iqk_matrix(hw, b_pathb_ok, result,
3000                                             final_candidate,
3001                                             (reg_ec4 == 0));
3002
3003         idx = rtl92ee_get_rightchnlplace_for_iqk(rtlphy->current_channel);
3004
3005         /* To Fix BSOD when final_candidate is 0xff
3006          * by sherry 20120321 */
3007         if (final_candidate < 4) {
3008                 for (i = 0; i < IQK_MATRIX_REG_NUM; i++)
3009                         rtlphy->iqk_matrix_regsetting[idx].value[0][i] =
3010                                 result[final_candidate][i];
3011
3012                 rtlphy->iqk_matrix_regsetting[idx].b_iqk_done = true;
3013         }
3014         _rtl92ee_phy_save_adda_registers(hw, iqk_bb_reg,
3015                                          rtlphy->iqk_bb_backup, 9);
3016 }
3017
3018 void rtl92ee_phy_lc_calibrate(struct ieee80211_hw *hw)
3019 {
3020         struct rtl_priv *rtlpriv = rtl_priv(hw);
3021         struct rtl_phy *rtlphy = &(rtlpriv->phy);
3022         struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
3023         u32 timeout = 2000, timecount = 0;
3024
3025         while (rtlpriv->mac80211.act_scanning && timecount < timeout) {
3026                 udelay(50);
3027                 timecount += 50;
3028         }
3029
3030         rtlphy->lck_inprogress = true;
3031         RTPRINT(rtlpriv, FINIT, INIT_IQK,
3032                 "LCK:Start!!! currentband %x delay %d ms\n",
3033                  rtlhal->current_bandtype, timecount);
3034
3035         _rtl92ee_phy_lc_calibrate(hw, false);
3036
3037         rtlphy->lck_inprogress = false;
3038 }
3039
3040 void rtl92ee_phy_ap_calibrate(struct ieee80211_hw *hw, char delta)
3041 {
3042         struct rtl_priv *rtlpriv = rtl_priv(hw);
3043         struct rtl_phy *rtlphy = &(rtlpriv->phy);
3044
3045         if (rtlphy->b_apk_done)
3046                 return;
3047
3048         return;
3049 }
3050
3051 void rtl92ee_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain)
3052 {
3053         _rtl92ee_phy_set_rfpath_switch(hw, bmain, false);
3054 }
3055
3056 bool rtl92ee_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
3057 {
3058         struct rtl_priv *rtlpriv = rtl_priv(hw);
3059         struct rtl_phy *rtlphy = &(rtlpriv->phy);
3060         bool b_postprocessing = false;
3061
3062         RT_TRACE(COMP_CMD, DBG_TRACE,
3063                  ("-->IO Cmd(%#x), set_io_inprogress(%d)\n",
3064                   iotype, rtlphy->set_io_inprogress));
3065         do {
3066                 switch (iotype) {
3067                 case IO_CMD_RESUME_DM_BY_SCAN:
3068                         RT_TRACE(COMP_CMD, DBG_TRACE,
3069                                  ("[IO CMD] Resume DM after scan.\n"));
3070                         b_postprocessing = true;
3071                         break;
3072                 case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
3073                         RT_TRACE(COMP_CMD, DBG_TRACE,
3074                                  ("[IO CMD] Pause DM before scan.\n"));
3075                         b_postprocessing = true;
3076                         break;
3077                 default:
3078                         RT_TRACE(COMP_ERR, DBG_EMERG,
3079                                  ("switch case not process\n"));
3080                         break;
3081                 }
3082         } while (false);
3083         if (b_postprocessing && !rtlphy->set_io_inprogress) {
3084                 rtlphy->set_io_inprogress = true;
3085                 rtlphy->current_io_type = iotype;
3086         } else {
3087                 return false;
3088         }
3089         rtl92ee_phy_set_io(hw);
3090         RT_TRACE(COMP_CMD, DBG_TRACE, ("IO Type(%#x)\n", iotype));
3091         return true;
3092 }
3093
3094 static void rtl92ee_phy_set_io(struct ieee80211_hw *hw)
3095 {
3096         struct rtl_priv *rtlpriv = rtl_priv(hw);
3097         struct rtl_phy *rtlphy = &(rtlpriv->phy);
3098
3099         RT_TRACE(COMP_CMD, DBG_TRACE,
3100                  ("--->Cmd(%#x), set_io_inprogress(%d)\n",
3101                   rtlphy->current_io_type, rtlphy->set_io_inprogress));
3102         switch (rtlphy->current_io_type) {
3103         case IO_CMD_RESUME_DM_BY_SCAN:
3104                 rtl92ee_dm_write_dig(hw , rtlphy->initgain_backup.xaagccore1);
3105                 rtl92ee_dm_write_cck_cca_thres(hw, rtlphy->initgain_backup.cca);
3106                 RT_TRACE(COMP_CMD, DBG_TRACE , ("no set txpower\n"));
3107                 rtl92ee_phy_set_txpower_level(hw, rtlphy->current_channel);
3108                 break;
3109         case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
3110                 /* 8192eebt */
3111                 rtlphy->initgain_backup.xaagccore1 = dm_dig.cur_igvalue;
3112                 rtl92ee_dm_write_dig(hw, 0x17);
3113                 rtlphy->initgain_backup.cca = dm_dig.cur_cck_cca_thres;
3114                 rtl92ee_dm_write_cck_cca_thres(hw, 0x40);
3115                 break;
3116         default:
3117                 RT_TRACE(COMP_ERR, DBG_EMERG,
3118                          ("switch case not process\n"));
3119                 break;
3120         }
3121         rtlphy->set_io_inprogress = false;
3122         RT_TRACE(COMP_CMD, DBG_TRACE,
3123                  ("(%#x)\n", rtlphy->current_io_type));
3124 }
3125
3126 static void rtl92ee_phy_set_rf_on(struct ieee80211_hw *hw)
3127 {
3128         struct rtl_priv *rtlpriv = rtl_priv(hw);
3129
3130         rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b);
3131         rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3132         /*rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);*/
3133         rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3134         rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3135         rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
3136 }
3137
3138 static void _rtl92ee_phy_set_rf_sleep(struct ieee80211_hw *hw)
3139 {
3140         struct rtl_priv *rtlpriv = rtl_priv(hw);
3141
3142         rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
3143         rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
3144
3145         rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3146         rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22);
3147 }
3148
3149 static bool _rtl92ee_phy_set_rf_power_state(struct ieee80211_hw *hw,
3150                                             enum rf_pwrstate rfpwr_state)
3151 {
3152         struct rtl_priv *rtlpriv = rtl_priv(hw);
3153         struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
3154         struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3155         struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
3156         bool bresult = true;
3157         u8 i, queue_id;
3158         struct rtl8192_tx_ring *ring = NULL;
3159
3160         switch (rfpwr_state) {
3161         case ERFON:
3162                 if ((ppsc->rfpwr_state == ERFOFF) &&
3163                     RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
3164                         bool rtstatus;
3165                         u32 init_count = 0;
3166                         do {
3167                                 init_count++;
3168                                 RT_TRACE(COMP_RF, DBG_DMESG,
3169                                          ("IPS Set eRf nic enable\n"));
3170                                 rtstatus = stg_rtl_ps_enable_nic(hw);
3171                         } while (!rtstatus && (init_count < 10));
3172                         RT_CLEAR_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
3173                 } else {
3174                         RT_TRACE(COMP_RF, DBG_DMESG,
3175                                  ("Set ERFON sleeped:%d ms\n",
3176                                   jiffies_to_msecs(jiffies -
3177                                                    ppsc->last_sleep_jiffies)));
3178                         ppsc->last_awake_jiffies = jiffies;
3179                         rtl92ee_phy_set_rf_on(hw);
3180                 }
3181                 if (mac->link_state == MAC80211_LINKED)
3182                         rtlpriv->cfg->ops->led_control(hw, LED_CTL_LINK);
3183                 else
3184                         rtlpriv->cfg->ops->led_control(hw, LED_CTL_NO_LINK);
3185                 break;
3186         case ERFOFF:
3187                 for (queue_id = 0, i = 0;
3188                      queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
3189                         ring = &pcipriv->dev.tx_ring[queue_id];
3190                         if (skb_queue_len(&ring->queue) == 0) {
3191                                 queue_id++;
3192                                 continue;
3193                         } else {
3194                                 RT_TRACE(COMP_ERR, DBG_WARNING,
3195                                          ("eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before "
3196                                           "doze!\n", (i + 1), queue_id,
3197                                           skb_queue_len(&ring->queue)));
3198
3199                                 udelay(10);
3200                                 i++;
3201                         }
3202                         if (i >= MAX_DOZE_WAITING_TIMES_9x) {
3203                                 RT_TRACE(COMP_ERR, DBG_WARNING,
3204                                          ("\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
3205                                           MAX_DOZE_WAITING_TIMES_9x,
3206                                           queue_id,
3207                                           skb_queue_len(&ring->queue)));
3208                                 break;
3209                         }
3210                 }
3211
3212                 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
3213                         RT_TRACE(COMP_RF, DBG_DMESG,
3214                                  ("IPS Set eRf nic disable\n"));
3215                         stg_rtl_ps_disable_nic(hw);
3216                         RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
3217                 } else {
3218                         if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) {
3219                                 rtlpriv->cfg->ops->led_control(hw,
3220                                                                LED_CTL_NO_LINK);
3221                         } else {
3222                                 rtlpriv->cfg->ops->led_control(hw,
3223                                                              LED_CTL_POWER_OFF);
3224                         }
3225                 }
3226                 break;
3227         case ERFSLEEP:
3228                 if (ppsc->rfpwr_state == ERFOFF)
3229                         break;
3230                 for (queue_id = 0, i = 0;
3231                      queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
3232                         ring = &pcipriv->dev.tx_ring[queue_id];
3233                         if (skb_queue_len(&ring->queue) == 0) {
3234                                 queue_id++;
3235                                 continue;
3236                         } else {
3237                                 RT_TRACE(COMP_ERR, DBG_WARNING,
3238                                          ("eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
3239                                           (i + 1), queue_id,
3240                                           skb_queue_len(&ring->queue)));
3241                                 udelay(10);
3242                                 i++;
3243                         }
3244                         if (i >= MAX_DOZE_WAITING_TIMES_9x) {
3245                                 RT_TRACE(COMP_ERR, DBG_WARNING,
3246                                          ("\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
3247                                           MAX_DOZE_WAITING_TIMES_9x,
3248                                           queue_id,
3249                                           skb_queue_len(&ring->queue)));
3250                                 break;
3251                         }
3252                 }
3253                 RT_TRACE(COMP_RF, DBG_DMESG,
3254                          ("Set ERFSLEEP awaked:%d ms\n",
3255                           jiffies_to_msecs(jiffies -
3256                                            ppsc->last_awake_jiffies)));
3257                 ppsc->last_sleep_jiffies = jiffies;
3258                 _rtl92ee_phy_set_rf_sleep(hw);
3259                 break;
3260         default:
3261                 RT_TRACE(COMP_ERR, DBG_EMERG,
3262                          ("switch case not process\n"));
3263                 bresult = false;
3264                 break;
3265         }
3266         if (bresult)
3267                 ppsc->rfpwr_state = rfpwr_state;
3268         return bresult;
3269 }
3270
3271 bool rtl92ee_phy_set_rf_power_state(struct ieee80211_hw *hw,
3272                                     enum rf_pwrstate rfpwr_state)
3273 {
3274         struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
3275
3276         bool bresult = false;
3277
3278         if (rfpwr_state == ppsc->rfpwr_state)
3279                 return bresult;
3280         bresult = _rtl92ee_phy_set_rf_power_state(hw, rfpwr_state);
3281         return bresult;
3282 }