blob: dde4922614511adfcd73af7865ce14487aa98362 [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 *
Larry Finger94a79942011-08-23 19:00:42 -05009 * The full GNU General Public License is included in this distribution in the
10 * file called LICENSE.
11 *
12 * Contact Information:
13 * wlanfae <wlanfae@realtek.com>
14******************************************************************************/
Larry Finger94a79942011-08-23 19:00:42 -050015
Mateusz Kulikowski77b6c422015-09-20 21:04:32 +020016#include <linux/bitops.h>
Larry Finger94a79942011-08-23 19:00:42 -050017#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"
Larry Finger94a79942011-08-23 19:00:42 -050023
Larry Finger94a79942011-08-23 19:00:42 -050024#include "r8192E_hwimg.h"
Larry Finger94a79942011-08-23 19:00:42 -050025
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/*************************Define local function prototype**********************/
45
Mateusz Kulikowski5269f552015-09-20 10:13:18 +020046static u32 _rtl92e_phy_rf_fw_read(struct net_device *dev,
47 enum rf90_radio_path eRFPath, u32 Offset);
Mateusz Kulikowskif9570762015-09-20 10:13:19 +020048static void _rtl92e_phy_rf_fw_write(struct net_device *dev,
49 enum rf90_radio_path eRFPath, u32 Offset,
50 u32 Data);
Larry Finger49aab5f2011-08-25 14:07:05 -050051
Mateusz Kulikowskie8411ff2015-09-20 10:14:05 +020052static u32 _rtl92e_calculate_bit_shift(u32 dwBitMask)
Larry Finger94a79942011-08-23 19:00:42 -050053{
Mateusz Kulikowski77b6c422015-09-20 21:04:32 +020054 if (!dwBitMask)
55 return 32;
56 return ffs(dwBitMask) - 1;
Larry Finger94a79942011-08-23 19:00:42 -050057}
Larry Finger547d0c32011-08-25 11:48:16 -050058
Mateusz Kulikowski5948d1f2015-07-19 19:27:47 +020059u8 rtl92e_is_legal_rf_path(struct net_device *dev, u32 eRFPath)
Larry Finger94a79942011-08-23 19:00:42 -050060{
61 u8 ret = 1;
62 struct r8192_priv *priv = rtllib_priv(dev);
Matthew Casey3a6b70c2014-08-22 06:27:52 -040063
Larry Finger94a79942011-08-23 19:00:42 -050064 if (priv->rf_type == RF_2T4R)
65 ret = 0;
Larry Finger547d0c32011-08-25 11:48:16 -050066 else if (priv->rf_type == RF_1T2R) {
Larry Finger94a79942011-08-23 19:00:42 -050067 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 }
Larry Finger94a79942011-08-23 19:00:42 -050072 return ret;
73}
Larry Finger547d0c32011-08-25 11:48:16 -050074
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +020075void rtl92e_set_bb_reg(struct net_device *dev, u32 dwRegAddr, u32 dwBitMask,
76 u32 dwData)
Larry Finger94a79942011-08-23 19:00:42 -050077{
78
79 u32 OriginalValue, BitShift, NewValue;
80
Larry Finger547d0c32011-08-25 11:48:16 -050081 if (dwBitMask != bMaskDWord) {
Mateusz Kulikowski99aa47e2015-07-19 19:28:10 +020082 OriginalValue = rtl92e_readl(dev, dwRegAddr);
Mateusz Kulikowskie8411ff2015-09-20 10:14:05 +020083 BitShift = _rtl92e_calculate_bit_shift(dwBitMask);
Larry Finger547d0c32011-08-25 11:48:16 -050084 NewValue = (((OriginalValue) & (~dwBitMask)) |
85 (dwData << BitShift));
Mateusz Kulikowski8ea54102015-07-19 19:28:27 +020086 rtl92e_writel(dev, dwRegAddr, NewValue);
Larry Finger547d0c32011-08-25 11:48:16 -050087 } else
Mateusz Kulikowski8ea54102015-07-19 19:28:27 +020088 rtl92e_writel(dev, dwRegAddr, dwData);
Larry Finger94a79942011-08-23 19:00:42 -050089}
Larry Finger547d0c32011-08-25 11:48:16 -050090
Mateusz Kulikowski3c351fe2015-07-19 19:27:56 +020091u32 rtl92e_get_bb_reg(struct net_device *dev, u32 dwRegAddr, u32 dwBitMask)
Larry Finger94a79942011-08-23 19:00:42 -050092{
Amitoj Kaur Chawla10172142015-10-31 20:22:03 +053093 u32 OriginalValue, BitShift;
Larry Finger94a79942011-08-23 19:00:42 -050094
Mateusz Kulikowski99aa47e2015-07-19 19:28:10 +020095 OriginalValue = rtl92e_readl(dev, dwRegAddr);
Mateusz Kulikowskie8411ff2015-09-20 10:14:05 +020096 BitShift = _rtl92e_calculate_bit_shift(dwBitMask);
Larry Finger94a79942011-08-23 19:00:42 -050097
Amitoj Kaur Chawla10172142015-10-31 20:22:03 +053098 return (OriginalValue & dwBitMask) >> BitShift;
Larry Finger94a79942011-08-23 19:00:42 -050099}
Mateusz Kulikowski6edb1762015-09-20 10:13:22 +0200100
101static u32 _rtl92e_phy_rf_read(struct net_device *dev,
102 enum rf90_radio_path eRFPath, u32 Offset)
Larry Finger94a79942011-08-23 19:00:42 -0500103{
104 struct r8192_priv *priv = rtllib_priv(dev);
105 u32 ret = 0;
106 u32 NewOffset = 0;
Larry Finger547d0c32011-08-25 11:48:16 -0500107 struct bb_reg_definition *pPhyReg = &priv->PHYRegDef[eRFPath];
Matthew Casey3a6b70c2014-08-22 06:27:52 -0400108
Larry Finger94a79942011-08-23 19:00:42 -0500109 Offset &= 0x3f;
110
Larry Finger547d0c32011-08-25 11:48:16 -0500111 if (priv->rf_chip == RF_8256) {
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +0200112 rtl92e_set_bb_reg(dev, rFPGA0_AnalogParameter4, 0xf00, 0x0);
Larry Finger547d0c32011-08-25 11:48:16 -0500113 if (Offset >= 31) {
Larry Finger94a79942011-08-23 19:00:42 -0500114 priv->RfReg0Value[eRFPath] |= 0x140;
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +0200115 rtl92e_set_bb_reg(dev, pPhyReg->rf3wireOffset,
116 bMaskDWord,
117 (priv->RfReg0Value[eRFPath]<<16));
Larry Finger547d0c32011-08-25 11:48:16 -0500118 NewOffset = Offset - 30;
119 } else if (Offset >= 16) {
Larry Finger94a79942011-08-23 19:00:42 -0500120 priv->RfReg0Value[eRFPath] |= 0x100;
121 priv->RfReg0Value[eRFPath] &= (~0x40);
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +0200122 rtl92e_set_bb_reg(dev, pPhyReg->rf3wireOffset,
123 bMaskDWord,
124 (priv->RfReg0Value[eRFPath]<<16));
Larry Finger94a79942011-08-23 19:00:42 -0500125
126 NewOffset = Offset - 15;
Larry Finger547d0c32011-08-25 11:48:16 -0500127 } else
Larry Finger94a79942011-08-23 19:00:42 -0500128 NewOffset = Offset;
Larry Finger547d0c32011-08-25 11:48:16 -0500129 } else {
Mateusz Kulikowski08223392015-03-17 00:00:48 +0100130 RT_TRACE((COMP_PHY|COMP_ERR),
131 "check RF type here, need to be 8256\n");
Larry Finger94a79942011-08-23 19:00:42 -0500132 NewOffset = Offset;
133 }
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +0200134 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);
Larry Finger94a79942011-08-23 19:00:42 -0500138
Larry Finger547d0c32011-08-25 11:48:16 -0500139 mdelay(1);
Larry Finger94a79942011-08-23 19:00:42 -0500140
Mateusz Kulikowski3c351fe2015-07-19 19:27:56 +0200141 ret = rtl92e_get_bb_reg(dev, pPhyReg->rfLSSIReadBack,
142 bLSSIReadBackData);
Larry Finger94a79942011-08-23 19:00:42 -0500143
Larry Finger547d0c32011-08-25 11:48:16 -0500144 if (priv->rf_chip == RF_8256) {
Larry Finger94a79942011-08-23 19:00:42 -0500145 priv->RfReg0Value[eRFPath] &= 0xebf;
146
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +0200147 rtl92e_set_bb_reg(dev, pPhyReg->rf3wireOffset, bMaskDWord,
148 (priv->RfReg0Value[eRFPath] << 16));
Larry Finger94a79942011-08-23 19:00:42 -0500149
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +0200150 rtl92e_set_bb_reg(dev, rFPGA0_AnalogParameter4, 0x300, 0x3);
Larry Finger94a79942011-08-23 19:00:42 -0500151 }
152
153
154 return ret;
155
156}
157
Mateusz Kulikowski6c2d5ae2015-09-20 10:13:23 +0200158static void _rtl92e_phy_rf_write(struct net_device *dev,
159 enum rf90_radio_path eRFPath, u32 Offset,
160 u32 Data)
Larry Finger94a79942011-08-23 19:00:42 -0500161{
162 struct r8192_priv *priv = rtllib_priv(dev);
163 u32 DataAndAddr = 0, NewOffset = 0;
Larry Finger9bf6e4c2011-07-18 21:16:51 -0500164 struct bb_reg_definition *pPhyReg = &priv->PHYRegDef[eRFPath];
Larry Finger94a79942011-08-23 19:00:42 -0500165
166 Offset &= 0x3f;
Larry Finger547d0c32011-08-25 11:48:16 -0500167 if (priv->rf_chip == RF_8256) {
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +0200168 rtl92e_set_bb_reg(dev, rFPGA0_AnalogParameter4, 0xf00, 0x0);
Larry Finger94a79942011-08-23 19:00:42 -0500169
Larry Finger547d0c32011-08-25 11:48:16 -0500170 if (Offset >= 31) {
Larry Finger94a79942011-08-23 19:00:42 -0500171 priv->RfReg0Value[eRFPath] |= 0x140;
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +0200172 rtl92e_set_bb_reg(dev, pPhyReg->rf3wireOffset,
173 bMaskDWord,
174 (priv->RfReg0Value[eRFPath] << 16));
Larry Finger94a79942011-08-23 19:00:42 -0500175 NewOffset = Offset - 30;
Larry Finger547d0c32011-08-25 11:48:16 -0500176 } else if (Offset >= 16) {
Larry Finger94a79942011-08-23 19:00:42 -0500177 priv->RfReg0Value[eRFPath] |= 0x100;
178 priv->RfReg0Value[eRFPath] &= (~0x40);
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +0200179 rtl92e_set_bb_reg(dev, pPhyReg->rf3wireOffset,
180 bMaskDWord,
181 (priv->RfReg0Value[eRFPath] << 16));
Larry Finger94a79942011-08-23 19:00:42 -0500182 NewOffset = Offset - 15;
Larry Finger547d0c32011-08-25 11:48:16 -0500183 } else
Larry Finger94a79942011-08-23 19:00:42 -0500184 NewOffset = Offset;
Larry Finger547d0c32011-08-25 11:48:16 -0500185 } else {
Mateusz Kulikowski08223392015-03-17 00:00:48 +0100186 RT_TRACE((COMP_PHY|COMP_ERR),
187 "check RF type here, need to be 8256\n");
Larry Finger94a79942011-08-23 19:00:42 -0500188 NewOffset = Offset;
189 }
190
191 DataAndAddr = (Data<<16) | (NewOffset&0x3f);
192
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +0200193 rtl92e_set_bb_reg(dev, pPhyReg->rf3wireOffset, bMaskDWord, DataAndAddr);
Larry Finger94a79942011-08-23 19:00:42 -0500194
Larry Finger547d0c32011-08-25 11:48:16 -0500195 if (Offset == 0x0)
Larry Finger94a79942011-08-23 19:00:42 -0500196 priv->RfReg0Value[eRFPath] = Data;
197
Larry Finger547d0c32011-08-25 11:48:16 -0500198 if (priv->rf_chip == RF_8256) {
199 if (Offset != 0) {
Larry Finger94a79942011-08-23 19:00:42 -0500200 priv->RfReg0Value[eRFPath] &= 0xebf;
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +0200201 rtl92e_set_bb_reg(dev, pPhyReg->rf3wireOffset,
202 bMaskDWord,
203 (priv->RfReg0Value[eRFPath] << 16));
Larry Finger94a79942011-08-23 19:00:42 -0500204 }
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +0200205 rtl92e_set_bb_reg(dev, rFPGA0_AnalogParameter4, 0x300, 0x3);
Larry Finger94a79942011-08-23 19:00:42 -0500206 }
Larry Finger94a79942011-08-23 19:00:42 -0500207}
208
Mateusz Kulikowskib0e044f2015-07-19 19:27:53 +0200209void rtl92e_set_rf_reg(struct net_device *dev, enum rf90_radio_path eRFPath,
210 u32 RegAddr, u32 BitMask, u32 Data)
Larry Finger94a79942011-08-23 19:00:42 -0500211{
212 struct r8192_priv *priv = rtllib_priv(dev);
213 u32 Original_Value, BitShift, New_Value;
214
Mateusz Kulikowski5948d1f2015-07-19 19:27:47 +0200215 if (!rtl92e_is_legal_rf_path(dev, eRFPath))
Larry Finger94a79942011-08-23 19:00:42 -0500216 return;
Larry Finger94a79942011-08-23 19:00:42 -0500217 if (priv->rtllib->eRFPowerState != eRfOn && !priv->being_init_adapter)
218 return;
Larry Finger94a79942011-08-23 19:00:42 -0500219
220 RT_TRACE(COMP_PHY, "FW RF CTRL is not ready now\n");
Larry Finger547d0c32011-08-25 11:48:16 -0500221 if (priv->Rf_Mode == RF_OP_By_FW) {
222 if (BitMask != bMask12Bits) {
Mateusz Kulikowski5269f552015-09-20 10:13:18 +0200223 Original_Value = _rtl92e_phy_rf_fw_read(dev, eRFPath,
224 RegAddr);
Mateusz Kulikowskie8411ff2015-09-20 10:14:05 +0200225 BitShift = _rtl92e_calculate_bit_shift(BitMask);
Larry Finger547d0c32011-08-25 11:48:16 -0500226 New_Value = (((Original_Value) & (~BitMask)) |
227 (Data << BitShift));
Larry Finger94a79942011-08-23 19:00:42 -0500228
Mateusz Kulikowskif9570762015-09-20 10:13:19 +0200229 _rtl92e_phy_rf_fw_write(dev, eRFPath, RegAddr,
230 New_Value);
Larry Finger547d0c32011-08-25 11:48:16 -0500231 } else
Mateusz Kulikowskif9570762015-09-20 10:13:19 +0200232 _rtl92e_phy_rf_fw_write(dev, eRFPath, RegAddr, Data);
Larry Finger94a79942011-08-23 19:00:42 -0500233 udelay(200);
234
Larry Finger547d0c32011-08-25 11:48:16 -0500235 } else {
236 if (BitMask != bMask12Bits) {
Mateusz Kulikowski6edb1762015-09-20 10:13:22 +0200237 Original_Value = _rtl92e_phy_rf_read(dev, eRFPath,
238 RegAddr);
Mateusz Kulikowskie8411ff2015-09-20 10:14:05 +0200239 BitShift = _rtl92e_calculate_bit_shift(BitMask);
Larry Finger547d0c32011-08-25 11:48:16 -0500240 New_Value = (((Original_Value) & (~BitMask)) |
241 (Data << BitShift));
Larry Finger94a79942011-08-23 19:00:42 -0500242
Mateusz Kulikowski6c2d5ae2015-09-20 10:13:23 +0200243 _rtl92e_phy_rf_write(dev, eRFPath, RegAddr, New_Value);
Larry Finger547d0c32011-08-25 11:48:16 -0500244 } else
Mateusz Kulikowski6c2d5ae2015-09-20 10:13:23 +0200245 _rtl92e_phy_rf_write(dev, eRFPath, RegAddr, Data);
Larry Finger94a79942011-08-23 19:00:42 -0500246 }
Larry Finger94a79942011-08-23 19:00:42 -0500247}
248
Mateusz Kulikowski4d415de2015-07-19 19:27:51 +0200249u32 rtl92e_get_rf_reg(struct net_device *dev, enum rf90_radio_path eRFPath,
250 u32 RegAddr, u32 BitMask)
Larry Finger94a79942011-08-23 19:00:42 -0500251{
252 u32 Original_Value, Readback_Value, BitShift;
253 struct r8192_priv *priv = rtllib_priv(dev);
Matthew Casey3a6b70c2014-08-22 06:27:52 -0400254
Mateusz Kulikowski5948d1f2015-07-19 19:27:47 +0200255 if (!rtl92e_is_legal_rf_path(dev, eRFPath))
Larry Finger94a79942011-08-23 19:00:42 -0500256 return 0;
Larry Finger94a79942011-08-23 19:00:42 -0500257 if (priv->rtllib->eRFPowerState != eRfOn && !priv->being_init_adapter)
258 return 0;
Binoy Jayan53334962016-06-01 14:56:54 +0530259 mutex_lock(&priv->rf_mutex);
Larry Finger547d0c32011-08-25 11:48:16 -0500260 if (priv->Rf_Mode == RF_OP_By_FW) {
Mateusz Kulikowski5269f552015-09-20 10:13:18 +0200261 Original_Value = _rtl92e_phy_rf_fw_read(dev, eRFPath, RegAddr);
Larry Finger94a79942011-08-23 19:00:42 -0500262 udelay(200);
Larry Finger547d0c32011-08-25 11:48:16 -0500263 } else {
Mateusz Kulikowski6edb1762015-09-20 10:13:22 +0200264 Original_Value = _rtl92e_phy_rf_read(dev, eRFPath, RegAddr);
Larry Finger94a79942011-08-23 19:00:42 -0500265 }
Mateusz Kulikowskie8411ff2015-09-20 10:14:05 +0200266 BitShift = _rtl92e_calculate_bit_shift(BitMask);
Larry Finger94a79942011-08-23 19:00:42 -0500267 Readback_Value = (Original_Value & BitMask) >> BitShift;
Binoy Jayan53334962016-06-01 14:56:54 +0530268 mutex_unlock(&priv->rf_mutex);
Larry Finger547d0c32011-08-25 11:48:16 -0500269 return Readback_Value;
Larry Finger94a79942011-08-23 19:00:42 -0500270}
271
Mateusz Kulikowski5269f552015-09-20 10:13:18 +0200272static u32 _rtl92e_phy_rf_fw_read(struct net_device *dev,
273 enum rf90_radio_path eRFPath, u32 Offset)
Larry Finger94a79942011-08-23 19:00:42 -0500274{
Larry Finger94a79942011-08-23 19:00:42 -0500275 u32 Data = 0;
276 u8 time = 0;
Matthew Casey3a6b70c2014-08-22 06:27:52 -0400277
Larry Finger547d0c32011-08-25 11:48:16 -0500278 Data |= ((Offset & 0xFF) << 12);
279 Data |= ((eRFPath & 0x3) << 20);
Larry Finger94a79942011-08-23 19:00:42 -0500280 Data |= 0x80000000;
Mateusz Kulikowski99aa47e2015-07-19 19:28:10 +0200281 while (rtl92e_readl(dev, QPNR) & 0x80000000) {
Larry Finger94a79942011-08-23 19:00:42 -0500282 if (time++ < 100)
Larry Finger94a79942011-08-23 19:00:42 -0500283 udelay(10);
Larry Finger94a79942011-08-23 19:00:42 -0500284 else
285 break;
286 }
Mateusz Kulikowski8ea54102015-07-19 19:28:27 +0200287 rtl92e_writel(dev, QPNR, Data);
Mateusz Kulikowski99aa47e2015-07-19 19:28:10 +0200288 while (rtl92e_readl(dev, QPNR) & 0x80000000) {
Larry Finger94a79942011-08-23 19:00:42 -0500289 if (time++ < 100)
Larry Finger94a79942011-08-23 19:00:42 -0500290 udelay(10);
Larry Finger94a79942011-08-23 19:00:42 -0500291 else
Larry Finger547d0c32011-08-25 11:48:16 -0500292 return 0;
Larry Finger94a79942011-08-23 19:00:42 -0500293 }
Mateusz Kulikowski99aa47e2015-07-19 19:28:10 +0200294 return rtl92e_readl(dev, RF_DATA);
Larry Finger94a79942011-08-23 19:00:42 -0500295
Mateusz Kulikowski14b40d92015-04-01 00:24:37 +0200296}
Larry Finger94a79942011-08-23 19:00:42 -0500297
Mateusz Kulikowskif9570762015-09-20 10:13:19 +0200298static void _rtl92e_phy_rf_fw_write(struct net_device *dev,
299 enum rf90_radio_path eRFPath, u32 Offset,
300 u32 Data)
Larry Finger94a79942011-08-23 19:00:42 -0500301{
302 u8 time = 0;
303
Larry Finger547d0c32011-08-25 11:48:16 -0500304 Data |= ((Offset & 0xFF) << 12);
305 Data |= ((eRFPath & 0x3) << 20);
Larry Finger94a79942011-08-23 19:00:42 -0500306 Data |= 0x400000;
307 Data |= 0x80000000;
308
Mateusz Kulikowski99aa47e2015-07-19 19:28:10 +0200309 while (rtl92e_readl(dev, QPNR) & 0x80000000) {
Larry Finger94a79942011-08-23 19:00:42 -0500310 if (time++ < 100)
Larry Finger94a79942011-08-23 19:00:42 -0500311 udelay(10);
Larry Finger94a79942011-08-23 19:00:42 -0500312 else
313 break;
314 }
Mateusz Kulikowski8ea54102015-07-19 19:28:27 +0200315 rtl92e_writel(dev, QPNR, Data);
Larry Finger94a79942011-08-23 19:00:42 -0500316
Mateusz Kulikowski14b40d92015-04-01 00:24:37 +0200317}
Larry Finger94a79942011-08-23 19:00:42 -0500318
319
Mateusz Kulikowski0efe7102015-07-19 19:27:48 +0200320void rtl92e_config_mac(struct net_device *dev)
Larry Finger94a79942011-08-23 19:00:42 -0500321{
322 u32 dwArrayLen = 0, i = 0;
Larry Finger547d0c32011-08-25 11:48:16 -0500323 u32 *pdwArray = NULL;
Larry Finger94a79942011-08-23 19:00:42 -0500324 struct r8192_priv *priv = rtllib_priv(dev);
Larry Finger547d0c32011-08-25 11:48:16 -0500325
326 if (priv->bTXPowerDataReadFromEEPORM) {
Larry Finger94a79942011-08-23 19:00:42 -0500327 RT_TRACE(COMP_PHY, "Rtl819XMACPHY_Array_PG\n");
328 dwArrayLen = MACPHY_Array_PGLength;
329 pdwArray = Rtl819XMACPHY_Array_PG;
330
Larry Finger547d0c32011-08-25 11:48:16 -0500331 } else {
332 RT_TRACE(COMP_PHY, "Read rtl819XMACPHY_Array\n");
Larry Finger94a79942011-08-23 19:00:42 -0500333 dwArrayLen = MACPHY_ArrayLength;
334 pdwArray = Rtl819XMACPHY_Array;
335 }
Larry Finger547d0c32011-08-25 11:48:16 -0500336 for (i = 0; i < dwArrayLen; i += 3) {
Mateusz Kulikowski08223392015-03-17 00:00:48 +0100337 RT_TRACE(COMP_DBG,
338 "The Rtl8190MACPHY_Array[0] is %x Rtl8190MACPHY_Array[1] is %x Rtl8190MACPHY_Array[2] is %x\n",
Larry Finger547d0c32011-08-25 11:48:16 -0500339 pdwArray[i], pdwArray[i+1], pdwArray[i+2]);
Larry Finger94a79942011-08-23 19:00:42 -0500340 if (pdwArray[i] == 0x318)
Larry Finger94a79942011-08-23 19:00:42 -0500341 pdwArray[i+2] = 0x00000800;
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +0200342 rtl92e_set_bb_reg(dev, pdwArray[i], pdwArray[i+1],
343 pdwArray[i+2]);
Larry Finger94a79942011-08-23 19:00:42 -0500344 }
345 return;
346
347}
348
Mateusz Kulikowskia059e472015-09-20 10:13:20 +0200349static void _rtl92e_phy_config_bb(struct net_device *dev, u8 ConfigType)
Larry Finger94a79942011-08-23 19:00:42 -0500350{
351 int i;
Larry Finger547d0c32011-08-25 11:48:16 -0500352 u32 *Rtl819XPHY_REGArray_Table = NULL;
353 u32 *Rtl819XAGCTAB_Array_Table = NULL;
354 u16 AGCTAB_ArrayLen, PHY_REGArrayLen = 0;
Larry Finger94a79942011-08-23 19:00:42 -0500355 struct r8192_priv *priv = rtllib_priv(dev);
Larry Finger547d0c32011-08-25 11:48:16 -0500356
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;
Larry Finger94a79942011-08-23 19:00:42 -0500365 }
366
Larry Finger547d0c32011-08-25 11:48:16 -0500367 if (ConfigType == BaseBand_Config_PHY_REG) {
368 for (i = 0; i < PHY_REGArrayLen; i += 2) {
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +0200369 rtl92e_set_bb_reg(dev, Rtl819XPHY_REGArray_Table[i],
370 bMaskDWord,
371 Rtl819XPHY_REGArray_Table[i+1]);
Mateusz Kulikowski08223392015-03-17 00:00:48 +0100372 RT_TRACE(COMP_DBG,
373 "i: %x, The Rtl819xUsbPHY_REGArray[0] is %x Rtl819xUsbPHY_REGArray[1] is %x\n",
Larry Finger547d0c32011-08-25 11:48:16 -0500374 i, Rtl819XPHY_REGArray_Table[i],
375 Rtl819XPHY_REGArray_Table[i+1]);
Larry Finger94a79942011-08-23 19:00:42 -0500376 }
Larry Finger547d0c32011-08-25 11:48:16 -0500377 } else if (ConfigType == BaseBand_Config_AGC_TAB) {
378 for (i = 0; i < AGCTAB_ArrayLen; i += 2) {
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +0200379 rtl92e_set_bb_reg(dev, Rtl819XAGCTAB_Array_Table[i],
380 bMaskDWord,
381 Rtl819XAGCTAB_Array_Table[i+1]);
Mateusz Kulikowski08223392015-03-17 00:00:48 +0100382 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],
Larry Finger547d0c32011-08-25 11:48:16 -0500385 Rtl819XAGCTAB_Array_Table[i+1]);
Larry Finger94a79942011-08-23 19:00:42 -0500386 }
387 }
Larry Finger94a79942011-08-23 19:00:42 -0500388}
Larry Finger547d0c32011-08-25 11:48:16 -0500389
Mateusz Kulikowski003486f2015-09-20 10:14:06 +0200390static void _rtl92e_init_bb_rf_reg_def(struct net_device *dev)
Larry Finger94a79942011-08-23 19:00:42 -0500391{
392 struct r8192_priv *priv = rtllib_priv(dev);
Larry Finger547d0c32011-08-25 11:48:16 -0500393
Larry Finger94a79942011-08-23 19:00:42 -0500394 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}
Larry Finger547d0c32011-08-25 11:48:16 -0500480
Mateusz Kulikowskie21d14d2015-07-19 19:27:46 +0200481bool rtl92e_check_bb_and_rf(struct net_device *dev, enum hw90_block CheckBlock,
482 enum rf90_radio_path eRFPath)
Larry Finger94a79942011-08-23 19:00:42 -0500483{
484 bool ret = true;
485 u32 i, CheckTimes = 4, dwRegRead = 0;
486 u32 WriteAddr[4];
487 u32 WriteData[] = {0xfffff027, 0xaa55a02f, 0x00000027, 0x55aa502f};
Larry Finger547d0c32011-08-25 11:48:16 -0500488
Larry Finger94a79942011-08-23 19:00:42 -0500489 WriteAddr[HW90_BLOCK_MAC] = 0x100;
490 WriteAddr[HW90_BLOCK_PHY0] = 0x900;
491 WriteAddr[HW90_BLOCK_PHY1] = 0x800;
492 WriteAddr[HW90_BLOCK_RF] = 0x3;
Larry Finger547d0c32011-08-25 11:48:16 -0500493 RT_TRACE(COMP_PHY, "=======>%s(), CheckBlock:%d\n", __func__,
494 CheckBlock);
Mateusz Kulikowski156b80d2015-05-31 20:19:49 +0200495
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
Larry Finger547d0c32011-08-25 11:48:16 -0500502 for (i = 0; i < CheckTimes; i++) {
503 switch (CheckBlock) {
Larry Finger94a79942011-08-23 19:00:42 -0500504 case HW90_BLOCK_PHY0:
505 case HW90_BLOCK_PHY1:
Mateusz Kulikowski8ea54102015-07-19 19:28:27 +0200506 rtl92e_writel(dev, WriteAddr[CheckBlock],
507 WriteData[i]);
Mateusz Kulikowski99aa47e2015-07-19 19:28:10 +0200508 dwRegRead = rtl92e_readl(dev, WriteAddr[CheckBlock]);
Larry Finger94a79942011-08-23 19:00:42 -0500509 break;
510
511 case HW90_BLOCK_RF:
512 WriteData[i] &= 0xfff;
Mateusz Kulikowskib0e044f2015-07-19 19:27:53 +0200513 rtl92e_set_rf_reg(dev, eRFPath,
514 WriteAddr[HW90_BLOCK_RF],
515 bMask12Bits, WriteData[i]);
Larry Finger94a79942011-08-23 19:00:42 -0500516 mdelay(10);
Mateusz Kulikowski4d415de2015-07-19 19:27:51 +0200517 dwRegRead = rtl92e_get_rf_reg(dev, eRFPath,
518 WriteAddr[HW90_BLOCK_RF],
519 bMaskDWord);
Larry Finger94a79942011-08-23 19:00:42 -0500520 mdelay(10);
521 break;
522
523 default:
524 ret = false;
525 break;
526 }
527
528
Larry Finger547d0c32011-08-25 11:48:16 -0500529 if (dwRegRead != WriteData[i]) {
Mateusz Kulikowski3b4140a2015-05-31 20:19:50 +0200530 netdev_warn(dev, "%s(): Check failed.\n", __func__);
Larry Finger94a79942011-08-23 19:00:42 -0500531 ret = false;
532 break;
533 }
534 }
535
536 return ret;
537}
538
Mateusz Kulikowski43af9f42015-09-20 10:14:04 +0200539static bool _rtl92e_bb_config_para_file(struct net_device *dev)
Larry Finger94a79942011-08-23 19:00:42 -0500540{
541 struct r8192_priv *priv = rtllib_priv(dev);
542 bool rtStatus = true;
543 u8 bRegValue = 0, eCheckItem = 0;
544 u32 dwRegValue = 0;
Larry Finger94a79942011-08-23 19:00:42 -0500545
Mateusz Kulikowskib59a4ca2015-07-19 19:28:09 +0200546 bRegValue = rtl92e_readb(dev, BB_GLOBAL_RESET);
Mateusz Kulikowskid8ae1962015-07-19 19:28:26 +0200547 rtl92e_writeb(dev, BB_GLOBAL_RESET, (bRegValue|BB_GLOBAL_RESET_BIT));
Larry Finger94a79942011-08-23 19:00:42 -0500548
Mateusz Kulikowski99aa47e2015-07-19 19:28:10 +0200549 dwRegValue = rtl92e_readl(dev, CPU_GEN);
Mateusz Kulikowski8ea54102015-07-19 19:28:27 +0200550 rtl92e_writel(dev, CPU_GEN, (dwRegValue&(~CPU_GEN_BB_RST)));
Larry Finger94a79942011-08-23 19:00:42 -0500551
Larry Finger547d0c32011-08-25 11:48:16 -0500552 for (eCheckItem = (enum hw90_block)HW90_BLOCK_PHY0;
553 eCheckItem <= HW90_BLOCK_PHY1; eCheckItem++) {
Mateusz Kulikowskie21d14d2015-07-19 19:27:46 +0200554 rtStatus = rtl92e_check_bb_and_rf(dev,
555 (enum hw90_block)eCheckItem,
556 (enum rf90_radio_path)0);
Valentina Manea4bb01422013-10-25 11:28:10 +0300557 if (!rtStatus) {
Mateusz Kulikowski08223392015-03-17 00:00:48 +0100558 RT_TRACE((COMP_ERR | COMP_PHY),
Mateusz Kulikowskie4a14332015-07-19 19:27:14 +0200559 "rtl92e_config_rf():Check PHY%d Fail!!\n",
Mateusz Kulikowski08223392015-03-17 00:00:48 +0100560 eCheckItem-1);
Larry Finger94a79942011-08-23 19:00:42 -0500561 return rtStatus;
562 }
563 }
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +0200564 rtl92e_set_bb_reg(dev, rFPGA0_RFMOD, bCCKEn|bOFDMEn, 0x0);
Mateusz Kulikowskia059e472015-09-20 10:13:20 +0200565 _rtl92e_phy_config_bb(dev, BaseBand_Config_PHY_REG);
Larry Finger94a79942011-08-23 19:00:42 -0500566
Mateusz Kulikowski99aa47e2015-07-19 19:28:10 +0200567 dwRegValue = rtl92e_readl(dev, CPU_GEN);
Mateusz Kulikowski8ea54102015-07-19 19:28:27 +0200568 rtl92e_writel(dev, CPU_GEN, (dwRegValue|CPU_GEN_BB_RST));
Larry Finger94a79942011-08-23 19:00:42 -0500569
Mateusz Kulikowskia059e472015-09-20 10:13:20 +0200570 _rtl92e_phy_config_bb(dev, BaseBand_Config_AGC_TAB);
Larry Finger94a79942011-08-23 19:00:42 -0500571
Larry Finger547d0c32011-08-25 11:48:16 -0500572 if (priv->IC_Cut > VERSION_8190_BD) {
Larry Finger94a79942011-08-23 19:00:42 -0500573 if (priv->rf_type == RF_2T4R)
Larry Finger547d0c32011-08-25 11:48:16 -0500574 dwRegValue = (priv->AntennaTxPwDiff[2]<<8 |
575 priv->AntennaTxPwDiff[1]<<4 |
576 priv->AntennaTxPwDiff[0]);
Larry Finger94a79942011-08-23 19:00:42 -0500577 else
578 dwRegValue = 0x0;
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +0200579 rtl92e_set_bb_reg(dev, rFPGA0_TxGainStage,
580 (bXBTxAGC|bXCTxAGC|bXDTxAGC), dwRegValue);
Larry Finger94a79942011-08-23 19:00:42 -0500581
582
Larry Finger94a79942011-08-23 19:00:42 -0500583 dwRegValue = priv->CrystalCap;
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +0200584 rtl92e_set_bb_reg(dev, rFPGA0_AnalogParameter1, bXtalCap92x,
585 dwRegValue);
Larry Finger94a79942011-08-23 19:00:42 -0500586 }
587
588 return rtStatus;
589}
Mateusz Kulikowski29493532015-07-19 19:27:45 +0200590bool rtl92e_config_bb(struct net_device *dev)
Larry Finger94a79942011-08-23 19:00:42 -0500591{
Mateusz Kulikowski003486f2015-09-20 10:14:06 +0200592 _rtl92e_init_bb_rf_reg_def(dev);
Mateusz Kulikowski43af9f42015-09-20 10:14:04 +0200593 return _rtl92e_bb_config_para_file(dev);
Larry Finger94a79942011-08-23 19:00:42 -0500594}
595
Mateusz Kulikowski78cc16f2015-07-19 19:27:50 +0200596void rtl92e_get_tx_power(struct net_device *dev)
Larry Finger94a79942011-08-23 19:00:42 -0500597{
598 struct r8192_priv *priv = rtllib_priv(dev);
Larry Finger547d0c32011-08-25 11:48:16 -0500599
Larry Finger94a79942011-08-23 19:00:42 -0500600 priv->MCSTxPowerLevelOriginalOffset[0] =
Mateusz Kulikowski99aa47e2015-07-19 19:28:10 +0200601 rtl92e_readl(dev, rTxAGC_Rate18_06);
Larry Finger94a79942011-08-23 19:00:42 -0500602 priv->MCSTxPowerLevelOriginalOffset[1] =
Mateusz Kulikowski99aa47e2015-07-19 19:28:10 +0200603 rtl92e_readl(dev, rTxAGC_Rate54_24);
Larry Finger94a79942011-08-23 19:00:42 -0500604 priv->MCSTxPowerLevelOriginalOffset[2] =
Mateusz Kulikowski99aa47e2015-07-19 19:28:10 +0200605 rtl92e_readl(dev, rTxAGC_Mcs03_Mcs00);
Larry Finger94a79942011-08-23 19:00:42 -0500606 priv->MCSTxPowerLevelOriginalOffset[3] =
Mateusz Kulikowski99aa47e2015-07-19 19:28:10 +0200607 rtl92e_readl(dev, rTxAGC_Mcs07_Mcs04);
Larry Finger94a79942011-08-23 19:00:42 -0500608 priv->MCSTxPowerLevelOriginalOffset[4] =
Mateusz Kulikowski99aa47e2015-07-19 19:28:10 +0200609 rtl92e_readl(dev, rTxAGC_Mcs11_Mcs08);
Larry Finger94a79942011-08-23 19:00:42 -0500610 priv->MCSTxPowerLevelOriginalOffset[5] =
Mateusz Kulikowski99aa47e2015-07-19 19:28:10 +0200611 rtl92e_readl(dev, rTxAGC_Mcs15_Mcs12);
Larry Finger94a79942011-08-23 19:00:42 -0500612
Mateusz Kulikowskib59a4ca2015-07-19 19:28:09 +0200613 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);
Mateusz Kulikowski08223392015-03-17 00:00:48 +0100617 RT_TRACE(COMP_INIT,
618 "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x)\n",
Mateusz Kulikowski35e33b02015-05-31 20:19:40 +0200619 priv->DefaultInitialGain[0], priv->DefaultInitialGain[1],
620 priv->DefaultInitialGain[2], priv->DefaultInitialGain[3]);
Larry Finger94a79942011-08-23 19:00:42 -0500621
Mateusz Kulikowskib59a4ca2015-07-19 19:28:09 +0200622 priv->framesync = rtl92e_readb(dev, rOFDM0_RxDetector3);
Mateusz Kulikowski99aa47e2015-07-19 19:28:10 +0200623 priv->framesyncC34 = rtl92e_readl(dev, rOFDM0_RxDetector2);
Larry Finger547d0c32011-08-25 11:48:16 -0500624 RT_TRACE(COMP_INIT, "Default framesync (0x%x) = 0x%x\n",
Larry Finger94a79942011-08-23 19:00:42 -0500625 rOFDM0_RxDetector3, priv->framesync);
Mateusz Kulikowski1c0a7c02015-07-19 19:28:11 +0200626 priv->SifsTime = rtl92e_readw(dev, SIFS);
Larry Finger94a79942011-08-23 19:00:42 -0500627}
628
Mateusz Kulikowski5aa1b9c2015-07-19 19:27:54 +0200629void rtl92e_set_tx_power(struct net_device *dev, u8 channel)
Larry Finger94a79942011-08-23 19:00:42 -0500630{
631 struct r8192_priv *priv = rtllib_priv(dev);
Larry Finger547d0c32011-08-25 11:48:16 -0500632 u8 powerlevel = 0, powerlevelOFDM24G = 0;
Arnd Bergmann5d5fd352016-07-20 17:26:05 +0200633 s8 ant_pwr_diff;
Larry Finger94a79942011-08-23 19:00:42 -0500634 u32 u4RegValue;
635
Larry Finger547d0c32011-08-25 11:48:16 -0500636 if (priv->epromtype == EEPROM_93C46) {
Larry Finger94a79942011-08-23 19:00:42 -0500637 powerlevel = priv->TxPowerLevelCCK[channel-1];
638 powerlevelOFDM24G = priv->TxPowerLevelOFDM24G[channel-1];
Larry Finger547d0c32011-08-25 11:48:16 -0500639 } else if (priv->epromtype == EEPROM_93C56) {
640 if (priv->rf_type == RF_1T2R) {
Larry Finger94a79942011-08-23 19:00:42 -0500641 powerlevel = priv->TxPowerLevelCCK_C[channel-1];
642 powerlevelOFDM24G = priv->TxPowerLevelOFDM24G_C[channel-1];
Larry Finger547d0c32011-08-25 11:48:16 -0500643 } else if (priv->rf_type == RF_2T4R) {
Larry Finger94a79942011-08-23 19:00:42 -0500644 powerlevel = priv->TxPowerLevelCCK_A[channel-1];
645 powerlevelOFDM24G = priv->TxPowerLevelOFDM24G_A[channel-1];
646
647 ant_pwr_diff = priv->TxPowerLevelOFDM24G_C[channel-1]
Larry Finger547d0c32011-08-25 11:48:16 -0500648 - priv->TxPowerLevelOFDM24G_A[channel-1];
Larry Finger94a79942011-08-23 19:00:42 -0500649
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
Larry Finger547d0c32011-08-25 11:48:16 -0500658 u4RegValue = (priv->AntennaTxPwDiff[2]<<8 |
659 priv->AntennaTxPwDiff[1]<<4 |
660 priv->AntennaTxPwDiff[0]);
Larry Finger94a79942011-08-23 19:00:42 -0500661
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +0200662 rtl92e_set_bb_reg(dev, rFPGA0_TxGainStage,
663 (bXBTxAGC|bXCTxAGC|bXDTxAGC),
664 u4RegValue);
Larry Finger94a79942011-08-23 19:00:42 -0500665 }
666 }
Mike McCormackcb762152011-07-11 08:56:20 +0900667 switch (priv->rf_chip) {
Larry Finger94a79942011-08-23 19:00:42 -0500668 case RF_8225:
669 break;
670 case RF_8256:
Mateusz Kulikowskiabfda582015-07-19 19:27:16 +0200671 rtl92e_set_cck_tx_power(dev, powerlevel);
Mateusz Kulikowski2497ef52015-07-19 19:27:17 +0200672 rtl92e_set_ofdm_tx_power(dev, powerlevelOFDM24G);
Larry Finger94a79942011-08-23 19:00:42 -0500673 break;
674 case RF_8258:
675 break;
676 default:
Mateusz Kulikowski3b4140a2015-05-31 20:19:50 +0200677 netdev_err(dev, "Invalid RF Chip ID.\n");
Larry Finger94a79942011-08-23 19:00:42 -0500678 break;
679 }
Larry Finger94a79942011-08-23 19:00:42 -0500680}
681
Mateusz Kulikowski31aebbe2015-07-19 19:27:52 +0200682bool rtl92e_config_phy(struct net_device *dev)
Larry Finger94a79942011-08-23 19:00:42 -0500683{
684 struct r8192_priv *priv = rtllib_priv(dev);
685 bool rtStatus = true;
Matthew Casey3a6b70c2014-08-22 06:27:52 -0400686
Larry Finger547d0c32011-08-25 11:48:16 -0500687 switch (priv->rf_chip) {
688 case RF_8225:
689 break;
690 case RF_8256:
Mateusz Kulikowskie4a14332015-07-19 19:27:14 +0200691 rtStatus = rtl92e_config_rf(dev);
Larry Finger94a79942011-08-23 19:00:42 -0500692 break;
693
Larry Finger547d0c32011-08-25 11:48:16 -0500694 case RF_8258:
695 break;
696 case RF_PSEUDO_11N:
697 break;
698
699 default:
Mateusz Kulikowski3b4140a2015-05-31 20:19:50 +0200700 netdev_err(dev, "Invalid RF Chip ID.\n");
Larry Finger547d0c32011-08-25 11:48:16 -0500701 break;
Larry Finger94a79942011-08-23 19:00:42 -0500702 }
703 return rtStatus;
704}
705
Mateusz Kulikowski2504c112015-07-19 19:27:49 +0200706u8 rtl92e_config_rf_path(struct net_device *dev, enum rf90_radio_path eRFPath)
Larry Finger94a79942011-08-23 19:00:42 -0500707{
708
709 int i;
Larry Finger94a79942011-08-23 19:00:42 -0500710
Larry Finger547d0c32011-08-25 11:48:16 -0500711 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;
Larry Finger94a79942011-08-23 19:00:42 -0500717 }
Mateusz Kulikowskib0e044f2015-07-19 19:27:53 +0200718 rtl92e_set_rf_reg(dev, eRFPath, Rtl819XRadioA_Array[i],
719 bMask12Bits,
720 Rtl819XRadioA_Array[i+1]);
Larry Finger94a79942011-08-23 19:00:42 -0500721
Larry Finger547d0c32011-08-25 11:48:16 -0500722 }
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;
Larry Finger94a79942011-08-23 19:00:42 -0500729 }
Mateusz Kulikowskib0e044f2015-07-19 19:27:53 +0200730 rtl92e_set_rf_reg(dev, eRFPath, Rtl819XRadioB_Array[i],
731 bMask12Bits,
732 Rtl819XRadioB_Array[i+1]);
Larry Finger94a79942011-08-23 19:00:42 -0500733
Larry Finger547d0c32011-08-25 11:48:16 -0500734 }
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;
Larry Finger94a79942011-08-23 19:00:42 -0500741 }
Mateusz Kulikowskib0e044f2015-07-19 19:27:53 +0200742 rtl92e_set_rf_reg(dev, eRFPath, Rtl819XRadioC_Array[i],
743 bMask12Bits,
744 Rtl819XRadioC_Array[i+1]);
Larry Finger94a79942011-08-23 19:00:42 -0500745
Larry Finger547d0c32011-08-25 11:48:16 -0500746 }
747 break;
748 case RF90_PATH_D:
749 for (i = 0; i < RadioD_ArrayLength; i += 2) {
750 if (Rtl819XRadioD_Array[i] == 0xfe) {
Mateusz Kulikowskifc00af02015-09-20 21:04:26 +0200751 msleep(100);
752 continue;
Larry Finger94a79942011-08-23 19:00:42 -0500753 }
Mateusz Kulikowskib0e044f2015-07-19 19:27:53 +0200754 rtl92e_set_rf_reg(dev, eRFPath, Rtl819XRadioD_Array[i],
755 bMask12Bits,
756 Rtl819XRadioD_Array[i+1]);
Larry Finger547d0c32011-08-25 11:48:16 -0500757
758 }
759 break;
760 default:
761 break;
Larry Finger94a79942011-08-23 19:00:42 -0500762 }
763
Peter Senna Tschudin4764ca92014-05-26 16:08:50 +0200764 return 0;
Larry Finger94a79942011-08-23 19:00:42 -0500765
766}
Mateusz Kulikowski0e544312015-09-20 10:14:08 +0200767
768static void _rtl92e_set_tx_power_level(struct net_device *dev, u8 channel)
Larry Finger94a79942011-08-23 19:00:42 -0500769{
770 struct r8192_priv *priv = rtllib_priv(dev);
771 u8 powerlevel = priv->TxPowerLevelCCK[channel-1];
772 u8 powerlevelOFDM24G = priv->TxPowerLevelOFDM24G[channel-1];
773
Larry Finger547d0c32011-08-25 11:48:16 -0500774 switch (priv->rf_chip) {
Larry Finger94a79942011-08-23 19:00:42 -0500775 case RF_8225:
Larry Finger94a79942011-08-23 19:00:42 -0500776 break;
777
778 case RF_8256:
Mateusz Kulikowskiabfda582015-07-19 19:27:16 +0200779 rtl92e_set_cck_tx_power(dev, powerlevel);
Mateusz Kulikowski2497ef52015-07-19 19:27:17 +0200780 rtl92e_set_ofdm_tx_power(dev, powerlevelOFDM24G);
Larry Finger94a79942011-08-23 19:00:42 -0500781 break;
782
783 case RF_8258:
784 break;
785 default:
Mateusz Kulikowski3b4140a2015-05-31 20:19:50 +0200786 netdev_warn(dev, "%s(): Invalid RF Chip ID\n", __func__);
Larry Finger94a79942011-08-23 19:00:42 -0500787 break;
788 }
Larry Finger94a79942011-08-23 19:00:42 -0500789}
Larry Finger94a79942011-08-23 19:00:42 -0500790
Mateusz Kulikowski5b948402015-09-20 10:13:24 +0200791static 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)
Larry Finger547d0c32011-08-25 11:48:16 -0500796{
797 struct sw_chnl_cmd *pCmd;
798
799 if (CmdTable == NULL) {
Mateusz Kulikowski3b4140a2015-05-31 20:19:50 +0200800 netdev_err(dev, "%s(): CmdTable cannot be NULL.\n", __func__);
Larry Finger94a79942011-08-23 19:00:42 -0500801 return false;
802 }
Larry Finger547d0c32011-08-25 11:48:16 -0500803 if (CmdTableIdx >= CmdTableSz) {
Mateusz Kulikowski3b4140a2015-05-31 20:19:50 +0200804 netdev_err(dev, "%s(): Invalid index requested.\n", __func__);
Larry Finger94a79942011-08-23 19:00:42 -0500805 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}
Larry Finger547d0c32011-08-25 11:48:16 -0500816
Mateusz Kulikowski1d53a5e2015-09-20 10:13:25 +0200817static u8 _rtl92e_phy_switch_channel_step(struct net_device *dev, u8 channel,
818 u8 *stage, u8 *step, u32 *delay)
Larry Finger94a79942011-08-23 19:00:42 -0500819{
820 struct r8192_priv *priv = rtllib_priv(dev);
Larry Finger2eed3de2011-09-01 12:23:20 -0500821 struct rtllib_device *ieee = priv->rtllib;
Larry Finger94a79942011-08-23 19:00:42 -0500822 u32 PreCommonCmdCnt;
Larry Finger94a79942011-08-23 19:00:42 -0500823 u32 PostCommonCmdCnt;
Larry Finger94a79942011-08-23 19:00:42 -0500824 u32 RfDependCmdCnt;
Larry Finger51ce2312011-07-18 23:12:54 -0500825 struct sw_chnl_cmd *CurrentCmd = NULL;
Larry Finger94a79942011-08-23 19:00:42 -0500826 u8 eRFPath;
827
Larry Finger547d0c32011-08-25 11:48:16 -0500828 RT_TRACE(COMP_TRACE, "====>%s()====stage:%d, step:%d, channel:%d\n",
829 __func__, *stage, *step, channel);
Larry Finger94a79942011-08-23 19:00:42 -0500830
Sean MacLennan976d5342011-11-30 15:18:52 -0500831 if (!rtllib_legal_channel(priv->rtllib, channel)) {
Mateusz Kulikowski3b4140a2015-05-31 20:19:50 +0200832 netdev_err(dev, "Invalid channel requested: %d\n", channel);
Larry Finger94a79942011-08-23 19:00:42 -0500833 return true;
834 }
Larry Finger94a79942011-08-23 19:00:42 -0500835
836 {
837 PreCommonCmdCnt = 0;
Mateusz Kulikowski5b948402015-09-20 10:13:24 +0200838 _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);
Larry Finger94a79942011-08-23 19:00:42 -0500847
848 PostCommonCmdCnt = 0;
849
Mateusz Kulikowski5b948402015-09-20 10:13:24 +0200850 _rtl92e_phy_set_sw_chnl_cmd_array(dev, ieee->PostCommonCmd,
851 PostCommonCmdCnt++,
852 MAX_POSTCMD_CNT, CmdID_End,
853 0, 0, 0);
Larry Finger94a79942011-08-23 19:00:42 -0500854
855 RfDependCmdCnt = 0;
Larry Finger547d0c32011-08-25 11:48:16 -0500856 switch (priv->rf_chip) {
Larry Finger94a79942011-08-23 19:00:42 -0500857 case RF_8225:
Larry Finger547d0c32011-08-25 11:48:16 -0500858 if (!(channel >= 1 && channel <= 14)) {
Mateusz Kulikowski3b4140a2015-05-31 20:19:50 +0200859 netdev_err(dev,
860 "Invalid channel requested for 8225: %d\n",
861 channel);
Larry Finger94a79942011-08-23 19:00:42 -0500862 return false;
863 }
Mateusz Kulikowski5b948402015-09-20 10:13:24 +0200864 _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);
Larry Finger94a79942011-08-23 19:00:42 -0500877 break;
878
879 case RF_8256:
Larry Finger547d0c32011-08-25 11:48:16 -0500880 if (!(channel >= 1 && channel <= 14)) {
Mateusz Kulikowski3b4140a2015-05-31 20:19:50 +0200881 netdev_err(dev,
882 "Invalid channel requested for 8256: %d\n",
883 channel);
Larry Finger94a79942011-08-23 19:00:42 -0500884 return false;
885 }
Mateusz Kulikowski5b948402015-09-20 10:13:24 +0200886 _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);
Larry Finger94a79942011-08-23 19:00:42 -0500898 break;
899
900 case RF_8258:
901 break;
902
903 default:
Mateusz Kulikowski3b4140a2015-05-31 20:19:50 +0200904 netdev_warn(dev, "Unknown RF Chip ID\n");
Larry Finger94a79942011-08-23 19:00:42 -0500905 return false;
Larry Finger94a79942011-08-23 19:00:42 -0500906 }
907
908
Larry Finger547d0c32011-08-25 11:48:16 -0500909 do {
910 switch (*stage) {
Larry Finger94a79942011-08-23 19:00:42 -0500911 case 0:
Larry Finger2eed3de2011-09-01 12:23:20 -0500912 CurrentCmd = &ieee->PreCommonCmd[*step];
Larry Finger94a79942011-08-23 19:00:42 -0500913 break;
914 case 1:
Larry Finger2eed3de2011-09-01 12:23:20 -0500915 CurrentCmd = &ieee->RfDependCmd[*step];
Larry Finger94a79942011-08-23 19:00:42 -0500916 break;
917 case 2:
Larry Finger2eed3de2011-09-01 12:23:20 -0500918 CurrentCmd = &ieee->PostCommonCmd[*step];
Larry Finger94a79942011-08-23 19:00:42 -0500919 break;
920 }
921
Larry Finger52a7fb02011-09-01 12:23:19 -0500922 if (CurrentCmd && CurrentCmd->CmdID == CmdID_End) {
Mateusz Kulikowski285b7c02015-04-01 00:24:26 +0200923 if ((*stage) == 2)
Larry Finger94a79942011-08-23 19:00:42 -0500924 return true;
Mateusz Kulikowski285b7c02015-04-01 00:24:26 +0200925 (*stage)++;
926 (*step) = 0;
927 continue;
Larry Finger94a79942011-08-23 19:00:42 -0500928 }
929
Larry Finger52a7fb02011-09-01 12:23:19 -0500930 if (!CurrentCmd)
931 continue;
Larry Finger547d0c32011-08-25 11:48:16 -0500932 switch (CurrentCmd->CmdID) {
Larry Finger94a79942011-08-23 19:00:42 -0500933 case CmdID_SetTxPowerLevel:
934 if (priv->IC_Cut > (u8)VERSION_8190_BD)
Mateusz Kulikowski0e544312015-09-20 10:14:08 +0200935 _rtl92e_set_tx_power_level(dev,
936 channel);
Larry Finger94a79942011-08-23 19:00:42 -0500937 break;
938 case CmdID_WritePortUlong:
Mateusz Kulikowski8ea54102015-07-19 19:28:27 +0200939 rtl92e_writel(dev, CurrentCmd->Para1,
940 CurrentCmd->Para2);
Larry Finger94a79942011-08-23 19:00:42 -0500941 break;
942 case CmdID_WritePortUshort:
Mateusz Kulikowski6dee0c82015-07-19 19:28:28 +0200943 rtl92e_writew(dev, CurrentCmd->Para1,
944 (u16)CurrentCmd->Para2);
Larry Finger94a79942011-08-23 19:00:42 -0500945 break;
946 case CmdID_WritePortUchar:
Mateusz Kulikowskid8ae1962015-07-19 19:28:26 +0200947 rtl92e_writeb(dev, CurrentCmd->Para1,
948 (u8)CurrentCmd->Para2);
Larry Finger94a79942011-08-23 19:00:42 -0500949 break;
950 case CmdID_RF_WriteReg:
Larry Finger547d0c32011-08-25 11:48:16 -0500951 for (eRFPath = 0; eRFPath <
952 priv->NumTotalRFPath; eRFPath++)
Mateusz Kulikowskib0e044f2015-07-19 19:27:53 +0200953 rtl92e_set_rf_reg(dev,
Larry Finger547d0c32011-08-25 11:48:16 -0500954 (enum rf90_radio_path)eRFPath,
955 CurrentCmd->Para1, bMask12Bits,
956 CurrentCmd->Para2<<7);
Larry Finger94a79942011-08-23 19:00:42 -0500957 break;
958 default:
959 break;
960 }
961
962 break;
Larry Finger547d0c32011-08-25 11:48:16 -0500963 } while (true);
964 } /*for (Number of RF paths)*/
Larry Finger94a79942011-08-23 19:00:42 -0500965
Larry Finger547d0c32011-08-25 11:48:16 -0500966 (*delay) = CurrentCmd->msDelay;
Larry Finger94a79942011-08-23 19:00:42 -0500967 (*step)++;
968 return false;
969}
970
Mateusz Kulikowski62668792015-09-20 10:13:21 +0200971static void _rtl92e_phy_switch_channel(struct net_device *dev, u8 channel)
Larry Finger94a79942011-08-23 19:00:42 -0500972{
973 struct r8192_priv *priv = rtllib_priv(dev);
Larry Finger547d0c32011-08-25 11:48:16 -0500974 u32 delay = 0;
Larry Finger94a79942011-08-23 19:00:42 -0500975
Mateusz Kulikowski1d53a5e2015-09-20 10:13:25 +0200976 while (!_rtl92e_phy_switch_channel_step(dev, channel,
977 &priv->SwChnlStage,
978 &priv->SwChnlStep, &delay)) {
Larry Finger547d0c32011-08-25 11:48:16 -0500979 if (delay > 0)
Larry Finger94a79942011-08-23 19:00:42 -0500980 msleep(delay);
Vaishali Thakkar5dc42962015-03-03 13:08:24 +0530981 if (!priv->up)
Larry Finger547d0c32011-08-25 11:48:16 -0500982 break;
Larry Finger94a79942011-08-23 19:00:42 -0500983 }
984}
Mateusz Kulikowski87602252015-09-20 10:13:26 +0200985
986static void _rtl92e_phy_switch_channel_work_item(struct net_device *dev)
Larry Finger94a79942011-08-23 19:00:42 -0500987{
988
989 struct r8192_priv *priv = rtllib_priv(dev);
990
991 RT_TRACE(COMP_TRACE, "==> SwChnlCallback819xUsbWorkItem()\n");
992
Larry Finger547d0c32011-08-25 11:48:16 -0500993 RT_TRACE(COMP_TRACE, "=====>--%s(), set chan:%d, priv:%p\n", __func__,
994 priv->chan, priv);
Larry Finger94a79942011-08-23 19:00:42 -0500995
Mateusz Kulikowski62668792015-09-20 10:13:21 +0200996 _rtl92e_phy_switch_channel(dev, priv->chan);
Larry Finger94a79942011-08-23 19:00:42 -0500997
998 RT_TRACE(COMP_TRACE, "<== SwChnlCallback819xUsbWorkItem()\n");
999}
1000
Mateusz Kulikowski68a51432015-07-19 19:27:55 +02001001u8 rtl92e_set_channel(struct net_device *dev, u8 channel)
Larry Finger94a79942011-08-23 19:00:42 -05001002{
1003 struct r8192_priv *priv = rtllib_priv(dev);
Matthew Casey3a6b70c2014-08-22 06:27:52 -04001004
Larry Finger94a79942011-08-23 19:00:42 -05001005 RT_TRACE(COMP_PHY, "=====>%s()\n", __func__);
Vaishali Thakkar5dc42962015-03-03 13:08:24 +05301006 if (!priv->up) {
Mateusz Kulikowski3b4140a2015-05-31 20:19:50 +02001007 netdev_err(dev, "%s(): Driver is not initialized\n", __func__);
Larry Finger94a79942011-08-23 19:00:42 -05001008 return false;
1009 }
1010 if (priv->SwChnlInProgress)
1011 return false;
1012
1013
Larry Finger547d0c32011-08-25 11:48:16 -05001014 switch (priv->rtllib->mode) {
Larry Finger94a79942011-08-23 19:00:42 -05001015 case WIRELESS_MODE_A:
1016 case WIRELESS_MODE_N_5G:
Larry Finger547d0c32011-08-25 11:48:16 -05001017 if (channel <= 14) {
Mateusz Kulikowski3b4140a2015-05-31 20:19:50 +02001018 netdev_warn(dev,
1019 "Channel %d not available in 802.11a.\n",
1020 channel);
Larry Finger94a79942011-08-23 19:00:42 -05001021 return false;
1022 }
1023 break;
1024 case WIRELESS_MODE_B:
Larry Finger547d0c32011-08-25 11:48:16 -05001025 if (channel > 14) {
Mateusz Kulikowski3b4140a2015-05-31 20:19:50 +02001026 netdev_warn(dev,
1027 "Channel %d not available in 802.11b.\n",
1028 channel);
Larry Finger94a79942011-08-23 19:00:42 -05001029 return false;
1030 }
1031 break;
1032 case WIRELESS_MODE_G:
1033 case WIRELESS_MODE_N_24G:
Larry Finger547d0c32011-08-25 11:48:16 -05001034 if (channel > 14) {
Mateusz Kulikowski3b4140a2015-05-31 20:19:50 +02001035 netdev_warn(dev,
1036 "Channel %d not available in 802.11g.\n",
1037 channel);
Larry Finger94a79942011-08-23 19:00:42 -05001038 return false;
1039 }
1040 break;
1041 }
1042
1043 priv->SwChnlInProgress = true;
1044 if (channel == 0)
1045 channel = 1;
1046
Larry Finger547d0c32011-08-25 11:48:16 -05001047 priv->chan = channel;
Larry Finger94a79942011-08-23 19:00:42 -05001048
Larry Finger547d0c32011-08-25 11:48:16 -05001049 priv->SwChnlStage = 0;
1050 priv->SwChnlStep = 0;
Larry Finger94a79942011-08-23 19:00:42 -05001051
Vaishali Thakkar5dc42962015-03-03 13:08:24 +05301052 if (priv->up)
Mateusz Kulikowski87602252015-09-20 10:13:26 +02001053 _rtl92e_phy_switch_channel_work_item(dev);
Larry Finger94a79942011-08-23 19:00:42 -05001054 priv->SwChnlInProgress = false;
1055 return true;
1056}
1057
Mateusz Kulikowski6a2c58a22015-09-20 10:14:03 +02001058static void _rtl92e_cck_tx_power_track_bw_switch_tssi(struct net_device *dev)
Larry Finger94a79942011-08-23 19:00:42 -05001059{
1060 struct r8192_priv *priv = rtllib_priv(dev);
1061
Larry Finger547d0c32011-08-25 11:48:16 -05001062 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))
Larry Finger94a79942011-08-23 19:00:42 -05001070 priv->CCKPresentAttentuation =
Larry Finger547d0c32011-08-25 11:48:16 -05001071 CCKTxBBGainTableLength-1;
1072 if (priv->CCKPresentAttentuation < 0)
1073 priv->CCKPresentAttentuation = 0;
Larry Finger94a79942011-08-23 19:00:42 -05001074
Mateusz Kulikowski08223392015-03-17 00:00:48 +01001075 RT_TRACE(COMP_POWER_TRACKING,
1076 "20M, priv->CCKPresentAttentuation = %d\n",
Larry Finger547d0c32011-08-25 11:48:16 -05001077 priv->CCKPresentAttentuation);
Larry Finger94a79942011-08-23 19:00:42 -05001078
Larry Finger547d0c32011-08-25 11:48:16 -05001079 if (priv->rtllib->current_network.channel == 14 &&
1080 !priv->bcck_in_ch14) {
1081 priv->bcck_in_ch14 = true;
Mateusz Kulikowski59e84dc2015-07-19 19:28:31 +02001082 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
Larry Finger547d0c32011-08-25 11:48:16 -05001083 } else if (priv->rtllib->current_network.channel !=
1084 14 && priv->bcck_in_ch14) {
1085 priv->bcck_in_ch14 = false;
Mateusz Kulikowski59e84dc2015-07-19 19:28:31 +02001086 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
Larry Finger547d0c32011-08-25 11:48:16 -05001087 } else {
Mateusz Kulikowski59e84dc2015-07-19 19:28:31 +02001088 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
Larry Finger547d0c32011-08-25 11:48:16 -05001089 }
Larry Finger94a79942011-08-23 19:00:42 -05001090 break;
1091
Larry Finger547d0c32011-08-25 11:48:16 -05001092 case HT_CHANNEL_WIDTH_20_40:
1093 priv->CCKPresentAttentuation =
1094 priv->CCKPresentAttentuation_40Mdefault +
1095 priv->CCKPresentAttentuation_difference;
1096
Mateusz Kulikowski08223392015-03-17 00:00:48 +01001097 RT_TRACE(COMP_POWER_TRACKING,
1098 "40M, priv->CCKPresentAttentuation = %d\n",
Larry Finger547d0c32011-08-25 11:48:16 -05001099 priv->CCKPresentAttentuation);
1100 if (priv->CCKPresentAttentuation >
1101 (CCKTxBBGainTableLength - 1))
Larry Finger94a79942011-08-23 19:00:42 -05001102 priv->CCKPresentAttentuation =
Larry Finger547d0c32011-08-25 11:48:16 -05001103 CCKTxBBGainTableLength-1;
1104 if (priv->CCKPresentAttentuation < 0)
1105 priv->CCKPresentAttentuation = 0;
Larry Finger94a79942011-08-23 19:00:42 -05001106
Larry Finger547d0c32011-08-25 11:48:16 -05001107 if (priv->rtllib->current_network.channel == 14 &&
1108 !priv->bcck_in_ch14) {
1109 priv->bcck_in_ch14 = true;
Mateusz Kulikowski59e84dc2015-07-19 19:28:31 +02001110 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
Larry Finger547d0c32011-08-25 11:48:16 -05001111 } else if (priv->rtllib->current_network.channel != 14
1112 && priv->bcck_in_ch14) {
1113 priv->bcck_in_ch14 = false;
Mateusz Kulikowski59e84dc2015-07-19 19:28:31 +02001114 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
Larry Finger547d0c32011-08-25 11:48:16 -05001115 } else {
Mateusz Kulikowski59e84dc2015-07-19 19:28:31 +02001116 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
Larry Finger547d0c32011-08-25 11:48:16 -05001117 }
Larry Finger94a79942011-08-23 19:00:42 -05001118 break;
1119 }
1120}
1121
Mateusz Kulikowskifca70242015-09-20 10:14:02 +02001122static void _rtl92e_cck_tx_power_track_bw_switch_thermal(struct net_device *dev)
Larry Finger94a79942011-08-23 19:00:42 -05001123{
1124 struct r8192_priv *priv = rtllib_priv(dev);
1125
Larry Finger547d0c32011-08-25 11:48:16 -05001126 if (priv->rtllib->current_network.channel == 14 &&
1127 !priv->bcck_in_ch14)
Larry Finger94a79942011-08-23 19:00:42 -05001128 priv->bcck_in_ch14 = true;
Larry Finger547d0c32011-08-25 11:48:16 -05001129 else if (priv->rtllib->current_network.channel != 14 &&
1130 priv->bcck_in_ch14)
Larry Finger94a79942011-08-23 19:00:42 -05001131 priv->bcck_in_ch14 = false;
1132
Larry Finger547d0c32011-08-25 11:48:16 -05001133 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;
Mateusz Kulikowski08223392015-03-17 00:00:48 +01001138 RT_TRACE(COMP_POWER_TRACKING,
Mateusz Kulikowskifca70242015-09-20 10:14:02 +02001139 "20MHz, _rtl92e_cck_tx_power_track_bw_switch_thermal(),CCK_index = %d\n",
Larry Finger547d0c32011-08-25 11:48:16 -05001140 priv->CCK_index);
1141 break;
Larry Finger94a79942011-08-23 19:00:42 -05001142
Larry Finger547d0c32011-08-25 11:48:16 -05001143 case HT_CHANNEL_WIDTH_20_40:
1144 priv->CCK_index = priv->Record_CCK_40Mindex;
Mateusz Kulikowski08223392015-03-17 00:00:48 +01001145 RT_TRACE(COMP_POWER_TRACKING,
Mateusz Kulikowskifca70242015-09-20 10:14:02 +02001146 "40MHz, _rtl92e_cck_tx_power_track_bw_switch_thermal(), CCK_index = %d\n",
Larry Finger547d0c32011-08-25 11:48:16 -05001147 priv->CCK_index);
1148 break;
Larry Finger94a79942011-08-23 19:00:42 -05001149 }
Mateusz Kulikowski59e84dc2015-07-19 19:28:31 +02001150 rtl92e_dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
Larry Finger94a79942011-08-23 19:00:42 -05001151}
Larry Finger94a79942011-08-23 19:00:42 -05001152
Mateusz Kulikowski81f58472015-09-20 10:14:01 +02001153static void _rtl92e_cck_tx_power_track_bw_switch(struct net_device *dev)
Larry Finger94a79942011-08-23 19:00:42 -05001154{
Larry Finger94a79942011-08-23 19:00:42 -05001155 struct r8192_priv *priv = rtllib_priv(dev);
Larry Finger94a79942011-08-23 19:00:42 -05001156
Larry Finger94a79942011-08-23 19:00:42 -05001157 if (priv->IC_Cut >= IC_VersionCut_D)
Mateusz Kulikowski6a2c58a22015-09-20 10:14:03 +02001158 _rtl92e_cck_tx_power_track_bw_switch_tssi(dev);
Larry Finger94a79942011-08-23 19:00:42 -05001159 else
Mateusz Kulikowskifca70242015-09-20 10:14:02 +02001160 _rtl92e_cck_tx_power_track_bw_switch_thermal(dev);
Larry Finger94a79942011-08-23 19:00:42 -05001161}
1162
Mateusz Kulikowski7b54d762015-09-20 10:14:07 +02001163static void _rtl92e_set_bw_mode_work_item(struct net_device *dev)
Larry Finger94a79942011-08-23 19:00:42 -05001164{
1165
1166 struct r8192_priv *priv = rtllib_priv(dev);
1167 u8 regBwOpMode;
1168
Mateusz Kulikowski08223392015-03-17 00:00:48 +01001169 RT_TRACE(COMP_SWBW,
Mateusz Kulikowski7b54d762015-09-20 10:14:07 +02001170 "==>_rtl92e_set_bw_mode_work_item() Switch to %s bandwidth\n",
Mateusz Kulikowski08223392015-03-17 00:00:48 +01001171 priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20 ?
1172 "20MHz" : "40MHz");
Larry Finger94a79942011-08-23 19:00:42 -05001173
1174
Larry Finger547d0c32011-08-25 11:48:16 -05001175 if (priv->rf_chip == RF_PSEUDO_11N) {
1176 priv->SetBWModeInProgress = false;
Larry Finger94a79942011-08-23 19:00:42 -05001177 return;
1178 }
Vaishali Thakkar5dc42962015-03-03 13:08:24 +05301179 if (!priv->up) {
Mateusz Kulikowski3b4140a2015-05-31 20:19:50 +02001180 netdev_err(dev, "%s(): Driver is not initialized\n", __func__);
Larry Finger94a79942011-08-23 19:00:42 -05001181 return;
1182 }
Mateusz Kulikowskib59a4ca2015-07-19 19:28:09 +02001183 regBwOpMode = rtl92e_readb(dev, BW_OPMODE);
Larry Finger94a79942011-08-23 19:00:42 -05001184
Larry Finger547d0c32011-08-25 11:48:16 -05001185 switch (priv->CurrentChannelBW) {
1186 case HT_CHANNEL_WIDTH_20:
1187 regBwOpMode |= BW_OPMODE_20MHZ;
Mateusz Kulikowskid8ae1962015-07-19 19:28:26 +02001188 rtl92e_writeb(dev, BW_OPMODE, regBwOpMode);
Larry Finger547d0c32011-08-25 11:48:16 -05001189 break;
Larry Finger94a79942011-08-23 19:00:42 -05001190
Larry Finger547d0c32011-08-25 11:48:16 -05001191 case HT_CHANNEL_WIDTH_20_40:
1192 regBwOpMode &= ~BW_OPMODE_20MHZ;
Mateusz Kulikowskid8ae1962015-07-19 19:28:26 +02001193 rtl92e_writeb(dev, BW_OPMODE, regBwOpMode);
Larry Finger547d0c32011-08-25 11:48:16 -05001194 break;
Larry Finger94a79942011-08-23 19:00:42 -05001195
Larry Finger547d0c32011-08-25 11:48:16 -05001196 default:
Mateusz Kulikowski3b4140a2015-05-31 20:19:50 +02001197 netdev_err(dev, "%s(): unknown Bandwidth: %#X\n", __func__,
1198 priv->CurrentChannelBW);
Larry Finger547d0c32011-08-25 11:48:16 -05001199 break;
Larry Finger94a79942011-08-23 19:00:42 -05001200 }
1201
Larry Finger547d0c32011-08-25 11:48:16 -05001202 switch (priv->CurrentChannelBW) {
1203 case HT_CHANNEL_WIDTH_20:
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +02001204 rtl92e_set_bb_reg(dev, rFPGA0_RFMOD, bRFMOD, 0x0);
1205 rtl92e_set_bb_reg(dev, rFPGA1_RFMOD, bRFMOD, 0x0);
Larry Finger94a79942011-08-23 19:00:42 -05001206
Larry Finger547d0c32011-08-25 11:48:16 -05001207 if (!priv->btxpower_tracking) {
Mateusz Kulikowski8ea54102015-07-19 19:28:27 +02001208 rtl92e_writel(dev, rCCK0_TxFilter1, 0x1a1b0000);
1209 rtl92e_writel(dev, rCCK0_TxFilter2, 0x090e1317);
1210 rtl92e_writel(dev, rCCK0_DebugPort, 0x00000204);
Larry Finger547d0c32011-08-25 11:48:16 -05001211 } else {
Mateusz Kulikowski81f58472015-09-20 10:14:01 +02001212 _rtl92e_cck_tx_power_track_bw_switch(dev);
Larry Finger547d0c32011-08-25 11:48:16 -05001213 }
Larry Finger94a79942011-08-23 19:00:42 -05001214
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +02001215 rtl92e_set_bb_reg(dev, rFPGA0_AnalogParameter1, 0x00100000, 1);
Larry Finger94a79942011-08-23 19:00:42 -05001216
Larry Finger547d0c32011-08-25 11:48:16 -05001217 break;
1218 case HT_CHANNEL_WIDTH_20_40:
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +02001219 rtl92e_set_bb_reg(dev, rFPGA0_RFMOD, bRFMOD, 0x1);
1220 rtl92e_set_bb_reg(dev, rFPGA1_RFMOD, bRFMOD, 0x1);
Larry Finger94a79942011-08-23 19:00:42 -05001221
Larry Finger547d0c32011-08-25 11:48:16 -05001222 if (!priv->btxpower_tracking) {
Mateusz Kulikowski8ea54102015-07-19 19:28:27 +02001223 rtl92e_writel(dev, rCCK0_TxFilter1, 0x35360000);
1224 rtl92e_writel(dev, rCCK0_TxFilter2, 0x121c252e);
1225 rtl92e_writel(dev, rCCK0_DebugPort, 0x00000409);
Larry Finger547d0c32011-08-25 11:48:16 -05001226 } else {
Mateusz Kulikowski81f58472015-09-20 10:14:01 +02001227 _rtl92e_cck_tx_power_track_bw_switch(dev);
Larry Finger547d0c32011-08-25 11:48:16 -05001228 }
Larry Finger94a79942011-08-23 19:00:42 -05001229
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +02001230 rtl92e_set_bb_reg(dev, rCCK0_System, bCCKSideBand,
1231 (priv->nCur40MhzPrimeSC>>1));
1232 rtl92e_set_bb_reg(dev, rOFDM1_LSTF, 0xC00,
1233 priv->nCur40MhzPrimeSC);
Larry Finger94a79942011-08-23 19:00:42 -05001234
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +02001235 rtl92e_set_bb_reg(dev, rFPGA0_AnalogParameter1, 0x00100000, 0);
Larry Finger547d0c32011-08-25 11:48:16 -05001236 break;
1237 default:
Mateusz Kulikowski3b4140a2015-05-31 20:19:50 +02001238 netdev_err(dev, "%s(): unknown Bandwidth: %#X\n", __func__,
1239 priv->CurrentChannelBW);
Larry Finger547d0c32011-08-25 11:48:16 -05001240 break;
Larry Finger94a79942011-08-23 19:00:42 -05001241
1242 }
1243
Larry Finger547d0c32011-08-25 11:48:16 -05001244 switch (priv->rf_chip) {
1245 case RF_8225:
1246 break;
Larry Finger94a79942011-08-23 19:00:42 -05001247
Larry Finger547d0c32011-08-25 11:48:16 -05001248 case RF_8256:
Mateusz Kulikowski766b01282015-07-19 19:27:15 +02001249 rtl92e_set_bandwidth(dev, priv->CurrentChannelBW);
Larry Finger547d0c32011-08-25 11:48:16 -05001250 break;
Larry Finger94a79942011-08-23 19:00:42 -05001251
Larry Finger547d0c32011-08-25 11:48:16 -05001252 case RF_8258:
1253 break;
Larry Finger94a79942011-08-23 19:00:42 -05001254
Larry Finger547d0c32011-08-25 11:48:16 -05001255 case RF_PSEUDO_11N:
1256 break;
Larry Finger94a79942011-08-23 19:00:42 -05001257
Larry Finger547d0c32011-08-25 11:48:16 -05001258 default:
Mateusz Kulikowski3b4140a2015-05-31 20:19:50 +02001259 netdev_info(dev, "%s(): Unknown RFChipID: %d\n", __func__,
1260 priv->rf_chip);
Larry Finger547d0c32011-08-25 11:48:16 -05001261 break;
Larry Finger94a79942011-08-23 19:00:42 -05001262 }
Mike McCormack4f6807e2011-07-11 08:56:20 +09001263
Larry Finger94a79942011-08-23 19:00:42 -05001264 atomic_dec(&(priv->rtllib->atm_swbw));
Larry Finger547d0c32011-08-25 11:48:16 -05001265 priv->SetBWModeInProgress = false;
Larry Finger94a79942011-08-23 19:00:42 -05001266
1267 RT_TRACE(COMP_SWBW, "<==SetBWMode819xUsb()");
1268}
1269
Mateusz Kulikowskiae924ac2015-07-19 19:27:58 +02001270void rtl92e_set_bw_mode(struct net_device *dev, enum ht_channel_width Bandwidth,
1271 enum ht_extchnl_offset Offset)
Larry Finger94a79942011-08-23 19:00:42 -05001272{
1273 struct r8192_priv *priv = rtllib_priv(dev);
1274
1275
1276 if (priv->SetBWModeInProgress)
1277 return;
1278
Larry Finger547d0c32011-08-25 11:48:16 -05001279 atomic_inc(&(priv->rtllib->atm_swbw));
1280 priv->SetBWModeInProgress = true;
Larry Finger94a79942011-08-23 19:00:42 -05001281
1282 priv->CurrentChannelBW = Bandwidth;
1283
Larry Finger547d0c32011-08-25 11:48:16 -05001284 if (Offset == HT_EXTCHNL_OFFSET_LOWER)
Larry Finger94a79942011-08-23 19:00:42 -05001285 priv->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER;
Larry Finger547d0c32011-08-25 11:48:16 -05001286 else if (Offset == HT_EXTCHNL_OFFSET_UPPER)
Larry Finger94a79942011-08-23 19:00:42 -05001287 priv->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER;
1288 else
1289 priv->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
1290
Mateusz Kulikowski7b54d762015-09-20 10:14:07 +02001291 _rtl92e_set_bw_mode_work_item(dev);
Larry Finger94a79942011-08-23 19:00:42 -05001292
1293}
1294
Mateusz Kulikowskidfb7a122015-07-19 19:27:42 +02001295void rtl92e_init_gain(struct net_device *dev, u8 Operation)
Larry Finger94a79942011-08-23 19:00:42 -05001296{
1297#define SCAN_RX_INITIAL_GAIN 0x17
1298#define POWER_DETECTION_TH 0x08
1299 struct r8192_priv *priv = rtllib_priv(dev);
Larry Finger547d0c32011-08-25 11:48:16 -05001300 u32 BitMask;
1301 u8 initial_gain;
Larry Finger94a79942011-08-23 19:00:42 -05001302
Vaishali Thakkar5dc42962015-03-03 13:08:24 +05301303 if (priv->up) {
Larry Finger547d0c32011-08-25 11:48:16 -05001304 switch (Operation) {
1305 case IG_Backup:
Mateusz Kulikowski08223392015-03-17 00:00:48 +01001306 RT_TRACE(COMP_SCAN,
1307 "IG_Backup, backup the initial gain.\n");
Larry Finger547d0c32011-08-25 11:48:16 -05001308 initial_gain = SCAN_RX_INITIAL_GAIN;
1309 BitMask = bMaskByte0;
1310 if (dm_digtable.dig_algorithm ==
1311 DIG_ALGO_BY_FALSE_ALARM)
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +02001312 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x8);
Larry Finger547d0c32011-08-25 11:48:16 -05001313 priv->initgain_backup.xaagccore1 =
Mateusz Kulikowski3c351fe2015-07-19 19:27:56 +02001314 (u8)rtl92e_get_bb_reg(dev, rOFDM0_XAAGCCore1,
1315 BitMask);
Larry Finger547d0c32011-08-25 11:48:16 -05001316 priv->initgain_backup.xbagccore1 =
Mateusz Kulikowski3c351fe2015-07-19 19:27:56 +02001317 (u8)rtl92e_get_bb_reg(dev, rOFDM0_XBAGCCore1,
1318 BitMask);
Larry Finger547d0c32011-08-25 11:48:16 -05001319 priv->initgain_backup.xcagccore1 =
Mateusz Kulikowski3c351fe2015-07-19 19:27:56 +02001320 (u8)rtl92e_get_bb_reg(dev, rOFDM0_XCAGCCore1,
1321 BitMask);
Larry Finger547d0c32011-08-25 11:48:16 -05001322 priv->initgain_backup.xdagccore1 =
Mateusz Kulikowski3c351fe2015-07-19 19:27:56 +02001323 (u8)rtl92e_get_bb_reg(dev, rOFDM0_XDAGCCore1,
1324 BitMask);
Larry Finger547d0c32011-08-25 11:48:16 -05001325 BitMask = bMaskByte2;
Mateusz Kulikowski3c351fe2015-07-19 19:27:56 +02001326 priv->initgain_backup.cca = (u8)rtl92e_get_bb_reg(dev,
Larry Finger547d0c32011-08-25 11:48:16 -05001327 rCCK0_CCA, BitMask);
Larry Finger94a79942011-08-23 19:00:42 -05001328
Mateusz Kulikowski08223392015-03-17 00:00:48 +01001329 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);
Larry Finger94a79942011-08-23 19:00:42 -05001344
Larry Finger547d0c32011-08-25 11:48:16 -05001345 RT_TRACE(COMP_SCAN, "Write scan initial gain = 0x%x\n",
1346 initial_gain);
Mateusz Kulikowskid8ae1962015-07-19 19:28:26 +02001347 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);
Larry Finger547d0c32011-08-25 11:48:16 -05001351 RT_TRACE(COMP_SCAN, "Write scan 0xa0a = 0x%x\n",
1352 POWER_DETECTION_TH);
Mateusz Kulikowskid8ae1962015-07-19 19:28:26 +02001353 rtl92e_writeb(dev, 0xa0a, POWER_DETECTION_TH);
Larry Finger547d0c32011-08-25 11:48:16 -05001354 break;
1355 case IG_Restore:
Mateusz Kulikowski08223392015-03-17 00:00:48 +01001356 RT_TRACE(COMP_SCAN,
1357 "IG_Restore, restore the initial gain.\n");
Larry Finger547d0c32011-08-25 11:48:16 -05001358 BitMask = 0x7f;
1359 if (dm_digtable.dig_algorithm ==
1360 DIG_ALGO_BY_FALSE_ALARM)
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +02001361 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x8);
Larry Finger94a79942011-08-23 19:00:42 -05001362
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +02001363 rtl92e_set_bb_reg(dev, rOFDM0_XAAGCCore1, BitMask,
Larry Finger547d0c32011-08-25 11:48:16 -05001364 (u32)priv->initgain_backup.xaagccore1);
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +02001365 rtl92e_set_bb_reg(dev, rOFDM0_XBAGCCore1, BitMask,
Larry Finger547d0c32011-08-25 11:48:16 -05001366 (u32)priv->initgain_backup.xbagccore1);
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +02001367 rtl92e_set_bb_reg(dev, rOFDM0_XCAGCCore1, BitMask,
Larry Finger547d0c32011-08-25 11:48:16 -05001368 (u32)priv->initgain_backup.xcagccore1);
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +02001369 rtl92e_set_bb_reg(dev, rOFDM0_XDAGCCore1, BitMask,
Larry Finger547d0c32011-08-25 11:48:16 -05001370 (u32)priv->initgain_backup.xdagccore1);
1371 BitMask = bMaskByte2;
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +02001372 rtl92e_set_bb_reg(dev, rCCK0_CCA, BitMask,
Larry Finger547d0c32011-08-25 11:48:16 -05001373 (u32)priv->initgain_backup.cca);
Larry Finger94a79942011-08-23 19:00:42 -05001374
Mateusz Kulikowski08223392015-03-17 00:00:48 +01001375 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);
Larry Finger94a79942011-08-23 19:00:42 -05001390
Mateusz Kulikowski5aa1b9c2015-07-19 19:27:54 +02001391 rtl92e_set_tx_power(dev,
Larry Finger547d0c32011-08-25 11:48:16 -05001392 priv->rtllib->current_network.channel);
Larry Finger94a79942011-08-23 19:00:42 -05001393
Larry Finger547d0c32011-08-25 11:48:16 -05001394 if (dm_digtable.dig_algorithm ==
1395 DIG_ALGO_BY_FALSE_ALARM)
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +02001396 rtl92e_set_bb_reg(dev, UFWP, bMaskByte1, 0x1);
Larry Finger547d0c32011-08-25 11:48:16 -05001397 break;
1398 default:
1399 RT_TRACE(COMP_SCAN, "Unknown IG Operation.\n");
1400 break;
Larry Finger94a79942011-08-23 19:00:42 -05001401 }
1402 }
1403}
1404
Mateusz Kulikowski3803cb22015-07-19 19:27:44 +02001405void rtl92e_set_rf_off(struct net_device *dev)
Larry Finger94a79942011-08-23 19:00:42 -05001406{
1407
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +02001408 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);
Mateusz Kulikowskid8ae1962015-07-19 19:28:26 +02001415 rtl92e_writeb(dev, ANAPAR_FOR_8192PciE, 0x07);
Larry Finger94a79942011-08-23 19:00:42 -05001416
1417}
Larry Finger94a79942011-08-23 19:00:42 -05001418
Mateusz Kulikowski64c6ee92015-09-20 10:14:09 +02001419static bool _rtl92e_set_rf_power_state(struct net_device *dev,
1420 enum rt_rf_power_state eRFPowerState)
Larry Finger94a79942011-08-23 19:00:42 -05001421{
1422 struct r8192_priv *priv = rtllib_priv(dev);
Larry Finger547d0c32011-08-25 11:48:16 -05001423 struct rt_pwr_save_ctrl *pPSC = (struct rt_pwr_save_ctrl *)
1424 (&(priv->rtllib->PowerSaveControl));
Larry Finger94a79942011-08-23 19:00:42 -05001425 bool bResult = true;
1426 u8 i = 0, QueueID = 0;
1427 struct rtl8192_tx_ring *ring = NULL;
1428
Valentina Manea4bb01422013-10-25 11:28:10 +03001429 if (priv->SetRFPowerStateInProgress)
Larry Finger94a79942011-08-23 19:00:42 -05001430 return false;
Mateusz Kulikowski64c6ee92015-09-20 10:14:09 +02001431 RT_TRACE(COMP_PS, "===========> _rtl92e_set_rf_power_state()!\n");
Larry Finger94a79942011-08-23 19:00:42 -05001432 priv->SetRFPowerStateInProgress = true;
1433
Larry Finger547d0c32011-08-25 11:48:16 -05001434 switch (priv->rf_chip) {
1435 case RF_8256:
1436 switch (eRFPowerState) {
1437 case eRfOn:
Mateusz Kulikowski64c6ee92015-09-20 10:14:09 +02001438 RT_TRACE(COMP_PS,
1439 "_rtl92e_set_rf_power_state() eRfOn!\n");
Larry Finger547d0c32011-08-25 11:48:16 -05001440 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;
Matthew Casey3a6b70c2014-08-22 06:27:52 -04001444
Larry Finger547d0c32011-08-25 11:48:16 -05001445 do {
1446 InitilizeCount--;
1447 priv->RegRfOff = false;
Mateusz Kulikowski502bd1d2015-07-19 19:28:08 +02001448 rtstatus = rtl92e_enable_nic(dev);
Valentina Manea4bb01422013-10-25 11:28:10 +03001449 } while (!rtstatus && (InitilizeCount > 0));
Larry Finger94a79942011-08-23 19:00:42 -05001450
Valentina Manea4bb01422013-10-25 11:28:10 +03001451 if (!rtstatus) {
Mateusz Kulikowski3b4140a2015-05-31 20:19:50 +02001452 netdev_err(dev,
1453 "%s(): Failed to initialize Adapter.\n",
1454 __func__);
Larry Finger547d0c32011-08-25 11:48:16 -05001455 priv->SetRFPowerStateInProgress = false;
1456 return false;
1457 }
Larry Finger94a79942011-08-23 19:00:42 -05001458
Larry Finger547d0c32011-08-25 11:48:16 -05001459 RT_CLEAR_PS_LEVEL(pPSC,
1460 RT_RF_OFF_LEVL_HALT_NIC);
1461 } else {
Mateusz Kulikowskid8ae1962015-07-19 19:28:26 +02001462 rtl92e_writeb(dev, ANAPAR, 0x37);
Larry Finger94a79942011-08-23 19:00:42 -05001463 mdelay(1);
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +02001464 rtl92e_set_bb_reg(dev, rFPGA0_AnalogParameter1,
Larry Finger547d0c32011-08-25 11:48:16 -05001465 0x4, 0x1);
Larry Finger94a79942011-08-23 19:00:42 -05001466 priv->bHwRfOffAction = 0;
1467
Mateusz Kulikowski153f9dd2015-07-19 19:27:57 +02001468 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);
Larry Finger94a79942011-08-23 19:00:42 -05001480
Larry Finger547d0c32011-08-25 11:48:16 -05001481 }
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 {
Mateusz Kulikowski08223392015-03-17 00:00:48 +01001497 RT_TRACE((COMP_POWER|COMP_RF),
1498 "eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 before doze!\n",
Larry Finger547d0c32011-08-25 11:48:16 -05001499 (i+1), QueueID);
1500 udelay(10);
1501 i++;
Larry Finger94a79942011-08-23 19:00:42 -05001502 }
1503
Larry Finger547d0c32011-08-25 11:48:16 -05001504 if (i >= MAX_DOZE_WAITING_TIMES_9x) {
Mateusz Kulikowski08223392015-03-17 00:00:48 +01001505 RT_TRACE(COMP_POWER,
Mateusz Kulikowski64c6ee92015-09-20 10:14:09 +02001506 "\n\n\n TimeOut!! _rtl92e_set_rf_power_state(): eRfOff: %d times TcbBusyQueue[%d] != 0 !!!\n",
Larry Finger547d0c32011-08-25 11:48:16 -05001507 MAX_DOZE_WAITING_TIMES_9x,
1508 QueueID);
Larry Finger94a79942011-08-23 19:00:42 -05001509 break;
Larry Finger94a79942011-08-23 19:00:42 -05001510 }
Larry Finger94a79942011-08-23 19:00:42 -05001511 }
Mateusz Kulikowski3803cb22015-07-19 19:27:44 +02001512 rtl92e_set_rf_off(dev);
Larry Finger547d0c32011-08-25 11:48:16 -05001513 break;
Larry Finger94a79942011-08-23 19:00:42 -05001514
Larry Finger547d0c32011-08-25 11:48:16 -05001515 case eRfOff:
Mateusz Kulikowski08223392015-03-17 00:00:48 +01001516 RT_TRACE(COMP_PS,
Mateusz Kulikowski64c6ee92015-09-20 10:14:09 +02001517 "_rtl92e_set_rf_power_state() eRfOff/Sleep !\n");
Larry Finger94a79942011-08-23 19:00:42 -05001518
Larry Finger547d0c32011-08-25 11:48:16 -05001519 for (QueueID = 0, i = 0; QueueID < MAX_TX_QUEUE; ) {
1520 ring = &priv->tx_ring[QueueID];
Larry Finger94a79942011-08-23 19:00:42 -05001521
Larry Finger547d0c32011-08-25 11:48:16 -05001522 if (skb_queue_len(&ring->queue) == 0) {
1523 QueueID++;
1524 continue;
1525 } else {
Mateusz Kulikowski08223392015-03-17 00:00:48 +01001526 RT_TRACE(COMP_POWER,
1527 "eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 before doze!\n",
1528 (i+1), QueueID);
Larry Finger547d0c32011-08-25 11:48:16 -05001529 udelay(10);
1530 i++;
Larry Finger94a79942011-08-23 19:00:42 -05001531 }
Larry Finger94a79942011-08-23 19:00:42 -05001532
Larry Finger547d0c32011-08-25 11:48:16 -05001533 if (i >= MAX_DOZE_WAITING_TIMES_9x) {
Mateusz Kulikowski08223392015-03-17 00:00:48 +01001534 RT_TRACE(COMP_POWER,
1535 "\n\n\n SetZebra: RFPowerState8185B(): eRfOff: %d times TcbBusyQueue[%d] != 0 !!!\n",
Larry Finger547d0c32011-08-25 11:48:16 -05001536 MAX_DOZE_WAITING_TIMES_9x,
1537 QueueID);
Larry Finger94a79942011-08-23 19:00:42 -05001538 break;
Larry Finger547d0c32011-08-25 11:48:16 -05001539 }
1540 }
Larry Finger94a79942011-08-23 19:00:42 -05001541
Larry Finger547d0c32011-08-25 11:48:16 -05001542 if (pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_HALT_NIC &&
1543 !RT_IN_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC)) {
Mateusz Kulikowskiaf002dc2015-07-19 19:28:07 +02001544 rtl92e_disable_nic(dev);
Larry Finger547d0c32011-08-25 11:48:16 -05001545 RT_SET_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC);
1546 } else if (!(pPSC->RegRfPsLevel &
1547 RT_RF_OFF_LEVL_HALT_NIC)) {
Mateusz Kulikowski3803cb22015-07-19 19:27:44 +02001548 rtl92e_set_rf_off(dev);
Larry Finger547d0c32011-08-25 11:48:16 -05001549 }
1550
1551 break;
1552
1553 default:
1554 bResult = false;
Mateusz Kulikowski3b4140a2015-05-31 20:19:50 +02001555 netdev_warn(dev,
1556 "%s(): Unknown state requested: 0x%X.\n",
1557 __func__, eRFPowerState);
Larry Finger547d0c32011-08-25 11:48:16 -05001558 break;
Larry Finger94a79942011-08-23 19:00:42 -05001559 }
1560
1561 break;
1562
Larry Finger547d0c32011-08-25 11:48:16 -05001563 default:
Mateusz Kulikowski3b4140a2015-05-31 20:19:50 +02001564 netdev_warn(dev, "%s(): Unknown RF type\n", __func__);
Larry Finger547d0c32011-08-25 11:48:16 -05001565 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:
Mateusz Kulikowski3b4140a2015-05-31 20:19:50 +02001576 netdev_warn(dev, "%s(): Unknown RF type\n", __func__);
Larry Fingerd0643072011-07-12 22:08:32 -05001577 break;
Larry Finger94a79942011-08-23 19:00:42 -05001578 }
1579 }
1580
1581 priv->SetRFPowerStateInProgress = false;
Mateusz Kulikowski64c6ee92015-09-20 10:14:09 +02001582 RT_TRACE(COMP_PS,
1583 "<=========== _rtl92e_set_rf_power_state() bResult = %d!\n",
Larry Finger547d0c32011-08-25 11:48:16 -05001584 bResult);
Larry Finger94a79942011-08-23 19:00:42 -05001585 return bResult;
1586}
1587
Mateusz Kulikowskiad8d5162015-07-19 19:27:59 +02001588bool rtl92e_set_rf_power_state(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
Mateusz Kulikowskiad8d5162015-07-19 19:27:59 +02001595 RT_TRACE(COMP_PS,
1596 "---------> rtl92e_set_rf_power_state(): eRFPowerState(%d)\n",
Larry Finger547d0c32011-08-25 11:48:16 -05001597 eRFPowerState);
1598 if (eRFPowerState == priv->rtllib->eRFPowerState &&
1599 priv->bHwRfOffAction == 0) {
Mateusz Kulikowski08223392015-03-17 00:00:48 +01001600 RT_TRACE(COMP_PS,
Mateusz Kulikowskiad8d5162015-07-19 19:27:59 +02001601 "<--------- rtl92e_set_rf_power_state(): discard the request for eRFPowerState(%d) is the same.\n",
Larry Finger547d0c32011-08-25 11:48:16 -05001602 eRFPowerState);
Larry Finger94a79942011-08-23 19:00:42 -05001603 return bResult;
1604 }
1605
Mateusz Kulikowski64c6ee92015-09-20 10:14:09 +02001606 bResult = _rtl92e_set_rf_power_state(dev, eRFPowerState);
Larry Finger94a79942011-08-23 19:00:42 -05001607
Mateusz Kulikowskiad8d5162015-07-19 19:27:59 +02001608 RT_TRACE(COMP_PS,
1609 "<--------- rtl92e_set_rf_power_state(): bResult(%d)\n",
Larry Finger547d0c32011-08-25 11:48:16 -05001610 bResult);
Larry Finger94a79942011-08-23 19:00:42 -05001611
1612 return bResult;
1613}
Larry Finger94a79942011-08-23 19:00:42 -05001614
Mateusz Kulikowski9a44c6e2015-07-19 19:27:43 +02001615void rtl92e_scan_op_backup(struct net_device *dev, u8 Operation)
Larry Finger94a79942011-08-23 19:00:42 -05001616{
1617 struct r8192_priv *priv = rtllib_priv(dev);
1618
1619 if (priv->up) {
1620 switch (Operation) {
Larry Finger547d0c32011-08-25 11:48:16 -05001621 case SCAN_OPT_BACKUP:
1622 priv->rtllib->InitialGainHandler(dev, IG_Backup);
1623 break;
Larry Finger94a79942011-08-23 19:00:42 -05001624
Larry Finger547d0c32011-08-25 11:48:16 -05001625 case SCAN_OPT_RESTORE:
1626 priv->rtllib->InitialGainHandler(dev, IG_Restore);
1627 break;
Larry Finger94a79942011-08-23 19:00:42 -05001628
Larry Finger547d0c32011-08-25 11:48:16 -05001629 default:
1630 RT_TRACE(COMP_SCAN, "Unknown Scan Backup Operation.\n");
1631 break;
Larry Finger94a79942011-08-23 19:00:42 -05001632 }
1633 }
1634
1635}