1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#include <linux/bitops.h>
17#include "rtl_core.h"
18#include "r8192E_hw.h"
19#include "r8192E_phyreg.h"
20#include "r8190P_rtl8256.h"
21#include "r8192E_phy.h"
22#include "rtl_dm.h"
23
24#include "r8192E_hwimg.h"
25
26static u32 RF_CHANNEL_TABLE_ZEBRA[] = {
27 0,
28 0x085c,
29 0x08dc,
30 0x095c,
31 0x09dc,
32 0x0a5c,
33 0x0adc,
34 0x0b5c,
35 0x0bdc,
36 0x0c5c,
37 0x0cdc,
38 0x0d5c,
39 0x0ddc,
40 0x0e5c,
41 0x0f72,
42};
43
44
45
46static u32 _rtl92e_phy_rf_fw_read(struct net_device *dev,
47 enum rf90_radio_path eRFPath, u32 Offset);
48static void _rtl92e_phy_rf_fw_write(struct net_device *dev,
49 enum rf90_radio_path eRFPath, u32 Offset,
50 u32 Data);
51
52static u32 _rtl92e_calculate_bit_shift(u32 dwBitMask)
53{
54 if (!dwBitMask)
55 return 32;
56 return ffs(dwBitMask) - 1;
57}
58
59u8 rtl92e_is_legal_rf_path(struct net_device *dev, u32 eRFPath)
60{
61 u8 ret = 1;
62 struct r8192_priv *priv = rtllib_priv(dev);
63
64 if (priv->rf_type == RF_2T4R)
65 ret = 0;
66 else if (priv->rf_type == RF_1T2R) {
67 if (eRFPath == RF90_PATH_A || eRFPath == RF90_PATH_B)
68 ret = 1;
69 else if (eRFPath == RF90_PATH_C || eRFPath == RF90_PATH_D)
70 ret = 0;
71 }
72 return ret;
73}
74
75void rtl92e_set_bb_reg(struct net_device *dev, u32 dwRegAddr, u32 dwBitMask,
76 u32 dwData)
77{
78
79 u32 OriginalValue, BitShift, NewValue;
80
81 if (dwBitMask != bMaskDWord) {
82 OriginalValue = rtl92e_readl(dev, dwRegAddr);
83 BitShift = _rtl92e_calculate_bit_shift(dwBitMask);
84 NewValue = (((OriginalValue) & (~dwBitMask)) |
85 (dwData << BitShift));
86 rtl92e_writel(dev, dwRegAddr, NewValue);
87 } else
88 rtl92e_writel(dev, dwRegAddr, dwData);
89}
90
91u32 rtl92e_get_bb_reg(struct net_device *dev, u32 dwRegAddr, u32 dwBitMask)
92{
93 u32 OriginalValue, BitShift;
94
95 OriginalValue = rtl92e_readl(dev, dwRegAddr);
96 BitShift = _rtl92e_calculate_bit_shift(dwBitMask);
97
98 return (OriginalValue & dwBitMask) >> BitShift;
99}
100
101static u32 _rtl92e_phy_rf_read(struct net_device *dev,
102 enum rf90_radio_path eRFPath, u32 Offset)
103{
104 struct r8192_priv *priv = rtllib_priv(dev);
105 u32 ret = 0;
106 u32 NewOffset = 0;
107 struct bb_reg_definition *pPhyReg = &priv->PHYRegDef[eRFPath];
108
109 Offset &= 0x3f;
110
111 if (priv->rf_chip == RF_8256) {
112 rtl92e_set_bb_reg(dev, rFPGA0_AnalogParameter4, 0xf00, 0x0);
113 if (Offset >= 31) {
114 priv->RfReg0Value[eRFPath] |= 0x140;
115 rtl92e_set_bb_reg(dev, pPhyReg->rf3wireOffset,
116 bMaskDWord,
117 (priv->RfReg0Value[eRFPath]<<16));
118 NewOffset = Offset - 30;
119 } else if (Offset >= 16) {
120 priv->RfReg0Value[eRFPath] |= 0x100;
121 priv->RfReg0Value[eRFPath] &= (~0x40);
122 rtl92e_set_bb_reg(dev, pPhyReg->rf3wireOffset,
123 bMaskDWord,
124 (priv->RfReg0Value[eRFPath]<<16));
125
126 NewOffset = Offset - 15;
127 } else
128 NewOffset = Offset;
129 } else {
130 RT_TRACE((COMP_PHY|COMP_ERR),
131 "check RF type here, need to be 8256\n");
132 NewOffset = Offset;
133 }
134 rtl92e_set_bb_reg(dev, pPhyReg->rfHSSIPara2, bLSSIReadAddress,
135 NewOffset);
136 rtl92e_set_bb_reg(dev, pPhyReg->rfHSSIPara2, bLSSIReadEdge, 0x0);
137 rtl92e_set_bb_reg(dev, pPhyReg->rfHSSIPara2, bLSSIReadEdge, 0x1);
138
139 mdelay(1);
140
141 ret = rtl92e_get_bb_reg(dev, pPhyReg->rfLSSIReadBack,
142 bLSSIReadBackData);
143
144 if (priv->rf_chip == RF_8256) {
145 priv->RfReg0Value[eRFPath] &= 0xebf;
146
147 rtl92e_set_bb_reg(dev, pPhyReg->rf3wireOffset, bMaskDWord,
148 (priv->RfReg0Value[eRFPath] << 16));
149
150 rtl92e_set_bb_reg(dev, rFPGA0_AnalogParameter4, 0x300, 0x3);
151 }
152
153
154 return ret;
155
156}
157
158static void _rtl92e_phy_rf_write(struct net_device *dev,
159 enum rf90_radio_path eRFPath, u32 Offset,
160 u32 Data)
161{
162 struct r8192_priv *priv = rtllib_priv(dev);
163 u32 DataAndAddr = 0, NewOffset = 0;
164 struct bb_reg_definition *pPhyReg = &priv->PHYRegDef[eRFPath];
165
166 Offset &= 0x3f;
167 if (priv->rf_chip == RF_8256) {
168 rtl92e_set_bb_reg(dev, rFPGA0_AnalogParameter4, 0xf00, 0x0);
169
170 if (Offset >= 31) {
171 priv->RfReg0Value[eRFPath] |= 0x140;
172 rtl92e_set_bb_reg(dev, pPhyReg->rf3wireOffset,
173 bMaskDWord,
174 (priv->RfReg0Value[eRFPath] << 16));
175 NewOffset = Offset - 30;
176 } else if (Offset >= 16) {
177 priv->RfReg0Value[eRFPath] |= 0x100;
178 priv->RfReg0Value[eRFPath] &= (~0x40);
179 rtl92e_set_bb_reg(dev, pPhyReg->rf3wireOffset,
180 bMaskDWord,
181 (priv->RfReg0Value[eRFPath] << 16));
182 NewOffset = Offset - 15;
183 } else
184 NewOffset = Offset;
185 } else {
186 RT_TRACE((COMP_PHY|COMP_ERR),
187 "check RF type here, need to be 8256\n");
188 NewOffset = Offset;
189 }
190
191 DataAndAddr = (Data<<16) | (NewOffset&0x3f);
192
193 rtl92e_set_bb_reg(dev, pPhyReg->rf3wireOffset, bMaskDWord, DataAndAddr);
194
195 if (Offset == 0x0)
196 priv->RfReg0Value[eRFPath] = Data;
197
198 if (priv->rf_chip == RF_8256) {
199 if (Offset != 0) {
200 priv->RfReg0Value[eRFPath] &= 0xebf;
201 rtl92e_set_bb_reg(dev, pPhyReg->rf3wireOffset,
202 bMaskDWord,
203 (priv->RfReg0Value[eRFPath] << 16));
204 }
205 rtl92e_set_bb_reg(dev, rFPGA0_AnalogParameter4, 0x300, 0x3);
206 }
207}
208
209void rtl92e_set_rf_reg(struct net_device *dev, enum rf90_radio_path eRFPath,
210 u32 RegAddr, u32 BitMask, u32 Data)
211{
212 struct r8192_priv *priv = rtllib_priv(dev);
213 u32 Original_Value, BitShift, New_Value;
214
215 if (!rtl92e_is_legal_rf_path(dev, eRFPath))
216 return;
217 if (priv->rtllib->eRFPowerState != eRfOn && !priv->being_init_adapter)
218 return;
219
220 RT_TRACE(COMP_PHY, "FW RF CTRL is not ready now\n");
221 if (priv->Rf_Mode == RF_OP_By_FW) {
222 if (BitMask != bMask12Bits) {
223 Original_Value = _rtl92e_phy_rf_fw_read(dev, eRFPath,
224 RegAddr);
225 BitShift = _rtl92e_calculate_bit_shift(BitMask);
226 New_Value = (((Original_Value) & (~BitMask)) |
227 (Data << BitShift));
228
229 _rtl92e_phy_rf_fw_write(dev, eRFPath, RegAddr,
230 New_Value);
231 } else
232 _rtl92e_phy_rf_fw_write(dev, eRFPath, RegAddr, Data);
233 udelay(200);
234
235 } else {
236 if (BitMask != bMask12Bits) {
237 Original_Value = _rtl92e_phy_rf_read(dev, eRFPath,
238 RegAddr);
239 BitShift = _rtl92e_calculate_bit_shift(BitMask);
240 New_Value = (((Original_Value) & (~BitMask)) |
241 (Data << BitShift));
242
243 _rtl92e_phy_rf_write(dev, eRFPath, RegAddr, New_Value);
244 } else
245 _rtl92e_phy_rf_write(dev, eRFPath, RegAddr, Data);
246 }
247}
248
249u32 rtl92e_get_rf_reg(struct net_device *dev, enum rf90_radio_path eRFPath,
250 u32 RegAddr, u32 BitMask)
251{
252 u32 Original_Value, Readback_Value, BitShift;
253 struct r8192_priv *priv = rtllib_priv(dev);
254
255 if (!rtl92e_is_legal_rf_path(dev, eRFPath))
256 return 0;
257 if (priv->rtllib->eRFPowerState != eRfOn && !priv->being_init_adapter)
258 return 0;
259 mutex_lock(&priv->rf_mutex);
260 if (priv->Rf_Mode == RF_OP_By_FW) {
261 Original_Value = _rtl92e_phy_rf_fw_read(dev, eRFPath, RegAddr);
262 udelay(200);
263 } else {
264 Original_Value = _rtl92e_phy_rf_read(dev, eRFPath, RegAddr);
265 }
266 BitShift = _rtl92e_calculate_bit_shift(BitMask);
267 Readback_Value = (Original_Value & BitMask) >> BitShift;
268 mutex_unlock(&priv->rf_mutex);
269 return Readback_Value;
270}
271
272static u32 _rtl92e_phy_rf_fw_read(struct net_device *dev,
273 enum rf90_radio_path eRFPath, u32 Offset)
274{
275 u32 Data = 0;
276 u8 time = 0;
277
278 Data |= ((Offset & 0xFF) << 12);
279 Data |= ((eRFPath & 0x3) << 20);
280 Data |= 0x80000000;
281 while (rtl92e_readl(dev, QPNR) & 0x80000000) {
282 if (time++ < 100)
283 udelay(10);
284 else
285 break;
286 }
287 rtl92e_writel(dev, QPNR, Data);
288 while (rtl92e_readl(dev, QPNR) & 0x80000000) {
289 if (time++ < 100)
290 udelay(10);
291 else
292 return 0;
293 }
294 return rtl92e_readl(dev, RF_DATA);
295
296}
297
298static void _rtl92e_phy_rf_fw_write(struct net_device *dev,
299 enum rf90_radio_path eRFPath, u32 Offset,
300 u32 Data)
301{
302 u8 time = 0;
303
304 Data |= ((Offset & 0xFF) << 12);
305 Data |= ((eRFPath & 0x3) << 20);
306 Data |= 0x400000;
307 Data |= 0x80000000;
308
309 while (rtl92e_readl(dev, QPNR) & 0x80000000) {
310 if (time++ < 100)
311 udelay(10);
312 else
313 break;
314 }
315 rtl92e_writel(dev, QPNR, Data);
316
317}
318
319
320void rtl92e_config_mac(struct net_device *dev)
321{
322 u32 dwArrayLen = 0, i = 0;
323 u32 *pdwArray = NULL;
324 struct r8192_priv *priv = rtllib_priv(dev);
325
326 if (priv->bTXPowerDataReadFromEEPORM) {
327 RT_TRACE(COMP_PHY, "Rtl819XMACPHY_Array_PG\n");
328 dwArrayLen = MACPHY_Array_PGLength;
329 pdwArray = Rtl819XMACPHY_Array_PG;
330
331 } else {
332 RT_TRACE(COMP_PHY, "Read rtl819XMACPHY_Array\n");
333 dwArrayLen = MACPHY_ArrayLength;
334 pdwArray = Rtl819XMACPHY_Array;
335 }
336 for (i = 0; i < dwArrayLen; i += 3) {
337 RT_TRACE(COMP_DBG,
338 "The Rtl8190MACPHY_Array[0] is %x Rtl8190MACPHY_Array[1] is %x Rtl8190MACPHY_Array[2] is %x\n",
339 pdwArray[i], pdwArray[i+1], pdwArray[i+2]);
340 if (pdwArray[i] == 0x318)
341 pdwArray[i+2] = 0x00000800;
342 rtl92e_set_bb_reg(dev, pdwArray[i], pdwArray[i+1],
343 pdwArray[i+2]);
344 }
345 return;
346
347}
348
349static void _rtl92e_phy_config_bb(struct net_device *dev, u8 ConfigType)
350{
351 int i;
352 u32 *Rtl819XPHY_REGArray_Table = NULL;
353 u32 *Rtl819XAGCTAB_Array_Table = NULL;
354 u16 AGCTAB_ArrayLen, PHY_REGArrayLen = 0;
355 struct r8192_priv *priv = rtllib_priv(dev);
356
357 AGCTAB_ArrayLen = AGCTAB_ArrayLength;
358 Rtl819XAGCTAB_Array_Table = Rtl819XAGCTAB_Array;
359 if (priv->rf_type == RF_2T4R) {
360 PHY_REGArrayLen = PHY_REGArrayLength;
361 Rtl819XPHY_REGArray_Table = Rtl819XPHY_REGArray;
362 } else if (priv->rf_type == RF_1T2R) {
363 PHY_REGArrayLen = PHY_REG_1T2RArrayLength;
364 Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_1T2RArray;
365 }
366
367 if (ConfigType == BaseBand_Config_PHY_REG) {
368 for (i = 0; i < PHY_REGArrayLen; i += 2) {
369 rtl92e_set_bb_reg(dev, Rtl819XPHY_REGArray_Table[i],
370 bMaskDWord,
371 Rtl819XPHY_REGArray_Table[i+1]);
372 RT_TRACE(COMP_DBG,
373 "i: %x, The Rtl819xUsbPHY_REGArray[0] is %x Rtl819xUsbPHY_REGArray[1] is %x\n",
374 i, Rtl819XPHY_REGArray_Table[i],
375 Rtl819XPHY_REGArray_Table[i+1]);
376 }
377 } else if (ConfigType == BaseBand_Config_AGC_TAB) {
378 for (i = 0; i < AGCTAB_ArrayLen; i += 2) {
379 rtl92e_set_bb_reg(dev, Rtl819XAGCTAB_Array_Table[i],
380 bMaskDWord,
381 Rtl819XAGCTAB_Array_Table[i+1]);
382 RT_TRACE(COMP_DBG,
383 "i:%x, The rtl819XAGCTAB_Array[0] is %x rtl819XAGCTAB_Array[1] is %x\n",
384 i, Rtl819XAGCTAB_Array_Table[i],
385 Rtl819XAGCTAB_Array_Table[i+1]);
386 }
387 }
388}
389
390static void _rtl92e_init_bb_rf_reg_def(struct net_device *dev)
391{
392 struct r8192_priv *priv = rtllib_priv(dev);
393
394 priv->PHYRegDef[RF90_PATH_A].rfintfs = rFPGA0_XAB_RFInterfaceSW;
395 priv->PHYRegDef[RF90_PATH_B].rfintfs = rFPGA0_XAB_RFInterfaceSW;
396 priv->PHYRegDef[RF90_PATH_C].rfintfs = rFPGA0_XCD_RFInterfaceSW;
397 priv->PHYRegDef[RF90_PATH_D].rfintfs = rFPGA0_XCD_RFInterfaceSW;
398
399 priv->PHYRegDef[RF90_PATH_A].rfintfi = rFPGA0_XAB_RFInterfaceRB;
400 priv->PHYRegDef[RF90_PATH_B].rfintfi = rFPGA0_XAB_RFInterfaceRB;
401 priv->PHYRegDef[RF90_PATH_C].rfintfi = rFPGA0_XCD_RFInterfaceRB;
402 priv->PHYRegDef[RF90_PATH_D].rfintfi = rFPGA0_XCD_RFInterfaceRB;
403
404 priv->PHYRegDef[RF90_PATH_A].rfintfo = rFPGA0_XA_RFInterfaceOE;
405 priv->PHYRegDef[RF90_PATH_B].rfintfo = rFPGA0_XB_RFInterfaceOE;
406 priv->PHYRegDef[RF90_PATH_C].rfintfo = rFPGA0_XC_RFInterfaceOE;
407 priv->PHYRegDef[RF90_PATH_D].rfintfo = rFPGA0_XD_RFInterfaceOE;
408
409 priv->PHYRegDef[RF90_PATH_A].rfintfe = rFPGA0_XA_RFInterfaceOE;
410 priv->PHYRegDef[RF90_PATH_B].rfintfe = rFPGA0_XB_RFInterfaceOE;
411 priv->PHYRegDef[RF90_PATH_C].rfintfe = rFPGA0_XC_RFInterfaceOE;
412 priv->PHYRegDef[RF90_PATH_D].rfintfe = rFPGA0_XD_RFInterfaceOE;
413
414 priv->PHYRegDef[RF90_PATH_A].rf3wireOffset = rFPGA0_XA_LSSIParameter;
415 priv->PHYRegDef[RF90_PATH_B].rf3wireOffset = rFPGA0_XB_LSSIParameter;
416 priv->PHYRegDef[RF90_PATH_C].rf3wireOffset = rFPGA0_XC_LSSIParameter;
417 priv->PHYRegDef[RF90_PATH_D].rf3wireOffset = rFPGA0_XD_LSSIParameter;
418
419 priv->PHYRegDef[RF90_PATH_A].rfLSSI_Select = rFPGA0_XAB_RFParameter;
420 priv->PHYRegDef[RF90_PATH_B].rfLSSI_Select = rFPGA0_XAB_RFParameter;
421 priv->PHYRegDef[RF90_PATH_C].rfLSSI_Select = rFPGA0_XCD_RFParameter;
422 priv->PHYRegDef[RF90_PATH_D].rfLSSI_Select = rFPGA0_XCD_RFParameter;
423
424 priv->PHYRegDef[RF90_PATH_A].rfTxGainStage = rFPGA0_TxGainStage;
425 priv->PHYRegDef[RF90_PATH_B].rfTxGainStage = rFPGA0_TxGainStage;
426 priv->PHYRegDef[RF90_PATH_C].rfTxGainStage = rFPGA0_TxGainStage;
427 priv->PHYRegDef[RF90_PATH_D].rfTxGainStage = rFPGA0_TxGainStage;
428
429 priv->PHYRegDef[RF90_PATH_A].rfHSSIPara1 = rFPGA0_XA_HSSIParameter1;
430 priv->PHYRegDef[RF90_PATH_B].rfHSSIPara1 = rFPGA0_XB_HSSIParameter1;
431 priv->PHYRegDef[RF90_PATH_C].rfHSSIPara1 = rFPGA0_XC_HSSIParameter1;
432 priv->PHYRegDef[RF90_PATH_D].rfHSSIPara1 = rFPGA0_XD_HSSIParameter1;
433
434 priv->PHYRegDef[RF90_PATH_A].rfHSSIPara2 = rFPGA0_XA_HSSIParameter2;
435 priv->PHYRegDef[RF90_PATH_B].rfHSSIPara2 = rFPGA0_XB_HSSIParameter2;
436 priv->PHYRegDef[RF90_PATH_C].rfHSSIPara2 = rFPGA0_XC_HSSIParameter2;
437 priv->PHYRegDef[RF90_PATH_D].rfHSSIPara2 = rFPGA0_XD_HSSIParameter2;
438
439 priv->PHYRegDef[RF90_PATH_A].rfSwitchControl = rFPGA0_XAB_SwitchControl;
440 priv->PHYRegDef[RF90_PATH_B].rfSwitchControl = rFPGA0_XAB_SwitchControl;
441 priv->PHYRegDef[RF90_PATH_C].rfSwitchControl = rFPGA0_XCD_SwitchControl;
442 priv->PHYRegDef[RF90_PATH_D].rfSwitchControl = rFPGA0_XCD_SwitchControl;
443
444 priv->PHYRegDef[RF90_PATH_A].rfAGCControl1 = rOFDM0_XAAGCCore1;
445 priv->PHYRegDef[RF90_PATH_B].rfAGCControl1 = rOFDM0_XBAGCCore1;
446 priv->PHYRegDef[RF90_PATH_C].rfAGCControl1 = rOFDM0_XCAGCCore1;
447 priv->PHYRegDef[RF90_PATH_D].rfAGCControl1 = rOFDM0_XDAGCCore1;
448
449 priv->PHYRegDef[RF90_PATH_A].rfAGCControl2 = rOFDM0_XAAGCCore2;
450 priv->PHYRegDef[RF90_PATH_B].rfAGCControl2 = rOFDM0_XBAGCCore2;
451 priv->PHYRegDef[RF90_PATH_C].rfAGCControl2 = rOFDM0_XCAGCCore2;
452 priv->PHYRegDef[RF90_PATH_D].rfAGCControl2 = rOFDM0_XDAGCCore2;
453
454 priv->PHYRegDef[RF90_PATH_A].rfRxIQImbalance = rOFDM0_XARxIQImbalance;
455 priv->PHYRegDef[RF90_PATH_B].rfRxIQImbalance = rOFDM0_XBRxIQImbalance;
456 priv->PHYRegDef[RF90_PATH_C].rfRxIQImbalance = rOFDM0_XCRxIQImbalance;
457 priv->PHYRegDef[RF90_PATH_D].rfRxIQImbalance = rOFDM0_XDRxIQImbalance;
458
459 priv->PHYRegDef[RF90_PATH_A].rfRxAFE = rOFDM0_XARxAFE;
460 priv->PHYRegDef[RF90_PATH_B].rfRxAFE = rOFDM0_XBRxAFE;
461 priv->PHYRegDef[RF90_PATH_C].rfRxAFE = rOFDM0_XCRxAFE;
462 priv->PHYRegDef[RF90_PATH_D].rfRxAFE = rOFDM0_XDRxAFE;
463
464 priv->PHYRegDef[RF90_PATH_A].rfTxIQImbalance = rOFDM0_XATxIQImbalance;
465 priv->PHYRegDef[RF90_PATH_B].rfTxIQImbalance = rOFDM0_XBTxIQImbalance;
466 priv->PHYRegDef[RF90_PATH_C].rfTxIQImbalance = rOFDM0_XCTxIQImbalance;
467 priv->PHYRegDef[RF90_PATH_D].rfTxIQImbalance = rOFDM0_XDTxIQImbalance;
468
469 priv->PHYRegDef[RF90_PATH_A].rfTxAFE = rOFDM0_XATxAFE;
470 priv->PHYRegDef[RF90_PATH_B].rfTxAFE = rOFDM0_XBTxAFE;
471 priv->PHYRegDef[RF90_PATH_C].rfTxAFE = rOFDM0_XCTxAFE;
472 priv->PHYRegDef[RF90_PATH_D].rfTxAFE = rOFDM0_XDTxAFE;
473
474 priv->PHYRegDef[RF90_PATH_A].rfLSSIReadBack = rFPGA0_XA_LSSIReadBack;
475 priv->PHYRegDef[RF90_PATH_B].rfLSSIReadBack = rFPGA0_XB_LSSIReadBack;
476 priv->PHYRegDef[RF90_PATH_C].rfLSSIReadBack = rFPGA0_XC_LSSIReadBack;
477 priv->PHYRegDef[RF90_PATH_D].rfLSSIReadBack = rFPGA0_XD_LSSIReadBack;
478
479}
480
481bool rtl92e_check_bb_and_rf(struct net_device *dev, enum hw90_block CheckBlock,
482 enum rf90_radio_path eRFPath)
483{
484 bool ret = true;
485 u32 i, CheckTimes = 4, dwRegRead = 0;
486 u32 WriteAddr[4];
487 u32 WriteData[] = {0xfffff027, 0xaa55a02f, 0x00000027, 0x55aa502f};
488
489 WriteAddr[HW90_BLOCK_MAC] = 0x100;
490 WriteAddr[HW90_BLOCK_PHY0] = 0x900;
491 WriteAddr[HW90_BLOCK_PHY1] = 0x800;
492 WriteAddr[HW90_BLOCK_RF] = 0x3;
493 RT_TRACE(COMP_PHY, "=======>%s(), CheckBlock:%d\n", __func__,
494 CheckBlock);
495
496 if (CheckBlock == HW90_BLOCK_MAC) {
497 netdev_warn(dev, "%s(): No checks available for MAC block.\n",
498 __func__);
499 return ret;
500 }
501
502 for (i = 0; i < CheckTimes; i++) {
503 switch (CheckBlock) {
504 case HW90_BLOCK_PHY0:
505 case HW90_BLOCK_PHY1:
506 rtl92e_writel(dev, WriteAddr[CheckBlock],
507 WriteData[i]);
508 dwRegRead = rtl92e_readl(dev, WriteAddr[CheckBlock]);
509 break;
510
511 case HW90_BLOCK_RF:
512 WriteData[i] &= 0xfff;
513 rtl92e_set_rf_reg(dev, eRFPath,
514 WriteAddr[HW90_BLOCK_RF],
515 bMask12Bits, WriteData[i]);
516 mdelay(10);
517 dwRegRead = rtl92e_get_rf_reg(dev, eRFPath,
518 WriteAddr[HW90_BLOCK_RF],
519 bMaskDWord);
520 mdelay(10);
521 break;
522
523 default:
524 ret = false;
525 break;
526 }
527
528
529 if (dwRegRead != WriteData[i]) {
530 netdev_warn(dev, "%s(): Check failed.\n", __func__);
531 ret = false;
532 break;
533 }
534 }
535
536 return ret;
537}
538
539static bool _rtl92e_bb_config_para_file(struct net_device *dev)
540{
541 struct r8192_priv *priv = rtllib_priv(dev);
542 bool rtStatus = true;
543 u8 bRegValue = 0, eCheckItem = 0;
544 u32 dwRegValue = 0;
545
546 bRegValue = rtl92e_readb(dev, BB_GLOBAL_RESET);
547 rtl92e_writeb(dev, BB_GLOBAL_RESET, (bRegValue|BB_GLOBAL_RESET_BIT));
548
549 dwRegValue = rtl92e_readl(dev, CPU_GEN);
550 rtl92e_writel(dev, CPU_GEN, (dwRegValue&(~CPU_GEN_BB_RST)));
551
552 for (eCheckItem = (enum hw90_block)HW90_BLOCK_PHY0;
553 eCheckItem <= HW90_BLOCK_PHY1; eCheckItem++) {
554 rtStatus = rtl92e_check_bb_and_rf(dev,
555 (enum hw90_block)eCheckItem,
556 (enum rf90_radio_path)0);
557 if (!rtStatus) {
558 RT_TRACE((COMP_ERR | COMP_PHY),
559 "rtl92e_config_rf():Check PHY%d Fail!!\n",
560 eCheckItem-1);
561 return rtStatus;
562 }
563 }
564 rtl92e_set_bb_reg(dev, rFPGA0_RFMOD, bCCKEn|bOFDMEn, 0x0);
565 _rtl92e_phy_config_bb(dev, BaseBand_Config_PHY_REG);
566
567 dwRegValue = rtl92e_readl(dev, CPU_GEN);
568 rtl92e_writel(dev, CPU_GEN, (dwRegValue|CPU_GEN_BB_RST));
569
570 _rtl92e_phy_config_bb(dev, BaseBand_Config_AGC_TAB);
571
572 if (priv->IC_Cut > VERSION_8190_BD) {
573 if (priv->rf_type == RF_2T4R)
574 dwRegValue = (priv->AntennaTxPwDiff[2]<<8 |
575 priv->AntennaTxPwDiff[1]<<4 |
576 priv->AntennaTxPwDiff[0]);
577 else
578 dwRegValue = 0x0;
579 rtl92e_set_bb_reg(dev, rFPGA0_TxGainStage,
580 (bXBTxAGC|bXCTxAGC|bXDTxAGC), dwRegValue);
581
582
583 dwRegValue = priv->CrystalCap;
584 rtl92e_set_bb_reg(dev, rFPGA0_AnalogParameter1, bXtalCap92x,
585 dwRegValue);
586 }
587
588 return rtStatus;
589}
590bool rtl92e_config_bb(struct net_device *dev)
591{
592 _rtl92e_init_bb_rf_reg_def(dev);
593 return _rtl92e_bb_config_para_file(dev);
594}
595
596void rtl92e_get_tx_power(struct net_device *dev)
597{
598 struct r8192_priv *priv = rtllib_priv(dev);
599
600 priv->MCSTxPowerLevelOriginalOffset[0] =
601 rtl92e_readl(dev, rTxAGC_Rate18_06);
602 priv->MCSTxPowerLevelOriginalOffset[1] =
603 rtl92e_readl(dev, rTxAGC_Rate54_24);
604 priv->MCSTxPowerLevelOriginalOffset[2] =
605 rtl92e_readl(dev, rTxAGC_Mcs03_Mcs00);
606 priv->MCSTxPowerLevelOriginalOffset[3] =
607 rtl92e_readl(dev, rTxAGC_Mcs07_Mcs04);
608 priv->MCSTxPowerLevelOriginalOffset[4] =
609 rtl92e_readl(dev, rTxAGC_Mcs11_Mcs08);
610 priv->MCSTxPowerLevelOriginalOffset[5] =
611 rtl92e_readl(dev, rTxAGC_Mcs15_Mcs12);
612
613 priv->DefaultInitialGain[0] = rtl92e_readb(dev, rOFDM0_XAAGCCore1);
614 priv->DefaultInitialGain[1] = rtl92e_readb(dev, rOFDM0_XBAGCCore1);
615 priv->DefaultInitialGain[2] = rtl92e_readb(dev, rOFDM0_XCAGCCore1);
616 priv->DefaultInitialGain[3] = rtl92e_readb(dev, rOFDM0_XDAGCCore1);
617 RT_TRACE(COMP_INIT,
618 "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x)\n",
619 priv->DefaultInitialGain[0], priv->DefaultInitialGain[1],
620 priv->DefaultInitialGain[2], priv->DefaultInitialGain[3]);
621
622 priv->framesync = rtl92e_readb(dev, rOFDM0_RxDetector3);
623 priv->framesyncC34 = rtl92e_readl(dev, rOFDM0_RxDetector2);
624 RT_TRACE(COMP_INIT, "Default framesync (0x%x) = 0x%x\n",
625 rOFDM0_RxDetector3, priv->framesync);
626 priv->SifsTime = rtl92e_readw(dev, SIFS);
627}
628
629void rtl92e_set_tx_power(struct net_device *dev, u8 channel)
630{
631 struct r8192_priv *priv = rtllib_priv(dev);
632 u8 powerlevel = 0, powerlevelOFDM24G = 0;
633 s8 ant_pwr_diff;
634 u32 u4RegValue;
635
636 if (priv->epromtype == EEPROM_93C46) {
637 powerlevel = priv->TxPowerLevelCCK[channel-1];
638 powerlevelOFDM24G = priv->TxPowerLevelOFDM24G[channel-1];
639 } else if (priv->epromtype == EEPROM_93C56) {
640 if (priv->rf_type == RF_1T2R) {
641 powerlevel = priv->TxPowerLevelCCK_C[channel-1];
642 powerlevelOFDM24G = priv->TxPowerLevelOFDM24G_C[channel-1];
643 } else if (priv->rf_type == RF_2T4R) {
644 powerlevel = priv->TxPowerLevelCCK_A[channel-1];
645 powerlevelOFDM24G = priv->TxPowerLevelOFDM24G_A[channel-1];
646
647 ant_pwr_diff = priv->TxPowerLevelOFDM24G_C[channel-1]
648 - priv->TxPowerLevelOFDM24G_A[channel-1];
649
650 priv->RF_C_TxPwDiff = ant_pwr_diff;
651
652 ant_pwr_diff &= 0xf;
653
654 priv->AntennaTxPwDiff[2] = 0;
655 priv->AntennaTxPwDiff[1] = (u8)(ant_pwr_diff);
656 priv->AntennaTxPwDiff[0] = 0;
657
658 u4RegValue = (priv->AntennaTxPwDiff[2]<<8 |
659 priv->AntennaTxPwDiff[1]<<4 |
660 priv->AntennaTxPwDiff[0]);
661
662 rtl92e_set_bb_reg(dev, rFPGA0_TxGainStage,
663 (bXBTxAGC|bXCTxAGC|bXDTxAGC),
664 u4RegValue);
665 }
666 }
667 switch (priv->rf_chip) {
668 case RF_8225:
669 break;
670 case RF_8256:
671 rtl92e_set_cck_tx_power(dev, powerlevel);
672 rtl92e_set_ofdm_tx_power(dev, powerlevelOFDM24G);
673 break;
674 case RF_8258:
675 break;
676 default:
677 netdev_err(dev, "Invalid RF Chip ID.\n");
678 break;
679 }
680}
681
682bool rtl92e_config_phy(struct net_device *dev)
683{
684 struct r8192_priv *priv = rtllib_priv(dev);
685 bool rtStatus = true;
686
687 switch (priv->rf_chip) {
688 case RF_8225:
689 break;
690 case RF_8256:
691 rtStatus = rtl92e_config_rf(dev);
692 break;
693
694 case RF_8258:
695 break;
696 case RF_PSEUDO_11N:
697 break;
698
699 default:
700 netdev_err(dev, "Invalid RF Chip ID.\n");
701 break;
702 }
703 return rtStatus;
704}
705
706u8 rtl92e_config_rf_path(struct net_device *dev, enum rf90_radio_path eRFPath)
707{
708
709 int i;
710
711 switch (eRFPath) {
712 case RF90_PATH_A:
713 for (i = 0; i < RadioA_ArrayLength; i += 2) {
714 if (Rtl819XRadioA_Array[i] == 0xfe) {
715 msleep(100);
716 continue;
717 }
718 rtl92e_set_rf_reg(dev, eRFPath, Rtl819XRadioA_Array[i],
719 bMask12Bits,
720 Rtl819XRadioA_Array[i+1]);
721
722 }
723 break;
724 case RF90_PATH_B:
725 for (i = 0; i < RadioB_ArrayLength; i += 2) {
726 if (Rtl819XRadioB_Array[i] == 0xfe) {
727 msleep(100);
728 continue;
729 }
730 rtl92e_set_rf_reg(dev, eRFPath, Rtl819XRadioB_Array[i],
731 bMask12Bits,
732 Rtl819XRadioB_Array[i+1]);
733
734 }
735 break;
736 case RF90_PATH_C:
737 for (i = 0; i < RadioC_ArrayLength; i += 2) {
738 if (Rtl819XRadioC_Array[i] == 0xfe) {
739 msleep(100);
740 continue;
741 }
742 rtl92e_set_rf_reg(dev, eRFPath, Rtl819XRadioC_Array[i],
743 bMask12Bits,
744 Rtl819XRadioC_Array[i+1]);
745
746 }
747 break;
748 case RF90_PATH_D:
749 for (i = 0; i < RadioD_ArrayLength; i += 2) {
750 if (Rtl819XRadioD_Array[i] == 0xfe) {
751 msleep(100);
752 continue;
753 }
754 rtl92e_set_rf_reg(dev, eRFPath, Rtl819XRadioD_Array[i],
755 bMask12Bits,
756 Rtl819XRadioD_Array[i+1]);
757
758 }
759 break;
760 default:
761 break;
762 }
763
764 return 0;
765
766}
767
768static void _rtl92e_set_tx_power_level(struct net_device *dev, u8 channel)
769{
770 struct r8192_priv *priv = rtllib_priv(dev);
771 u8 powerlevel = priv->TxPowerLevelCCK[channel-1];
772 u8 powerlevelOFDM24G = priv->TxPowerLevelOFDM24G[channel-1];
773
774 switch (priv->rf_chip) {
775 case RF_8225:
776 break;
777
778 case RF_8256:
779 rtl92e_set_cck_tx_power(dev, powerlevel);
780 rtl92e_set_ofdm_tx_power(dev, powerlevelOFDM24G);
781 break;
782
783 case RF_8258:
784 break;
785 default:
786 netdev_warn(dev, "%s(): Invalid RF Chip ID\n", __func__);
787 break;
788 }
789}
790
791static u8 _rtl92e_phy_set_sw_chnl_cmd_array(struct net_device *dev,
792 struct sw_chnl_cmd *CmdTable,
793 u32 CmdTableIdx, u32 CmdTableSz,
794 enum sw_chnl_cmd_id CmdID,
795 u32 Para1, u32 Para2, u32 msDelay)
796{
797 struct sw_chnl_cmd *pCmd;
798
799 if (CmdTable == NULL) {
800 netdev_err(dev, "%s(): CmdTable cannot be NULL.\n", __func__);
801 return false;
802 }
803 if (CmdTableIdx >= CmdTableSz) {
804 netdev_err(dev, "%s(): Invalid index requested.\n", __func__);
805 return false;
806 }
807
808 pCmd = CmdTable + CmdTableIdx;
809 pCmd->CmdID = CmdID;
810 pCmd->Para1 = Para1;
811 pCmd->Para2 = Para2;
812 pCmd->msDelay = msDelay;
813
814 return true;
815}
816
817static u8 _rtl92e_phy_switch_channel_step(struct net_device *dev, u8 channel,
818 u8 *stage, u8 *step, u32 *delay)
819{
820 struct r8192_priv *priv = rtllib_priv(dev);
821 struct rtllib_device *ieee = priv->rtllib;
822 u32 PreCommonCmdCnt;
823 u32 PostCommonCmdCnt;
824 u32 RfDependCmdCnt;
825 struct sw_chnl_cmd *CurrentCmd = NULL;
826 u8 eRFPath;
827
828 RT_TRACE(COMP_TRACE, "====>%s()====stage:%d, step:%d, channel:%d\n",
829 __func__, *stage, *step, channel);
830
831 if (!rtllib_legal_channel(priv->rtllib, channel)) {
832 netdev_err(dev, "Invalid channel requested: %d\n", channel);
833 return true;
834 }
835
836 {
837 PreCommonCmdCnt = 0;
838 _rtl92e_phy_set_sw_chnl_cmd_array(dev, ieee->PreCommonCmd,
839 PreCommonCmdCnt++,
840 MAX_PRECMD_CNT,
841 CmdID_SetTxPowerLevel,
842 0, 0, 0);
843 _rtl92e_phy_set_sw_chnl_cmd_array(dev, ieee->PreCommonCmd,
844 PreCommonCmdCnt++,
845 MAX_PRECMD_CNT, CmdID_End,
846 0, 0, 0);
847
848 PostCommonCmdCnt = 0;
849
850 _rtl92e_phy_set_sw_chnl_cmd_array(dev, ieee->PostCommonCmd,
851 PostCommonCmdCnt++,
852 MAX_POSTCMD_CNT, CmdID_End,
853 0, 0, 0);
854
855 RfDependCmdCnt = 0;
856 switch (priv->rf_chip) {
857 case RF_8225:
858 if (!(channel >= 1 && channel <= 14)) {
859 netdev_err(dev,
860 "Invalid channel requested for 8225: %d\n",
861 channel);
862 return false;
863 }
864 _rtl92e_phy_set_sw_chnl_cmd_array(dev,
865 ieee->RfDependCmd,
866 RfDependCmdCnt++,
867 MAX_RFDEPENDCMD_CNT,
868 CmdID_RF_WriteReg,
869 rZebra1_Channel,
870 RF_CHANNEL_TABLE_ZEBRA[channel],
871 10);
872 _rtl92e_phy_set_sw_chnl_cmd_array(dev,
873 ieee->RfDependCmd,
874 RfDependCmdCnt++,
875 MAX_RFDEPENDCMD_CNT,
876 CmdID_End, 0, 0, 0);
877 break;
878
879 case RF_8256:
880 if (!(channel >= 1 && channel <= 14)) {
881 netdev_err(dev,
882 "Invalid channel requested for 8256: %d\n",
883 channel);
884 return false;
885 }
886 _rtl92e_phy_set_sw_chnl_cmd_array(dev,
887 ieee->RfDependCmd,
888 RfDependCmdCnt++,
889 MAX_RFDEPENDCMD_CNT,
890 CmdID_RF_WriteReg,
891 rZebra1_Channel,
892 channel, 10);
893 _rtl92e_phy_set_sw_chnl_cmd_array(dev,
894 ieee->RfDependCmd,
895 RfDependCmdCnt++,
896 MAX_RFDEPENDCMD_CNT,
897 CmdID_End, 0, 0, 0);
898 break;
899
900 case RF_8258:
901 break;
902
903 default:
904 netdev_warn(dev, "Unknown RF Chip ID\n");
905 return false;
906 }
907
908
909 do {
910 switch (*stage) {
911 case 0:
912 CurrentCmd = &ieee->PreCommonCmd[*step];
913 break;
914 case 1:
915 CurrentCmd = &ieee->RfDependCmd[*step];
916 break;
917 case 2:
918 CurrentCmd = &ieee->PostCommonCmd[*step];
919 break;
920 }
921
922 if (CurrentCmd && CurrentCmd->CmdID == CmdID_End) {
923 if ((*stage) == 2)
924 return true;
925 (*stage)++;
926 (*step) = 0;
927 continue;
928 }
929
930 if (!CurrentCmd)
931 continue;
932 switch (CurrentCmd->CmdID) {
933 case CmdID_SetTxPowerLevel:
934 if (priv->IC_Cut > (u8)VERSION_8190_BD)
935 _rtl92e_set_tx_power_level(dev,
936 channel);
937 break;
938 case CmdID_WritePortUlong:
939 rtl92e_writel(dev, CurrentCmd->Para1,
940 CurrentCmd->Para2);
941 break;
942 case CmdID_WritePortUshort:
943 rtl92e_writew(dev, CurrentCmd->Para1,
944 (u16)CurrentCmd->Para2);
945 break;
946 case CmdID_WritePortUchar:
947 rtl92e_writeb(dev, CurrentCmd->Para1,
948 (u8)CurrentCmd->Para2);
949 break;
950 case CmdID_RF_WriteReg:
951 for (eRFPath = 0; eRFPath <
952 priv->NumTotalRFPath; eRFPath++)
953 rtl92e_set_rf_reg(dev,
954 (enum rf90_radio_path)eRFPath,
955 CurrentCmd->Para1, bMask12Bits,
956 CurrentCmd->Para2<<7);
957 break;
958 default:
959 break;
960 }
961
962 break;
963 } while (true);
964 }
965
966 (*delay) = CurrentCmd->msDelay;
967 (*step)++;
968 return false;
969}
970
971static void _rtl92e_phy_switch_channel(struct net_device *dev, u8 channel)
972{
973 struct r8192_priv *priv = rtllib_priv(dev);
974 u32 delay = 0;
975
976 while (!_rtl92e_phy_switch_channel_step(dev, channel,
977 &priv->SwChnlStage,
978 &priv->SwChnlStep, &delay)) {
979 if (delay > 0)
980 msleep(delay);
981 if (!priv->up)
982 break;
983 }
984}
985
986static void _rtl92e_phy_switch_channel_work_item(struct net_device *dev)
987{
988
989 struct r8192_priv *priv = rtllib_priv(dev);
990
991 RT_TRACE(COMP_TRACE, "==> SwChnlCallback819xUsbWorkItem()\n");
992
993 RT_TRACE(COMP_TRACE, "=====>--%s(), set chan:%d, priv:%p\n", __func__,
994 priv->chan, priv);
995
996 _rtl92e_phy_switch_channel(dev, priv->chan);
997
998 RT_TRACE(COMP_TRACE, "<== SwChnlCallback819xUsbWorkItem()\n");
999}
1000
1001u8 rtl92e_set_channel(struct net_device *dev, u8 channel)
1002{
1003 struct r8192_priv *priv = rtllib_priv(dev);
1004
1005 RT_TRACE(COMP_PHY, "=====>%s()\n", __func__);
1006 if (!priv->up) {
1007 netdev_err(dev, "%s(): Driver is not initialized\n", __func__);
1008 return false;
1009 }
1010 if (priv->SwChnlInProgress)
1011 return false;
1012
1013
1014 switch (priv->rtllib->mode) {
1015 case WIRELESS_MODE_A:
1016 case WIRELESS_MODE_N_5G:
1017 if (channel <= 14) {
1018 netdev_warn(dev,
1019 "Channel %d not available in 802.11a.\n",
1020 channel);
1021 return false;
1022 }
1023 break;
1024 case WIRELESS_MODE_B:
1025 if (channel > 14) {
1026 netdev_warn(dev,
1027 "Channel %d not available in 802.11b.\n",
1028 channel);
1029 return false;
1030 }
1031 break;
1032 case WIRELESS_MODE_G:
1033 case WIRELESS_MODE_N_24G:
1034 if (channel > 14) {
1035 netdev_warn(dev,
1036 "Channel %d not available in 802.11g.\n",
1037 channel);
1038 return false;
1039 }
1040 break;
1041 }
1042
1043 priv->SwChnlInProgress = true;
1044 if (channel == 0)
1045 channel = 1;
1046
1047 priv->chan = channel;
1048
1049 priv->SwChnlStage = 0;
1050 priv->SwChnlStep = 0;
1051
1052 if (priv->up)
1053 _rtl92e_phy_switch_channel_work_item(dev);
1054 priv->SwChnlInProgress = false;
1055 return true;
1056}
1057
1058static void _rtl92e_cck_tx_power_track_bw_switch_tssi(struct net_device *dev)
1059{
1060 struct r8192_priv *priv = rtllib_priv(dev);
1061
1062 switch (priv->CurrentChannelBW) {
1063 case HT_CHANNEL_WIDTH_20:
1064 priv->CCKPresentAttentuation =
1065 priv->CCKPresentAttentuation_20Mdefault +
1066 priv->CCKPresentAttentuation_difference;
1067
1068 if (priv->CCKPresentAttentuation >
1069 (CCKTxBBGainTableLength-1))
1070 priv->CCKPresentAttentuation =
1071 CCKTxBBGainTableLength-1;
1072 if (priv->CCKPresentAttentuation < 0)
1073 priv->CCKPresentAttentuation = 0;
1074
1075 RT_TRACE(COMP_POWER_TRACKING,
1076 "20M, priv->CCKPresentAttentuation = %d\n",
1077 priv->CCKPresentAttentuation);
1078
1079 if (priv->rtllib->current_network.channel == 14 &&
1080 !priv->bcck_in_ch14) {
1081 priv->bcck_in_ch14 = true;
1082 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
1083 } else if (priv->rtllib->current_network.channel !=
1084 14 && priv->bcck_in_ch14) {
1085 priv->bcck_in_ch14 = false;
1086 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
1087 } else {
1088 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
1089 }
1090 break;
1091
1092 case HT_CHANNEL_WIDTH_20_40:
1093 priv->CCKPresentAttentuation =
1094 priv->CCKPresentAttentuation_40Mdefault +
1095 priv->CCKPresentAttentuation_difference;
1096
1097 RT_TRACE(COMP_POWER_TRACKING,
1098 "40M, priv->CCKPresentAttentuation = %d\n",
1099 priv->CCKPresentAttentuation);
1100 if (priv->CCKPresentAttentuation >
1101 (CCKTxBBGainTableLength - 1))
1102 priv->CCKPresentAttentuation =
1103 CCKTxBBGainTableLength-1;
1104 if (priv->CCKPresentAttentuation < 0)
1105 priv->CCKPresentAttentuation = 0;
1106
1107 if (priv->rtllib->current_network.channel == 14 &&
1108 !priv->bcck_in_ch14) {
1109 priv->bcck_in_ch14 = true;
1110 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
1111 } else if (priv->rtllib->current_network.channel != 14
1112 && priv->bcck_in_ch14) {
1113 priv->bcck_in_ch14 = false;
1114 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
1115 } else {
1116 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
1117 }
1118 break;
1119 }
1120}
1121
1122static void _rtl92e_cck_tx_power_track_bw_switch_thermal(struct net_device *dev)
1123{
1124 struct r8192_priv *priv = rtllib_priv(dev);
1125
1126 if (priv->rtllib->current_network.channel == 14 &&
1127 !priv->bcck_in_ch14)
1128 priv->bcck_in_ch14 = true;
1129 else if (priv->rtllib->current_network.channel != 14 &&
1130 priv->bcck_in_ch14)
1131 priv->bcck_in_ch14 = false;
1132
1133 switch (priv->CurrentChannelBW) {
1134 case HT_CHANNEL_WIDTH_20:
1135 if (priv->Record_CCK_20Mindex == 0)
1136 priv->Record_CCK_20Mindex = 6;
1137 priv->CCK_index = priv->Record_CCK_20Mindex;
1138 RT_TRACE(COMP_POWER_TRACKING,
1139 "20MHz, _rtl92e_cck_tx_power_track_bw_switch_thermal(),CCK_index = %d\n",
1140 priv->CCK_index);
1141 break;
1142
1143 case HT_CHANNEL_WIDTH_20_40:
1144 priv->CCK_index = priv->Record_CCK_40Mindex;
1145 RT_TRACE(COMP_POWER_TRACKING,
1146 "40MHz, _rtl92e_cck_tx_power_track_bw_switch_thermal(), CCK_index = %d\n",
1147 priv->CCK_index);
1148 break;
1149 }
1150 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
1151}
1152
1153static void _rtl92e_cck_tx_power_track_bw_switch(struct net_device *dev)
1154{
1155 struct r8192_priv *priv = rtllib_priv(dev);
1156
1157 if (priv->IC_Cut >= IC_VersionCut_D)
1158 _rtl92e_cck_tx_power_track_bw_switch_tssi(dev);
1159 else
1160 _rtl92e_cck_tx_power_track_bw_switch_thermal(dev);
1161}
1162
1163static void _rtl92e_set_bw_mode_work_item(struct net_device *dev)
1164{
1165
1166 struct r8192_priv *priv = rtllib_priv(dev);
1167 u8 regBwOpMode;
1168
1169 RT_TRACE(COMP_SWBW,
1170 "==>_rtl92e_set_bw_mode_work_item() Switch to %s bandwidth\n",
1171 priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20 ?
1172 "20MHz" : "40MHz");
1173
1174
1175 if (priv->rf_chip == RF_PSEUDO_11N) {
1176 priv->SetBWModeInProgress = false;
1177 return;
1178 }
1179 if (!priv->up) {
1180 netdev_err(dev, "%s(): Driver is not initialized\n", __func__);
1181 return;
1182 }
1183 regBwOpMode = rtl92e_readb(dev, BW_OPMODE);
1184
1185 switch (priv->CurrentChannelBW) {
1186 case HT_CHANNEL_WIDTH_20:
1187 regBwOpMode |= BW_OPMODE_20MHZ;
1188 rtl92e_writeb(dev, BW_OPMODE, regBwOpMode);
1189 break;
1190
1191 case HT_CHANNEL_WIDTH_20_40:
1192 regBwOpMode &= ~BW_OPMODE_20MHZ;
1193 rtl92e_writeb(dev, BW_OPMODE, regBwOpMode);
1194 break;
1195
1196 default:
1197 netdev_err(dev, "%s(): unknown Bandwidth: %#X\n", __func__,
1198 priv->CurrentChannelBW);
1199 break;
1200 }
1201
1202 switch (priv->CurrentChannelBW) {
1203 case HT_CHANNEL_WIDTH_20:
1204 rtl92e_set_bb_reg(dev, rFPGA0_RFMOD, bRFMOD, 0x0);
1205 rtl92e_set_bb_reg(dev, rFPGA1_RFMOD, bRFMOD, 0x0);
1206
1207 if (!priv->btxpower_tracking) {
1208 rtl92e_writel(dev, rCCK0_TxFilter1, 0x1a1b0000);
1209 rtl92e_writel(dev, rCCK0_TxFilter2, 0x090e1317);
1210 rtl92e_writel(dev, rCCK0_DebugPort, 0x00000204);
1211 } else {
1212 _rtl92e_cck_tx_power_track_bw_switch(dev);
1213 }
1214
1215 rtl92e_set_bb_reg(dev, rFPGA0_AnalogParameter1, 0x00100000, 1);
1216
1217 break;
1218 case HT_CHANNEL_WIDTH_20_40:
1219 rtl92e_set_bb_reg(dev, rFPGA0_RFMOD, bRFMOD, 0x1);
1220 rtl92e_set_bb_reg(dev, rFPGA1_RFMOD, bRFMOD, 0x1);
1221
1222 if (!priv->btxpower_tracking) {
1223 rtl92e_writel(dev, rCCK0_TxFilter1, 0x35360000);
1224 rtl92e_writel(dev, rCCK0_TxFilter2, 0x121c252e);
1225 rtl92e_writel(dev, rCCK0_DebugPort, 0x00000409);
1226 } else {
1227 _rtl92e_cck_tx_power_track_bw_switch(dev);
1228 }
1229
1230 rtl92e_set_bb_reg(dev, rCCK0_System, bCCKSideBand,
1231 (priv->nCur40MhzPrimeSC>>1));
1232 rtl92e_set_bb_reg(dev, rOFDM1_LSTF, 0xC00,
1233 priv->nCur40MhzPrimeSC);
1234
1235 rtl92e_set_bb_reg(dev, rFPGA0_AnalogParameter1, 0x00100000, 0);
1236 break;
1237 default:
1238 netdev_err(dev, "%s(): unknown Bandwidth: %#X\n", __func__,
1239 priv->CurrentChannelBW);
1240 break;
1241
1242 }
1243
1244 switch (priv->rf_chip) {
1245 case RF_8225:
1246 break;
1247
1248 case RF_8256:
1249 rtl92e_set_bandwidth(dev, priv->CurrentChannelBW);
1250 break;
1251
1252 case RF_8258:
1253 break;
1254
1255 case RF_PSEUDO_11N:
1256 break;
1257
1258 default:
1259 netdev_info(dev, "%s(): Unknown RFChipID: %d\n", __func__,
1260 priv->rf_chip);
1261 break;
1262 }
1263
1264 atomic_dec(&(priv->rtllib->atm_swbw));
1265 priv->SetBWModeInProgress = false;
1266
1267 RT_TRACE(COMP_SWBW, "<==SetBWMode819xUsb()");
1268}
1269
1270void rtl92e_set_bw_mode(struct net_device *dev, enum ht_channel_width Bandwidth,
1271 enum ht_extchnl_offset Offset)
1272{
1273 struct r8192_priv *priv = rtllib_priv(dev);
1274
1275
1276 if (priv->SetBWModeInProgress)
1277 return;
1278
1279 atomic_inc(&(priv->rtllib->atm_swbw));
1280 priv->SetBWModeInProgress = true;
1281
1282 priv->CurrentChannelBW = Bandwidth;
1283
1284 if (Offset == HT_EXTCHNL_OFFSET_LOWER)
1285 priv->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER;
1286 else if (Offset == HT_EXTCHNL_OFFSET_UPPER)
1287 priv->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER;
1288 else
1289 priv->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
1290
1291 _rtl92e_set_bw_mode_work_item(dev);
1292
1293}
1294
1295void rtl92e_init_gain(struct net_device *dev, u8 Operation)
1296{
1297#define SCAN_RX_INITIAL_GAIN 0x17
1298#define POWER_DETECTION_TH 0x08
1299 struct r8192_priv *priv = rtllib_priv(dev);
1300 u32 BitMask;
1301 u8 initial_gain;
1302
1303 if (priv->up) {
1304 switch (Operation) {
1305 case IG_Backup:
1306 RT_TRACE(COMP_SCAN,
1307 "IG_Backup, backup the initial gain.\n");
1308 initial_gain = SCAN_RX_INITIAL_GAIN;
1309 BitMask = bMaskByte0;
1310 if (dm_digtable.dig_algorithm ==
1311 DIG_ALGO_BY_FALSE_ALARM)
1312 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x8);
1313 priv->initgain_backup.xaagccore1 =
1314 (u8)rtl92e_get_bb_reg(dev, rOFDM0_XAAGCCore1,
1315 BitMask);
1316 priv->initgain_backup.xbagccore1 =
1317 (u8)rtl92e_get_bb_reg(dev, rOFDM0_XBAGCCore1,
1318 BitMask);
1319 priv->initgain_backup.xcagccore1 =
1320 (u8)rtl92e_get_bb_reg(dev, rOFDM0_XCAGCCore1,
1321 BitMask);
1322 priv->initgain_backup.xdagccore1 =
1323 (u8)rtl92e_get_bb_reg(dev, rOFDM0_XDAGCCore1,
1324 BitMask);
1325 BitMask = bMaskByte2;
1326 priv->initgain_backup.cca = (u8)rtl92e_get_bb_reg(dev,
1327 rCCK0_CCA, BitMask);
1328
1329 RT_TRACE(COMP_SCAN,
1330 "Scan InitialGainBackup 0xc50 is %x\n",
1331 priv->initgain_backup.xaagccore1);
1332 RT_TRACE(COMP_SCAN,
1333 "Scan InitialGainBackup 0xc58 is %x\n",
1334 priv->initgain_backup.xbagccore1);
1335 RT_TRACE(COMP_SCAN,
1336 "Scan InitialGainBackup 0xc60 is %x\n",
1337 priv->initgain_backup.xcagccore1);
1338 RT_TRACE(COMP_SCAN,
1339 "Scan InitialGainBackup 0xc68 is %x\n",
1340 priv->initgain_backup.xdagccore1);
1341 RT_TRACE(COMP_SCAN,
1342 "Scan InitialGainBackup 0xa0a is %x\n",
1343 priv->initgain_backup.cca);
1344
1345 RT_TRACE(COMP_SCAN, "Write scan initial gain = 0x%x\n",
1346 initial_gain);
1347 rtl92e_writeb(dev, rOFDM0_XAAGCCore1, initial_gain);
1348 rtl92e_writeb(dev, rOFDM0_XBAGCCore1, initial_gain);
1349 rtl92e_writeb(dev, rOFDM0_XCAGCCore1, initial_gain);
1350 rtl92e_writeb(dev, rOFDM0_XDAGCCore1, initial_gain);
1351 RT_TRACE(COMP_SCAN, "Write scan 0xa0a = 0x%x\n",
1352 POWER_DETECTION_TH);
1353 rtl92e_writeb(dev, 0xa0a, POWER_DETECTION_TH);
1354 break;
1355 case IG_Restore:
1356 RT_TRACE(COMP_SCAN,
1357 "IG_Restore, restore the initial gain.\n");
1358 BitMask = 0x7f;
1359 if (dm_digtable.dig_algorithm ==
1360 DIG_ALGO_BY_FALSE_ALARM)
1361 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x8);
1362
1363 rtl92e_set_bb_reg(dev, rOFDM0_XAAGCCore1, BitMask,
1364 (u32)priv->initgain_backup.xaagccore1);
1365 rtl92e_set_bb_reg(dev, rOFDM0_XBAGCCore1, BitMask,
1366 (u32)priv->initgain_backup.xbagccore1);
1367 rtl92e_set_bb_reg(dev, rOFDM0_XCAGCCore1, BitMask,
1368 (u32)priv->initgain_backup.xcagccore1);
1369 rtl92e_set_bb_reg(dev, rOFDM0_XDAGCCore1, BitMask,
1370 (u32)priv->initgain_backup.xdagccore1);
1371 BitMask = bMaskByte2;
1372 rtl92e_set_bb_reg(dev, rCCK0_CCA, BitMask,
1373 (u32)priv->initgain_backup.cca);
1374
1375 RT_TRACE(COMP_SCAN,
1376 "Scan BBInitialGainRestore 0xc50 is %x\n",
1377 priv->initgain_backup.xaagccore1);
1378 RT_TRACE(COMP_SCAN,
1379 "Scan BBInitialGainRestore 0xc58 is %x\n",
1380 priv->initgain_backup.xbagccore1);
1381 RT_TRACE(COMP_SCAN,
1382 "Scan BBInitialGainRestore 0xc60 is %x\n",
1383 priv->initgain_backup.xcagccore1);
1384 RT_TRACE(COMP_SCAN,
1385 "Scan BBInitialGainRestore 0xc68 is %x\n",
1386 priv->initgain_backup.xdagccore1);
1387 RT_TRACE(COMP_SCAN,
1388 "Scan BBInitialGainRestore 0xa0a is %x\n",
1389 priv->initgain_backup.cca);
1390
1391 rtl92e_set_tx_power(dev,
1392 priv->rtllib->current_network.channel);
1393
1394 if (dm_digtable.dig_algorithm ==
1395 DIG_ALGO_BY_FALSE_ALARM)
1396 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x1);
1397 break;
1398 default:
1399 RT_TRACE(COMP_SCAN, "Unknown IG Operation.\n");
1400 break;
1401 }
1402 }
1403}
1404
1405void rtl92e_set_rf_off(struct net_device *dev)
1406{
1407
1408 rtl92e_set_bb_reg(dev, rFPGA0_XA_RFInterfaceOE, BIT4, 0x0);
1409 rtl92e_set_bb_reg(dev, rFPGA0_AnalogParameter4, 0x300, 0x0);
1410 rtl92e_set_bb_reg(dev, rFPGA0_AnalogParameter1, 0x18, 0x0);
1411 rtl92e_set_bb_reg(dev, rOFDM0_TRxPathEnable, 0xf, 0x0);
1412 rtl92e_set_bb_reg(dev, rOFDM1_TRxPathEnable, 0xf, 0x0);
1413 rtl92e_set_bb_reg(dev, rFPGA0_AnalogParameter1, 0x60, 0x0);
1414 rtl92e_set_bb_reg(dev, rFPGA0_AnalogParameter1, 0x4, 0x0);
1415 rtl92e_writeb(dev, ANAPAR_FOR_8192PciE, 0x07);
1416
1417}
1418
1419static bool _rtl92e_set_rf_power_state(struct net_device *dev,
1420 enum rt_rf_power_state eRFPowerState)
1421{
1422 struct r8192_priv *priv = rtllib_priv(dev);
1423 struct rt_pwr_save_ctrl *pPSC = (struct rt_pwr_save_ctrl *)
1424 (&(priv->rtllib->PowerSaveControl));
1425 bool bResult = true;
1426 u8 i = 0, QueueID = 0;
1427 struct rtl8192_tx_ring *ring = NULL;
1428
1429 if (priv->SetRFPowerStateInProgress)
1430 return false;
1431 RT_TRACE(COMP_PS, "===========> _rtl92e_set_rf_power_state()!\n");
1432 priv->SetRFPowerStateInProgress = true;
1433
1434 switch (priv->rf_chip) {
1435 case RF_8256:
1436 switch (eRFPowerState) {
1437 case eRfOn:
1438 RT_TRACE(COMP_PS,
1439 "_rtl92e_set_rf_power_state() eRfOn!\n");
1440 if ((priv->rtllib->eRFPowerState == eRfOff) &&
1441 RT_IN_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC)) {
1442 bool rtstatus = true;
1443 u32 InitilizeCount = 3;
1444
1445 do {
1446 InitilizeCount--;
1447 priv->RegRfOff = false;
1448 rtstatus = rtl92e_enable_nic(dev);
1449 } while (!rtstatus && (InitilizeCount > 0));
1450
1451 if (!rtstatus) {
1452 netdev_err(dev,
1453 "%s(): Failed to initialize Adapter.\n",
1454 __func__);
1455 priv->SetRFPowerStateInProgress = false;
1456 return false;
1457 }
1458
1459 RT_CLEAR_PS_LEVEL(pPSC,
1460 RT_RF_OFF_LEVL_HALT_NIC);
1461 } else {
1462 rtl92e_writeb(dev, ANAPAR, 0x37);
1463 mdelay(1);
1464 rtl92e_set_bb_reg(dev, rFPGA0_AnalogParameter1,
1465 0x4, 0x1);
1466 priv->bHwRfOffAction = 0;
1467
1468 rtl92e_set_bb_reg(dev, rFPGA0_XA_RFInterfaceOE,
1469 BIT4, 0x1);
1470 rtl92e_set_bb_reg(dev, rFPGA0_AnalogParameter4,
1471 0x300, 0x3);
1472 rtl92e_set_bb_reg(dev, rFPGA0_AnalogParameter1,
1473 0x18, 0x3);
1474 rtl92e_set_bb_reg(dev, rOFDM0_TRxPathEnable,
1475 0x3, 0x3);
1476 rtl92e_set_bb_reg(dev, rOFDM1_TRxPathEnable,
1477 0x3, 0x3);
1478 rtl92e_set_bb_reg(dev, rFPGA0_AnalogParameter1,
1479 0x60, 0x3);
1480
1481 }
1482
1483 break;
1484
1485 case eRfSleep:
1486 if (priv->rtllib->eRFPowerState == eRfOff)
1487 break;
1488
1489
1490 for (QueueID = 0, i = 0; QueueID < MAX_TX_QUEUE; ) {
1491 ring = &priv->tx_ring[QueueID];
1492
1493 if (skb_queue_len(&ring->queue) == 0) {
1494 QueueID++;
1495 continue;
1496 } else {
1497 RT_TRACE((COMP_POWER|COMP_RF),
1498 "eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 before doze!\n",
1499 (i+1), QueueID);
1500 udelay(10);
1501 i++;
1502 }
1503
1504 if (i >= MAX_DOZE_WAITING_TIMES_9x) {
1505 RT_TRACE(COMP_POWER,
1506 "\n\n\n TimeOut!! _rtl92e_set_rf_power_state(): eRfOff: %d times TcbBusyQueue[%d] != 0 !!!\n",
1507 MAX_DOZE_WAITING_TIMES_9x,
1508 QueueID);
1509 break;
1510 }
1511 }
1512 rtl92e_set_rf_off(dev);
1513 break;
1514
1515 case eRfOff:
1516 RT_TRACE(COMP_PS,
1517 "_rtl92e_set_rf_power_state() eRfOff/Sleep !\n");
1518
1519 for (QueueID = 0, i = 0; QueueID < MAX_TX_QUEUE; ) {
1520 ring = &priv->tx_ring[QueueID];
1521
1522 if (skb_queue_len(&ring->queue) == 0) {
1523 QueueID++;
1524 continue;
1525 } else {
1526 RT_TRACE(COMP_POWER,
1527 "eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 before doze!\n",
1528 (i+1), QueueID);
1529 udelay(10);
1530 i++;
1531 }
1532
1533 if (i >= MAX_DOZE_WAITING_TIMES_9x) {
1534 RT_TRACE(COMP_POWER,
1535 "\n\n\n SetZebra: RFPowerState8185B(): eRfOff: %d times TcbBusyQueue[%d] != 0 !!!\n",
1536 MAX_DOZE_WAITING_TIMES_9x,
1537 QueueID);
1538 break;
1539 }
1540 }
1541
1542 if (pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_HALT_NIC &&
1543 !RT_IN_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC)) {
1544 rtl92e_disable_nic(dev);
1545 RT_SET_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC);
1546 } else if (!(pPSC->RegRfPsLevel &
1547 RT_RF_OFF_LEVL_HALT_NIC)) {
1548 rtl92e_set_rf_off(dev);
1549 }
1550
1551 break;
1552
1553 default:
1554 bResult = false;
1555 netdev_warn(dev,
1556 "%s(): Unknown state requested: 0x%X.\n",
1557 __func__, eRFPowerState);
1558 break;
1559 }
1560
1561 break;
1562
1563 default:
1564 netdev_warn(dev, "%s(): Unknown RF type\n", __func__);
1565 break;
1566 }
1567
1568 if (bResult) {
1569 priv->rtllib->eRFPowerState = eRFPowerState;
1570
1571 switch (priv->rf_chip) {
1572 case RF_8256:
1573 break;
1574
1575 default:
1576 netdev_warn(dev, "%s(): Unknown RF type\n", __func__);
1577 break;
1578 }
1579 }
1580
1581 priv->SetRFPowerStateInProgress = false;
1582 RT_TRACE(COMP_PS,
1583 "<=========== _rtl92e_set_rf_power_state() bResult = %d!\n",
1584 bResult);
1585 return bResult;
1586}
1587
1588bool rtl92e_set_rf_power_state(struct net_device *dev,
1589 enum rt_rf_power_state eRFPowerState)
1590{
1591 struct r8192_priv *priv = rtllib_priv(dev);
1592
1593 bool bResult = false;
1594
1595 RT_TRACE(COMP_PS,
1596 "---------> rtl92e_set_rf_power_state(): eRFPowerState(%d)\n",
1597 eRFPowerState);
1598 if (eRFPowerState == priv->rtllib->eRFPowerState &&
1599 priv->bHwRfOffAction == 0) {
1600 RT_TRACE(COMP_PS,
1601 "<--------- rtl92e_set_rf_power_state(): discard the request for eRFPowerState(%d) is the same.\n",
1602 eRFPowerState);
1603 return bResult;
1604 }
1605
1606 bResult = _rtl92e_set_rf_power_state(dev, eRFPowerState);
1607
1608 RT_TRACE(COMP_PS,
1609 "<--------- rtl92e_set_rf_power_state(): bResult(%d)\n",
1610 bResult);
1611
1612 return bResult;
1613}
1614
1615void rtl92e_scan_op_backup(struct net_device *dev, u8 Operation)
1616{
1617 struct r8192_priv *priv = rtllib_priv(dev);
1618
1619 if (priv->up) {
1620 switch (Operation) {
1621 case SCAN_OPT_BACKUP:
1622 priv->rtllib->InitialGainHandler(dev, IG_Backup);
1623 break;
1624
1625 case SCAN_OPT_RESTORE:
1626 priv->rtllib->InitialGainHandler(dev, IG_Restore);
1627 break;
1628
1629 default:
1630 RT_TRACE(COMP_SCAN, "Unknown Scan Backup Operation.\n");
1631 break;
1632 }
1633 }
1634
1635}
1636