~ubuntu-branches/ubuntu/precise/linux-lowlatency/precise

« back to all changes in this revision

Viewing changes to drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-tz023xykf0i6eosh
Tags: upstream-3.2.0
ImportĀ upstreamĀ versionĀ 3.2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 * You should have received a copy of the GNU General Public License along with
 
15
 * this program; if not, write to the Free Software Foundation, Inc.,
 
16
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
 
17
 *
 
18
 * The full GNU General Public License is included in this distribution in the
 
19
 * file called LICENSE.
 
20
 *
 
21
 * Contact Information:
 
22
 * wlanfae <wlanfae@realtek.com>
 
23
 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
 
24
 * Hsinchu 300, Taiwan.
 
25
 *
 
26
 * Larry Finger <Larry.Finger@lwfinger.net>
 
27
 *
 
28
 *****************************************************************************/
 
29
 
 
30
#include <linux/export.h>
 
31
#include "../wifi.h"
 
32
#include "../rtl8192ce/reg.h"
 
33
#include "../rtl8192ce/def.h"
 
34
#include "dm_common.h"
 
35
#include "phy_common.h"
 
36
 
 
37
/* Define macro to shorten lines */
 
38
#define MCS_TXPWR       mcs_txpwrlevel_origoffset
 
39
 
 
40
u32 rtl92c_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask)
 
41
{
 
42
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
43
        u32 returnvalue, originalvalue, bitshift;
 
44
 
 
45
        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), "
 
46
                                               "bitmask(%#x)\n", regaddr,
 
47
                                               bitmask));
 
48
        originalvalue = rtl_read_dword(rtlpriv, regaddr);
 
49
        bitshift = _rtl92c_phy_calculate_bit_shift(bitmask);
 
50
        returnvalue = (originalvalue & bitmask) >> bitshift;
 
51
 
 
52
        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("BBR MASK=0x%x "
 
53
                                               "Addr[0x%x]=0x%x\n", bitmask,
 
54
                                               regaddr, originalvalue));
 
55
 
 
56
        return returnvalue;
 
57
 
 
58
}
 
59
EXPORT_SYMBOL(rtl92c_phy_query_bb_reg);
 
60
 
 
61
void rtl92c_phy_set_bb_reg(struct ieee80211_hw *hw,
 
62
                           u32 regaddr, u32 bitmask, u32 data)
 
63
{
 
64
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
65
        u32 originalvalue, bitshift;
 
66
 
 
67
        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), bitmask(%#x),"
 
68
                                               " data(%#x)\n", regaddr, bitmask,
 
69
                                               data));
 
70
 
 
71
        if (bitmask != MASKDWORD) {
 
72
                originalvalue = rtl_read_dword(rtlpriv, regaddr);
 
73
                bitshift = _rtl92c_phy_calculate_bit_shift(bitmask);
 
74
                data = ((originalvalue & (~bitmask)) | (data << bitshift));
 
75
        }
 
76
 
 
77
        rtl_write_dword(rtlpriv, regaddr, data);
 
78
 
 
79
        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("regaddr(%#x), bitmask(%#x),"
 
80
                                               " data(%#x)\n", regaddr, bitmask,
 
81
                                               data));
 
82
 
 
83
}
 
84
EXPORT_SYMBOL(rtl92c_phy_set_bb_reg);
 
85
 
 
86
u32 _rtl92c_phy_fw_rf_serial_read(struct ieee80211_hw *hw,
 
87
                                  enum radio_path rfpath, u32 offset)
 
88
{
 
89
        RT_ASSERT(false, ("deprecated!\n"));
 
90
        return 0;
 
91
 
 
92
}
 
93
EXPORT_SYMBOL(_rtl92c_phy_fw_rf_serial_read);
 
94
 
 
95
void _rtl92c_phy_fw_rf_serial_write(struct ieee80211_hw *hw,
 
96
                                    enum radio_path rfpath, u32 offset,
 
97
                                    u32 data)
 
98
{
 
99
        RT_ASSERT(false, ("deprecated!\n"));
 
100
}
 
101
EXPORT_SYMBOL(_rtl92c_phy_fw_rf_serial_write);
 
102
 
 
103
u32 _rtl92c_phy_rf_serial_read(struct ieee80211_hw *hw,
 
104
                               enum radio_path rfpath, u32 offset)
 
105
{
 
106
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
107
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 
108
        struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
 
109
        u32 newoffset;
 
110
        u32 tmplong, tmplong2;
 
111
        u8 rfpi_enable = 0;
 
112
        u32 retvalue;
 
113
 
 
114
        offset &= 0x3f;
 
115
        newoffset = offset;
 
116
        if (RT_CANNOT_IO(hw)) {
 
117
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("return all one\n"));
 
118
                return 0xFFFFFFFF;
 
119
        }
 
120
        tmplong = rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD);
 
121
        if (rfpath == RF90_PATH_A)
 
122
                tmplong2 = tmplong;
 
123
        else
 
124
                tmplong2 = rtl_get_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD);
 
125
        tmplong2 = (tmplong2 & (~BLSSIREADADDRESS)) |
 
126
            (newoffset << 23) | BLSSIREADEDGE;
 
127
        rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
 
128
                      tmplong & (~BLSSIREADEDGE));
 
129
        mdelay(1);
 
130
        rtl_set_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD, tmplong2);
 
131
        mdelay(1);
 
132
        rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
 
133
                      tmplong | BLSSIREADEDGE);
 
134
        mdelay(1);
 
135
        if (rfpath == RF90_PATH_A)
 
136
                rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1,
 
137
                                                 BIT(8));
 
138
        else if (rfpath == RF90_PATH_B)
 
139
                rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XB_HSSIPARAMETER1,
 
140
                                                 BIT(8));
 
141
        if (rfpi_enable)
 
142
                retvalue = rtl_get_bbreg(hw, pphyreg->rflssi_readbackpi,
 
143
                                         BLSSIREADBACKDATA);
 
144
        else
 
145
                retvalue = rtl_get_bbreg(hw, pphyreg->rflssi_readback,
 
146
                                         BLSSIREADBACKDATA);
 
147
        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("RFR-%d Addr[0x%x]=0x%x\n",
 
148
                                               rfpath, pphyreg->rflssi_readback,
 
149
                                               retvalue));
 
150
        return retvalue;
 
151
}
 
152
EXPORT_SYMBOL(_rtl92c_phy_rf_serial_read);
 
153
 
 
154
void _rtl92c_phy_rf_serial_write(struct ieee80211_hw *hw,
 
155
                                 enum radio_path rfpath, u32 offset,
 
156
                                 u32 data)
 
157
{
 
158
        u32 data_and_addr;
 
159
        u32 newoffset;
 
160
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
161
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 
162
        struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
 
163
 
 
164
        if (RT_CANNOT_IO(hw)) {
 
165
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("stop\n"));
 
166
                return;
 
167
        }
 
168
        offset &= 0x3f;
 
169
        newoffset = offset;
 
170
        data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff;
 
171
        rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr);
 
172
        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, ("RFW-%d Addr[0x%x]=0x%x\n",
 
173
                                               rfpath, pphyreg->rf3wire_offset,
 
174
                                               data_and_addr));
 
175
}
 
176
EXPORT_SYMBOL(_rtl92c_phy_rf_serial_write);
 
177
 
 
178
u32 _rtl92c_phy_calculate_bit_shift(u32 bitmask)
 
179
{
 
180
        u32 i;
 
181
 
 
182
        for (i = 0; i <= 31; i++) {
 
183
                if (((bitmask >> i) & 0x1) == 1)
 
184
                        break;
 
185
        }
 
186
        return i;
 
187
}
 
188
EXPORT_SYMBOL(_rtl92c_phy_calculate_bit_shift);
 
189
 
 
190
static void _rtl92c_phy_bb_config_1t(struct ieee80211_hw *hw)
 
191
{
 
192
        rtl_set_bbreg(hw, RFPGA0_TXINFO, 0x3, 0x2);
 
193
        rtl_set_bbreg(hw, RFPGA1_TXINFO, 0x300033, 0x200022);
 
194
        rtl_set_bbreg(hw, RCCK0_AFESETTING, MASKBYTE3, 0x45);
 
195
        rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKBYTE0, 0x23);
 
196
        rtl_set_bbreg(hw, ROFDM0_AGCPARAMETER1, 0x30, 0x1);
 
197
        rtl_set_bbreg(hw, 0xe74, 0x0c000000, 0x2);
 
198
        rtl_set_bbreg(hw, 0xe78, 0x0c000000, 0x2);
 
199
        rtl_set_bbreg(hw, 0xe7c, 0x0c000000, 0x2);
 
200
        rtl_set_bbreg(hw, 0xe80, 0x0c000000, 0x2);
 
201
        rtl_set_bbreg(hw, 0xe88, 0x0c000000, 0x2);
 
202
}
 
203
 
 
204
bool rtl92c_phy_rf_config(struct ieee80211_hw *hw)
 
205
{
 
206
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
207
 
 
208
        return rtlpriv->cfg->ops->phy_rf6052_config(hw);
 
209
}
 
210
EXPORT_SYMBOL(rtl92c_phy_rf_config);
 
211
 
 
212
bool _rtl92c_phy_bb8192c_config_parafile(struct ieee80211_hw *hw)
 
213
{
 
214
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
215
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 
216
        struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
 
217
        bool rtstatus;
 
218
 
 
219
        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("==>\n"));
 
220
        rtstatus = rtlpriv->cfg->ops->config_bb_with_headerfile(hw,
 
221
                                                 BASEBAND_CONFIG_PHY_REG);
 
222
        if (rtstatus != true) {
 
223
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("Write BB Reg Fail!!"));
 
224
                return false;
 
225
        }
 
226
        if (rtlphy->rf_type == RF_1T2R) {
 
227
                _rtl92c_phy_bb_config_1t(hw);
 
228
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("Config to 1T!!\n"));
 
229
        }
 
230
        if (rtlefuse->autoload_failflag == false) {
 
231
                rtlphy->pwrgroup_cnt = 0;
 
232
                rtstatus = rtlpriv->cfg->ops->config_bb_with_pgheaderfile(hw,
 
233
                                                   BASEBAND_CONFIG_PHY_REG);
 
234
        }
 
235
        if (rtstatus != true) {
 
236
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("BB_PG Reg Fail!!"));
 
237
                return false;
 
238
        }
 
239
        rtstatus = rtlpriv->cfg->ops->config_bb_with_headerfile(hw,
 
240
                                                 BASEBAND_CONFIG_AGC_TAB);
 
241
        if (rtstatus != true) {
 
242
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, ("AGC Table Fail\n"));
 
243
                return false;
 
244
        }
 
245
        rtlphy->cck_high_power = (bool) (rtl_get_bbreg(hw,
 
246
                                                RFPGA0_XA_HSSIPARAMETER2,
 
247
                                                0x200));
 
248
 
 
249
        return true;
 
250
}
 
251
EXPORT_SYMBOL(_rtl92c_phy_bb8192c_config_parafile);
 
252
 
 
253
void _rtl92c_store_pwrIndex_diffrate_offset(struct ieee80211_hw *hw,
 
254
                                            u32 regaddr, u32 bitmask,
 
255
                                            u32 data)
 
256
{
 
257
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
258
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 
259
 
 
260
        if (regaddr == RTXAGC_A_RATE18_06) {
 
261
                rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][0] = data;
 
262
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
 
263
                         ("MCSTxPowerLevelOriginalOffset[%d][0] = 0x%x\n",
 
264
                          rtlphy->pwrgroup_cnt,
 
265
                          rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][0]));
 
266
        }
 
267
        if (regaddr == RTXAGC_A_RATE54_24) {
 
268
                rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][1] = data;
 
269
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
 
270
                         ("MCSTxPowerLevelOriginalOffset[%d][1] = 0x%x\n",
 
271
                          rtlphy->pwrgroup_cnt,
 
272
                          rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][1]));
 
273
        }
 
274
        if (regaddr == RTXAGC_A_CCK1_MCS32) {
 
275
                rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][6] = data;
 
276
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
 
277
                         ("MCSTxPowerLevelOriginalOffset[%d][6] = 0x%x\n",
 
278
                          rtlphy->pwrgroup_cnt,
 
279
                          rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][6]));
 
280
        }
 
281
        if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0xffffff00) {
 
282
                rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][7] = data;
 
283
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
 
