linux/drivers/staging/rtl8723bs/hal/HalPhyRf.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/******************************************************************************
   3 *
   4 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
   5 *
   6 ******************************************************************************/
   7
   8/* include "Mp_Precomp.h" */
   9#include "odm_precomp.h"
  10
  11
  12#define CALCULATE_SWINGTALBE_OFFSET(_offset, _direction, _size, _deltaThermal) \
  13        do {\
  14                for (_offset = 0; _offset < _size; _offset++) {\
  15                        if (_deltaThermal < thermalThreshold[_direction][_offset]) {\
  16                                if (_offset != 0)\
  17                                        _offset--;\
  18                                break;\
  19                        } \
  20                } \
  21                if (_offset >= _size)\
  22                        _offset = _size-1;\
  23        } while (0)
  24
  25
  26void ConfigureTxpowerTrack(PDM_ODM_T pDM_Odm, PTXPWRTRACK_CFG pConfig)
  27{
  28        ConfigureTxpowerTrack_8723B(pConfig);
  29}
  30
  31/*  */
  32/*  <20121113, Kordan> This function should be called when TxAGC changed. */
  33/*  Otherwise the previous compensation is gone, because we record the */
  34/*  delta of temperature between two TxPowerTracking watch dogs. */
  35/*  */
  36/*  NOTE: If Tx BB swing or Tx scaling is varified during run-time, still */
  37/*        need to call this function. */
  38/*  */
  39void ODM_ClearTxPowerTrackingState(PDM_ODM_T pDM_Odm)
  40{
  41        struct hal_com_data *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);
  42        u8 p = 0;
  43
  44        pDM_Odm->BbSwingIdxCckBase = pDM_Odm->DefaultCckIndex;
  45        pDM_Odm->BbSwingIdxCck = pDM_Odm->DefaultCckIndex;
  46        pDM_Odm->RFCalibrateInfo.CCK_index = 0;
  47
  48        for (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p) {
  49                pDM_Odm->BbSwingIdxOfdmBase[p] = pDM_Odm->DefaultOfdmIndex;
  50                pDM_Odm->BbSwingIdxOfdm[p] = pDM_Odm->DefaultOfdmIndex;
  51                pDM_Odm->RFCalibrateInfo.OFDM_index[p] = pDM_Odm->DefaultOfdmIndex;
  52
  53                pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
  54                pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = 0;
  55                pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p] = 0;
  56                pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
  57
  58                /*  Initial Mix mode power tracking */
  59                pDM_Odm->Absolute_OFDMSwingIdx[p] = 0;
  60                pDM_Odm->Remnant_OFDMSwingIdx[p] = 0;
  61        }
  62
  63        /* Initial at Modify Tx Scaling Mode */
  64        pDM_Odm->Modify_TxAGC_Flag_PathA = false;
  65        /* Initial at Modify Tx Scaling Mode */
  66        pDM_Odm->Modify_TxAGC_Flag_PathB = false;
  67        pDM_Odm->Remnant_CCKSwingIdx = 0;
  68        pDM_Odm->RFCalibrateInfo.ThermalValue = pHalData->EEPROMThermalMeter;
  69        pDM_Odm->RFCalibrateInfo.ThermalValue_IQK = pHalData->EEPROMThermalMeter;
  70        pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = pHalData->EEPROMThermalMeter;
  71}
  72
  73void ODM_TXPowerTrackingCallback_ThermalMeter(struct adapter *Adapter)
  74{
  75
  76        struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
  77        PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
  78
  79        u8 ThermalValue = 0, delta, delta_LCK, delta_IQK, p = 0, i = 0;
  80        u8 ThermalValue_AVG_count = 0;
  81        u32 ThermalValue_AVG = 0;
  82
  83        u8 OFDM_min_index = 0;  /*  OFDM BB Swing should be less than +3.0dB, which is required by Arthur */
  84        u8 Indexforchannel = 0; /*  GetRightChnlPlaceforIQK(pHalData->CurrentChannel) */
  85
  86        TXPWRTRACK_CFG c;
  87
  88
  89        /* 4 1. The following TWO tables decide the final index of OFDM/CCK swing table. */
  90        u8 *deltaSwingTableIdx_TUP_A;
  91        u8 *deltaSwingTableIdx_TDOWN_A;
  92        u8 *deltaSwingTableIdx_TUP_B;
  93        u8 *deltaSwingTableIdx_TDOWN_B;
  94
  95        /* 4 2. Initilization (7 steps in total) */
  96
  97        ConfigureTxpowerTrack(pDM_Odm, &c);
  98
  99        (*c.GetDeltaSwingTable)(
 100                pDM_Odm,
 101                (u8 **)&deltaSwingTableIdx_TUP_A,
 102                (u8 **)&deltaSwingTableIdx_TDOWN_A,
 103                (u8 **)&deltaSwingTableIdx_TUP_B,
 104                (u8 **)&deltaSwingTableIdx_TDOWN_B
 105        );
 106
 107        /* cosa add for debug */
 108        pDM_Odm->RFCalibrateInfo.TXPowerTrackingCallbackCnt++;
 109        pDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = true;
 110
 111        ODM_RT_TRACE(
 112                pDM_Odm,
 113                ODM_COMP_TX_PWR_TRACK,
 114                ODM_DBG_LOUD,
 115                (
 116                        "===>ODM_TXPowerTrackingCallback_ThermalMeter,\npDM_Odm->BbSwingIdxCckBase: %d, pDM_Odm->BbSwingIdxOfdmBase[A]: %d, pDM_Odm->DefaultOfdmIndex: %d\n",
 117                        pDM_Odm->BbSwingIdxCckBase,
 118                        pDM_Odm->BbSwingIdxOfdmBase[ODM_RF_PATH_A],
 119                        pDM_Odm->DefaultOfdmIndex
 120                )
 121        );
 122
 123        ThermalValue = (u8)PHY_QueryRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, c.ThermalRegAddr, 0xfc00);   /* 0x42: RF Reg[15:10] 88E */
 124        if (
 125                !pDM_Odm->RFCalibrateInfo.TxPowerTrackControl ||
 126                pHalData->EEPROMThermalMeter == 0 ||
 127                pHalData->EEPROMThermalMeter == 0xFF
 128        )
 129                return;
 130
 131        /* 4 3. Initialize ThermalValues of RFCalibrateInfo */
 132
 133        if (pDM_Odm->RFCalibrateInfo.bReloadtxpowerindex)
 134                ODM_RT_TRACE(
 135                        pDM_Odm,
 136                        ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
 137                        ("reload ofdm index for band switch\n")
 138                );
 139
 140        /* 4 4. Calculate average thermal meter */
 141
 142        pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index] = ThermalValue;
 143        pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index++;
 144        if (pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index == c.AverageThermalNum)   /* Average times =  c.AverageThermalNum */
 145                pDM_Odm->RFCalibrateInfo.ThermalValue_AVG_index = 0;
 146
 147        for (i = 0; i < c.AverageThermalNum; i++) {
 148                if (pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[i]) {
 149                        ThermalValue_AVG += pDM_Odm->RFCalibrateInfo.ThermalValue_AVG[i];
 150                        ThermalValue_AVG_count++;
 151                }
 152        }
 153
 154        /* Calculate Average ThermalValue after average enough times */
 155        if (ThermalValue_AVG_count) {
 156                ThermalValue = (u8)(ThermalValue_AVG / ThermalValue_AVG_count);
 157                ODM_RT_TRACE(
 158                        pDM_Odm,
 159                        ODM_COMP_TX_PWR_TRACK,
 160                        ODM_DBG_LOUD,
 161                        (
 162                                "AVG Thermal Meter = 0x%X, EFUSE Thermal Base = 0x%X\n",
 163                                ThermalValue,
 164                                pHalData->EEPROMThermalMeter
 165                        )
 166                );
 167        }
 168
 169        /* 4 5. Calculate delta, delta_LCK, delta_IQK. */
 170        /* delta" here is used to determine whether thermal value changes or not. */
 171        delta =
 172                (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue) ?
 173                (ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue) :
 174                (pDM_Odm->RFCalibrateInfo.ThermalValue - ThermalValue);
 175        delta_LCK =
 176                (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_LCK) ?
 177                (ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_LCK) :
 178                (pDM_Odm->RFCalibrateInfo.ThermalValue_LCK - ThermalValue);
 179        delta_IQK =
 180                (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_IQK) ?
 181                (ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_IQK) :
 182                (pDM_Odm->RFCalibrateInfo.ThermalValue_IQK - ThermalValue);
 183
 184        ODM_RT_TRACE(
 185                pDM_Odm,
 186                ODM_COMP_TX_PWR_TRACK,
 187                ODM_DBG_LOUD,
 188                (
 189                        "(delta, delta_LCK, delta_IQK) = (%d, %d, %d)\n",
 190                        delta,
 191                        delta_LCK,
 192                        delta_IQK
 193                )
 194        );
 195
 196        /* 4 6. If necessary, do LCK. */
 197        /*  Delta temperature is equal to or larger than 20 centigrade. */
 198        if (delta_LCK >= c.Threshold_IQK) {
 199                ODM_RT_TRACE(
 200                        pDM_Odm,
 201                        ODM_COMP_TX_PWR_TRACK,
 202                        ODM_DBG_LOUD,
 203                        (
 204                                "delta_LCK(%d) >= Threshold_IQK(%d)\n",
 205                                delta_LCK,
 206                                c.Threshold_IQK
 207                        )
 208                );
 209                pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = ThermalValue;
 210                if (c.PHY_LCCalibrate)
 211                        (*c.PHY_LCCalibrate)(pDM_Odm);
 212        }
 213
 214        /* 3 7. If necessary, move the index of swing table to adjust Tx power. */
 215        if (delta > 0 && pDM_Odm->RFCalibrateInfo.TxPowerTrackControl) {
 216                /* delta" here is used to record the absolute value of differrence. */
 217                delta =
 218                        ThermalValue > pHalData->EEPROMThermalMeter ?
 219                        (ThermalValue - pHalData->EEPROMThermalMeter) :
 220                        (pHalData->EEPROMThermalMeter - ThermalValue);
 221
 222                if (delta >= TXPWR_TRACK_TABLE_SIZE)
 223                        delta = TXPWR_TRACK_TABLE_SIZE - 1;
 224
 225                /* 4 7.1 The Final Power Index = BaseIndex + PowerIndexOffset */
 226                if (ThermalValue > pHalData->EEPROMThermalMeter) {
 227                        ODM_RT_TRACE(
 228                                pDM_Odm,
 229                                ODM_COMP_TX_PWR_TRACK,
 230                                ODM_DBG_LOUD,
 231                                (
 232                                        "deltaSwingTableIdx_TUP_A[%d] = %d\n",
 233                                        delta,
 234                                        deltaSwingTableIdx_TUP_A[delta]
 235                                )
 236                        );
 237                        pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_A] =
 238                                pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A];
 239                        pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A] =
 240                                deltaSwingTableIdx_TUP_A[delta];
 241
 242                        /*  Record delta swing for mix mode power tracking */
 243                        pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] =
 244                                deltaSwingTableIdx_TUP_A[delta];
 245
 246                        ODM_RT_TRACE(
 247                                pDM_Odm,
 248                                ODM_COMP_TX_PWR_TRACK,
 249                                ODM_DBG_LOUD,
 250                                (
 251                                        "******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n",
 252                                        pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A]
 253                                )
 254                        );
 255
 256                        if (c.RfPathCount > 1) {
 257                                ODM_RT_TRACE(
 258                                        pDM_Odm,
 259                                        ODM_COMP_TX_PWR_TRACK,
 260                                        ODM_DBG_LOUD,
 261                                        (
 262                                                "deltaSwingTableIdx_TUP_B[%d] = %d\n",
 263                                                delta,
 264                                                deltaSwingTableIdx_TUP_B[delta]
 265                                        )
 266                                );
 267                                pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_B] =
 268                                        pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B];
 269                                pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B] =
 270                                        deltaSwingTableIdx_TUP_B[delta];
 271
 272                                /*  Record delta swing for mix mode power tracking */
 273                                pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] =
 274                                        deltaSwingTableIdx_TUP_B[delta];
 275                                ODM_RT_TRACE(
 276                                        pDM_Odm,
 277                                        ODM_COMP_TX_PWR_TRACK,
 278                                        ODM_DBG_LOUD,
 279                                        (
 280                                                "******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n",
 281                                                pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B]
 282                                        )
 283                                );
 284                        }
 285
 286                } else {
 287                        ODM_RT_TRACE(
 288                                pDM_Odm,
 289                                ODM_COMP_TX_PWR_TRACK,
 290                                ODM_DBG_LOUD,
 291                                (
 292                                        "deltaSwingTableIdx_TDOWN_A[%d] = %d\n",
 293                                        delta,
 294                                        deltaSwingTableIdx_TDOWN_A[delta]
 295                                )
 296                        );
 297
 298                        pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_A] =
 299                                pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A];
 300                        pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_A] =
 301                                -1 * deltaSwingTableIdx_TDOWN_A[delta];
 302
 303                        /*  Record delta swing for mix mode power tracking */
 304                        pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] =
 305                                -1 * deltaSwingTableIdx_TDOWN_A[delta];
 306
 307                        ODM_RT_TRACE(
 308                                pDM_Odm,
 309                                ODM_COMP_TX_PWR_TRACK,
 310                                ODM_DBG_LOUD,
 311                                (
 312                                        "******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n",
 313                                        pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A]
 314                                )
 315                        );
 316
 317                        if (c.RfPathCount > 1) {
 318                                ODM_RT_TRACE(
 319                                        pDM_Odm,
 320                                        ODM_COMP_TX_PWR_TRACK,
 321                                        ODM_DBG_LOUD,
 322                                        (
 323                                                "deltaSwingTableIdx_TDOWN_B[%d] = %d\n",
 324                                                delta,
 325                                                deltaSwingTableIdx_TDOWN_B[delta]
 326                                        )
 327                                );
 328
 329                                pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[ODM_RF_PATH_B] =
 330                                        pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B];
 331                                pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[ODM_RF_PATH_B] =
 332                                        -1 * deltaSwingTableIdx_TDOWN_B[delta];
 333
 334                                 /*  Record delta swing for mix mode power tracking */
 335                                pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] =
 336                                        -1 * deltaSwingTableIdx_TDOWN_B[delta];
 337
 338                                ODM_RT_TRACE(
 339                                        pDM_Odm,
 340                                        ODM_COMP_TX_PWR_TRACK,
 341                                        ODM_DBG_LOUD,
 342                                        (
 343                                                "******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n",
 344                                                pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B]
 345                                        )
 346                                );
 347                        }
 348                }
 349
 350                for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {
 351                        ODM_RT_TRACE(
 352                                pDM_Odm,
 353                                ODM_COMP_TX_PWR_TRACK,
 354                                ODM_DBG_LOUD,
 355                                (
 356                                        "\n\n ================================ [Path-%c] Calculating PowerIndexOffset ================================\n",
 357                                        (p == ODM_RF_PATH_A ? 'A' : 'B')
 358                                )
 359                        );
 360
 361                        if (
 362                                pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] ==
 363                                pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p]
 364                        ) /*  If Thermal value changes but lookup table value still the same */
 365                                pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
 366                        else
 367                                pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] - pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p];      /*  Power Index Diff between 2 times Power Tracking */
 368
 369                        ODM_RT_TRACE(
 370                                pDM_Odm,
 371                                ODM_COMP_TX_PWR_TRACK,
 372                                ODM_DBG_LOUD,
 373                                (
 374                                        "[Path-%c] PowerIndexOffset(%d) = DeltaPowerIndex(%d) - DeltaPowerIndexLast(%d)\n",
 375                                        (
 376                                                p == ODM_RF_PATH_A ? 'A' : 'B'),
 377                                                pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p],
 378                                                pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p],
 379                                                pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p]
 380                                        )
 381                                );
 382
 383                        pDM_Odm->RFCalibrateInfo.OFDM_index[p] =
 384                                pDM_Odm->BbSwingIdxOfdmBase[p] +
 385                                pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p];
 386
 387                        pDM_Odm->RFCalibrateInfo.CCK_index =
 388                                pDM_Odm->BbSwingIdxCckBase +
 389                                pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p];
 390
 391                        pDM_Odm->BbSwingIdxCck =
 392                                pDM_Odm->RFCalibrateInfo.CCK_index;
 393
 394                        pDM_Odm->BbSwingIdxOfdm[p] =
 395                                pDM_Odm->RFCalibrateInfo.OFDM_index[p];
 396
 397                        /*  *************Print BB Swing Base and Index Offset************* */
 398                        ODM_RT_TRACE(
 399                                pDM_Odm,
 400                                ODM_COMP_TX_PWR_TRACK,
 401                                ODM_DBG_LOUD,
 402                                (
 403                                        "The 'CCK' final index(%d) = BaseIndex(%d) + PowerIndexOffset(%d)\n",
 404                                        pDM_Odm->BbSwingIdxCck,
 405                                        pDM_Odm->BbSwingIdxCckBase,
 406                                        pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p]
 407                                )
 408                        );
 409                        ODM_RT_TRACE(
 410                                pDM_Odm,
 411                                ODM_COMP_TX_PWR_TRACK,
 412                                ODM_DBG_LOUD,
 413                                (
 414                                        "The 'OFDM' final index(%d) = BaseIndex[%c](%d) + PowerIndexOffset(%d)\n",
 415                                        pDM_Odm->BbSwingIdxOfdm[p],
 416                                        (p == ODM_RF_PATH_A ? 'A' : 'B'),
 417                                        pDM_Odm->BbSwingIdxOfdmBase[p],
 418                                        pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p]
 419                                )
 420                        );
 421
 422                        /* 4 7.1 Handle boundary conditions of index. */
 423                        if (pDM_Odm->RFCalibrateInfo.OFDM_index[p] > c.SwingTableSize_OFDM-1)
 424                                pDM_Odm->RFCalibrateInfo.OFDM_index[p] = c.SwingTableSize_OFDM-1;
 425                        else if (pDM_Odm->RFCalibrateInfo.OFDM_index[p] < OFDM_min_index)
 426                                pDM_Odm->RFCalibrateInfo.OFDM_index[p] = OFDM_min_index;
 427                }
 428                ODM_RT_TRACE(
 429                        pDM_Odm,
 430                        ODM_COMP_TX_PWR_TRACK,
 431                        ODM_DBG_LOUD,
 432                        ("\n\n ========================================================================================================\n")
 433                );
 434                if (pDM_Odm->RFCalibrateInfo.CCK_index > c.SwingTableSize_CCK-1)
 435                        pDM_Odm->RFCalibrateInfo.CCK_index = c.SwingTableSize_CCK-1;
 436                /* else if (pDM_Odm->RFCalibrateInfo.CCK_index < 0) */
 437                        /* pDM_Odm->RFCalibrateInfo.CCK_index = 0; */
 438        } else {
 439                ODM_RT_TRACE(
 440                        pDM_Odm,
 441                        ODM_COMP_TX_PWR_TRACK,
 442                        ODM_DBG_LOUD,
 443                        (
 444                                "The thermal meter is unchanged or TxPowerTracking OFF(%d): ThermalValue: %d , pDM_Odm->RFCalibrateInfo.ThermalValue: %d\n",
 445                                pDM_Odm->RFCalibrateInfo.TxPowerTrackControl,
 446                                ThermalValue,
 447                                pDM_Odm->RFCalibrateInfo.ThermalValue
 448                        )
 449                );
 450
 451                        for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
 452                                pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
 453        }
 454        ODM_RT_TRACE(
 455                pDM_Odm,
 456                ODM_COMP_TX_PWR_TRACK,
 457                ODM_DBG_LOUD,
 458                (
 459                        "TxPowerTracking: [CCK] Swing Current Index: %d, Swing Base Index: %d\n",
 460                        pDM_Odm->RFCalibrateInfo.CCK_index,
 461                        pDM_Odm->BbSwingIdxCckBase
 462                )
 463        );
 464
 465        /* Print Swing base & current */
 466        for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {
 467                ODM_RT_TRACE(
 468                        pDM_Odm,
 469                        ODM_COMP_TX_PWR_TRACK,
 470                        ODM_DBG_LOUD,
 471                        (
 472                                "TxPowerTracking: [OFDM] Swing Current Index: %d, Swing Base Index[%c]: %d\n",
 473                                pDM_Odm->RFCalibrateInfo.OFDM_index[p],
 474                                (p == ODM_RF_PATH_A ? 'A' : 'B'),
 475                                pDM_Odm->BbSwingIdxOfdmBase[p]
 476                        )
 477                );
 478        }
 479
 480        if (
 481                (pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_A] != 0 ||
 482                 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_B] != 0) &&
 483                 pDM_Odm->RFCalibrateInfo.TxPowerTrackControl
 484         ) {
 485                /* 4 7.2 Configure the Swing Table to adjust Tx Power. */
 486
 487                pDM_Odm->RFCalibrateInfo.bTxPowerChanged = true; /*  Always true after Tx Power is adjusted by power tracking. */
 488                /*  */
 489                /*  2012/04/23 MH According to Luke's suggestion, we can not write BB digital */
 490                /*  to increase TX power. Otherwise, EVM will be bad. */
 491                /*  */
 492                /*  2012/04/25 MH Add for tx power tracking to set tx power in tx agc for 88E. */
 493                if (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue) {
 494                        ODM_RT_TRACE(
 495                                pDM_Odm,
 496                                ODM_COMP_TX_PWR_TRACK,
 497                                ODM_DBG_LOUD,
 498                                (
 499                                        "Temperature Increasing(A): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
 500                                        pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_A],
 501                                        delta,
 502                                        ThermalValue,
 503                                        pHalData->EEPROMThermalMeter,
 504                                        pDM_Odm->RFCalibrateInfo.ThermalValue
 505                                )
 506                        );
 507
 508                        if (c.RfPathCount > 1)
 509                                ODM_RT_TRACE(
 510                                        pDM_Odm,
 511                                        ODM_COMP_TX_PWR_TRACK,
 512                                        ODM_DBG_LOUD,
 513                                        (
 514                                                "Temperature Increasing(B): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
 515                                                pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_B],
 516                                                delta,
 517                                                ThermalValue,
 518                                                pHalData->EEPROMThermalMeter,
 519                                                pDM_Odm->RFCalibrateInfo.ThermalValue
 520                                        )
 521                                );
 522
 523                } else if (ThermalValue < pDM_Odm->RFCalibrateInfo.ThermalValue) { /*  Low temperature */
 524                        ODM_RT_TRACE(
 525                                pDM_Odm,
 526                                ODM_COMP_TX_PWR_TRACK,
 527                                ODM_DBG_LOUD,
 528                                (
 529                                        "Temperature Decreasing(A): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
 530                                        pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_A],
 531                                        delta,
 532                                        ThermalValue,
 533                                        pHalData->EEPROMThermalMeter,
 534                                        pDM_Odm->RFCalibrateInfo.ThermalValue
 535                                )
 536                        );
 537
 538                        if (c.RfPathCount > 1)
 539                                ODM_RT_TRACE(
 540                                        pDM_Odm,
 541                                        ODM_COMP_TX_PWR_TRACK,
 542                                        ODM_DBG_LOUD,
 543                                        (
 544                                                "Temperature Decreasing(B): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
 545                                                pDM_Odm->RFCalibrateInfo.PowerIndexOffset[ODM_RF_PATH_B],
 546                                                delta,
 547                                                ThermalValue,
 548                                                pHalData->EEPROMThermalMeter,
 549                                                pDM_Odm->RFCalibrateInfo.ThermalValue
 550                                        )
 551                                );
 552
 553                }
 554
 555                if (ThermalValue > pHalData->EEPROMThermalMeter) {
 556                        ODM_RT_TRACE(
 557                                pDM_Odm,
 558                                ODM_COMP_TX_PWR_TRACK,
 559                                ODM_DBG_LOUD,
 560                                (
 561                                        "Temperature(%d) higher than PG value(%d)\n",
 562                                        ThermalValue,
 563                                        pHalData->EEPROMThermalMeter
 564                                )
 565                        );
 566
 567                        ODM_RT_TRACE(
 568                                pDM_Odm,
 569                                ODM_COMP_TX_PWR_TRACK,
 570                                ODM_DBG_LOUD,
 571                                ("**********Enter POWER Tracking MIX_MODE**********\n")
 572                        );
 573                        for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
 574                                        (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, 0);
 575                } else {
 576                        ODM_RT_TRACE(
 577                                pDM_Odm,
 578                                ODM_COMP_TX_PWR_TRACK,
 579                                ODM_DBG_LOUD,
 580                                (
 581                                        "Temperature(%d) lower than PG value(%d)\n",
 582                                        ThermalValue,
 583                                        pHalData->EEPROMThermalMeter
 584                                )
 585                        );
 586
 587                        ODM_RT_TRACE(
 588                                pDM_Odm,
 589                                ODM_COMP_TX_PWR_TRACK,
 590                                ODM_DBG_LOUD,
 591                                ("**********Enter POWER Tracking MIX_MODE**********\n")
 592                        );
 593                        for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
 594                                (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, Indexforchannel);
 595                }
 596
 597                /*  Record last time Power Tracking result as base. */
 598                pDM_Odm->BbSwingIdxCckBase = pDM_Odm->BbSwingIdxCck;
 599                for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
 600                        pDM_Odm->BbSwingIdxOfdmBase[p] = pDM_Odm->BbSwingIdxOfdm[p];
 601
 602                ODM_RT_TRACE(
 603                        pDM_Odm,
 604                        ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
 605                        (
 606                                "pDM_Odm->RFCalibrateInfo.ThermalValue = %d ThermalValue = %d\n",
 607                                pDM_Odm->RFCalibrateInfo.ThermalValue,
 608                                ThermalValue
 609                        )
 610                );
 611
 612                /* Record last Power Tracking Thermal Value */
 613                pDM_Odm->RFCalibrateInfo.ThermalValue = ThermalValue;
 614        }
 615
 616        ODM_RT_TRACE(
 617                pDM_Odm,
 618                ODM_COMP_TX_PWR_TRACK,
 619                ODM_DBG_LOUD,
 620                ("<===ODM_TXPowerTrackingCallback_ThermalMeter\n")
 621        );
 622
 623        pDM_Odm->RFCalibrateInfo.TXPowercount = 0;
 624}
 625
 626
 627
 628
 629/* 3 ============================================================ */
 630/* 3 IQ Calibration */
 631/* 3 ============================================================ */
 632
 633u8 ODM_GetRightChnlPlaceforIQK(u8 chnl)
 634{
 635        u8 channel_all[ODM_TARGET_CHNL_NUM_2G_5G] = {
 636                1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
 637                36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
 638                60, 62, 64, 100, 102, 104, 106, 108, 110, 112,
 639                114, 116, 118, 120, 122, 124, 126, 128, 130, 132,
 640                134, 136, 138, 140, 149, 151, 153, 155, 157, 159,
 641                161, 163, 165
 642        };
 643        u8 place = chnl;
 644
 645
 646        if (chnl > 14) {
 647                for (place = 14; place < sizeof(channel_all); place++) {
 648                        if (channel_all[place] == chnl)
 649                                return place-13;
 650                }
 651        }
 652        return 0;
 653
 654}
 655