Add version v5.6.4

This commit is contained in:
Carlos Garces
2019-11-09 11:12:08 +01:00
parent e7361e951c
commit 1d807f14d8
597 changed files with 314256 additions and 256218 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,181 +1,183 @@
#ifndef __HAL_COM_TXBF_H__
#define __HAL_COM_TXBF_H__
/*
typedef BOOLEAN
(*TXBF_GET)(
IN PVOID pAdapter,
IN u1Byte getType,
OUT PVOID pOutBuf
);
typedef BOOLEAN
(*TXBF_SET)(
IN PVOID pAdapter,
IN u1Byte setType,
OUT PVOID pInBuf
);
*/
#define TxBF_Nr(a, b) ((a > b) ? (b) : (a))
typedef enum _TXBF_SET_TYPE{
TXBF_SET_SOUNDING_ENTER,
TXBF_SET_SOUNDING_LEAVE,
TXBF_SET_SOUNDING_RATE,
TXBF_SET_SOUNDING_STATUS,
TXBF_SET_SOUNDING_FW_NDPA,
TXBF_SET_SOUNDING_CLK,
TXBF_SET_TX_PATH_RESET,
TXBF_SET_GET_TX_RATE
}TXBF_SET_TYPE,*PTXBF_SET_TYPE;
typedef enum _TXBF_GET_TYPE{
TXBF_GET_EXPLICIT_BEAMFORMEE,
TXBF_GET_EXPLICIT_BEAMFORMER,
TXBF_GET_MU_MIMO_STA,
TXBF_GET_MU_MIMO_AP
}TXBF_GET_TYPE,*PTXBF_GET_TYPE;
//2 HAL TXBF related
typedef struct _HAL_TXBF_INFO {
u1Byte TXBFIdx;
u1Byte NdpaIdx;
u1Byte BW;
u1Byte Rate;
RT_TIMER Txbf_FwNdpaTimer;
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
RT_WORK_ITEM Txbf_EnterWorkItem;
RT_WORK_ITEM Txbf_LeaveWorkItem;
RT_WORK_ITEM Txbf_FwNdpaWorkItem;
RT_WORK_ITEM Txbf_ClkWorkItem;
RT_WORK_ITEM Txbf_StatusWorkItem;
RT_WORK_ITEM Txbf_RateWorkItem;
RT_WORK_ITEM Txbf_ResetTxPathWorkItem;
RT_WORK_ITEM Txbf_GetTxRateWorkItem;
#endif
} HAL_TXBF_INFO, *PHAL_TXBF_INFO;
#if (BEAMFORMING_SUPPORT == 1)
VOID
halComTxbf_beamformInit(
IN PVOID pDM_VOID
);
VOID
halComTxbf_ConfigGtab(
IN PVOID pDM_VOID
);
VOID
halComTxbf_EnterWorkItemCallback(
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
IN PADAPTER Adapter
#else
IN PVOID pDM_VOID
#endif
);
VOID
halComTxbf_LeaveWorkItemCallback(
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
IN PADAPTER Adapter
#else
IN PVOID pDM_VOID
#endif
);
VOID
halComTxbf_FwNdpaWorkItemCallback(
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
IN PADAPTER Adapter
#else
IN PVOID pDM_VOID
#endif
);
VOID
halComTxbf_ClkWorkItemCallback(
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
IN PADAPTER Adapter
#else
IN PVOID pDM_VOID
#endif
);
VOID
halComTxbf_ResetTxPathWorkItemCallback(
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
IN PADAPTER Adapter
#else
IN PVOID pDM_VOID
#endif
);
VOID
halComTxbf_GetTxRateWorkItemCallback(
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
IN PADAPTER Adapter
#else
IN PVOID pDM_VOID
#endif
);
VOID
halComTxbf_RateWorkItemCallback(
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
IN PADAPTER Adapter
#else
IN PVOID pDM_VOID
#endif
);
VOID
halComTxbf_FwNdpaTimerCallback(
IN PRT_TIMER pTimer
);
VOID
halComTxbf_StatusWorkItemCallback(
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
IN PADAPTER Adapter
#else
IN PVOID pDM_VOID
#endif
);
BOOLEAN
HalComTxbf_Set(
IN PVOID pDM_VOID,
IN u1Byte setType,
IN PVOID pInBuf
);
BOOLEAN
HalComTxbf_Get(
IN PADAPTER Adapter,
IN u1Byte getType,
OUT PVOID pOutBuf
);
#else
#define halComTxbf_beamformInit(pDM_VOID) NULL
#define halComTxbf_ConfigGtab(pDM_VOID) NULL
#define halComTxbf_EnterWorkItemCallback(_Adapter) NULL
#define halComTxbf_LeaveWorkItemCallback(_Adapter) NULL
#define halComTxbf_FwNdpaWorkItemCallback(_Adapter) NULL
#define halComTxbf_ClkWorkItemCallback(_Adapter) NULL
#define halComTxbf_RateWorkItemCallback(_Adapter) NULL
#define halComTxbf_FwNdpaTimerCallback(_Adapter) NULL
#define halComTxbf_StatusWorkItemCallback(_Adapter) NULL
#define HalComTxbf_Get(_Adapter, _getType, _pOutBuf)
#endif
#endif // #ifndef __HAL_COM_TXBF_H__
/******************************************************************************
*
* Copyright(c) 2007 - 2017 Realtek Corporation.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* The full GNU General Public License is included in this distribution in the
* file called LICENSE.
*
* Contact Information:
* wlanfae <wlanfae@realtek.com>
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
* Hsinchu 300, Taiwan.
*
* Larry Finger <Larry.Finger@lwfinger.net>
*
*****************************************************************************/
#ifndef __HAL_COM_TXBF_H__
#define __HAL_COM_TXBF_H__
#if 0
typedef bool
(*TXBF_GET)(
void* adapter,
u8 get_type,
void* p_out_buf
);
typedef bool
(*TXBF_SET)(
void* adapter,
u8 set_type,
void* p_in_buf
);
#endif
enum txbf_set_type {
TXBF_SET_SOUNDING_ENTER,
TXBF_SET_SOUNDING_LEAVE,
TXBF_SET_SOUNDING_RATE,
TXBF_SET_SOUNDING_STATUS,
TXBF_SET_SOUNDING_FW_NDPA,
TXBF_SET_SOUNDING_CLK,
TXBF_SET_TX_PATH_RESET,
TXBF_SET_GET_TX_RATE
};
enum txbf_get_type {
TXBF_GET_EXPLICIT_BEAMFORMEE,
TXBF_GET_EXPLICIT_BEAMFORMER,
TXBF_GET_MU_MIMO_STA,
TXBF_GET_MU_MIMO_AP
};
/* @2 HAL TXBF related */
struct _HAL_TXBF_INFO {
u8 txbf_idx;
u8 ndpa_idx;
u8 BW;
u8 rate;
struct phydm_timer_list txbf_fw_ndpa_timer;
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
RT_WORK_ITEM txbf_enter_work_item;
RT_WORK_ITEM txbf_leave_work_item;
RT_WORK_ITEM txbf_fw_ndpa_work_item;
RT_WORK_ITEM txbf_clk_work_item;
RT_WORK_ITEM txbf_status_work_item;
RT_WORK_ITEM txbf_rate_work_item;
RT_WORK_ITEM txbf_reset_tx_path_work_item;
RT_WORK_ITEM txbf_get_tx_rate_work_item;
#endif
};
#ifdef PHYDM_BEAMFORMING_SUPPORT
void hal_com_txbf_beamform_init(
void *dm_void);
void hal_com_txbf_config_gtab(
void *dm_void);
void hal_com_txbf_enter_work_item_callback(
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
void *adapter
#else
void *dm_void
#endif
);
void hal_com_txbf_leave_work_item_callback(
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
void *adapter
#else
void *dm_void
#endif
);
void hal_com_txbf_fw_ndpa_work_item_callback(
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
void *adapter
#else
void *dm_void
#endif
);
void hal_com_txbf_clk_work_item_callback(
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
void *adapter
#else
void *dm_void
#endif
);
void hal_com_txbf_reset_tx_path_work_item_callback(
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
void *adapter
#else
void *dm_void
#endif
);
void hal_com_txbf_get_tx_rate_work_item_callback(
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
void *adapter
#else
void *dm_void
#endif
);
void hal_com_txbf_rate_work_item_callback(
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
void *adapter
#else
void *dm_void
#endif
);
void hal_com_txbf_fw_ndpa_timer_callback(
struct phydm_timer_list *timer);
void hal_com_txbf_status_work_item_callback(
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
void *adapter
#else
void *dm_void
#endif
);
boolean
hal_com_txbf_set(
void *dm_void,
u8 set_type,
void *p_in_buf);
boolean
hal_com_txbf_get(
void *adapter,
u8 get_type,
void *p_out_buf);
#else
#define hal_com_txbf_beamform_init(dm_void) NULL
#define hal_com_txbf_config_gtab(dm_void) NULL
#define hal_com_txbf_enter_work_item_callback(_adapter) NULL
#define hal_com_txbf_leave_work_item_callback(_adapter) NULL
#define hal_com_txbf_fw_ndpa_work_item_callback(_adapter) NULL
#define hal_com_txbf_clk_work_item_callback(_adapter) NULL
#define hal_com_txbf_rate_work_item_callback(_adapter) NULL
#define hal_com_txbf_fw_ndpa_timer_callback(_adapter) NULL
#define hal_com_txbf_status_work_item_callback(_adapter) NULL
#define hal_com_txbf_get(_adapter, _get_type, _pout_buf)
#endif
#endif /* @#ifndef __HAL_COM_TXBF_H__ */