284
                         ("MCSTxPowerLevelOriginalOffset[%d][7] = 0x%x\n",
 
285
                          rtlphy->pwrgroup_cnt,
 
286
                          rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][7]));
 
287
        }
 
288
        if (regaddr == RTXAGC_A_MCS03_MCS00) {
 
289
                rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][2] = data;
 
290
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
 
291
                         ("MCSTxPowerLevelOriginalOffset[%d][2] = 0x%x\n",
 
292
                          rtlphy->pwrgroup_cnt,
 
293
                          rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][2]));
 
294
        }
 
295
        if (regaddr == RTXAGC_A_MCS07_MCS04) {
 
296
                rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][3] = data;
 
297
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
 
298
                         ("MCSTxPowerLevelOriginalOffset[%d][3] = 0x%x\n",
 
299
                          rtlphy->pwrgroup_cnt,
 
300
                          rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][3]));
 
301
        }
 
302
        if (regaddr == RTXAGC_A_MCS11_MCS08) {
 
303
                rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][4] = data;
 
304
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
 
305
                         ("MCSTxPowerLevelOriginalOffset[%d][4] = 0x%x\n",
 
306
                          rtlphy->pwrgroup_cnt,
 
307
                          rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][4]));
 
308
        }
 
309
        if (regaddr == RTXAGC_A_MCS15_MCS12) {
 
310
                rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][5] = data;
 
311
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
 
312
                         ("MCSTxPowerLevelOriginalOffset[%d][5] = 0x%x\n",
 
313
                          rtlphy->pwrgroup_cnt,
 
314
                          rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][5]));
 
315
        }
 
316
        if (regaddr == RTXAGC_B_RATE18_06) {
 
317
                rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][8] = data;
 
318
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
 
319
                         ("MCSTxPowerLevelOriginalOffset[%d][8] = 0x%x\n",
 
320
                          rtlphy->pwrgroup_cnt,
 
321
                          rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][8]));
 
322
        }
 
323
        if (regaddr == RTXAGC_B_RATE54_24) {
 
324
                rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][9] = data;
 
325
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
 
326
                         ("MCSTxPowerLevelOriginalOffset[%d][9] = 0x%x\n",
 
327
                          rtlphy->pwrgroup_cnt,
 
328
                          rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][9]));
 
329
        }
 
330
        if (regaddr == RTXAGC_B_CCK1_55_MCS32) {
 
331
                rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][14] = data;
 
332
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
 
333
                         ("MCSTxPowerLevelOriginalOffset[%d][14] = 0x%x\n",
 
334
                          rtlphy->pwrgroup_cnt,
 
335
                          rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][14]));
 
336
        }
 
337
        if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0x000000ff) {
 
338
                rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][15] = data;
 
339
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
 
340
                         ("MCSTxPowerLevelOriginalOffset[%d][15] = 0x%x\n",
 
341
                          rtlphy->pwrgroup_cnt,
 
342
                          rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][15]));
 
343
        }
 
344
        if (regaddr == RTXAGC_B_MCS03_MCS00) {
 
345
                rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][10] = data;
 
346
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
 
347
                         ("MCSTxPowerLevelOriginalOffset[%d][10] = 0x%x\n",
 
348
                          rtlphy->pwrgroup_cnt,
 
349
                          rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][10]));
 
350
        }
 
351
        if (regaddr == RTXAGC_B_MCS07_MCS04) {
 
352
                rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][11] = data;
 
353
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
 
354
                         ("MCSTxPowerLevelOriginalOffset[%d][11] = 0x%x\n",
 
355
                          rtlphy->pwrgroup_cnt,
 
356
                          rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][11]));
 
357
        }
 
358
        if (regaddr == RTXAGC_B_MCS11_MCS08) {
 
359
                rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][12] = data;
 
360
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
 
361
                         ("MCSTxPowerLevelOriginalOffset[%d][12] = 0x%x\n",
 
362
                          rtlphy->pwrgroup_cnt,
 
363
                          rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][12]));
 
364
        }
 
365
        if (regaddr == RTXAGC_B_MCS15_MCS12) {
 
366
                rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][13] = data;
 
367
                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
 
368
                         ("MCSTxPowerLevelOriginalOffset[%d][13] = 0x%x\n",
 
369
                          rtlphy->pwrgroup_cnt,
 
370
                          rtlphy->MCS_TXPWR[rtlphy->pwrgroup_cnt][13]));
 
371
 
 
372
                rtlphy->pwrgroup_cnt++;
 
373
        }
 
374
}
 
375
EXPORT_SYMBOL(_rtl92c_store_pwrIndex_diffrate_offset);
 
376
 
 
377
void rtl92c_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
 
378
{
 
379
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
380
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 
381
 
 
382
        rtlphy->default_initialgain[0] =
 
383
            (u8) rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
 
384
        rtlphy->default_initialgain[1] =
 
385
            (u8) rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0);
 
386
        rtlphy->default_initialgain[2] =
 
387
            (u8) rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0);
 
388
        rtlphy->default_initialgain[3] =
 
389
            (u8) rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0);
 
390
 
 
391
        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
 
392
                 ("Default initial gain (c50=0x%x, "
 
393
                  "c58=0x%x, c60=0x%x, c68=0x%x\n",
 
394
                  rtlphy->default_initialgain[0],
 
395
                  rtlphy->default_initialgain[1],
 
396
                  rtlphy->default_initialgain[2],
 
397
                  rtlphy->default_initialgain[3]));
 
398
 
 
399
        rtlphy->framesync = (u8) rtl_get_bbreg(hw,
 
400
                                               ROFDM0_RXDETECTOR3, MASKBYTE0);
 
401
        rtlphy->framesync_c34 = rtl_get_bbreg(hw,
 
402
                                              ROFDM0_RXDETECTOR2, MASKDWORD);
 
403
 
 
404
        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
 
405
                 ("Default framesync (0x%x) = 0x%x\n",
 
406
                  ROFDM0_RXDETECTOR3, rtlphy->framesync));
 
407
}
 
408
 
 
409
void _rtl92c_phy_init_bb_rf_register_definition(struct ieee80211_hw *hw)
 
410
{
 
411
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
412
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 
413
 
 
414
        rtlphy->phyreg_def[RF90_PATH_A].rfintfs = RFPGA0_XAB_RFINTERFACESW;
 
415
        rtlphy->phyreg_def[RF90_PATH_B].rfintfs = RFPGA0_XAB_RFINTERFACESW;
 
416
        rtlphy->phyreg_def[RF90_PATH_C].rfintfs = RFPGA0_XCD_RFINTERFACESW;
 
417
        rtlphy->phyreg_def[RF90_PATH_D].rfintfs = RFPGA0_XCD_RFINTERFACESW;
 
418
 
 
419
        rtlphy->phyreg_def[RF90_PATH_A].rfintfi = RFPGA0_XAB_RFINTERFACERB;
 
420
        rtlphy->phyreg_def[RF90_PATH_B].rfintfi = RFPGA0_XAB_RFINTERFACERB;
 
421
        rtlphy->phyreg_def[RF90_PATH_C].rfintfi = RFPGA0_XCD_RFINTERFACERB;
 
422
        rtlphy->phyreg_def[RF90_PATH_D].rfintfi = RFPGA0_XCD_RFINTERFACERB;
 
423
 
 
424
        rtlphy->phyreg_def[RF90_PATH_A].rfintfo = RFPGA0_XA_RFINTERFACEOE;
 
425
        rtlphy->phyreg_def[RF90_PATH_B].rfintfo = RFPGA0_XB_RFINTERFACEOE;
 
426
 
 
427
        rtlphy->phyreg_def[RF90_PATH_A].rfintfe = RFPGA0_XA_RFINTERFACEOE;
 
428
        rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE;
 
429
 
 
430
        rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset =
 
431
            RFPGA0_XA_LSSIPARAMETER;
 
432
        rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset =
 
433
            RFPGA0_XB_LSSIPARAMETER;
 
434
 
 
435
        rtlphy->phyreg_def[RF90_PATH_A].rflssi_select = rFPGA0_XAB_RFPARAMETER;
 
436
        rtlphy->phyreg_def[RF90_PATH_B].rflssi_select = rFPGA0_XAB_RFPARAMETER;
 
437
        rtlphy->phyreg_def[RF90_PATH_C].rflssi_select = rFPGA0_XCD_RFPARAMETER;
 
438
        rtlphy->phyreg_def[RF90_PATH_D].rflssi_select = rFPGA0_XCD_RFPARAMETER;
 
439
 
 
440
        rtlphy->phyreg_def[RF90_PATH_A].rftxgain_stage = RFPGA0_TXGAINSTAGE;
 
441
        rtlphy->phyreg_def[RF90_PATH_B].rftxgain_stage = RFPGA0_TXGAINSTAGE;
 
442
        rtlphy->phyreg_def[RF90_PATH_C].rftxgain_stage = RFPGA0_TXGAINSTAGE;
 
443
        rtlphy->phyreg_def[RF90_PATH_D].rftxgain_stage = RFPGA0_TXGAINSTAGE;
 
444
 
 
445
        rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para1 = RFPGA0_XA_HSSIPARAMETER1;
 
446
        rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para1 = RFPGA0_XB_HSSIPARAMETER1;
 
447
 
 
448
        rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para2 = RFPGA0_XA_HSSIPARAMETER2;
 
449
        rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para2 = RFPGA0_XB_HSSIPARAMETER2;
 
450
 
 
451
        rtlphy->phyreg_def[RF90_PATH_A].rfswitch_control =
 
452
            RFPGA0_XAB_SWITCHCONTROL;
 
453
        rtlphy->phyreg_def[RF90_PATH_B].rfswitch_control =
 
454
            RFPGA0_XAB_SWITCHCONTROL;
 
455
        rtlphy->phyreg_def[RF90_PATH_C].rfswitch_control =
 
456
            RFPGA0_XCD_SWITCHCONTROL;
 
457
        rtlphy->phyreg_def[RF90_PATH_D].rfswitch_control =
 
458
            RFPGA0_XCD_SWITCHCONTROL;
 
459
 
 
460
        rtlphy->phyreg_def[RF90_PATH_A].rfagc_control1 = ROFDM0_XAAGCCORE1;
 
461
        rtlphy->phyreg_def[RF90_PATH_B].rfagc_control1 = ROFDM0_XBAGCCORE1;
 
462
        rtlphy->phyreg_def[RF90_PATH_C].rfagc_control1 = ROFDM0_XCAGCCORE1;
 
463
        rtlphy->phyreg_def[RF90_PATH_D].rfagc_control1 = ROFDM0_XDAGCCORE1;
 
464
 
 
465
        rtlphy->phyreg_def[RF90_PATH_A].rfagc_control2 = ROFDM0_XAAGCCORE2;
 
466
        rtlphy->phyreg_def[RF90_PATH_B].rfagc_control2 = ROFDM0_XBAGCCORE2;
 
467
        rtlphy->phyreg_def[RF90_PATH_C].rfagc_control2 = ROFDM0_XCAGCCORE2;
 
468
        rtlphy->phyreg_def[RF90_PATH_D].rfagc_control2 = ROFDM0_XDAGCCORE2;
 
469
 
 
470
        rtlphy->phyreg_def[RF90_PATH_A].rfrxiq_imbalance =
 
471
            ROFDM0_XARXIQIMBALANCE;
 
472
        rtlphy->phyreg_def[RF90_PATH_B].rfrxiq_imbalance =
 
473
            ROFDM0_XBRXIQIMBALANCE;
 
474
        rtlphy->phyreg_def[RF90_PATH_C].rfrxiq_imbalance =
 
475
            ROFDM0_XCRXIQIMBANLANCE;
 
476
        rtlphy->phyreg_def[RF90_PATH_D].rfrxiq_imbalance =
 
477
            ROFDM0_XDRXIQIMBALANCE;
 
478
 
 
479
        rtlphy->phyreg_def[RF90_PATH_A].rfrx_afe = ROFDM0_XARXAFE;
 
480
        rtlphy->phyreg_def[RF90_PATH_B].rfrx_afe = ROFDM0_XBRXAFE;
 
481
        rtlphy->phyreg_def[RF90_PATH_C].rfrx_afe = ROFDM0_XCRXAFE;
 
482
        rtlphy->phyreg_def[RF90_PATH_D].rfrx_afe = ROFDM0_XDRXAFE;
 
483
 
 
484
        rtlphy->phyreg_def[RF90_PATH_A].rftxiq_imbalance =
 
485
            ROFDM0_XATXIQIMBALANCE;
 
486
        rtlphy->phyreg_def[RF90_PATH_B].rftxiq_imbalance =
 
487
            ROFDM0_XBTXIQIMBALANCE;
 
488
        rtlphy->phyreg_def[RF90_PATH_C].rftxiq_imbalance =
 
489
            ROFDM0_XCTXIQIMBALANCE;
 
490
        rtlphy->phyreg_def[RF90_PATH_D].rftxiq_imbalance =
 
491
            ROFDM0_XDTXIQIMBALANCE;
 
492
 
 
493
        rtlphy->phyreg_def[RF90_PATH_A].rftx_afe = ROFDM0_XATXAFE;
 
494
        rtlphy->phyreg_def[RF90_PATH_B].rftx_afe = ROFDM0_XBTXAFE;
 
495
        rtlphy->phyreg_def[RF90_PATH_C].rftx_afe = ROFDM0_XCTXAFE;
 
496
        rtlphy->phyreg_def[RF90_PATH_D].rftx_afe = ROFDM0_XDTXAFE;
 
497
 
 
498
        rtlphy->phyreg_def[RF90_PATH_A].rflssi_readback =
 
499
            RFPGA0_XA_LSSIREADBACK;
 
500
        rtlphy->phyreg_def[RF90_PATH_B].rflssi_readback =
 
501
            RFPGA0_XB_LSSIREADBACK;
 
502
        rtlphy->phyreg_def[RF90_PATH_C].rflssi_readback =
 
503
            RFPGA0_XC_LSSIREADBACK;
 
504
        rtlphy->phyreg_def[RF90_PATH_D].rflssi_readback =
 
505
            RFPGA0_XD_LSSIREADBACK;
 
506
 
 
507
        rtlphy->phyreg_def[RF90_PATH_A].rflssi_readbackpi =
 
508
            TRANSCEIVEA_HSPI_READBACK;
 
509
        rtlphy->phyreg_def[RF90_PATH_B].rflssi_readbackpi =
 
510
            TRANSCEIVEB_HSPI_READBACK;
 
511
 
 
512
}
 
