/******************************************************************************
|
*
|
* Copyright(c) 2019 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 "halrf_precomp.h"
|
|
void halrf_cmn_info_self_init(struct rf_info *rf)
|
{
|
struct rtw_hal_com_t *hal_i = rf->hal_com;
|
|
if (hal_i->chip_id == CHIP_WIFI6_8852A)
|
rf->ic_type = RF_RTL8852A;
|
else if (hal_i->chip_id == CHIP_WIFI6_8834A)
|
rf->ic_type = RF_RTL8834A;
|
else if (hal_i->chip_id == CHIP_WIFI6_8852B)
|
rf->ic_type = RF_RTL8852B;
|
else if (hal_i->chip_id == CHIP_WIFI6_8852C)
|
rf->ic_type = RF_RTL8852C;
|
|
if (rf->ic_type & RF_AX_1SS)
|
rf->num_rf_path = 1;
|
else if (rf->ic_type & RF_AX_2SS)
|
rf->num_rf_path = 2;
|
else if (rf->ic_type & RF_AX_3SS)
|
rf->num_rf_path = 3;
|
else if (rf->ic_type & RF_AX_4SS)
|
rf->num_rf_path = 4;
|
else
|
rf->num_rf_path = 1;
|
|
rf->manual_support_ability = 0xffffffff;
|
rf->rf_init_ready = false;
|
rf->rf_sys_up_time = 0;
|
rf->rf_watchdog_en = true;
|
rf->rf_ic_api_en = true;
|
/*[Drv Dbg Info]*/
|
rf->dbg_component = 0;
|
rf->cmn_dbg_msg_period = 2;
|
rf->cmn_dbg_msg_cnt = 0;
|
|
/*@=== [HALRF Structure] ============================================*/
|
|
switch (hal_i->chip_id) {
|
#ifdef RF_8852A_SUPPORT
|
case CHIP_WIFI6_8852A:
|
rf->rfk_iqk_info = &rf_iqk_hwspec_8852a;
|
break;
|
#endif
|
#ifdef RF_8852B_SUPPORT
|
case CHIP_WIFI6_8852B:
|
rf->rfk_iqk_info = &rf_iqk_hwspec_8852b;
|
break;
|
#endif
|
default:
|
break;
|
}
|
}
|
|
void halrf_rfk_self_init(struct rf_info *rf)
|
{
|
struct halrf_iqk_info *iqk_info = &rf->iqk;
|
struct halrf_gapk_info *txgapk_info = &rf->gapk;
|
|
u8 path;
|
|
RF_DBG(rf, DBG_RF_RFK, "===> %s\n", __func__);
|
|
/* [TXGAPK init] */
|
txgapk_info->is_gapk_init = false;
|
|
/*[IQK init]*/
|
iqk_info->is_iqk_init = false;
|
|
/*[DPK init]*/
|
halrf_dpk_init(rf);
|
|
/*[RXBB BW]*/
|
for (path = 0; path < KPATH; path++)
|
rf->pre_rxbb_bw[path] = 0xff;
|
}
|
|
void halrf_rfability_init_mp(struct rf_info *rf)
|
{
|
//u64 support_ability = 0;
|
|
switch (rf->ic_type) {
|
#ifdef RF_8852A_SUPPORT
|
case RF_RTL8852A:
|
rf->support_ability |=
|
/*HAL_RF_TX_PWR_TRACK |*/
|
HAL_RF_TSSI_TRK |
|
HAL_RF_IQK |
|
/*HAL_RF_LCK |*/
|
HAL_RF_DPK |
|
HAL_RF_DACK |
|
HAL_RF_TXGAPK |
|
HAL_RF_DPK_TRACK |
|
HAL_RF_RXDCK |
|
HAL_RF_RXGAINK |
|
HAL_RF_THER_TRIM |
|
HAL_RF_PABIAS_TRIM |
|
HAL_RF_TSSI_TRIM |
|
/*HAL_RF_XTAL_TRACK |*/
|
0;
|
break;
|
#endif
|
#ifdef RF_8852B_SUPPORT
|
case RF_RTL8852B:
|
rf->support_ability |=
|
/*HAL_RF_TX_PWR_TRACK |*/
|
HAL_RF_IQK |
|
/*HAL_RF_LCK |*/
|
HAL_RF_DPK |
|
HAL_RF_DACK |
|
HAL_RF_TXGAPK |
|
HAL_RF_DPK_TRACK |
|
HAL_RF_RXDCK |
|
/*HAL_RF_RXGAINK |*/
|
HAL_RF_THER_TRIM |
|
HAL_RF_PABIAS_TRIM |
|
HAL_RF_TSSI_TRIM |
|
/*HAL_RF_XTAL_TRACK |*/
|
HAL_RF_TX_SHAPE |
|
0;
|
break;
|
#endif
|
#ifdef RF_8852C_SUPPORT
|
case RF_RTL8852C:
|
rf->support_ability =
|
/*HAL_RF_TX_PWR_TRACK |*/
|
/*HAL_RF_IQK |*/
|
/*HAL_RF_LCK |*/
|
/*HAL_RF_DPK |*/
|
/*HAL_RF_DACK |*/
|
/*HAL_RF_TXGAPK |*/
|
/*HAL_RF_DPK_TRACK |*/
|
0;
|
break;
|
#endif
|
default:
|
rf->support_ability =
|
/*HAL_RF_TX_PWR_TRACK |*/
|
/*HAL_RF_IQK |*/
|
/*HAL_RF_LCK |*/
|
/*HAL_RF_DPK |*/
|
/*HAL_RF_DACK |*/
|
/*HAL_RF_TXGAPK |*/
|
/*HAL_RF_DPK_TRACK |*/
|
0;
|
break;
|
}
|
}
|
|
void halrf_rfability_init(struct rf_info *rf)
|
{
|
|
switch (rf->ic_type) {
|
#ifdef RF_8852A_SUPPORT
|
case RF_RTL8852A:
|
rf->support_ability =
|
HAL_RF_TX_PWR_TRACK |
|
HAL_RF_TSSI_TRK |
|
HAL_RF_IQK |
|
/*HAL_RF_LCK |*/
|
HAL_RF_DPK |
|
HAL_RF_DACK |
|
HAL_RF_TXGAPK |
|
HAL_RF_DPK_TRACK |
|
HAL_RF_RXDCK |
|
HAL_RF_RXGAINK |
|
HAL_RF_THER_TRIM |
|
HAL_RF_PABIAS_TRIM |
|
HAL_RF_TSSI_TRIM |
|
HAL_RF_XTAL_TRACK |
|
0;
|
break;
|
#endif
|
#ifdef RF_8852B_SUPPORT
|
case RF_RTL8852B:
|
rf->support_ability |=
|
HAL_RF_TX_PWR_TRACK |
|
HAL_RF_IQK |
|
/*HAL_RF_LCK |*/
|
HAL_RF_DPK |
|
HAL_RF_DACK |
|
HAL_RF_TXGAPK |
|
HAL_RF_DPK_TRACK |
|
HAL_RF_RXDCK |
|
/*HAL_RF_RXGAINK |*/
|
HAL_RF_THER_TRIM |
|
HAL_RF_PABIAS_TRIM |
|
HAL_RF_TSSI_TRIM |
|
/*HAL_RF_XTAL_TRACK |*/
|
HAL_RF_TX_SHAPE |
|
0;
|
break;
|
#endif
|
#ifdef RF_8852C_SUPPORT
|
case RF_RTL8852C:
|
rf->support_ability |=
|
/*HAL_RF_TX_PWR_TRACK |*/
|
/*HAL_RF_IQK |*/
|
/*HAL_RF_LCK |*/
|
/*HAL_RF_DPK |*/
|
/*HAL_RF_DACK |*/
|
/*HAL_RF_TXGAPK |*/
|
/*HAL_RF_DPK_TRACK |*/
|
0;
|
break;
|
#endif
|
default:
|
rf->support_ability =
|
/*HAL_RF_TX_PWR_TRACK |*/
|
/*HAL_RF_IQK |*/
|
/*HAL_RF_LCK |*/
|
/*HAL_RF_DPK |*/
|
/*HAL_RF_DACK |*/
|
/*HAL_RF_TXGAPK |*/
|
/*HAL_RF_DPK_TRACK |*/
|
0;
|
break;
|
}
|
}
|
|
void halrf_set_rfability(struct rf_info *rf)
|
{
|
if (rf->manual_support_ability &&
|
rf->manual_support_ability != 0xffffffff)
|
rf->support_ability = rf->manual_support_ability;
|
else if (rf->phl_com->drv_mode == RTW_DRV_MODE_MP)
|
halrf_rfability_init_mp(rf);
|
else
|
halrf_rfability_init(rf);
|
|
PHL_INFO("[PHL]%x\n", rf->dbg_component);
|
RF_DBG(rf, DBG_RF_INIT,
|
"IC = ((0x%x)), mp=%d, RF_Supportability Init = ((0x%x))\n",
|
rf->ic_type, rf->phl_com->drv_mode, rf->support_ability);
|
}
|
|
void halrf_rfe_init(struct rf_info *rf)
|
{
|
u8 rfe_type = rf->phl_com->dev_cap.rfe_type;
|
|
switch (rf->ic_type) {
|
#ifdef RF_8852A_SUPPORT
|
case RF_RTL8852A:
|
/*2G FEM check*/
|
if (rfe_type == 11 || rfe_type == 12 || rfe_type == 17 ||
|
rfe_type == 18 || rfe_type == 51 || rfe_type == 52 ||
|
rfe_type == 53 || rfe_type == 54) {
|
rf->fem.epa_2g = 1;
|
rf->fem.elna_2g = 1;
|
}
|
/*5G FEM check*/
|
if (rfe_type == 9 || rfe_type == 10 || rfe_type == 11 ||
|
rfe_type == 12 || rfe_type == 15 || rfe_type == 16 ||
|
rfe_type == 17 || rfe_type == 18 || rfe_type == 37 ||
|
rfe_type == 38 || rfe_type == 51 || rfe_type == 52 ||
|
rfe_type == 53 || rfe_type == 54) {
|
rf->fem.epa_5g = 1;
|
rf->fem.elna_5g = 1;
|
}
|
/*6G FEM check*/
|
if (rfe_type == 13 || rfe_type == 14 || rfe_type == 15 ||
|
rfe_type == 16 || rfe_type == 17 || rfe_type == 18 ||
|
rfe_type == 37 || rfe_type == 38 || rfe_type == 51 ||
|
rfe_type == 52 || rfe_type == 53 ||
|
rfe_type == 54) {
|
rf->fem.epa_6g = 1;
|
rf->fem.elna_6g = 1;
|
}
|
break;
|
#endif
|
default:
|
break;
|
}
|
}
|
|
void halrf_rfe_type_gpio_setting(struct rf_info *rf)
|
{
|
u32 band = rf->hal_com->band[HW_PHY_0].cur_chandef.band;
|
|
RF_DBG(rf, DBG_RF_INIT, "======>%s\n", __func__);
|
|
halrf_set_gpio(rf, HW_PHY_0, (u8)band);
|
}
|
|
enum rtw_hal_status halrf_dm_init(void *rf_void)
|
{
|
struct rf_info *rf = (struct rf_info *)rf_void;
|
enum rtw_hal_status hal_status = RTW_HAL_STATUS_SUCCESS;
|
|
if (!rf) {
|
RF_DBG(rf, DBG_RF_INIT, "[%s] *rf = NULL", __func__);
|
return RTW_HAL_STATUS_FAILURE;
|
}
|
|
halrf_cmn_info_self_init(rf);
|
halrf_dbg_setting_init(rf);
|
halrf_cmd_parser_init(rf);
|
halrf_set_rfability(rf);
|
halrf_rfe_init(rf);
|
halrf_rfe_type_gpio_setting(rf);
|
halrf_config_nctl_reg(rf);
|
halrf_rfk_self_init(rf);
|
|
/*Set Power table ref power*/
|
halrf_set_ref_power_to_struct(rf, HW_PHY_0);
|
|
halrf_rck_trigger(rf, HW_PHY_0);
|
//halrf_gapk_save_tx_gain_8852a(rf);
|
halrf_dack_trigger(rf, false);
|
halrf_rx_dck_trigger(rf, HW_PHY_0, true);
|
|
/*RX Gain K Get efuse*/
|
/*halrf_get_efuse_rx_gain_k(rf, HW_PHY_0);*/
|
|
/*Thermal Trim, PA Bias k, TSSI Trim get efuse and set reg*/
|
halrf_get_efuse_trim(rf, HW_PHY_0);
|
|
/*TSSI Init*/
|
halrf_tssi_get_efuse_ex(rf, HW_PHY_0);
|
/*halrf_tssi_get_efuse_ex(rf, HW_PHY_1);*/
|
|
/*Set MAC 0xd220[1]=0 r_txagc_BT_en=0 by Bryant*/
|
if (rf->phl_com->drv_mode == RTW_DRV_MODE_MP)
|
halrf_wl_tx_power_control(rf, 0xffffffff);
|
|
halrf_fcs_init(rf);
|
|
return hal_status;
|
}
|
|
enum rtw_hal_status halrf_init(struct rtw_phl_com_t *phl_com,
|
struct rtw_hal_com_t *hal_com, void **rf_out)
|
{
|
//enum rtw_hal_status hal_status = RTW_HAL_STATUS_SUCCESS;
|
struct rf_info *rf = NULL;
|
|
rf = hal_mem_alloc(hal_com, sizeof(struct rf_info));
|
|
if (!rf)
|
return RTW_HAL_STATUS_RF_INIT_FAILURE;
|
|
*rf_out = rf;
|
// PHL_INFO("[PHL] %s - halrf(%p), *rf(%p)\n", __func__, halrf, *rf);
|
// PHL_INFO("[PHL] %s\n", __func__);
|
|
rf->phl_com = phl_com;/*shared memory for all components*/
|
rf->hal_com = hal_com;/*shared memory for phl and hal*/
|
|
|
return RTW_HAL_STATUS_SUCCESS;
|
}
|
|
void halrf_deinit(struct rtw_phl_com_t *phl_com,
|
struct rtw_hal_com_t *hal_com, void *rf)
|
{
|
//enum rtw_hal_status hal_status = RTW_HAL_STATUS_SUCCESS;
|
struct rf_info *halrf = (struct rf_info *)rf;
|
|
/*stop FSM of RF or free memory*/
|
PHL_INFO("[PHL] %s - halrf(%p)\n", __func__, halrf);
|
|
if(halrf) {
|
hal_mem_free(hal_com, halrf, sizeof(struct rf_info));
|
}
|
}
|