File diff suppressed because it is too large Load Diff

View File

@@ -1,52 +1,71 @@
#ifndef __HAL_TXBF_8192E_H__
#define __HAL_TXBF_8192E_H__
#if (BEAMFORMING_SUPPORT == 1)
#if (RTL8192E_SUPPORT == 1)
VOID
HalTxbf8192E_setNDPArate(
IN PVOID pDM_VOID,
IN u1Byte BW,
IN u1Byte Rate
);
VOID
HalTxbf8192E_Enter(
IN PVOID pDM_VOID,
IN u1Byte Idx
);
VOID
HalTxbf8192E_Leave(
IN PVOID pDM_VOID,
IN u1Byte Idx
);
VOID
HalTxbf8192E_Status(
IN PVOID pDM_VOID,
IN u1Byte Idx
);
VOID
HalTxbf8192E_FwTxBF(
IN PVOID pDM_VOID,
IN u1Byte Idx
);
#else
#define HalTxbf8192E_setNDPArate(pDM_VOID, BW, Rate)
#define HalTxbf8192E_Enter(pDM_VOID, Idx)
#define HalTxbf8192E_Leave(pDM_VOID, Idx)
#define HalTxbf8192E_Status(pDM_VOID, Idx)
#define HalTxbf8192E_FwTxBF(pDM_VOID, Idx)
#endif
#endif
#endif
/******************************************************************************
*
* Copyright(c) 2007 - 2017 Realtek Corporation.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* The full GNU General Public License is included in this distribution in the
* file called LICENSE.
*
* Contact Information:
* wlanfae <wlanfae@realtek.com>
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
* Hsinchu 300, Taiwan.
*
* Larry Finger <Larry.Finger@lwfinger.net>
*
*****************************************************************************/
#ifndef __HAL_TXBF_8192E_H__
#define __HAL_TXBF_8192E_H__
#if (RTL8192E_SUPPORT == 1)
#ifdef PHYDM_BEAMFORMING_SUPPORT
void hal_txbf_8192e_set_ndpa_rate(
void *dm_void,
u8 BW,
u8 rate);
void hal_txbf_8192e_enter(
void *dm_void,
u8 idx);
void hal_txbf_8192e_leave(
void *dm_void,
u8 idx);
void hal_txbf_8192e_status(
void *dm_void,
u8 idx);
void hal_txbf_8192e_fw_tx_bf(
void *dm_void,
u8 idx);
#else
#define hal_txbf_8192e_set_ndpa_rate(dm_void, BW, rate)
#define hal_txbf_8192e_enter(dm_void, idx)
#define hal_txbf_8192e_leave(dm_void, idx)
#define hal_txbf_8192e_status(dm_void, idx)
#define hal_txbf_8192e_fw_tx_bf(dm_void, idx)
#endif
#else
#define hal_txbf_8192e_set_ndpa_rate(dm_void, BW, rate)
#define hal_txbf_8192e_enter(dm_void, idx)
#define hal_txbf_8192e_leave(dm_void, idx)
#define hal_txbf_8192e_status(dm_void, idx)
#define hal_txbf_8192e_fw_tx_bf(dm_void, idx)
#endif
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -1,70 +1,77 @@
#ifndef __HAL_TXBF_8814A_H__
#define __HAL_TXBF_8814A_H__
#if (BEAMFORMING_SUPPORT == 1)
#if (RTL8814A_SUPPORT == 1)
VOID
HalTxbf8814A_setNDPArate(
IN PVOID pDM_VOID,
IN u1Byte BW,
IN u1Byte Rate
);
u1Byte
halTxbf8814A_GetNtx(
IN PVOID pDM_VOID
);
VOID
HalTxbf8814A_Enter(
IN PVOID pDM_VOID,
IN u1Byte Idx
);
VOID
HalTxbf8814A_Leave(
IN PVOID pDM_VOID,
IN u1Byte Idx
);
VOID
HalTxbf8814A_Status(
IN PVOID pDM_VOID,
IN u1Byte Idx
);
VOID
HalTxbf8814A_ResetTxPath(
IN PVOID pDM_VOID,
IN u1Byte Idx
);
VOID
HalTxbf8814A_GetTxRate(
IN PVOID pDM_VOID
);
VOID
HalTxbf8814A_FwTxBF(
IN PVOID pDM_VOID,
IN u1Byte Idx
);
#else
#define HalTxbf8814A_setNDPArate(pDM_VOID, BW, Rate)
#define halTxbf8814A_GetNtx(pDM_VOID) 0
#define HalTxbf8814A_Enter(pDM_VOID, Idx)
#define HalTxbf8814A_Leave(pDM_VOID, Idx)
#define HalTxbf8814A_Status(pDM_VOID, Idx)
#define HalTxbf8814A_ResetTxPath(pDM_VOID, Idx)
#define HalTxbf8814A_GetTxRate(pDM_VOID)
#define HalTxbf8814A_FwTxBF(pDM_VOID, Idx)
#endif
#endif
#endif
/******************************************************************************
*
* Copyright(c) 2007 - 2017 Realtek Corporation.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* The full GNU General Public License is included in this distribution in the
* file called LICENSE.
*
* Contact Information:
* wlanfae <wlanfae@realtek.com>
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
* Hsinchu 300, Taiwan.
*
* Larry Finger <Larry.Finger@lwfinger.net>
*
*****************************************************************************/
#ifndef __HAL_TXBF_8814A_H__
#define __HAL_TXBF_8814A_H__
#if (RTL8814A_SUPPORT == 1)
#ifdef PHYDM_BEAMFORMING_SUPPORT
boolean
phydm_beamforming_set_iqgen_8814A(void *dm_void);
void hal_txbf_8814a_set_ndpa_rate(void *dm_void, u8 BW, u8 rate);
u8 hal_txbf_8814a_get_ntx(void *dm_void);
void hal_txbf_8814a_enter(void *dm_void, u8 idx);
void hal_txbf_8814a_leave(void *dm_void, u8 idx);
void hal_txbf_8814a_status(void *dm_void, u8 idx);
void hal_txbf_8814a_reset_tx_path(void *dm_void, u8 idx);
void hal_txbf_8814a_get_tx_rate(void *dm_void);
void hal_txbf_8814a_fw_txbf(void *dm_void, u8 idx);
#else
#define hal_txbf_8814a_set_ndpa_rate(dm_void, BW, rate)
#define hal_txbf_8814a_get_ntx(dm_void) 0
#define hal_txbf_8814a_enter(dm_void, idx)
#define hal_txbf_8814a_leave(dm_void, idx)
#define hal_txbf_8814a_status(dm_void, idx)
#define hal_txbf_8814a_reset_tx_path(dm_void, idx)
#define hal_txbf_8814a_get_tx_rate(dm_void)
#define hal_txbf_8814a_fw_txbf(dm_void, idx)
#define phydm_beamforming_set_iqgen_8814A(dm_void) 0
#endif
#else
#define hal_txbf_8814a_set_ndpa_rate(dm_void, BW, rate)
#define hal_txbf_8814a_get_ntx(dm_void) 0
#define hal_txbf_8814a_enter(dm_void, idx)
#define hal_txbf_8814a_leave(dm_void, idx)
#define hal_txbf_8814a_status(dm_void, idx)
#define hal_txbf_8814a_reset_tx_path(dm_void, idx)
#define hal_txbf_8814a_get_tx_rate(dm_void)
#define hal_txbf_8814a_fw_txbf(dm_void, idx)
#define phydm_beamforming_set_iqgen_8814A(dm_void) 0
#endif
#endif

View File