513
EXPORT_SYMBOL(_rtl92c_phy_init_bb_rf_register_definition);
 
514
 
 
515
void rtl92c_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel)
 
516
{
 
517
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
518
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 
519
        struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
 
520
        u8 txpwr_level;
 
521
        long txpwr_dbm;
 
522
 
 
523
        txpwr_level = rtlphy->cur_cck_txpwridx;
 
524
        txpwr_dbm = _rtl92c_phy_txpwr_idx_to_dbm(hw,
 
525
                                                 WIRELESS_MODE_B, txpwr_level);
 
526
        txpwr_level = rtlphy->cur_ofdm24g_txpwridx +
 
527
            rtlefuse->legacy_ht_txpowerdiff;
 
528
        if (_rtl92c_phy_txpwr_idx_to_dbm(hw,
 
529
                                         WIRELESS_MODE_G,
 
530
                                         txpwr_level) > txpwr_dbm)
 
531
                txpwr_dbm =
 
532
                    _rtl92c_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G,
 
533
                                                 txpwr_level);
 
534
        txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
 
535
        if (_rtl92c_phy_txpwr_idx_to_dbm(hw,
 
536
                                         WIRELESS_MODE_N_24G,
 
537
                                         txpwr_level) > txpwr_dbm)
 
538
                txpwr_dbm =
 
539
                    _rtl92c_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_N_24G,
 
540
                                                 txpwr_level);
 
541
        *powerlevel = txpwr_dbm;
 
542
}
 
543
 
 
544
static void _rtl92c_get_txpower_index(struct ieee80211_hw *hw, u8 channel,
 
545
                                      u8 *cckpowerlevel, u8 *ofdmpowerlevel)
 
546
{
 
547
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
548
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 
549
        struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
 
550
        u8 index = (channel - 1);
 
551
 
 
552
        cckpowerlevel[RF90_PATH_A] =
 
553
            rtlefuse->txpwrlevel_cck[RF90_PATH_A][index];
 
554
        cckpowerlevel[RF90_PATH_B] =
 
555
            rtlefuse->txpwrlevel_cck[RF90_PATH_B][index];
 
556
        if (get_rf_type(rtlphy) == RF_1T2R || get_rf_type(rtlphy) == RF_1T1R) {
 
557
                ofdmpowerlevel[RF90_PATH_A] =
 
558
                    rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_A][index];
 
559
                ofdmpowerlevel[RF90_PATH_B] =
 
560
                    rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_B][index];
 
561
        } else if (get_rf_type(rtlphy) == RF_2T2R) {
 
562
                ofdmpowerlevel[RF90_PATH_A] =
 
563
                    rtlefuse->txpwrlevel_ht40_2s[RF90_PATH_A][index];
 
564
                ofdmpowerlevel[RF90_PATH_B] =
 
565
                    rtlefuse->txpwrlevel_ht40_2s[RF90_PATH_B][index];
 
566
        }
 
567
}
 
568
 
 
569
static void _rtl92c_ccxpower_index_check(struct ieee80211_hw *hw,
 
570
                                         u8 channel, u8 *cckpowerlevel,
 
571
                                         u8 *ofdmpowerlevel)
 
572
{
 
573
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
574
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 
575
 
 
576
        rtlphy->cur_cck_txpwridx = cckpowerlevel[0];
 
577
        rtlphy->cur_ofdm24g_txpwridx = ofdmpowerlevel[0];
 
578
 
 
579
}
 
580
 
 
581
void rtl92c_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
 
582
{
 
583
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
584
        struct rtl_efuse *rtlefuse = rtl_efuse(rtlpriv);
 
585
        u8 cckpowerlevel[2], ofdmpowerlevel[2];
 
586
 
 
587
        if (rtlefuse->txpwr_fromeprom == false)
 
588
                return;
 
589
        _rtl92c_get_txpower_index(hw, channel,
 
590
                                  &cckpowerlevel[0], &ofdmpowerlevel[0]);
 
591
        _rtl92c_ccxpower_index_check(hw,
 
592
                                     channel, &cckpowerlevel[0],
 
593
                                     &ofdmpowerlevel[0]);
 
594
        rtlpriv->cfg->ops->phy_rf6052_set_cck_txpower(hw, &cckpowerlevel[0]);
 
595
        rtlpriv->cfg->ops->phy_rf6052_set_ofdm_txpower(hw, &ofdmpowerlevel[0],
 
596
                                                       channel);
 
597
}
 
598
EXPORT_SYMBOL(rtl92c_phy_set_txpower_level);
 
599
 
 
600
bool rtl92c_phy_update_txpower_dbm(struct ieee80211_hw *hw, long power_indbm)
 
601
{
 
602
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
603
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 
604
        struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
 
605
        u8 idx;
 
606
        u8 rf_path;
 
607
        u8 ccktxpwridx = _rtl92c_phy_dbm_to_txpwr_Idx(hw,
 
608
                                                      WIRELESS_MODE_B,
 
609
                                                      power_indbm);
 
610
        u8 ofdmtxpwridx = _rtl92c_phy_dbm_to_txpwr_Idx(hw,
 
611
                                                       WIRELESS_MODE_N_24G,
 
612
                                                       power_indbm);
 
613
        if (ofdmtxpwridx - rtlefuse->legacy_ht_txpowerdiff > 0)
 
614
                ofdmtxpwridx -= rtlefuse->legacy_ht_txpowerdiff;
 
615
        else
 
616
                ofdmtxpwridx = 0;
 
617
        RT_TRACE(rtlpriv, COMP_TXAGC, DBG_TRACE,
 
618
                 ("%lx dBm, ccktxpwridx = %d, ofdmtxpwridx = %d\n",
 
619
                  power_indbm, ccktxpwridx, ofdmtxpwridx));
 
620
        for (idx = 0; idx < 14; idx++) {
 
621
                for (rf_path = 0; rf_path < 2; rf_path++) {
 
622
                        rtlefuse->txpwrlevel_cck[rf_path][idx] = ccktxpwridx;
 
623
                        rtlefuse->txpwrlevel_ht40_1s[rf_path][idx] =
 
624
                            ofdmtxpwridx;
 
625
                        rtlefuse->txpwrlevel_ht40_2s[rf_path][idx] =
 
626
                            ofdmtxpwridx;
 
627
                }
 
628
        }
 
629
        rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel);
 
630
        return true;
 
631
}
 
632
EXPORT_SYMBOL(rtl92c_phy_update_txpower_dbm);
 
633
 
 
634
u8 _rtl92c_phy_dbm_to_txpwr_Idx(struct ieee80211_hw *hw,
 
635
                                enum wireless_mode wirelessmode,
 
636
                                long power_indbm)
 
637
{
 
638
        u8 txpwridx;
 
639
        long offset;
 
640
 
 
641
        switch (wirelessmode) {
 
642
        case WIRELESS_MODE_B:
 
643
                offset = -7;
 
644
                break;
 
645
        case WIRELESS_MODE_G:
 
646
        case WIRELESS_MODE_N_24G:
 
647
                offset = -8;
 
648
                break;
 
649
        default:
 
650
                offset = -8;
 
651
                break;
 
652
        }
 
653
 
 
654
        if ((power_indbm - offset) > 0)
 
655
                txpwridx = (u8) ((power_indbm - offset) * 2);
 
656
        else
 
657
                txpwridx = 0;
 
658
 
 
659
        if (txpwridx > MAX_TXPWR_IDX_NMODE_92S)
 
660
                txpwridx = MAX_TXPWR_IDX_NMODE_92S;
 
661
 
 
662
        return txpwridx;
 
663
}
 
664
EXPORT_SYMBOL(_rtl92c_phy_dbm_to_txpwr_Idx);
 
665
 
 
666
long _rtl92c_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
 
667
                                  enum wireless_mode wirelessmode,
 
668
                                  u8 txpwridx)
 
669
{
 
670
        long offset;
 
671
        long pwrout_dbm;
 
672
 
 
673
        switch (wirelessmode) {
 
674
        case WIRELESS_MODE_B:
 
675
                offset = -7;
 
676
                break;
 
677
        case WIRELESS_MODE_G:
 
678
        case WIRELESS_MODE_N_24G:
 
679
                offset = -8;
 
680
                break;
 
681
        default:
 
682
                offset = -8;
 
683
                break;
 
684
        }
 
685
        pwrout_dbm = txpwridx / 2 + offset;
 
686
        return pwrout_dbm;
 
687
}
 
688
EXPORT_SYMBOL(_rtl92c_phy_txpwr_idx_to_dbm);
 
689
 
 
690
void rtl92c_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
 
691
{
 
692
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
693
        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
 
694
        enum io_type iotype;
 
695
 
 
696
        if (!is_hal_stop(rtlhal)) {
 
697
                switch (operation) {
 
698
                case SCAN_OPT_BACKUP:
 
699
                        iotype = IO_CMD_PAUSE_DM_BY_SCAN;
 
700
                        rtlpriv->cfg->ops->set_hw_reg(hw,
 
701
                                                      HW_VAR_IO_CMD,
 
702
                                                      (u8 *)&iotype);
 
703
 
 
704
                        break;
 
705
                case SCAN_OPT_RESTORE:
 
706
                        iotype = IO_CMD_RESUME_DM_BY_SCAN;
 
707
                        rtlpriv->cfg->ops->set_hw_reg(hw,
 
708
                                                      HW_VAR_IO_CMD,
 
709
                                                      (u8 *)&iotype);
 
710
                        break;
 
711
                default:
 
712
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
 
713
                                 ("Unknown Scan Backup operation.\n"));
 
714
                        break;
 
715
                }
 
716
        }
 
717
}
 
718
EXPORT_SYMBOL(rtl92c_phy_scan_operation_backup);
 
719
 
 
720
void rtl92c_phy_set_bw_mode(struct ieee80211_hw *hw,
 
721
                            enum nl80211_channel_type ch_type)
 
722
{
 
723
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
724
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 
725
        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
 
726
        u8 tmp_bw = rtlphy->current_chan_bw;
 
727
 
 
728
        if (rtlphy->set_bwmode_inprogress)
 
729
                return;
 
730
        rtlphy->set_bwmode_inprogress = true;
 
731
        if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
 
732
                rtlpriv->cfg->ops->phy_set_bw_mode_callback(hw);
 
733
        } else {
 
734
                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
 
735
                         ("FALSE driver sleep or unload\n"));
 
