diff options
Diffstat (limited to 'sys/contrib/dev/rtw89/rtw8852b.c')
| -rw-r--r-- | sys/contrib/dev/rtw89/rtw8852b.c | 128 | 
1 files changed, 116 insertions, 12 deletions
| diff --git a/sys/contrib/dev/rtw89/rtw8852b.c b/sys/contrib/dev/rtw89/rtw8852b.c index dfb2bf61b0b8..7ede07f7b1eb 100644 --- a/sys/contrib/dev/rtw89/rtw8852b.c +++ b/sys/contrib/dev/rtw89/rtw8852b.c @@ -49,6 +49,48 @@ static const struct rtw89_hfc_param_ini rtw8852b_hfc_param_ini_pcie[] = {  	[RTW89_QTA_INVALID] = {NULL},  }; +static const struct rtw89_hfc_ch_cfg rtw8852b_hfc_chcfg_usb[] = { +	{18, 152, grp_0}, /* ACH 0 */ +	{18, 152, grp_0}, /* ACH 1 */ +	{18, 152, grp_0}, /* ACH 2 */ +	{18, 152, grp_0}, /* ACH 3 */ +	{0, 0, grp_0}, /* ACH 4 */ +	{0, 0, grp_0}, /* ACH 5 */ +	{0, 0, grp_0}, /* ACH 6 */ +	{0, 0, grp_0}, /* ACH 7 */ +	{18, 152, grp_0}, /* B0MGQ */ +	{18, 152, grp_0}, /* B0HIQ */ +	{0, 0, grp_0}, /* B1MGQ */ +	{0, 0, grp_0}, /* B1HIQ */ +	{0, 0, 0} /* FWCMDQ */ +}; + +static const struct rtw89_hfc_pub_cfg rtw8852b_hfc_pubcfg_usb = { +	152, /* Group 0 */ +	0, /* Group 1 */ +	152, /* Public Max */ +	0 /* WP threshold */ +}; + +static const struct rtw89_hfc_prec_cfg rtw8852b_hfc_preccfg_usb = { +	9, /* CH 0-11 pre-cost */ +	32, /* H2C pre-cost */ +	64, /* WP CH 0-7 pre-cost */ +	24, /* WP CH 8-11 pre-cost */ +	1, /* CH 0-11 full condition */ +	1, /* H2C full condition */ +	1, /* WP CH 0-7 full condition */ +	1, /* WP CH 8-11 full condition */ +}; + +static const struct rtw89_hfc_param_ini rtw8852b_hfc_param_ini_usb[] = { +	[RTW89_QTA_SCC] = {rtw8852b_hfc_chcfg_usb, &rtw8852b_hfc_pubcfg_usb, +			   &rtw8852b_hfc_preccfg_usb, RTW89_HCIFC_STF}, +	[RTW89_QTA_DLFW] = {NULL, NULL, +			    &rtw8852b_hfc_preccfg_usb, RTW89_HCIFC_STF}, +	[RTW89_QTA_INVALID] = {NULL}, +}; +  static const struct rtw89_dle_mem rtw8852b_dle_mem_pcie[] = {  	[RTW89_QTA_SCC] = {RTW89_QTA_SCC, &rtw89_mac_size.wde_size7,  			   &rtw89_mac_size.ple_size6, &rtw89_mac_size.wde_qt7, @@ -66,6 +108,19 @@ static const struct rtw89_dle_mem rtw8852b_dle_mem_pcie[] = {  			       NULL},  }; +static const struct rtw89_dle_mem rtw8852b_dle_mem_usb3[] = { +	[RTW89_QTA_SCC] = {RTW89_QTA_SCC, &rtw89_mac_size.wde_size25, +			   &rtw89_mac_size.ple_size33, &rtw89_mac_size.wde_qt25, +			   &rtw89_mac_size.wde_qt25, &rtw89_mac_size.ple_qt74, +			   &rtw89_mac_size.ple_qt75}, +	[RTW89_QTA_DLFW] = {RTW89_QTA_DLFW, &rtw89_mac_size.wde_size9, +			    &rtw89_mac_size.ple_size8, &rtw89_mac_size.wde_qt4, +			    &rtw89_mac_size.wde_qt4, &rtw89_mac_size.ple_qt13, +			    &rtw89_mac_size.ple_qt13}, +	[RTW89_QTA_INVALID] = {RTW89_QTA_INVALID, NULL, NULL, NULL, NULL, NULL, +			       NULL}, +}; +  static const u32 rtw8852b_h2c_regs[RTW89_H2CREG_MAX] = {  	R_AX_H2CREG_DATA0, R_AX_H2CREG_DATA1,  R_AX_H2CREG_DATA2,  	R_AX_H2CREG_DATA3 @@ -189,10 +244,17 @@ static const struct rtw89_edcca_regs rtw8852b_edcca_regs = {  	.edcca_p_mask			= B_EDCCA_LVL_MSK1,  	.ppdu_level			= R_SEG0R_EDCCA_LVL_V1,  	.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,  }; @@ -292,7 +354,8 @@ static int rtw8852b_pwr_on_func(struct rtw89_dev *rtwdev)  	rtw89_write8_clr(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);  	rtw89_write8_set(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN); -	rtw89_write32_clr(rtwdev, R_AX_SYS_SDIO_CTRL, B_AX_PCIE_CALIB_EN_V1); +	if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE) +		rtw89_write32_clr(rtwdev, R_AX_SYS_SDIO_CTRL, B_AX_PCIE_CALIB_EN_V1);  	rtw89_write32_set(rtwdev, R_AX_SYS_ADIE_PAD_PWR_CTRL, B_AX_SYM_PADPDN_WL_PTA_1P3); @@ -354,7 +417,7 @@ static int rtw8852b_pwr_on_func(struct rtw89_dev *rtwdev)  	rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_ON_CTRL0, B_AX_VOL_L1_MASK, 0x9);  	rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_ON_CTRL0, B_AX_VREFPFM_L_MASK, 0xA); -	if (rtwdev->hal.cv == CHIP_CBV) { +	if (rtwdev->hal.cv == CHIP_CBV && rtwdev->hci.type == RTW89_HCI_TYPE_PCIE) {  		rtw89_write32_set(rtwdev, R_AX_PMC_DBG_CTRL2, B_AX_SYSON_DIS_PMCR_AX_WRMSK);  		rtw89_write16_mask(rtwdev, R_AX_HCI_LDO_CTRL, B_AX_R_AX_VADJ_MASK, 0xA);  		rtw89_write32_clr(rtwdev, R_AX_PMC_DBG_CTRL2, B_AX_SYSON_DIS_PMCR_AX_WRMSK); @@ -436,10 +499,22 @@ static int rtw8852b_pwr_off_func(struct rtw89_dev *rtwdev)  	if (ret)  		return ret; -	rtw89_write32(rtwdev, R_AX_WLLPS_CTRL, SW_LPS_OPTION); +	if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE) +		rtw89_write32(rtwdev, R_AX_WLLPS_CTRL, SW_LPS_OPTION); +	else if (rtwdev->hci.type == RTW89_HCI_TYPE_USB) +		rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_SOP_EDSWR); +  	rtw89_write32_set(rtwdev, R_AX_SYS_SWR_CTRL1, B_AX_SYM_CTRL_SPS_PWMFREQ);  	rtw89_write32_mask(rtwdev, R_AX_SPS_DIG_ON_CTRL0, B_AX_REG_ZCDC_H_MASK, 0x3); -	rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS); + +	if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE) { +		rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS); +	} else if (rtwdev->hci.type == RTW89_HCI_TYPE_USB) { +		val32 = rtw89_read32(rtwdev, R_AX_SYS_PW_CTRL); +		val32 &= ~B_AX_AFSM_PCIE_SUS_EN; +		val32 |= B_AX_AFSM_WLSUS_EN; +		rtw89_write32(rtwdev, R_AX_SYS_PW_CTRL, val32); +	}  	return 0;  } @@ -553,8 +628,11 @@ static void rtw8852b_set_channel_help(struct rtw89_dev *rtwdev, bool enter,  static void rtw8852b_rfk_init(struct rtw89_dev *rtwdev)  { +	struct rtw89_rfk_mcc_info *rfk_mcc = &rtwdev->rfk_mcc; +  	rtwdev->is_tssi_mode[RF_PATH_A] = false;  	rtwdev->is_tssi_mode[RF_PATH_B] = false; +	memset(rfk_mcc, 0, sizeof(*rfk_mcc));  	rtw8852b_dpk_init(rtwdev);  	rtw8852b_rck(rtwdev); @@ -568,10 +646,18 @@ static void rtw8852b_rfk_channel(struct rtw89_dev *rtwdev,  	enum rtw89_chanctx_idx chanctx_idx = rtwvif_link->chanctx_idx;  	enum rtw89_phy_idx phy_idx = rtwvif_link->phy_idx; +	rtw8852b_mcc_get_ch_info(rtwdev, phy_idx); +	rtw89_btc_ntfy_conn_rfk(rtwdev, true); +  	rtw8852b_rx_dck(rtwdev, phy_idx, chanctx_idx);  	rtw8852b_iqk(rtwdev, phy_idx, chanctx_idx); +	rtw89_btc_ntfy_preserve_bt_time(rtwdev, 30);  	rtw8852b_tssi(rtwdev, phy_idx, true, chanctx_idx); +	rtw89_btc_ntfy_preserve_bt_time(rtwdev, 30);  	rtw8852b_dpk(rtwdev, phy_idx, chanctx_idx); + +	rtw89_btc_ntfy_conn_rfk(rtwdev, false); +	rtw89_fw_h2c_rf_ntfy_mcc(rtwdev);  }  static void rtw8852b_rfk_band_changed(struct rtw89_dev *rtwdev, @@ -742,6 +828,7 @@ static const struct rtw89_chip_ops rtw8852b_chip_ops = {  	.set_txpwr_ctrl		= rtw8852bx_set_txpwr_ctrl,  	.init_txpwr_unit	= rtw8852bx_init_txpwr_unit,  	.get_thermal		= rtw8852bx_get_thermal, +	.chan_to_rf18_val	= NULL,  	.ctrl_btg_bt_rx		= rtw8852bx_ctrl_btg_bt_rx,  	.query_ppdu		= rtw8852bx_query_ppdu,  	.convert_rpl_to_rssi	= rtw8852bx_convert_rpl_to_rssi, @@ -763,6 +850,8 @@ static const struct rtw89_chip_ops rtw8852b_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, @@ -778,6 +867,10 @@ static const struct rtw89_chip_ops rtw8852b_chip_ops = {  	.btc_set_policy		= rtw89_btc_set_policy_v1,  }; +static const struct rtw89_chanctx_listener rtw8852b_chanctx_listener = { +	.callbacks[RTW89_CHANCTX_CALLBACK_RFK] = rtw8852b_rfk_chanctx_cb, +}; +  #ifdef CONFIG_PM  static const struct wiphy_wowlan_support rtw_wowlan_stub_8852b = {  	.flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT, @@ -798,14 +891,20 @@ const struct rtw89_chip_info rtw8852b_chip_info = {  	.try_ce_fw		= true,  	.bbmcu_nr		= 0,  	.needed_fw_elms		= 0, +	.fw_blacklist		= &rtw89_fw_blacklist_default,  	.fifo_size		= 196608,  	.small_fifo_size	= true,  	.dle_scc_rsvd_size	= 98304,  	.max_amsdu_limit	= 5000,  	.dis_2g_40m_ul_ofdma	= true,  	.rsvd_ple_ofst		= 0x2f800, -	.hfc_param_ini		= rtw8852b_hfc_param_ini_pcie, -	.dle_mem		= rtw8852b_dle_mem_pcie, +	.hfc_param_ini		= {rtw8852b_hfc_param_ini_pcie, +				   rtw8852b_hfc_param_ini_usb, +				   NULL}, +	.dle_mem		= {rtw8852b_dle_mem_pcie, +				   rtw8852b_dle_mem_usb3, +				   rtw8852b_dle_mem_usb3, +				   NULL},  	.wde_qempty_acq_grpnum	= 4,  	.wde_qempty_mgq_grpsel	= 4,  	.rf_base_addr		= {0xe000, 0xf000}, @@ -820,6 +919,7 @@ const struct rtw89_chip_info rtw8852b_chip_info = {  	.nctl_post_table	= NULL,  	.dflt_parms		= &rtw89_8852b_dflt_parms,  	.rfe_parms_conf		= NULL, +	.chanctx_listener	= &rtw8852b_chanctx_listener,  	.txpwr_factor_bb	= 3,  	.txpwr_factor_rf	= 2,  	.txpwr_factor_mac	= 1, @@ -828,7 +928,7 @@ const struct rtw89_chip_info rtw8852b_chip_info = {  	.tssi_dbw_table		= NULL,  	.support_macid_num	= RTW89_MAX_MAC_ID_NUM,  	.support_link_num	= 0, -	.support_chanctx_num	= 0, +	.support_chanctx_num	= 2,  	.support_rnr		= false,  	.support_bands		= BIT(NL80211_BAND_2GHZ) |  				  BIT(NL80211_BAND_5GHZ), @@ -837,10 +937,15 @@ const struct rtw89_chip_info rtw8852b_chip_info = {  				  BIT(NL80211_CHAN_WIDTH_80),  	.support_unii4		= true,  	.support_ant_gain	= true, +	.support_tas		= false, +	.support_sar_by_ant	= true,  	.ul_tb_waveform_ctrl	= true,  	.ul_tb_pwr_diff		= false, +	.rx_freq_frome_ie	= true,  	.hw_sec_hdr		= false,  	.hw_mgmt_tx_encrypt	= false, +	.hw_tkip_crypto		= false, +	.hw_mlo_bmc_crypto	= false,  	.rf_path_num		= 2,  	.tx_nss			= 2,  	.rx_nss			= 2, @@ -862,7 +967,6 @@ const struct rtw89_chip_info rtw8852b_chip_info = {  	.phycap_size		= 128,  	.para_ver		= 0,  	.wlcx_desired		= 0x05050000, -	.btcx_desired		= 0x5,  	.scbd			= 0x1,  	.mailbox		= 0x1, | 
