/******************************************************************************
|
*
|
* Copyright(c) 2020 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 "halbb_precomp.h"
|
|
void halbb_dyn_1r_cca_en(struct bb_info *bb, bool en)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_dyn_1r_cca_en_8852a_2(bb, en);
|
break;
|
#endif
|
default:
|
break;
|
}
|
}
|
|
u8 halbb_wifi_event_notify(struct bb_info *bb, enum phl_msg_evt_id event, enum phl_phy_idx phy_idx)
|
{
|
struct rtw_hw_band *hw_band = &bb->hal_com->band[phy_idx];
|
u8 pause_result = 0;
|
u32 val[5] = {0};
|
char val_char = '0';
|
|
BB_DBG(bb, DBG_DIG, "[%s] event=%d\n", __func__, event);
|
|
if (event == MSG_EVT_SCAN_START || event == MSG_EVT_CONNECT_START) {
|
val[0] = 90;
|
if (hw_band->cur_chandef.band == BAND_ON_24G)
|
val[1] = PAUSE_OFDM_CCK;
|
else
|
val[1] = PAUSE_OFDM;
|
pause_result = halbb_pause_func(bb, F_DIG, HALBB_PAUSE, HALBB_PAUSE_LV_2, 2, val);
|
halbb_edcca_event_nofity(bb, HALBB_PAUSE);
|
} else if (event == MSG_EVT_SCAN_END) {
|
pause_result = halbb_pause_func(bb, F_DIG, HALBB_RESUME, HALBB_PAUSE_LV_2, 2, val);
|
halbb_edcca_event_nofity(bb, HALBB_RESUME);
|
} else if (event == MSG_EVT_CONNECT_END) {
|
pause_result = halbb_pause_func(bb, F_DIG, HALBB_RESUME_NO_RECOVERY, HALBB_PAUSE_LV_2, 2, val);
|
halbb_edcca_event_nofity(bb, HALBB_RESUME_NO_RECOVERY);
|
halbb_dig_new_entry_connect(bb);
|
} else if (event == MSG_EVT_DBG_RX_DUMP || event == MSG_EVT_DBG_TX_DUMP) {
|
halbb_dump_bb_reg(bb, &val[0], &val_char, &val[0], false);
|
halbb_dump_bb_reg(bb, &val[0], &val_char, &val[0], false);
|
}
|
|
return pause_result;
|
}
|
|
#ifdef BB_8852B_SUPPORT
|
|
bool halbb_rf_sw_si_test(struct bb_info *bb, enum rf_path rx_path, u8 reg_addr, int ch_idx)
|
{
|
u32 channel_change[3] = {0x1, 0x24, 0x99};
|
u32 ofdm_rx = 0x0, reg_value_0 = 0x0, reg_value_1 = 0x0;
|
ofdm_rx = (u32)rx_path;
|
|
ch_idx = ch_idx % 3;
|
|
if (ofdm_rx == RF_PATH_A) {
|
halbb_write_rf_reg_8852b_a(bb, RF_PATH_A, reg_addr, 0x3ff, channel_change[ch_idx]);
|
|
reg_value_0 = halbb_read_rf_reg_8852b_a(bb, RF_PATH_A, reg_addr, 0x3ff);
|
BB_DBG(bb, DBG_PHY_CONFIG, "read_value (%d) = %x\n", ofdm_rx, reg_value_0);
|
|
if (reg_value_0 == channel_change[ch_idx]){
|
return true;
|
} else {
|
return false;
|
}
|
|
} else if (ofdm_rx == RF_PATH_B) {
|
|
halbb_write_rf_reg_8852b_a(bb, RF_PATH_B, reg_addr, 0x3ff, channel_change[ch_idx]);
|
|
reg_value_1 = halbb_read_rf_reg_8852b_a(bb, RF_PATH_B, reg_addr, 0x3ff);
|
BB_DBG(bb, DBG_PHY_CONFIG, "read_value (%d) = %x\n", ofdm_rx, reg_value_1);
|
|
if (reg_value_1 == channel_change[ch_idx]){
|
return true;
|
} else {
|
return false;
|
}
|
|
} else {
|
|
halbb_write_rf_reg_8852b_a(bb, RF_PATH_B, reg_addr, 0x3ff, channel_change[ch_idx]);
|
halbb_write_rf_reg_8852b_a(bb, RF_PATH_A, reg_addr, 0x3ff, channel_change[ch_idx]);
|
|
reg_value_0 = halbb_read_rf_reg_8852b_a(bb, RF_PATH_A, reg_addr, 0x3ff);
|
reg_value_1 = halbb_read_rf_reg_8852b_a(bb, RF_PATH_B, reg_addr, 0x3ff);
|
BB_DBG(bb, DBG_PHY_CONFIG, "read_value (%d) = %x\n", ofdm_rx, reg_value_0);
|
BB_DBG(bb, DBG_PHY_CONFIG, "read_value (%d) = %x\n", ofdm_rx, reg_value_1);
|
|
if ((reg_value_0 == channel_change[ch_idx]) && (reg_value_1 == channel_change[ch_idx])) {
|
return true;
|
} else {
|
return false;
|
}
|
|
}
|
}
|
|
#endif
|
u16 halbb_get_csi_buf_idx(struct bb_info *bb, u8 buf_idx, u8 txsc_idx)
|
|
{
|
u8 table_size = 0;
|
u8 i;
|
u8 txsc_2_buf_idx_160[][2] = {{0, 0}, //BW all
|
{8, 1}, //20M
|
{6, 3},
|
{4, 2},
|
{2, 4},
|
{1, 5},
|
{3, 7},
|
{5, 6},
|
{7, 8},
|
{12, 9}, //40M
|
{10, 10},
|
{9, 11},
|
{11, 12},
|
{14, 13}, //80M
|
{13, 14}};
|
u8 txsc_2_buf_idx_080[][2] = {{0, 0}, //BW all
|
{4, 1}, //20M
|
{2, 3},
|
{1, 2},
|
{3, 4},
|
{10, 9}, //40M
|
{9, 10}};
|
u8 csi_sub_idx = 0xff;
|
u16 rpt_val = 0;
|
|
if (bb->ic_type & BB_IC_MAX_BW_160) {
|
table_size = sizeof(txsc_2_buf_idx_160) / (sizeof(u8) * 2);
|
for (i = 0; i < table_size; i++) {
|
if (txsc_2_buf_idx_160[i][0] == txsc_idx) {
|
csi_sub_idx = txsc_2_buf_idx_160[i][1];
|
break;
|
}
|
}
|
} else {
|
table_size = sizeof(txsc_2_buf_idx_080) / (sizeof(u8) * 2);
|
for (i = 0; i < table_size; i++) {
|
if (txsc_2_buf_idx_080[i][0] == txsc_idx) {
|
csi_sub_idx = txsc_2_buf_idx_080[i][1];
|
break;
|
}
|
}
|
}
|
|
BB_DBG(bb, DBG_DBG_API, "%02d -> %02d\n", txsc_idx, csi_sub_idx);
|
|
if (csi_sub_idx == 0xff) {
|
rpt_val = 0xff;
|
} else {
|
rpt_val = (buf_idx << 6) | (csi_sub_idx << 2);
|
}
|
|
return rpt_val;
|
}
|
|
u16 halbb_cfg_cmac_tx_ant(struct bb_info *bb, enum rf_path tx_path)
|
{
|
u16 val = 0;
|
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
val = halbb_cfg_cmac_tx_ant_8852a(bb, tx_path);
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
val = halbb_cfg_cmac_tx_ant_8852a_2(bb, tx_path);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
val = halbb_cfg_cmac_tx_ant_8852b(bb, tx_path);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
val = halbb_cfg_cmac_tx_ant_8852c(bb, tx_path);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
return val;
|
}
|
|
|
void halbb_gpio_ctrl_dump(struct bb_info *bb)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
halbb_gpio_ctrl_dump_8852a(bb);
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_gpio_ctrl_dump_8852a_2(bb);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
//halbb_gpio_ctrl_dump_8852b(bb);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_gpio_ctrl_dump_8852c(bb);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_gpio_rfm(struct bb_info *bb, enum bb_path path,
|
enum bb_rfe_src_sel src, bool dis_tx_gnt_wl,
|
bool active_tx_opt, bool act_bt_en, u8 rfm_output_val)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
halbb_gpio_rfm_8852a(bb, path, src, dis_tx_gnt_wl, active_tx_opt,
|
act_bt_en, rfm_output_val);
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_gpio_rfm_8852a_2(bb, path, src, dis_tx_gnt_wl, active_tx_opt,
|
act_bt_en, rfm_output_val);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_gpio_rfm_8852c(bb, path, src, dis_tx_gnt_wl, active_tx_opt,
|
act_bt_en, rfm_output_val);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_gpio_trsw_table(struct bb_info *bb, enum bb_path path,
|
bool path_en, bool trsw_tx, bool trsw_rx,
|
bool trsw, bool trsw_b)
|
{
|
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
halbb_gpio_trsw_table_8852a(bb, path, path_en, trsw_tx, trsw_rx,
|
trsw, trsw_b);
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_gpio_trsw_table_8852a_2(bb, path, path_en, trsw_tx,
|
trsw_rx, trsw, trsw_b);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_gpio_trsw_table_8852c(bb, path, path_en, trsw_tx,
|
trsw_rx, trsw, trsw_b);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
|
}
|
|
void halbb_gpio_setting_all(struct bb_info *bb, u8 rfe_idx)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
halbb_gpio_setting_init_8852a(bb);
|
halbb_gpio_setting_all_8852a(bb, rfe_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_gpio_setting_init_8852a_2(bb);
|
halbb_gpio_setting_all_8852a_2(bb, rfe_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_gpio_setting_init_8852c(bb);
|
halbb_gpio_setting_all_8852c(bb, rfe_idx);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_gpio_setting(struct bb_info *bb, u8 gpio_idx, enum bb_path path,
|
bool inv, enum bb_rfe_src_sel src)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
halbb_gpio_setting_8852a(bb, gpio_idx, path, inv, src);
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_gpio_setting_8852a_2(bb, gpio_idx, path, inv, src);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_gpio_setting_8852c(bb, gpio_idx, path, inv, src);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_gpio_setting_init(struct bb_info *bb)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
halbb_gpio_setting_init_8852a(bb);
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_gpio_setting_init_8852a_2(bb);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_gpio_setting_init_8852c(bb);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_pre_agc_en(struct bb_info *bb, bool enable)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
halbb_pre_agc_en_8852a(bb, enable);
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_pre_agc_en_8852a_2(bb, enable);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
halbb_pre_agc_en_8852b(bb, enable);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_pre_agc_en_8852c(bb, enable);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_set_gain_error(struct bb_info *bb, u8 central_ch)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_set_gain_error_8852a_2(bb, central_ch);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
halbb_set_gain_error_8852b(bb, central_ch);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_set_gain_error_8852c(bb, central_ch);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
u8 halbb_stop_ic_trx(struct bb_info *bb, u8 set_type)
|
{
|
struct rtw_hal_com_t *hal_i = bb->hal_com;
|
u8 i = 0;
|
bool trx_idle_success = false;
|
u32 dp = 0;
|
|
if (set_type == HALBB_SET) {
|
/*[Stop TRX]---------------------------------------------------------*/
|
if (bb->ic_type & BB_IC_AX_SERIES) {
|
/*set debug port to 0x0*/
|
if (!halbb_bb_dbg_port_racing(bb, DBGPORT_PRI_3)) {
|
return HALBB_SET_FAIL;
|
}
|
halbb_set_bb_dbg_port_ip(bb, DBGPORT_IP_TD);
|
halbb_set_bb_dbg_port(bb, 0x205);
|
|
for (i = 0; i < 100; i++) {
|
dp = halbb_get_bb_dbg_port_val(bb);
|
/* CCA_all && mux_state*/
|
if ((dp & 0x80000f00) == 0) {
|
BB_DBG(bb, DBG_DBG_API, "Stop trx wait for (%d) times\n", i);
|
trx_idle_success = true;
|
break;
|
}
|
halbb_delay_ms(bb, 1);
|
}
|
halbb_release_bb_dbg_port(bb);
|
}
|
|
if (trx_idle_success) {
|
/*pause all TX queue*/
|
rtw_hal_tx_pause(hal_i, 0, true, PAUSE_RSON_PSD);
|
rtw_hal_tx_pause(hal_i, 1, true, PAUSE_RSON_PSD);
|
halbb_ctrl_rx_cca(bb, false, HW_PHY_0);
|
halbb_ctrl_rx_cca(bb, false, HW_PHY_1);
|
} else {
|
return HALBB_SET_FAIL;
|
}
|
|
return HALBB_SET_SUCCESS;
|
|
} else { /*@if (set_type == HALBB_REVERT)*/
|
/*Release all TX queue*/
|
rtw_hal_tx_pause(hal_i, 0, false, PAUSE_RSON_PSD);
|
rtw_hal_tx_pause(hal_i, 1, false, PAUSE_RSON_PSD);
|
halbb_ctrl_rx_cca(bb, true, HW_PHY_0);
|
halbb_ctrl_rx_cca(bb, true, HW_PHY_1);
|
|
return HALBB_SET_SUCCESS;
|
}
|
}
|
|
u8 halbb_get_txsc(struct bb_info *bb, u8 pri_ch, u8 central_ch,
|
enum channel_width cbw, enum channel_width dbw)
|
{
|
u8 txsc_idx = 0;
|
u8 tmp = 0;
|
u8 ofst = 0;
|
|
if ((cbw == dbw) || (cbw == CHANNEL_WIDTH_20)) {
|
txsc_idx = 0;
|
BB_DBG(bb, DBG_PHY_CONFIG, "[TXSC] TxSC_idx = %d\n", txsc_idx);
|
return txsc_idx;
|
}
|
|
switch (cbw) {
|
case CHANNEL_WIDTH_40:
|
txsc_idx = pri_ch > central_ch ? 1 : 2;
|
break;
|
case CHANNEL_WIDTH_80:
|
if (dbw == CHANNEL_WIDTH_20) {
|
if (pri_ch > central_ch)
|
txsc_idx = (pri_ch - central_ch) >> 1;
|
else
|
txsc_idx = ((central_ch - pri_ch) >> 1) + 1;
|
} else {
|
txsc_idx = pri_ch > central_ch ? 9 : 10;
|
}
|
break;
|
case CHANNEL_WIDTH_160:
|
if (pri_ch > central_ch)
|
tmp = (pri_ch - central_ch) >> 1;
|
else
|
tmp = ((central_ch - pri_ch) >> 1) + 1;
|
|
if (dbw == CHANNEL_WIDTH_20) {
|
txsc_idx = tmp;
|
} else if (dbw == CHANNEL_WIDTH_40) {
|
if ((tmp == 1) || (tmp == 3))
|
txsc_idx = 9;
|
else if ((tmp == 5) || (tmp == 7))
|
txsc_idx = 11;
|
else if ((tmp == 2) || (tmp == 4))
|
txsc_idx = 10;
|
else if ((tmp == 6) || (tmp == 8))
|
txsc_idx = 12;
|
else
|
return 0xff;
|
} else {
|
txsc_idx = pri_ch > central_ch ? 13 : 14;
|
}
|
break;
|
case CHANNEL_WIDTH_80_80:
|
if (dbw == CHANNEL_WIDTH_20) {
|
if (pri_ch > central_ch)
|
txsc_idx = (10 - (pri_ch - central_ch)) >> 1;
|
else
|
txsc_idx = ((central_ch - pri_ch) >> 1) + 5;
|
} else if (dbw == CHANNEL_WIDTH_40) {
|
txsc_idx = pri_ch > central_ch ? 10 : 12;
|
} else {
|
txsc_idx = 14;
|
}
|
default:
|
break;
|
}
|
BB_DBG(bb, DBG_PHY_CONFIG, "[TXSC] TxSC_idx = %d\n", txsc_idx);
|
return txsc_idx;
|
}
|
|
void halbb_reset_adc(struct bb_info *bb)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
halbb_adc_rst_8852a(bb);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_reset_bb_phy(struct bb_info *bb, enum phl_phy_idx phy_idx)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
halbb_bb_reset_8852a(bb);
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_bb_reset_8852a_2(bb, phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
halbb_bb_reset_8852b(bb, phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_bb_reset_8852c(bb, phy_idx);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_reset_bb(struct bb_info *bb)
|
{
|
halbb_reset_bb_phy(bb, HW_PHY_0);
|
|
if (bb->hal_com->dbcc_en)
|
halbb_reset_bb_phy(bb, HW_PHY_1);
|
}
|
|
void halbb_tssi_bb_reset(struct bb_info *bb)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
halbb_tssi_bb_reset_8852a(bb);
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_tssi_bb_reset_8852a_2(bb);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_tssi_bb_reset_8852c(bb);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
u32 halbb_read_rf_reg(struct bb_info *bb, enum rf_path path, u32 addr, u32 mask)
|
{
|
u32 val = 0;
|
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
val = halbb_read_rf_reg_8852a(bb, path, addr, mask);
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
val = halbb_read_rf_reg_8852a_2(bb, path, addr, mask);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
val = halbb_read_rf_reg_8852b(bb, path, addr, mask);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
val = halbb_read_rf_reg_8852c(bb, path, addr, mask);
|
break;
|
#endif
|
|
|
default:
|
val = 0;
|
break;
|
}
|
|
return val;
|
}
|
|
bool halbb_write_rf_reg(struct bb_info *bb, enum rf_path path, u32 addr, u32 mask,
|
u32 data)
|
{
|
bool rpt = true;
|
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
rpt = halbb_write_rf_reg_8852a(bb, path, addr, mask, data);
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
rpt = halbb_write_rf_reg_8852a_2(bb, path, addr, mask, data);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
rpt = halbb_write_rf_reg_8852b(bb, path, addr, mask, data);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
rpt = halbb_write_rf_reg_8852c(bb, path, addr, mask, data);
|
break;
|
#endif
|
|
default:
|
rpt = false;
|
break;
|
}
|
|
return rpt;
|
}
|
|
bool halbb_rf_set_bb_reg(struct bb_info *bb, u32 addr, u32 mask, u32 data)
|
{
|
bool rpt = false;
|
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
rpt = halbb_rf_write_bb_reg_8852a_2(bb, addr, mask, data);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
rpt = halbb_rf_write_bb_reg_8852b(bb, addr, mask, data);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
rpt = halbb_rf_write_bb_reg_8852c(bb, addr, mask, data);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
|
if (bb->bb_dbg_i.cr_recorder_rf_en)
|
BB_TRACE("[RF][W] 0x%04x[0x%08x] = 0x%08x\n", addr, mask, data);
|
|
if (!rpt)
|
BB_WARNING("[%s][IQK]error IO 0x%x\n", __func__, addr);
|
|
return rpt;
|
}
|
|
u32 halbb_rf_get_bb_reg(struct bb_info *bb, u32 addr, u32 mask)
|
{
|
u32 val = 0;
|
|
val = halbb_get_reg(bb, addr, mask);
|
|
if (bb->bb_dbg_i.cr_recorder_rf_en)
|
BB_TRACE("[RF][R] 0x%04x[0x%08x] = 0x%08x\n", addr, mask, val);
|
|
return val;
|
}
|
|
void halbb_dfs_en(struct bb_info *bb, bool en)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_dfs_en_8852a_2(bb, en);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
//halbb_dfs_en_8852b(bb, en);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_dfs_en_8852c(bb, en);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_adc_en(struct bb_info *bb, bool en)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_adc_en_8852a_2(bb, en);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
halbb_adc_en_8852b(bb, en);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_adc_en_8852c(bb, en);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_tssi_cont_en(struct bb_info *bb, bool en, enum rf_path path)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_tssi_cont_en_8852a_2(bb, en, path);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
halbb_tssi_cont_en_8852b(bb, en, path);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_tssi_cont_en_8852c(bb, en, path);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_bb_reset_en(struct bb_info *bb, bool en, enum phl_phy_idx phy_idx)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_bb_reset_en_8852a_2(bb, en, phy_idx);
|
break;
|
#endif
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
halbb_bb_reset_en_8852b(bb, en, phy_idx);
|
break;
|
#endif
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_bb_reset_en_8852a_2(bb, en, phy_idx);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_ctrl_rf_mode(struct bb_info *bb, enum phl_rf_mode mode)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
halbb_ctrl_rf_mode_8852a(bb, mode);
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_ctrl_rf_mode_8852a_2(bb, mode);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
halbb_ctrl_rf_mode_8852b(bb, mode);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_ctrl_rf_mode_8852c(bb, mode);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
bool halbb_ctrl_rx_path(struct bb_info *bb, enum rf_path rx_path)
|
{
|
bool rpt = true;
|
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
rpt = halbb_ctrl_rx_path_8852a(bb, rx_path);
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
rpt = halbb_ctrl_rx_path_8852a_2(bb, rx_path);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
rpt = halbb_ctrl_rx_path_8852b(bb, rx_path);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
rpt = halbb_ctrl_rx_path_8852c(bb, rx_path);
|
break;
|
#endif
|
|
default:
|
rpt = false;
|
break;
|
}
|
|
return rpt;
|
}
|
|
bool halbb_ctrl_tx_path(struct bb_info *bb, enum rf_path tx_path)
|
{
|
bool rpt = true;
|
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
rpt = halbb_ctrl_tx_path_8852a(bb, tx_path);
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
rpt = halbb_ctrl_tx_path_8852a_2(bb, tx_path);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
rpt = halbb_ctrl_tx_path_8852b(bb, tx_path);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
rpt = halbb_ctrl_tx_path_8852c(bb, tx_path);
|
break;
|
#endif
|
|
default:
|
rpt = false;
|
break;
|
}
|
|
return rpt;
|
}
|
|
void halbb_ctrl_trx_path(struct bb_info *bb, enum rf_path tx_path, u8 tx_nss,
|
enum rf_path rx_path, u8 rx_nss)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
halbb_ctrl_trx_path_8852a(bb, tx_path, tx_nss, rx_path, rx_nss);
|
break;
|
#endif
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_ctrl_trx_path_8852a_2(bb, tx_path, tx_nss, rx_path, rx_nss);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
halbb_ctrl_trx_path_8852b(bb, tx_path, tx_nss, rx_path, rx_nss);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_ctrl_trx_path_8852c(bb, tx_path, tx_nss, rx_path, rx_nss);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
|
}
|
|
bool halbb_ctrl_bw(struct bb_info *bb, u8 pri_ch, enum channel_width bw,
|
enum phl_phy_idx phy_idx)
|
{
|
bool rpt = true;
|
struct bb_api_info *bb_api = &bb->bb_api_i;
|
|
bb_api->pri_ch_idx = pri_ch;
|
bb_api->bw = bw;
|
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
rpt = halbb_ctrl_bw_8852a(bb, pri_ch, bw, phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
rpt = halbb_ctrl_bw_8852a_2(bb, pri_ch, bw, phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
rpt = halbb_ctrl_bw_8852b(bb, pri_ch, bw, phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
rpt = halbb_ctrl_bw_8852c(bb, pri_ch, bw, phy_idx);
|
break;
|
#endif
|
|
default:
|
rpt = false;
|
break;
|
}
|
|
return rpt;
|
}
|
|
bool halbb_ctrl_ch(struct bb_info *bb, u8 central_ch, enum band_type band,
|
enum phl_phy_idx phy_idx)
|
{
|
bool rpt = true;
|
struct bb_api_info *bb_api = &bb->bb_api_i;
|
|
bb_api->central_ch = central_ch;
|
bb_api->band = band;
|
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
rpt = halbb_ctrl_ch_8852a(bb, central_ch, phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
rpt = halbb_ctrl_ch_8852a_2(bb, central_ch, band, phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
rpt = halbb_ctrl_ch_8852b(bb, central_ch, phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
rpt = halbb_ctrl_ch_8852c(bb, central_ch, band, phy_idx);
|
break;
|
#endif
|
|
default:
|
rpt = false;
|
break;
|
}
|
|
return rpt;
|
}
|
|
bool halbb_ctrl_ch2_80p80(struct bb_info *bb, u8 central_ch)
|
{
|
bool rpt = true;
|
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
rpt = halbb_ctrl_ch2_80p80_8852a(bb, central_ch);
|
break;
|
#endif
|
#if 0//def BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
rpt = halbb_ctrl_ch2_80p80_8852a_2(bb, central_ch);
|
break;
|
#endif
|
|
default:
|
rpt = false;
|
break;
|
}
|
|
return rpt;
|
}
|
|
bool halbb_ctrl_bw_ch(struct bb_info *bb, u8 pri_ch, u8 central_ch_seg0,
|
u8 central_ch_seg1, enum band_type band,
|
enum channel_width bw, enum phl_phy_idx phy_idx)
|
{
|
bool rpt = true;
|
struct bb_api_info *bb_api = &bb->bb_api_i;
|
|
bb_api->central_ch = central_ch_seg0;
|
bb_api->band = band;
|
bb_api->bw = bw;
|
bb_api->pri_ch_idx = pri_ch;
|
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
rpt = halbb_ctrl_bw_ch_8852a(bb, pri_ch, central_ch_seg0, bw,
|
phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
#ifdef HALBB_FW_OFLD_SUPPORT
|
if (halbb_check_fw_ofld(bb)) {
|
BB_WARNING("Do FW offload at Channel switch\n");
|
rpt = halbb_fwofld_bw_ch_8852a_2(bb, pri_ch, central_ch_seg0,
|
bw, phy_idx);
|
}
|
else
|
rpt = halbb_ctrl_bw_ch_8852a_2(bb, pri_ch,
|
central_ch_seg0, bw,
|
band, phy_idx);
|
#else
|
rpt = halbb_ctrl_bw_ch_8852a_2(bb, pri_ch, central_ch_seg0, bw,
|
band, phy_idx);
|
#endif
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
#ifdef HALBB_FW_OFLD_SUPPORT
|
if (halbb_check_fw_ofld(bb)) {
|
BB_WARNING("Do FW offload at Channel switch start\n");
|
rpt = halbb_fwofld_ctrl_bw_ch_8852b(bb, pri_ch, central_ch_seg0, bw,
|
band, phy_idx);
|
BB_WARNING("Do FW offload at Channel switch stop\n");
|
} else {
|
BB_WARNING("Not FW offload at Channel switch start\n");
|
rpt = halbb_ctrl_bw_ch_8852b(bb, pri_ch, central_ch_seg0, bw,
|
band, phy_idx);
|
BB_WARNING("Not FW offload at Channel switch stop\n");
|
}
|
#else
|
rpt = halbb_ctrl_bw_ch_8852b(bb, pri_ch, central_ch_seg0, bw,
|
band, phy_idx);
|
#endif
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
rpt = halbb_ctrl_bw_ch_8852c(bb, pri_ch, central_ch_seg0, bw,
|
band, phy_idx);
|
break;
|
#endif
|
|
default:
|
rpt = false;
|
break;
|
}
|
|
return rpt;
|
}
|
|
|
void halbb_ctrl_dbcc(struct bb_info *bb, bool dbcc_enable)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
halbb_ctrl_dbcc_8852a(bb, dbcc_enable);
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_ctrl_dbcc_8852a_2(bb, dbcc_enable);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_ctrl_dbcc_8852c(bb, dbcc_enable);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_cfg_dbcc(struct bb_info *bb, bool dbcc_enable)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
halbb_cfg_dbcc_8852a(bb, dbcc_enable);
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_cfg_dbcc_8852a_2(bb, dbcc_enable);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_cfg_dbcc_8852c(bb, dbcc_enable);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_ctrl_rx_cca(struct bb_info *bb, bool cca_en, enum phl_phy_idx phy_idx)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
halbb_ctrl_rx_cca_8852a(bb, cca_en, phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_ctrl_rx_cca_8852a_2(bb, cca_en, phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
halbb_ctrl_rx_cca_8852b(bb, cca_en, phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_ctrl_rx_cca_8852c(bb, cca_en, phy_idx);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
void halbb_ctrl_cck_en(struct bb_info *bb, bool cck_enable,
|
enum phl_phy_idx phy_idx)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
halbb_ctrl_cck_en_8852a(bb, cck_enable, phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_ctrl_cck_en_8852a_2(bb, cck_enable, phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
halbb_ctrl_cck_en_8852b(bb, cck_enable, phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_ctrl_cck_en_8852c(bb, cck_enable, phy_idx);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_ctrl_ofdm_en(struct bb_info *bb, bool ofdm_enable,
|
enum phl_phy_idx phy_idx)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
halbb_ctrl_ofdm_en_8852a(bb, ofdm_enable, phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_ctrl_ofdm_en_8852a_2(bb, ofdm_enable, phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
halbb_ctrl_ofdm_en_8852b(bb, ofdm_enable, phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_ctrl_ofdm_en_8852c(bb, ofdm_enable, phy_idx);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_ctrl_btg(struct bb_info *bb, bool btg)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_ctrl_btg_8852a_2(bb, btg);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
halbb_ctrl_btg_8852b(bb, btg);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_ctrl_btg_8852c(bb, btg);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_ctrl_btc_preagc(struct bb_info *bb, bool bt_en)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_ctrl_btc_preagc_8852a_2(bb, bt_en);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
halbb_ctrl_btc_preagc_8852b(bb, bt_en);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_ctrl_btc_preagc_8852c(bb, bt_en);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_pop_en(struct bb_info *bb, bool en, enum phl_phy_idx phy_idx)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_pop_en_8852a_2(bb, en, phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
halbb_pop_en_8852b(bb, en, phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_pop_en_8852c(bb, en, phy_idx);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
bool halbb_querry_pop_en(struct bb_info *bb, enum phl_phy_idx phy_idx)
|
{
|
bool rpt = true;
|
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
rpt = halbb_querry_pop_en_8852a_2(bb, phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
rpt = halbb_querry_pop_en_8852b(bb, phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
rpt = halbb_querry_pop_en_8852c(bb, phy_idx);
|
break;
|
#endif
|
|
default:
|
rpt = false;
|
break;
|
}
|
|
return rpt;
|
}
|
|
bool halbb_set_pd_lower_bound(struct bb_info *bb, u8 bound,
|
enum channel_width bw, enum phl_phy_idx phy_idx)
|
{
|
bool rpt = true;
|
struct bb_api_info *bb_api = &bb->bb_api_i;
|
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
rpt = halbb_set_pd_lower_bound_8852a_2(bb, bound, bw, phy_idx);
|
break;
|
#endif
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
rpt = halbb_set_pd_lower_bound_8852b(bb, bound, bw, phy_idx);
|
break;
|
#endif
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
rpt = halbb_set_pd_lower_bound_8852c(bb, bound, bw, phy_idx);
|
break;
|
#endif
|
|
default:
|
rpt = false;
|
break;
|
}
|
|
return rpt;
|
}
|
|
bool halbb_set_pd_lower_bound_cck(struct bb_info *bb, u8 bound,
|
enum channel_width bw, enum phl_phy_idx phy_idx)
|
{
|
bool rpt = true;
|
struct bb_api_info *bb_api = &bb->bb_api_i;
|
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
rpt = halbb_set_pd_lower_bound_cck_8852a_2(bb, bound, bw, phy_idx);
|
break;
|
#endif
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
rpt = halbb_set_pd_lower_bound_cck_8852b(bb, bound, bw, phy_idx);
|
break;
|
#endif
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
rpt = halbb_set_pd_lower_bound_cck_8852c(bb, bound, bw, phy_idx);
|
break;
|
#endif
|
|
default:
|
rpt = false;
|
break;
|
}
|
|
return rpt;
|
}
|
|
|
u8 halbb_querry_pd_lower_bound(struct bb_info *bb, bool get_en_info,
|
enum phl_phy_idx phy_idx)
|
{
|
u8 rpt = 0;
|
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
rpt = halbb_querry_pd_lower_bound_8852a_2(bb, get_en_info, phy_idx);
|
break;
|
#endif
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
rpt = halbb_querry_pd_lower_bound_8852b(bb, get_en_info, phy_idx);
|
break;
|
#endif
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
rpt = halbb_querry_pd_lower_bound_8852c(bb, get_en_info, phy_idx);
|
break;
|
#endif
|
default:
|
rpt = 0;
|
break;
|
}
|
|
return rpt;
|
}
|
|
u8 halbb_get_losel(struct bb_info *bb)
|
{
|
u8 rpt = 0xff;
|
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
rpt = halbb_get_losel_8852a_2(bb);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
rpt = halbb_get_losel_8852c(bb);
|
break;
|
#endif
|
|
default:
|
rpt = 0xff;
|
break;
|
}
|
|
return rpt;
|
}
|
|
|
void halbb_set_igi(struct bb_info *bb, u8 lna_idx, bool tia_idx, u8 rxbb_idx,
|
enum rf_path path)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
halbb_set_igi_8852a(bb, lna_idx, tia_idx, rxbb_idx, path);
|
break;
|
#endif
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_set_igi_8852a_2(bb, lna_idx, tia_idx, rxbb_idx, path);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
halbb_set_igi_8852b(bb, lna_idx, tia_idx, rxbb_idx, path);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_set_igi_8852c(bb, lna_idx, tia_idx, rxbb_idx, path);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_set_tx_pow_pattern_shap(struct bb_info *bb, u8 ch,
|
bool is_ofdm, enum phl_phy_idx phy_idx) {
|
|
struct rtw_tpu_info *tpu = &bb->hal_com->band[phy_idx].rtw_tpu_i;
|
u8 shape_idx = tpu->tx_ptrn_shap_idx;
|
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
if (is_ofdm)
|
halbb_tx_triangular_shap_cfg_8852a_2(bb, shape_idx, phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
if (is_ofdm)
|
halbb_tx_triangular_shap_cfg_8852b(bb, shape_idx, phy_idx);
|
else
|
halbb_tx_dfir_shap_cck_8852b(bb, ch, shape_idx, phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
if (is_ofdm)
|
halbb_tx_triangular_shap_cfg_8852c(bb, shape_idx, phy_idx);
|
//else
|
// halbb_tx_dfir_shap_cck_8852c(bb, ch, shape_idx, phy_idx);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_set_tx_pow_ref(struct bb_info *bb, enum phl_phy_idx phy_idx)
|
{
|
struct rtw_tpu_info *tpu = &bb->hal_com->band[phy_idx].rtw_tpu_i;
|
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
|
rtw_hal_mac_write_pwr_ref_reg(bb->hal_com, (enum phl_band_idx)phy_idx);
|
|
halbb_set_tx_pow_ref_8852a_2(bb, tpu->ref_pow_ofdm,
|
tpu->ref_pow_cck,
|
tpu->ofst_int,
|
tpu->base_cw_0db,
|
tpu->tssi_16dBm_cw,
|
&tpu->ref_pow_ofdm_cw,
|
&tpu->ref_pow_cck_cw,
|
phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
rtw_hal_mac_write_pwr_ref_reg(bb->hal_com, (enum phl_band_idx)phy_idx);
|
|
halbb_set_tx_pow_ref_8852b(bb, tpu->ref_pow_ofdm,
|
tpu->ref_pow_cck,
|
tpu->ofst_int,
|
tpu->base_cw_0db,
|
tpu->tssi_16dBm_cw,
|
&tpu->ref_pow_ofdm_cw,
|
&tpu->ref_pow_cck_cw,
|
phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
rtw_hal_mac_write_pwr_ref_reg(bb->hal_com, (enum phl_band_idx)phy_idx);
|
|
halbb_set_tx_pow_ref_8852c(bb, tpu->ref_pow_ofdm,
|
tpu->ref_pow_cck,
|
tpu->ofst_int,
|
tpu->base_cw_0db,
|
tpu->tssi_16dBm_cw,
|
&tpu->ref_pow_ofdm_cw,
|
&tpu->ref_pow_cck_cw,
|
phy_idx);
|
break;
|
#endif
|
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_normal_efuse_verify(struct bb_info *bb, s8 rx_gain_offset,
|
enum rf_path rx_path, enum phl_phy_idx phy_idx)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_normal_efuse_verify_8852a_2(bb, rx_gain_offset, rx_path, phy_idx);
|
break;
|
#endif
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
halbb_normal_efuse_verify_8852b(bb, rx_gain_offset, rx_path, phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_normal_efuse_verify_8852c(bb, rx_gain_offset, rx_path, phy_idx);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_normal_efuse_verify_cck(struct bb_info *bb, s8 rx_gain_offset,
|
enum rf_path rx_path,
|
enum phl_phy_idx phy_idx)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_normal_efuse_verify_cck_8852a_2(bb, rx_gain_offset,
|
rx_path, phy_idx);
|
break;
|
#endif
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
halbb_normal_efuse_verify_cck_8852b(bb, rx_gain_offset,
|
rx_path, phy_idx);
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_normal_efuse_verify_cck_8852c(bb, rx_gain_offset,
|
rx_path, phy_idx);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_rx_setting(struct bb_info *bb, u8 patch_idx)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_CAV_SUPPORT
|
case BB_RTL8852AA:
|
halbb_rx_setting_8852a(bb, patch_idx);
|
break;
|
#endif
|
#if 0//def BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
halbb_rx_setting_8852b(bb, patch_idx)
|
break;
|
#endif
|
|
#if 0//def BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_rx_setting_8852c(bb, patch_idx)
|
break;
|
#endif
|
default:
|
break;
|
}
|
}
|
|
void halbb_ic_hw_setting_non_io(struct bb_info *bb)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
#ifdef BB_DYN_1R_CCA
|
bb->bb_8852a_2_i.dyn_1r_cca_cfg = RF_PATH_ABCD;
|
#endif
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_ic_hw_setting_low_io(struct bb_info *bb)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
#ifdef BB_DYN_1R_CCA
|
bb->bb_8852a_2_i.dyn_1r_cca_cfg = RF_PATH_ABCD;
|
#endif
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_ic_hw_setting(struct bb_info *bb)
|
{
|
switch (bb->ic_type) {
|
|
#ifdef BB_8852A_2_SUPPORT
|
case BB_RTL8852A:
|
halbb_ic_hw_setting_8852a_2(bb);
|
#ifdef HALBB_DYN_CSI_RSP_SUPPORT
|
halbb_dyn_csi_rsp_main(bb);
|
#endif
|
#ifdef BB_DYN_1R_CCA
|
halbb_dyn_1r_cca_8852a_2(bb);
|
#endif
|
#ifdef BB_DYN_CFO_TRK_LOP
|
halbb_dyn_cfo_trk_loop(bb);
|
#endif
|
break;
|
#endif
|
#ifdef BB_8852B_SUPPORT
|
case BB_RTL8852B:
|
halbb_ic_hw_setting_8852b(bb);
|
#ifdef HALBB_DYN_CSI_RSP_SUPPORT
|
halbb_dyn_csi_rsp_main(bb);
|
#endif
|
break;
|
#endif
|
|
#ifdef BB_8852C_SUPPORT
|
case BB_RTL8852C:
|
halbb_ic_hw_setting_8852c(bb);
|
break;
|
#endif
|
|
default:
|
break;
|
}
|
}
|
|
void halbb_ic_hw_setting_dbg(struct bb_info *bb, char input[][16],
|
u32 *_used, char *output, u32 *_out_len)
|
{
|
u32 val[5] = {0};
|
u8 i = 0, j = 0;
|
enum rf_path cca_path;
|
#ifdef BB_DYN_CFO_TRK_LOP
|
struct bb_cfo_trk_info *cfo_trk = &bb->bb_cfo_trk_i;
|
struct bb_dyn_cfo_trk_lop_info *dctl = &cfo_trk->bb_dyn_cfo_trk_lop_i;
|
#endif
|
|
if (_os_strcmp(input[1], "-h") == 0) {
|
#ifdef BB_DYN_1R_CCA
|
BB_DBG_CNSL(*_out_len, *_used, output + *_used, *_out_len - *_used,
|
"1r_cca en {0/1}\n");
|
BB_DBG_CNSL(*_out_len, *_used, output + *_used, *_out_len - *_used,
|
"1r_cca force {1:A, 2:B, 3:AB}\n");
|
BB_DBG_CNSL(*_out_len, *_used, output + *_used, *_out_len - *_used,
|
"1r_cca diff_th {val}\n");
|
BB_DBG_CNSL(*_out_len, *_used, output + *_used, *_out_len - *_used,
|
"1r_cca min_th {val}\n");
|
#endif
|
#ifdef BB_DYN_CFO_TRK_LOP
|
BB_DBG_CNSL(*_out_len, *_used, output + *_used, *_out_len - *_used,
|
"cfo_trk en {0/1}\n");
|
BB_DBG_CNSL(*_out_len, *_used, output + *_used, *_out_len - *_used,
|
"cfo_trk force {0:SNR, 1:link}\n");
|
BB_DBG_CNSL(*_out_len, *_used, output + *_used, *_out_len - *_used,
|
"cfo_trk para {0:SNR, 1:link} {data_val} {pilot_val}\n");
|
BB_DBG_CNSL(*_out_len, *_used, output + *_used, *_out_len - *_used,
|
"cfo_trk snr_th {th_l} {th_h}\n");
|
#endif
|
return;
|
}
|
|
#ifdef BB_DYN_CFO_TRK_LOP
|
if (_os_strcmp(input[1], "cfo_trk") == 0) {
|
HALBB_SCAN(input[3], DCMD_DECIMAL, &val[0]);
|
|
if (_os_strcmp(input[2], "en") == 0) {
|
halbb_dyn_cfo_trk_loop_en(bb, (bool)val[0]);
|
} else if (_os_strcmp(input[2], "force") == 0) {
|
halbb_dyn_cfo_trk_loop_en(bb, false);
|
|
if (val[0] == 0)
|
halbb_cfo_trk_loop_cr_cfg(bb, DCTL_SNR);
|
else if (val[0] == 1)
|
halbb_cfo_trk_loop_cr_cfg(bb, DCTL_LINK);
|
else
|
return;
|
|
BB_DBG_CNSL(*_out_len, *_used, output + *_used, *_out_len - *_used,
|
"Force state=%d\n", val[0]);
|
} else if (_os_strcmp(input[2], "para") == 0) {
|
HALBB_SCAN(input[4], DCMD_HEX, &val[1]);
|
HALBB_SCAN(input[5], DCMD_HEX, &val[2]);
|
|
if (val[0] >= 2)
|
return;
|
|
dctl->bb_cfo_trk_lop_cr_i[val[0]].dctl_data = (u8)val[1];
|
dctl->bb_cfo_trk_lop_cr_i[val[0]].dctl_pilot = (u8)val[2];
|
|
BB_DBG_CNSL(*_out_len, *_used, output + *_used, *_out_len - *_used,
|
"state:%d, dctl_data=0x%x, dctl_pilot=0x%x\n", val[0],
|
dctl->bb_cfo_trk_lop_cr_i[val[0]].dctl_data,
|
dctl->bb_cfo_trk_lop_cr_i[val[0]].dctl_pilot);
|
|
} else if (_os_strcmp(input[2], "snr_th") == 0) {
|
HALBB_SCAN(input[4], DCMD_DECIMAL, &val[1]);
|
|
dctl->dctl_snr_th_l = (u16)val[0] << RSSI_MA_H;
|
dctl->dctl_snr_th_h = (u16)val[1] << RSSI_MA_H;
|
|
BB_DBG_CNSL(*_out_len, *_used, output + *_used, *_out_len - *_used,
|
"dctl_snr_th_{l/h}={%d/%d}\n",
|
val[0], val[1]);
|
}
|
} else
|
#endif
|
#ifdef BB_DYN_1R_CCA
|
if (_os_strcmp(input[1], "1r_cca") == 0) {
|
HALBB_SCAN(input[3], DCMD_DECIMAL, &val[0]);
|
if (_os_strcmp(input[2], "en") == 0) {
|
halbb_dyn_1r_cca_en_8852a_2(bb, (bool)val[0]);
|
} else if (_os_strcmp(input[2], "force") == 0) {
|
halbb_dyn_1r_cca_en_8852a_2(bb, false);
|
|
if (val[0] == 1)
|
cca_path = RF_PATH_A;
|
else if (val[0] == 2)
|
cca_path = RF_PATH_B;
|
else if (val[0] == 3)
|
cca_path = RF_PATH_AB;
|
else
|
return;
|
halbb_dyn_1r_cca_cfg_8852a_2(bb, cca_path);
|
BB_DBG_CNSL(*_out_len, *_used, output + *_used, *_out_len - *_used,
|
"Force cca_path=%d\n", cca_path);
|
} else if (_os_strcmp(input[2], "diff_th") == 0) {
|
bb->bb_8852a_2_i.dyn_1r_cca_rssi_diff_th= (u16)(val[0] << 5);
|
} else if (_os_strcmp(input[2], "min_th") == 0) {
|
bb->bb_8852a_2_i.dyn_1r_cca_rssi_min_th= (u16)(val[0] << 5);
|
}
|
|
BB_DBG_CNSL(*_out_len, *_used, output + *_used, *_out_len - *_used,
|
"[Dyn 1R CCA]en=%d, diff_th=%d, min_th=%d\n",
|
bb->bb_8852a_2_i.dyn_1r_cca_en,
|
bb->bb_8852a_2_i.dyn_1r_cca_rssi_diff_th >> 5,
|
bb->bb_8852a_2_i.dyn_1r_cca_rssi_min_th >> 5);
|
} else
|
#endif
|
{
|
BB_DBG_CNSL(*_out_len, *_used, output + *_used, *_out_len - *_used,
|
"Set Err\n");
|
}
|
}
|
|
void halbb_ic_api_dbg(struct bb_info *bb, char input[][16], u32 *_used,
|
char *output, u32 *_out_len)
|
{
|
u32 val[10] = {0};
|
u32 used = *_used;
|
u32 out_len = *_out_len;
|
u8 tmp = 0, i = 0;
|
u32 j = 0;
|
#ifdef BB_8852B_SUPPORT
|
bool judge_f;
|
#endif
|
|
if (_os_strcmp(input[1], "-h") == 0) {
|
BB_DBG_CNSL(out_len, used, output + used, out_len - used,
|
"trx_path {tx_path} {tx_nss} {rx_path} {rx_nss}\n");
|
BB_DBG_CNSL(out_len, used, output + used, out_len - used,
|
"igi ({lna_idx (0~6)} {tia_idx (0~1)} {rxbb_idx (0~31)} {path (0~1)})\n");
|
BB_DBG_CNSL(out_len, used, output + used, out_len - used,
|
"Rx_setting({patch_idx (0:default, 1:patch-1, 2:patch-2)})\n");
|
BB_DBG_CNSL(out_len, used, output + used, out_len - used,
|
"rfe dump\n");
|
BB_DBG_CNSL(out_len, used, output + used, out_len - used,
|
"rfe all {rfe_idx}\n");
|
BB_DBG_CNSL(out_len, used, output + used, out_len - used,
|
"rfe cmn {gpio_idx} {path} {inv} {src}\n");
|
BB_DBG_CNSL(out_len, used, output + used, out_len - used,
|
"rfe rfm {path} {src} {dis_tx} {ac_tx} {ac_bt} {val}\n");
|
BB_DBG_CNSL(out_len, used, output + used, out_len - used,
|
"rfe trsw {path} {path_en} {trsw_tx} {trsw_rx} {trsw} {trsw_b}\n");
|
BB_DBG_CNSL(out_len, used, output + used, out_len - used,
|
"rf sw_si rw {run_idx} {rx_path} {reg_addr}\n");
|
} else if (_os_strcmp(input[1], "trx_path") == 0) {
|
HALBB_SCAN(input[2], DCMD_DECIMAL, &val[0]);
|
HALBB_SCAN(input[3], DCMD_DECIMAL, &val[1]);
|
HALBB_SCAN(input[4], DCMD_DECIMAL, &val[2]);
|
HALBB_SCAN(input[5], DCMD_DECIMAL, &val[3]);
|
halbb_ctrl_trx_path(bb, (enum rf_path)val[0], (u8)val[1],
|
(enum rf_path)val[2], (u8)val[3]);
|
|
} else if (_os_strcmp(input[1], "igi") == 0) {
|
HALBB_SCAN(input[2], DCMD_DECIMAL, &val[0]);
|
HALBB_SCAN(input[3], DCMD_DECIMAL, &val[1]);
|
HALBB_SCAN(input[4], DCMD_DECIMAL, &val[2]);
|
HALBB_SCAN(input[5], DCMD_DECIMAL, &val[3]);
|
|
if (val[0] > 6) {
|
BB_DBG_CNSL(out_len, used, output + used, out_len - used,
|
"Invalid LNA index!\n");
|
} else if (val[1] > 1) {
|
BB_DBG_CNSL(out_len, used, output + used, out_len - used,
|
"Invalid TIA index!\n");
|
} else if (val[2] > 31) {
|
BB_DBG_CNSL(out_len, used, output + used, out_len - used,
|
"Invalid RxBB index!\n");
|
} else {
|
halbb_set_igi(bb, (u8)val[0], (bool)val[1], (u8)val[2],
|
(enum rf_path)val[3]);
|
}
|
} else if (_os_strcmp(input[1], "rx_setting") == 0) {
|
HALBB_SCAN(input[2], DCMD_DECIMAL, &val[0]);
|
if (val[0] > 2) {
|
BB_DBG_CNSL(out_len, used, output + used, out_len - used,
|
"Invalid Patch index!\n");
|
return;
|
}
|
halbb_rx_setting(bb, (u8)val[0]);
|
BB_DBG_CNSL(out_len, used, output + used, out_len - used,
|
"Rx setting Patch-%d Success!\n", val[0]);
|
} else if (_os_strcmp(input[1], "rfe") == 0) {
|
HALBB_SCAN(input[3], DCMD_DECIMAL, &val[0]);
|
HALBB_SCAN(input[4], DCMD_DECIMAL, &val[1]);
|
HALBB_SCAN(input[5], DCMD_DECIMAL, &val[2]);
|
HALBB_SCAN(input[6], DCMD_DECIMAL, &val[3]);
|
HALBB_SCAN(input[7], DCMD_DECIMAL, &val[4]);
|
HALBB_SCAN(input[8], DCMD_DECIMAL, &val[5]);
|
if (_os_strcmp(input[2], "dump") == 0) {
|
halbb_gpio_ctrl_dump(bb);
|
} else if (_os_strcmp(input[2], "all") == 0) {
|
//HALBB_SCAN(input[3], DCMD_DECIMAL, &val[0]);
|
halbb_gpio_setting_all(bb, (u8)val[0]);
|
} else if (_os_strcmp(input[2], "trsw") == 0) {
|
halbb_gpio_trsw_table(bb, (enum bb_path)val[0],
|
(bool)val[1], (bool)val[2],
|
(bool)val[3], (bool)val[4],
|
(bool)val[5]);
|
} else if (_os_strcmp(input[2], "rfm") == 0) {
|
halbb_gpio_rfm(bb, (enum bb_path)val[0],
|
(enum bb_rfe_src_sel)val[1], (bool)val[2],
|
(bool)val[3], (bool)val[4], (u8)val[5]);
|
} else if (_os_strcmp(input[2], "cmn") == 0) {
|
halbb_gpio_setting(bb, (u8)val[0], (enum bb_path)val[1],
|
(bool)val[2],
|
(enum bb_rfe_src_sel)val[3]);
|
}
|
} else if (_os_strcmp(input[1], "dbg") == 0) {
|
HALBB_SCAN(input[3], DCMD_DECIMAL, &val[0]);
|
HALBB_SCAN(input[4], DCMD_DECIMAL, &val[1]);
|
HALBB_SCAN(input[5], DCMD_DECIMAL, &val[2]);
|
#ifdef BB_8852A_2_SUPPORT
|
if (_os_strcmp(input[2], "pop_en") == 0) {
|
halbb_pop_en(bb, (bool)val[0],
|
(enum phl_phy_idx)val[1]);
|
} else if (_os_strcmp(input[2], "set_pd_low") == 0) {
|
halbb_set_pd_lower_bound(bb, (u8)val[0],
|
(enum channel_width)val[1],
|
(enum phl_phy_idx)val[2]);
|
} else if (_os_strcmp(input[2], "per") == 0) {
|
halbb_get_per_8852a_2(bb, (enum phl_phy_idx)val[0]);
|
}
|
#endif
|
} else if (_os_strcmp(input[1], "gain_ofst") == 0) {
|
HALBB_SCAN(input[2], DCMD_DECIMAL, &val[0]);
|
HALBB_SCAN(input[3], DCMD_DECIMAL, &val[1]);
|
HALBB_SCAN(input[4], DCMD_DECIMAL, &val[2]);
|
halbb_normal_efuse_verify(bb, (s8)val[0], (enum rf_path)val[1], (enum phl_phy_idx)val[2]);
|
#ifdef BB_8852B_SUPPORT
|
} else if (_os_strcmp(input[1], "rf_sw_si_rw") == 0) {
|
HALBB_SCAN(input[2], DCMD_DECIMAL, &val[0]);
|
HALBB_SCAN(input[3], DCMD_DECIMAL, &val[1]);
|
HALBB_SCAN(input[4], DCMD_DECIMAL, &val[2]);
|
HALBB_SCAN(input[5], DCMD_HEX, &val[3]);
|
|
if (val[0] > 2) {
|
BB_DBG_CNSL(out_len, used, output + used, out_len - used,
|
"[SW_SI] Do not run test!\n");
|
return;
|
} else if (val[1] > 10000) {
|
BB_DBG_CNSL(out_len, used, output + used, out_len - used,
|
"[SW_SI] Out-of test range!\n");
|
return;
|
} else if (val[2] > 3) {
|
BB_DBG_CNSL(out_len, used, output + used, out_len - used,
|
"[SW_SI] Wrong path setting!\n");
|
return;
|
} else if (val[3] > 0xff) {
|
BB_DBG_CNSL(out_len, used, output + used, out_len - used,
|
"[SW_SI] Wrong addr setting!\n");
|
return;
|
} else {
|
|
while (j < val[1]) {
|
judge_f = halbb_rf_sw_si_test(bb, (enum rf_path)val[2], (u8)val[3], j);
|
|
if (!judge_f){
|
BB_WARNING("[%s] while ocunter = %d\n", __func__, j);
|
break;
|
} else {
|
BB_WARNING("[%s] while ocunter = %d\n", __func__, j);
|
}
|
|
j++;
|
}
|
|
}
|
#endif
|
}
|
|
#if 0
|
else if (_os_strcmp(input[1], "sc_idx") == 0) {
|
HALBB_SCAN(input[2], DCMD_DECIMAL, &val[0]);
|
for (i = 0; i <= 15; i++) {
|
BB_DBG_CNSL(out_len, used, output + used, out_len - used,
|
"rpt(0, %d) = 0x%x\n", i,
|
halbb_get_csi_buf_idx(bb, (u8)val[0], i));
|
}
|
}
|
#endif
|
|
*_used = used;
|
*_out_len = out_len;
|
}
|
|
#ifdef HALBB_DIG_MCC_SUPPORT
|
u8 halbb_upd_mcc_macid(struct bb_info *bb, struct bb_mcc_i *mi)
|
{
|
struct halbb_mcc_dm *mcc_dm = &bb->mcc_dm;
|
u8 i = 0, role_ch = 0, band_idx = MCC_BAND_NUM;
|
|
BB_DBG(bb, DBG_DIG, "<====== %s ======>\n", __func__);
|
|
role_ch = mi->chandef->center_ch;
|
|
for (i = 0; i < MCC_BAND_NUM; i++) {
|
if (mcc_dm->mcc_rf_ch[i].center_ch == role_ch) {
|
band_idx = i;
|
break;
|
}
|
}
|
|
if (band_idx == MCC_BAND_NUM) {
|
BB_WARNING("%s, band_idx = %d", __func__, band_idx);
|
return HALBB_SET_FAIL;
|
}
|
|
if (mi->type == PHL_RTYPE_AP) {
|
mcc_dm->softap_macid = mi->self_macid;
|
BB_DBG(bb, DBG_DIG, "SoftAP macid = %d\n",
|
mcc_dm->softap_macid);
|
}
|
|
return HALBB_SET_SUCCESS;
|
}
|
|
|
void halbb_mcc_stop(struct bb_info *bb)
|
{
|
struct halbb_mcc_dm *mcc_dm = &bb->mcc_dm;
|
u8 i = 0, j = 0;
|
|
BB_DBG(bb, DBG_DIG, "<====== %s ======>\n", __func__);
|
|
if (mcc_dm->mcc_status_en == false)
|
return;
|
|
mcc_dm->mcc_status_en = false;
|
|
for (i = 0; i < MCC_BAND_NUM; i++) {
|
mcc_dm->sta_cnt[i] = 0;
|
mcc_dm->mcc_rf_ch[i].chan = INVALID_INIT_VAL;
|
mcc_dm->mcc_rf_ch[i].center_ch = INVALID_INIT_VAL;
|
}
|
}
|
|
u8 halbb_mcc_start(struct bb_info *bb, struct bb_mcc_i *mi_1,
|
struct bb_mcc_i *mi_2)
|
{
|
u8 ret = HALBB_SET_FAIL;
|
struct halbb_mcc_dm *mcc_dm = &bb->mcc_dm;
|
|
BB_DBG(bb, DBG_DIG, "<====== %s ======>\n", __func__);
|
|
halbb_mem_cpy(bb, &mcc_dm->mcc_rf_ch[MCC_BAND_1], mi_1->chandef,
|
sizeof(struct rtw_chan_def));
|
|
halbb_mem_cpy(bb, &mcc_dm->mcc_rf_ch[MCC_BAND_2], mi_2->chandef,
|
sizeof(struct rtw_chan_def));
|
|
ret = halbb_upd_mcc_macid(bb, mi_1);
|
if (ret != HALBB_SET_SUCCESS)
|
goto exit;
|
|
ret = halbb_upd_mcc_macid(bb, mi_2);
|
if (ret != HALBB_SET_SUCCESS)
|
goto exit;
|
|
mcc_dm->mcc_status_en = true;
|
ret = HALBB_SET_SUCCESS;
|
exit:
|
return ret;
|
|
}
|
#endif
|