736
                rtlphy->set_bwmode_inprogress = false;
 
737
                rtlphy->current_chan_bw = tmp_bw;
 
738
        }
 
739
}
 
740
EXPORT_SYMBOL(rtl92c_phy_set_bw_mode);
 
741
 
 
742
void rtl92c_phy_sw_chnl_callback(struct ieee80211_hw *hw)
 
743
{
 
744
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
745
        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
 
746
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 
747
        u32 delay;
 
748
 
 
749
        RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
 
750
                 ("switch to channel%d\n", rtlphy->current_channel));
 
751
        if (is_hal_stop(rtlhal))
 
752
                return;
 
753
        do {
 
754
                if (!rtlphy->sw_chnl_inprogress)
 
755
                        break;
 
756
                if (!_rtl92c_phy_sw_chnl_step_by_step
 
757
                    (hw, rtlphy->current_channel, &rtlphy->sw_chnl_stage,
 
758
                     &rtlphy->sw_chnl_step, &delay)) {
 
759
                        if (delay > 0)
 
760
                                mdelay(delay);
 
761
                        else
 
762
                                continue;
 
763
                } else {
 
764
                        rtlphy->sw_chnl_inprogress = false;
 
765
                }
 
766
                break;
 
767
        } while (true);
 
768
        RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, ("<==\n"));
 
769
}
 
770
EXPORT_SYMBOL(rtl92c_phy_sw_chnl_callback);
 
771
 
 
772
u8 rtl92c_phy_sw_chnl(struct ieee80211_hw *hw)
 
773
{
 
774
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
775
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 
776
        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
 
777
 
 
778
        if (rtlphy->sw_chnl_inprogress)
 
779
                return 0;
 
780
        if (rtlphy->set_bwmode_inprogress)
 
781
                return 0;
 
782
        RT_ASSERT((rtlphy->current_channel <= 14),
 
783
                  ("WIRELESS_MODE_G but channel>14"));
 
784
        rtlphy->sw_chnl_inprogress = true;
 
785
        rtlphy->sw_chnl_stage = 0;
 
786
        rtlphy->sw_chnl_step = 0;
 
787
        if (!(is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
 
788
                rtl92c_phy_sw_chnl_callback(hw);
 
789
                RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
 
790
                         ("sw_chnl_inprogress false schdule workitem\n"));
 
791
                rtlphy->sw_chnl_inprogress = false;
 
792
        } else {
 
793
                RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
 
794
                         ("sw_chnl_inprogress false driver sleep or"
 
795
                          " unload\n"));
 
796
                rtlphy->sw_chnl_inprogress = false;
 
797
        }
 
798
        return 1;
 
799
}
 
800
EXPORT_SYMBOL(rtl92c_phy_sw_chnl);
 
801
 
 
802
static bool _rtl92c_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
 
803
                                             u32 cmdtableidx, u32 cmdtablesz,
 
804
                                             enum swchnlcmd_id cmdid,
 
805
                                             u32 para1, u32 para2, u32 msdelay)
 
806
{
 
807
        struct swchnlcmd *pcmd;
 
808
 
 
809
        if (cmdtable == NULL) {
 
810
                RT_ASSERT(false, ("cmdtable cannot be NULL.\n"));
 
811
                return false;
 
812
        }
 
813
 
 
814
        if (cmdtableidx >= cmdtablesz)
 
815
                return false;
 
816
 
 
817
        pcmd = cmdtable + cmdtableidx;
 
818
        pcmd->cmdid = cmdid;
 
819
        pcmd->para1 = para1;
 
820
        pcmd->para2 = para2;
 
821
        pcmd->msdelay = msdelay;
 
822
        return true;
 
823
}
 
824
 
 
825
bool _rtl92c_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
 
826
                                      u8 channel, u8 *stage, u8 *step,
 
827
                                      u32 *delay)
 
828
{
 
829
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
830
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 
831
        struct swchnlcmd precommoncmd[MAX_PRECMD_CNT];
 
832
        u32 precommoncmdcnt;
 
833
        struct swchnlcmd postcommoncmd[MAX_POSTCMD_CNT];
 
834
        u32 postcommoncmdcnt;
 
835
        struct swchnlcmd rfdependcmd[MAX_RFDEPENDCMD_CNT];
 
836
        u32 rfdependcmdcnt;
 
837
        struct swchnlcmd *currentcmd = NULL;
 
838
        u8 rfpath;
 
839
        u8 num_total_rfpath = rtlphy->num_total_rfpath;
 
840
 
 
841
        precommoncmdcnt = 0;
 
842
        _rtl92c_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
 
843
                                         MAX_PRECMD_CNT,
 
844
                                         CMDID_SET_TXPOWEROWER_LEVEL, 0, 0, 0);
 
845
        _rtl92c_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
 
846
                                         MAX_PRECMD_CNT, CMDID_END, 0, 0, 0);
 
847
 
 
848
        postcommoncmdcnt = 0;
 
849
 
 
850
        _rtl92c_phy_set_sw_chnl_cmdarray(postcommoncmd, postcommoncmdcnt++,
 
851
                                         MAX_POSTCMD_CNT, CMDID_END, 0, 0, 0);
 
852
 
 
853
        rfdependcmdcnt = 0;
 
854
 
 
855
        RT_ASSERT((channel >= 1 && channel <= 14),
 
856
                  ("illegal channel for Zebra: %d\n", channel));
 
857
 
 
858
        _rtl92c_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
 
859
                                         MAX_RFDEPENDCMD_CNT, CMDID_RF_WRITEREG,
 
860
                                         RF_CHNLBW, channel, 10);
 
861
 
 
862
        _rtl92c_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
 
863
                                         MAX_RFDEPENDCMD_CNT, CMDID_END, 0, 0,
 
864
                                         0);
 
865
 
 
866
        do {
 
867
                switch (*stage) {
 
868
                case 0:
 
869
                        currentcmd = &precommoncmd[*step];
 
870
                        break;
 
871
                case 1:
 
872
                        currentcmd = &rfdependcmd[*step];
 
873
                        break;
 
874
                case 2:
 
875
                        currentcmd = &postcommoncmd[*step];
 
876
                        break;
 
877
                }
 
878
 
 
879
                if (currentcmd->cmdid == CMDID_END) {
 
880
                        if ((*stage) == 2) {
 
881
                                return true;
 
882
                        } else {
 
883
                                (*stage)++;
 
884
                                (*step) = 0;
 
885
                                continue;
 
886
                        }
 
887
                }
 
888
 
 
889
                switch (currentcmd->cmdid) {
 
890
                case CMDID_SET_TXPOWEROWER_LEVEL:
 
891
                        rtl92c_phy_set_txpower_level(hw, channel);
 
892
                        break;
 
893
                case CMDID_WRITEPORT_ULONG:
 
894
                        rtl_write_dword(rtlpriv, currentcmd->para1,
 
895
                                        currentcmd->para2);
 
896
                        break;
 
897
                case CMDID_WRITEPORT_USHORT:
 
898
                        rtl_write_word(rtlpriv, currentcmd->para1,
 
899
                                       (u16) currentcmd->para2);
 
900
                        break;
 
901
                case CMDID_WRITEPORT_UCHAR:
 
902
                        rtl_write_byte(rtlpriv, currentcmd->para1,
 
903
                                       (u8) currentcmd->para2);
 
904
                        break;
 
905
                case CMDID_RF_WRITEREG:
 
906
                        for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) {
 
907
                                rtlphy->rfreg_chnlval[rfpath] =
 
908
                                    ((rtlphy->rfreg_chnlval[rfpath] &
 
909
                                      0xfffffc00) | currentcmd->para2);
 
910
 
 
911
                                rtl_set_rfreg(hw, (enum radio_path)rfpath,
 
912
                                              currentcmd->para1,
 
913
                                              RFREG_OFFSET_MASK,
 
914
                                              rtlphy->rfreg_chnlval[rfpath]);
 
915
                        }
 
916
                        break;
 
917
                default:
 
918
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
 
919
                                 ("switch case not process\n"));
 
920
                        break;
 
921
                }
 
922
 
 
923
                break;
 
924
        } while (true);
 
925
 
 
926
        (*delay) = currentcmd->msdelay;
 
927
        (*step)++;
 
928
        return false;
 
929
}
 
930
 
 
931
bool rtl8192_phy_check_is_legal_rfpath(struct ieee80211_hw *hw, u32 rfpath)
 
932
{
 
933
        return true;
 
934
}
 
935
EXPORT_SYMBOL(rtl8192_phy_check_is_legal_rfpath);
 
936
 
 
937
static u8 _rtl92c_phy_path_a_iqk(struct ieee80211_hw *hw, bool config_pathb)
 
938
{
 
939
        u32 reg_eac, reg_e94, reg_e9c, reg_ea4;
 
940
        u8 result = 0x00;
 
941
 
 
942
        rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x10008c1f);
 
943
        rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x10008c1f);
 
944
        rtl_set_bbreg(hw, 0xe38, MASKDWORD, 0x82140102);
 
945
        rtl_set_bbreg(hw, 0xe3c, MASKDWORD,
 
946
                      config_pathb ? 0x28160202 : 0x28160502);
 
947
 
 
948
        if (config_pathb) {
 
949
                rtl_set_bbreg(hw, 0xe50, MASKDWORD, 0x10008c22);
 
950
                rtl_set_bbreg(hw, 0xe54, MASKDWORD, 0x10008c22);
 
951
                rtl_set_bbreg(hw, 0xe58, MASKDWORD, 0x82140102);
 
952
                rtl_set_bbreg(hw, 0xe5c, MASKDWORD, 0x28160202);
 
953
        }
 
954
 
 
955
        rtl_set_bbreg(hw, 0xe4c, MASKDWORD, 0x001028d1);
 
956
        rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf9000000);
 
957
        rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf8000000);
 
958
 
 
959
        mdelay(IQK_DELAY_TIME);
 
960
 
 
961
        reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
 
962
        reg_e94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD);
 
963
        reg_e9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD);
 
964
        reg_ea4 = rtl_get_bbreg(hw, 0xea4, MASKDWORD);
 
965
 
 
966
        if (!(reg_eac & BIT(28)) &&
 
967
            (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
 
968
            (((reg_e9c & 0x03FF0000) >> 16) != 0x42))
 
969
                result |= 0x01;
 
970
        else
 
971
                return result;
 
972
 
 
973
        if (!(reg_eac & BIT(27)) &&
 
974
            (((reg_ea4 & 0x03FF0000) >> 16) != 0x132) &&
 
975
            (((reg_eac & 0x03FF0000) >> 16) != 0x36))
 
976
                result |= 0x02;
 
977
        return result;
 
978
}
 
979
 
 
980
static u8 _rtl92c_phy_path_b_iqk(struct ieee80211_hw *hw)
 
981
{
 
982
        u32 reg_eac, reg_eb4, reg_ebc, reg_ec4, reg_ecc;
 
983
        u8 result = 0x00;
 
984
 
 
985
        rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0x00000002);
 
986
        rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0x00000000);
 
987
        mdelay(IQK_DELAY_TIME);
 
988
        reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
 
989
        reg_eb4 = rtl_get_bbreg(hw, 0xeb4, MASKDWORD);
 
990
        reg_ebc = rtl_get_bbreg(hw, 0xebc, MASKDWORD);
 
991
        reg_ec4 = rtl_get_bbreg(hw, 0xec4, MASKDWORD);
 
992
        reg_ecc = rtl_get_bbreg(hw, 0xecc, MASKDWORD);
 
993
 
 
994
        if (!(reg_eac & BIT(31)) &&
 
995
            (((reg_eb4 & 0x03FF0000) >> 16) != 0x142) &&
 
996
            (((reg_ebc & 0x03FF0000) >> 16) != 0x42))
 
997
                result |= 0x01;
 
998
        else
 
999
                return result;
 
1000
        if (!(reg_eac & BIT(30)) &&
 
1001
            (((reg_ec4 & 0x03FF0000) >> 16) != 0x132) &&
 
1002
            (((reg_ecc & 0x03FF0000) >> 16) != 0x36))
 
1003
                result |= 0x02;
 
1004
        return result;
 
1005
}
 
1006
 
 
1007
static void _rtl92c_phy_path_a_fill_iqk_matrix(struct ieee80211_hw *hw,
 
1008
                                               bool iqk_ok, long result[][8],
 
1009
                                               u8 final_candidate, bool btxonly)
 
