diff options
Diffstat (limited to 'sys/contrib/dev/rtw89/rtw8851b.c')
| -rw-r--r-- | sys/contrib/dev/rtw89/rtw8851b.c | 199 | 
1 files changed, 173 insertions, 26 deletions
| diff --git a/sys/contrib/dev/rtw89/rtw8851b.c b/sys/contrib/dev/rtw89/rtw8851b.c index 6f7a068b30a5..b2d75de83602 100644 --- a/sys/contrib/dev/rtw89/rtw8851b.c +++ b/sys/contrib/dev/rtw89/rtw8851b.c @@ -51,6 +51,48 @@ static const struct rtw89_hfc_param_ini rtw8851b_hfc_param_ini_pcie[] = {  	[RTW89_QTA_INVALID] = {NULL},  }; +static const struct rtw89_hfc_ch_cfg rtw8851b_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 rtw8851b_hfc_pubcfg_usb = { +	152, /* Group 0 */ +	0, /* Group 1 */ +	152, /* Public Max */ +	0 /* WP threshold */ +}; + +static const struct rtw89_hfc_prec_cfg rtw8851b_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 rtw8851b_hfc_param_ini_usb[] = { +	[RTW89_QTA_SCC] = {rtw8851b_hfc_chcfg_usb, &rtw8851b_hfc_pubcfg_usb, +			   &rtw8851b_hfc_preccfg_usb, RTW89_HCIFC_STF}, +	[RTW89_QTA_DLFW] = {NULL, NULL, +			   &rtw8851b_hfc_preccfg_usb, RTW89_HCIFC_STF}, +	[RTW89_QTA_INVALID] = {NULL}, +}; +  static const struct rtw89_dle_mem rtw8851b_dle_mem_pcie[] = {  	[RTW89_QTA_SCC] = {RTW89_QTA_SCC, &rtw89_mac_size.wde_size6,  			   &rtw89_mac_size.ple_size6, &rtw89_mac_size.wde_qt6, @@ -68,6 +110,32 @@ static const struct rtw89_dle_mem rtw8851b_dle_mem_pcie[] = {  			       NULL},  }; +static const struct rtw89_dle_mem rtw8851b_dle_mem_usb2[] = { +	[RTW89_QTA_SCC] = {RTW89_QTA_SCC, &rtw89_mac_size.wde_size25, +			   &rtw89_mac_size.ple_size32, &rtw89_mac_size.wde_qt25, +			   &rtw89_mac_size.wde_qt25, &rtw89_mac_size.ple_qt72, +			   &rtw89_mac_size.ple_qt73}, +	[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 struct rtw89_dle_mem rtw8851b_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 struct rtw89_reg3_def rtw8851b_btc_preagc_en_defs[] = {  	{0x46D0, GENMASK(1, 0), 0x3},  	{0x4AD4, GENMASK(31, 0), 0xf}, @@ -224,10 +292,17 @@ static const struct rtw89_edcca_regs rtw8851b_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,  }; @@ -310,7 +385,8 @@ static int rtw8851b_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);  	ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_OFF_WEI,  				      XTAL_SI_OFF_WEI); @@ -355,8 +431,9 @@ static int rtw8851b_pwr_on_func(struct rtw89_dev *rtwdev)  	rtw89_write32_clr(rtwdev, R_AX_SYS_ISO_CTRL, B_AX_PWC_EV2EF_B14);  	rtw89_write32_clr(rtwdev, R_AX_PMC_DBG_CTRL2, B_AX_SYSON_DIS_PMCR_AX_WRMSK); -	rtw89_write32_set(rtwdev, R_AX_GPIO0_16_EECS_EESK_LED1_PULL_LOW_EN, -			  B_AX_GPIO10_PULL_LOW_EN | B_AX_GPIO16_PULL_LOW_EN_V1); +	if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE) +		rtw89_write32_set(rtwdev, R_AX_GPIO0_16_EECS_EESK_LED1_PULL_LOW_EN, +				  B_AX_GPIO10_PULL_LOW_EN | B_AX_GPIO16_PULL_LOW_EN_V1);  	if (rtwdev->hal.cv == CHIP_CAV) {  		ret = rtw89_read_efuse_ver(rtwdev, &val8); @@ -440,7 +517,10 @@ static int rtw8851b_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);  	if (rtwdev->hal.cv == CHIP_CAV) {  		rtw8851b_patch_swr_pfm2pwm(rtwdev); @@ -449,19 +529,18 @@ static int rtw8851b_pwr_off_func(struct rtw89_dev *rtwdev)  		rtw89_write32_set(rtwdev, R_AX_SPSANA_ON_CTRL1, B_AX_FPWMDELAY);  	} -	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;  } -static void rtw8851b_efuse_parsing(struct rtw89_efuse *efuse, -				   struct rtw8851b_efuse *map) -{ -	ether_addr_copy(efuse->addr, map->e.mac_addr); -	efuse->rfe_type = map->rfe_type; -	efuse->xtal_cap = map->xtal_k; -} -  static void rtw8851b_efuse_parsing_tssi(struct rtw89_dev *rtwdev,  					struct rtw8851b_efuse *map)  { @@ -542,12 +621,18 @@ static int rtw8851b_read_efuse(struct rtw89_dev *rtwdev, u8 *log_map,  	switch (rtwdev->hci.type) {  	case RTW89_HCI_TYPE_PCIE: -		rtw8851b_efuse_parsing(efuse, map); +		ether_addr_copy(efuse->addr, map->e.mac_addr); +		break; +	case RTW89_HCI_TYPE_USB: +		ether_addr_copy(efuse->addr, map->u.mac_addr);  		break;  	default:  		return -EOPNOTSUPP;  	} +	efuse->rfe_type = map->rfe_type; +	efuse->xtal_cap = map->xtal_k; +  	rtw89_info(rtwdev, "chip rfe_type is %d\n", efuse->rfe_type);  	return 0; @@ -705,12 +790,22 @@ static void rtw8851b_phycap_parsing_gain_comp(struct rtw89_dev *rtwdev, u8 *phyc  	gain->comp_valid = valid;  } +static void rtw8851b_phycap_parsing_adc_td(struct rtw89_dev *rtwdev, u8 *phycap_map) +{ +	u32 phycap_addr = rtwdev->chip->phycap_addr; +	struct rtw89_efuse *efuse = &rtwdev->efuse; +	const u32 addr_adc_td = 0x5AF; + +	efuse->adc_td = phycap_map[addr_adc_td - phycap_addr] & GENMASK(4, 0); +} +  static int rtw8851b_read_phycap(struct rtw89_dev *rtwdev, u8 *phycap_map)  {  	rtw8851b_phycap_parsing_tssi(rtwdev, phycap_map);  	rtw8851b_phycap_parsing_thermal_trim(rtwdev, phycap_map);  	rtw8851b_phycap_parsing_pa_bias_trim(rtwdev, phycap_map);  	rtw8851b_phycap_parsing_gain_comp(rtwdev, phycap_map); +	rtw8851b_phycap_parsing_adc_td(rtwdev, phycap_map);  	return 0;  } @@ -1076,39 +1171,72 @@ static void rtw8851b_ctrl_ch(struct rtw89_dev *rtwdev,  static void rtw8851b_bw_setting(struct rtw89_dev *rtwdev, u8 bw)  { -	rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0, B_P0_CFCH_CTL, 0x8); -	rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0, B_P0_CFCH_EN, 0x2); -	rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0, B_P0_CFCH_BW0, 0x2); -	rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1, B_P0_CFCH_BW1, 0x4); +	struct rtw89_efuse *efuse = &rtwdev->efuse; +	u8 adc_bw_sel; + +	switch (efuse->adc_td) { +	default: +	case 0x19: +		adc_bw_sel = 0x4; +		break; +	case 0x11: +		adc_bw_sel = 0x5; +		break; +	case 0x9: +		adc_bw_sel = 0x3; +		break; +	} + +	rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1, B_P0_CFCH_BW1, adc_bw_sel);  	rtw89_phy_write32_mask(rtwdev, R_DRCK, B_DRCK_MUL, 0xf);  	rtw89_phy_write32_mask(rtwdev, R_ADCMOD, B_ADCMOD_LP, 0xa); -	rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_RXCK_ADJ, 0x92); +	rtw89_phy_write32_mask(rtwdev, R_DCIM, B_DCIM_RC, 0x3);  	switch (bw) {  	case RTW89_CHANNEL_WIDTH_5: +		rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0, B_P0_CFCH_CTL, 0x8); +		rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0, B_P0_CFCH_EN, 0x2); +		rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0, B_P0_CFCH_BW0, 0x2);  		rtw89_phy_write32_mask(rtwdev, R_DCIM, B_DCIM_FR, 0x1);  		rtw89_phy_write32_mask(rtwdev, R_WDADC, B_WDADC_SEL, 0x0);  		rtw89_phy_write32_mask(rtwdev, R_ADDCK0D, B_ADDCK_DS, 0x1); +		rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_RXCK_ADJ, 0x92);  		break;  	case RTW89_CHANNEL_WIDTH_10: +		rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0, B_P0_CFCH_CTL, 0x8); +		rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0, B_P0_CFCH_EN, 0x2); +		rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0, B_P0_CFCH_BW0, 0x2);  		rtw89_phy_write32_mask(rtwdev, R_DCIM, B_DCIM_FR, 0x1);  		rtw89_phy_write32_mask(rtwdev, R_WDADC, B_WDADC_SEL, 0x1);  		rtw89_phy_write32_mask(rtwdev, R_ADDCK0D, B_ADDCK_DS, 0x0); +		rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_RXCK_ADJ, 0x92);  		break;  	case RTW89_CHANNEL_WIDTH_20: +		rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0, B_P0_CFCH_CTL, 0x8); +		rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0, B_P0_CFCH_EN, 0x2); +		rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0, B_P0_CFCH_BW0, 0x2);  		rtw89_phy_write32_mask(rtwdev, R_DCIM, B_DCIM_FR, 0x2);  		rtw89_phy_write32_mask(rtwdev, R_WDADC, B_WDADC_SEL, 0x2);  		rtw89_phy_write32_mask(rtwdev, R_ADDCK0D, B_ADDCK_DS, 0x0); +		rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_RXCK_ADJ, 0x92);  		break;  	case RTW89_CHANNEL_WIDTH_40: +		rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0, B_P0_CFCH_CTL, 0x8); +		rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0, B_P0_CFCH_EN, 0x2); +		rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0, B_P0_CFCH_BW0, 0x2);  		rtw89_phy_write32_mask(rtwdev, R_DCIM, B_DCIM_FR, 0x2);  		rtw89_phy_write32_mask(rtwdev, R_WDADC, B_WDADC_SEL, 0x2);  		rtw89_phy_write32_mask(rtwdev, R_ADDCK0D, B_ADDCK_DS, 0x0); +		rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_RXCK_ADJ, 0x92);  		break;  	case RTW89_CHANNEL_WIDTH_80: +		rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0, B_P0_CFCH_CTL, 0x8); +		rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0, B_P0_CFCH_EN, 0x2); +		rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0, B_P0_CFCH_BW0, 0x2);  		rtw89_phy_write32_mask(rtwdev, R_DCIM, B_DCIM_FR, 0x0);  		rtw89_phy_write32_mask(rtwdev, R_WDADC, B_WDADC_SEL, 0x2);  		rtw89_phy_write32_mask(rtwdev, R_ADDCK0D, B_ADDCK_DS, 0x0); +		rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_RXCK_ADJ, 0x92);  		break;  	default:  		rtw89_warn(rtwdev, "Fail to set ADC\n"); @@ -1596,10 +1724,16 @@ static void rtw8851b_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; +	rtw89_btc_ntfy_conn_rfk(rtwdev, true); +  	rtw8851b_rx_dck(rtwdev, phy_idx, chanctx_idx);  	rtw8851b_iqk(rtwdev, phy_idx, chanctx_idx); +	rtw89_btc_ntfy_preserve_bt_time(rtwdev, 30);  	rtw8851b_tssi(rtwdev, phy_idx, true, chanctx_idx); +	rtw89_btc_ntfy_preserve_bt_time(rtwdev, 30);  	rtw8851b_dpk(rtwdev, phy_idx, chanctx_idx); + +	rtw89_btc_ntfy_conn_rfk(rtwdev, false);  }  static void rtw8851b_rfk_band_changed(struct rtw89_dev *rtwdev, @@ -2395,6 +2529,7 @@ static const struct rtw89_chip_ops rtw8851b_chip_ops = {  	.set_txpwr_ctrl		= rtw8851b_set_txpwr_ctrl,  	.init_txpwr_unit	= rtw8851b_init_txpwr_unit,  	.get_thermal		= rtw8851b_get_thermal, +	.chan_to_rf18_val	= NULL,  	.ctrl_btg_bt_rx		= rtw8851b_ctrl_btg_bt_rx,  	.query_ppdu		= rtw8851b_query_ppdu,  	.convert_rpl_to_rssi	= NULL, @@ -2416,6 +2551,8 @@ static const struct rtw89_chip_ops rtw8851b_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, @@ -2451,14 +2588,20 @@ const struct rtw89_chip_info rtw8851b_chip_info = {  	.try_ce_fw		= true,  	.bbmcu_nr		= 0,  	.needed_fw_elms		= 0, +	.fw_blacklist		= NULL,  	.fifo_size		= 196608,  	.small_fifo_size	= true,  	.dle_scc_rsvd_size	= 98304,  	.max_amsdu_limit	= 3500,  	.dis_2g_40m_ul_ofdma	= true,  	.rsvd_ple_ofst		= 0x2f800, -	.hfc_param_ini		= rtw8851b_hfc_param_ini_pcie, -	.dle_mem		= rtw8851b_dle_mem_pcie, +	.hfc_param_ini		= {rtw8851b_hfc_param_ini_pcie, +				   rtw8851b_hfc_param_ini_usb, +				   NULL}, +	.dle_mem		= {rtw8851b_dle_mem_pcie, +				   rtw8851b_dle_mem_usb2, +				   rtw8851b_dle_mem_usb3, +				   NULL},  	.wde_qempty_acq_grpnum	= 4,  	.wde_qempty_mgq_grpsel	= 4,  	.rf_base_addr		= {0xe000}, @@ -2489,10 +2632,15 @@ const struct rtw89_chip_info rtw8851b_chip_info = {  				  BIT(NL80211_CHAN_WIDTH_80),  	.support_unii4		= true,  	.support_ant_gain	= false, +	.support_tas		= false, +	.support_sar_by_ant	= false,  	.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		= 1,  	.tx_nss			= 1,  	.rx_nss			= 1, @@ -2514,7 +2662,6 @@ const struct rtw89_chip_info rtw8851b_chip_info = {  	.phycap_size		= 128,  	.para_ver		= 0,  	.wlcx_desired		= 0x06000000, -	.btcx_desired		= 0x7,  	.scbd			= 0x1,  	.mailbox		= 0x1, | 
