1 //============================================================
\r
4 // This file is for TXBF mechanism
\r
6 //============================================================
\r
7 #include "mp_precomp.h"
\r
8 #include "../phydm_precomp.h"
\r
10 #if (BEAMFORMING_SUPPORT == 1)
\r
11 /*Beamforming halcomtxbf API create by YuChen 2015/05*/
\r
14 halComTxbf_beamformInit(
\r
18 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
20 if (pDM_Odm->SupportICType & ODM_RTL8822B)
\r
21 HalTxbf8822B_Init(pDM_Odm);
\r
24 /*Only used for MU BFer Entry when get GID management frame (self is as MU STA)*/
\r
26 halComTxbf_ConfigGtab(
\r
30 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
32 if (pDM_Odm->SupportICType & ODM_RTL8822B)
\r
33 HalTxbf8822B_ConfigGtab(pDM_Odm);
\r
37 phydm_beamformSetSoundingEnter(
\r
41 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
42 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
43 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
45 if (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_EnterWorkItem)) == FALSE)
\r
46 PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_EnterWorkItem));
\r
48 halComTxbf_EnterWorkItemCallback(pDM_Odm);
\r
53 phydm_beamformSetSoundingLeave(
\r
57 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
58 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
59 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
61 if (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_LeaveWorkItem)) == FALSE)
\r
62 PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_LeaveWorkItem));
\r
64 halComTxbf_LeaveWorkItemCallback(pDM_Odm);
\r
69 phydm_beamformSetSoundingRate(
\r
73 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
74 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
75 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
77 if (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_RateWorkItem)) == FALSE)
\r
78 PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_RateWorkItem));
\r
80 halComTxbf_RateWorkItemCallback(pDM_Odm);
\r
85 phydm_beamformSetSoundingStatus(
\r
89 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
90 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
91 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
93 if (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_StatusWorkItem)) == FALSE)
\r
94 PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_StatusWorkItem));
\r
96 halComTxbf_StatusWorkItemCallback(pDM_Odm);
\r
101 phydm_beamformSetSoundingFwNdpa(
\r
105 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
106 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
107 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
109 if (*pDM_Odm->pbFwDwRsvdPageInProgress)
\r
110 ODM_SetTimer(pDM_Odm, &(pTxbfInfo->Txbf_FwNdpaTimer), 5);
\r
112 PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_FwNdpaWorkItem));
\r
114 halComTxbf_FwNdpaWorkItemCallback(pDM_Odm);
\r
119 phydm_beamformSetSoundingClk(
\r
123 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
124 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
125 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
127 if (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_ClkWorkItem)) == FALSE)
\r
128 PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_ClkWorkItem));
\r
129 #elif(DM_ODM_SUPPORT_TYPE == ODM_CE)
\r
130 PADAPTER padapter = pDM_Odm->Adapter;
\r
132 rtw_run_in_thread_cmd(padapter, halComTxbf_ClkWorkItemCallback, padapter);
\r
134 halComTxbf_ClkWorkItemCallback(pDM_Odm);
\r
139 phydm_beamformSetResetTxPath(
\r
143 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
144 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
145 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
147 if (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_ResetTxPathWorkItem)) == FALSE)
\r
148 PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_ResetTxPathWorkItem));
\r
150 halComTxbf_ResetTxPathWorkItemCallback(pDM_Odm);
\r
155 phydm_beamformSetGetTxRate(
\r
159 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
160 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
161 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
163 if (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_GetTxRateWorkItem)) == FALSE)
\r
164 PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_GetTxRateWorkItem));
\r
166 halComTxbf_GetTxRateWorkItemCallback(pDM_Odm);
\r
171 halComTxbf_EnterWorkItemCallback(
\r
172 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
173 IN PADAPTER Adapter
\r
179 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
180 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
181 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
183 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
185 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
186 u1Byte Idx = pTxbfInfo->TXBFIdx;
\r
188 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
\r
190 if (pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821))
\r
191 HalTxbfJaguar_Enter(pDM_Odm, Idx);
\r
192 else if (pDM_Odm->SupportICType & ODM_RTL8192E)
\r
193 HalTxbf8192E_Enter(pDM_Odm, Idx);
\r
194 else if (pDM_Odm->SupportICType & ODM_RTL8814A)
\r
195 HalTxbf8814A_Enter(pDM_Odm, Idx);
\r
196 else if (pDM_Odm->SupportICType & ODM_RTL8821B)
\r
197 HalTxbf8821B_Enter(pDM_Odm, Idx);
\r
198 else if (pDM_Odm->SupportICType & ODM_RTL8822B)
\r
199 HalTxbf8822B_Enter(pDM_Odm, Idx);
\r
203 halComTxbf_LeaveWorkItemCallback(
\r
204 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
205 IN PADAPTER Adapter
\r
211 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
212 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
213 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
215 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
217 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
219 u1Byte Idx = pTxbfInfo->TXBFIdx;
\r
221 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
\r
223 if (pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821))
\r
224 HalTxbfJaguar_Leave(pDM_Odm, Idx);
\r
225 else if (pDM_Odm->SupportICType & ODM_RTL8192E)
\r
226 HalTxbf8192E_Leave(pDM_Odm, Idx);
\r
227 else if (pDM_Odm->SupportICType & ODM_RTL8814A)
\r
228 HalTxbf8814A_Leave(pDM_Odm, Idx);
\r
229 else if (pDM_Odm->SupportICType & ODM_RTL8821B)
\r
230 HalTxbf8821B_Leave(pDM_Odm, Idx);
\r
231 else if (pDM_Odm->SupportICType & ODM_RTL8822B)
\r
232 HalTxbf8822B_Leave(pDM_Odm, Idx);
\r
237 halComTxbf_FwNdpaWorkItemCallback(
\r
238 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
239 IN PADAPTER Adapter
\r
245 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
246 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
247 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
249 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
251 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
252 u1Byte Idx = pTxbfInfo->NdpaIdx;
\r
254 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
\r
256 if (pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821))
\r
257 HalTxbfJaguar_FwTxBF(pDM_Odm, Idx);
\r
258 else if (pDM_Odm->SupportICType & ODM_RTL8192E)
\r
259 HalTxbf8192E_FwTxBF(pDM_Odm, Idx);
\r
260 else if (pDM_Odm->SupportICType & ODM_RTL8814A)
\r
261 HalTxbf8814A_FwTxBF(pDM_Odm, Idx);
\r
262 else if (pDM_Odm->SupportICType & ODM_RTL8821B)
\r
263 HalTxbf8821B_FwTxBF(pDM_Odm, Idx);
\r
264 else if (pDM_Odm->SupportICType & ODM_RTL8822B)
\r
265 HalTxbf8822B_FwTxBF(pDM_Odm, Idx);
\r
269 halComTxbf_ClkWorkItemCallback(
\r
270 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
271 IN PADAPTER Adapter
\r
277 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
278 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
279 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
281 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
284 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
\r
286 if (pDM_Odm->SupportICType & ODM_RTL8812)
\r
287 HalTxbfJaguar_Clk_8812A(pDM_Odm);
\r
293 halComTxbf_RateWorkItemCallback(
\r
294 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
295 IN PADAPTER Adapter
\r
301 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
302 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
303 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
305 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
307 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
308 u1Byte BW = pTxbfInfo->BW;
\r
309 u1Byte Rate = pTxbfInfo->Rate;
\r
311 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
\r
313 if (pDM_Odm->SupportICType & ODM_RTL8812)
\r
314 HalTxbf8812A_setNDPArate(pDM_Odm, BW, Rate);
\r
315 else if (pDM_Odm->SupportICType & ODM_RTL8192E)
\r
316 HalTxbf8192E_setNDPArate(pDM_Odm, BW, Rate);
\r
317 else if (pDM_Odm->SupportICType & ODM_RTL8814A)
\r
318 HalTxbf8814A_setNDPArate(pDM_Odm, BW, Rate);
\r
323 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
325 halComTxbf_FwNdpaTimerCallback(
\r
326 IN PRT_TIMER pTimer
\r
330 PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
\r
331 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
332 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
334 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
337 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
\r
339 if (*pDM_Odm->pbFwDwRsvdPageInProgress)
\r
340 ODM_SetTimer(pDM_Odm, &(pTxbfInfo->Txbf_FwNdpaTimer), 5);
\r
342 PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_FwNdpaWorkItem));
\r
348 halComTxbf_StatusWorkItemCallback(
\r
349 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
350 IN PADAPTER Adapter
\r
356 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
357 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
358 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
360 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
362 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
364 u1Byte Idx = pTxbfInfo->TXBFIdx;
\r
366 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
\r
368 if (pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821))
\r
369 HalTxbfJaguar_Status(pDM_Odm, Idx);
\r
370 else if (pDM_Odm->SupportICType & ODM_RTL8192E)
\r
371 HalTxbf8192E_Status(pDM_Odm, Idx);
\r
372 else if (pDM_Odm->SupportICType & ODM_RTL8814A)
\r
373 HalTxbf8814A_Status(pDM_Odm, Idx);
\r
374 else if (pDM_Odm->SupportICType & ODM_RTL8821B)
\r
375 HalTxbf8821B_Status(pDM_Odm, Idx);
\r
376 else if (pDM_Odm->SupportICType & ODM_RTL8822B)
\r
377 HalTxbf8822B_Status(pDM_Odm, Idx);
\r
381 halComTxbf_ResetTxPathWorkItemCallback(
\r
382 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
383 IN PADAPTER Adapter
\r
389 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
390 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
391 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
393 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
395 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
397 u1Byte Idx = pTxbfInfo->TXBFIdx;
\r
399 if (pDM_Odm->SupportICType & ODM_RTL8814A)
\r
400 HalTxbf8814A_ResetTxPath(pDM_Odm, Idx);
\r
405 halComTxbf_GetTxRateWorkItemCallback(
\r
406 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
407 IN PADAPTER Adapter
\r
413 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
414 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
415 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
417 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
420 if (pDM_Odm->SupportICType & ODM_RTL8814A)
\r
421 HalTxbf8814A_GetTxRate(pDM_Odm);
\r
432 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
433 PBOOLEAN pBoolean=(PBOOLEAN)pInBuf;
\r
434 pu1Byte pU1Tmp=(pu1Byte)pInBuf;
\r
435 pu4Byte pU4Tmp=(pu4Byte)pInBuf;
\r
436 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
438 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] setType = 0x%X\n", __func__, setType));
\r
441 case TXBF_SET_SOUNDING_ENTER:
\r
442 pTxbfInfo->TXBFIdx = *pU1Tmp;
\r
443 phydm_beamformSetSoundingEnter(pDM_Odm);
\r
446 case TXBF_SET_SOUNDING_LEAVE:
\r
447 pTxbfInfo->TXBFIdx = *pU1Tmp;
\r
448 phydm_beamformSetSoundingLeave(pDM_Odm);
\r
451 case TXBF_SET_SOUNDING_RATE:
\r
452 pTxbfInfo->BW = pU1Tmp[0];
\r
453 pTxbfInfo->Rate = pU1Tmp[1];
\r
454 phydm_beamformSetSoundingRate(pDM_Odm);
\r
457 case TXBF_SET_SOUNDING_STATUS:
\r
458 pTxbfInfo->TXBFIdx = *pU1Tmp;
\r
459 phydm_beamformSetSoundingStatus(pDM_Odm);
\r
462 case TXBF_SET_SOUNDING_FW_NDPA:
\r
463 pTxbfInfo->NdpaIdx = *pU1Tmp;
\r
464 phydm_beamformSetSoundingFwNdpa(pDM_Odm);
\r
467 case TXBF_SET_SOUNDING_CLK:
\r
468 phydm_beamformSetSoundingClk(pDM_Odm);
\r
471 case TXBF_SET_TX_PATH_RESET:
\r
472 pTxbfInfo->TXBFIdx = *pU1Tmp;
\r
473 phydm_beamformSetResetTxPath(pDM_Odm);
\r
476 case TXBF_SET_GET_TX_RATE:
\r
477 phydm_beamformSetGetTxRate(pDM_Odm);
\r
485 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
488 IN PADAPTER Adapter,
\r
493 PHAL_DATA_TYPE pHalData=GET_HAL_DATA(Adapter);
\r
494 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
495 PBOOLEAN pBoolean=(PBOOLEAN)pOutBuf;
\r
496 ps4Byte pS4Tmp=(ps4Byte)pOutBuf;
\r
497 pu4Byte pU4Tmp=(pu4Byte)pOutBuf;
\r
498 pu1Byte pU1Tmp=(pu1Byte)pOutBuf;
\r
500 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
\r
502 if (getType == TXBF_GET_EXPLICIT_BEAMFORMEE) {
\r
503 if (IS_HARDWARE_TYPE_OLDER_THAN_8812A(Adapter))
\r
505 else if (/*IS_HARDWARE_TYPE_8822B(Adapter) ||*/
\r
506 IS_HARDWARE_TYPE_8821B(Adapter) ||
\r
507 IS_HARDWARE_TYPE_8192E(Adapter) ||
\r
508 IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(Adapter))
\r
512 } else if (getType == TXBF_GET_EXPLICIT_BEAMFORMER) {
\r
513 if (IS_HARDWARE_TYPE_OLDER_THAN_8812A(Adapter))
\r
514 *pBoolean = FALSE;
\r
515 else if (/*IS_HARDWARE_TYPE_8822B(Adapter) ||*/
\r
516 IS_HARDWARE_TYPE_8821B(Adapter) ||
\r
517 IS_HARDWARE_TYPE_8192E(Adapter) ||
\r
518 IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(Adapter)) {
\r
519 if(pHalData->RF_Type == RF_2T2R || pHalData->RF_Type == RF_3T3R)
\r
525 } else if (getType == TXBF_GET_MU_MIMO_STA) {
\r
526 #if (RTL8822B_SUPPORT == 1)
\r
527 if (/*pDM_Odm->SupportICType & (ODM_RTL8822B)*/
\r
528 IS_HARDWARE_TYPE_8822B(Adapter))
\r
535 } else if (getType == TXBF_GET_MU_MIMO_AP) {
\r
536 #if (RTL8822B_SUPPORT == 1)
\r
537 if (/*pDM_Odm->SupportICType & (ODM_RTL8822B)*/
\r
538 IS_HARDWARE_TYPE_8822B(Adapter))
\r