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
19 BOOLEAN is_iqgen_setting_ok = FALSE;
\r
20 if (pDM_Odm->SupportICType & ODM_RTL8814A) {
\r
21 is_iqgen_setting_ok = phydm_beamforming_set_iqgen_8814A(pDM_Odm);
\r
22 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] is_iqgen_setting_ok = %d\n", __func__, is_iqgen_setting_ok));
\r
26 /*Only used for MU BFer Entry when get GID management frame (self is as MU STA)*/
\r
28 halComTxbf_ConfigGtab(
\r
32 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
34 if (pDM_Odm->SupportICType & ODM_RTL8822B)
\r
35 HalTxbf8822B_ConfigGtab(pDM_Odm);
\r
39 phydm_beamformSetSoundingEnter(
\r
43 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
44 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
45 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
47 if (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_EnterWorkItem)) == FALSE)
\r
48 PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_EnterWorkItem));
\r
50 halComTxbf_EnterWorkItemCallback(pDM_Odm);
\r
55 phydm_beamformSetSoundingLeave(
\r
59 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
60 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
61 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
63 if (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_LeaveWorkItem)) == FALSE)
\r
64 PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_LeaveWorkItem));
\r
66 halComTxbf_LeaveWorkItemCallback(pDM_Odm);
\r
71 phydm_beamformSetSoundingRate(
\r
75 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
76 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
77 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
79 if (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_RateWorkItem)) == FALSE)
\r
80 PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_RateWorkItem));
\r
82 halComTxbf_RateWorkItemCallback(pDM_Odm);
\r
87 phydm_beamformSetSoundingStatus(
\r
91 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
92 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
93 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
95 if (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_StatusWorkItem)) == FALSE)
\r
96 PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_StatusWorkItem));
\r
98 halComTxbf_StatusWorkItemCallback(pDM_Odm);
\r
103 phydm_beamformSetSoundingFwNdpa(
\r
107 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
108 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
109 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
111 if (*pDM_Odm->pbFwDwRsvdPageInProgress)
\r
112 ODM_SetTimer(pDM_Odm, &(pTxbfInfo->Txbf_FwNdpaTimer), 5);
\r
114 PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_FwNdpaWorkItem));
\r
116 halComTxbf_FwNdpaWorkItemCallback(pDM_Odm);
\r
121 phydm_beamformSetSoundingClk(
\r
125 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
126 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
127 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
129 if (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_ClkWorkItem)) == FALSE)
\r
130 PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_ClkWorkItem));
\r
131 #elif(DM_ODM_SUPPORT_TYPE == ODM_CE)
\r
132 PADAPTER padapter = pDM_Odm->Adapter;
\r
134 rtw_run_in_thread_cmd(padapter, halComTxbf_ClkWorkItemCallback, padapter);
\r
136 halComTxbf_ClkWorkItemCallback(pDM_Odm);
\r
141 phydm_beamformSetResetTxPath(
\r
145 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
146 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
147 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
149 if (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_ResetTxPathWorkItem)) == FALSE)
\r
150 PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_ResetTxPathWorkItem));
\r
152 halComTxbf_ResetTxPathWorkItemCallback(pDM_Odm);
\r
157 phydm_beamformSetGetTxRate(
\r
161 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
162 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
163 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
165 if (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_GetTxRateWorkItem)) == FALSE)
\r
166 PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_GetTxRateWorkItem));
\r
168 halComTxbf_GetTxRateWorkItemCallback(pDM_Odm);
\r
173 halComTxbf_EnterWorkItemCallback(
\r
174 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
175 IN PADAPTER Adapter
\r
181 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
182 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
183 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
185 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
187 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
188 u1Byte Idx = pTxbfInfo->TXBFIdx;
\r
190 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
\r
192 if (pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821))
\r
193 HalTxbfJaguar_Enter(pDM_Odm, Idx);
\r
194 else if (pDM_Odm->SupportICType & ODM_RTL8192E)
\r
195 HalTxbf8192E_Enter(pDM_Odm, Idx);
\r
196 else if (pDM_Odm->SupportICType & ODM_RTL8814A)
\r
197 HalTxbf8814A_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_RTL8822B)
\r
230 HalTxbf8822B_Leave(pDM_Odm, Idx);
\r
235 halComTxbf_FwNdpaWorkItemCallback(
\r
236 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
237 IN PADAPTER Adapter
\r
243 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
244 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
245 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
247 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
249 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
250 u1Byte Idx = pTxbfInfo->NdpaIdx;
\r
252 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
\r
254 if (pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821))
\r
255 HalTxbfJaguar_FwTxBF(pDM_Odm, Idx);
\r
256 else if (pDM_Odm->SupportICType & ODM_RTL8192E)
\r
257 HalTxbf8192E_FwTxBF(pDM_Odm, Idx);
\r
258 else if (pDM_Odm->SupportICType & ODM_RTL8814A)
\r
259 HalTxbf8814A_FwTxBF(pDM_Odm, Idx);
\r
260 else if (pDM_Odm->SupportICType & ODM_RTL8822B)
\r
261 HalTxbf8822B_FwTxBF(pDM_Odm, Idx);
\r
265 halComTxbf_ClkWorkItemCallback(
\r
266 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
267 IN PADAPTER Adapter
\r
273 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
274 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
275 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
277 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
280 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
\r
282 if (pDM_Odm->SupportICType & ODM_RTL8812)
\r
283 HalTxbfJaguar_Clk_8812A(pDM_Odm);
\r
289 halComTxbf_RateWorkItemCallback(
\r
290 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
291 IN PADAPTER Adapter
\r
297 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
298 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
299 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
301 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
303 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
304 u1Byte BW = pTxbfInfo->BW;
\r
305 u1Byte Rate = pTxbfInfo->Rate;
\r
307 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
\r
309 if (pDM_Odm->SupportICType & ODM_RTL8812)
\r
310 HalTxbf8812A_setNDPArate(pDM_Odm, BW, Rate);
\r
311 else if (pDM_Odm->SupportICType & ODM_RTL8192E)
\r
312 HalTxbf8192E_setNDPArate(pDM_Odm, BW, Rate);
\r
313 else if (pDM_Odm->SupportICType & ODM_RTL8814A)
\r
314 HalTxbf8814A_setNDPArate(pDM_Odm, BW, Rate);
\r
319 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
321 halComTxbf_FwNdpaTimerCallback(
\r
322 IN PRT_TIMER pTimer
\r
326 PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
\r
327 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
328 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
330 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
333 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
\r
335 if (*pDM_Odm->pbFwDwRsvdPageInProgress)
\r
336 ODM_SetTimer(pDM_Odm, &(pTxbfInfo->Txbf_FwNdpaTimer), 5);
\r
338 PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_FwNdpaWorkItem));
\r
344 halComTxbf_StatusWorkItemCallback(
\r
345 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
346 IN PADAPTER Adapter
\r
352 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
353 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
354 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
356 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
358 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
360 u1Byte Idx = pTxbfInfo->TXBFIdx;
\r
362 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
\r
364 if (pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821))
\r
365 HalTxbfJaguar_Status(pDM_Odm, Idx);
\r
366 else if (pDM_Odm->SupportICType & ODM_RTL8192E)
\r
367 HalTxbf8192E_Status(pDM_Odm, Idx);
\r
368 else if (pDM_Odm->SupportICType & ODM_RTL8814A)
\r
369 HalTxbf8814A_Status(pDM_Odm, Idx);
\r
370 else if (pDM_Odm->SupportICType & ODM_RTL8822B)
\r
371 HalTxbf8822B_Status(pDM_Odm, Idx);
\r
375 halComTxbf_ResetTxPathWorkItemCallback(
\r
376 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
377 IN PADAPTER Adapter
\r
383 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
384 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
385 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
387 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
389 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
391 u1Byte Idx = pTxbfInfo->TXBFIdx;
\r
393 if (pDM_Odm->SupportICType & ODM_RTL8814A)
\r
394 HalTxbf8814A_ResetTxPath(pDM_Odm, Idx);
\r
399 halComTxbf_GetTxRateWorkItemCallback(
\r
400 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
401 IN PADAPTER Adapter
\r
407 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
408 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
409 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
411 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
414 if (pDM_Odm->SupportICType & ODM_RTL8814A)
\r
415 HalTxbf8814A_GetTxRate(pDM_Odm);
\r
426 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
427 pu1Byte pU1Tmp=(pu1Byte)pInBuf;
\r
428 PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
\r
430 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] setType = 0x%X\n", __func__, setType));
\r
433 case TXBF_SET_SOUNDING_ENTER:
\r
434 pTxbfInfo->TXBFIdx = *pU1Tmp;
\r
435 phydm_beamformSetSoundingEnter(pDM_Odm);
\r
438 case TXBF_SET_SOUNDING_LEAVE:
\r
439 pTxbfInfo->TXBFIdx = *pU1Tmp;
\r
440 phydm_beamformSetSoundingLeave(pDM_Odm);
\r
443 case TXBF_SET_SOUNDING_RATE:
\r
444 pTxbfInfo->BW = pU1Tmp[0];
\r
445 pTxbfInfo->Rate = pU1Tmp[1];
\r
446 phydm_beamformSetSoundingRate(pDM_Odm);
\r
449 case TXBF_SET_SOUNDING_STATUS:
\r
450 pTxbfInfo->TXBFIdx = *pU1Tmp;
\r
451 phydm_beamformSetSoundingStatus(pDM_Odm);
\r
454 case TXBF_SET_SOUNDING_FW_NDPA:
\r
455 pTxbfInfo->NdpaIdx = *pU1Tmp;
\r
456 phydm_beamformSetSoundingFwNdpa(pDM_Odm);
\r
459 case TXBF_SET_SOUNDING_CLK:
\r
460 phydm_beamformSetSoundingClk(pDM_Odm);
\r
463 case TXBF_SET_TX_PATH_RESET:
\r
464 pTxbfInfo->TXBFIdx = *pU1Tmp;
\r
465 phydm_beamformSetResetTxPath(pDM_Odm);
\r
468 case TXBF_SET_GET_TX_RATE:
\r
469 phydm_beamformSetGetTxRate(pDM_Odm);
\r
477 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
480 IN PADAPTER Adapter,
\r
485 PHAL_DATA_TYPE pHalData=GET_HAL_DATA(Adapter);
\r
486 PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
487 PBOOLEAN pBoolean=(PBOOLEAN)pOutBuf;
\r
489 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
\r
491 if (getType == TXBF_GET_EXPLICIT_BEAMFORMEE) {
\r
492 if (IS_HARDWARE_TYPE_OLDER_THAN_8812A(Adapter))
\r
494 else if (/*IS_HARDWARE_TYPE_8822B(Adapter) ||*/
\r
495 IS_HARDWARE_TYPE_8821B(Adapter) ||
\r
496 IS_HARDWARE_TYPE_8192E(Adapter) ||
\r
497 IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(Adapter))
\r
501 } else if (getType == TXBF_GET_EXPLICIT_BEAMFORMER) {
\r
502 if (IS_HARDWARE_TYPE_OLDER_THAN_8812A(Adapter))
\r
503 *pBoolean = FALSE;
\r
504 else if (/*IS_HARDWARE_TYPE_8822B(Adapter) ||*/
\r
505 IS_HARDWARE_TYPE_8821B(Adapter) ||
\r
506 IS_HARDWARE_TYPE_8192E(Adapter) ||
\r
507 IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(Adapter)) {
\r
508 if(pHalData->RF_Type == RF_2T2R || pHalData->RF_Type == RF_3T3R)
\r
514 } else if (getType == TXBF_GET_MU_MIMO_STA) {
\r
515 #if ((RTL8822B_SUPPORT == 1) || (RTL8821C_SUPPORT == 1))
\r
516 if (IS_HARDWARE_TYPE_8822B(Adapter) || IS_HARDWARE_TYPE_8821C(Adapter))
\r
523 } else if (getType == TXBF_GET_MU_MIMO_AP) {
\r
524 #if (RTL8822B_SUPPORT == 1)
\r
525 if (IS_HARDWARE_TYPE_8822B(Adapter))
\r