1010
{
 
1011
        u32 oldval_0, x, tx0_a, reg;
 
1012
        long y, tx0_c;
 
1013
 
 
1014
        if (final_candidate == 0xFF) {
 
1015
                return;
 
1016
        } else if (iqk_ok) {
 
1017
                oldval_0 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
 
1018
                                          MASKDWORD) >> 22) & 0x3FF;
 
1019
                x = result[final_candidate][0];
 
1020
                if ((x & 0x00000200) != 0)
 
1021
                        x = x | 0xFFFFFC00;
 
1022
                tx0_a = (x * oldval_0) >> 8;
 
1023
                rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x3FF, tx0_a);
 
1024
                rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(31),
 
1025
                              ((x * oldval_0 >> 7) & 0x1));
 
1026
                y = result[final_candidate][1];
 
1027
                if ((y & 0x00000200) != 0)
 
1028
                        y = y | 0xFFFFFC00;
 
1029
                tx0_c = (y * oldval_0) >> 8;
 
1030
                rtl_set_bbreg(hw, ROFDM0_XCTXAFE, 0xF0000000,
 
1031
                              ((tx0_c & 0x3C0) >> 6));
 
1032
                rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x003F0000,
 
1033
                              (tx0_c & 0x3F));
 
1034
                rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(29),
 
1035
                              ((y * oldval_0 >> 7) & 0x1));
 
1036
                if (btxonly)
 
1037
                        return;
 
1038
                reg = result[final_candidate][2];
 
1039
                rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0x3FF, reg);
 
1040
                reg = result[final_candidate][3] & 0x3F;
 
1041
                rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0xFC00, reg);
 
1042
                reg = (result[final_candidate][3] >> 6) & 0xF;
 
1043
                rtl_set_bbreg(hw, 0xca0, 0xF0000000, reg);
 
1044
        }
 
1045
}
 
1046
 
 
1047
static void _rtl92c_phy_path_b_fill_iqk_matrix(struct ieee80211_hw *hw,
 
1048
                                               bool iqk_ok, long result[][8],
 
1049
                                               u8 final_candidate, bool btxonly)
 
1050
{
 
1051
        u32 oldval_1, x, tx1_a, reg;
 
1052
        long y, tx1_c;
 
1053
 
 
1054
        if (final_candidate == 0xFF) {
 
1055
                return;
 
1056
        } else if (iqk_ok) {
 
1057
                oldval_1 = (rtl_get_bbreg(hw, ROFDM0_XBTXIQIMBALANCE,
 
1058
                                          MASKDWORD) >> 22) & 0x3FF;
 
1059
                x = result[final_candidate][4];
 
1060
                if ((x & 0x00000200) != 0)
 
1061
                        x = x | 0xFFFFFC00;
 
1062
                tx1_a = (x * oldval_1) >> 8;
 
1063
                rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 0x3FF, tx1_a);
 
1064
                rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(27),
 
1065
                              ((x * oldval_1 >> 7) & 0x1));
 
1066
                y = result[final_candidate][5];
 
1067
                if ((y & 0x00000200) != 0)
 
1068
                        y = y | 0xFFFFFC00;
 
1069
                tx1_c = (y * oldval_1) >> 8;
 
1070
                rtl_set_bbreg(hw, ROFDM0_XDTXAFE, 0xF0000000,
 
1071
                              ((tx1_c & 0x3C0) >> 6));
 
1072
                rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 0x003F0000,
 
1073
                              (tx1_c & 0x3F));
 
1074
                rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(25),
 
1075
                              ((y * oldval_1 >> 7) & 0x1));
 
1076
                if (btxonly)
 
1077
                        return;
 
1078
                reg = result[final_candidate][6];
 
1079
                rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0x3FF, reg);
 
1080
                reg = result[final_candidate][7] & 0x3F;
 
1081
                rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0xFC00, reg);
 
1082
                reg = (result[final_candidate][7] >> 6) & 0xF;
 
1083
                rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0x0000F000, reg);
 
1084
        }
 
1085
}
 
1086
 
 
1087
static void _rtl92c_phy_save_adda_registers(struct ieee80211_hw *hw,
 
1088
                                            u32 *addareg, u32 *addabackup,
 
1089
                                            u32 registernum)
 
1090
{
 
1091
        u32 i;
 
1092
 
 
1093
        for (i = 0; i < registernum; i++)
 
1094
                addabackup[i] = rtl_get_bbreg(hw, addareg[i], MASKDWORD);
 
1095
}
 
1096
 
 
1097
static void _rtl92c_phy_save_mac_registers(struct ieee80211_hw *hw,
 
1098
                                           u32 *macreg, u32 *macbackup)
 
1099
{
 
1100
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
1101
        u32 i;
 
1102
 
 
1103
        for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
 
1104
                macbackup[i] = rtl_read_byte(rtlpriv, macreg[i]);
 
1105
        macbackup[i] = rtl_read_dword(rtlpriv, macreg[i]);
 
1106
}
 
1107
 
 
1108
static void _rtl92c_phy_reload_adda_registers(struct ieee80211_hw *hw,
 
1109
                                              u32 *addareg, u32 *addabackup,
 
1110
                                              u32 regiesternum)
 
1111
{
 
1112
        u32 i;
 
1113
 
 
1114
        for (i = 0; i < regiesternum; i++)
 
1115
                rtl_set_bbreg(hw, addareg[i], MASKDWORD, addabackup[i]);
 
1116
}
 
1117
 
 
1118
static void _rtl92c_phy_reload_mac_registers(struct ieee80211_hw *hw,
 
1119
                                             u32 *macreg, u32 *macbackup)
 
1120
{
 
1121
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
1122
        u32 i;
 
1123
 
 
1124
        for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
 
1125
                rtl_write_byte(rtlpriv, macreg[i], (u8) macbackup[i]);
 
1126
        rtl_write_dword(rtlpriv, macreg[i], macbackup[i]);
 
1127
}
 
1128
 
 
1129
static void _rtl92c_phy_path_adda_on(struct ieee80211_hw *hw,
 
1130
                                     u32 *addareg, bool is_patha_on, bool is2t)
 
1131
{
 
1132
        u32 pathOn;
 
1133
        u32 i;
 
1134
 
 
1135
        pathOn = is_patha_on ? 0x04db25a4 : 0x0b1b25a4;
 
1136
        if (false == is2t) {
 
1137
                pathOn = 0x0bdb25a0;
 
1138
                rtl_set_bbreg(hw, addareg[0], MASKDWORD, 0x0b1b25a0);
 
1139
        } else {
 
1140
                rtl_set_bbreg(hw, addareg[0], MASKDWORD, pathOn);
 
1141
        }
 
1142
 
 
1143
        for (i = 1; i < IQK_ADDA_REG_NUM; i++)
 
1144
                rtl_set_bbreg(hw, addareg[i], MASKDWORD, pathOn);
 
1145
}
 
1146
 
 
1147
static void _rtl92c_phy_mac_setting_calibration(struct ieee80211_hw *hw,
 
1148
                                                u32 *macreg, u32 *macbackup)
 
1149
{
 
1150
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
1151
        u32 i;
 
1152
 
 
1153
        rtl_write_byte(rtlpriv, macreg[0], 0x3F);
 
1154
 
 
1155
        for (i = 1; i < (IQK_MAC_REG_NUM - 1); i++)
 
1156
                rtl_write_byte(rtlpriv, macreg[i],
 
1157
                               (u8) (macbackup[i] & (~BIT(3))));
 
1158
        rtl_write_byte(rtlpriv, macreg[i], (u8) (macbackup[i] & (~BIT(5))));
 
1159
}
 
1160
 
 
1161
static void _rtl92c_phy_path_a_standby(struct ieee80211_hw *hw)
 
1162
{
 
1163
        rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x0);
 
1164
        rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00010000);
 
1165
        rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
 
1166
}
 
1167
 
 
1168
static void _rtl92c_phy_pi_mode_switch(struct ieee80211_hw *hw, bool pi_mode)
 
1169
{
 
1170
        u32 mode;
 
1171
 
 
1172
        mode = pi_mode ? 0x01000100 : 0x01000000;
 
1173
        rtl_set_bbreg(hw, 0x820, MASKDWORD, mode);
 
1174
        rtl_set_bbreg(hw, 0x828, MASKDWORD, mode);
 
1175
}
 
1176
 
 
1177
static bool _rtl92c_phy_simularity_compare(struct ieee80211_hw *hw,
 
1178
                                           long result[][8], u8 c1, u8 c2)
 
1179
{
 
1180
        u32 i, j, diff, simularity_bitmap, bound;
 
1181
        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
 
1182
 
 
1183
        u8 final_candidate[2] = { 0xFF, 0xFF };
 
1184
        bool bresult = true, is2t = IS_92C_SERIAL(rtlhal->version);
 
1185
 
 
1186
        if (is2t)
 
1187
                bound = 8;
 
1188
        else
 
1189
                bound = 4;
 
1190
 
 
1191
        simularity_bitmap = 0;
 
1192
 
 
1193
        for (i = 0; i < bound; i++) {
 
1194
                diff = (result[c1][i] > result[c2][i]) ?
 
1195
                    (result[c1][i] - result[c2][i]) :
 
1196
                    (result[c2][i] - result[c1][i]);
 
1197
 
 
1198
                if (diff > MAX_TOLERANCE) {
 
1199
                        if ((i == 2 || i == 6) && !simularity_bitmap) {
 
1200
                                if (result[c1][i] + result[c1][i + 1] == 0)
 
1201
                                        final_candidate[(i / 4)] = c2;
 
1202
                                else if (result[c2][i] + result[c2][i + 1] == 0)
 
1203
                                        final_candidate[(i / 4)] = c1;
 
1204
                                else
 
1205
                                        simularity_bitmap = simularity_bitmap |
 
1206
                                            (1 << i);
 
1207
                        } else
 
1208
                                simularity_bitmap =
 
1209
                                    simularity_bitmap | (1 << i);
 
1210
                }
 
1211
        }
 
1212
 
 
1213
        if (simularity_bitmap == 0) {
 
1214
                for (i = 0; i < (bound / 4); i++) {
 
1215
                        if (final_candidate[i] != 0xFF) {
 
1216
                                for (j = i * 4; j < (i + 1) * 4 - 2; j++)
 
1217
                                        result[3][j] =
 
1218
                                            result[final_candidate[i]][j];
 
1219
                                bresult = false;
 
1220
                        }
 
1221
                }
 
1222
                return bresult;
 
1223
        } else if (!(simularity_bitmap & 0x0F)) {
 
1224
                for (i = 0; i < 4; i++)
 
1225
                        result[3][i] = result[c1][i];
 
1226
                return false;
 
1227
        } else if (!(simularity_bitmap & 0xF0) && is2t) {
 
1228
                for (i = 4; i < 8; i++)
 
1229
                        result[3][i] = result[c1][i];
 
1230
                return false;
 
1231
        } else {
 
1232
                return false;
 
1233
        }
 
1234
 
 
1235
}
 
1236
 
 
1237
static void _rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw,
 
1238
                                     long result[][8], u8 t, bool is2t)
 
1239
{
 
1240
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
1241
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 
1242
        u32 i;
 
1243
        u8 patha_ok, pathb_ok;
 
1244
        u32 adda_reg[IQK_ADDA_REG_NUM] = {
 
1245
                0x85c, 0xe6c, 0xe70, 0xe74,
 
1246
                0xe78, 0xe7c, 0xe80, 0xe84,
 
1247
                0xe88, 0xe8c, 0xed0, 0xed4,
 
1248
                0xed8, 0xedc, 0xee0, 0xeec
 
1249
        };
 
1250
 
 
1251
        u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
 
1252
                0x522, 0x550, 0x551, 0x040
 
1253
        };
 
1254
 
 
1255
        const u32 retrycount = 2;
 
1256
 
 
1257
        if (t == 0) {
 
1258
                /* dummy read */
 
1259
                rtl_get_bbreg(hw, 0x800, MASKDWORD);
 
1260
 
 
1261
                _rtl92c_phy_save_adda_registers(hw, adda_reg,
 
1262
                                                rtlphy->adda_backup, 16);
 
1263
                _rtl92c_phy_save_mac_registers(hw, iqk_mac_reg,
 
1264
                                               rtlphy->iqk_mac_backup);
 
1265
        }
 
