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