xref: /freebsd/sys/contrib/dev/rtw88/bf.h (revision 2774f206809b8fd3a4904fe945f029a414fbc642)
1*2774f206SBjoern A. Zeeb /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2*2774f206SBjoern A. Zeeb /* Copyright(c) 2018-2019  Realtek Corporation.
3*2774f206SBjoern A. Zeeb  */
4*2774f206SBjoern A. Zeeb 
5*2774f206SBjoern A. Zeeb #ifndef __RTW_BF_H_
6*2774f206SBjoern A. Zeeb #define __RTW_BF_H_
7*2774f206SBjoern A. Zeeb 
8*2774f206SBjoern A. Zeeb #define REG_TXBF_CTRL		0x042C
9*2774f206SBjoern A. Zeeb #define REG_RRSR		0x0440
10*2774f206SBjoern A. Zeeb #define REG_NDPA_OPT_CTRL	0x045F
11*2774f206SBjoern A. Zeeb 
12*2774f206SBjoern A. Zeeb #define REG_ASSOCIATED_BFMER0_INFO	0x06E4
13*2774f206SBjoern A. Zeeb #define REG_ASSOCIATED_BFMER1_INFO	0x06EC
14*2774f206SBjoern A. Zeeb #define REG_TX_CSI_RPT_PARAM_BW20	0x06F4
15*2774f206SBjoern A. Zeeb #define REG_SND_PTCL_CTRL		0x0718
16*2774f206SBjoern A. Zeeb #define BIT_DIS_CHK_VHTSIGB_CRC		BIT(6)
17*2774f206SBjoern A. Zeeb #define BIT_DIS_CHK_VHTSIGA_CRC		BIT(5)
18*2774f206SBjoern A. Zeeb #define BIT_MASK_BEAMFORM		(GENMASK(4, 0) | BIT(7))
19*2774f206SBjoern A. Zeeb #define REG_MU_TX_CTL			0x14C0
20*2774f206SBjoern A. Zeeb #define REG_MU_STA_GID_VLD		0x14C4
21*2774f206SBjoern A. Zeeb #define REG_MU_STA_USER_POS_INFO	0x14C8
22*2774f206SBjoern A. Zeeb #define REG_CSI_RRSR			0x1678
23*2774f206SBjoern A. Zeeb #define REG_WMAC_MU_BF_OPTION		0x167C
24*2774f206SBjoern A. Zeeb #define REG_WMAC_MU_BF_CTL		0x1680
25*2774f206SBjoern A. Zeeb 
26*2774f206SBjoern A. Zeeb #define BIT_WMAC_USE_NDPARATE			BIT(30)
27*2774f206SBjoern A. Zeeb #define BIT_WMAC_TXMU_ACKPOLICY_EN		BIT(6)
28*2774f206SBjoern A. Zeeb #define BIT_USE_NDPA_PARAMETER			BIT(30)
29*2774f206SBjoern A. Zeeb #define BIT_MU_P1_WAIT_STATE_EN			BIT(16)
30*2774f206SBjoern A. Zeeb #define BIT_EN_MU_MIMO				BIT(7)
31*2774f206SBjoern A. Zeeb 
32*2774f206SBjoern A. Zeeb #define R_MU_RL				0xf
33*2774f206SBjoern A. Zeeb #define BIT_SHIFT_R_MU_RL		12
34*2774f206SBjoern A. Zeeb #define BIT_SHIFT_WMAC_TXMU_ACKPOLICY	4
35*2774f206SBjoern A. Zeeb #define BIT_SHIFT_CSI_RATE		24
36*2774f206SBjoern A. Zeeb 
37*2774f206SBjoern A. Zeeb #define BIT_MASK_R_MU_RL (R_MU_RL << BIT_SHIFT_R_MU_RL)
38*2774f206SBjoern A. Zeeb #define BIT_MASK_R_MU_TABLE_VALID	0x3f
39*2774f206SBjoern A. Zeeb #define BIT_MASK_CSI_RATE_VAL		0x3F
40*2774f206SBjoern A. Zeeb #define BIT_MASK_CSI_RATE (BIT_MASK_CSI_RATE_VAL << BIT_SHIFT_CSI_RATE)
41*2774f206SBjoern A. Zeeb 
42*2774f206SBjoern A. Zeeb #define BIT_RXFLTMAP0_ACTIONNOACK	BIT(14)
43*2774f206SBjoern A. Zeeb #define BIT_RXFLTMAP1_BF		(BIT(4) | BIT(5))
44*2774f206SBjoern A. Zeeb #define BIT_RXFLTMAP1_BF_REPORT_POLL	BIT(4)
45*2774f206SBjoern A. Zeeb #define BIT_RXFLTMAP4_BF_REPORT_POLL	BIT(4)
46*2774f206SBjoern A. Zeeb 
47*2774f206SBjoern A. Zeeb #define RTW_NDP_RX_STANDBY_TIME	0x70
48*2774f206SBjoern A. Zeeb #define RTW_SND_CTRL_REMOVE	0x98
49*2774f206SBjoern A. Zeeb #define RTW_SND_CTRL_SOUNDING	0x9B
50*2774f206SBjoern A. Zeeb 
51*2774f206SBjoern A. Zeeb enum csi_seg_len {
52*2774f206SBjoern A. Zeeb 	HAL_CSI_SEG_4K = 0,
53*2774f206SBjoern A. Zeeb 	HAL_CSI_SEG_8K = 1,
54*2774f206SBjoern A. Zeeb 	HAL_CSI_SEG_11K = 2,
55*2774f206SBjoern A. Zeeb };
56*2774f206SBjoern A. Zeeb 
57*2774f206SBjoern A. Zeeb struct cfg_mumimo_para {
58*2774f206SBjoern A. Zeeb 	u8 sounding_sts[6];
59*2774f206SBjoern A. Zeeb 	u16 grouping_bitmap;
60*2774f206SBjoern A. Zeeb 	u8 mu_tx_en;
61*2774f206SBjoern A. Zeeb 	u32 given_gid_tab[2];
62*2774f206SBjoern A. Zeeb 	u32 given_user_pos[4];
63*2774f206SBjoern A. Zeeb };
64*2774f206SBjoern A. Zeeb 
65*2774f206SBjoern A. Zeeb struct mu_bfer_init_para {
66*2774f206SBjoern A. Zeeb 	u16 paid;
67*2774f206SBjoern A. Zeeb 	u16 csi_para;
68*2774f206SBjoern A. Zeeb 	u16 my_aid;
69*2774f206SBjoern A. Zeeb 	enum csi_seg_len csi_length_sel;
70*2774f206SBjoern A. Zeeb 	u8 bfer_address[ETH_ALEN];
71*2774f206SBjoern A. Zeeb };
72*2774f206SBjoern A. Zeeb 
73*2774f206SBjoern A. Zeeb void rtw_bf_disassoc(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
74*2774f206SBjoern A. Zeeb 		     struct ieee80211_bss_conf *bss_conf);
75*2774f206SBjoern A. Zeeb void rtw_bf_assoc(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
76*2774f206SBjoern A. Zeeb 		  struct ieee80211_bss_conf *bss_conf);
77*2774f206SBjoern A. Zeeb void rtw_bf_init_bfer_entry_mu(struct rtw_dev *rtwdev,
78*2774f206SBjoern A. Zeeb 			       struct mu_bfer_init_para *param);
79*2774f206SBjoern A. Zeeb void rtw_bf_cfg_sounding(struct rtw_dev *rtwdev, struct rtw_vif *vif,
80*2774f206SBjoern A. Zeeb 			 enum rtw_trx_desc_rate rate);
81*2774f206SBjoern A. Zeeb void rtw_bf_cfg_mu_bfee(struct rtw_dev *rtwdev, struct cfg_mumimo_para *param);
82*2774f206SBjoern A. Zeeb void rtw_bf_del_bfer_entry_mu(struct rtw_dev *rtwdev);
83*2774f206SBjoern A. Zeeb void rtw_bf_del_sounding(struct rtw_dev *rtwdev);
84*2774f206SBjoern A. Zeeb void rtw_bf_enable_bfee_su(struct rtw_dev *rtwdev, struct rtw_vif *vif,
85*2774f206SBjoern A. Zeeb 			   struct rtw_bfee *bfee);
86*2774f206SBjoern A. Zeeb void rtw_bf_enable_bfee_mu(struct rtw_dev *rtwdev, struct rtw_vif *vif,
87*2774f206SBjoern A. Zeeb 			   struct rtw_bfee *bfee);
88*2774f206SBjoern A. Zeeb void rtw_bf_remove_bfee_su(struct rtw_dev *rtwdev, struct rtw_bfee *bfee);
89*2774f206SBjoern A. Zeeb void rtw_bf_remove_bfee_mu(struct rtw_dev *rtwdev, struct rtw_bfee *bfee);
90*2774f206SBjoern A. Zeeb void rtw_bf_set_gid_table(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
91*2774f206SBjoern A. Zeeb 			  struct ieee80211_bss_conf *conf);
92*2774f206SBjoern A. Zeeb void rtw_bf_phy_init(struct rtw_dev *rtwdev);
93*2774f206SBjoern A. Zeeb void rtw_bf_cfg_csi_rate(struct rtw_dev *rtwdev, u8 rssi, u8 cur_rate,
94*2774f206SBjoern A. Zeeb 			 u8 fixrate_en, u8 *new_rate);
rtw_chip_config_bfee(struct rtw_dev * rtwdev,struct rtw_vif * vif,struct rtw_bfee * bfee,bool enable)95*2774f206SBjoern A. Zeeb static inline void rtw_chip_config_bfee(struct rtw_dev *rtwdev, struct rtw_vif *vif,
96*2774f206SBjoern A. Zeeb 					struct rtw_bfee *bfee, bool enable)
97*2774f206SBjoern A. Zeeb {
98*2774f206SBjoern A. Zeeb 	if (rtwdev->chip->ops->config_bfee)
99*2774f206SBjoern A. Zeeb 		rtwdev->chip->ops->config_bfee(rtwdev, vif, bfee, enable);
100*2774f206SBjoern A. Zeeb }
101*2774f206SBjoern A. Zeeb 
rtw_chip_set_gid_table(struct rtw_dev * rtwdev,struct ieee80211_vif * vif,struct ieee80211_bss_conf * conf)102*2774f206SBjoern A. Zeeb static inline void rtw_chip_set_gid_table(struct rtw_dev *rtwdev,
103*2774f206SBjoern A. Zeeb 					  struct ieee80211_vif *vif,
104*2774f206SBjoern A. Zeeb 					  struct ieee80211_bss_conf *conf)
105*2774f206SBjoern A. Zeeb {
106*2774f206SBjoern A. Zeeb 	if (rtwdev->chip->ops->set_gid_table)
107*2774f206SBjoern A. Zeeb 		rtwdev->chip->ops->set_gid_table(rtwdev, vif, conf);
108*2774f206SBjoern A. Zeeb }
109*2774f206SBjoern A. Zeeb 
rtw_chip_cfg_csi_rate(struct rtw_dev * rtwdev,u8 rssi,u8 cur_rate,u8 fixrate_en,u8 * new_rate)110*2774f206SBjoern A. Zeeb static inline void rtw_chip_cfg_csi_rate(struct rtw_dev *rtwdev, u8 rssi, u8 cur_rate,
111*2774f206SBjoern A. Zeeb 					 u8 fixrate_en, u8 *new_rate)
112*2774f206SBjoern A. Zeeb {
113*2774f206SBjoern A. Zeeb 	if (rtwdev->chip->ops->cfg_csi_rate)
114*2774f206SBjoern A. Zeeb 		rtwdev->chip->ops->cfg_csi_rate(rtwdev, rssi, cur_rate,
115*2774f206SBjoern A. Zeeb 						fixrate_en, new_rate);
116*2774f206SBjoern A. Zeeb }
117*2774f206SBjoern A. Zeeb #endif
118