blob: 83e00d72199a5f8bebc8fb4085106a71840daa92 [file] [log] [blame]
Larry Finger94a79942011-08-23 19:00:42 -05001/******************************************************************************
2 * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
3 *
4 * This program is distributed in the hope that it will be useful, but WITHOUT
5 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
7 * more details.
8 *
9 * You should have received a copy of the GNU General Public License along with
10 * this program; if not, write to the Free Software Foundation, Inc.,
11 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
12 *
13 * The full GNU General Public License is included in this distribution in the
14 * file called LICENSE.
15 *
16 * Contact Information:
17 * wlanfae <wlanfae@realtek.com>
18******************************************************************************/
Larry Finger94a79942011-08-23 19:00:42 -050019
20#include "rtl_core.h"
21#include "r8192E_hw.h"
22#include "r8192E_phyreg.h"
23#include "r8190P_rtl8256.h"
24#include "r8192E_phy.h"
25#include "rtl_dm.h"
Larry Finger94a79942011-08-23 19:00:42 -050026#include "dot11d.h"
Larry Finger94a79942011-08-23 19:00:42 -050027
Larry Finger94a79942011-08-23 19:00:42 -050028#include "r8192E_hwimg.h"
Larry Finger94a79942011-08-23 19:00:42 -050029
30static u32 RF_CHANNEL_TABLE_ZEBRA[] = {
31 0,
32 0x085c,
33 0x08dc,
34 0x095c,
35 0x09dc,
36 0x0a5c,
37 0x0adc,
38 0x0b5c,
39 0x0bdc,
40 0x0c5c,
41 0x0cdc,
42 0x0d5c,
43 0x0ddc,
44 0x0e5c,
45 0x0f72,
46};
47
48/*************************Define local function prototype**********************/
49
Larry Finger547d0c32011-08-25 11:48:16 -050050static u32 phy_FwRFSerialRead(struct net_device *dev,
51 enum rf90_radio_path eRFPath,
52 u32 Offset);
53static void phy_FwRFSerialWrite(struct net_device *dev,
54 enum rf90_radio_path eRFPath,
55 u32 Offset, u32 Data);
Larry Finger49aab5f2011-08-25 14:07:05 -050056
57static u32 rtl8192_CalculateBitShift(u32 dwBitMask)
Larry Finger94a79942011-08-23 19:00:42 -050058{
59 u32 i;
Larry Finger547d0c32011-08-25 11:48:16 -050060 for (i = 0; i <= 31; i++) {
61 if (((dwBitMask >> i) & 0x1) == 1)
Larry Finger94a79942011-08-23 19:00:42 -050062 break;
63 }
64 return i;
65}
Larry Finger547d0c32011-08-25 11:48:16 -050066
67u8 rtl8192_phy_CheckIsLegalRFPath(struct net_device *dev, u32 eRFPath)
Larry Finger94a79942011-08-23 19:00:42 -050068{
69 u8 ret = 1;
70 struct r8192_priv *priv = rtllib_priv(dev);
Larry Finger94a79942011-08-23 19:00:42 -050071 if (priv->rf_type == RF_2T4R)
72 ret = 0;
Larry Finger547d0c32011-08-25 11:48:16 -050073 else if (priv->rf_type == RF_1T2R) {
Larry Finger94a79942011-08-23 19:00:42 -050074 if (eRFPath == RF90_PATH_A || eRFPath == RF90_PATH_B)
75 ret = 1;
76 else if (eRFPath == RF90_PATH_C || eRFPath == RF90_PATH_D)
77 ret = 0;
78 }
Larry Finger94a79942011-08-23 19:00:42 -050079 return ret;
80}
Larry Finger547d0c32011-08-25 11:48:16 -050081
82void rtl8192_setBBreg(struct net_device *dev, u32 dwRegAddr, u32 dwBitMask,
83 u32 dwData)
Larry Finger94a79942011-08-23 19:00:42 -050084{
85
86 u32 OriginalValue, BitShift, NewValue;
87
Larry Finger547d0c32011-08-25 11:48:16 -050088 if (dwBitMask != bMaskDWord) {
Larry Finger94a79942011-08-23 19:00:42 -050089 OriginalValue = read_nic_dword(dev, dwRegAddr);
90 BitShift = rtl8192_CalculateBitShift(dwBitMask);
Larry Finger547d0c32011-08-25 11:48:16 -050091 NewValue = (((OriginalValue) & (~dwBitMask)) |
92 (dwData << BitShift));
Larry Finger94a79942011-08-23 19:00:42 -050093 write_nic_dword(dev, dwRegAddr, NewValue);
Larry Finger547d0c32011-08-25 11:48:16 -050094 } else
Larry Finger94a79942011-08-23 19:00:42 -050095 write_nic_dword(dev, dwRegAddr, dwData);
96 return;
97}
Larry Finger547d0c32011-08-25 11:48:16 -050098
99u32 rtl8192_QueryBBReg(struct net_device *dev, u32 dwRegAddr, u32 dwBitMask)
Larry Finger94a79942011-08-23 19:00:42 -0500100{
101 u32 Ret = 0, OriginalValue, BitShift;
102
103 OriginalValue = read_nic_dword(dev, dwRegAddr);
104 BitShift = rtl8192_CalculateBitShift(dwBitMask);
105 Ret = (OriginalValue & dwBitMask) >> BitShift;
106
Larry Finger547d0c32011-08-25 11:48:16 -0500107 return Ret;
Larry Finger94a79942011-08-23 19:00:42 -0500108}
Larry Finger49aab5f2011-08-25 14:07:05 -0500109static u32 rtl8192_phy_RFSerialRead(struct net_device *dev,
110 enum rf90_radio_path eRFPath, u32 Offset)
Larry Finger94a79942011-08-23 19:00:42 -0500111{
112 struct r8192_priv *priv = rtllib_priv(dev);
113 u32 ret = 0;
114 u32 NewOffset = 0;
Larry Finger547d0c32011-08-25 11:48:16 -0500115 struct bb_reg_definition *pPhyReg = &priv->PHYRegDef[eRFPath];
Larry Finger94a79942011-08-23 19:00:42 -0500116 Offset &= 0x3f;
117
Larry Finger547d0c32011-08-25 11:48:16 -0500118 if (priv->rf_chip == RF_8256) {
Larry Finger94a79942011-08-23 19:00:42 -0500119 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xf00, 0x0);
Larry Finger547d0c32011-08-25 11:48:16 -0500120 if (Offset >= 31) {
Larry Finger94a79942011-08-23 19:00:42 -0500121 priv->RfReg0Value[eRFPath] |= 0x140;
Larry Finger547d0c32011-08-25 11:48:16 -0500122 rtl8192_setBBreg(dev, pPhyReg->rf3wireOffset,
123 bMaskDWord,
124 (priv->RfReg0Value[eRFPath]<<16));
125 NewOffset = Offset - 30;
126 } else if (Offset >= 16) {
Larry Finger94a79942011-08-23 19:00:42 -0500127 priv->RfReg0Value[eRFPath] |= 0x100;
128 priv->RfReg0Value[eRFPath] &= (~0x40);
Larry Finger547d0c32011-08-25 11:48:16 -0500129 rtl8192_setBBreg(dev, pPhyReg->rf3wireOffset,
130 bMaskDWord,
131 (priv->RfReg0Value[eRFPath]<<16));
Larry Finger94a79942011-08-23 19:00:42 -0500132
133 NewOffset = Offset - 15;
Larry Finger547d0c32011-08-25 11:48:16 -0500134 } else
Larry Finger94a79942011-08-23 19:00:42 -0500135 NewOffset = Offset;
Larry Finger547d0c32011-08-25 11:48:16 -0500136 } else {
137 RT_TRACE((COMP_PHY|COMP_ERR), "check RF type here, need"
138 " to be 8256\n");
Larry Finger94a79942011-08-23 19:00:42 -0500139 NewOffset = Offset;
140 }
Larry Finger547d0c32011-08-25 11:48:16 -0500141 rtl8192_setBBreg(dev, pPhyReg->rfHSSIPara2, bLSSIReadAddress,
142 NewOffset);
Larry Finger94a79942011-08-23 19:00:42 -0500143 rtl8192_setBBreg(dev, pPhyReg->rfHSSIPara2, bLSSIReadEdge, 0x0);
144 rtl8192_setBBreg(dev, pPhyReg->rfHSSIPara2, bLSSIReadEdge, 0x1);
145
Larry Finger547d0c32011-08-25 11:48:16 -0500146 mdelay(1);
Larry Finger94a79942011-08-23 19:00:42 -0500147
Larry Finger547d0c32011-08-25 11:48:16 -0500148 ret = rtl8192_QueryBBReg(dev, pPhyReg->rfLSSIReadBack,
149 bLSSIReadBackData);
Larry Finger94a79942011-08-23 19:00:42 -0500150
Larry Finger547d0c32011-08-25 11:48:16 -0500151 if (priv->rf_chip == RF_8256) {
Larry Finger94a79942011-08-23 19:00:42 -0500152 priv->RfReg0Value[eRFPath] &= 0xebf;
153
Larry Finger547d0c32011-08-25 11:48:16 -0500154 rtl8192_setBBreg(dev, pPhyReg->rf3wireOffset, bMaskDWord,
155 (priv->RfReg0Value[eRFPath] << 16));
Larry Finger94a79942011-08-23 19:00:42 -0500156
Larry Finger94a79942011-08-23 19:00:42 -0500157 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0x300, 0x3);
Larry Finger94a79942011-08-23 19:00:42 -0500158 }
159
160
161 return ret;
162
163}
164
Larry Finger49aab5f2011-08-25 14:07:05 -0500165static void rtl8192_phy_RFSerialWrite(struct net_device *dev,
166 enum rf90_radio_path eRFPath, u32 Offset,
167 u32 Data)
Larry Finger94a79942011-08-23 19:00:42 -0500168{
169 struct r8192_priv *priv = rtllib_priv(dev);
170 u32 DataAndAddr = 0, NewOffset = 0;
Larry Finger9bf6e4c2011-07-18 21:16:51 -0500171 struct bb_reg_definition *pPhyReg = &priv->PHYRegDef[eRFPath];
Larry Finger94a79942011-08-23 19:00:42 -0500172
173 Offset &= 0x3f;
Larry Finger547d0c32011-08-25 11:48:16 -0500174 if (priv->rf_chip == RF_8256) {
Larry Finger94a79942011-08-23 19:00:42 -0500175 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xf00, 0x0);
Larry Finger94a79942011-08-23 19:00:42 -0500176
Larry Finger547d0c32011-08-25 11:48:16 -0500177 if (Offset >= 31) {
Larry Finger94a79942011-08-23 19:00:42 -0500178 priv->RfReg0Value[eRFPath] |= 0x140;
Larry Finger547d0c32011-08-25 11:48:16 -0500179 rtl8192_setBBreg(dev, pPhyReg->rf3wireOffset,
180 bMaskDWord,
181 (priv->RfReg0Value[eRFPath] << 16));
Larry Finger94a79942011-08-23 19:00:42 -0500182 NewOffset = Offset - 30;
Larry Finger547d0c32011-08-25 11:48:16 -0500183 } else if (Offset >= 16) {
Larry Finger94a79942011-08-23 19:00:42 -0500184 priv->RfReg0Value[eRFPath] |= 0x100;
185 priv->RfReg0Value[eRFPath] &= (~0x40);
Larry Finger547d0c32011-08-25 11:48:16 -0500186 rtl8192_setBBreg(dev, pPhyReg->rf3wireOffset,
187 bMaskDWord,
188 (priv->RfReg0Value[eRFPath] << 16));
Larry Finger94a79942011-08-23 19:00:42 -0500189 NewOffset = Offset - 15;
Larry Finger547d0c32011-08-25 11:48:16 -0500190 } else
Larry Finger94a79942011-08-23 19:00:42 -0500191 NewOffset = Offset;
Larry Finger547d0c32011-08-25 11:48:16 -0500192 } else {
193 RT_TRACE((COMP_PHY|COMP_ERR), "check RF type here, need to be"
194 " 8256\n");
Larry Finger94a79942011-08-23 19:00:42 -0500195 NewOffset = Offset;
196 }
197
198 DataAndAddr = (Data<<16) | (NewOffset&0x3f);
199
200 rtl8192_setBBreg(dev, pPhyReg->rf3wireOffset, bMaskDWord, DataAndAddr);
201
Larry Finger547d0c32011-08-25 11:48:16 -0500202 if (Offset == 0x0)
Larry Finger94a79942011-08-23 19:00:42 -0500203 priv->RfReg0Value[eRFPath] = Data;
204
Larry Finger547d0c32011-08-25 11:48:16 -0500205 if (priv->rf_chip == RF_8256) {
206 if (Offset != 0) {
Larry Finger94a79942011-08-23 19:00:42 -0500207 priv->RfReg0Value[eRFPath] &= 0xebf;
208 rtl8192_setBBreg(
209 dev,
210 pPhyReg->rf3wireOffset,
211 bMaskDWord,
212 (priv->RfReg0Value[eRFPath] << 16));
213 }
Larry Finger94a79942011-08-23 19:00:42 -0500214 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0x300, 0x3);
Larry Finger94a79942011-08-23 19:00:42 -0500215 }
Larry Finger94a79942011-08-23 19:00:42 -0500216 return;
217}
218
Larry Finger547d0c32011-08-25 11:48:16 -0500219void rtl8192_phy_SetRFReg(struct net_device *dev, enum rf90_radio_path eRFPath,
220 u32 RegAddr, u32 BitMask, u32 Data)
Larry Finger94a79942011-08-23 19:00:42 -0500221{
222 struct r8192_priv *priv = rtllib_priv(dev);
223 u32 Original_Value, BitShift, New_Value;
224
225 if (!rtl8192_phy_CheckIsLegalRFPath(dev, eRFPath))
226 return;
Larry Finger94a79942011-08-23 19:00:42 -0500227 if (priv->rtllib->eRFPowerState != eRfOn && !priv->being_init_adapter)
228 return;
Larry Finger94a79942011-08-23 19:00:42 -0500229
230 RT_TRACE(COMP_PHY, "FW RF CTRL is not ready now\n");
Larry Finger547d0c32011-08-25 11:48:16 -0500231 if (priv->Rf_Mode == RF_OP_By_FW) {
232 if (BitMask != bMask12Bits) {
233 Original_Value = phy_FwRFSerialRead(dev, eRFPath,
234 RegAddr);
Larry Finger94a79942011-08-23 19:00:42 -0500235 BitShift = rtl8192_CalculateBitShift(BitMask);
Larry Finger547d0c32011-08-25 11:48:16 -0500236 New_Value = (((Original_Value) & (~BitMask)) |
237 (Data << BitShift));
Larry Finger94a79942011-08-23 19:00:42 -0500238
239 phy_FwRFSerialWrite(dev, eRFPath, RegAddr, New_Value);
Larry Finger547d0c32011-08-25 11:48:16 -0500240 } else
Larry Finger94a79942011-08-23 19:00:42 -0500241 phy_FwRFSerialWrite(dev, eRFPath, RegAddr, Data);
242 udelay(200);
243
Larry Finger547d0c32011-08-25 11:48:16 -0500244 } else {
245 if (BitMask != bMask12Bits) {
246 Original_Value = rtl8192_phy_RFSerialRead(dev, eRFPath,
247 RegAddr);
Larry Finger94a79942011-08-23 19:00:42 -0500248 BitShift = rtl8192_CalculateBitShift(BitMask);
Larry Finger547d0c32011-08-25 11:48:16 -0500249 New_Value = (((Original_Value) & (~BitMask)) |
250 (Data << BitShift));
Larry Finger94a79942011-08-23 19:00:42 -0500251
Larry Finger547d0c32011-08-25 11:48:16 -0500252 rtl8192_phy_RFSerialWrite(dev, eRFPath, RegAddr,
253 New_Value);
254 } else
Larry Finger94a79942011-08-23 19:00:42 -0500255 rtl8192_phy_RFSerialWrite(dev, eRFPath, RegAddr, Data);
256 }
257 return;
258}
259
Larry Finger547d0c32011-08-25 11:48:16 -0500260u32 rtl8192_phy_QueryRFReg(struct net_device *dev, enum rf90_radio_path eRFPath,
261 u32 RegAddr, u32 BitMask)
Larry Finger94a79942011-08-23 19:00:42 -0500262{
263 u32 Original_Value, Readback_Value, BitShift;
264 struct r8192_priv *priv = rtllib_priv(dev);
265 if (!rtl8192_phy_CheckIsLegalRFPath(dev, eRFPath))
266 return 0;
Larry Finger94a79942011-08-23 19:00:42 -0500267 if (priv->rtllib->eRFPowerState != eRfOn && !priv->being_init_adapter)
268 return 0;
Larry Finger94a79942011-08-23 19:00:42 -0500269 down(&priv->rf_sem);
Larry Finger547d0c32011-08-25 11:48:16 -0500270 if (priv->Rf_Mode == RF_OP_By_FW) {
Larry Finger94a79942011-08-23 19:00:42 -0500271 Original_Value = phy_FwRFSerialRead(dev, eRFPath, RegAddr);
272 udelay(200);
Larry Finger547d0c32011-08-25 11:48:16 -0500273 } else {
274 Original_Value = rtl8192_phy_RFSerialRead(dev, eRFPath,
275 RegAddr);
Larry Finger94a79942011-08-23 19:00:42 -0500276 }
277 BitShift = rtl8192_CalculateBitShift(BitMask);
278 Readback_Value = (Original_Value & BitMask) >> BitShift;
279 up(&priv->rf_sem);
Larry Finger547d0c32011-08-25 11:48:16 -0500280 return Readback_Value;
Larry Finger94a79942011-08-23 19:00:42 -0500281}
282
Larry Finger547d0c32011-08-25 11:48:16 -0500283static u32 phy_FwRFSerialRead(struct net_device *dev,
284 enum rf90_radio_path eRFPath, u32 Offset)
Larry Finger94a79942011-08-23 19:00:42 -0500285{
286 u32 retValue = 0;
287 u32 Data = 0;
288 u8 time = 0;
Larry Finger547d0c32011-08-25 11:48:16 -0500289 Data |= ((Offset & 0xFF) << 12);
290 Data |= ((eRFPath & 0x3) << 20);
Larry Finger94a79942011-08-23 19:00:42 -0500291 Data |= 0x80000000;
Larry Finger547d0c32011-08-25 11:48:16 -0500292 while (read_nic_dword(dev, QPNR)&0x80000000) {
Larry Finger94a79942011-08-23 19:00:42 -0500293 if (time++ < 100)
Larry Finger94a79942011-08-23 19:00:42 -0500294 udelay(10);
Larry Finger94a79942011-08-23 19:00:42 -0500295 else
296 break;
297 }
298 write_nic_dword(dev, QPNR, Data);
Larry Finger547d0c32011-08-25 11:48:16 -0500299 while (read_nic_dword(dev, QPNR) & 0x80000000) {
Larry Finger94a79942011-08-23 19:00:42 -0500300 if (time++ < 100)
Larry Finger94a79942011-08-23 19:00:42 -0500301 udelay(10);
Larry Finger94a79942011-08-23 19:00:42 -0500302 else
Larry Finger547d0c32011-08-25 11:48:16 -0500303 return 0;
Larry Finger94a79942011-08-23 19:00:42 -0500304 }
305 retValue = read_nic_dword(dev, RF_DATA);
306
Larry Finger547d0c32011-08-25 11:48:16 -0500307 return retValue;
Larry Finger94a79942011-08-23 19:00:42 -0500308
309} /* phy_FwRFSerialRead */
310
Larry Finger547d0c32011-08-25 11:48:16 -0500311static void phy_FwRFSerialWrite(struct net_device *dev,
312 enum rf90_radio_path eRFPath,
313 u32 Offset, u32 Data)
Larry Finger94a79942011-08-23 19:00:42 -0500314{
315 u8 time = 0;
316
Larry Finger547d0c32011-08-25 11:48:16 -0500317 Data |= ((Offset & 0xFF) << 12);
318 Data |= ((eRFPath & 0x3) << 20);
Larry Finger94a79942011-08-23 19:00:42 -0500319 Data |= 0x400000;
320 Data |= 0x80000000;
321
Larry Finger547d0c32011-08-25 11:48:16 -0500322 while (read_nic_dword(dev, QPNR) & 0x80000000) {
Larry Finger94a79942011-08-23 19:00:42 -0500323 if (time++ < 100)
Larry Finger94a79942011-08-23 19:00:42 -0500324 udelay(10);
Larry Finger94a79942011-08-23 19:00:42 -0500325 else
326 break;
327 }
328 write_nic_dword(dev, QPNR, Data);
329
330} /* phy_FwRFSerialWrite */
331
332
Larry Finger547d0c32011-08-25 11:48:16 -0500333void rtl8192_phy_configmac(struct net_device *dev)
Larry Finger94a79942011-08-23 19:00:42 -0500334{
335 u32 dwArrayLen = 0, i = 0;
Larry Finger547d0c32011-08-25 11:48:16 -0500336 u32 *pdwArray = NULL;
Larry Finger94a79942011-08-23 19:00:42 -0500337 struct r8192_priv *priv = rtllib_priv(dev);
Larry Finger547d0c32011-08-25 11:48:16 -0500338
339 if (priv->bTXPowerDataReadFromEEPORM) {
Larry Finger94a79942011-08-23 19:00:42 -0500340 RT_TRACE(COMP_PHY, "Rtl819XMACPHY_Array_PG\n");
341 dwArrayLen = MACPHY_Array_PGLength;
342 pdwArray = Rtl819XMACPHY_Array_PG;
343
Larry Finger547d0c32011-08-25 11:48:16 -0500344 } else {
345 RT_TRACE(COMP_PHY, "Read rtl819XMACPHY_Array\n");
Larry Finger94a79942011-08-23 19:00:42 -0500346 dwArrayLen = MACPHY_ArrayLength;
347 pdwArray = Rtl819XMACPHY_Array;
348 }
Larry Finger547d0c32011-08-25 11:48:16 -0500349 for (i = 0; i < dwArrayLen; i += 3) {
350 RT_TRACE(COMP_DBG, "The Rtl8190MACPHY_Array[0] is %x Rtl8190MAC"
351 "PHY_Array[1] is %x Rtl8190MACPHY_Array[2] is %x\n",
352 pdwArray[i], pdwArray[i+1], pdwArray[i+2]);
Larry Finger94a79942011-08-23 19:00:42 -0500353 if (pdwArray[i] == 0x318)
Larry Finger94a79942011-08-23 19:00:42 -0500354 pdwArray[i+2] = 0x00000800;
Larry Finger547d0c32011-08-25 11:48:16 -0500355 rtl8192_setBBreg(dev, pdwArray[i], pdwArray[i+1],
356 pdwArray[i+2]);
Larry Finger94a79942011-08-23 19:00:42 -0500357 }
358 return;
359
360}
361
Larry Finger547d0c32011-08-25 11:48:16 -0500362void rtl8192_phyConfigBB(struct net_device *dev, u8 ConfigType)
Larry Finger94a79942011-08-23 19:00:42 -0500363{
364 int i;
Larry Finger547d0c32011-08-25 11:48:16 -0500365 u32 *Rtl819XPHY_REGArray_Table = NULL;
366 u32 *Rtl819XAGCTAB_Array_Table = NULL;
367 u16 AGCTAB_ArrayLen, PHY_REGArrayLen = 0;
Larry Finger94a79942011-08-23 19:00:42 -0500368 struct r8192_priv *priv = rtllib_priv(dev);
Larry Finger547d0c32011-08-25 11:48:16 -0500369
370 AGCTAB_ArrayLen = AGCTAB_ArrayLength;
371 Rtl819XAGCTAB_Array_Table = Rtl819XAGCTAB_Array;
372 if (priv->rf_type == RF_2T4R) {
373 PHY_REGArrayLen = PHY_REGArrayLength;
374 Rtl819XPHY_REGArray_Table = Rtl819XPHY_REGArray;
375 } else if (priv->rf_type == RF_1T2R) {
376 PHY_REGArrayLen = PHY_REG_1T2RArrayLength;
377 Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_1T2RArray;
Larry Finger94a79942011-08-23 19:00:42 -0500378 }
379
Larry Finger547d0c32011-08-25 11:48:16 -0500380 if (ConfigType == BaseBand_Config_PHY_REG) {
381 for (i = 0; i < PHY_REGArrayLen; i += 2) {
382 rtl8192_setBBreg(dev, Rtl819XPHY_REGArray_Table[i],
383 bMaskDWord,
384 Rtl819XPHY_REGArray_Table[i+1]);
385 RT_TRACE(COMP_DBG, "i: %x, The Rtl819xUsbPHY_REGArray"
386 "[0] is %x Rtl819xUsbPHY_REGArray[1] is %x\n",
387 i, Rtl819XPHY_REGArray_Table[i],
388 Rtl819XPHY_REGArray_Table[i+1]);
Larry Finger94a79942011-08-23 19:00:42 -0500389 }
Larry Finger547d0c32011-08-25 11:48:16 -0500390 } else if (ConfigType == BaseBand_Config_AGC_TAB) {
391 for (i = 0; i < AGCTAB_ArrayLen; i += 2) {
392 rtl8192_setBBreg(dev, Rtl819XAGCTAB_Array_Table[i],
393 bMaskDWord,
394 Rtl819XAGCTAB_Array_Table[i+1]);
395 RT_TRACE(COMP_DBG, "i:%x, The rtl819XAGCTAB_Array[0] "
396 "is %x rtl819XAGCTAB_Array[1] is %x\n", i,
397 Rtl819XAGCTAB_Array_Table[i],
398 Rtl819XAGCTAB_Array_Table[i+1]);
Larry Finger94a79942011-08-23 19:00:42 -0500399 }
400 }
401 return;
Larry Finger94a79942011-08-23 19:00:42 -0500402}
Larry Finger547d0c32011-08-25 11:48:16 -0500403
Larry Finger49aab5f2011-08-25 14:07:05 -0500404static void rtl8192_InitBBRFRegDef(struct net_device *dev)
Larry Finger94a79942011-08-23 19:00:42 -0500405{
406 struct r8192_priv *priv = rtllib_priv(dev);
Larry Finger547d0c32011-08-25 11:48:16 -0500407
Larry Finger94a79942011-08-23 19:00:42 -0500408 priv->PHYRegDef[RF90_PATH_A].rfintfs = rFPGA0_XAB_RFInterfaceSW;
409 priv->PHYRegDef[RF90_PATH_B].rfintfs = rFPGA0_XAB_RFInterfaceSW;
410 priv->PHYRegDef[RF90_PATH_C].rfintfs = rFPGA0_XCD_RFInterfaceSW;
411 priv->PHYRegDef[RF90_PATH_D].rfintfs = rFPGA0_XCD_RFInterfaceSW;
412
413 priv->PHYRegDef[RF90_PATH_A].rfintfi = rFPGA0_XAB_RFInterfaceRB;
414 priv->PHYRegDef[RF90_PATH_B].rfintfi = rFPGA0_XAB_RFInterfaceRB;
415 priv->PHYRegDef[RF90_PATH_C].rfintfi = rFPGA0_XCD_RFInterfaceRB;
416 priv->PHYRegDef[RF90_PATH_D].rfintfi = rFPGA0_XCD_RFInterfaceRB;
417
418 priv->PHYRegDef[RF90_PATH_A].rfintfo = rFPGA0_XA_RFInterfaceOE;
419 priv->PHYRegDef[RF90_PATH_B].rfintfo = rFPGA0_XB_RFInterfaceOE;
420 priv->PHYRegDef[RF90_PATH_C].rfintfo = rFPGA0_XC_RFInterfaceOE;
421 priv->PHYRegDef[RF90_PATH_D].rfintfo = rFPGA0_XD_RFInterfaceOE;
422
423 priv->PHYRegDef[RF90_PATH_A].rfintfe = rFPGA0_XA_RFInterfaceOE;
424 priv->PHYRegDef[RF90_PATH_B].rfintfe = rFPGA0_XB_RFInterfaceOE;
425 priv->PHYRegDef[RF90_PATH_C].rfintfe = rFPGA0_XC_RFInterfaceOE;
426 priv->PHYRegDef[RF90_PATH_D].rfintfe = rFPGA0_XD_RFInterfaceOE;
427
428 priv->PHYRegDef[RF90_PATH_A].rf3wireOffset = rFPGA0_XA_LSSIParameter;
429 priv->PHYRegDef[RF90_PATH_B].rf3wireOffset = rFPGA0_XB_LSSIParameter;
430 priv->PHYRegDef[RF90_PATH_C].rf3wireOffset = rFPGA0_XC_LSSIParameter;
431 priv->PHYRegDef[RF90_PATH_D].rf3wireOffset = rFPGA0_XD_LSSIParameter;
432
433 priv->PHYRegDef[RF90_PATH_A].rfLSSI_Select = rFPGA0_XAB_RFParameter;
434 priv->PHYRegDef[RF90_PATH_B].rfLSSI_Select = rFPGA0_XAB_RFParameter;
435 priv->PHYRegDef[RF90_PATH_C].rfLSSI_Select = rFPGA0_XCD_RFParameter;
436 priv->PHYRegDef[RF90_PATH_D].rfLSSI_Select = rFPGA0_XCD_RFParameter;
437
438 priv->PHYRegDef[RF90_PATH_A].rfTxGainStage = rFPGA0_TxGainStage;
439 priv->PHYRegDef[RF90_PATH_B].rfTxGainStage = rFPGA0_TxGainStage;
440 priv->PHYRegDef[RF90_PATH_C].rfTxGainStage = rFPGA0_TxGainStage;
441 priv->PHYRegDef[RF90_PATH_D].rfTxGainStage = rFPGA0_TxGainStage;
442
443 priv->PHYRegDef[RF90_PATH_A].rfHSSIPara1 = rFPGA0_XA_HSSIParameter1;
444 priv->PHYRegDef[RF90_PATH_B].rfHSSIPara1 = rFPGA0_XB_HSSIParameter1;
445 priv->PHYRegDef[RF90_PATH_C].rfHSSIPara1 = rFPGA0_XC_HSSIParameter1;
446 priv->PHYRegDef[RF90_PATH_D].rfHSSIPara1 = rFPGA0_XD_HSSIParameter1;
447
448 priv->PHYRegDef[RF90_PATH_A].rfHSSIPara2 = rFPGA0_XA_HSSIParameter2;
449 priv->PHYRegDef[RF90_PATH_B].rfHSSIPara2 = rFPGA0_XB_HSSIParameter2;
450 priv->PHYRegDef[RF90_PATH_C].rfHSSIPara2 = rFPGA0_XC_HSSIParameter2;
451 priv->PHYRegDef[RF90_PATH_D].rfHSSIPara2 = rFPGA0_XD_HSSIParameter2;
452
453 priv->PHYRegDef[RF90_PATH_A].rfSwitchControl = rFPGA0_XAB_SwitchControl;
454 priv->PHYRegDef[RF90_PATH_B].rfSwitchControl = rFPGA0_XAB_SwitchControl;
455 priv->PHYRegDef[RF90_PATH_C].rfSwitchControl = rFPGA0_XCD_SwitchControl;
456 priv->PHYRegDef[RF90_PATH_D].rfSwitchControl = rFPGA0_XCD_SwitchControl;
457
458 priv->PHYRegDef[RF90_PATH_A].rfAGCControl1 = rOFDM0_XAAGCCore1;
459 priv->PHYRegDef[RF90_PATH_B].rfAGCControl1 = rOFDM0_XBAGCCore1;
460 priv->PHYRegDef[RF90_PATH_C].rfAGCControl1 = rOFDM0_XCAGCCore1;
461 priv->PHYRegDef[RF90_PATH_D].rfAGCControl1 = rOFDM0_XDAGCCore1;
462
463 priv->PHYRegDef[RF90_PATH_A].rfAGCControl2 = rOFDM0_XAAGCCore2;
464 priv->PHYRegDef[RF90_PATH_B].rfAGCControl2 = rOFDM0_XBAGCCore2;
465 priv->PHYRegDef[RF90_PATH_C].rfAGCControl2 = rOFDM0_XCAGCCore2;
466 priv->PHYRegDef[RF90_PATH_D].rfAGCControl2 = rOFDM0_XDAGCCore2;
467
468 priv->PHYRegDef[RF90_PATH_A].rfRxIQImbalance = rOFDM0_XARxIQImbalance;
469 priv->PHYRegDef[RF90_PATH_B].rfRxIQImbalance = rOFDM0_XBRxIQImbalance;
470 priv->PHYRegDef[RF90_PATH_C].rfRxIQImbalance = rOFDM0_XCRxIQImbalance;
471 priv->PHYRegDef[RF90_PATH_D].rfRxIQImbalance = rOFDM0_XDRxIQImbalance;
472
473 priv->PHYRegDef[RF90_PATH_A].rfRxAFE = rOFDM0_XARxAFE;
474 priv->PHYRegDef[RF90_PATH_B].rfRxAFE = rOFDM0_XBRxAFE;
475 priv->PHYRegDef[RF90_PATH_C].rfRxAFE = rOFDM0_XCRxAFE;
476 priv->PHYRegDef[RF90_PATH_D].rfRxAFE = rOFDM0_XDRxAFE;
477
478 priv->PHYRegDef[RF90_PATH_A].rfTxIQImbalance = rOFDM0_XATxIQImbalance;
479 priv->PHYRegDef[RF90_PATH_B].rfTxIQImbalance = rOFDM0_XBTxIQImbalance;
480 priv->PHYRegDef[RF90_PATH_C].rfTxIQImbalance = rOFDM0_XCTxIQImbalance;
481 priv->PHYRegDef[RF90_PATH_D].rfTxIQImbalance = rOFDM0_XDTxIQImbalance;
482
483 priv->PHYRegDef[RF90_PATH_A].rfTxAFE = rOFDM0_XATxAFE;
484 priv->PHYRegDef[RF90_PATH_B].rfTxAFE = rOFDM0_XBTxAFE;
485 priv->PHYRegDef[RF90_PATH_C].rfTxAFE = rOFDM0_XCTxAFE;
486 priv->PHYRegDef[RF90_PATH_D].rfTxAFE = rOFDM0_XDTxAFE;
487
488 priv->PHYRegDef[RF90_PATH_A].rfLSSIReadBack = rFPGA0_XA_LSSIReadBack;
489 priv->PHYRegDef[RF90_PATH_B].rfLSSIReadBack = rFPGA0_XB_LSSIReadBack;
490 priv->PHYRegDef[RF90_PATH_C].rfLSSIReadBack = rFPGA0_XC_LSSIReadBack;
491 priv->PHYRegDef[RF90_PATH_D].rfLSSIReadBack = rFPGA0_XD_LSSIReadBack;
492
493}
Larry Finger547d0c32011-08-25 11:48:16 -0500494
495bool rtl8192_phy_checkBBAndRF(struct net_device *dev,
496 enum hw90_block CheckBlock,
497 enum rf90_radio_path eRFPath)
Larry Finger94a79942011-08-23 19:00:42 -0500498{
499 bool ret = true;
500 u32 i, CheckTimes = 4, dwRegRead = 0;
501 u32 WriteAddr[4];
502 u32 WriteData[] = {0xfffff027, 0xaa55a02f, 0x00000027, 0x55aa502f};
Larry Finger547d0c32011-08-25 11:48:16 -0500503
Larry Finger94a79942011-08-23 19:00:42 -0500504 WriteAddr[HW90_BLOCK_MAC] = 0x100;
505 WriteAddr[HW90_BLOCK_PHY0] = 0x900;
506 WriteAddr[HW90_BLOCK_PHY1] = 0x800;
507 WriteAddr[HW90_BLOCK_RF] = 0x3;
Larry Finger547d0c32011-08-25 11:48:16 -0500508 RT_TRACE(COMP_PHY, "=======>%s(), CheckBlock:%d\n", __func__,
509 CheckBlock);
510 for (i = 0; i < CheckTimes; i++) {
511 switch (CheckBlock) {
Larry Finger94a79942011-08-23 19:00:42 -0500512 case HW90_BLOCK_MAC:
Larry Finger547d0c32011-08-25 11:48:16 -0500513 RT_TRACE(COMP_ERR, "PHY_CheckBBRFOK(): Never Write "
514 "0x100 here!");
Larry Finger94a79942011-08-23 19:00:42 -0500515 break;
516
517 case HW90_BLOCK_PHY0:
518 case HW90_BLOCK_PHY1:
Larry Finger547d0c32011-08-25 11:48:16 -0500519 write_nic_dword(dev, WriteAddr[CheckBlock],
520 WriteData[i]);
Larry Finger94a79942011-08-23 19:00:42 -0500521 dwRegRead = read_nic_dword(dev, WriteAddr[CheckBlock]);
522 break;
523
524 case HW90_BLOCK_RF:
525 WriteData[i] &= 0xfff;
Larry Finger547d0c32011-08-25 11:48:16 -0500526 rtl8192_phy_SetRFReg(dev, eRFPath,
527 WriteAddr[HW90_BLOCK_RF],
528 bMask12Bits, WriteData[i]);
Larry Finger94a79942011-08-23 19:00:42 -0500529 mdelay(10);
Larry Finger547d0c32011-08-25 11:48:16 -0500530 dwRegRead = rtl8192_phy_QueryRFReg(dev, eRFPath,
531 WriteAddr[HW90_BLOCK_RF],
532 bMaskDWord);
Larry Finger94a79942011-08-23 19:00:42 -0500533 mdelay(10);
534 break;
535
536 default:
537 ret = false;
538 break;
539 }
540
541
Larry Finger547d0c32011-08-25 11:48:16 -0500542 if (dwRegRead != WriteData[i]) {
543 RT_TRACE(COMP_ERR, "====>error=====dwRegRead: %x, "
544 "WriteData: %x\n", dwRegRead, WriteData[i]);
Larry Finger94a79942011-08-23 19:00:42 -0500545 ret = false;
546 break;
547 }
548 }
549
550 return ret;
551}
552
Larry Finger49aab5f2011-08-25 14:07:05 -0500553static bool rtl8192_BB_Config_ParaFile(struct net_device *dev)
Larry Finger94a79942011-08-23 19:00:42 -0500554{
555 struct r8192_priv *priv = rtllib_priv(dev);
556 bool rtStatus = true;
557 u8 bRegValue = 0, eCheckItem = 0;
558 u32 dwRegValue = 0;
Larry Finger94a79942011-08-23 19:00:42 -0500559
560 bRegValue = read_nic_byte(dev, BB_GLOBAL_RESET);
Larry Finger547d0c32011-08-25 11:48:16 -0500561 write_nic_byte(dev, BB_GLOBAL_RESET, (bRegValue|BB_GLOBAL_RESET_BIT));
Larry Finger94a79942011-08-23 19:00:42 -0500562
563 dwRegValue = read_nic_dword(dev, CPU_GEN);
564 write_nic_dword(dev, CPU_GEN, (dwRegValue&(~CPU_GEN_BB_RST)));
565
Larry Finger547d0c32011-08-25 11:48:16 -0500566 for (eCheckItem = (enum hw90_block)HW90_BLOCK_PHY0;
567 eCheckItem <= HW90_BLOCK_PHY1; eCheckItem++) {
568 rtStatus = rtl8192_phy_checkBBAndRF(dev,
569 (enum hw90_block)eCheckItem,
570 (enum rf90_radio_path)0);
571 if (rtStatus != true) {
572 RT_TRACE((COMP_ERR | COMP_PHY), "PHY_RF8256_Config():"
573 "Check PHY%d Fail!!\n", eCheckItem-1);
Larry Finger94a79942011-08-23 19:00:42 -0500574 return rtStatus;
575 }
576 }
577 rtl8192_setBBreg(dev, rFPGA0_RFMOD, bCCKEn|bOFDMEn, 0x0);
578 rtl8192_phyConfigBB(dev, BaseBand_Config_PHY_REG);
579
580 dwRegValue = read_nic_dword(dev, CPU_GEN);
581 write_nic_dword(dev, CPU_GEN, (dwRegValue|CPU_GEN_BB_RST));
582
583 rtl8192_phyConfigBB(dev, BaseBand_Config_AGC_TAB);
584
Larry Finger547d0c32011-08-25 11:48:16 -0500585 if (priv->IC_Cut > VERSION_8190_BD) {
Larry Finger94a79942011-08-23 19:00:42 -0500586 if (priv->rf_type == RF_2T4R)
Larry Finger547d0c32011-08-25 11:48:16 -0500587 dwRegValue = (priv->AntennaTxPwDiff[2]<<8 |
588 priv->AntennaTxPwDiff[1]<<4 |
589 priv->AntennaTxPwDiff[0]);
Larry Finger94a79942011-08-23 19:00:42 -0500590 else
591 dwRegValue = 0x0;
592 rtl8192_setBBreg(dev, rFPGA0_TxGainStage,
593 (bXBTxAGC|bXCTxAGC|bXDTxAGC), dwRegValue);
594
595
Larry Finger94a79942011-08-23 19:00:42 -0500596 dwRegValue = priv->CrystalCap;
Larry Finger547d0c32011-08-25 11:48:16 -0500597 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, bXtalCap92x,
598 dwRegValue);
Larry Finger94a79942011-08-23 19:00:42 -0500599 }
600
601 return rtStatus;
602}
Larry Finger547d0c32011-08-25 11:48:16 -0500603bool rtl8192_BBConfig(struct net_device *dev)
Larry Finger94a79942011-08-23 19:00:42 -0500604{
605 bool rtStatus = true;
Larry Finger547d0c32011-08-25 11:48:16 -0500606
Larry Finger94a79942011-08-23 19:00:42 -0500607 rtl8192_InitBBRFRegDef(dev);
608 rtStatus = rtl8192_BB_Config_ParaFile(dev);
609 return rtStatus;
610}
611
Larry Finger547d0c32011-08-25 11:48:16 -0500612void rtl8192_phy_getTxPower(struct net_device *dev)
Larry Finger94a79942011-08-23 19:00:42 -0500613{
614 struct r8192_priv *priv = rtllib_priv(dev);
Larry Finger547d0c32011-08-25 11:48:16 -0500615
Larry Finger94a79942011-08-23 19:00:42 -0500616 priv->MCSTxPowerLevelOriginalOffset[0] =
617 read_nic_dword(dev, rTxAGC_Rate18_06);
618 priv->MCSTxPowerLevelOriginalOffset[1] =
619 read_nic_dword(dev, rTxAGC_Rate54_24);
620 priv->MCSTxPowerLevelOriginalOffset[2] =
621 read_nic_dword(dev, rTxAGC_Mcs03_Mcs00);
622 priv->MCSTxPowerLevelOriginalOffset[3] =
623 read_nic_dword(dev, rTxAGC_Mcs07_Mcs04);
624 priv->MCSTxPowerLevelOriginalOffset[4] =
625 read_nic_dword(dev, rTxAGC_Mcs11_Mcs08);
626 priv->MCSTxPowerLevelOriginalOffset[5] =
627 read_nic_dword(dev, rTxAGC_Mcs15_Mcs12);
Larry Finger94a79942011-08-23 19:00:42 -0500628
629 priv->DefaultInitialGain[0] = read_nic_byte(dev, rOFDM0_XAAGCCore1);
630 priv->DefaultInitialGain[1] = read_nic_byte(dev, rOFDM0_XBAGCCore1);
631 priv->DefaultInitialGain[2] = read_nic_byte(dev, rOFDM0_XCAGCCore1);
632 priv->DefaultInitialGain[3] = read_nic_byte(dev, rOFDM0_XDAGCCore1);
Larry Finger547d0c32011-08-25 11:48:16 -0500633 RT_TRACE(COMP_INIT, "Default initial gain (c50=0x%x, c58=0x%x, "
634 "c60=0x%x, c68=0x%x)\n",
Larry Finger94a79942011-08-23 19:00:42 -0500635 priv->DefaultInitialGain[0], priv->DefaultInitialGain[1],
636 priv->DefaultInitialGain[2], priv->DefaultInitialGain[3]);
637
638 priv->framesync = read_nic_byte(dev, rOFDM0_RxDetector3);
639 priv->framesyncC34 = read_nic_dword(dev, rOFDM0_RxDetector2);
Larry Finger547d0c32011-08-25 11:48:16 -0500640 RT_TRACE(COMP_INIT, "Default framesync (0x%x) = 0x%x\n",
Larry Finger94a79942011-08-23 19:00:42 -0500641 rOFDM0_RxDetector3, priv->framesync);
642 priv->SifsTime = read_nic_word(dev, SIFS);
643 return;
644}
645
Larry Finger547d0c32011-08-25 11:48:16 -0500646void rtl8192_phy_setTxPower(struct net_device *dev, u8 channel)
Larry Finger94a79942011-08-23 19:00:42 -0500647{
648 struct r8192_priv *priv = rtllib_priv(dev);
Larry Finger547d0c32011-08-25 11:48:16 -0500649 u8 powerlevel = 0, powerlevelOFDM24G = 0;
Larry Finger94a79942011-08-23 19:00:42 -0500650 char ant_pwr_diff;
651 u32 u4RegValue;
652
Larry Finger547d0c32011-08-25 11:48:16 -0500653 if (priv->epromtype == EEPROM_93C46) {
Larry Finger94a79942011-08-23 19:00:42 -0500654 powerlevel = priv->TxPowerLevelCCK[channel-1];
655 powerlevelOFDM24G = priv->TxPowerLevelOFDM24G[channel-1];
Larry Finger547d0c32011-08-25 11:48:16 -0500656 } else if (priv->epromtype == EEPROM_93C56) {
657 if (priv->rf_type == RF_1T2R) {
Larry Finger94a79942011-08-23 19:00:42 -0500658 powerlevel = priv->TxPowerLevelCCK_C[channel-1];
659 powerlevelOFDM24G = priv->TxPowerLevelOFDM24G_C[channel-1];
Larry Finger547d0c32011-08-25 11:48:16 -0500660 } else if (priv->rf_type == RF_2T4R) {
Larry Finger94a79942011-08-23 19:00:42 -0500661 powerlevel = priv->TxPowerLevelCCK_A[channel-1];
662 powerlevelOFDM24G = priv->TxPowerLevelOFDM24G_A[channel-1];
663
664 ant_pwr_diff = priv->TxPowerLevelOFDM24G_C[channel-1]
Larry Finger547d0c32011-08-25 11:48:16 -0500665 - priv->TxPowerLevelOFDM24G_A[channel-1];
Larry Finger94a79942011-08-23 19:00:42 -0500666
667 priv->RF_C_TxPwDiff = ant_pwr_diff;
668
669 ant_pwr_diff &= 0xf;
670
671 priv->AntennaTxPwDiff[2] = 0;
672 priv->AntennaTxPwDiff[1] = (u8)(ant_pwr_diff);
673 priv->AntennaTxPwDiff[0] = 0;
674
Larry Finger547d0c32011-08-25 11:48:16 -0500675 u4RegValue = (priv->AntennaTxPwDiff[2]<<8 |
676 priv->AntennaTxPwDiff[1]<<4 |
677 priv->AntennaTxPwDiff[0]);
Larry Finger94a79942011-08-23 19:00:42 -0500678
679 rtl8192_setBBreg(dev, rFPGA0_TxGainStage,
680 (bXBTxAGC|bXCTxAGC|bXDTxAGC), u4RegValue);
681 }
682 }
Mike McCormackcb762152011-07-11 08:56:20 +0900683 switch (priv->rf_chip) {
Larry Finger94a79942011-08-23 19:00:42 -0500684 case RF_8225:
685 break;
686 case RF_8256:
687 PHY_SetRF8256CCKTxPower(dev, powerlevel);
688 PHY_SetRF8256OFDMTxPower(dev, powerlevelOFDM24G);
689 break;
690 case RF_8258:
691 break;
692 default:
Larry Finger547d0c32011-08-25 11:48:16 -0500693 RT_TRACE(COMP_ERR, "unknown rf chip in funtion %s()\n",
694 __func__);
Larry Finger94a79942011-08-23 19:00:42 -0500695 break;
696 }
697 return;
698}
699
Larry Finger547d0c32011-08-25 11:48:16 -0500700bool rtl8192_phy_RFConfig(struct net_device *dev)
Larry Finger94a79942011-08-23 19:00:42 -0500701{
702 struct r8192_priv *priv = rtllib_priv(dev);
703 bool rtStatus = true;
Larry Finger547d0c32011-08-25 11:48:16 -0500704 switch (priv->rf_chip) {
705 case RF_8225:
706 break;
707 case RF_8256:
708 rtStatus = PHY_RF8256_Config(dev);
Larry Finger94a79942011-08-23 19:00:42 -0500709 break;
710
Larry Finger547d0c32011-08-25 11:48:16 -0500711 case RF_8258:
712 break;
713 case RF_PSEUDO_11N:
714 break;
715
716 default:
717 RT_TRACE(COMP_ERR, "error chip id\n");
718 break;
Larry Finger94a79942011-08-23 19:00:42 -0500719 }
720 return rtStatus;
721}
722
Larry Finger547d0c32011-08-25 11:48:16 -0500723void rtl8192_phy_updateInitGain(struct net_device *dev)
Larry Finger94a79942011-08-23 19:00:42 -0500724{
725 return;
726}
727
Larry Finger547d0c32011-08-25 11:48:16 -0500728u8 rtl8192_phy_ConfigRFWithHeaderFile(struct net_device *dev,
729 enum rf90_radio_path eRFPath)
Larry Finger94a79942011-08-23 19:00:42 -0500730{
731
732 int i;
733 u8 ret = 0;
734
Larry Finger547d0c32011-08-25 11:48:16 -0500735 switch (eRFPath) {
736 case RF90_PATH_A:
737 for (i = 0; i < RadioA_ArrayLength; i += 2) {
738 if (Rtl819XRadioA_Array[i] == 0xfe) {
739 msleep(100);
740 continue;
Larry Finger94a79942011-08-23 19:00:42 -0500741 }
Larry Finger547d0c32011-08-25 11:48:16 -0500742 rtl8192_phy_SetRFReg(dev, eRFPath,
743 Rtl819XRadioA_Array[i],
744 bMask12Bits,
745 Rtl819XRadioA_Array[i+1]);
Larry Finger94a79942011-08-23 19:00:42 -0500746
Larry Finger547d0c32011-08-25 11:48:16 -0500747 }
748 break;
749 case RF90_PATH_B:
750 for (i = 0; i < RadioB_ArrayLength; i += 2) {
751 if (Rtl819XRadioB_Array[i] == 0xfe) {
752 msleep(100);
753 continue;
Larry Finger94a79942011-08-23 19:00:42 -0500754 }
Larry Finger547d0c32011-08-25 11:48:16 -0500755 rtl8192_phy_SetRFReg(dev, eRFPath,
756 Rtl819XRadioB_Array[i],
757 bMask12Bits,
758 Rtl819XRadioB_Array[i+1]);
Larry Finger94a79942011-08-23 19:00:42 -0500759
Larry Finger547d0c32011-08-25 11:48:16 -0500760 }
761 break;
762 case RF90_PATH_C:
763 for (i = 0; i < RadioC_ArrayLength; i += 2) {
764 if (Rtl819XRadioC_Array[i] == 0xfe) {
765 msleep(100);
766 continue;
Larry Finger94a79942011-08-23 19:00:42 -0500767 }
Larry Finger547d0c32011-08-25 11:48:16 -0500768 rtl8192_phy_SetRFReg(dev, eRFPath,
769 Rtl819XRadioC_Array[i],
770 bMask12Bits,
771 Rtl819XRadioC_Array[i+1]);
Larry Finger94a79942011-08-23 19:00:42 -0500772
Larry Finger547d0c32011-08-25 11:48:16 -0500773 }
774 break;
775 case RF90_PATH_D:
776 for (i = 0; i < RadioD_ArrayLength; i += 2) {
777 if (Rtl819XRadioD_Array[i] == 0xfe) {
778 msleep(100);
779 continue;
Larry Finger94a79942011-08-23 19:00:42 -0500780 }
Larry Finger547d0c32011-08-25 11:48:16 -0500781 rtl8192_phy_SetRFReg(dev, eRFPath,
782 Rtl819XRadioD_Array[i], bMask12Bits,
783 Rtl819XRadioD_Array[i+1]);
784
785 }
786 break;
787 default:
788 break;
Larry Finger94a79942011-08-23 19:00:42 -0500789 }
790
Larry Finger547d0c32011-08-25 11:48:16 -0500791 return ret;
Larry Finger94a79942011-08-23 19:00:42 -0500792
793}
Larry Finger49aab5f2011-08-25 14:07:05 -0500794static void rtl8192_SetTxPowerLevel(struct net_device *dev, u8 channel)
Larry Finger94a79942011-08-23 19:00:42 -0500795{
796 struct r8192_priv *priv = rtllib_priv(dev);
797 u8 powerlevel = priv->TxPowerLevelCCK[channel-1];
798 u8 powerlevelOFDM24G = priv->TxPowerLevelOFDM24G[channel-1];
799
Larry Finger547d0c32011-08-25 11:48:16 -0500800 switch (priv->rf_chip) {
Larry Finger94a79942011-08-23 19:00:42 -0500801 case RF_8225:
Larry Finger94a79942011-08-23 19:00:42 -0500802 break;
803
804 case RF_8256:
805 PHY_SetRF8256CCKTxPower(dev, powerlevel);
806 PHY_SetRF8256OFDMTxPower(dev, powerlevelOFDM24G);
807 break;
808
809 case RF_8258:
810 break;
811 default:
Larry Finger547d0c32011-08-25 11:48:16 -0500812 RT_TRACE(COMP_ERR, "unknown rf chip ID in rtl8192_SetTxPower"
813 "Level()\n");
Larry Finger94a79942011-08-23 19:00:42 -0500814 break;
815 }
816 return;
817}
Larry Finger94a79942011-08-23 19:00:42 -0500818
Larry Finger49aab5f2011-08-25 14:07:05 -0500819static u8 rtl8192_phy_SetSwChnlCmdArray(struct sw_chnl_cmd *CmdTable,
820 u32 CmdTableIdx, u32 CmdTableSz,
821 enum sw_chnl_cmd_id CmdID,
822 u32 Para1, u32 Para2, u32 msDelay)
Larry Finger547d0c32011-08-25 11:48:16 -0500823{
824 struct sw_chnl_cmd *pCmd;
825
826 if (CmdTable == NULL) {
827 RT_TRACE(COMP_ERR, "phy_SetSwChnlCmdArray(): CmdTable cannot "
828 "be NULL.\n");
Larry Finger94a79942011-08-23 19:00:42 -0500829 return false;
830 }
Larry Finger547d0c32011-08-25 11:48:16 -0500831 if (CmdTableIdx >= CmdTableSz) {
832 RT_TRACE(COMP_ERR, "phy_SetSwChnlCmdArray(): Access invalid"
833 " index, please check size of the table, CmdTableIdx:"
834 "%d, CmdTableSz:%d\n",
Larry Finger94a79942011-08-23 19:00:42 -0500835 CmdTableIdx, CmdTableSz);
836 return false;
837 }
838
839 pCmd = CmdTable + CmdTableIdx;
840 pCmd->CmdID = CmdID;
841 pCmd->Para1 = Para1;
842 pCmd->Para2 = Para2;
843 pCmd->msDelay = msDelay;
844
845 return true;
846}
Larry Finger547d0c32011-08-25 11:48:16 -0500847
Larry Finger49aab5f2011-08-25 14:07:05 -0500848static u8 rtl8192_phy_SwChnlStepByStep(struct net_device *dev, u8 channel,
849 u8 *stage, u8 *step, u32 *delay)
Larry Finger94a79942011-08-23 19:00:42 -0500850{
851 struct r8192_priv *priv = rtllib_priv(dev);
Larry Finger51ce2312011-07-18 23:12:54 -0500852 struct sw_chnl_cmd PreCommonCmd[MAX_PRECMD_CNT];
Larry Finger94a79942011-08-23 19:00:42 -0500853 u32 PreCommonCmdCnt;
Larry Finger51ce2312011-07-18 23:12:54 -0500854 struct sw_chnl_cmd PostCommonCmd[MAX_POSTCMD_CNT];
Larry Finger94a79942011-08-23 19:00:42 -0500855 u32 PostCommonCmdCnt;
Larry Finger51ce2312011-07-18 23:12:54 -0500856 struct sw_chnl_cmd RfDependCmd[MAX_RFDEPENDCMD_CNT];
Larry Finger94a79942011-08-23 19:00:42 -0500857 u32 RfDependCmdCnt;
Larry Finger51ce2312011-07-18 23:12:54 -0500858 struct sw_chnl_cmd *CurrentCmd = NULL;
Larry Finger94a79942011-08-23 19:00:42 -0500859 u8 eRFPath;
860
Larry Finger547d0c32011-08-25 11:48:16 -0500861 RT_TRACE(COMP_TRACE, "====>%s()====stage:%d, step:%d, channel:%d\n",
862 __func__, *stage, *step, channel);
Larry Finger94a79942011-08-23 19:00:42 -0500863
Larry Finger547d0c32011-08-25 11:48:16 -0500864 if (!IsLegalChannel(priv->rtllib, channel)) {
865 RT_TRACE(COMP_ERR, "=============>set to illegal channel:%d\n",
866 channel);
Larry Finger94a79942011-08-23 19:00:42 -0500867 return true;
868 }
Larry Finger94a79942011-08-23 19:00:42 -0500869
870 {
871 PreCommonCmdCnt = 0;
Larry Finger547d0c32011-08-25 11:48:16 -0500872 rtl8192_phy_SetSwChnlCmdArray(PreCommonCmd, PreCommonCmdCnt++,
873 MAX_PRECMD_CNT, CmdID_SetTxPowerLevel,
874 0, 0, 0);
875 rtl8192_phy_SetSwChnlCmdArray(PreCommonCmd, PreCommonCmdCnt++,
876 MAX_PRECMD_CNT, CmdID_End, 0, 0, 0);
Larry Finger94a79942011-08-23 19:00:42 -0500877
878 PostCommonCmdCnt = 0;
879
Larry Finger547d0c32011-08-25 11:48:16 -0500880 rtl8192_phy_SetSwChnlCmdArray(PostCommonCmd, PostCommonCmdCnt++,
881 MAX_POSTCMD_CNT, CmdID_End, 0, 0, 0);
Larry Finger94a79942011-08-23 19:00:42 -0500882
883 RfDependCmdCnt = 0;
Larry Finger547d0c32011-08-25 11:48:16 -0500884 switch (priv->rf_chip) {
Larry Finger94a79942011-08-23 19:00:42 -0500885 case RF_8225:
Larry Finger547d0c32011-08-25 11:48:16 -0500886 if (!(channel >= 1 && channel <= 14)) {
887 RT_TRACE(COMP_ERR, "illegal channel for Zebra "
888 "8225: %d\n", channel);
Larry Finger94a79942011-08-23 19:00:42 -0500889 return false;
890 }
Larry Finger547d0c32011-08-25 11:48:16 -0500891 rtl8192_phy_SetSwChnlCmdArray(RfDependCmd,
892 RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,
893 CmdID_RF_WriteReg, rZebra1_Channel,
894 RF_CHANNEL_TABLE_ZEBRA[channel], 10);
895 rtl8192_phy_SetSwChnlCmdArray(RfDependCmd,
896 RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,
Larry Finger94a79942011-08-23 19:00:42 -0500897 CmdID_End, 0, 0, 0);
898 break;
899
900 case RF_8256:
Larry Finger547d0c32011-08-25 11:48:16 -0500901 if (!(channel >= 1 && channel <= 14)) {
902 RT_TRACE(COMP_ERR, "illegal channel for Zebra"
903 " 8256: %d\n", channel);
Larry Finger94a79942011-08-23 19:00:42 -0500904 return false;
905 }
Larry Finger547d0c32011-08-25 11:48:16 -0500906 rtl8192_phy_SetSwChnlCmdArray(RfDependCmd,
907 RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,
908 CmdID_RF_WriteReg, rZebra1_Channel, channel,
909 10);
910 rtl8192_phy_SetSwChnlCmdArray(RfDependCmd,
911 RfDependCmdCnt++,
912 MAX_RFDEPENDCMD_CNT,
Larry Finger94a79942011-08-23 19:00:42 -0500913 CmdID_End, 0, 0, 0);
914 break;
915
916 case RF_8258:
917 break;
918
919 default:
Larry Finger547d0c32011-08-25 11:48:16 -0500920 RT_TRACE(COMP_ERR, "Unknown RFChipID: %d\n",
921 priv->rf_chip);
Larry Finger94a79942011-08-23 19:00:42 -0500922 return false;
923 break;
924 }
925
926
Larry Finger547d0c32011-08-25 11:48:16 -0500927 do {
928 switch (*stage) {
Larry Finger94a79942011-08-23 19:00:42 -0500929 case 0:
Larry Finger547d0c32011-08-25 11:48:16 -0500930 CurrentCmd = &PreCommonCmd[*step];
Larry Finger94a79942011-08-23 19:00:42 -0500931 break;
932 case 1:
Larry Finger547d0c32011-08-25 11:48:16 -0500933 CurrentCmd = &RfDependCmd[*step];
Larry Finger94a79942011-08-23 19:00:42 -0500934 break;
935 case 2:
Larry Finger547d0c32011-08-25 11:48:16 -0500936 CurrentCmd = &PostCommonCmd[*step];
Larry Finger94a79942011-08-23 19:00:42 -0500937 break;
938 }
939
Larry Finger547d0c32011-08-25 11:48:16 -0500940 if (CurrentCmd->CmdID == CmdID_End) {
941 if ((*stage) == 2) {
Larry Finger94a79942011-08-23 19:00:42 -0500942 return true;
Larry Finger547d0c32011-08-25 11:48:16 -0500943 } else {
Larry Finger94a79942011-08-23 19:00:42 -0500944 (*stage)++;
Larry Finger547d0c32011-08-25 11:48:16 -0500945 (*step) = 0;
Larry Finger94a79942011-08-23 19:00:42 -0500946 continue;
947 }
948 }
949
Larry Finger547d0c32011-08-25 11:48:16 -0500950 switch (CurrentCmd->CmdID) {
Larry Finger94a79942011-08-23 19:00:42 -0500951 case CmdID_SetTxPowerLevel:
952 if (priv->IC_Cut > (u8)VERSION_8190_BD)
Larry Finger547d0c32011-08-25 11:48:16 -0500953 rtl8192_SetTxPowerLevel(dev, channel);
Larry Finger94a79942011-08-23 19:00:42 -0500954 break;
955 case CmdID_WritePortUlong:
Larry Finger547d0c32011-08-25 11:48:16 -0500956 write_nic_dword(dev, CurrentCmd->Para1,
957 CurrentCmd->Para2);
Larry Finger94a79942011-08-23 19:00:42 -0500958 break;
959 case CmdID_WritePortUshort:
Larry Finger547d0c32011-08-25 11:48:16 -0500960 write_nic_word(dev, CurrentCmd->Para1,
961 (u16)CurrentCmd->Para2);
Larry Finger94a79942011-08-23 19:00:42 -0500962 break;
963 case CmdID_WritePortUchar:
Larry Finger547d0c32011-08-25 11:48:16 -0500964 write_nic_byte(dev, CurrentCmd->Para1,
965 (u8)CurrentCmd->Para2);
Larry Finger94a79942011-08-23 19:00:42 -0500966 break;
967 case CmdID_RF_WriteReg:
Larry Finger547d0c32011-08-25 11:48:16 -0500968 for (eRFPath = 0; eRFPath <
969 priv->NumTotalRFPath; eRFPath++)
970 rtl8192_phy_SetRFReg(dev,
971 (enum rf90_radio_path)eRFPath,
972 CurrentCmd->Para1, bMask12Bits,
973 CurrentCmd->Para2<<7);
Larry Finger94a79942011-08-23 19:00:42 -0500974 break;
975 default:
976 break;
977 }
978
979 break;
Larry Finger547d0c32011-08-25 11:48:16 -0500980 } while (true);
981 } /*for (Number of RF paths)*/
Larry Finger94a79942011-08-23 19:00:42 -0500982
Larry Finger547d0c32011-08-25 11:48:16 -0500983 (*delay) = CurrentCmd->msDelay;
Larry Finger94a79942011-08-23 19:00:42 -0500984 (*step)++;
985 return false;
986}
987
Larry Finger49aab5f2011-08-25 14:07:05 -0500988static void rtl8192_phy_FinishSwChnlNow(struct net_device *dev, u8 channel)
Larry Finger94a79942011-08-23 19:00:42 -0500989{
990 struct r8192_priv *priv = rtllib_priv(dev);
Larry Finger547d0c32011-08-25 11:48:16 -0500991 u32 delay = 0;
Larry Finger94a79942011-08-23 19:00:42 -0500992
Larry Finger547d0c32011-08-25 11:48:16 -0500993 while (!rtl8192_phy_SwChnlStepByStep(dev, channel, &priv->SwChnlStage,
994 &priv->SwChnlStep, &delay)) {
995 if (delay > 0)
Larry Finger94a79942011-08-23 19:00:42 -0500996 msleep(delay);
997 if (IS_NIC_DOWN(priv))
Larry Finger547d0c32011-08-25 11:48:16 -0500998 break;
Larry Finger94a79942011-08-23 19:00:42 -0500999 }
1000}
1001void rtl8192_SwChnl_WorkItem(struct net_device *dev)
1002{
1003
1004 struct r8192_priv *priv = rtllib_priv(dev);
1005
1006 RT_TRACE(COMP_TRACE, "==> SwChnlCallback819xUsbWorkItem()\n");
1007
Larry Finger547d0c32011-08-25 11:48:16 -05001008 RT_TRACE(COMP_TRACE, "=====>--%s(), set chan:%d, priv:%p\n", __func__,
1009 priv->chan, priv);
Larry Finger94a79942011-08-23 19:00:42 -05001010
1011 rtl8192_phy_FinishSwChnlNow(dev , priv->chan);
1012
1013 RT_TRACE(COMP_TRACE, "<== SwChnlCallback819xUsbWorkItem()\n");
1014}
1015
Larry Finger547d0c32011-08-25 11:48:16 -05001016u8 rtl8192_phy_SwChnl(struct net_device *dev, u8 channel)
Larry Finger94a79942011-08-23 19:00:42 -05001017{
1018 struct r8192_priv *priv = rtllib_priv(dev);
1019 RT_TRACE(COMP_PHY, "=====>%s()\n", __func__);
Larry Finger547d0c32011-08-25 11:48:16 -05001020 if (IS_NIC_DOWN(priv)) {
1021 RT_TRACE(COMP_ERR, "%s(): ERR !! driver is not up\n", __func__);
Larry Finger94a79942011-08-23 19:00:42 -05001022 return false;
1023 }
1024 if (priv->SwChnlInProgress)
1025 return false;
1026
1027
Larry Finger547d0c32011-08-25 11:48:16 -05001028 switch (priv->rtllib->mode) {
Larry Finger94a79942011-08-23 19:00:42 -05001029 case WIRELESS_MODE_A:
1030 case WIRELESS_MODE_N_5G:
Larry Finger547d0c32011-08-25 11:48:16 -05001031 if (channel <= 14) {
Larry Finger94a79942011-08-23 19:00:42 -05001032 RT_TRACE(COMP_ERR, "WIRELESS_MODE_A but channel<=14");
1033 return false;
1034 }
1035 break;
1036 case WIRELESS_MODE_B:
Larry Finger547d0c32011-08-25 11:48:16 -05001037 if (channel > 14) {
Larry Finger94a79942011-08-23 19:00:42 -05001038 RT_TRACE(COMP_ERR, "WIRELESS_MODE_B but channel>14");
1039 return false;
1040 }
1041 break;
1042 case WIRELESS_MODE_G:
1043 case WIRELESS_MODE_N_24G:
Larry Finger547d0c32011-08-25 11:48:16 -05001044 if (channel > 14) {
Larry Finger94a79942011-08-23 19:00:42 -05001045 RT_TRACE(COMP_ERR, "WIRELESS_MODE_G but channel>14");
1046 return false;
1047 }
1048 break;
1049 }
1050
1051 priv->SwChnlInProgress = true;
1052 if (channel == 0)
1053 channel = 1;
1054
Larry Finger547d0c32011-08-25 11:48:16 -05001055 priv->chan = channel;
Larry Finger94a79942011-08-23 19:00:42 -05001056
Larry Finger547d0c32011-08-25 11:48:16 -05001057 priv->SwChnlStage = 0;
1058 priv->SwChnlStep = 0;
Larry Finger94a79942011-08-23 19:00:42 -05001059
Larry Finger547d0c32011-08-25 11:48:16 -05001060 if (!IS_NIC_DOWN(priv))
Larry Finger94a79942011-08-23 19:00:42 -05001061 rtl8192_SwChnl_WorkItem(dev);
Larry Finger94a79942011-08-23 19:00:42 -05001062 priv->SwChnlInProgress = false;
1063 return true;
1064}
1065
Larry Finger547d0c32011-08-25 11:48:16 -05001066static void CCK_Tx_Power_Track_BW_Switch_TSSI(struct net_device *dev)
Larry Finger94a79942011-08-23 19:00:42 -05001067{
1068 struct r8192_priv *priv = rtllib_priv(dev);
1069
Larry Finger547d0c32011-08-25 11:48:16 -05001070 switch (priv->CurrentChannelBW) {
1071 case HT_CHANNEL_WIDTH_20:
1072 priv->CCKPresentAttentuation =
1073 priv->CCKPresentAttentuation_20Mdefault +
1074 priv->CCKPresentAttentuation_difference;
1075
1076 if (priv->CCKPresentAttentuation >
1077 (CCKTxBBGainTableLength-1))
Larry Finger94a79942011-08-23 19:00:42 -05001078 priv->CCKPresentAttentuation =
Larry Finger547d0c32011-08-25 11:48:16 -05001079 CCKTxBBGainTableLength-1;
1080 if (priv->CCKPresentAttentuation < 0)
1081 priv->CCKPresentAttentuation = 0;
Larry Finger94a79942011-08-23 19:00:42 -05001082
Larry Finger547d0c32011-08-25 11:48:16 -05001083 RT_TRACE(COMP_POWER_TRACKING, "20M, priv->CCKPresent"
1084 "Attentuation = %d\n",
1085 priv->CCKPresentAttentuation);
Larry Finger94a79942011-08-23 19:00:42 -05001086
Larry Finger547d0c32011-08-25 11:48:16 -05001087 if (priv->rtllib->current_network.channel == 14 &&
1088 !priv->bcck_in_ch14) {
1089 priv->bcck_in_ch14 = true;
1090 dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
1091 } else if (priv->rtllib->current_network.channel !=
1092 14 && priv->bcck_in_ch14) {
1093 priv->bcck_in_ch14 = false;
1094 dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
1095 } else {
1096 dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
1097 }
Larry Finger94a79942011-08-23 19:00:42 -05001098 break;
1099
Larry Finger547d0c32011-08-25 11:48:16 -05001100 case HT_CHANNEL_WIDTH_20_40:
1101 priv->CCKPresentAttentuation =
1102 priv->CCKPresentAttentuation_40Mdefault +
1103 priv->CCKPresentAttentuation_difference;
1104
1105 RT_TRACE(COMP_POWER_TRACKING, "40M, priv->CCKPresent"
1106 "Attentuation = %d\n",
1107 priv->CCKPresentAttentuation);
1108 if (priv->CCKPresentAttentuation >
1109 (CCKTxBBGainTableLength - 1))
Larry Finger94a79942011-08-23 19:00:42 -05001110 priv->CCKPresentAttentuation =
Larry Finger547d0c32011-08-25 11:48:16 -05001111 CCKTxBBGainTableLength-1;
1112 if (priv->CCKPresentAttentuation < 0)
1113 priv->CCKPresentAttentuation = 0;
Larry Finger94a79942011-08-23 19:00:42 -05001114
Larry Finger547d0c32011-08-25 11:48:16 -05001115 if (priv->rtllib->current_network.channel == 14 &&
1116 !priv->bcck_in_ch14) {
1117 priv->bcck_in_ch14 = true;
1118 dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
1119 } else if (priv->rtllib->current_network.channel != 14
1120 && priv->bcck_in_ch14) {
1121 priv->bcck_in_ch14 = false;
1122 dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
1123 } else {
1124 dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
1125 }
Larry Finger94a79942011-08-23 19:00:42 -05001126 break;
1127 }
1128}
1129
Larry Finger94a79942011-08-23 19:00:42 -05001130static void CCK_Tx_Power_Track_BW_Switch_ThermalMeter(struct net_device *dev)
1131{
1132 struct r8192_priv *priv = rtllib_priv(dev);
1133
Larry Finger547d0c32011-08-25 11:48:16 -05001134 if (priv->rtllib->current_network.channel == 14 &&
1135 !priv->bcck_in_ch14)
Larry Finger94a79942011-08-23 19:00:42 -05001136 priv->bcck_in_ch14 = true;
Larry Finger547d0c32011-08-25 11:48:16 -05001137 else if (priv->rtllib->current_network.channel != 14 &&
1138 priv->bcck_in_ch14)
Larry Finger94a79942011-08-23 19:00:42 -05001139 priv->bcck_in_ch14 = false;
1140
Larry Finger547d0c32011-08-25 11:48:16 -05001141 switch (priv->CurrentChannelBW) {
1142 case HT_CHANNEL_WIDTH_20:
1143 if (priv->Record_CCK_20Mindex == 0)
1144 priv->Record_CCK_20Mindex = 6;
1145 priv->CCK_index = priv->Record_CCK_20Mindex;
1146 RT_TRACE(COMP_POWER_TRACKING, "20MHz, CCK_Tx_Power_Track_BW_"
1147 "Switch_ThermalMeter(),CCK_index = %d\n",
1148 priv->CCK_index);
1149 break;
Larry Finger94a79942011-08-23 19:00:42 -05001150
Larry Finger547d0c32011-08-25 11:48:16 -05001151 case HT_CHANNEL_WIDTH_20_40:
1152 priv->CCK_index = priv->Record_CCK_40Mindex;
1153 RT_TRACE(COMP_POWER_TRACKING, "40MHz, CCK_Tx_Power_Track_BW_"
1154 "Switch_ThermalMeter(), CCK_index = %d\n",
1155 priv->CCK_index);
1156 break;
Larry Finger94a79942011-08-23 19:00:42 -05001157 }
1158 dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
1159}
Larry Finger94a79942011-08-23 19:00:42 -05001160
1161static void CCK_Tx_Power_Track_BW_Switch(struct net_device *dev)
1162{
Larry Finger94a79942011-08-23 19:00:42 -05001163 struct r8192_priv *priv = rtllib_priv(dev);
Larry Finger94a79942011-08-23 19:00:42 -05001164
Larry Finger94a79942011-08-23 19:00:42 -05001165 if (priv->IC_Cut >= IC_VersionCut_D)
1166 CCK_Tx_Power_Track_BW_Switch_TSSI(dev);
1167 else
1168 CCK_Tx_Power_Track_BW_Switch_ThermalMeter(dev);
Larry Finger94a79942011-08-23 19:00:42 -05001169}
1170
1171void rtl8192_SetBWModeWorkItem(struct net_device *dev)
1172{
1173
1174 struct r8192_priv *priv = rtllib_priv(dev);
1175 u8 regBwOpMode;
1176
Larry Finger547d0c32011-08-25 11:48:16 -05001177 RT_TRACE(COMP_SWBW, "==>rtl8192_SetBWModeWorkItem() Switch to %s "
1178 "bandwidth\n", priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20 ?
1179 "20MHz" : "40MHz")
Larry Finger94a79942011-08-23 19:00:42 -05001180
1181
Larry Finger547d0c32011-08-25 11:48:16 -05001182 if (priv->rf_chip == RF_PSEUDO_11N) {
1183 priv->SetBWModeInProgress = false;
Larry Finger94a79942011-08-23 19:00:42 -05001184 return;
1185 }
Larry Finger547d0c32011-08-25 11:48:16 -05001186 if (IS_NIC_DOWN(priv)) {
1187 RT_TRACE(COMP_ERR, "%s(): ERR!! driver is not up\n", __func__);
Larry Finger94a79942011-08-23 19:00:42 -05001188 return;
1189 }
1190 regBwOpMode = read_nic_byte(dev, BW_OPMODE);
1191
Larry Finger547d0c32011-08-25 11:48:16 -05001192 switch (priv->CurrentChannelBW) {
1193 case HT_CHANNEL_WIDTH_20:
1194 regBwOpMode |= BW_OPMODE_20MHZ;
1195 write_nic_byte(dev, BW_OPMODE, regBwOpMode);
1196 break;
Larry Finger94a79942011-08-23 19:00:42 -05001197
Larry Finger547d0c32011-08-25 11:48:16 -05001198 case HT_CHANNEL_WIDTH_20_40:
1199 regBwOpMode &= ~BW_OPMODE_20MHZ;
1200 write_nic_byte(dev, BW_OPMODE, regBwOpMode);
1201 break;
Larry Finger94a79942011-08-23 19:00:42 -05001202
Larry Finger547d0c32011-08-25 11:48:16 -05001203 default:
1204 RT_TRACE(COMP_ERR, "SetChannelBandwidth819xUsb(): unknown "
1205 "Bandwidth: %#X\n", priv->CurrentChannelBW);
1206 break;
Larry Finger94a79942011-08-23 19:00:42 -05001207 }
1208
Larry Finger547d0c32011-08-25 11:48:16 -05001209 switch (priv->CurrentChannelBW) {
1210 case HT_CHANNEL_WIDTH_20:
1211 rtl8192_setBBreg(dev, rFPGA0_RFMOD, bRFMOD, 0x0);
1212 rtl8192_setBBreg(dev, rFPGA1_RFMOD, bRFMOD, 0x0);
Larry Finger94a79942011-08-23 19:00:42 -05001213
Larry Finger547d0c32011-08-25 11:48:16 -05001214 if (!priv->btxpower_tracking) {
1215 write_nic_dword(dev, rCCK0_TxFilter1, 0x1a1b0000);
1216 write_nic_dword(dev, rCCK0_TxFilter2, 0x090e1317);
1217 write_nic_dword(dev, rCCK0_DebugPort, 0x00000204);
1218 } else {
1219 CCK_Tx_Power_Track_BW_Switch(dev);
1220 }
Larry Finger94a79942011-08-23 19:00:42 -05001221
Larry Finger547d0c32011-08-25 11:48:16 -05001222 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x00100000, 1);
Larry Finger94a79942011-08-23 19:00:42 -05001223
Larry Finger547d0c32011-08-25 11:48:16 -05001224 break;
1225 case HT_CHANNEL_WIDTH_20_40:
1226 rtl8192_setBBreg(dev, rFPGA0_RFMOD, bRFMOD, 0x1);
1227 rtl8192_setBBreg(dev, rFPGA1_RFMOD, bRFMOD, 0x1);
Larry Finger94a79942011-08-23 19:00:42 -05001228
Larry Finger547d0c32011-08-25 11:48:16 -05001229 if (!priv->btxpower_tracking) {
1230 write_nic_dword(dev, rCCK0_TxFilter1, 0x35360000);
1231 write_nic_dword(dev, rCCK0_TxFilter2, 0x121c252e);
1232 write_nic_dword(dev, rCCK0_DebugPort, 0x00000409);
1233 } else {
1234 CCK_Tx_Power_Track_BW_Switch(dev);
1235 }
Larry Finger94a79942011-08-23 19:00:42 -05001236
Larry Finger547d0c32011-08-25 11:48:16 -05001237 rtl8192_setBBreg(dev, rCCK0_System, bCCKSideBand,
1238 (priv->nCur40MhzPrimeSC>>1));
1239 rtl8192_setBBreg(dev, rOFDM1_LSTF, 0xC00,
1240 priv->nCur40MhzPrimeSC);
Larry Finger94a79942011-08-23 19:00:42 -05001241
Larry Finger547d0c32011-08-25 11:48:16 -05001242 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x00100000, 0);
1243 break;
1244 default:
1245 RT_TRACE(COMP_ERR, "SetChannelBandwidth819xUsb(): unknown "
1246 "Bandwidth: %#X\n", priv->CurrentChannelBW);
1247 break;
Larry Finger94a79942011-08-23 19:00:42 -05001248
1249 }
1250
Larry Finger547d0c32011-08-25 11:48:16 -05001251 switch (priv->rf_chip) {
1252 case RF_8225:
1253 break;
Larry Finger94a79942011-08-23 19:00:42 -05001254
Larry Finger547d0c32011-08-25 11:48:16 -05001255 case RF_8256:
1256 PHY_SetRF8256Bandwidth(dev, priv->CurrentChannelBW);
1257 break;
Larry Finger94a79942011-08-23 19:00:42 -05001258
Larry Finger547d0c32011-08-25 11:48:16 -05001259 case RF_8258:
1260 break;
Larry Finger94a79942011-08-23 19:00:42 -05001261
Larry Finger547d0c32011-08-25 11:48:16 -05001262 case RF_PSEUDO_11N:
1263 break;
Larry Finger94a79942011-08-23 19:00:42 -05001264
Larry Finger547d0c32011-08-25 11:48:16 -05001265 default:
1266 RT_TRACE(COMP_ERR, "Unknown RFChipID: %d\n", priv->rf_chip);
1267 break;
Larry Finger94a79942011-08-23 19:00:42 -05001268 }
Mike McCormack4f6807e2011-07-11 08:56:20 +09001269
Larry Finger94a79942011-08-23 19:00:42 -05001270 atomic_dec(&(priv->rtllib->atm_swbw));
Larry Finger547d0c32011-08-25 11:48:16 -05001271 priv->SetBWModeInProgress = false;
Larry Finger94a79942011-08-23 19:00:42 -05001272
1273 RT_TRACE(COMP_SWBW, "<==SetBWMode819xUsb()");
1274}
1275
Larry Finger547d0c32011-08-25 11:48:16 -05001276void rtl8192_SetBWMode(struct net_device *dev, enum ht_channel_width Bandwidth,
1277 enum ht_extchnl_offset Offset)
Larry Finger94a79942011-08-23 19:00:42 -05001278{
1279 struct r8192_priv *priv = rtllib_priv(dev);
1280
1281
1282 if (priv->SetBWModeInProgress)
1283 return;
1284
Larry Finger547d0c32011-08-25 11:48:16 -05001285 atomic_inc(&(priv->rtllib->atm_swbw));
1286 priv->SetBWModeInProgress = true;
Larry Finger94a79942011-08-23 19:00:42 -05001287
1288 priv->CurrentChannelBW = Bandwidth;
1289
Larry Finger547d0c32011-08-25 11:48:16 -05001290 if (Offset == HT_EXTCHNL_OFFSET_LOWER)
Larry Finger94a79942011-08-23 19:00:42 -05001291 priv->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER;
Larry Finger547d0c32011-08-25 11:48:16 -05001292 else if (Offset == HT_EXTCHNL_OFFSET_UPPER)
Larry Finger94a79942011-08-23 19:00:42 -05001293 priv->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER;
1294 else
1295 priv->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
1296
1297 rtl8192_SetBWModeWorkItem(dev);
1298
1299}
1300
Larry Finger94a79942011-08-23 19:00:42 -05001301void InitialGain819xPci(struct net_device *dev, u8 Operation)
1302{
1303#define SCAN_RX_INITIAL_GAIN 0x17
1304#define POWER_DETECTION_TH 0x08
1305 struct r8192_priv *priv = rtllib_priv(dev);
Larry Finger547d0c32011-08-25 11:48:16 -05001306 u32 BitMask;
1307 u8 initial_gain;
Larry Finger94a79942011-08-23 19:00:42 -05001308
Larry Finger547d0c32011-08-25 11:48:16 -05001309 if (!IS_NIC_DOWN(priv)) {
1310 switch (Operation) {
1311 case IG_Backup:
1312 RT_TRACE(COMP_SCAN, "IG_Backup, backup the initial"
1313 " gain.\n");
1314 initial_gain = SCAN_RX_INITIAL_GAIN;
1315 BitMask = bMaskByte0;
1316 if (dm_digtable.dig_algorithm ==
1317 DIG_ALGO_BY_FALSE_ALARM)
1318 rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x8);
1319 priv->initgain_backup.xaagccore1 =
1320 (u8)rtl8192_QueryBBReg(dev, rOFDM0_XAAGCCore1,
1321 BitMask);
1322 priv->initgain_backup.xbagccore1 =
1323 (u8)rtl8192_QueryBBReg(dev, rOFDM0_XBAGCCore1,
1324 BitMask);
1325 priv->initgain_backup.xcagccore1 =
1326 (u8)rtl8192_QueryBBReg(dev, rOFDM0_XCAGCCore1,
1327 BitMask);
1328 priv->initgain_backup.xdagccore1 =
1329 (u8)rtl8192_QueryBBReg(dev, rOFDM0_XDAGCCore1,
1330 BitMask);
1331 BitMask = bMaskByte2;
1332 priv->initgain_backup.cca = (u8)rtl8192_QueryBBReg(dev,
1333 rCCK0_CCA, BitMask);
Larry Finger94a79942011-08-23 19:00:42 -05001334
Larry Finger547d0c32011-08-25 11:48:16 -05001335 RT_TRACE(COMP_SCAN, "Scan InitialGainBackup 0xc50 is"
1336 " %x\n", priv->initgain_backup.xaagccore1);
1337 RT_TRACE(COMP_SCAN, "Scan InitialGainBackup 0xc58 is"
1338 " %x\n", priv->initgain_backup.xbagccore1);
1339 RT_TRACE(COMP_SCAN, "Scan InitialGainBackup 0xc60 is"
1340 " %x\n", priv->initgain_backup.xcagccore1);
1341 RT_TRACE(COMP_SCAN, "Scan InitialGainBackup 0xc68 is"
1342 " %x\n", priv->initgain_backup.xdagccore1);
1343 RT_TRACE(COMP_SCAN, "Scan InitialGainBackup 0xa0a is"
1344 " %x\n", priv->initgain_backup.cca);
Larry Finger94a79942011-08-23 19:00:42 -05001345
Larry Finger547d0c32011-08-25 11:48:16 -05001346 RT_TRACE(COMP_SCAN, "Write scan initial gain = 0x%x\n",
1347 initial_gain);
1348 write_nic_byte(dev, rOFDM0_XAAGCCore1, initial_gain);
1349 write_nic_byte(dev, rOFDM0_XBAGCCore1, initial_gain);
1350 write_nic_byte(dev, rOFDM0_XCAGCCore1, initial_gain);
1351 write_nic_byte(dev, rOFDM0_XDAGCCore1, initial_gain);
1352 RT_TRACE(COMP_SCAN, "Write scan 0xa0a = 0x%x\n",
1353 POWER_DETECTION_TH);
1354 write_nic_byte(dev, 0xa0a, POWER_DETECTION_TH);
1355 break;
1356 case IG_Restore:
1357 RT_TRACE(COMP_SCAN, "IG_Restore, restore the initial "
1358 "gain.\n");
1359 BitMask = 0x7f;
1360 if (dm_digtable.dig_algorithm ==
1361 DIG_ALGO_BY_FALSE_ALARM)
1362 rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x8);
Larry Finger94a79942011-08-23 19:00:42 -05001363
Larry Finger547d0c32011-08-25 11:48:16 -05001364 rtl8192_setBBreg(dev, rOFDM0_XAAGCCore1, BitMask,
1365 (u32)priv->initgain_backup.xaagccore1);
1366 rtl8192_setBBreg(dev, rOFDM0_XBAGCCore1, BitMask,
1367 (u32)priv->initgain_backup.xbagccore1);
1368 rtl8192_setBBreg(dev, rOFDM0_XCAGCCore1, BitMask,
1369 (u32)priv->initgain_backup.xcagccore1);
1370 rtl8192_setBBreg(dev, rOFDM0_XDAGCCore1, BitMask,
1371 (u32)priv->initgain_backup.xdagccore1);
1372 BitMask = bMaskByte2;
1373 rtl8192_setBBreg(dev, rCCK0_CCA, BitMask,
1374 (u32)priv->initgain_backup.cca);
Larry Finger94a79942011-08-23 19:00:42 -05001375
Larry Finger547d0c32011-08-25 11:48:16 -05001376 RT_TRACE(COMP_SCAN, "Scan BBInitialGainRestore 0xc50"
1377 " is %x\n", priv->initgain_backup.xaagccore1);
1378 RT_TRACE(COMP_SCAN, "Scan BBInitialGainRestore 0xc58"
1379 " is %x\n", priv->initgain_backup.xbagccore1);
1380 RT_TRACE(COMP_SCAN, "Scan BBInitialGainRestore 0xc60"
1381 " is %x\n", priv->initgain_backup.xcagccore1);
1382 RT_TRACE(COMP_SCAN, "Scan BBInitialGainRestore 0xc68"
1383 " is %x\n", priv->initgain_backup.xdagccore1);
1384 RT_TRACE(COMP_SCAN, "Scan BBInitialGainRestore 0xa0a"
1385 " is %x\n", priv->initgain_backup.cca);
Larry Finger94a79942011-08-23 19:00:42 -05001386
Larry Finger547d0c32011-08-25 11:48:16 -05001387 rtl8192_phy_setTxPower(dev,
1388 priv->rtllib->current_network.channel);
Larry Finger94a79942011-08-23 19:00:42 -05001389
Larry Finger547d0c32011-08-25 11:48:16 -05001390 if (dm_digtable.dig_algorithm ==
1391 DIG_ALGO_BY_FALSE_ALARM)
1392 rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x1);
1393 break;
1394 default:
1395 RT_TRACE(COMP_SCAN, "Unknown IG Operation.\n");
1396 break;
Larry Finger94a79942011-08-23 19:00:42 -05001397 }
1398 }
1399}
1400
Larry Finger547d0c32011-08-25 11:48:16 -05001401void PHY_SetRtl8192eRfOff(struct net_device *dev)
Larry Finger94a79942011-08-23 19:00:42 -05001402{
1403
1404 rtl8192_setBBreg(dev, rFPGA0_XA_RFInterfaceOE, BIT4, 0x0);
1405 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0x300, 0x0);
1406 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x18, 0x0);
1407 rtl8192_setBBreg(dev, rOFDM0_TRxPathEnable, 0xf, 0x0);
1408 rtl8192_setBBreg(dev, rOFDM1_TRxPathEnable, 0xf, 0x0);
1409 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x60, 0x0);
1410 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x4, 0x0);
1411 write_nic_byte(dev, ANAPAR_FOR_8192PciE, 0x07);
1412
1413}
Larry Finger94a79942011-08-23 19:00:42 -05001414
Larry Finger49aab5f2011-08-25 14:07:05 -05001415static bool SetRFPowerState8190(struct net_device *dev,
1416 enum rt_rf_power_state eRFPowerState)
Larry Finger94a79942011-08-23 19:00:42 -05001417{
1418 struct r8192_priv *priv = rtllib_priv(dev);
Larry Finger547d0c32011-08-25 11:48:16 -05001419 struct rt_pwr_save_ctrl *pPSC = (struct rt_pwr_save_ctrl *)
1420 (&(priv->rtllib->PowerSaveControl));
Larry Finger94a79942011-08-23 19:00:42 -05001421 bool bResult = true;
1422 u8 i = 0, QueueID = 0;
1423 struct rtl8192_tx_ring *ring = NULL;
1424
1425 if (priv->SetRFPowerStateInProgress == true)
1426 return false;
1427 RT_TRACE(COMP_PS, "===========> SetRFPowerState8190()!\n");
1428 priv->SetRFPowerStateInProgress = true;
1429
Larry Finger547d0c32011-08-25 11:48:16 -05001430 switch (priv->rf_chip) {
1431 case RF_8256:
1432 switch (eRFPowerState) {
1433 case eRfOn:
1434 RT_TRACE(COMP_PS, "SetRFPowerState8190() eRfOn!\n");
1435 if ((priv->rtllib->eRFPowerState == eRfOff) &&
1436 RT_IN_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC)) {
1437 bool rtstatus = true;
1438 u32 InitilizeCount = 3;
1439 do {
1440 InitilizeCount--;
1441 priv->RegRfOff = false;
1442 rtstatus = NicIFEnableNIC(dev);
1443 } while ((rtstatus != true) &&
1444 (InitilizeCount > 0));
Larry Finger94a79942011-08-23 19:00:42 -05001445
Larry Finger547d0c32011-08-25 11:48:16 -05001446 if (rtstatus != true) {
1447 RT_TRACE(COMP_ERR, "%s():Initialize Ada"
1448 "pter fail,return\n",
1449 __func__);
1450 priv->SetRFPowerStateInProgress = false;
1451 return false;
1452 }
Larry Finger94a79942011-08-23 19:00:42 -05001453
Larry Finger547d0c32011-08-25 11:48:16 -05001454 RT_CLEAR_PS_LEVEL(pPSC,
1455 RT_RF_OFF_LEVL_HALT_NIC);
1456 } else {
Larry Finger94a79942011-08-23 19:00:42 -05001457 write_nic_byte(dev, ANAPAR, 0x37);
1458 mdelay(1);
Larry Finger547d0c32011-08-25 11:48:16 -05001459 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1,
1460 0x4, 0x1);
Larry Finger94a79942011-08-23 19:00:42 -05001461 priv->bHwRfOffAction = 0;
1462
Larry Finger547d0c32011-08-25 11:48:16 -05001463 rtl8192_setBBreg(dev, rFPGA0_XA_RFInterfaceOE,
1464 BIT4, 0x1);
1465 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4,
1466 0x300, 0x3);
1467 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1,
1468 0x18, 0x3);
1469 rtl8192_setBBreg(dev, rOFDM0_TRxPathEnable, 0x3,
1470 0x3);
1471 rtl8192_setBBreg(dev, rOFDM1_TRxPathEnable, 0x3,
1472 0x3);
1473 rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1,
1474 0x60, 0x3);
Larry Finger94a79942011-08-23 19:00:42 -05001475
Larry Finger547d0c32011-08-25 11:48:16 -05001476 }
1477
1478 break;
1479
1480 case eRfSleep:
1481 if (priv->rtllib->eRFPowerState == eRfOff)
1482 break;
1483
1484
1485 for (QueueID = 0, i = 0; QueueID < MAX_TX_QUEUE; ) {
1486 ring = &priv->tx_ring[QueueID];
1487
1488 if (skb_queue_len(&ring->queue) == 0) {
1489 QueueID++;
1490 continue;
1491 } else {
1492 RT_TRACE((COMP_POWER|COMP_RF), "eRf Off"
1493 "/Sleep: %d times TcbBusyQueue"
1494 "[%d] !=0 before doze!\n",
1495 (i+1), QueueID);
1496 udelay(10);
1497 i++;
Larry Finger94a79942011-08-23 19:00:42 -05001498 }
1499
Larry Finger547d0c32011-08-25 11:48:16 -05001500 if (i >= MAX_DOZE_WAITING_TIMES_9x) {
1501 RT_TRACE(COMP_POWER, "\n\n\n TimeOut!! "
1502 "SetRFPowerState8190(): eRfOff"
1503 ": %d times TcbBusyQueue[%d] "
1504 "!= 0 !!!\n",
1505 MAX_DOZE_WAITING_TIMES_9x,
1506 QueueID);
Larry Finger94a79942011-08-23 19:00:42 -05001507 break;
Larry Finger94a79942011-08-23 19:00:42 -05001508 }
Larry Finger94a79942011-08-23 19:00:42 -05001509 }
Larry Finger547d0c32011-08-25 11:48:16 -05001510 PHY_SetRtl8192eRfOff(dev);
1511 break;
Larry Finger94a79942011-08-23 19:00:42 -05001512
Larry Finger547d0c32011-08-25 11:48:16 -05001513 case eRfOff:
1514 RT_TRACE(COMP_PS, "SetRFPowerState8190() eRfOff/"
1515 "Sleep !\n");
Larry Finger94a79942011-08-23 19:00:42 -05001516
Larry Finger547d0c32011-08-25 11:48:16 -05001517 for (QueueID = 0, i = 0; QueueID < MAX_TX_QUEUE; ) {
1518 ring = &priv->tx_ring[QueueID];
Larry Finger94a79942011-08-23 19:00:42 -05001519
Larry Finger547d0c32011-08-25 11:48:16 -05001520 if (skb_queue_len(&ring->queue) == 0) {
1521 QueueID++;
1522 continue;
1523 } else {
1524 RT_TRACE(COMP_POWER, "eRf Off/Sleep: %d"
1525 " times TcbBusyQueue[%d] !=0 b"
1526 "efore doze!\n", (i+1),
1527 QueueID);
1528 udelay(10);
1529 i++;
Larry Finger94a79942011-08-23 19:00:42 -05001530 }
Larry Finger94a79942011-08-23 19:00:42 -05001531
Larry Finger547d0c32011-08-25 11:48:16 -05001532 if (i >= MAX_DOZE_WAITING_TIMES_9x) {
1533 RT_TRACE(COMP_POWER, "\n\n\n SetZebra: "
1534 "RFPowerState8185B(): eRfOff:"
1535 " %d times TcbBusyQueue[%d] "
1536 "!= 0 !!!\n",
1537 MAX_DOZE_WAITING_TIMES_9x,
1538 QueueID);
Larry Finger94a79942011-08-23 19:00:42 -05001539 break;
Larry Finger547d0c32011-08-25 11:48:16 -05001540 }
1541 }
Larry Finger94a79942011-08-23 19:00:42 -05001542
Larry Finger547d0c32011-08-25 11:48:16 -05001543 if (pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_HALT_NIC &&
1544 !RT_IN_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC)) {
1545 NicIFDisableNIC(dev);
1546 RT_SET_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC);
1547 } else if (!(pPSC->RegRfPsLevel &
1548 RT_RF_OFF_LEVL_HALT_NIC)) {
1549 PHY_SetRtl8192eRfOff(dev);
1550 }
1551
1552 break;
1553
1554 default:
1555 bResult = false;
1556 RT_TRACE(COMP_ERR, "SetRFPowerState8190(): unknow state"
1557 " to set: 0x%X!!!\n", eRFPowerState);
1558 break;
Larry Finger94a79942011-08-23 19:00:42 -05001559 }
1560
1561 break;
1562
Larry Finger547d0c32011-08-25 11:48:16 -05001563 default:
1564 RT_TRACE(COMP_ERR, "SetRFPowerState8190(): Unknown RF type\n");
1565 break;
Larry Finger94a79942011-08-23 19:00:42 -05001566 }
1567
1568 if (bResult) {
1569 priv->rtllib->eRFPowerState = eRFPowerState;
1570
Larry Fingerd0643072011-07-12 22:08:32 -05001571 switch (priv->rf_chip) {
1572 case RF_8256:
Larry Finger94a79942011-08-23 19:00:42 -05001573 break;
1574
Larry Fingerd0643072011-07-12 22:08:32 -05001575 default:
Larry Finger547d0c32011-08-25 11:48:16 -05001576 RT_TRACE(COMP_ERR, "SetRFPowerState8190(): Unknown "
1577 "RF type\n");
Larry Fingerd0643072011-07-12 22:08:32 -05001578 break;
Larry Finger94a79942011-08-23 19:00:42 -05001579 }
1580 }
1581
1582 priv->SetRFPowerStateInProgress = false;
Larry Finger547d0c32011-08-25 11:48:16 -05001583 RT_TRACE(COMP_PS, "<=========== SetRFPowerState8190() bResult = %d!\n",
1584 bResult);
Larry Finger94a79942011-08-23 19:00:42 -05001585 return bResult;
1586}
1587
Larry Finger547d0c32011-08-25 11:48:16 -05001588bool SetRFPowerState(struct net_device *dev,
1589 enum rt_rf_power_state eRFPowerState)
Larry Finger94a79942011-08-23 19:00:42 -05001590{
1591 struct r8192_priv *priv = rtllib_priv(dev);
1592
1593 bool bResult = false;
1594
Larry Finger547d0c32011-08-25 11:48:16 -05001595 RT_TRACE(COMP_PS, "---------> SetRFPowerState(): eRFPowerState(%d)\n",
1596 eRFPowerState);
1597 if (eRFPowerState == priv->rtllib->eRFPowerState &&
1598 priv->bHwRfOffAction == 0) {
1599 RT_TRACE(COMP_PS, "<--------- SetRFPowerState(): discard the "
1600 "request for eRFPowerState(%d) is the same.\n",
1601 eRFPowerState);
Larry Finger94a79942011-08-23 19:00:42 -05001602 return bResult;
1603 }
1604
1605 bResult = SetRFPowerState8190(dev, eRFPowerState);
1606
Larry Finger547d0c32011-08-25 11:48:16 -05001607 RT_TRACE(COMP_PS, "<--------- SetRFPowerState(): bResult(%d)\n",
1608 bResult);
Larry Finger94a79942011-08-23 19:00:42 -05001609
1610 return bResult;
1611}
Larry Finger94a79942011-08-23 19:00:42 -05001612
Larry Finger49aab5f2011-08-25 14:07:05 -05001613void PHY_ScanOperationBackup8192(struct net_device *dev, u8 Operation)
Larry Finger94a79942011-08-23 19:00:42 -05001614{
1615 struct r8192_priv *priv = rtllib_priv(dev);
1616
1617 if (priv->up) {
1618 switch (Operation) {
Larry Finger547d0c32011-08-25 11:48:16 -05001619 case SCAN_OPT_BACKUP:
1620 priv->rtllib->InitialGainHandler(dev, IG_Backup);
1621 break;
Larry Finger94a79942011-08-23 19:00:42 -05001622
Larry Finger547d0c32011-08-25 11:48:16 -05001623 case SCAN_OPT_RESTORE:
1624 priv->rtllib->InitialGainHandler(dev, IG_Restore);
1625 break;
Larry Finger94a79942011-08-23 19:00:42 -05001626
Larry Finger547d0c32011-08-25 11:48:16 -05001627 default:
1628 RT_TRACE(COMP_SCAN, "Unknown Scan Backup Operation.\n");
1629 break;
Larry Finger94a79942011-08-23 19:00:42 -05001630 }
1631 }
1632
1633}