1 /******************************************************************************
\r
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
\r
5 * This program is free software; you can redistribute it and/or modify it
\r
6 * under the terms of version 2 of the GNU General Public License as
\r
7 * published by the Free Software Foundation.
\r
9 * This program is distributed in the hope that it will be useful, but WITHOUT
\r
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
\r
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
\r
14 * You should have received a copy of the GNU General Public License along with
\r
15 * this program; if not, write to the Free Software Foundation, Inc.,
\r
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
\r
19 ******************************************************************************/
\r
20 #define _RTL8723B_MP_C_
\r
21 #ifdef CONFIG_MP_INCLUDED
\r
23 #include <rtl8723b_hal.h>
\r
26 /*-----------------------------------------------------------------------------
\r
27 * Function: mpt_SwitchRfSetting
\r
29 * Overview: Change RF Setting when we siwthc channel/rate/BW for MP.
\r
31 * Input: IN PADAPTER pAdapter
\r
39 * 01/08/2009 MHC Suggestion from SD3 Willis for 92S series.
\r
40 * 01/09/2009 MHC Add CCK modification for 40MHZ. Suggestion from SD3.
\r
42 *---------------------------------------------------------------------------*/
\r
43 static void phy_SwitchRfSetting(PADAPTER pAdapter,u8 channel )
\r
46 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
\r
47 u32 u4RF_IPA[3], u4RF_TXBIAS, u4RF_SYN_G2;
\r
51 u4RF_IPA[0] = 0x4F424; //CCK
\r
52 u4RF_IPA[1] = 0xCF424; //OFDM
\r
53 u4RF_IPA[2] = 0x8F424; //MCS
\r
54 u4RF_TXBIAS = 0xC0356;
\r
55 u4RF_SYN_G2 = 0x4F200;
\r
61 u4RF_IPA[0] = 0x4F40C;
\r
62 u4RF_IPA[1] = 0xCF466;
\r
63 u4RF_TXBIAS = 0xC0350;
\r
67 u4RF_IPA[0] = 0x4F407;
\r
68 u4RF_TXBIAS = 0xC0350;
\r
72 u4RF_IPA[0] = 0x4F407;
\r
73 u4RF_IPA[2] = 0x8F466;
\r
74 u4RF_TXBIAS = 0xC0350;
\r
79 u4RF_SYN_G2 = 0x0F400;
\r
84 u4RF_IPA[0] = 0x4F40C;
\r
88 u4RF_IPA[0] = 0x4F40C;
\r
89 u4RF_SYN_G2 = 0x0F400;
\r
93 u4RF_IPA[2] = 0x8F454;
\r
94 u4RF_SYN_G2 = 0x0F400;
\r
98 u4RF_IPA[0] = 0x4F40C;
\r
99 u4RF_IPA[1] = 0xCF454;
\r
100 u4RF_SYN_G2 = 0x0F400;
\r
104 u4RF_IPA[0] = 0x4F424;
\r
105 u4RF_IPA[1] = 0x8F424;
\r
106 u4RF_IPA[2] = 0xCF424;
\r
107 u4RF_TXBIAS = 0xC0356;
\r
108 u4RF_SYN_G2 = 0x4F200;
\r
112 PHY_SetRFReg(pAdapter, RF_PATH_A, RF_IPA, bRFRegOffsetMask, u4RF_IPA[0]);
\r
113 PHY_SetRFReg(pAdapter, RF_PATH_A, RF_IPA, bRFRegOffsetMask, u4RF_IPA[1]);
\r
114 PHY_SetRFReg(pAdapter, RF_PATH_A, RF_IPA, bRFRegOffsetMask, u4RF_IPA[2]);
\r
115 PHY_SetRFReg(pAdapter, RF_PATH_A, RF_TXBIAS, bRFRegOffsetMask, u4RF_TXBIAS);
\r
116 PHY_SetRFReg(pAdapter, RF_PATH_A, RF_SYN_G2, bRFRegOffsetMask, u4RF_SYN_G2);
\r
120 void Hal_mpt_SwitchRfSetting(PADAPTER pAdapter)
\r
122 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
\r
123 PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx);
\r
124 u8 ChannelToSw = pMptCtx->MptChannelToSw;
\r
126 phy_SwitchRfSetting(pAdapter, ChannelToSw);
\r
129 s32 Hal_SetPowerTracking(PADAPTER padapter, u8 enable)
\r
131 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
\r
132 PDM_ODM_T pDM_Odm = &(pHalData->odmpriv);
\r
135 if (!netif_running(padapter->pnetdev)) {
\r
136 RT_TRACE(_module_mp_, _drv_warning_, ("SetPowerTracking! Fail: interface not opened!\n"));
\r
140 if (check_fwstate(&padapter->mlmepriv, WIFI_MP_STATE) == _FALSE) {
\r
141 RT_TRACE(_module_mp_, _drv_warning_, ("SetPowerTracking! Fail: not in MP mode!\n"));
\r
145 pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _TRUE;
\r
147 pDM_Odm->RFCalibrateInfo.TxPowerTrackControl= _FALSE;
\r
152 void Hal_GetPowerTracking(PADAPTER padapter, u8 *enable)
\r
154 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
\r
155 PDM_ODM_T pDM_Odm = &(pHalData->odmpriv);
\r
158 *enable = pDM_Odm->RFCalibrateInfo.TxPowerTrackControl;
\r
162 static void Hal_disable_dm(PADAPTER padapter)
\r
165 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
\r
166 PDM_ODM_T pDM_Odm = &(pHalData->odmpriv);
\r
168 //3 1. disable firmware dynamic mechanism
\r
169 // disable Power Training, Rate Adaptive
\r
170 v8 = rtw_read8(padapter, REG_BCN_CTRL);
\r
171 v8 &= ~EN_BCN_FUNCTION;
\r
172 rtw_write8(padapter, REG_BCN_CTRL, v8);
\r
174 //3 2. disable driver dynamic mechanism
\r
175 Switch_DM_Func(padapter, DYNAMIC_FUNC_DISABLE, _FALSE);
\r
177 // enable APK, LCK and IQK but disable power tracking
\r
178 pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = _FALSE;
\r
179 Switch_DM_Func(padapter, ODM_RF_CALIBRATION , _TRUE);
\r
182 void Hal_MPT_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14)
\r
184 u32 TempVal = 0, TempVal2 = 0, TempVal3 = 0;
\r
185 u32 CurrCCKSwingVal = 0, CCKSwingIndex = 12;
\r
187 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
190 // get current cck swing value and check 0xa22 & 0xa23 later to match the table.
\r
191 CurrCCKSwingVal = read_bbreg(Adapter, rCCK0_TxFilter1, bMaskHWord);
\r
195 // Readback the current bb cck swing value and compare with the table to
\r
196 // get the current swing index
\r
197 for (i = 0; i < CCK_TABLE_SIZE; i++)
\r
199 if (((CurrCCKSwingVal&0xff) == (u32)CCKSwingTable_Ch1_Ch13[i][0]) &&
\r
200 (((CurrCCKSwingVal&0xff00)>>8) == (u32)CCKSwingTable_Ch1_Ch13[i][1]))
\r
203 // RT_TRACE(COMP_INIT, DBG_LOUD,("Ch1~13, Current reg0x%x = 0x%lx, CCKSwingIndex=0x%x\n",
\r
204 // (rCCK0_TxFilter1+2), CurrCCKSwingVal, CCKSwingIndex));
\r
209 //Write 0xa22 0xa23
\r
210 TempVal = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][0] +
\r
211 (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][1]<<8) ;
\r
214 //Write 0xa24 ~ 0xa27
\r
216 TempVal2 = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][2] +
\r
217 (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][3]<<8) +
\r
218 (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][4]<<16 )+
\r
219 (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][5]<<24);
\r
221 //Write 0xa28 0xa29
\r
223 TempVal3 = CCKSwingTable_Ch1_Ch13[CCKSwingIndex][6] +
\r
224 (CCKSwingTable_Ch1_Ch13[CCKSwingIndex][7]<<8) ;
\r
228 for (i = 0; i < CCK_TABLE_SIZE; i++)
\r
230 if (((CurrCCKSwingVal&0xff) == (u32)CCKSwingTable_Ch14[i][0]) &&
\r
231 (((CurrCCKSwingVal&0xff00)>>8) == (u32)CCKSwingTable_Ch14[i][1]))
\r
234 // RT_TRACE(COMP_INIT, DBG_LOUD,("Ch14, Current reg0x%x = 0x%lx, CCKSwingIndex=0x%x\n",
\r
235 // (rCCK0_TxFilter1+2), CurrCCKSwingVal, CCKSwingIndex));
\r
240 //Write 0xa22 0xa23
\r
241 TempVal = CCKSwingTable_Ch14[CCKSwingIndex][0] +
\r
242 (CCKSwingTable_Ch14[CCKSwingIndex][1]<<8) ;
\r
244 //Write 0xa24 ~ 0xa27
\r
246 TempVal2 = CCKSwingTable_Ch14[CCKSwingIndex][2] +
\r
247 (CCKSwingTable_Ch14[CCKSwingIndex][3]<<8) +
\r
248 (CCKSwingTable_Ch14[CCKSwingIndex][4]<<16 )+
\r
249 (CCKSwingTable_Ch14[CCKSwingIndex][5]<<24);
\r
251 //Write 0xa28 0xa29
\r
253 TempVal3 = CCKSwingTable_Ch14[CCKSwingIndex][6] +
\r
254 (CCKSwingTable_Ch14[CCKSwingIndex][7]<<8) ;
\r
257 write_bbreg(Adapter, rCCK0_TxFilter1, bMaskHWord, TempVal);
\r
258 write_bbreg(Adapter, rCCK0_TxFilter2, bMaskDWord, TempVal2);
\r
259 write_bbreg(Adapter, rCCK0_DebugPort, bMaskLWord, TempVal3);
\r
262 void Hal_MPT_CCKTxPowerAdjustbyIndex(PADAPTER pAdapter, BOOLEAN beven)
\r
265 u8 CCK_index, CCK_index_old=0;
\r
266 u8 Action = 0; //0: no action, 1: even->odd, 2:odd->even
\r
269 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
\r
270 PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx;
\r
275 if (!IS_92C_SERIAL(pHalData->VersionID))
\r
278 while(PlatformAtomicExchange(&Adapter->IntrCCKRefCount, TRUE) == TRUE)
\r
280 PlatformSleepUs(100);
\r
284 RTPRINT(FINIT, INIT_TxPower,
\r
285 ("!!!MPT_CCKTxPowerAdjustbyIndex Wait for check CCK gain index too long!!!\n" ));
\r
290 if (beven && !pMptCtx->bMptIndexEven) //odd->even
\r
293 pMptCtx->bMptIndexEven = _TRUE;
\r
295 else if (!beven && pMptCtx->bMptIndexEven) //even->odd
\r
298 pMptCtx->bMptIndexEven = _FALSE;
\r
303 //Query CCK default setting From 0xa24
\r
304 TempCCk = read_bbreg(pAdapter, rCCK0_TxFilter2, bMaskDWord) & bMaskCCK;
\r
305 for (i = 0; i < CCK_TABLE_SIZE; i++)
\r
307 if (pHalData->dmpriv.bCCKinCH14)
\r
309 if (_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch14[i][2], 4) == _TRUE)
\r
311 CCK_index_old = (u8) i;
\r
312 // RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: Initial reg0x%x = 0x%lx, CCK_index=0x%x, ch 14 %d\n",
\r
313 // rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14));
\r
319 if (_rtw_memcmp((void*)&TempCCk, (void*)&CCKSwingTable_Ch1_Ch13[i][2], 4) == _TRUE)
\r
321 CCK_index_old = (u8) i;
\r
322 // RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: Initial reg0x%x = 0x%lx, CCK_index=0x%x, ch14 %d\n",
\r
323 // rCCK0_TxFilter2, TempCCk, CCK_index_old, pHalData->bCCKinCH14));
\r
330 if (CCK_index_old == 0)
\r
332 CCK_index = CCK_index_old - 1;
\r
334 CCK_index = CCK_index_old + 1;
\r
337 if (CCK_index == CCK_TABLE_SIZE) {
\r
338 CCK_index = CCK_TABLE_SIZE -1;
\r
339 RT_TRACE(_module_mp_, _drv_info_, ("CCK_index == CCK_TABLE_SIZE\n"));
\r
342 // RTPRINT(FINIT, INIT_TxPower,("MPT_CCKTxPowerAdjustbyIndex: new CCK_index=0x%x\n",
\r
345 //Adjust CCK according to gain index
\r
346 if (!pHalData->dmpriv.bCCKinCH14) {
\r
347 rtw_write8(pAdapter, 0xa22, CCKSwingTable_Ch1_Ch13[CCK_index][0]);
\r
348 rtw_write8(pAdapter, 0xa23, CCKSwingTable_Ch1_Ch13[CCK_index][1]);
\r
349 rtw_write8(pAdapter, 0xa24, CCKSwingTable_Ch1_Ch13[CCK_index][2]);
\r
350 rtw_write8(pAdapter, 0xa25, CCKSwingTable_Ch1_Ch13[CCK_index][3]);
\r
351 rtw_write8(pAdapter, 0xa26, CCKSwingTable_Ch1_Ch13[CCK_index][4]);
\r
352 rtw_write8(pAdapter, 0xa27, CCKSwingTable_Ch1_Ch13[CCK_index][5]);
\r
353 rtw_write8(pAdapter, 0xa28, CCKSwingTable_Ch1_Ch13[CCK_index][6]);
\r
354 rtw_write8(pAdapter, 0xa29, CCKSwingTable_Ch1_Ch13[CCK_index][7]);
\r
356 rtw_write8(pAdapter, 0xa22, CCKSwingTable_Ch14[CCK_index][0]);
\r
357 rtw_write8(pAdapter, 0xa23, CCKSwingTable_Ch14[CCK_index][1]);
\r
358 rtw_write8(pAdapter, 0xa24, CCKSwingTable_Ch14[CCK_index][2]);
\r
359 rtw_write8(pAdapter, 0xa25, CCKSwingTable_Ch14[CCK_index][3]);
\r
360 rtw_write8(pAdapter, 0xa26, CCKSwingTable_Ch14[CCK_index][4]);
\r
361 rtw_write8(pAdapter, 0xa27, CCKSwingTable_Ch14[CCK_index][5]);
\r
362 rtw_write8(pAdapter, 0xa28, CCKSwingTable_Ch14[CCK_index][6]);
\r
363 rtw_write8(pAdapter, 0xa29, CCKSwingTable_Ch14[CCK_index][7]);
\r
367 RTPRINT(FINIT, INIT_TxPower,
\r
368 ("MPT_CCKTxPowerAdjustbyIndex 0xa20=%x\n", PlatformEFIORead4Byte(Adapter, 0xa20)));
\r
370 PlatformAtomicExchange(&Adapter->IntrCCKRefCount, FALSE);
\r
374 /*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/
\r
379 * Use H2C command to change channel,
\r
380 * not only modify rf register, but also other setting need to be done.
\r
382 void Hal_SetChannel(PADAPTER pAdapter)
\r
385 struct mp_priv *pmp = &pAdapter->mppriv;
\r
387 // SelectChannel(pAdapter, pmp->channel);
\r
388 set_channel_bwmode(pAdapter, pmp->channel, pmp->channel_offset, pmp->bandwidth);
\r
392 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
\r
393 PDM_ODM_T pDM_Odm = &(pHalData->odmpriv);
\r
394 struct mp_priv *pmp = &pAdapter->mppriv;
\r
395 u8 channel = pmp->channel;
\r
396 u8 bandwidth = pmp->bandwidth;
\r
397 u8 rate = pmp->rateidx;
\r
400 // set RF channel register
\r
401 for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++)
\r
403 _write_rfreg(pAdapter, eRFPath, rRfChannel, 0x3FF, channel);
\r
405 Hal_mpt_SwitchRfSetting(pAdapter);
\r
407 SelectChannel(pAdapter, channel);
\r
409 if (pHalData->CurrentChannel == 14 && !pDM_Odm->RFCalibrateInfo.bCCKinCH14) {
\r
410 pDM_Odm->RFCalibrateInfo.bCCKinCH14 = _TRUE;
\r
411 Hal_MPT_CCKTxPowerAdjust(pAdapter, pDM_Odm->RFCalibrateInfo.bCCKinCH14);
\r
413 else if (pHalData->CurrentChannel != 14 && pDM_Odm->RFCalibrateInfo.bCCKinCH14) {
\r
414 pDM_Odm->RFCalibrateInfo.bCCKinCH14 = _FALSE;
\r
415 Hal_MPT_CCKTxPowerAdjust(pAdapter, pDM_Odm->RFCalibrateInfo.bCCKinCH14);
\r
423 * Switch bandwitdth may change center frequency(channel)
\r
425 void Hal_SetBandwidth(PADAPTER pAdapter)
\r
427 struct mp_priv *pmp = &pAdapter->mppriv;
\r
430 SetBWMode(pAdapter, pmp->bandwidth, pmp->prime_channel_offset);
\r
431 Hal_mpt_SwitchRfSetting(pAdapter);
\r
434 void Hal_SetCCKTxPower(PADAPTER pAdapter, u8 *TxPower)
\r
439 // rf-A cck tx power
\r
440 write_bbreg(pAdapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, TxPower[RF_PATH_A]);
\r
441 tmpval = (TxPower[RF_PATH_A]<<16) | (TxPower[RF_PATH_A]<<8) | TxPower[RF_PATH_A];
\r
442 write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskH3Bytes, tmpval);
\r
444 // rf-B cck tx power
\r
445 write_bbreg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte0, TxPower[RF_PATH_B]);
\r
446 tmpval = (TxPower[RF_PATH_B]<<16) | (TxPower[RF_PATH_B]<<8) | TxPower[RF_PATH_B];
\r
447 write_bbreg(pAdapter, rTxAGC_B_CCK1_55_Mcs32, bMaskH3Bytes, tmpval);
\r
449 RT_TRACE(_module_mp_, _drv_notice_,
\r
450 ("-SetCCKTxPower: A[0x%02x] B[0x%02x]\n",
\r
451 TxPower[RF_PATH_A], TxPower[RF_PATH_B]));
\r
454 void Hal_SetOFDMTxPower(PADAPTER pAdapter, u8 *TxPower)
\r
458 PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.MptCtx;
\r
459 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
\r
463 tmpval = TxPower[RF_PATH_A];
\r
464 TxAGC = (tmpval<<24) | (tmpval<<16) | (tmpval<<8) | tmpval;
\r
466 write_bbreg(pAdapter, rTxAGC_A_Rate18_06, bMaskDWord, TxAGC);
\r
467 write_bbreg(pAdapter, rTxAGC_A_Rate54_24, bMaskDWord, TxAGC);
\r
468 write_bbreg(pAdapter, rTxAGC_A_Mcs03_Mcs00, bMaskDWord, TxAGC);
\r
469 write_bbreg(pAdapter, rTxAGC_A_Mcs07_Mcs04, bMaskDWord, TxAGC);
\r
470 write_bbreg(pAdapter, rTxAGC_A_Mcs11_Mcs08, bMaskDWord, TxAGC);
\r
471 write_bbreg(pAdapter, rTxAGC_A_Mcs15_Mcs12, bMaskDWord, TxAGC);
\r
474 tmpval = TxPower[RF_PATH_B];
\r
475 TxAGC = (tmpval<<24) | (tmpval<<16) | (tmpval<<8) | tmpval;
\r
477 write_bbreg(pAdapter, rTxAGC_B_Rate18_06, bMaskDWord, TxAGC);
\r
478 write_bbreg(pAdapter, rTxAGC_B_Rate54_24, bMaskDWord, TxAGC);
\r
479 write_bbreg(pAdapter, rTxAGC_B_Mcs03_Mcs00, bMaskDWord, TxAGC);
\r
480 write_bbreg(pAdapter, rTxAGC_B_Mcs07_Mcs04, bMaskDWord, TxAGC);
\r
481 write_bbreg(pAdapter, rTxAGC_B_Mcs11_Mcs08, bMaskDWord, TxAGC);
\r
482 write_bbreg(pAdapter, rTxAGC_B_Mcs15_Mcs12, bMaskDWord, TxAGC);
\r
484 RT_TRACE(_module_mp_, _drv_notice_,
\r
485 ("-SetOFDMTxPower: A[0x%02x] B[0x%02x]\n",
\r
486 TxPower[RF_PATH_A], TxPower[RF_PATH_B]));
\r
489 void Hal_SetAntennaPathPower(PADAPTER pAdapter)
\r
491 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
\r
492 u8 TxPowerLevel[MAX_RF_PATH_NUMS];
\r
495 TxPowerLevel[RF_PATH_A] = pAdapter->mppriv.txpoweridx;
\r
496 TxPowerLevel[RF_PATH_B] = pAdapter->mppriv.txpoweridx_b;
\r
498 switch (pAdapter->mppriv.antenna_tx)
\r
502 rfPath = RF_PATH_A;
\r
505 rfPath = RF_PATH_B;
\r
508 rfPath = RF_PATH_C;
\r
512 switch (pHalData->rf_chip)
\r
517 Hal_SetCCKTxPower(pAdapter, TxPowerLevel);
\r
518 if (pAdapter->mppriv.rateidx < MPT_RATE_6M) // CCK rate
\r
519 Hal_MPT_CCKTxPowerAdjustbyIndex(pAdapter, TxPowerLevel[rfPath]%2 == 0);
\r
520 Hal_SetOFDMTxPower(pAdapter, TxPowerLevel);
\r
532 IN PADAPTER pAdapter,
\r
533 IN MPT_TXPWR_DEF Rate,
\r
534 IN pu1Byte pTxPower
\r
537 if (IS_HARDWARE_TYPE_JAGUAR(pAdapter))
\r
539 //mpt_SetTxPower_8812(pAdapter, Rate, pTxPower);
\r
548 u4Byte TxAGC = 0, pwr=0;
\r
551 pwr = pTxPower[ODM_RF_PATH_A];
\r
552 TxAGC = (pwr<<16)|(pwr<<8)|(pwr);
\r
553 PHY_SetBBReg(pAdapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, pTxPower[ODM_RF_PATH_A]);
\r
554 PHY_SetBBReg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskH3Bytes, TxAGC);
\r
556 pwr = pTxPower[ODM_RF_PATH_B];
\r
557 TxAGC = (pwr<<16)|(pwr<<8)|(pwr);
\r
558 PHY_SetBBReg(pAdapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte0, pTxPower[ODM_RF_PATH_B]);
\r
559 PHY_SetBBReg(pAdapter, rTxAGC_B_CCK1_55_Mcs32, bMaskH3Bytes, TxAGC);
\r
567 PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx);
\r
568 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
\r
571 TxAGC |= ((pwr<<24)|(pwr<<16)|(pwr<<8)|pwr);
\r
572 DBG_8192C("HT Tx-rf(A) Power = 0x%x\n", TxAGC);
\r
574 PHY_SetBBReg(pAdapter, rTxAGC_A_Rate18_06, bMaskDWord, TxAGC);
\r
575 PHY_SetBBReg(pAdapter, rTxAGC_A_Rate54_24, bMaskDWord, TxAGC);
\r
576 PHY_SetBBReg(pAdapter, rTxAGC_A_Mcs03_Mcs00, bMaskDWord, TxAGC);
\r
577 PHY_SetBBReg(pAdapter, rTxAGC_A_Mcs07_Mcs04, bMaskDWord, TxAGC);
\r
578 PHY_SetBBReg(pAdapter, rTxAGC_A_Mcs11_Mcs08, bMaskDWord, TxAGC);
\r
579 PHY_SetBBReg(pAdapter, rTxAGC_A_Mcs15_Mcs12, bMaskDWord, TxAGC);
\r
583 TxAGC |= ((pwr<<24)|(pwr<<16)|(pwr<<8)|pwr);
\r
584 DBG_8192C("HT Tx-rf(B) Power = 0x%x\n", TxAGC);
\r
586 PHY_SetBBReg(pAdapter, rTxAGC_B_Rate18_06, bMaskDWord, TxAGC);
\r
587 PHY_SetBBReg(pAdapter, rTxAGC_B_Rate54_24, bMaskDWord, TxAGC);
\r
588 PHY_SetBBReg(pAdapter, rTxAGC_B_Mcs03_Mcs00, bMaskDWord, TxAGC);
\r
589 PHY_SetBBReg(pAdapter, rTxAGC_B_Mcs07_Mcs04, bMaskDWord, TxAGC);
\r
590 PHY_SetBBReg(pAdapter, rTxAGC_B_Mcs11_Mcs08, bMaskDWord, TxAGC);
\r
591 PHY_SetBBReg(pAdapter, rTxAGC_B_Mcs15_Mcs12, bMaskDWord, TxAGC);
\r
602 void Hal_SetTxPower(PADAPTER pAdapter)
\r
604 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
\r
605 PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx);
\r
606 PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
\r
607 u8 TxPowerLevel[MAX_RF_PATH];
\r
610 //#if DEV_BUS_TYPE == RT_USB_INTERFACE || DEV_BUS_TYPE == RT_SDIO_INTERFACE
\r
611 //RT_ASSERT((KeGetCurrentIrql() == PASSIVE_LEVEL), ("MPT_ProSetTxPower(): not in PASSIVE_LEVEL!\n"));
\r
614 path = (pHalData->AntennaTxPath == ANTENNA_A) ? (ODM_RF_PATH_A) : (ODM_RF_PATH_B);
\r
616 if (pHalData->rf_chip < RF_TYPE_MAX)
\r
618 if (IS_HARDWARE_TYPE_JAGUAR(pAdapter))
\r
621 DBG_8192C("===> MPT_ProSetTxPower: Jaguar\n");
\r
623 mpt_SetTxPower_8812(pAdapter, MPT_CCK, pMptCtx->TxPwrLevel);
\r
624 mpt_SetTxPower_8812(pAdapter, MPT_OFDM, pMptCtx->TxPwrLevel);
\r
625 mpt_SetTxPower_8812(pAdapter, MPT_VHT_OFDM, pMptCtx->TxPwrLevel);
\r
630 DBG_8192C("===> MPT_ProSetTxPower: Others\n");
\r
631 mpt_SetTxPower(pAdapter, MPT_CCK, pMptCtx->TxPwrLevel);
\r
632 Hal_MPT_CCKTxPowerAdjustbyIndex(pAdapter, pMptCtx->TxPwrLevel[path]%2 == 0);
\r
633 mpt_SetTxPower(pAdapter, MPT_OFDM, pMptCtx->TxPwrLevel);
\r
638 DBG_8192C("RFChipID < RF_TYPE_MAX, the RF chip is not supported - %d\n", pHalData->rf_chip);
\r
641 ODM_ClearTxPowerTrackingState(pDM_Odm);
\r
645 void Hal_SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset)
\r
648 u32 TxAGCOffset_B, TxAGCOffset_C, TxAGCOffset_D,tmpAGC;
\r
651 TxAGCOffset_B = (ulTxAGCOffset&0x000000ff);
\r
652 TxAGCOffset_C = ((ulTxAGCOffset&0x0000ff00)>>8);
\r
653 TxAGCOffset_D = ((ulTxAGCOffset&0x00ff0000)>>16);
\r
655 tmpAGC = (TxAGCOffset_D<<8 | TxAGCOffset_C<<4 | TxAGCOffset_B);
\r
656 write_bbreg(pAdapter, rFPGA0_TxGainStage,
\r
657 (bXBTxAGC|bXCTxAGC|bXDTxAGC), tmpAGC);
\r
661 void Hal_SetDataRate(PADAPTER pAdapter)
\r
663 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
\r
664 PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx);
\r
667 DataRate=MptToMgntRate(pAdapter->mppriv.rateidx);
\r
669 Hal_mpt_SwitchRfSetting(pAdapter);
\r
670 if (IS_CCK_RATE(DataRate))
\r
672 if (pMptCtx->MptRfPath == ODM_RF_PATH_A) // S1
\r
673 PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x51, 0xF, 0x6);
\r
675 PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x71, 0xF, 0x6);
\r
679 if (pMptCtx->MptRfPath == ODM_RF_PATH_A) // S1
\r
680 PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x51, 0xF, 0xE);
\r
682 PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x71, 0xF, 0xE);
\r
685 // <20130913, Kordan> 8723BS TFBGA uses the default setting.
\r
686 if ((IS_HARDWARE_TYPE_8723BS(pAdapter) &&
\r
687 ((pHalData->PackageType == PACKAGE_TFBGA79) || (pHalData->PackageType == PACKAGE_TFBGA90))))
\r
689 if (pMptCtx->MptRfPath == ODM_RF_PATH_A) // S1
\r
690 PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x51, 0xF, 0xE);
\r
692 PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x71, 0xF, 0xE);
\r
696 #define RF_PATH_AB 22
\r
698 void Hal_SetAntenna(PADAPTER pAdapter)
\r
700 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
\r
701 u4Byte ulAntennaTx, ulAntennaRx;
\r
702 PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx);
\r
703 PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
\r
704 PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);
\r
706 ulAntennaTx = pHalData->AntennaTxPath;
\r
707 ulAntennaRx = pHalData->AntennaRxPath;
\r
709 if (pHalData->rf_chip>= RF_TYPE_MAX)
\r
711 DBG_8192C("This RF chip ID is not supported\n");
\r
715 switch (pAdapter->mppriv.antenna_tx)
\r
717 u1Byte p = 0, i = 0;
\r
719 case ANTENNA_A: // Actually path S1 (Wi-Fi)
\r
721 pMptCtx->MptRfPath = ODM_RF_PATH_A;
\r
722 PHY_SetBBReg(pAdapter, rS0S1_PathSwitch, BIT9|BIT8|BIT7, 0x0);
\r
723 PHY_SetBBReg(pAdapter, 0xB2C, BIT31, 0x0); // AGC Table Sel
\r
725 //<20130522, Kordan> 0x51 and 0x71 should be set immediately after path switched, or they might be overwritten.
\r
726 if ((pHalData->PackageType == PACKAGE_TFBGA79) || (pHalData->PackageType == PACKAGE_TFBGA90))
\r
727 PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6B10E);
\r
729 PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6B04E);
\r
732 for (i = 0; i < 3; ++i)
\r
734 u4Byte offset = pRFCalibrateInfo->TxIQC_8723B[ODM_RF_PATH_A][i][0];
\r
735 u4Byte data = pRFCalibrateInfo->TxIQC_8723B[ODM_RF_PATH_A][i][1];
\r
737 PHY_SetBBReg(pAdapter, offset, bMaskDWord, data);
\r
738 DBG_8192C("Switch to S1 TxIQC(offset, data) = (0x%X, 0x%X)\n", offset, data);
\r
742 for (i = 0; i < 2; ++i)
\r
744 u4Byte offset = pRFCalibrateInfo->RxIQC_8723B[ODM_RF_PATH_A][i][0];
\r
745 u4Byte data = pRFCalibrateInfo->RxIQC_8723B[ODM_RF_PATH_A][i][1];
\r
747 PHY_SetBBReg(pAdapter, offset, bMaskDWord, data);
\r
748 DBG_8192C("Switch to S1 RxIQC (offset, data) = (0x%X, 0x%X)\n", offset, data);
\r
753 case ANTENNA_B: // Actually path S0 (BT)
\r
755 pMptCtx->MptRfPath = ODM_RF_PATH_B;
\r
756 PHY_SetBBReg(pAdapter, rS0S1_PathSwitch, BIT9|BIT8|BIT7, 0x5);
\r
757 PHY_SetBBReg(pAdapter, 0xB2C, BIT31, 0x1); // AGC Table Sel
\r
759 //<20130522, Kordan> 0x51 and 0x71 should be set immediately after path switched, or they might be overwritten.
\r
760 if ((pHalData->PackageType == PACKAGE_TFBGA79) || (pHalData->PackageType == PACKAGE_TFBGA90))
\r
761 PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6B10E);
\r
763 PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6B04E);
\r
766 for (i = 0; i < 3; ++i)
\r
768 // <20130603, Kordan> Because BB suppors only 1T1R, we restore IQC to S1 instead of S0.
\r
769 u4Byte offset = pRFCalibrateInfo->TxIQC_8723B[ODM_RF_PATH_A][i][0];
\r
770 u4Byte data = pRFCalibrateInfo->TxIQC_8723B[ODM_RF_PATH_B][i][1];
\r
771 if (pRFCalibrateInfo->TxIQC_8723B[ODM_RF_PATH_B][i][0] != 0) {
\r
772 PHY_SetBBReg(pAdapter, offset, bMaskDWord, data);
\r
773 DBG_8192C("Switch to S0 TxIQC (offset, data) = (0x%X, 0x%X)\n", offset, data);
\r
776 for (i = 0; i < 2; ++i)
\r
778 // <20130603, Kordan> Because BB suppors only 1T1R, we restore IQC to S1 instead of S0.
\r
779 u4Byte offset = pRFCalibrateInfo->RxIQC_8723B[ODM_RF_PATH_A][i][0];
\r
780 u4Byte data = pRFCalibrateInfo->RxIQC_8723B[ODM_RF_PATH_B][i][1];
\r
781 if (pRFCalibrateInfo->RxIQC_8723B[ODM_RF_PATH_B][i][0] != 0) {
\r
782 PHY_SetBBReg(pAdapter, offset, bMaskDWord, data);
\r
783 DBG_8192C("Switch to S0 RxIQC (offset, data) = (0x%X, 0x%X)\n", offset, data);
\r
790 pMptCtx->MptRfPath = RF_PATH_AB;
\r
791 RT_TRACE(_module_mp_, _drv_notice_, ("Unknown Tx antenna.\n"));
\r
795 RT_TRACE(_module_mp_, _drv_notice_, ("-SwitchAntenna: finished\n"));
\r
798 s32 Hal_SetThermalMeter(PADAPTER pAdapter, u8 target_ther)
\r
800 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
\r
803 if (!netif_running(pAdapter->pnetdev)) {
\r
804 RT_TRACE(_module_mp_, _drv_warning_, ("SetThermalMeter! Fail: interface not opened!\n"));
\r
808 if (check_fwstate(&pAdapter->mlmepriv, WIFI_MP_STATE) == _FALSE) {
\r
809 RT_TRACE(_module_mp_, _drv_warning_, ("SetThermalMeter: Fail! not in MP mode!\n"));
\r
813 target_ther &= 0xff;
\r
814 if (target_ther < 0x07)
\r
815 target_ther = 0x07;
\r
816 else if (target_ther > 0x1d)
\r
817 target_ther = 0x1d;
\r
819 pHalData->EEPROMThermalMeter = target_ther;
\r
824 void Hal_TriggerRFThermalMeter(PADAPTER pAdapter)
\r
826 PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_T_METER_8723B, BIT17 | BIT16, 0x03);
\r
827 // RT_TRACE(_module_mp_,_drv_alert_, ("TriggerRFThermalMeter() finished.\n" ));
\r
830 u8 Hal_ReadRFThermalMeter(PADAPTER pAdapter)
\r
832 u32 ThermalValue = 0;
\r
834 ThermalValue = (u1Byte)PHY_QueryRFReg(pAdapter, ODM_RF_PATH_A, RF_T_METER_8723B, 0xfc00); // 0x42: RF Reg[15:10]
\r
836 return (u8)ThermalValue;
\r
839 void Hal_GetThermalMeter(PADAPTER pAdapter, u8 *value)
\r
842 fw_cmd(pAdapter, IOCMD_GET_THERMAL_METER);
\r
843 rtw_msleep_os(1000);
\r
844 fw_cmd_data(pAdapter, value, 1);
\r
848 Hal_TriggerRFThermalMeter(pAdapter);
\r
849 rtw_msleep_os(1000);
\r
850 *value = Hal_ReadRFThermalMeter(pAdapter);
\r
854 void Hal_SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart)
\r
856 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
\r
857 pAdapter->mppriv.MptCtx.bSingleCarrier = bStart;
\r
858 if (bStart)// Start Single Carrier.
\r
860 RT_TRACE(_module_mp_,_drv_alert_, ("SetSingleCarrierTx: test start\n"));
\r
861 // Start Single Carrier.
\r
862 // 1. if OFDM block on?
\r
863 if(!PHY_QueryBBReg(pAdapter, rFPGA0_RFMOD, bOFDMEn))
\r
864 PHY_SetBBReg(pAdapter, rFPGA0_RFMOD, bOFDMEn, 1);//set OFDM block on
\r
866 // 2. set CCK test mode off, set to CCK normal mode
\r
867 PHY_SetBBReg(pAdapter, rCCK0_System, bCCKBBMode, 0);
\r
869 // 3. turn on scramble setting
\r
870 PHY_SetBBReg(pAdapter, rCCK0_System, bCCKScramble, 1);
\r
872 // 4. Turn On Continue Tx and turn off the other test modes.
\r
873 //if (IS_HARDWARE_TYPE_JAGUAR(pAdapter))
\r
874 //PHY_SetBBReg(pAdapter, rSingleTone_ContTx_Jaguar, BIT18|BIT17|BIT16, OFDM_SingleCarrier);
\r
876 PHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_SingleCarrier);
\r
878 else// Stop Single Carrier.
\r
880 // Stop Single Carrier.
\r
881 // Turn off all test modes.
\r
882 //if (IS_HARDWARE_TYPE_JAGUAR(pAdapter))
\r
883 // PHY_SetBBReg(pAdapter, rSingleTone_ContTx_Jaguar, BIT18|BIT17|BIT16, OFDM_ALL_OFF);
\r
885 PHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_ALL_OFF);
\r
889 PHY_SetBBReg(pAdapter, rPMAC_Reset, bBBResetB, 0x0);
\r
890 PHY_SetBBReg(pAdapter, rPMAC_Reset, bBBResetB, 0x1);
\r
895 void Hal_SetSingleToneTx(PADAPTER pAdapter, u8 bStart)
\r
897 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
\r
898 PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx);
\r
899 static u4Byte reg58 = 0x0;
\r
900 static u4Byte regRF0x0 = 0x0;
\r
901 static u4Byte reg0xCB0 = 0x0;
\r
902 static u4Byte reg0xEB0 = 0x0;
\r
903 static u4Byte reg0xCB4 = 0x0;
\r
904 static u4Byte reg0xEB4 = 0x0;
\r
907 switch (pAdapter->mppriv.antenna_tx)
\r
911 pMptCtx->MptRfPath = rfPath = RF_PATH_A;
\r
914 pMptCtx->MptRfPath = rfPath = RF_PATH_B;
\r
917 pMptCtx->MptRfPath = rfPath = RF_PATH_C;
\r
921 pAdapter->mppriv.MptCtx.bSingleTone = bStart;
\r
922 if (bStart)// Start Single Tone.
\r
925 // <20120326, Kordan> To amplify the power of tone for Xtal calibration. (asked by Edlu)
\r
926 if (IS_HARDWARE_TYPE_8188E(pAdapter))
\r
928 reg58 = PHY_QueryRFReg(pAdapter, rfPath, LNA_Low_Gain_3, bRFRegOffsetMask);
\r
929 if (rfPath == ODM_RF_PATH_A)
\r
930 pMptCtx->backup0x58_RF_A = reg58;
\r
932 pMptCtx->backup0x58_RF_B = reg58;
\r
934 PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, LNA_Low_Gain_3, BIT1, 0x1); // RF LO enabled
\r
935 PHY_SetBBReg(pAdapter, rFPGA0_RFMOD, bCCKEn, 0x0);
\r
936 PHY_SetBBReg(pAdapter, rFPGA0_RFMOD, bOFDMEn, 0x0);
\r
940 else if (IS_HARDWARE_TYPE_8192E(pAdapter))
\r
941 { // USB need to do RF LO disable first, PCIE isn't required to follow this order.
\r
942 PHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, LNA_Low_Gain_3, BIT1, 0x1); // RF LO disabled
\r
943 PHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, RF_AC, 0xF0000, 0x2); // Tx mode
\r
945 else if (IS_HARDWARE_TYPE_8723B(pAdapter))
\r
947 if (pMptCtx->MptRfPath == ODM_RF_PATH_A) {
\r
948 PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_AC, 0xF0000, 0x2); // Tx mode
\r
949 PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x56, 0xF, 0x1); // RF LO enabled
\r
951 // S0/S1 both use PATH A to configure
\r
952 PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_AC, 0xF0000, 0x2); // Tx mode
\r
953 PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x76, 0xF, 0x1); // RF LO enabled
\r
956 else if (IS_HARDWARE_TYPE_JAGUAR(pAdapter))
\r
959 u1Byte p = ODM_RF_PATH_A;
\r
961 regRF0x0 = PHY_QueryRFReg(pAdapter, ODM_RF_PATH_A, RF_AC_Jaguar, bRFRegOffsetMask);
\r
962 reg0xCB0 = PHY_QueryBBReg(pAdapter, rA_RFE_Pinmux_Jaguar, bMaskDWord);
\r
963 reg0xEB0 = PHY_QueryBBReg(pAdapter, rB_RFE_Pinmux_Jaguar, bMaskDWord);
\r
964 reg0xCB4 = PHY_QueryBBReg(pAdapter, rA_RFE_Pinmux_Jaguar+4, bMaskDWord);
\r
965 reg0xEB4 = PHY_QueryBBReg(pAdapter, rB_RFE_Pinmux_Jaguar+4, bMaskDWord);
\r
967 PHY_SetBBReg(pAdapter, rOFDMCCKEN_Jaguar, BIT29|BIT28, 0x0); // Disable CCK and OFDM
\r
969 if (pMptCtx->MptRfPath == RF_PATH_AB) {
\r
970 for (p = ODM_RF_PATH_A; p <= ODM_RF_PATH_B; ++p) {
\r
971 PHY_SetRFReg(pAdapter, p, RF_AC_Jaguar, 0xF0000, 0x2); // Tx mode: RF0x00[19:16]=4'b0010
\r
972 PHY_SetRFReg(pAdapter, p, RF_AC_Jaguar, 0x1F, 0x0); // Lowest RF gain index: RF_0x0[4:0] = 0
\r
973 PHY_SetRFReg(pAdapter, p, LNA_Low_Gain_3, BIT1, 0x1); // RF LO enabled
\r
976 PHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, RF_AC_Jaguar, 0xF0000, 0x2); // Tx mode: RF0x00[19:16]=4'b0010
\r
977 PHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, RF_AC_Jaguar, 0x1F, 0x0); // Lowest RF gain index: RF_0x0[4:0] = 0
\r
978 PHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, LNA_Low_Gain_3, BIT1, 0x1); // RF LO enabled
\r
982 PHY_SetBBReg(pAdapter, rA_RFE_Pinmux_Jaguar, 0xFF00F0, 0x77007); // 0xCB0[[23:16, 7:4] = 0x77007
\r
983 PHY_SetBBReg(pAdapter, rB_RFE_Pinmux_Jaguar, 0xFF00F0, 0x77007); // 0xCB0[[23:16, 7:4] = 0x77007
\r
985 if (pHalData->ExternalPA_5G) {
\r
987 PHY_SetBBReg(pAdapter, rA_RFE_Pinmux_Jaguar+4, 0xFF00000, 0x12); // 0xCB4[23:16] = 0x12
\r
988 PHY_SetBBReg(pAdapter, rB_RFE_Pinmux_Jaguar+4, 0xFF00000, 0x12); // 0xEB4[23:16] = 0x12
\r
989 } else if (pHalData->ExternalPA_2G) {
\r
990 PHY_SetBBReg(pAdapter, rA_RFE_Pinmux_Jaguar+4, 0xFF00000, 0x11); // 0xCB4[23:16] = 0x11
\r
991 PHY_SetBBReg(pAdapter, rB_RFE_Pinmux_Jaguar+4, 0xFF00000, 0x11); // 0xEB4[23:16] = 0x11
\r
997 // Turn On SingleTone and turn off the other test modes.
\r
998 PHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_SingleTone);
\r
1002 write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500);
\r
1003 write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500);
\r
1006 else// Stop Single Tone.
\r
1008 // Stop Single Tone.
\r
1009 if (IS_HARDWARE_TYPE_8188E(pAdapter))
\r
1011 PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, LNA_Low_Gain_3, bRFRegOffsetMask, pMptCtx->backup0x58_RF_A);
\r
1013 PHY_SetBBReg(pAdapter, rFPGA0_RFMOD, bCCKEn, 0x1);
\r
1014 PHY_SetBBReg(pAdapter, rFPGA0_RFMOD, bOFDMEn, 0x1);
\r
1016 else if (IS_HARDWARE_TYPE_8192E(pAdapter))
\r
1018 PHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, RF_AC, 0xF0000, 0x3); // Tx mode
\r
1019 PHY_SetRFReg(pAdapter, pMptCtx->MptRfPath, LNA_Low_Gain_3, BIT1, 0x0); // RF LO disabled
\r
1021 else if (IS_HARDWARE_TYPE_8723B(pAdapter))
\r
1023 if (pMptCtx->MptRfPath == ODM_RF_PATH_A) {
\r
1024 PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_AC, 0xF0000, 0x3); // Rx mode
\r
1025 PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x56, 0xF, 0x0); // RF LO disabled
\r
1027 // S0/S1 both use PATH A to configure
\r
1028 PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_AC, 0xF0000, 0x3); // Rx mode
\r
1029 PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, 0x76, 0xF, 0x0); // RF LO disabled
\r
1032 else if (IS_HARDWARE_TYPE_JAGUAR(pAdapter))
\r
1035 u1Byte p = ODM_RF_PATH_A;
\r
1037 PHY_SetBBReg(pAdapter, rOFDMCCKEN_Jaguar, BIT29|BIT28, 0x3); // Disable CCK and OFDM
\r
1039 if (pMptCtx->MptRfPath == RF_PATH_AB) {
\r
1040 for (p = ODM_RF_PATH_A; p <= ODM_RF_PATH_B; ++p) {
\r
1041 PHY_SetRFReg(pAdapter, p, RF_AC_Jaguar, bRFRegOffsetMask, regRF0x0);
\r
1042 PHY_SetRFReg(pAdapter, p, LNA_Low_Gain_3, BIT1, 0x0); // RF LO disabled
\r
1045 PHY_SetRFReg(pAdapter, p, RF_AC_Jaguar, bRFRegOffsetMask, regRF0x0);
\r
1046 PHY_SetRFReg(pAdapter, p, LNA_Low_Gain_3, BIT1, 0x0); // RF LO disabled
\r
1048 PHY_SetBBReg(pAdapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, reg0xCB0);
\r
1049 PHY_SetBBReg(pAdapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, reg0xEB0);
\r
1050 PHY_SetBBReg(pAdapter, rA_RFE_Pinmux_Jaguar+4, bMaskDWord, reg0xCB4);
\r
1051 PHY_SetBBReg(pAdapter, rB_RFE_Pinmux_Jaguar+4, bMaskDWord, reg0xEB4);
\r
1056 // Turn off all test modes.
\r
1058 PHY_SetBBReg(pAdapter, rSingleTone_ContTx_Jaguar, BIT18|BIT17|BIT16, OFDM_ALL_OFF);
\r
1062 write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100);
\r
1063 write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100);
\r
1070 void Hal_SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart)
\r
1072 pAdapter->mppriv.MptCtx.bCarrierSuppression = bStart;
\r
1073 if (bStart) // Start Carrier Suppression.
\r
1075 RT_TRACE(_module_mp_,_drv_alert_, ("SetCarrierSuppressionTx: test start\n"));
\r
1076 //if(pMgntInfo->dot11CurrentWirelessMode == WIRELESS_MODE_B)
\r
1077 if (pAdapter->mppriv.rateidx <= MPT_RATE_11M)
\r
1079 // 1. if CCK block on?
\r
1080 if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn))
\r
1081 write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);//set CCK block on
\r
1083 //Turn Off All Test Mode
\r
1084 write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable);
\r
1085 write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable);
\r
1086 write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable);
\r
1088 write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x2); //transmit mode
\r
1089 write_bbreg(pAdapter, rCCK0_System, bCCKScramble, 0x0); //turn off scramble setting
\r
1091 //Set CCK Tx Test Rate
\r
1092 //PHY_SetBBReg(pAdapter, rCCK0_System, bCCKTxRate, pMgntInfo->ForcedDataRate);
\r
1093 write_bbreg(pAdapter, rCCK0_System, bCCKTxRate, 0x0); //Set FTxRate to 1Mbps
\r
1096 //Set for dynamic set Power index
\r
1097 write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500);
\r
1098 write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500);
\r
1101 else// Stop Carrier Suppression.
\r
1103 RT_TRACE(_module_mp_,_drv_alert_, ("SetCarrierSuppressionTx: test stop\n"));
\r
1104 //if(pMgntInfo->dot11CurrentWirelessMode == WIRELESS_MODE_B)
\r
1105 if (pAdapter->mppriv.rateidx <= MPT_RATE_11M ) {
\r
1106 write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x0); //normal mode
\r
1107 write_bbreg(pAdapter, rCCK0_System, bCCKScramble, 0x1); //turn on scramble setting
\r
1110 write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0);
\r
1111 write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1);
\r
1113 //Stop for dynamic set Power index
\r
1114 write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100);
\r
1115 write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100);
\r
1117 //DbgPrint("\n MPT_ProSetCarrierSupp() is finished. \n");
\r
1120 void Hal_SetCCKContinuousTx(PADAPTER pAdapter, u8 bStart)
\r
1126 RT_TRACE(_module_mp_, _drv_alert_,
\r
1127 ("SetCCKContinuousTx: test start\n"));
\r
1129 // 1. if CCK block on?
\r
1130 if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn))
\r
1131 write_bbreg(pAdapter, rFPGA0_RFMOD, bCCKEn, bEnable);//set CCK block on
\r
1133 //Turn Off All Test Mode
\r
1134 //if (IS_HARDWARE_TYPE_JAGUAR(pAdapter))
\r
1135 //PHY_SetBBReg(pAdapter, rSingleTone_ContTx_Jaguar, BIT18|BIT17|BIT16, OFDM_ALL_OFF);
\r
1137 PHY_SetBBReg(pAdapter, rOFDM1_LSTF, BIT30|BIT29|BIT28, OFDM_ALL_OFF);
\r
1138 //Set CCK Tx Test Rate
\r
1140 switch(pAdapter->mppriv.rateidx)
\r
1159 cckrate = pAdapter->mppriv.rateidx;
\r
1161 write_bbreg(pAdapter, rCCK0_System, bCCKTxRate, cckrate);
\r
1162 write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x2); //transmit mode
\r
1163 write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); //turn on scramble setting
\r
1165 write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500);
\r
1166 write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500);
\r
1170 RT_TRACE(_module_mp_, _drv_info_,
\r
1171 ("SetCCKContinuousTx: test stop\n"));
\r
1173 write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, 0x0); //normal mode
\r
1174 write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable); //turn on scramble setting
\r
1177 write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0);
\r
1178 write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1);
\r
1180 write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100);
\r
1181 write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100);
\r
1184 pAdapter->mppriv.MptCtx.bCckContTx = bStart;
\r
1185 pAdapter->mppriv.MptCtx.bOfdmContTx = _FALSE;
\r
1186 }/* mpt_StartCckContTx */
\r
1188 void Hal_SetOFDMContinuousTx(PADAPTER pAdapter, u8 bStart)
\r
1190 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
\r
1193 RT_TRACE(_module_mp_, _drv_info_, ("SetOFDMContinuousTx: test start\n"));
\r
1194 // 1. if OFDM block on?
\r
1195 if(!read_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn))
\r
1196 write_bbreg(pAdapter, rFPGA0_RFMOD, bOFDMEn, bEnable);//set OFDM block on
\r
1199 // 2. set CCK test mode off, set to CCK normal mode
\r
1200 write_bbreg(pAdapter, rCCK0_System, bCCKBBMode, bDisable);
\r
1202 // 3. turn on scramble setting
\r
1203 write_bbreg(pAdapter, rCCK0_System, bCCKScramble, bEnable);
\r
1205 // 4. Turn On Continue Tx and turn off the other test modes.
\r
1206 write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bEnable);
\r
1207 write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable);
\r
1208 write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable);
\r
1210 write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000500);
\r
1211 write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000500);
\r
1214 RT_TRACE(_module_mp_,_drv_info_, ("SetOFDMContinuousTx: test stop\n"));
\r
1215 write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMContinueTx, bDisable);
\r
1216 write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleCarrier, bDisable);
\r
1217 write_bbreg(pAdapter, rOFDM1_LSTF, bOFDMSingleTone, bDisable);
\r
1219 rtw_msleep_os(10);
\r
1221 write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x0);
\r
1222 write_bbreg(pAdapter, rPMAC_Reset, bBBResetB, 0x1);
\r
1224 write_bbreg(pAdapter, rFPGA0_XA_HSSIParameter1, bMaskDWord, 0x01000100);
\r
1225 write_bbreg(pAdapter, rFPGA0_XB_HSSIParameter1, bMaskDWord, 0x01000100);
\r
1228 pAdapter->mppriv.MptCtx.bCckContTx = _FALSE;
\r
1229 pAdapter->mppriv.MptCtx.bOfdmContTx = bStart;
\r
1230 }/* mpt_StartOfdmContTx */
\r
1232 void Hal_SetContinuousTx(PADAPTER pAdapter, u8 bStart)
\r
1235 // ADC turn off [bit24-21] adc port0 ~ port1
\r
1237 write_bbreg(pAdapter, rRx_Wait_CCCA, read_bbreg(pAdapter, rRx_Wait_CCCA) & 0xFE1FFFFF);
\r
1238 rtw_usleep_os(100);
\r
1241 RT_TRACE(_module_mp_, _drv_info_,
\r
1242 ("SetContinuousTx: rate:%d\n", pAdapter->mppriv.rateidx));
\r
1244 pAdapter->mppriv.MptCtx.bStartContTx = bStart;
\r
1246 //write_bbreg(pAdapter, rFixContTxRate, bFixContTxRate, bStart);
\r
1248 if (pAdapter->mppriv.rateidx <= MPT_RATE_11M)
\r
1250 Hal_SetCCKContinuousTx(pAdapter, bStart);
\r
1252 else if ((pAdapter->mppriv.rateidx >= MPT_RATE_6M) &&
\r
1253 (pAdapter->mppriv.rateidx <= MPT_RATE_MCS15))
\r
1255 Hal_SetOFDMContinuousTx(pAdapter, bStart);
\r
1258 // ADC turn on [bit24-21] adc port0 ~ port1
\r
1260 write_bbreg(pAdapter, rRx_Wait_CCCA, read_bbreg(pAdapter, rRx_Wait_CCCA) | 0x01E00000);
\r
1267 u8 MRateToHwRate8723B( u8 rate)
\r
1269 u8 ret = DESC8723B_RATE1M;
\r
1273 // CCK and OFDM non-HT rates
\r
1274 case MPT_RATE_1M: ret = DESC8723B_RATE1M; break;
\r
1275 case MPT_RATE_2M: ret = DESC8723B_RATE2M; break;
\r
1276 case MPT_RATE_55M: ret = DESC8723B_RATE5_5M; break;
\r
1277 case MPT_RATE_11M: ret = DESC8723B_RATE11M; break;
\r
1278 case MPT_RATE_6M: ret = DESC8723B_RATE6M; break;
\r
1279 case MPT_RATE_9M: ret = DESC8723B_RATE9M; break;
\r
1280 case MPT_RATE_12M: ret = DESC8723B_RATE12M; break;
\r
1281 case MPT_RATE_18M: ret = DESC8723B_RATE18M; break;
\r
1282 case MPT_RATE_24M: ret = DESC8723B_RATE24M; break;
\r
1283 case MPT_RATE_36M: ret = DESC8723B_RATE36M; break;
\r
1284 case MPT_RATE_48M: ret = DESC8723B_RATE48M; break;
\r
1285 case MPT_RATE_54M: ret = DESC8723B_RATE54M; break;
\r
1287 // HT rates since here
\r
1288 case MPT_RATE_MCS0: ret = DESC8723B_RATEMCS0; break;
\r
1289 case MPT_RATE_MCS1: ret = DESC8723B_RATEMCS1; break;
\r
1290 case MPT_RATE_MCS2: ret = DESC8723B_RATEMCS2; break;
\r
1291 case MPT_RATE_MCS3: ret = DESC8723B_RATEMCS3; break;
\r
1292 case MPT_RATE_MCS4: ret = DESC8723B_RATEMCS4; break;
\r
1293 case MPT_RATE_MCS5: ret = DESC8723B_RATEMCS5; break;
\r
1294 case MPT_RATE_MCS6: ret = DESC8723B_RATEMCS6; break;
\r
1295 case MPT_RATE_MCS7: ret = DESC8723B_RATEMCS7; break;
\r
1296 case MPT_RATE_MCS8: ret = DESC8723B_RATEMCS8; break;
\r
1297 case MPT_RATE_MCS9: ret = DESC8723B_RATEMCS9; break;
\r
1298 case MPT_RATE_MCS10: ret = DESC8723B_RATEMCS10; break;
\r
1299 case MPT_RATE_MCS11: ret = DESC8723B_RATEMCS11; break;
\r
1300 case MPT_RATE_MCS12: ret = DESC8723B_RATEMCS12; break;
\r
1301 case MPT_RATE_MCS13: ret = DESC8723B_RATEMCS13; break;
\r
1302 case MPT_RATE_MCS14: ret = DESC8723B_RATEMCS14; break;
\r
1303 case MPT_RATE_MCS15: ret = DESC8723B_RATEMCS15; break;
\r
1304 case MPT_RATE_VHT1SS_MCS0: ret = DESC8723B_RATEVHTSS1MCS0; break;
\r
1305 case MPT_RATE_VHT1SS_MCS1: ret = DESC8723B_RATEVHTSS1MCS1; break;
\r
1306 case MPT_RATE_VHT1SS_MCS2: ret = DESC8723B_RATEVHTSS1MCS2; break;
\r
1307 case MPT_RATE_VHT1SS_MCS3: ret = DESC8723B_RATEVHTSS1MCS3; break;
\r
1308 case MPT_RATE_VHT1SS_MCS4: ret = DESC8723B_RATEVHTSS1MCS4; break;
\r
1309 case MPT_RATE_VHT1SS_MCS5: ret = DESC8723B_RATEVHTSS1MCS5; break;
\r
1310 case MPT_RATE_VHT1SS_MCS6: ret = DESC8723B_RATEVHTSS1MCS6; break;
\r
1311 case MPT_RATE_VHT1SS_MCS7: ret = DESC8723B_RATEVHTSS1MCS7; break;
\r
1312 case MPT_RATE_VHT1SS_MCS8: ret = DESC8723B_RATEVHTSS1MCS8; break;
\r
1313 case MPT_RATE_VHT1SS_MCS9: ret = DESC8723B_RATEVHTSS1MCS9; break;
\r
1314 case MPT_RATE_VHT2SS_MCS0: ret = DESC8723B_RATEVHTSS2MCS0; break;
\r
1315 case MPT_RATE_VHT2SS_MCS1: ret = DESC8723B_RATEVHTSS2MCS1; break;
\r
1316 case MPT_RATE_VHT2SS_MCS2: ret = DESC8723B_RATEVHTSS2MCS2; break;
\r
1317 case MPT_RATE_VHT2SS_MCS3: ret = DESC8723B_RATEVHTSS2MCS3; break;
\r
1318 case MPT_RATE_VHT2SS_MCS4: ret = DESC8723B_RATEVHTSS2MCS4; break;
\r
1319 case MPT_RATE_VHT2SS_MCS5: ret = DESC8723B_RATEVHTSS2MCS5; break;
\r
1320 case MPT_RATE_VHT2SS_MCS6: ret = DESC8723B_RATEVHTSS2MCS6; break;
\r
1321 case MPT_RATE_VHT2SS_MCS7: ret = DESC8723B_RATEVHTSS2MCS7; break;
\r
1322 case MPT_RATE_VHT2SS_MCS8: ret = DESC8723B_RATEVHTSS2MCS8; break;
\r
1323 case MPT_RATE_VHT2SS_MCS9: ret = DESC8723B_RATEVHTSS2MCS9; break;
\r
1331 u8 HwRateToMRate8723B(u8 rate)
\r
1334 u8 ret_rate = MGN_1M;
\r
1340 case DESC8723B_RATE1M: ret_rate = MGN_1M; break;
\r
1341 case DESC8723B_RATE2M: ret_rate = MGN_2M; break;
\r
1342 case DESC8723B_RATE5_5M: ret_rate = MGN_5_5M; break;
\r
1343 case DESC8723B_RATE11M: ret_rate = MGN_11M; break;
\r
1344 case DESC8723B_RATE6M: ret_rate = MGN_6M; break;
\r
1345 case DESC8723B_RATE9M: ret_rate = MGN_9M; break;
\r
1346 case DESC8723B_RATE12M: ret_rate = MGN_12M; break;
\r
1347 case DESC8723B_RATE18M: ret_rate = MGN_18M; break;
\r
1348 case DESC8723B_RATE24M: ret_rate = MGN_24M; break;
\r
1349 case DESC8723B_RATE36M: ret_rate = MGN_36M; break;
\r
1350 case DESC8723B_RATE48M: ret_rate = MGN_48M; break;
\r
1351 case DESC8723B_RATE54M: ret_rate = MGN_54M; break;
\r
1352 case DESC8723B_RATEMCS0: ret_rate = MGN_MCS0; break;
\r
1353 case DESC8723B_RATEMCS1: ret_rate = MGN_MCS1; break;
\r
1354 case DESC8723B_RATEMCS2: ret_rate = MGN_MCS2; break;
\r
1355 case DESC8723B_RATEMCS3: ret_rate = MGN_MCS3; break;
\r
1356 case DESC8723B_RATEMCS4: ret_rate = MGN_MCS4; break;
\r
1357 case DESC8723B_RATEMCS5: ret_rate = MGN_MCS5; break;
\r
1358 case DESC8723B_RATEMCS6: ret_rate = MGN_MCS6; break;
\r
1359 case DESC8723B_RATEMCS7: ret_rate = MGN_MCS7; break;
\r
1360 case DESC8723B_RATEMCS8: ret_rate = MGN_MCS8; break;
\r
1361 case DESC8723B_RATEMCS9: ret_rate = MGN_MCS9; break;
\r
1362 case DESC8723B_RATEMCS10: ret_rate = MGN_MCS10; break;
\r
1363 case DESC8723B_RATEMCS11: ret_rate = MGN_MCS11; break;
\r
1364 case DESC8723B_RATEMCS12: ret_rate = MGN_MCS12; break;
\r
1365 case DESC8723B_RATEMCS13: ret_rate = MGN_MCS13; break;
\r
1366 case DESC8723B_RATEMCS14: ret_rate = MGN_MCS14; break;
\r
1367 case DESC8723B_RATEMCS15: ret_rate = MGN_MCS15; break;
\r
1368 case DESC8723B_RATEVHTSS1MCS0: ret_rate = MGN_VHT1SS_MCS0; break;
\r
1369 case DESC8723B_RATEVHTSS1MCS1: ret_rate = MGN_VHT1SS_MCS1; break;
\r
1370 case DESC8723B_RATEVHTSS1MCS2: ret_rate = MGN_VHT1SS_MCS2; break;
\r
1371 case DESC8723B_RATEVHTSS1MCS3: ret_rate = MGN_VHT1SS_MCS3; break;
\r
1372 case DESC8723B_RATEVHTSS1MCS4: ret_rate = MGN_VHT1SS_MCS4; break;
\r
1373 case DESC8723B_RATEVHTSS1MCS5: ret_rate = MGN_VHT1SS_MCS5; break;
\r
1374 case DESC8723B_RATEVHTSS1MCS6: ret_rate = MGN_VHT1SS_MCS6; break;
\r
1375 case DESC8723B_RATEVHTSS1MCS7: ret_rate = MGN_VHT1SS_MCS7; break;
\r
1376 case DESC8723B_RATEVHTSS1MCS8: ret_rate = MGN_VHT1SS_MCS8; break;
\r
1377 case DESC8723B_RATEVHTSS1MCS9: ret_rate = MGN_VHT1SS_MCS9; break;
\r
1378 case DESC8723B_RATEVHTSS2MCS0: ret_rate = MGN_VHT2SS_MCS0; break;
\r
1379 case DESC8723B_RATEVHTSS2MCS1: ret_rate = MGN_VHT2SS_MCS1; break;
\r
1380 case DESC8723B_RATEVHTSS2MCS2: ret_rate = MGN_VHT2SS_MCS2; break;
\r
1381 case DESC8723B_RATEVHTSS2MCS3: ret_rate = MGN_VHT2SS_MCS3; break;
\r
1382 case DESC8723B_RATEVHTSS2MCS4: ret_rate = MGN_VHT2SS_MCS4; break;
\r
1383 case DESC8723B_RATEVHTSS2MCS5: ret_rate = MGN_VHT2SS_MCS5; break;
\r
1384 case DESC8723B_RATEVHTSS2MCS6: ret_rate = MGN_VHT2SS_MCS6; break;
\r
1385 case DESC8723B_RATEVHTSS2MCS7: ret_rate = MGN_VHT2SS_MCS7; break;
\r
1386 case DESC8723B_RATEVHTSS2MCS8: ret_rate = MGN_VHT2SS_MCS8; break;
\r
1387 case DESC8723B_RATEVHTSS2MCS9: ret_rate = MGN_VHT2SS_MCS9; break;
\r
1390 DBG_8192C("HwRateToMRate8723B(): Non supported Rate [%x]!!!\n",rate );
\r
1396 #endif // CONFIG_MP_INCLUDE
\r