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