1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
4 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
6 ******************************************************************************/
8 /* include "Mp_Precomp.h" */
9 #include "odm_precomp.h"
12 #define CALCULATE_SWINGTALBE_OFFSET(_offset, _direction, _size, _deltaThermal) \
14 for (_offset = 0; _offset < _size; _offset++) {\
15 if (_deltaThermal < thermalThreshold[_direction][_offset]) {\
21 if (_offset >= _size)\
26 void ConfigureTxpowerTrack(PDM_ODM_T pDM_Odm, PTXPWRTRACK_CFG pConfig)
28 ConfigureTxpowerTrack_8723B(pConfig);
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. */
36 /* NOTE: If Tx BB swing or Tx scaling is varified during run-time, still */
37 /* need to call this function. */
39 void ODM_ClearTxPowerTrackingState(PDM_ODM_T pDM_Odm)
41 struct hal_com_data *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);
44 pDM_Odm->BbSwingIdxCckBase = pDM_Odm->DefaultCckIndex;
45 pDM_Odm->BbSwingIdxCck = pDM_Odm->DefaultCckIndex;
46 pDM_Odm->RFCalibrateInfo.CCK_index = 0;
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;
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;
58 /* Initial Mix mode power tracking */
59 pDM_Odm->Absolute_OFDMSwingIdx[p] = 0;
60 pDM_Odm->Remnant_OFDMSwingIdx[p] = 0;
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;
73 void ODM_TXPowerTrackingCallback_ThermalMeter(struct adapter *Adapter)
76 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
77 PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
79 u8 ThermalValue = 0, delta, delta_LCK, delta_IQK, p = 0, i = 0;
80 u8 ThermalValue_AVG_count = 0;
81 u32 ThermalValue_AVG = 0;
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) */
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;
95 /* 4 2. Initilization (7 steps in total) */
97 ConfigureTxpowerTrack(pDM_Odm, &c);
99 (*c.GetDeltaSwingTable)(
101 (u8 **)&deltaSwingTableIdx_TUP_A,
102 (u8 **)&deltaSwingTableIdx_TDOWN_A,
103 (u8 **)&deltaSwingTableIdx_TUP_B,
104 (u8 **)&deltaSwingTableIdx_TDOWN_B
107 /* cosa add for debug */
108 pDM_Odm->RFCalibrateInfo.TXPowerTrackingCallbackCnt++;
109 pDM_Odm->RFCalibrateInfo.bTXPowerTrackingInit = true;
113 ODM_COMP_TX_PWR_TRACK,
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
123 ThermalValue = (u8)PHY_QueryRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, c.ThermalRegAddr, 0xfc00); /* 0x42: RF Reg[15:10] 88E */
125 !pDM_Odm->RFCalibrateInfo.TxPowerTrackControl ||
126 pHalData->EEPROMThermalMeter == 0 ||
127 pHalData->EEPROMThermalMeter == 0xFF
131 /* 4 3. Initialize ThermalValues of RFCalibrateInfo */
133 if (pDM_Odm->RFCalibrateInfo.bReloadtxpowerindex)
136 ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
137 ("reload ofdm index for band switch\n")
140 /* 4 4. Calculate average thermal meter */
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;
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++;
154 /* Calculate Average ThermalValue after average enough times */
155 if (ThermalValue_AVG_count) {
156 ThermalValue = (u8)(ThermalValue_AVG / ThermalValue_AVG_count);
159 ODM_COMP_TX_PWR_TRACK,
162 "AVG Thermal Meter = 0x%X, EFUSE Thermal Base = 0x%X\n",
164 pHalData->EEPROMThermalMeter
169 /* 4 5. Calculate delta, delta_LCK, delta_IQK. */
170 /* delta" here is used to determine whether thermal value changes or not. */
172 (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue) ?
173 (ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue) :
174 (pDM_Odm->RFCalibrateInfo.ThermalValue - ThermalValue);
176 (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_LCK) ?
177 (ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_LCK) :
178 (pDM_Odm->RFCalibrateInfo.ThermalValue_LCK - ThermalValue);
180 (ThermalValue > pDM_Odm->RFCalibrateInfo.ThermalValue_IQK) ?
181 (ThermalValue - pDM_Odm->RFCalibrateInfo.ThermalValue_IQK) :
182 (pDM_Odm->RFCalibrateInfo.ThermalValue_IQK - ThermalValue);
186 ODM_COMP_TX_PWR_TRACK,
189 "(delta, delta_LCK, delta_IQK) = (%d, %d, %d)\n",
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) {
201 ODM_COMP_TX_PWR_TRACK,
204 "delta_LCK(%d) >= Threshold_IQK(%d)\n",
209 pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = ThermalValue;
210 if (c.PHY_LCCalibrate)
211 (*c.PHY_LCCalibrate)(pDM_Odm);
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. */
218 ThermalValue > pHalData->EEPROMThermalMeter ?
219 (ThermalValue - pHalData->EEPROMThermalMeter) :
220 (pHalData->EEPROMThermalMeter - ThermalValue);
222 if (delta >= TXPWR_TRACK_TABLE_SIZE)
223 delta = TXPWR_TRACK_TABLE_SIZE - 1;
225 /* 4 7.1 The Final Power Index = BaseIndex + PowerIndexOffset */
226 if (ThermalValue > pHalData->EEPROMThermalMeter) {
229 ODM_COMP_TX_PWR_TRACK,
232 "deltaSwingTableIdx_TUP_A[%d] = %d\n",
234 deltaSwingTableIdx_TUP_A[delta]
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];
242 /* Record delta swing for mix mode power tracking */
243 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] =
244 deltaSwingTableIdx_TUP_A[delta];
248 ODM_COMP_TX_PWR_TRACK,
251 "******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n",
252 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A]
256 if (c.RfPathCount > 1) {
259 ODM_COMP_TX_PWR_TRACK,
262 "deltaSwingTableIdx_TUP_B[%d] = %d\n",
264 deltaSwingTableIdx_TUP_B[delta]
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];
272 /* Record delta swing for mix mode power tracking */
273 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] =
274 deltaSwingTableIdx_TUP_B[delta];
277 ODM_COMP_TX_PWR_TRACK,
280 "******Temp is higher and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n",
281 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B]
289 ODM_COMP_TX_PWR_TRACK,
292 "deltaSwingTableIdx_TDOWN_A[%d] = %d\n",
294 deltaSwingTableIdx_TDOWN_A[delta]
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];
303 /* Record delta swing for mix mode power tracking */
304 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] =
305 -1 * deltaSwingTableIdx_TDOWN_A[delta];
309 ODM_COMP_TX_PWR_TRACK,
312 "******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n",
313 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_A]
317 if (c.RfPathCount > 1) {
320 ODM_COMP_TX_PWR_TRACK,
323 "deltaSwingTableIdx_TDOWN_B[%d] = %d\n",
325 deltaSwingTableIdx_TDOWN_B[delta]
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];
334 /* Record delta swing for mix mode power tracking */
335 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] =
336 -1 * deltaSwingTableIdx_TDOWN_B[delta];
340 ODM_COMP_TX_PWR_TRACK,
343 "******Temp is lower and pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n",
344 pDM_Odm->Absolute_OFDMSwingIdx[ODM_RF_PATH_B]
350 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {
353 ODM_COMP_TX_PWR_TRACK,
356 "\n\n ================================ [Path-%c] Calculating PowerIndexOffset ================================\n",
357 (p == ODM_RF_PATH_A ? 'A' : 'B')
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;
367 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] - pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p]; /* Power Index Diff between 2 times Power Tracking */
371 ODM_COMP_TX_PWR_TRACK,
374 "[Path-%c] PowerIndexOffset(%d) = DeltaPowerIndex(%d) - DeltaPowerIndexLast(%d)\n",
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]
383 pDM_Odm->RFCalibrateInfo.OFDM_index[p] =
384 pDM_Odm->BbSwingIdxOfdmBase[p] +
385 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p];
387 pDM_Odm->RFCalibrateInfo.CCK_index =
388 pDM_Odm->BbSwingIdxCckBase +
389 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p];
391 pDM_Odm->BbSwingIdxCck =
392 pDM_Odm->RFCalibrateInfo.CCK_index;
394 pDM_Odm->BbSwingIdxOfdm[p] =
395 pDM_Odm->RFCalibrateInfo.OFDM_index[p];
397 /* *************Print BB Swing Base and Index Offset************* */
400 ODM_COMP_TX_PWR_TRACK,
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]
411 ODM_COMP_TX_PWR_TRACK,
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]
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;
430 ODM_COMP_TX_PWR_TRACK,
432 ("\n\n ========================================================================================================\n")
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; */
441 ODM_COMP_TX_PWR_TRACK,
444 "The thermal meter is unchanged or TxPowerTracking OFF(%d): ThermalValue: %d , pDM_Odm->RFCalibrateInfo.ThermalValue: %d\n",
445 pDM_Odm->RFCalibrateInfo.TxPowerTrackControl,
447 pDM_Odm->RFCalibrateInfo.ThermalValue
451 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
452 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0;
456 ODM_COMP_TX_PWR_TRACK,
459 "TxPowerTracking: [CCK] Swing Current Index: %d, Swing Base Index: %d\n",
460 pDM_Odm->RFCalibrateInfo.CCK_index,
461 pDM_Odm->BbSwingIdxCckBase
465 /* Print Swing base & current */
466 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {
469 ODM_COMP_TX_PWR_TRACK,
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]
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
485 /* 4 7.2 Configure the Swing Table to adjust Tx Power. */
487 pDM_Odm->RFCalibrateInfo.bTxPowerChanged = true; /* Always true after Tx Power is adjusted by power tracking. */
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. */
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) {
496 ODM_COMP_TX_PWR_TRACK,
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],
503 pHalData->EEPROMThermalMeter,
504 pDM_Odm->RFCalibrateInfo.ThermalValue
508 if (c.RfPathCount > 1)
511 ODM_COMP_TX_PWR_TRACK,
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],
518 pHalData->EEPROMThermalMeter,
519 pDM_Odm->RFCalibrateInfo.ThermalValue
523 } else if (ThermalValue < pDM_Odm->RFCalibrateInfo.ThermalValue) { /* Low temperature */
526 ODM_COMP_TX_PWR_TRACK,
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],
533 pHalData->EEPROMThermalMeter,
534 pDM_Odm->RFCalibrateInfo.ThermalValue
538 if (c.RfPathCount > 1)
541 ODM_COMP_TX_PWR_TRACK,
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],
548 pHalData->EEPROMThermalMeter,
549 pDM_Odm->RFCalibrateInfo.ThermalValue
555 if (ThermalValue > pHalData->EEPROMThermalMeter) {
558 ODM_COMP_TX_PWR_TRACK,
561 "Temperature(%d) higher than PG value(%d)\n",
563 pHalData->EEPROMThermalMeter
569 ODM_COMP_TX_PWR_TRACK,
571 ("**********Enter POWER Tracking MIX_MODE**********\n")
573 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
574 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, 0);
578 ODM_COMP_TX_PWR_TRACK,
581 "Temperature(%d) lower than PG value(%d)\n",
583 pHalData->EEPROMThermalMeter
589 ODM_COMP_TX_PWR_TRACK,
591 ("**********Enter POWER Tracking MIX_MODE**********\n")
593 for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)
594 (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, Indexforchannel);
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];
604 ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
606 "pDM_Odm->RFCalibrateInfo.ThermalValue = %d ThermalValue = %d\n",
607 pDM_Odm->RFCalibrateInfo.ThermalValue,
612 /* Record last Power Tracking Thermal Value */
613 pDM_Odm->RFCalibrateInfo.ThermalValue = ThermalValue;
618 ODM_COMP_TX_PWR_TRACK,
620 ("<===ODM_TXPowerTrackingCallback_ThermalMeter\n")
623 pDM_Odm->RFCalibrateInfo.TXPowercount = 0;
629 /* 3 ============================================================ */
630 /* 3 IQ Calibration */
631 /* 3 ============================================================ */
633 u8 ODM_GetRightChnlPlaceforIQK(u8 chnl)
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,
647 for (place = 14; place < sizeof(channel_all); place++) {
648 if (channel_all[place] == chnl)