1266
        _rtl92c_phy_path_adda_on(hw, adda_reg, true, is2t);
 
1267
        if (t == 0) {
 
1268
                rtlphy->rfpi_enable = (u8) rtl_get_bbreg(hw,
 
1269
                                                   RFPGA0_XA_HSSIPARAMETER1,
 
1270
                                                   BIT(8));
 
1271
        }
 
1272
 
 
1273
        if (!rtlphy->rfpi_enable)
 
1274
                _rtl92c_phy_pi_mode_switch(hw, true);
 
1275
        if (t == 0) {
 
1276
                rtlphy->reg_c04 = rtl_get_bbreg(hw, 0xc04, MASKDWORD);
 
1277
                rtlphy->reg_c08 = rtl_get_bbreg(hw, 0xc08, MASKDWORD);
 
1278
                rtlphy->reg_874 = rtl_get_bbreg(hw, 0x874, MASKDWORD);
 
1279
        }
 
1280
        rtl_set_bbreg(hw, 0xc04, MASKDWORD, 0x03a05600);
 
1281
        rtl_set_bbreg(hw, 0xc08, MASKDWORD, 0x000800e4);
 
1282
        rtl_set_bbreg(hw, 0x874, MASKDWORD, 0x22204000);
 
1283
        if (is2t) {
 
1284
                rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00010000);
 
1285
                rtl_set_bbreg(hw, 0x844, MASKDWORD, 0x00010000);
 
1286
        }
 
1287
        _rtl92c_phy_mac_setting_calibration(hw, iqk_mac_reg,
 
1288
                                            rtlphy->iqk_mac_backup);
 
1289
        rtl_set_bbreg(hw, 0xb68, MASKDWORD, 0x00080000);
 
1290
        if (is2t)
 
1291
                rtl_set_bbreg(hw, 0xb6c, MASKDWORD, 0x00080000);
 
1292
        rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
 
1293
        rtl_set_bbreg(hw, 0xe40, MASKDWORD, 0x01007c00);
 
1294
        rtl_set_bbreg(hw, 0xe44, MASKDWORD, 0x01004800);
 
1295
        for (i = 0; i < retrycount; i++) {
 
1296
                patha_ok = _rtl92c_phy_path_a_iqk(hw, is2t);
 
1297
                if (patha_ok == 0x03) {
 
1298
                        result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
 
1299
                                        0x3FF0000) >> 16;
 
1300
                        result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
 
1301
                                        0x3FF0000) >> 16;
 
1302
                        result[t][2] = (rtl_get_bbreg(hw, 0xea4, MASKDWORD) &
 
1303
                                        0x3FF0000) >> 16;
 
1304
                        result[t][3] = (rtl_get_bbreg(hw, 0xeac, MASKDWORD) &
 
1305
                                        0x3FF0000) >> 16;
 
1306
                        break;
 
1307
                } else if (i == (retrycount - 1) && patha_ok == 0x01)
 
1308
 
 
1309
                        result[t][0] = (rtl_get_bbreg(hw, 0xe94,
 
1310
                                                      MASKDWORD) & 0x3FF0000) >>
 
1311
                            16;
 
1312
                result[t][1] =
 
1313
                    (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) & 0x3FF0000) >> 16;
 
1314
 
 
1315
        }
 
1316
 
 
1317
        if (is2t) {
 
1318
                _rtl92c_phy_path_a_standby(hw);
 
1319
                _rtl92c_phy_path_adda_on(hw, adda_reg, false, is2t);
 
1320
                for (i = 0; i < retrycount; i++) {
 
1321
                        pathb_ok = _rtl92c_phy_path_b_iqk(hw);
 
1322
                        if (pathb_ok == 0x03) {
 
1323
                                result[t][4] = (rtl_get_bbreg(hw,
 
1324
                                                      0xeb4,
 
1325
                                                      MASKDWORD) &
 
1326
                                                0x3FF0000) >> 16;
 
1327
                                result[t][5] =
 
1328
                                    (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
 
1329
                                     0x3FF0000) >> 16;
 
1330
                                result[t][6] =
 
1331
                                    (rtl_get_bbreg(hw, 0xec4, MASKDWORD) &
 
1332
                                     0x3FF0000) >> 16;
 
1333
                                result[t][7] =
 
1334
                                    (rtl_get_bbreg(hw, 0xecc, MASKDWORD) &
 
1335
                                     0x3FF0000) >> 16;
 
1336
                                break;
 
1337
                        } else if (i == (retrycount - 1) && pathb_ok == 0x01) {
 
1338
                                result[t][4] = (rtl_get_bbreg(hw,
 
1339
                                                      0xeb4,
 
1340
                                                      MASKDWORD) &
 
1341
                                                0x3FF0000) >> 16;
 
1342
                        }
 
1343
                        result[t][5] = (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
 
1344
                                        0x3FF0000) >> 16;
 
1345
                }
 
1346
        }
 
1347
        rtl_set_bbreg(hw, 0xc04, MASKDWORD, rtlphy->reg_c04);
 
1348
        rtl_set_bbreg(hw, 0x874, MASKDWORD, rtlphy->reg_874);
 
1349
        rtl_set_bbreg(hw, 0xc08, MASKDWORD, rtlphy->reg_c08);
 
1350
        rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0);
 
1351
        rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00032ed3);
 
1352
        if (is2t)
 
1353
                rtl_set_bbreg(hw, 0x844, MASKDWORD, 0x00032ed3);
 
1354
        if (t != 0) {
 
1355
                if (!rtlphy->rfpi_enable)
 
1356
                        _rtl92c_phy_pi_mode_switch(hw, false);
 
1357
                _rtl92c_phy_reload_adda_registers(hw, adda_reg,
 
1358
                                                  rtlphy->adda_backup, 16);
 
1359
                _rtl92c_phy_reload_mac_registers(hw, iqk_mac_reg,
 
1360
                                                 rtlphy->iqk_mac_backup);
 
1361
        }
 
1362
}
 
1363
 
 
1364
static void _rtl92c_phy_ap_calibrate(struct ieee80211_hw *hw,
 
1365
                                     char delta, bool is2t)
 
1366
{
 
1367
#if 0 /* This routine is deliberately dummied out for later fixes */
 
1368
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
1369
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 
1370
        struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
 
1371
 
 
1372
        u32 reg_d[PATH_NUM];
 
1373
        u32 tmpreg, index, offset, path, i, pathbound = PATH_NUM, apkbound;
 
1374
 
 
1375
        u32 bb_backup[APK_BB_REG_NUM];
 
1376
        u32 bb_reg[APK_BB_REG_NUM] = {
 
1377
                0x904, 0xc04, 0x800, 0xc08, 0x874
 
1378
        };
 
1379
        u32 bb_ap_mode[APK_BB_REG_NUM] = {
 
1380
                0x00000020, 0x00a05430, 0x02040000,
 
1381
                0x000800e4, 0x00204000
 
1382
        };
 
1383
        u32 bb_normal_ap_mode[APK_BB_REG_NUM] = {
 
1384
                0x00000020, 0x00a05430, 0x02040000,
 
1385
                0x000800e4, 0x22204000
 
1386
        };
 
1387
 
 
1388
        u32 afe_backup[APK_AFE_REG_NUM];
 
1389
        u32 afe_reg[APK_AFE_REG_NUM] = {
 
1390
                0x85c, 0xe6c, 0xe70, 0xe74, 0xe78,
 
1391
                0xe7c, 0xe80, 0xe84, 0xe88, 0xe8c,
 
1392
                0xed0, 0xed4, 0xed8, 0xedc, 0xee0,
 
1393
                0xeec
 
1394
        };
 
1395
 
 
1396
        u32 mac_backup[IQK_MAC_REG_NUM];
 
1397
        u32 mac_reg[IQK_MAC_REG_NUM] = {
 
1398
                0x522, 0x550, 0x551, 0x040
 
1399
        };
 
1400
 
 
1401
        u32 apk_rf_init_value[PATH_NUM][APK_BB_REG_NUM] = {
 
1402
                {0x0852c, 0x1852c, 0x5852c, 0x1852c, 0x5852c},
 
1403
                {0x2852e, 0x0852e, 0x3852e, 0x0852e, 0x0852e}
 
1404
        };
 
1405
 
 
1406
        u32 apk_normal_rf_init_value[PATH_NUM][APK_BB_REG_NUM] = {
 
1407
                {0x0852c, 0x0a52c, 0x3a52c, 0x5a52c, 0x5a52c},
 
1408
                {0x0852c, 0x0a52c, 0x5a52c, 0x5a52c, 0x5a52c}
 
1409
        };
 
1410
 
 
1411
        u32 apk_rf_value_0[PATH_NUM][APK_BB_REG_NUM] = {
 
1412
                {0x52019, 0x52014, 0x52013, 0x5200f, 0x5208d},
 
1413
                {0x5201a, 0x52019, 0x52016, 0x52033, 0x52050}
 
1414
        };
 
1415
 
 
1416
        u32 apk_normal_rf_value_0[PATH_NUM][APK_BB_REG_NUM] = {
 
1417
                {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a},
 
1418
                {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a}
 
1419
        };
 
1420
 
 
1421
        u32 afe_on_off[PATH_NUM] = {
 
1422
                0x04db25a4, 0x0b1b25a4
 
1423
        };
 
1424
 
 
1425
        const u32 apk_offset[PATH_NUM] = { 0xb68, 0xb6c };
 
1426
 
 
1427
        u32 apk_normal_offset[PATH_NUM] = { 0xb28, 0xb98 };
 
1428
 
 
1429
        u32 apk_value[PATH_NUM] = { 0x92fc0000, 0x12fc0000 };
 
1430
 
 
1431
        u32 apk_normal_value[PATH_NUM] = { 0x92680000, 0x12680000 };
 
1432
 
 
1433
        const char apk_delta_mapping[APK_BB_REG_NUM][13] = {
 
1434
                {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
 
1435
                {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
 
1436
                {-6, -4, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
 
1437
                {-1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6},
 
1438
                {-11, -9, -7, -5, -3, -1, 0, 0, 0, 0, 0, 0, 0}
 
1439
        };
 
1440
 
 
1441
        const u32 apk_normal_setting_value_1[13] = {
 
1442
                0x01017018, 0xf7ed8f84, 0x1b1a1816, 0x2522201e, 0x322e2b28,
 
1443
                0x433f3a36, 0x5b544e49, 0x7b726a62, 0xa69a8f84, 0xdfcfc0b3,
 
1444
                0x12680000, 0x00880000, 0x00880000
 
1445
        };
 
1446
 
 
1447
        const u32 apk_normal_setting_value_2[16] = {
 
1448
                0x01c7021d, 0x01670183, 0x01000123, 0x00bf00e2, 0x008d00a3,
 
1449
                0x0068007b, 0x004d0059, 0x003a0042, 0x002b0031, 0x001f0025,
 
1450
                0x0017001b, 0x00110014, 0x000c000f, 0x0009000b, 0x00070008,
 
1451
                0x00050006
 
1452
        };
 
1453
 
 
1454
        u32 apk_result[PATH_NUM][APK_BB_REG_NUM];
 
1455
 
 
1456
        long bb_offset, delta_v, delta_offset;
 
1457
 
 
1458
        if (!is2t)
 
1459
                pathbound = 1;
 
1460
 
 
1461
        return;
 
1462
 
 
1463
        for (index = 0; index < PATH_NUM; index++) {
 
1464
                apk_offset[index] = apk_normal_offset[index];
 
1465
                apk_value[index] = apk_normal_value[index];
 
1466
                afe_on_off[index] = 0x6fdb25a4;
 
1467
        }
 
1468
 
 
1469
        for (index = 0; index < APK_BB_REG_NUM; index++) {
 
1470
                for (path = 0; path < pathbound; path++) {
 
1471
                        apk_rf_init_value[path][index] =
 
1472
                            apk_normal_rf_init_value[path][index];
 
1473
                        apk_rf_value_0[path][index] =
 
1474
                            apk_normal_rf_value_0[path][index];
 
1475
                }
 
1476
                bb_ap_mode[index] = bb_normal_ap_mode[index];
 
1477
 
 
1478
                apkbound = 6;
 
1479
        }
 
1480
 
 
1481
        for (index = 0; index < APK_BB_REG_NUM; index++) {
 
1482
                if (index == 0)
 
1483
                        continue;
 
1484
                bb_backup[index] = rtl_get_bbreg(hw, bb_reg[index], MASKDWORD);
 
1485
        }
 
1486
 
 
1487
        _rtl92c_phy_save_mac_registers(hw, mac_reg, mac_backup);
 
1488
 
 
1489
        _rtl92c_phy_save_adda_registers(hw, afe_reg, afe_backup, 16);
 
1490
 
 
1491
        for (path = 0; path < pathbound; path++) {
 
1492
                if (path == RF90_PATH_A) {
 
1493
                        offset = 0xb00;
 
1494
                        for (index = 0; index < 11; index++) {
 
1495
                                rtl_set_bbreg(hw, offset, MASKDWORD,
 
1496
                                              apk_normal_setting_value_1
 
1497
                                              [index]);
 
1498
 
 
1499
                                offset += 0x04;
 
1500
                        }
 
1501
 
 
1502
                        rtl_set_bbreg(hw, 0xb98, MASKDWORD, 0x12680000);
 
1503
 
 
1504
                        offset = 0xb68;
 
1505
                        for (; index < 13; index++) {
 
1506
                                rtl_set_bbreg(hw, offset, MASKDWORD,
 
1507
                                              apk_normal_setting_value_1
 
1508
                                              [index]);
 
1509
 
 
1510
                                offset += 0x04;
 
1511
                        }
 
1512
 
 
1513
                        rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x40000000);
 
1514
 
 
1515
                        offset = 0xb00;
 
1516
                        for (index = 0; index < 16; index++) {
 
1517
                                rtl_set_bbreg(hw, offset, MASKDWORD,
 
1518
                                              apk_normal_setting_value_2
 
1519
                                              [index]);
 
1520
 
 
1521
                                offset += 0x04;
 
1522
                        }
 
1523
                        rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x00000000);
 
1524
                } else if (path == RF90_PATH_B) {
 
1525
                        offset = 0xb70;
 
1526
                        for (index = 0; index < 10; index++) {
 
1527
                                rtl_set_bbreg(hw, offset, MASKDWORD,
 
1528
                                              apk_normal_setting_value_1
 
1529
                                              [index]);
 
1530
 
 
1531
                                offset += 0x04;
 
1532
                        }
 
1533
                        rtl_set_bbreg(hw, 0xb28, MASKDWORD, 0x12680000);
 
1534
                        rtl_set_bbreg(hw, 0xb98, MASKDWORD, 0x12680000);
 
1535
 
 
1536
                        offset = 0xb68;
 
1537
                        index = 11;
 
1538
                        for (; index < 13; index++) {
 
1539
                                rtl_set_bbreg(hw, offset, MASKDWORD,
 
1540
                                              apk_normal_setting_value_1
 
1541
                                              [index]);
 
1542
 
 
1543
                                offset += 0x04;
 
1544
                        }
 
1545
 
 
1546
                        rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x40000000);
 
1547
 
 
1548
                        offset = 0xb60;
 
1549
                        for (index = 0; index < 16; index++) {
 
1550
                                rtl_set_bbreg(hw, offset, MASKDWORD,
 
1551
                                              apk_normal_setting_value_2
 
1552
                                              [index]);
 
1553
 
 
1554
                                offset += 0x04;
 
1555
                        }
 
1556
                        rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x00000000);
 
1557
                }
 
1558
 
 
1559
                reg_d[path] = rtl_get_rfreg(hw, (enum radio_path)path,
 
1560
                                            0xd, MASKDWORD);
 
1561
 
 
1562
                for (index = 0; index < APK_AFE_REG_NUM; index++)
 
1563
                        rtl_set_bbreg(hw, afe_reg[index], MASKDWORD,
 
1564
                                      afe_on_off[path]);
 
1565
 
 
1566
                if (path == RF90_PATH_A) {
 
1567
                        for (index = 0; index < APK_BB_REG_NUM; index++) {
 
1568
                                if (index == 0)
 
1569
                                        continue;
 
1570
                                rtl_set_bbreg(hw, bb_reg[index], MASKDWORD,
 
1571
                                              bb_ap_mode[index]);
 
1572
                        }
 
1573
                }
 
1574
 
 
1575
                _rtl92c_phy_mac_setting_calibration(hw, mac_reg, mac_backup);
 
1576
 
 
1577
                if (path == 0) {
 
1578
                        rtl_set_rfreg(hw, RF90_PATH_B, 0x0, MASKDWORD, 0x10000);
 
1579
                } else {
 
1580
                        rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASKDWORD,
 
1581
                                      0x10000);
 
1582
                        rtl_set_rfreg(hw, RF90_PATH_A, 0x10, MASKDWORD,
 
1583
                                      0x1000f);
 
1584
                        rtl_set_rfreg(hw, RF90_PATH_A, 0x11, MASKDWORD,
 
1585
                                      0x20103);
 
1586
                }
 