@@ -1,400 +0,0 @@
/*============================================================*/
/*Description:*/
/*This file is for 8812/8821/8811 TXBF mechanism*/
/*============================================================*/
#include "mp_precomp.h"
#include "../phydm_precomp.h"
#if (BEAMFORMING_SUPPORT == 1)
#if (RTL8821B_SUPPORT == 1)
VOID
halTxbf8821B_RfMode(
IN PVOID pDM_VOID,
IN PRT_BEAMFORMING_INFO pBeamInfo
)
{
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
if (pDM_Odm->RFType == ODM_1T1R)
return;
ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] set TxIQGen\n", __func__));
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WeLut_Jaguar, 0x80000, 0x1); /*RF Mode table write enable*/
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_WeLut_Jaguar, 0x80000, 0x1); /*RF Mode table write enable*/
if (pBeamInfo->beamformee_su_cnt > 0) {
/*Path_A*/
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableAddr, 0x78000, 0x3); /*Select RX mode*/
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableData0, 0xfffff, 0x3F7FF); /*Set Table data*/
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableData1, 0xfffff, 0xE26BF); /*Enable TXIQGEN in RX mode*/
/*Path_B*/
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableAddr, 0x78000, 0x3); /*Select RX mode*/
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableData0, 0xfffff, 0x3F7FF); /*Set Table data*/
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableData1, 0xfffff, 0xE26BF); /*Enable TXIQGEN in RX mode*/
} else {
/*Path_A*/
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableAddr, 0x78000, 0x3); /*Select RX mode*/
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableData0, 0xfffff, 0x3F7FF); /*Set Table data*/
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_ModeTableData1, 0xfffff, 0xC26BF); /*Disable TXIQGEN in RX mode*/
/*Path_B*/
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableAddr, 0x78000, 0x3); /*Select RX mode*/
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableData0, 0xfffff, 0x3F7FF); /*Set Table data*/
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_ModeTableData1, 0xfffff, 0xC26BF); /*Disable TXIQGEN in RX mode*/
}
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_WeLut_Jaguar, 0x80000, 0x0); /*RF Mode table write disable*/
ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, RF_WeLut_Jaguar, 0x80000, 0x0); /*RF Mode table write disable*/
if (pBeamInfo->beamformee_su_cnt > 0)
ODM_SetBBReg(pDM_Odm, rTxPath_Jaguar, bMaskByte1, 0x33);
else
ODM_SetBBReg(pDM_Odm, rTxPath_Jaguar, bMaskByte1, 0x11);
}
#if 0
VOID
halTxbf8821B_DownloadNDPA(
IN PDM_ODM_T pDM_Odm,
IN u1Byte Idx
)
{
u1Byte u1bTmp = 0, tmpReg422 = 0, Head_Page;
u1Byte BcnValidReg = 0, count = 0, DLBcnCount = 0;
BOOLEAN bSendBeacon = FALSE;
u1Byte TxPageBndy = LAST_ENTRY_OF_TX_PKT_BUFFER_8812; /*default reseved 1 page for the IC type which is undefined.*/
PRT_BEAMFORMING_INFO pBeamInfo = &pDM_Odm->BeamformingInfo;
PRT_BEAMFORMEE_ENTRY pBeamEntry = pBeamInfo->BeamformeeEntry + Idx;
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pDM_Odm->Adapter);
PADAPTER Adapter = pDM_Odm->Adapter;
pHalData->bFwDwRsvdPageInProgress = TRUE;
ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
if (Idx == 0)
Head_Page = 0xFE;
else
Head_Page = 0xFE;
Adapter->HalFunc.GetHalDefVarHandler(Adapter, HAL_DEF_TX_PAGE_BOUNDARY, (pu1Byte)&TxPageBndy);
/*Set REG_CR bit 8. DMA beacon by SW.*/
u1bTmp = ODM_Read1Byte(pDM_Odm, REG_CR_8821B + 1);
ODM_Write1Byte(pDM_Odm, REG_CR_8821B + 1, (u1bTmp | BIT0));
/*Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame.*/
tmpReg422 = ODM_Read1Byte(pDM_Odm, REG_FWHW_TXQ_CTRL_8821B + 2);
ODM_Write1Byte(pDM_Odm, REG_FWHW_TXQ_CTRL_8821B + 2, tmpReg422 & (~BIT6));
if (tmpReg422 & BIT6) {
ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("SetBeamformDownloadNDPA_8812(): There is an Adapter is sending beacon.\n"));
bSendBeacon = TRUE;
}
/*TDECTRL[15:8] 0x209[7:0] = 0xF6 Beacon Head for TXDMA*/
ODM_Write1Byte(pDM_Odm, REG_TDECTRL_8812A + 1, Head_Page);
do {
/*Clear beacon valid check bit.*/
BcnValidReg = ODM_Read1Byte(pDM_Odm, REG_TDECTRL_8812A + 2);
ODM_Write1Byte(pDM_Odm, REG_TDECTRL_8812A + 2, (BcnValidReg | BIT0));
/*download NDPA rsvd page.*/
if (pBeamEntry->BeamformEntryCap & BEAMFORMER_CAP_VHT_SU)
Beamforming_SendVHTNDPAPacket(pDM_Odm, pBeamEntry->MacAddr, pBeamEntry->AID, pBeamEntry->SoundBW, BEACON_QUEUE);
else
Beamforming_SendHTNDPAPacket(pDM_Odm, pBeamEntry->MacAddr, pBeamEntry->SoundBW, BEACON_QUEUE);
/*check rsvd page download OK.*/
BcnValidReg = ODM_Read1Byte(pDM_Odm, REG_TDECTRL_8812A + 2);
count = 0;
while (!(BcnValidReg & BIT0) && count < 20) {
count++;
ODM_delay_ms(10);
BcnValidReg = ODM_Read1Byte(pDM_Odm, REG_TDECTRL_8812A + 2);
}
DLBcnCount++;
} while (!(BcnValidReg & BIT0) && DLBcnCount < 5);
if (!(BcnValidReg & BIT0))
ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("%s Download RSVD page failed!\n", __func__));
/*TDECTRL[15:8] 0x209[7:0] = 0xF6 Beacon Head for TXDMA*/
ODM_Write1Byte(pDM_Odm, REG_TDECTRL_8812A + 1, TxPageBndy);
/*To make sure that if there exists an adapter which would like to send beacon.*/
/*If exists, the origianl value of 0x422[6] will be 1, we should check this to*/
/*prevent from setting 0x422[6] to 0 after download reserved page, or it will cause*/
/*the beacon cannot be sent by HW.*/
/*2010.06.23. Added by tynli.*/
if (bSendBeacon)
ODM_Write1Byte(pDM_Odm, REG_FWHW_TXQ_CTRL_8821B + 2, tmpReg422);
/*Do not enable HW DMA BCN or it will cause Pcie interface hang by timing issue. 2011.11.24. by tynli.*/
/*Clear CR[8] or beacon packet will not be send to TxBuf anymore.*/
u1bTmp = ODM_Read1Byte(pDM_Odm, REG_CR_8821B + 1);
ODM_Write1Byte(pDM_Odm, REG_CR_8821B + 1, (u1bTmp & (~BIT0)));
pBeamEntry->BeamformEntryState = BEAMFORMING_ENTRY_STATE_PROGRESSED;
pHalData->bFwDwRsvdPageInProgress = FALSE;
}
VOID
halTxbf8821B_FwTxBFCmd(
IN PDM_ODM_T pDM_Odm
)
{
u1Byte Idx, Period0 = 0, Period1 = 0;
u1Byte PageNum0 = 0xFF, PageNum1 = 0xFF;
u1Byte u1TxBFParm[3] = {0};
PRT_BEAMFORMING_INFO pBeamInfo = &pDM_Odm->BeamformingInfo;
for (Idx = 0; Idx < BEAMFORMEE_ENTRY_NUM; Idx++) {
/*Modified by David*/
if (pBeamInfo->BeamformeeEntry[Idx].bUsed && pBeamInfo->BeamformeeEntry[Idx].BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSED) {
if (Idx == 0) {
if (pBeamInfo->BeamformeeEntry[Idx].bSound)
PageNum0 = 0xFE;
else
PageNum0 = 0xFF; /*stop sounding*/
Period0 = (u1Byte)(pBeamInfo->BeamformeeEntry[Idx].SoundPeriod);
} else if (Idx == 1) {
if (pBeamInfo->BeamformeeEntry[Idx].bSound)
PageNum1 = 0xFE;
else
PageNum1 = 0xFF; /*stop sounding*/
Period1 = (u1Byte)(pBeamInfo->BeamformeeEntry[Idx].SoundPeriod);
}
}
}
u1TxBFParm[0] = PageNum0;
u1TxBFParm[1] = PageNum1;
u1TxBFParm[2] = (Period1 << 4) | Period0;
FillH2CCmd(Adapter, PHYDM_H2C_TXBF, 3, u1TxBFParm);
ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD,
("[%s] PageNum0 = %d Period0 = %d, PageNum1 = %d Period1 %d\n", __func__, PageNum0, Period0, PageNum1, Period1));
}
#endif
VOID
HalTxbf8821B_Enter(
IN PVOID pDM_VOID,
IN u1Byte BFerBFeeIdx
)
{
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
u1Byte i = 0;
u1Byte BFerIdx = (BFerBFeeIdx & 0xF0) >> 4;
u1Byte BFeeIdx = (BFerBFeeIdx & 0xF);
u4Byte CSI_Param;
PRT_BEAMFORMING_INFO pBeamformingInfo = &pDM_Odm->BeamformingInfo;
RT_BEAMFORMEE_ENTRY BeamformeeEntry;
RT_BEAMFORMER_ENTRY BeamformerEntry;
u2Byte STAid = 0;
ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s]Start!\n", __func__));
halTxbf8821B_RfMode(pDM_Odm, pBeamformingInfo);
if (pDM_Odm->RFType == ODM_2T2R)
ODM_SetBBReg(pDM_Odm, ODM_REG_CSI_CONTENT_VALUE, bMaskDWord, 0x00000000); /*Nc =2*/
else
ODM_SetBBReg(pDM_Odm, ODM_REG_CSI_CONTENT_VALUE, bMaskDWord, 0x01081008); /*Nc =1*/
if ((pBeamformingInfo->beamformer_su_cnt > 0) && (BFerIdx < BEAMFORMER_ENTRY_NUM)) {
BeamformerEntry = pBeamformingInfo->BeamformerEntry[BFerIdx];
/*Sounding protocol control*/
ODM_Write1Byte(pDM_Odm, REG_SND_PTCL_CTRL_8821B, 0xCB);
/*MAC address/Partial AID of Beamformer*/
if (BFerIdx == 0) {
for (i = 0; i < 6 ; i++)
ODM_Write1Byte(pDM_Odm, (REG_BFMER0_INFO_8812A + i), BeamformerEntry.MacAddr[i]);
/*CSI report use legacy ofdm so don't need to fill P_AID. */
/*PlatformEFIOWrite2Byte(Adapter, REG_BFMER0_INFO_8821B+6, BeamformEntry.P_AID); */
} else {
for (i = 0; i < 6 ; i++)
ODM_Write1Byte(pDM_Odm, (REG_BFMER1_INFO_8812A + i), BeamformerEntry.MacAddr[i]);
/*CSI report use legacy ofdm so don't need to fill P_AID.*/
/*PlatformEFIOWrite2Byte(Adapter, REG_BFMER1_INFO_8821B+6, BeamformEntry.P_AID);*/
}
/*CSI report parameters of Beamformee*/
if (BeamformerEntry.BeamformEntryCap & BEAMFORMEE_CAP_VHT_SU) {
if (pDM_Odm->RFType == ODM_2T2R)
CSI_Param = 0x01090109;
else
CSI_Param = 0x01080108;
} else {
if (pDM_Odm->RFType == ODM_2T2R)
CSI_Param = 0x03090309;
else
CSI_Param = 0x03080308;
}
ODM_Write4Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW20_8821B, CSI_Param);
ODM_Write4Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW40_8821B, CSI_Param);
ODM_Write4Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW80_8821B, CSI_Param);
/*Timeout value for MAC to leave NDP_RX_standby_state (60 us, Test chip) (80 us, MP chip)*/
ODM_Write1Byte(pDM_Odm, REG_SND_PTCL_CTRL_8821B + 3, 0x50);
}
if ((pBeamformingInfo->beamformee_su_cnt > 0) && (BFeeIdx < BEAMFORMEE_ENTRY_NUM)) {
BeamformeeEntry = pBeamformingInfo->BeamformeeEntry[BFeeIdx];
if (phydm_actingDetermine(pDM_Odm, PhyDM_ACTING_AS_IBSS))
STAid = BeamformeeEntry.MacId;
else
STAid = BeamformeeEntry.P_AID;
/*P_AID of Beamformee & enable NDPA transmission & enable NDPA interrupt*/
if (BFeeIdx == 0) {
ODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8821B, STAid);
ODM_Write1Byte(pDM_Odm, REG_TXBF_CTRL_8821B + 3, ODM_Read1Byte(pDM_Odm, REG_TXBF_CTRL_8821B + 3) | BIT4 | BIT6 | BIT7);
} else
ODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8821B + 2, STAid | BIT12 | BIT14 | BIT15);
/*CSI report parameters of Beamformee*/
if (BFeeIdx == 0) {
/*Get BIT24 & BIT25*/
u1Byte tmp = ODM_Read1Byte(pDM_Odm, REG_BFMEE_SEL_8812A + 3) & 0x3;
ODM_Write1Byte(pDM_Odm, REG_BFMEE_SEL_8812A + 3, tmp | 0x60);
ODM_Write2Byte(pDM_Odm, REG_BFMEE_SEL_8812A, STAid | BIT9);
} else {
/*Set BIT25*/
ODM_Write2Byte(pDM_Odm, REG_BFMEE_SEL_8812A + 2, STAid | 0xE200);
}
phydm_Beamforming_Notify(pDM_Odm);
}
}
VOID
HalTxbf8821B_Leave(
IN PVOID pDM_VOID,
IN u1Byte Idx
)
{
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
PRT_BEAMFORMING_INFO pBeamformingInfo = &pDM_Odm->BeamformingInfo;
RT_BEAMFORMER_ENTRY BeamformerEntry;
RT_BEAMFORMEE_ENTRY BeamformeeEntry;
if (Idx < BEAMFORMER_ENTRY_NUM) {
BeamformerEntry = pBeamformingInfo->BeamformerEntry[Idx];
BeamformeeEntry = pBeamformingInfo->BeamformeeEntry[Idx];
} else
return;
ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s]Start!, IDx = %d\n", __func__, Idx));
/*Clear P_AID of Beamformee*/
/*Clear MAC address of Beamformer*/
/*Clear Associated Bfmee Sel*/
if (BeamformerEntry.BeamformEntryCap == BEAMFORMING_CAP_NONE) {
ODM_Write1Byte(pDM_Odm, REG_SND_PTCL_CTRL_8821B, 0xC8);
if (Idx == 0) {
ODM_Write4Byte(pDM_Odm, REG_BFMER0_INFO_8812A, 0);
ODM_Write2Byte(pDM_Odm, REG_BFMER0_INFO_8812A + 4, 0);
ODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW20_8821B, 0);
ODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW40_8821B, 0);
ODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW80_8821B, 0);
} else {
ODM_Write4Byte(pDM_Odm, REG_BFMER1_INFO_8812A, 0);
ODM_Write2Byte(pDM_Odm, REG_BFMER1_INFO_8812A + 4, 0);
ODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW20_8821B, 0);
ODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW40_8821B, 0);
ODM_Write2Byte(pDM_Odm, REG_CSI_RPT_PARAM_BW80_8821B, 0);
}
}
if (BeamformeeEntry.BeamformEntryCap == BEAMFORMING_CAP_NONE) {
halTxbf8821B_RfMode(pDM_Odm, pBeamformingInfo);
if (Idx == 0) {
ODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8821B, 0x0);
ODM_Write2Byte(pDM_Odm, REG_BFMEE_SEL_8812A, 0);
} else {
ODM_Write2Byte(pDM_Odm, REG_TXBF_CTRL_8821B + 2, ODM_Read2Byte(pDM_Odm, REG_TXBF_CTRL_8821B + 2) & 0xF000);
ODM_Write2Byte(pDM_Odm, REG_BFMEE_SEL_8812A + 2, ODM_Read2Byte(pDM_Odm, REG_BFMEE_SEL_8812A + 2) & 0x60);
}
}
}
VOID
HalTxbf8821B_Status(
IN PVOID pDM_VOID,
IN u1Byte Idx
)
{
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
u2Byte BeamCtrlVal;
u4Byte BeamCtrlReg;
PRT_BEAMFORMING_INFO pBeamInfo = &pDM_Odm->BeamformingInfo;
RT_BEAMFORMEE_ENTRY BeamformEntry = pBeamInfo->BeamformeeEntry[Idx];
if (phydm_actingDetermine(pDM_Odm, PhyDM_ACTING_AS_IBSS))
BeamCtrlVal = BeamformEntry.MacId;
else
BeamCtrlVal = BeamformEntry.P_AID;
if (Idx == 0)
BeamCtrlReg = REG_TXBF_CTRL_8821B;
else {
BeamCtrlReg = REG_TXBF_CTRL_8821B + 2;
BeamCtrlVal |= BIT12 | BIT14 | BIT15;
}
if (BeamformEntry.BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSED) {
if (BeamformEntry.SoundBW == CHANNEL_WIDTH_20)
BeamCtrlVal |= BIT9;
else if (BeamformEntry.SoundBW == CHANNEL_WIDTH_40)
BeamCtrlVal |= BIT10;
else if (BeamformEntry.SoundBW == CHANNEL_WIDTH_80)
BeamCtrlVal |= BIT11;
} else
BeamCtrlVal &= ~(BIT9 | BIT10 | BIT11);
ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] BeamCtrlVal = 0x%x!\n", __func__, BeamCtrlVal));
ODM_Write2Byte(pDM_Odm, BeamCtrlReg, BeamCtrlVal);
}
VOID
HalTxbf8821B_FwTxBF(
IN PVOID pDM_VOID,
IN u1Byte Idx
)
{
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
PRT_BEAMFORMING_INFO pBeamInfo = &pDM_Odm->BeamformingInfo;
PRT_BEAMFORMEE_ENTRY pBeamEntry = pBeamInfo->BeamformeeEntry + Idx;
ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
#if 0
if (pBeamEntry->BeamformEntryState == BEAMFORMING_ENTRY_STATE_PROGRESSING)
halTxbf8821B_DownloadNDPA(pDM_Odm, Idx);
halTxbf8821B_FwTxBFCmd(pDM_Odm);
#endif
}
#endif
#endif

