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