1587
 
 
1588
                delta_offset = ((delta + 14) / 2);
 
1589
                if (delta_offset < 0)
 
1590
                        delta_offset = 0;
 
1591
                else if (delta_offset > 12)
 
1592
                        delta_offset = 12;
 
1593
 
 
1594
                for (index = 0; index < APK_BB_REG_NUM; index++) {
 
1595
                        if (index != 1)
 
1596
                                continue;
 
1597
 
 
1598
                        tmpreg = apk_rf_init_value[path][index];
 
1599
 
 
1600
                        if (!rtlefuse->apk_thermalmeterignore) {
 
1601
                                bb_offset = (tmpreg & 0xF0000) >> 16;
 
1602
 
 
1603
                                if (!(tmpreg & BIT(15)))
 
1604
                                        bb_offset = -bb_offset;
 
1605
 
 
1606
                                delta_v =
 
1607
                                    apk_delta_mapping[index][delta_offset];
 
1608
 
 
1609
                                bb_offset += delta_v;
 
1610
 
 
1611
                                if (bb_offset < 0) {
 
1612
                                        tmpreg = tmpreg & (~BIT(15));
 
1613
                                        bb_offset = -bb_offset;
 
1614
                                } else {
 
1615
                                        tmpreg = tmpreg | BIT(15);
 
1616
                                }
 
1617
 
 
1618
                                tmpreg =
 
1619
                                    (tmpreg & 0xFFF0FFFF) | (bb_offset << 16);
 
1620
                        }
 
1621
 
 
1622
                        rtl_set_rfreg(hw, (enum radio_path)path, 0xc,
 
1623
                                      MASKDWORD, 0x8992e);
 
1624
                        rtl_set_rfreg(hw, (enum radio_path)path, 0x0,
 
1625
                                      MASKDWORD, apk_rf_value_0[path][index]);
 
1626
                        rtl_set_rfreg(hw, (enum radio_path)path, 0xd,
 
1627
                                      MASKDWORD, tmpreg);
 
1628
 
 
1629
                        i = 0;
 
1630
                        do {
 
1631
                                rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80000000);
 
1632
                                rtl_set_bbreg(hw, apk_offset[path],
 
1633
                                              MASKDWORD, apk_value[0]);
 
1634
                                RTPRINT(rtlpriv, FINIT, INIT_IQK,
 
1635
                                        ("PHY_APCalibrate() offset 0x%x "
 
1636
                                         "value 0x%x\n",
 
1637
                                         apk_offset[path],
 
1638
                                         rtl_get_bbreg(hw, apk_offset[path],
 
1639
                                                       MASKDWORD)));
 
1640
 
 
1641
                                mdelay(3);
 
1642
 
 
1643
                                rtl_set_bbreg(hw, apk_offset[path],
 
1644
                                              MASKDWORD, apk_value[1]);
 
1645
                                RTPRINT(rtlpriv, FINIT, INIT_IQK,
 
1646
                                        ("PHY_APCalibrate() offset 0x%x "
 
1647
                                         "value 0x%x\n",
 
1648
                                         apk_offset[path],
 
1649
                                         rtl_get_bbreg(hw, apk_offset[path],
 
1650
                                                       MASKDWORD)));
 
1651
 
 
1652
                                mdelay(20);
 
1653
 
 
1654
                                rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x00000000);
 
1655
 
 
1656
                                if (path == RF90_PATH_A)
 
1657
                                        tmpreg = rtl_get_bbreg(hw, 0xbd8,
 
1658
                                                               0x03E00000);
 
1659
                                else
 
1660
                                        tmpreg = rtl_get_bbreg(hw, 0xbd8,
 
1661
                                                               0xF8000000);
 
1662
 
 
1663
                                RTPRINT(rtlpriv, FINIT, INIT_IQK,
 
1664
                                        ("PHY_APCalibrate() offset "
 
1665
                                         "0xbd8[25:21] %x\n", tmpreg));
 
1666
 
 
1667
                                i++;
 
1668
 
 
1669
                        } while (tmpreg > apkbound && i < 4);
 
1670
 
 
1671
                        apk_result[path][index] = tmpreg;
 
1672
                }
 
1673
        }
 
1674
 
 
1675
        _rtl92c_phy_reload_mac_registers(hw, mac_reg, mac_backup);
 
1676
 
 
1677
        for (index = 0; index < APK_BB_REG_NUM; index++) {
 
1678
                if (index == 0)
 
1679
                        continue;
 
1680
                rtl_set_bbreg(hw, bb_reg[index], MASKDWORD, bb_backup[index]);
 
1681
        }
 
1682
 
 
1683
        _rtl92c_phy_reload_adda_registers(hw, afe_reg, afe_backup, 16);
 
1684
 
 
1685
        for (path = 0; path < pathbound; path++) {
 
1686
                rtl_set_rfreg(hw, (enum radio_path)path, 0xd,
 
1687
                              MASKDWORD, reg_d[path]);
 
1688
 
 
1689
                if (path == RF90_PATH_B) {
 
1690
                        rtl_set_rfreg(hw, RF90_PATH_A, 0x10, MASKDWORD,
 
1691
                                      0x1000f);
 
1692
                        rtl_set_rfreg(hw, RF90_PATH_A, 0x11, MASKDWORD,
 
1693
                                      0x20101);
 
1694
                }
 
1695
 
 
1696
                if (apk_result[path][1] > 6)
 
1697
                        apk_result[path][1] = 6;
 
1698
        }
 
1699
 
 
1700
        for (path = 0; path < pathbound; path++) {
 
1701
                rtl_set_rfreg(hw, (enum radio_path)path, 0x3, MASKDWORD,
 
1702
                              ((apk_result[path][1] << 15) |
 
1703
                               (apk_result[path][1] << 10) |
 
1704
                               (apk_result[path][1] << 5) |
 
1705
                               apk_result[path][1]));
 
1706
 
 
1707
                if (path == RF90_PATH_A)
 
1708
                        rtl_set_rfreg(hw, (enum radio_path)path, 0x4, MASKDWORD,
 
1709
                                      ((apk_result[path][1] << 15) |
 
1710
                                       (apk_result[path][1] << 10) |
 
1711
                                       (0x00 << 5) | 0x05));
 
1712
                else
 
1713
                        rtl_set_rfreg(hw, (enum radio_path)path, 0x4, MASKDWORD,
 
1714
                                      ((apk_result[path][1] << 15) |
 
1715
                                       (apk_result[path][1] << 10) |
 
1716
                                       (0x02 << 5) | 0x05));
 
1717
 
 
1718
                rtl_set_rfreg(hw, (enum radio_path)path, 0xe, MASKDWORD,
 
1719
                              ((0x08 << 15) | (0x08 << 10) | (0x08 << 5) |
 
1720
                               0x08));
 
1721
 
 
1722
        }
 
1723
        rtlphy->b_apk_done = true;
 
1724
#endif
 
1725
}
 
1726
 
 
1727
static void _rtl92c_phy_set_rfpath_switch(struct ieee80211_hw *hw,
 
1728
                                          bool bmain, bool is2t)
 
1729
{
 
1730
        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
 
1731
 
 
1732
        if (is_hal_stop(rtlhal)) {
 
1733
                rtl_set_bbreg(hw, REG_LEDCFG0, BIT(23), 0x01);
 
1734
                rtl_set_bbreg(hw, rFPGA0_XAB_RFPARAMETER, BIT(13), 0x01);
 
1735
        }
 
1736
        if (is2t) {
 
1737
                if (bmain)
 
1738
                        rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
 
1739
                                      BIT(5) | BIT(6), 0x1);
 
1740
                else
 
1741
                        rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
 
1742
                                      BIT(5) | BIT(6), 0x2);
 
1743
        } else {
 
1744
                if (bmain)
 
1745
                        rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, 0x300, 0x2);
 
