diff options
Diffstat (limited to 'sys/contrib/dev/rtw89/rtw8852c.c')
| -rw-r--r-- | sys/contrib/dev/rtw89/rtw8852c.c | 65 | 
1 files changed, 57 insertions, 8 deletions
| diff --git a/sys/contrib/dev/rtw89/rtw8852c.c b/sys/contrib/dev/rtw89/rtw8852c.c index ef80d80dee2e..99f02c7702f9 100644 --- a/sys/contrib/dev/rtw89/rtw8852c.c +++ b/sys/contrib/dev/rtw89/rtw8852c.c @@ -12,9 +12,10 @@  #include "rtw8852c.h"  #include "rtw8852c_rfk.h"  #include "rtw8852c_table.h" +#include "sar.h"  #include "util.h" -#define RTW8852C_FW_FORMAT_MAX 1 +#define RTW8852C_FW_FORMAT_MAX 2  #define RTW8852C_FW_BASENAME "rtw89/rtw8852c_fw"  #define RTW8852C_MODULE_FIRMWARE \  	RTW8852C_FW_BASENAME "-" __stringify(RTW8852C_FW_FORMAT_MAX) ".bin" @@ -186,10 +187,17 @@ static const struct rtw89_edcca_regs rtw8852c_edcca_regs = {  	.edcca_p_mask			= B_EDCCA_LVL_MSK1,  	.ppdu_level			= R_SEG0R_EDCCA_LVL,  	.ppdu_mask			= B_EDCCA_LVL_MSK3, -	.rpt_a				= R_EDCCA_RPT_A, -	.rpt_b				= R_EDCCA_RPT_B, -	.rpt_sel			= R_EDCCA_RPT_SEL, -	.rpt_sel_mask			= B_EDCCA_RPT_SEL_MSK, +	.p = {{ +		.rpt_a			= R_EDCCA_RPT_A, +		.rpt_b			= R_EDCCA_RPT_B, +		.rpt_sel		= R_EDCCA_RPT_SEL, +		.rpt_sel_mask		= B_EDCCA_RPT_SEL_MSK, +	}, { +		.rpt_a			= R_EDCCA_RPT_P1_A, +		.rpt_b			= R_EDCCA_RPT_P1_B, +		.rpt_sel		= R_EDCCA_RPT_SEL, +		.rpt_sel_mask		= B_EDCCA_RPT_SEL_P1_MSK, +	}},  	.tx_collision_t2r_st		= R_TX_COLLISION_T2R_ST,  	.tx_collision_t2r_st_mask	= B_TX_COLLISION_T2R_ST_M,  }; @@ -1853,10 +1861,16 @@ static void rtw8852c_rfk_channel(struct rtw89_dev *rtwdev,  	enum rtw89_phy_idx phy_idx = rtwvif_link->phy_idx;  	rtw8852c_mcc_get_ch_info(rtwdev, phy_idx); +	rtw89_btc_ntfy_conn_rfk(rtwdev, true); +  	rtw8852c_rx_dck(rtwdev, phy_idx, false);  	rtw8852c_iqk(rtwdev, phy_idx, chanctx_idx); +	rtw89_btc_ntfy_preserve_bt_time(rtwdev, 30);  	rtw8852c_tssi(rtwdev, phy_idx, chanctx_idx); +	rtw89_btc_ntfy_preserve_bt_time(rtwdev, 30);  	rtw8852c_dpk(rtwdev, phy_idx, chanctx_idx); + +	rtw89_btc_ntfy_conn_rfk(rtwdev, false);  	rtw89_fw_h2c_rf_ntfy_mcc(rtwdev);  } @@ -2071,6 +2085,31 @@ static void rtw8852c_set_txpwr_diff(struct rtw89_dev *rtwdev,  	rtw8852c_set_txpwr_ref(rtwdev, phy_idx, pwr_ofst);  } +static void rtw8852c_set_txpwr_sar_diff(struct rtw89_dev *rtwdev, +					const struct rtw89_chan *chan, +					enum rtw89_phy_idx phy_idx) +{ +	struct rtw89_sar_parm sar_parm = { +		.center_freq = chan->freq, +		.force_path = true, +	}; +	s16 sar_rf; +	s8 sar_mac; + +	if (phy_idx != RTW89_PHY_0) +		return; + +	sar_parm.path = RF_PATH_A; +	sar_mac = rtw89_query_sar(rtwdev, &sar_parm); +	sar_rf = rtw89_phy_txpwr_mac_to_rf(rtwdev, sar_mac); +	rtw89_phy_write32_mask(rtwdev, R_TXPWRB, B_TXPWRB_MAX, sar_rf); + +	sar_parm.path = RF_PATH_B; +	sar_mac = rtw89_query_sar(rtwdev, &sar_parm); +	sar_rf = rtw89_phy_txpwr_mac_to_rf(rtwdev, sar_mac); +	rtw89_phy_write32_mask(rtwdev, R_P1_TXPWRB, B_TXPWRB_MAX, sar_rf); +} +  static void rtw8852c_set_txpwr(struct rtw89_dev *rtwdev,  			       const struct rtw89_chan *chan,  			       enum rtw89_phy_idx phy_idx) @@ -2081,6 +2120,7 @@ static void rtw8852c_set_txpwr(struct rtw89_dev *rtwdev,  	rtw89_phy_set_txpwr_limit(rtwdev, chan, phy_idx);  	rtw89_phy_set_txpwr_limit_ru(rtwdev, chan, phy_idx);  	rtw8852c_set_txpwr_diff(rtwdev, chan, phy_idx); +	rtw8852c_set_txpwr_sar_diff(rtwdev, chan, phy_idx);  }  static void rtw8852c_set_txpwr_ctrl(struct rtw89_dev *rtwdev, @@ -2873,6 +2913,7 @@ static int rtw8852c_mac_disable_bb_rf(struct rtw89_dev *rtwdev)  static const struct rtw89_chanctx_listener rtw8852c_chanctx_listener = {  	.callbacks[RTW89_CHANCTX_CALLBACK_RFK] = rtw8852c_rfk_chanctx_cb, +	.callbacks[RTW89_CHANCTX_CALLBACK_TAS] = rtw89_tas_chanctx_cb,  };  #ifdef CONFIG_PM @@ -2913,6 +2954,7 @@ static const struct rtw89_chip_ops rtw8852c_chip_ops = {  	.set_txpwr_ctrl		= rtw8852c_set_txpwr_ctrl,  	.init_txpwr_unit	= rtw8852c_init_txpwr_unit,  	.get_thermal		= rtw8852c_get_thermal, +	.chan_to_rf18_val	= NULL,  	.ctrl_btg_bt_rx		= rtw8852c_ctrl_btg_bt_rx,  	.query_ppdu		= rtw8852c_query_ppdu,  	.convert_rpl_to_rssi	= NULL, @@ -2934,6 +2976,8 @@ static const struct rtw89_chip_ops rtw8852c_chip_ops = {  	.h2c_default_cmac_tbl	= rtw89_fw_h2c_default_cmac_tbl,  	.h2c_assoc_cmac_tbl	= rtw89_fw_h2c_assoc_cmac_tbl,  	.h2c_ampdu_cmac_tbl	= NULL, +	.h2c_txtime_cmac_tbl	= rtw89_fw_h2c_txtime_cmac_tbl, +	.h2c_punctured_cmac_tbl	= NULL,  	.h2c_default_dmac_tbl	= NULL,  	.h2c_update_beacon	= rtw89_fw_h2c_update_beacon,  	.h2c_ba_cam		= rtw89_fw_h2c_ba_cam, @@ -2960,14 +3004,15 @@ const struct rtw89_chip_info rtw8852c_chip_info = {  	.try_ce_fw		= false,  	.bbmcu_nr		= 0,  	.needed_fw_elms		= 0, +	.fw_blacklist		= &rtw89_fw_blacklist_default,  	.fifo_size		= 458752,  	.small_fifo_size	= false,  	.dle_scc_rsvd_size	= 0,  	.max_amsdu_limit	= 8000,  	.dis_2g_40m_ul_ofdma	= false,  	.rsvd_ple_ofst		= 0x6f800, -	.hfc_param_ini		= rtw8852c_hfc_param_ini_pcie, -	.dle_mem		= rtw8852c_dle_mem_pcie, +	.hfc_param_ini		= {rtw8852c_hfc_param_ini_pcie, NULL, NULL}, +	.dle_mem		= {rtw8852c_dle_mem_pcie, NULL, NULL, NULL},  	.wde_qempty_acq_grpnum	= 16,  	.wde_qempty_mgq_grpsel	= 16,  	.rf_base_addr		= {0xe000, 0xf000}, @@ -3002,10 +3047,15 @@ const struct rtw89_chip_info rtw8852c_chip_info = {  				  BIT(NL80211_CHAN_WIDTH_160),  	.support_unii4		= true,  	.support_ant_gain	= true, +	.support_tas		= true, +	.support_sar_by_ant	= true,  	.ul_tb_waveform_ctrl	= false,  	.ul_tb_pwr_diff		= true, +	.rx_freq_frome_ie	= false,  	.hw_sec_hdr		= true,  	.hw_mgmt_tx_encrypt	= true, +	.hw_tkip_crypto		= true, +	.hw_mlo_bmc_crypto	= false,  	.rf_path_num		= 2,  	.tx_nss			= 2,  	.rx_nss			= 2, @@ -3027,7 +3077,6 @@ const struct rtw89_chip_info rtw8852c_chip_info = {  	.phycap_size		= 0x60,  	.para_ver		= 0x1,  	.wlcx_desired		= 0x06000000, -	.btcx_desired		= 0x7,  	.scbd			= 0x1,  	.mailbox		= 0x1, | 