View File

@@ -1,43 +0,0 @@
#ifndef __HAL_TXBF_8821B_H__
#define __HAL_TXBF_8821B_H__
#if (BEAMFORMING_SUPPORT == 1)
#if (RTL8821B_SUPPORT == 1)
VOID
HalTxbf8821B_Enter(
IN PVOID pDM_VOID,
IN u1Byte Idx
);
VOID
HalTxbf8821B_Leave(
IN PVOID pDM_VOID,
IN u1Byte Idx
);
VOID
HalTxbf8821B_Status(
IN PVOID pDM_VOID,
IN u1Byte Idx
);
VOID
HalTxbf8821B_FwTxBF(
IN PVOID pDM_VOID,
IN u1Byte Idx
);
#else
#define HalTxbf8821B_Enter(pDM_VOID, Idx)
#define HalTxbf8821B_Leave(pDM_VOID, Idx)
#define HalTxbf8821B_Status(pDM_VOID, Idx)
#define HalTxbf8821B_FwTxBF(pDM_VOID, Idx)
#endif
#endif
#endif // #ifndef __HAL_TXBF_8821B_H__

File diff suppressed because it is too large Load Diff

View File

@@ -1,53 +1,78 @@
#ifndef __HAL_TXBF_8822B_H__
#define __HAL_TXBF_8822B_H__
#if (BEAMFORMING_SUPPORT == 1)
#if (RTL8822B_SUPPORT == 1)
VOID
HalTxbf8822B_Init(
IN PVOID pDM_VOID
);
VOID
HalTxbf8822B_Enter(
IN PVOID pDM_VOID,
IN u1Byte Idx
);
VOID
HalTxbf8822B_Leave(
IN PVOID pDM_VOID,
IN u1Byte Idx
);
VOID
HalTxbf8822B_Status(
IN PVOID pDM_VOID,
IN u1Byte Idx
);
VOID
HalTxbf8822B_ConfigGtab(
IN PVOID pDM_VOID
);
VOID
HalTxbf8822B_FwTxBF(
IN PVOID pDM_VOID,
IN u1Byte Idx
);
#else
#define HalTxbf8822B_Init(pDM_VOID)
#define HalTxbf8822B_Enter(pDM_VOID, Idx)
#define HalTxbf8822B_Leave(pDM_VOID, Idx)
#define HalTxbf8822B_Status(pDM_VOID, Idx)
#define HalTxbf8822B_FwTxBF(pDM_VOID, Idx)
#define HalTxbf8822B_ConfigGtab(pDM_VOID)
#endif
#endif
#endif
/******************************************************************************
*
* Copyright(c) 2007 - 2017 Realtek Corporation.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* The full GNU General Public License is included in this distribution in the
* file called LICENSE.
*
* Contact Information:
* wlanfae <wlanfae@realtek.com>
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
* Hsinchu 300, Taiwan.
*
* Larry Finger <Larry.Finger@lwfinger.net>
*
*****************************************************************************/
#ifndef __HAL_TXBF_8822B_H__
#define __HAL_TXBF_8822B_H__
#if (RTL8822B_SUPPORT == 1)
#ifdef PHYDM_BEAMFORMING_SUPPORT
void hal_txbf_8822b_enter(
void *dm_void,
u8 idx);
void hal_txbf_8822b_leave(
void *dm_void,
u8 idx);
void hal_txbf_8822b_status(
void *dm_void,
u8 beamform_idx);
void hal_txbf_8822b_config_gtab(
void *dm_void);
void hal_txbf_8822b_fw_txbf(
void *dm_void,
u8 idx);
#else
#define hal_txbf_8822b_enter(dm_void, idx)
#define hal_txbf_8822b_leave(dm_void, idx)
#define hal_txbf_8822b_status(dm_void, idx)
#define hal_txbf_8822b_fw_txbf(dm_void, idx)
#define hal_txbf_8822b_config_gtab(dm_void)
#endif
#if (defined(CONFIG_BB_TXBF_API))
void phydm_8822btxbf_rfmode(void *dm_void, u8 su_bfee_cnt, u8 mu_bfee_cnt);
void phydm_8822b_sutxbfer_workaroud(void *dm_void, boolean enable_su_bfer,
u8 nc, u8 nr, u8 ng, u8 CB, u8 BW,
boolean is_vht);
#else
#define phydm_8822btxbf_rfmode(dm_void, su_bfee_cnt, mu_bfee_cnt)
#define phydm_8822b_sutxbfer_workaroud(dm_void, enable_su_bfer, nc, nr, ng, CB, BW, is_vht)
#endif
#else
#define hal_txbf_8822b_enter(dm_void, idx)
#define hal_txbf_8822b_leave(dm_void, idx)
#define hal_txbf_8822b_status(dm_void, idx)
#define hal_txbf_8822b_fw_txbf(dm_void, idx)
#define hal_txbf_8822b_config_gtab(dm_void)
#endif
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -1,158 +1,167 @@
#ifndef __HAL_TXBF_INTERFACE_H__
#define __HAL_TXBF_INTERFACE_H__
#if (BEAMFORMING_SUPPORT == 1)
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
VOID
Beamforming_GidPAid(
PADAPTER Adapter,
PRT_TCB pTcb
);
RT_STATUS
Beamforming_GetReportFrame(
IN PADAPTER Adapter,
IN PRT_RFD pRfd,
IN POCTET_STRING pPduOS
);
VOID
Beamforming_GetNDPAFrame(
IN PVOID pDM_VOID,
IN OCTET_STRING pduOS
);
BOOLEAN
SendFWHTNDPAPacket(
IN PVOID pDM_VOID,
IN pu1Byte RA,
IN CHANNEL_WIDTH BW
);
BOOLEAN
SendFWVHTNDPAPacket(
IN PVOID pDM_VOID,
IN pu1Byte RA,
IN u2Byte AID,
IN CHANNEL_WIDTH BW
);
BOOLEAN
SendSWVHTNDPAPacket(
IN PVOID pDM_VOID,
IN pu1Byte RA,
IN u2Byte AID,
IN CHANNEL_WIDTH BW
);
BOOLEAN
SendSWHTNDPAPacket(
IN PVOID pDM_VOID,
IN pu1Byte RA,
IN CHANNEL_WIDTH BW
);
#ifdef SUPPORT_MU_BF
#if (SUPPORT_MU_BF == 1)
RT_STATUS
Beamforming_GetVHTGIDMgntFrame(
IN PADAPTER Adapter,
IN PRT_RFD pRfd,
IN POCTET_STRING pPduOS
);
BOOLEAN
SendSWVHTGIDMgntFrame(
IN PVOID pDM_VOID,
IN pu1Byte RA,
IN u1Byte Idx
);
BOOLEAN
SendSWVHTBFReportPoll(
IN PVOID pDM_VOID,
IN pu1Byte RA,
IN BOOLEAN bFinalPoll
);
BOOLEAN
SendSWVHTMUNDPAPacket(
IN PVOID pDM_VOID,
IN CHANNEL_WIDTH BW
);
#else
#define Beamforming_GetVHTGIDMgntFrame(Adapter, pRfd, pPduOS) RT_STATUS_FAILURE
#define SendSWVHTGIDMgntFrame(pDM_VOID, RA)
#define SendSWVHTBFReportPoll(pDM_VOID, RA, bFinalPoll)
#define SendSWVHTMUNDPAPacket(pDM_VOID, BW)
#endif
#endif
#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
u4Byte
Beamforming_GetReportFrame(
IN PVOID pDM_VOID,
union recv_frame *precv_frame
);
BOOLEAN
SendFWHTNDPAPacket(
IN PVOID pDM_VOID,
IN pu1Byte RA,
IN CHANNEL_WIDTH BW
);
BOOLEAN
SendSWHTNDPAPacket(
IN PVOID pDM_VOID,
IN pu1Byte RA,
IN CHANNEL_WIDTH BW
);
BOOLEAN
SendFWVHTNDPAPacket(
IN PVOID pDM_VOID,
IN pu1Byte RA,
IN u2Byte AID,
IN CHANNEL_WIDTH BW
);
BOOLEAN
SendSWVHTNDPAPacket(
IN PVOID pDM_VOID,
IN pu1Byte RA,
IN u2Byte AID,
IN CHANNEL_WIDTH BW
);
#endif
VOID
Beamforming_GetNDPAFrame(
IN PVOID pDM_VOID,
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
IN OCTET_STRING pduOS
#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
union recv_frame *precv_frame
#endif
);
#else
#define Beamforming_GetNDPAFrame(pDM_Odm, _PduOS)
#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
#define Beamforming_GetReportFrame(Adapter, precv_frame) RT_STATUS_FAILURE
#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN)
#define Beamforming_GetReportFrame(Adapter, pRfd, pPduOS) RT_STATUS_FAILURE
#define Beamforming_GetVHTGIDMgntFrame(Adapter, pRfd, pPduOS) RT_STATUS_FAILURE
#endif
#define SendFWHTNDPAPacket(pDM_VOID, RA, BW)
#define SendSWHTNDPAPacket(pDM_VOID, RA, BW)
#define SendFWVHTNDPAPacket(pDM_VOID, RA, AID, BW)
#define SendSWVHTNDPAPacket(pDM_VOID, RA, AID, BW)
#define SendSWVHTGIDMgntFrame(pDM_VOID, RA, idx)
#define SendSWVHTBFReportPoll(pDM_VOID, RA, bFinalPoll)
#define SendSWVHTMUNDPAPacket(pDM_VOID, BW)
#endif
#endif
/******************************************************************************
*
* Copyright(c) 2007 - 2017 Realtek Corporation.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* The full GNU General Public License is included in this distribution in the
* file called LICENSE.
*
* Contact Information:
* wlanfae <wlanfae@realtek.com>
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
* Hsinchu 300, Taiwan.
*
* Larry Finger <Larry.Finger@lwfinger.net>
*
*****************************************************************************/
#ifndef __HAL_TXBF_INTERFACE_H__
#define __HAL_TXBF_INTERFACE_H__
#ifdef PHYDM_BEAMFORMING_SUPPORT
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
#define a_SifsTime ((IS_WIRELESS_MODE_5G(adapter) || IS_WIRELESS_MODE_N_24G(adapter)) ? 16 : 10)
void beamforming_gid_paid(
void *adapter,
PRT_TCB tcb);
enum rt_status
beamforming_get_report_frame(
void *adapter,
PRT_RFD rfd,
POCTET_STRING p_pdu_os);
void beamforming_get_ndpa_frame(
void *dm_void,
OCTET_STRING pdu_os);
boolean
send_fw_ht_ndpa_packet(
void *dm_void,
u8 *RA,
enum channel_width BW);
boolean
send_fw_vht_ndpa_packet(
void *dm_void,
u8 *RA,
u16 AID,
enum channel_width BW);
boolean
send_sw_vht_ndpa_packet(
void *dm_void,
u8 *RA,
u16 AID,
enum channel_width BW);
boolean
send_sw_ht_ndpa_packet(
void *dm_void,
u8 *RA,
enum channel_width BW);
#if (SUPPORT_MU_BF == 1)
enum rt_status
beamforming_get_vht_gid_mgnt_frame(
void *adapter,
PRT_RFD rfd,
POCTET_STRING p_pdu_os);
boolean
send_sw_vht_gid_mgnt_frame(
void *dm_void,
u8 *RA,
u8 idx);
boolean
send_sw_vht_bf_report_poll(
void *dm_void,
u8 *RA,
boolean is_final_poll);
boolean
send_sw_vht_mu_ndpa_packet(
void *dm_void,
enum channel_width BW);
#else
#define beamforming_get_vht_gid_mgnt_frame(adapter, rfd, p_pdu_os) RT_STATUS_FAILURE
#define send_sw_vht_gid_mgnt_frame(dm_void, RA)
#define send_sw_vht_bf_report_poll(dm_void, RA, is_final_poll)
#define send_sw_vht_mu_ndpa_packet(dm_void, BW)
#endif
#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
u32 beamforming_get_report_frame(
void *dm_void,
union recv_frame *precv_frame);
boolean
send_fw_ht_ndpa_packet(
void *dm_void,
u8 *RA,
enum channel_width BW);
boolean
send_sw_ht_ndpa_packet(
void *dm_void,
u8 *RA,
enum channel_width BW);
boolean
send_fw_vht_ndpa_packet(
void *dm_void,
u8 *RA,
u16 AID,
enum channel_width BW);
boolean
send_sw_vht_ndpa_packet(
void *dm_void,
u8 *RA,
u16 AID,
enum channel_width BW);
#endif
void beamforming_get_ndpa_frame(
void *dm_void,
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
OCTET_STRING pdu_os
#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
union recv_frame *precv_frame
#endif
);
boolean
dbg_send_sw_vht_mundpa_packet(
void *dm_void,
enum channel_width BW);
#else
#define beamforming_get_ndpa_frame(dm, _pdu_os)
#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
#define beamforming_get_report_frame(adapter, precv_frame) RT_STATUS_FAILURE
#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN)
#define beamforming_get_report_frame(adapter, rfd, p_pdu_os) RT_STATUS_FAILURE
#define beamforming_get_vht_gid_mgnt_frame(adapter, rfd, p_pdu_os) RT_STATUS_FAILURE
#endif
#define send_fw_ht_ndpa_packet(dm_void, RA, BW)
#define send_sw_ht_ndpa_packet(dm_void, RA, BW)
#define send_fw_vht_ndpa_packet(dm_void, RA, AID, BW)
#define send_sw_vht_ndpa_packet(dm_void, RA, AID, BW)
#define send_sw_vht_gid_mgnt_frame(dm_void, RA, idx)
#define send_sw_vht_bf_report_poll(dm_void, RA, is_final_poll)
#define send_sw_vht_mu_ndpa_packet(dm_void, BW)
#endif
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -1,67 +1,78 @@
#ifndef __HAL_TXBF_JAGUAR_H__
#define __HAL_TXBF_JAGUAR_H__
#if (BEAMFORMING_SUPPORT == 1)
#if ((RTL8812A_SUPPORT == 1) || (RTL8821A_SUPPORT == 1))
VOID
HalTxbf8812A_setNDPArate(
IN PVOID pDM_VOID,
IN u1Byte BW,
IN u1Byte Rate
);
VOID
HalTxbfJaguar_Enter(
IN PVOID pDM_VOID,
IN u1Byte Idx
);
VOID
HalTxbfJaguar_Leave(
IN PVOID pDM_VOID,
IN u1Byte Idx
);
VOID
HalTxbfJaguar_Status(
IN PVOID pDM_VOID,
IN u1Byte Idx
);
VOID
HalTxbfJaguar_FwTxBF(
IN PVOID pDM_VOID,
IN u1Byte Idx
);
VOID
HalTxbfJaguar_Patch(
IN PVOID pDM_VOID,
IN u1Byte Operation
);
VOID
HalTxbfJaguar_Clk_8812A(
IN PVOID pDM_VOID
);
#else
#define HalTxbf8812A_setNDPArate(pDM_VOID, BW, Rate)
#define HalTxbfJaguar_Enter(pDM_VOID, Idx)
#define HalTxbfJaguar_Leave(pDM_VOID, Idx)
#define HalTxbfJaguar_Status(pDM_VOID, Idx)
#define HalTxbfJaguar_FwTxBF(pDM_VOID, Idx)
#define HalTxbfJaguar_Patch(pDM_VOID, Operation)
#define HalTxbfJaguar_Clk_8812A(pDM_VOID)
#endif
#endif
#endif // #ifndef __HAL_TXBF_JAGUAR_H__
/******************************************************************************
*
* Copyright(c) 2007 - 2017 Realtek Corporation.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* The full GNU General Public License is included in this distribution in the
* file called LICENSE.
*
* Contact Information:
* wlanfae <wlanfae@realtek.com>
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
* Hsinchu 300, Taiwan.
*
* Larry Finger <Larry.Finger@lwfinger.net>
*
*****************************************************************************/
#ifndef __HAL_TXBF_JAGUAR_H__
#define __HAL_TXBF_JAGUAR_H__
#if ((RTL8812A_SUPPORT == 1) || (RTL8821A_SUPPORT == 1))
#ifdef PHYDM_BEAMFORMING_SUPPORT
void hal_txbf_8812a_set_ndpa_rate(
void *dm_void,
u8 BW,
u8 rate);
void hal_txbf_jaguar_enter(
void *dm_void,
u8 idx);
void hal_txbf_jaguar_leave(
void *dm_void,
u8 idx);
void hal_txbf_jaguar_status(
void *dm_void,
u8 idx);
void hal_txbf_jaguar_fw_txbf(
void *dm_void,
u8 idx);
void hal_txbf_jaguar_patch(
void *dm_void,
u8 operation);
void hal_txbf_jaguar_clk_8812a(
void *dm_void);
#else
#define hal_txbf_8812a_set_ndpa_rate(dm_void, BW, rate)
#define hal_txbf_jaguar_enter(dm_void, idx)
#define hal_txbf_jaguar_leave(dm_void, idx)
#define hal_txbf_jaguar_status(dm_void, idx)
#define hal_txbf_jaguar_fw_txbf(dm_void, idx)
#define hal_txbf_jaguar_patch(dm_void, operation)
#define hal_txbf_jaguar_clk_8812a(dm_void)
#endif
#else
#define hal_txbf_8812a_set_ndpa_rate(dm_void, BW, rate)
#define hal_txbf_jaguar_enter(dm_void, idx)
#define hal_txbf_jaguar_leave(dm_void, idx)
#define hal_txbf_jaguar_status(dm_void, idx)
#define hal_txbf_jaguar_fw_txbf(dm_void, idx)
#define hal_txbf_jaguar_patch(dm_void, operation)
#define hal_txbf_jaguar_clk_8812a(dm_void)
#endif
#endif /* @#ifndef __HAL_TXBF_JAGUAR_H__ */