1746
                else
 
1747
                        rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, 0x300, 0x1);
 
1748
 
 
1749
        }
 
1750
 
 
1751
}
 
1752
 
 
1753
#undef IQK_ADDA_REG_NUM
 
1754
#undef IQK_DELAY_TIME
 
1755
 
 
1756
void rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery)
 
1757
{
 
1758
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
1759
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 
1760
        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
 
1761
 
 
1762
        long result[4][8];
 
1763
        u8 i, final_candidate;
 
1764
        bool patha_ok, pathb_ok;
 
1765
        long reg_e94, reg_e9c, reg_ea4, reg_eb4, reg_ebc, reg_ec4, reg_tmp = 0;
 
1766
        bool is12simular, is13simular, is23simular;
 
1767
        bool start_conttx = false, singletone = false;
 
1768
        u32 iqk_bb_reg[10] = {
 
1769
                ROFDM0_XARXIQIMBALANCE,
 
1770
                ROFDM0_XBRXIQIMBALANCE,
 
1771
                ROFDM0_ECCATHRESHOLD,
 
1772
                ROFDM0_AGCRSSITABLE,
 
1773
                ROFDM0_XATXIQIMBALANCE,
 
1774
                ROFDM0_XBTXIQIMBALANCE,
 
1775
                ROFDM0_XCTXIQIMBALANCE,
 
1776
                ROFDM0_XCTXAFE,
 
1777
                ROFDM0_XDTXAFE,
 
1778
                ROFDM0_RXIQEXTANTA
 
1779
        };
 
1780
 
 
1781
        if (recovery) {
 
1782
                _rtl92c_phy_reload_adda_registers(hw,
 
1783
                                                  iqk_bb_reg,
 
1784
                                                  rtlphy->iqk_bb_backup, 10);
 
1785
                return;
 
1786
        }
 
1787
        if (start_conttx || singletone)
 
1788
                return;
 
1789
        for (i = 0; i < 8; i++) {
 
1790
                result[0][i] = 0;
 
1791
                result[1][i] = 0;
 
1792
                result[2][i] = 0;
 
1793
                result[3][i] = 0;
 
1794
        }
 
1795
        final_candidate = 0xff;
 
1796
        patha_ok = false;
 
1797
        pathb_ok = false;
 
1798
        is12simular = false;
 
1799
        is23simular = false;
 
1800
        is13simular = false;
 
1801
        for (i = 0; i < 3; i++) {
 
1802
                if (IS_92C_SERIAL(rtlhal->version))
 
1803
                        _rtl92c_phy_iq_calibrate(hw, result, i, true);
 
1804
                else
 
1805
                        _rtl92c_phy_iq_calibrate(hw, result, i, false);
 
1806
                if (i == 1) {
 
1807
                        is12simular = _rtl92c_phy_simularity_compare(hw,
 
1808
                                                                     result, 0,
 
1809
                                                                     1);
 
1810
                        if (is12simular) {
 
1811
                                final_candidate = 0;
 
1812
                                break;
 
1813
                        }
 
1814
                }
 
1815
                if (i == 2) {
 
1816
                        is13simular = _rtl92c_phy_simularity_compare(hw,
 
1817
                                                                     result, 0,
 
1818
                                                                     2);
 
1819
                        if (is13simular) {
 
1820
                                final_candidate = 0;
 
1821
                                break;
 
1822
                        }
 
1823
                        is23simular = _rtl92c_phy_simularity_compare(hw,
 
1824
                                                                     result, 1,
 
1825
                                                                     2);
 
1826
                        if (is23simular)
 
1827
                                final_candidate = 1;
 
1828
                        else {
 
1829
                                for (i = 0; i < 8; i++)
 
1830
                                        reg_tmp += result[3][i];
 
1831
 
 
1832
                                if (reg_tmp != 0)
 
1833
                                        final_candidate = 3;
 
1834
                                else
 
1835
                                        final_candidate = 0xFF;
 
1836
                        }
 
1837
                }
 
1838
        }
 
1839
        for (i = 0; i < 4; i++) {
 
1840
                reg_e94 = result[i][0];
 
1841
                reg_e9c = result[i][1];
 
1842
                reg_ea4 = result[i][2];
 
1843
                reg_eb4 = result[i][4];
 
1844
                reg_ebc = result[i][5];
 
1845
                reg_ec4 = result[i][6];
 
1846
        }
 
1847
        if (final_candidate != 0xff) {
 
1848
                rtlphy->reg_e94 = reg_e94 = result[final_candidate][0];
 
1849
                rtlphy->reg_e9c = reg_e9c = result[final_candidate][1];
 
1850
                reg_ea4 = result[final_candidate][2];
 
1851
                rtlphy->reg_eb4 = reg_eb4 = result[final_candidate][4];
 
1852
                rtlphy->reg_ebc = reg_ebc = result[final_candidate][5];
 
1853
                reg_ec4 = result[final_candidate][6];
 
1854
                patha_ok = pathb_ok = true;
 
1855
        } else {
 
1856
                rtlphy->reg_e94 = rtlphy->reg_eb4 = 0x100;
 
1857
                rtlphy->reg_e9c = rtlphy->reg_ebc = 0x0;
 
1858
        }
 
1859
        if (reg_e94 != 0) /*&&(reg_ea4 != 0) */
 
1860
                _rtl92c_phy_path_a_fill_iqk_matrix(hw, patha_ok, result,
 
1861
                                                   final_candidate,
 
1862
                                                   (reg_ea4 == 0));
 
1863
        if (IS_92C_SERIAL(rtlhal->version)) {
 
1864
                if (reg_eb4 != 0) /*&&(reg_ec4 != 0) */
 
1865
                        _rtl92c_phy_path_b_fill_iqk_matrix(hw, pathb_ok,
 
1866
                                                           result,
 
1867
                                                           final_candidate,
 
1868
                                                           (reg_ec4 == 0));
 
1869
        }
 
1870
        _rtl92c_phy_save_adda_registers(hw, iqk_bb_reg,
 
1871
                                        rtlphy->iqk_bb_backup, 10);
 
1872
}
 
1873
EXPORT_SYMBOL(rtl92c_phy_iq_calibrate);
 
1874
 
 
1875
void rtl92c_phy_lc_calibrate(struct ieee80211_hw *hw)
 
1876
{
 
1877
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
1878
        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
 
1879
        bool start_conttx = false, singletone = false;
 
1880
 
 
1881
        if (start_conttx || singletone)
 
1882
                return;
 
1883
        if (IS_92C_SERIAL(rtlhal->version))
 
1884
                rtlpriv->cfg->ops->phy_lc_calibrate(hw, true);
 
1885
        else
 
1886
                rtlpriv->cfg->ops->phy_lc_calibrate(hw, false);
 
1887
}
 
1888
EXPORT_SYMBOL(rtl92c_phy_lc_calibrate);
 
1889
 
 
1890
void rtl92c_phy_ap_calibrate(struct ieee80211_hw *hw, char delta)
 
1891
{
 
1892
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
1893
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 
1894
        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
 
1895
 
 
1896
        if (rtlphy->apk_done)
 
1897
                return;
 
1898
        if (IS_92C_SERIAL(rtlhal->version))
 
1899
                _rtl92c_phy_ap_calibrate(hw, delta, true);
 
1900
        else
 
1901
                _rtl92c_phy_ap_calibrate(hw, delta, false);
 
1902
}
 
1903
EXPORT_SYMBOL(rtl92c_phy_ap_calibrate);
 
1904
 
 
1905
void rtl92c_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain)
 
1906
{
 
1907
        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
 
1908
 
 
1909
        if (IS_92C_SERIAL(rtlhal->version))
 
1910
                _rtl92c_phy_set_rfpath_switch(hw, bmain, true);
 
1911
        else
 
1912
                _rtl92c_phy_set_rfpath_switch(hw, bmain, false);
 
1913
}
 
1914
EXPORT_SYMBOL(rtl92c_phy_set_rfpath_switch);
 
1915
 
 
1916
bool rtl92c_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
 
1917
{
 
1918
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
1919
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 
1920
        bool postprocessing = false;
 
1921
 
 
1922
        RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
 
1923
                 ("-->IO Cmd(%#x), set_io_inprogress(%d)\n",
 
1924
                  iotype, rtlphy->set_io_inprogress));
 
1925
        do {
 
1926
                switch (iotype) {
 
1927
                case IO_CMD_RESUME_DM_BY_SCAN:
 
1928
                        RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
 
1929
                                 ("[IO CMD] Resume DM after scan.\n"));
 
1930
                        postprocessing = true;
 
1931
                        break;
 
1932
                case IO_CMD_PAUSE_DM_BY_SCAN:
 
1933
                        RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
 
1934
                                 ("[IO CMD] Pause DM before scan.\n"));
 
1935
                        postprocessing = true;
 
1936
                        break;
 
1937
                default:
 
1938
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
 
1939
                                 ("switch case not process\n"));
 
1940
                        break;
 
1941
                }
 
1942
        } while (false);
 
1943
        if (postprocessing && !rtlphy->set_io_inprogress) {
 
1944
                rtlphy->set_io_inprogress = true;
 
1945
                rtlphy->current_io_type = iotype;
 
1946
        } else {
 
1947
                return false;
 
1948
        }
 
1949
        rtl92c_phy_set_io(hw);
 
1950
        RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, ("<--IO Type(%#x)\n", iotype));
 
1951
        return true;
 
1952
}
 
1953
EXPORT_SYMBOL(rtl92c_phy_set_io_cmd);
 
1954
 
 
1955
void rtl92c_phy_set_io(struct ieee80211_hw *hw)
 
1956
{
 
1957
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
1958
        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 
1959
 
 
1960
        RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
 
1961
                 ("--->Cmd(%#x), set_io_inprogress(%d)\n",
 
1962
                  rtlphy->current_io_type, rtlphy->set_io_inprogress));
 
1963
        switch (rtlphy->current_io_type) {
 
1964
        case IO_CMD_RESUME_DM_BY_SCAN:
 
1965
                dm_digtable.cur_igvalue = rtlphy->initgain_backup.xaagccore1;
 
1966
                rtl92c_dm_write_dig(hw);
 
1967
                rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel);
 
1968
                break;
 
1969
        case IO_CMD_PAUSE_DM_BY_SCAN:
 
1970
                rtlphy->initgain_backup.xaagccore1 = dm_digtable.cur_igvalue;
 
1971
                dm_digtable.cur_igvalue = 0x17;
 
1972
                rtl92c_dm_write_dig(hw);
 
1973
                break;
 
1974
        default:
 
1975
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
 
1976
                         ("switch case not process\n"));
 
1977
                break;
 
1978
        }
 
1979
        rtlphy->set_io_inprogress = false;
 
1980
        RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
 
1981
                 ("<---(%#x)\n", rtlphy->current_io_type));
 
1982
}
 
1983
EXPORT_SYMBOL(rtl92c_phy_set_io);
 
1984
 
 
1985
void rtl92ce_phy_set_rf_on(struct ieee80211_hw *hw)
 
1986
{
 
1987
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
1988
 
 
1989
        rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b);
 
1990
        rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
 
1991
        rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);
 
1992
        rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
 
1993
        rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
 
1994
        rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
 
1995
}
 
1996
EXPORT_SYMBOL(rtl92ce_phy_set_rf_on);
 
1997
 
 
1998
void _rtl92c_phy_set_rf_sleep(struct ieee80211_hw *hw)
 
1999
{
 
2000
        u32 u4b_tmp;
 
2001
        u8 delay = 5;
 
2002
        struct rtl_priv *rtlpriv = rtl_priv(hw);
 
2003
 
 
2004
        rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
 
2005
        rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
 
2006
        rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40);
 
2007
        u4b_tmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK);
 
2008
        while (u4b_tmp != 0 && delay > 0) {
 
2009
                rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x0);
 
2010
                rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
 
2011
                rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40);
 
2012
                u4b_tmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK);
 
2013
                delay--;
 
2014
        }
 
2015
        if (delay == 0) {
 
2016
                rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);
 
2017
                rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
 
2018
                rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
 
2019
                rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
 
2020
                RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
 
2021
                         ("Switch RF timeout !!!.\n"));
 
2022
                return;
 
2023
        }
 
2024
        rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
 
2025
        rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22);
 
2026
}
 
2027
EXPORT_SYMBOL(_rtl92c_phy_set_rf_sleep);