View File

@@ -0,0 +1,425 @@
/******************************************************************************
*
* Copyright(c) 2007 - 2017 Realtek Corporation.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*****************************************************************************/
#include "mp_precomp.h"
#include "phydm_precomp.h"
#if (defined(CONFIG_BB_TXBF_API))
#if (RTL8822B_SUPPORT == 1 || RTL8192F_SUPPORT == 1 ||\
RTL8822C_SUPPORT == 1 || RTL8198F_SUPPORT == 1 || RTL8814B_SUPPORT == 1)
/*@Add by YuChen for 8822B MU-MIMO API*/
/*this function is only used for BFer*/
u8 phydm_get_ndpa_rate(void *dm_void)
{
struct dm_struct *dm = (struct dm_struct *)dm_void;
u8 ndpa_rate = ODM_RATE6M;
if (dm->rssi_min >= 30) /*@link RSSI > 30%*/
ndpa_rate = ODM_RATE24M;
else if (dm->rssi_min <= 25)
ndpa_rate = ODM_RATE6M;
PHYDM_DBG(dm, DBG_TXBF, "[%s] ndpa_rate = 0x%x\n", __func__, ndpa_rate);
return ndpa_rate;
}
/*this function is only used for BFer*/
u8 phydm_get_beamforming_sounding_info(void *dm_void, u16 *throughput,
u8 total_bfee_num, u8 *tx_rate)
{
u8 idx = 0;
u8 snddecision = 0xff;
struct dm_struct *dm = (struct dm_struct *)dm_void;
for (idx = 0; idx < total_bfee_num; idx++) {
if (dm->support_ic_type & (ODM_RTL8814A)) {
if ((tx_rate[idx] >= ODM_RATEVHTSS3MCS7 &&
tx_rate[idx] <= ODM_RATEVHTSS3MCS9))
snddecision = snddecision & ~(1 << idx);
} else if (dm->support_ic_type & (ODM_RTL8822B | ODM_RTL8822C |
ODM_RTL8812 | ODM_RTL8192F)) {
if ((tx_rate[idx] >= ODM_RATEVHTSS2MCS7 &&
tx_rate[idx] <= ODM_RATEVHTSS2MCS9))
snddecision = snddecision & ~(1 << idx);
} else if (dm->support_ic_type & (ODM_RTL8814B)) {
if ((tx_rate[idx] >= ODM_RATEVHTSS4MCS7 &&
tx_rate[idx] <= ODM_RATEVHTSS4MCS9))
snddecision = snddecision & ~(1 << idx);
}
}
for (idx = 0; idx < total_bfee_num; idx++) {
if (throughput[idx] <= 10)
snddecision = snddecision & ~(1 << idx);
}
PHYDM_DBG(dm, DBG_TXBF, "[%s] soundingdecision = 0x%x\n", __func__,
snddecision);
return snddecision;
}
/*this function is only used for BFer*/
u8 phydm_get_mu_bfee_snding_decision(void *dm_void, u16 throughput)
{
u8 snding_score = 0;
struct dm_struct *dm = (struct dm_struct *)dm_void;
/*throughput unit is Mbps*/
if (throughput >= 500)
snding_score = 100;
else if (throughput >= 450)
snding_score = 90;
else if (throughput >= 400)
snding_score = 80;
else if (throughput >= 350)
snding_score = 70;
else if (throughput >= 300)
snding_score = 60;
else if (throughput >= 250)
snding_score = 50;
else if (throughput >= 200)
snding_score = 40;
else if (throughput >= 150)
snding_score = 30;
else if (throughput >= 100)
snding_score = 20;
else if (throughput >= 50)
snding_score = 10;
else
snding_score = 0;
PHYDM_DBG(dm, DBG_TXBF, "[%s] snding_score = 0x%x\n", __func__,
snding_score);
return snding_score;
}
#endif
#if (DM_ODM_SUPPORT_TYPE != ODM_AP)
u8 beamforming_get_htndp_tx_rate(void *dm_void, u8 bfer_str_num)
{
struct dm_struct *dm = (struct dm_struct *)dm_void;
u8 nr_index = 0;
u8 ndp_tx_rate;
/*@Find nr*/
#if (RTL8814A_SUPPORT == 1)
if (dm->support_ic_type & ODM_RTL8814A)
nr_index = tx_bf_nr(hal_txbf_8814a_get_ntx(dm), bfer_str_num);
else
#endif
nr_index = tx_bf_nr(1, bfer_str_num);
switch (nr_index) {
case 1:
ndp_tx_rate = ODM_MGN_MCS8;
break;
case 2:
ndp_tx_rate = ODM_MGN_MCS16;
break;
case 3:
ndp_tx_rate = ODM_MGN_MCS24;
break;
default:
ndp_tx_rate = ODM_MGN_MCS8;
break;
}
return ndp_tx_rate;
}
u8 beamforming_get_vht_ndp_tx_rate(void *dm_void, u8 bfer_str_num)
{
struct dm_struct *dm = (struct dm_struct *)dm_void;
u8 nr_index = 0;
u8 ndp_tx_rate;
/*@Find nr*/
#if (RTL8814A_SUPPORT == 1)
if (dm->support_ic_type & ODM_RTL8814A)
nr_index = tx_bf_nr(hal_txbf_8814a_get_ntx(dm), bfer_str_num);
else
#endif
nr_index = tx_bf_nr(1, bfer_str_num);
switch (nr_index) {
case 1:
ndp_tx_rate = ODM_MGN_VHT2SS_MCS0;
break;
case 2:
ndp_tx_rate = ODM_MGN_VHT3SS_MCS0;
break;
case 3:
ndp_tx_rate = ODM_MGN_VHT4SS_MCS0;
break;
default:
ndp_tx_rate = ODM_MGN_VHT2SS_MCS0;
break;
}
return ndp_tx_rate;
}
#endif
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
/*this function is only used for BFer*/
void phydm_txbf_rfmode(void *dm_void, u8 su_bfee_cnt, u8 mu_bfee_cnt)
{
struct dm_struct *dm = (struct dm_struct *)dm_void;
u8 i;
if (dm->rf_type == RF_1T1R)
return;
#if (RTL8822C_SUPPORT == 1)
if (dm->support_ic_type == ODM_RTL8822C) {
if (su_bfee_cnt > 0 || mu_bfee_cnt > 0) {
for (i = RF_PATH_A; i <= RF_PATH_B; i++) {
/*RF mode table write enable*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0xef,
BIT(19), 0x1);
/*Select RX mode*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0x33,
0xF, 3);
/*Set Table data*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3e,
0x3, 0x2);
/*Set Table data*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3f,
0xfffff, 0x61AFF);
/*RF mode table write disable*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0xef,
BIT(19), 0x0);
}
}
/*@if Nsts > Nc, don't apply V matrix*/
odm_set_bb_reg(dm, R_0x1e24, BIT(11), 1);
if (su_bfee_cnt > 0 || mu_bfee_cnt > 0) {
/*@enable BB TxBF ant mapping register*/
odm_set_bb_reg(dm, R_0x1e24, BIT(28) | BIT29, 0x2);
odm_set_bb_reg(dm, R_0x1e24, BIT(30), 1);
/* logic mapping */
/* TX BF logic map and TX path en for Nsts = 1~2 */
odm_set_bb_reg(dm, R_0x820, 0xffff0000, 0x33);
odm_set_bb_reg(dm, R_0x1e30, 0xffff, 0x404);
} else {
/*@Disable BB TxBF ant mapping register*/
odm_set_bb_reg(dm, R_0x1e24, BIT(28) | BIT29, 0x0);
odm_set_bb_reg(dm, R_0x1e24, BIT(31), 0);
/*@1SS~2ss A, AB*/
odm_set_bb_reg(dm, R_0x820, 0xff, 0x31);
odm_set_bb_reg(dm, R_0x1e2c, 0xffff, 0x400);
}
}
#endif
#if (RTL8814B_SUPPORT)
if (dm->support_ic_type == ODM_RTL8814B) {
if (su_bfee_cnt > 0 || mu_bfee_cnt > 0) {
for (i = RF_PATH_A; i <= RF_PATH_D; i++) {
/*RF mode table write enable*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0xef,
BIT(19), 0x1);
/*Select RX mode*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0x33,
0xF, 2);
/*Set Table data*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3e,
0xfffff, 0x3fc);
/*Set Table data*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3f,
0xfffff, 0x280f7);
/*Select RX mode*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0x33,
0xF, 3);
/*Set Table data*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3e,
0xfffff, 0x365);
/*Set Table data*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3f,
0xfffff, 0xafcf7);
/*RF mode table write disable*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0xef,
BIT(19), 0x0);
}
}
/*@if Nsts > Nc, don't apply V matrix*/
odm_set_bb_reg(dm, R_0x1e24, BIT(11), 1);
if (su_bfee_cnt > 0 || mu_bfee_cnt > 0) {
/*@enable BB TxBF ant mapping register*/
odm_set_bb_reg(dm, R_0x1e24, BIT(28) | BIT29, 0x2);
odm_set_bb_reg(dm, R_0x1e24, BIT(30), 1);
/* logic mapping */
/* TX BF logic map and TX path en for Nsts = 1~4 */
odm_set_bb_reg(dm, R_0x820, 0xffff0000, 0xff55);
/*verification path-AC*/
odm_set_bb_reg(dm, R_0x1e30, 0xffffffff, 0xe4e41010);
} else {
/*@Disable BB TxBF ant mapping register*/
odm_set_bb_reg(dm, R_0x1e24, BIT(28) | BIT29, 0x0);
odm_set_bb_reg(dm, R_0x1e24, BIT(31), 0);
/*@1SS~4ss A, AB, ABC, ABCD*/
odm_set_bb_reg(dm, R_0x820, 0xffff, 0xf731);
odm_set_bb_reg(dm, R_0x1e2c, 0xffffffff, 0xe4240400);
}
}
#endif
#if (RTL8198F_SUPPORT)
if (dm->support_ic_type == ODM_RTL8198F) {
if (su_bfee_cnt > 0 || mu_bfee_cnt > 0) {
for (i = RF_PATH_A; i <= RF_PATH_D; i++) {
/*RF mode table write enable*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0xef,
BIT(19), 0x1);
/*Select RX mode*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0x30,
0xfffff, 0x18000);
/*Set Table data*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0x31,
0xfffff, 0x4f);
/*Select RX mode*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0x32,
0xfffff, 0x71fc0);
/*RF mode table write disable*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0xef,
BIT(19), 0x0);
}
}
/*@if Nsts > Nc, don't apply V matrix*/
odm_set_bb_reg(dm, R_0x1e24, BIT(11), 1);
if (su_bfee_cnt > 0 || mu_bfee_cnt > 0) {
/*@enable BB TxBF ant mapping register*/
odm_set_bb_reg(dm, R_0x1e24, BIT(28) | BIT29, 0x2);
odm_set_bb_reg(dm, R_0x1e24, BIT(30), 1);
/* logic mapping */
/* TX BF logic map and TX path en for Nsts = 1~4 */
odm_set_bb_reg(dm, R_0x820, 0xffff0000, 0xffff);
odm_set_bb_reg(dm, R_0x1e30, 0xffffffff, 0xe4e4e4e4);
} else {
/*@Disable BB TxBF ant mapping register*/
odm_set_bb_reg(dm, R_0x1e24, BIT(28) | BIT29, 0x0);
odm_set_bb_reg(dm, R_0x1e24, BIT(31), 0);
/*@1SS~4ss A, AB, ABC, ABCD*/
odm_set_bb_reg(dm, R_0x820, 0xffff, 0xf731);
odm_set_bb_reg(dm, R_0x1e2c, 0xffffffff, 0xe4240400);
}
}
#endif
}
void phydm_txbf_avoid_hang(void *dm_void)
{
struct dm_struct *dm = (struct dm_struct *)dm_void;
/* avoid CCK CCA hang when the BF mode */
odm_set_bb_reg(dm, R_0x1e6c, 0x100000, 0x1);
}
#if (RTL8814B_SUPPORT == 1)
void phydm_txbf_80p80_rfmode(void *dm_void, u8 su_bfee_cnt, u8 mu_bfee_cnt)
{
struct dm_struct *dm = (struct dm_struct *)dm_void;
u8 i;
if (dm->rf_type == RF_1T1R)
return;
if (su_bfee_cnt > 0 || mu_bfee_cnt > 0) {
for (i = RF_PATH_A; i <= RF_PATH_D; i += 3) {
/*RF mode table write enable*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0xef, BIT(19),
0x1);
/*Select RX mode*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0x33, 0xF, 2);
/*Set Table data*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3e, 0xfffff,
0x3fc);
/*Set Table data*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3f, 0xfffff,
0x280f7);
/*Select RX mode*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0x33, 0xF, 3);
/*Set Table data*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3e, 0xfffff,
0x365);
/*Set Table data*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3f, 0xfffff,
0xafcf7);
/*RF mode table write disable*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0xef, BIT(19),
0x0);
}
for (i = RF_PATH_B; i <= RF_PATH_C; i++) {
/*RF mode table write enable*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0xef, BIT(19),
0x1);
/*Select RX mode*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0x33, 0xF, 2);
/*Set Table data*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3f, 0xfffff,
0x280c7);
/*Set Table data*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3f, 0xfffff,
0x280c7);
/*Select RX mode*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0x33, 0xF, 3);
/*Set Table data*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3e, 0xfffff,
0x365);
/*Set Table data*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3f, 0xfffff,
0xafcc7);
/*RF mode table write disable*/
odm_set_rf_reg(dm, (enum rf_path)i, RF_0xef, BIT(19),
0x0);
}
}
/*@if Nsts > Nc, don't apply V matrix*/
odm_set_bb_reg(dm, R_0x1e24, BIT(11), 1);
if (su_bfee_cnt > 0 || mu_bfee_cnt > 0) {
/*@enable BB TxBF ant mapping register*/
odm_set_bb_reg(dm, R_0x1e24, BIT(28) | BIT29, 0x2);
odm_set_bb_reg(dm, R_0x1e24, BIT(30), 1);
/* logic mapping */
/* TX BF logic map and TX path en for Nsts = 1~2 */
odm_set_bb_reg(dm, R_0x820, 0xff0000, 0x33); /*seg0*/
odm_set_bb_reg(dm, R_0x824, 0xff00, 0xcc); /*seg1*/
odm_set_bb_reg(dm, R_0x1e30, 0xffff, 0xe4e4);
} else {
/*@Disable BB TxBF ant mapping register*/
odm_set_bb_reg(dm, R_0x1e24, BIT(28) | BIT29, 0x0);
odm_set_bb_reg(dm, R_0x1e24, BIT(31), 0);
/*@1SS~2ss A, AB*/
odm_set_bb_reg(dm, R_0x820, 0xff, 0x31); /*seg0*/
odm_set_bb_reg(dm, R_0x824, 0xff, 0xc8); /*seg1*/
odm_set_bb_reg(dm, R_0x1e2c, 0xffff, 0xe420);
}
}
#endif
#endif /*PHYSTS_3RD_TYPE_IC*/
#endif /*CONFIG_BB_TXBF_API*/

View File

@@ -0,0 +1,74 @@
/******************************************************************************
*
* Copyright(c) 2007 - 2017 Realtek Corporation.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* The full GNU General Public License is included in this distribution in the
* file called LICENSE.
*
* Contact Information:
* wlanfae <wlanfae@realtek.com>
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
* Hsinchu 300, Taiwan.
*
* Larry Finger <Larry.Finger@lwfinger.net>
*
*****************************************************************************/
#ifndef __PHYDM_HAL_TXBF_API_H__
#define __PHYDM_HAL_TXBF_API_H__
#if (defined(CONFIG_BB_TXBF_API))
#if (DM_ODM_SUPPORT_TYPE != ODM_AP)
#if defined(DM_ODM_CE_MAC80211)
#define tx_bf_nr(a, b) ({ \
u8 __tx_bf_nr_a = (a); \
u8 __tx_bf_nr_b = (b); \
((__tx_bf_nr_a > __tx_bf_nr_b) ? (__tx_bf_nr_b) : (__tx_bf_nr_a)); })
#else
#define tx_bf_nr(a, b) ((a > b) ? (b) : (a))
#endif
u8 beamforming_get_htndp_tx_rate(void *dm_void, u8 bfer_str_num);
u8 beamforming_get_vht_ndp_tx_rate(void *dm_void, u8 bfer_str_num);
#endif
#if (RTL8822B_SUPPORT == 1 || RTL8822C_SUPPORT == 1 || RTL8192F_SUPPORT == 1 ||\
RTL8814B_SUPPORT == 1 || RTL8198F_SUPPORT == 1)
u8 phydm_get_beamforming_sounding_info(void *dm_void, u16 *throughput,
u8 total_bfee_num, u8 *tx_rate);
u8 phydm_get_ndpa_rate(void *dm_void);
u8 phydm_get_mu_bfee_snding_decision(void *dm_void, u16 throughput);
#else
#define phydm_get_beamforming_sounding_info(dm, tp, bfee_num, rate) 0
#define phydm_get_ndpa_rate(dm)
#define phydm_get_mu_bfee_snding_decision(dm, tp)
#endif
#ifdef PHYSTS_3RD_TYPE_IC
/*this function is only used for BFer*/
void phydm_txbf_rfmode(void *dm_void, u8 su_bfee_cnt, u8 mu_bfee_cnt);
void phydm_txbf_avoid_hang(void *dm_void);
#if (RTL8814B_SUPPORT == 1)
void phydm_txbf_80p80_rfmode(void *dm_void, u8 su_bfee_cnt, u8 mu_bfee_cnt);
#endif
#endif /*PHYSTS_3RD_TYPE_IC*/
#endif
#endif