1
2
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 REG_MU_TX_CTL 0x14C0
17#define REG_MU_STA_GID_VLD 0x14C4
18#define REG_MU_STA_USER_POS_INFO 0x14C8
19#define REG_CSI_RRSR 0x1678
20#define REG_WMAC_MU_BF_OPTION 0x167C
21#define REG_WMAC_MU_BF_CTL 0x1680
22
23#define BIT_WMAC_USE_NDPARATE BIT(30)
24#define BIT_WMAC_TXMU_ACKPOLICY_EN BIT(6)
25#define BIT_USE_NDPA_PARAMETER BIT(30)
26#define BIT_MU_P1_WAIT_STATE_EN BIT(16)
27#define BIT_EN_MU_MIMO BIT(7)
28
29#define R_MU_RL 0xf
30#define BIT_SHIFT_R_MU_RL 12
31#define BIT_SHIFT_WMAC_TXMU_ACKPOLICY 4
32#define BIT_SHIFT_CSI_RATE 24
33
34#define BIT_MASK_R_MU_RL (R_MU_RL << BIT_SHIFT_R_MU_RL)
35#define BIT_MASK_R_MU_TABLE_VALID 0x3f
36#define BIT_MASK_CSI_RATE_VAL 0x3F
37#define BIT_MASK_CSI_RATE (BIT_MASK_CSI_RATE_VAL << BIT_SHIFT_CSI_RATE)
38
39#define BIT_RXFLTMAP0_ACTIONNOACK BIT(14)
40#define BIT_RXFLTMAP1_BF (BIT(4) | BIT(5))
41#define BIT_RXFLTMAP1_BF_REPORT_POLL BIT(4)
42#define BIT_RXFLTMAP4_BF_REPORT_POLL BIT(4)
43
44#define RTW_NDP_RX_STANDBY_TIME 0x70
45#define RTW_SND_CTRL_REMOVE 0xD8
46#define RTW_SND_CTRL_SOUNDING 0xDB
47
48enum csi_seg_len {
49 HAL_CSI_SEG_4K = 0,
50 HAL_CSI_SEG_8K = 1,
51 HAL_CSI_SEG_11K = 2,
52};
53
54struct cfg_mumimo_para {
55 u8 sounding_sts[6];
56 u16 grouping_bitmap;
57 u8 mu_tx_en;
58 u32 given_gid_tab[2];
59 u32 given_user_pos[4];
60};
61
62struct mu_bfer_init_para {
63 u16 paid;
64 u16 csi_para;
65 u16 my_aid;
66 enum csi_seg_len csi_length_sel;
67 u8 bfer_address[ETH_ALEN];
68};
69
70void rtw_bf_disassoc(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
71 struct ieee80211_bss_conf *bss_conf);
72void rtw_bf_assoc(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
73 struct ieee80211_bss_conf *bss_conf);
74void rtw_bf_init_bfer_entry_mu(struct rtw_dev *rtwdev,
75 struct mu_bfer_init_para *param);
76void rtw_bf_cfg_sounding(struct rtw_dev *rtwdev, struct rtw_vif *vif,
77 enum rtw_trx_desc_rate rate);
78void rtw_bf_cfg_mu_bfee(struct rtw_dev *rtwdev, struct cfg_mumimo_para *param);
79void rtw_bf_del_bfer_entry_mu(struct rtw_dev *rtwdev);
80void rtw_bf_del_sounding(struct rtw_dev *rtwdev);
81void rtw_bf_enable_bfee_su(struct rtw_dev *rtwdev, struct rtw_vif *vif,
82 struct rtw_bfee *bfee);
83void rtw_bf_enable_bfee_mu(struct rtw_dev *rtwdev, struct rtw_vif *vif,
84 struct rtw_bfee *bfee);
85void rtw_bf_remove_bfee_su(struct rtw_dev *rtwdev, struct rtw_bfee *bfee);
86void rtw_bf_remove_bfee_mu(struct rtw_dev *rtwdev, struct rtw_bfee *bfee);
87void rtw_bf_set_gid_table(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
88 struct ieee80211_bss_conf *conf);
89void rtw_bf_phy_init(struct rtw_dev *rtwdev);
90void rtw_bf_cfg_csi_rate(struct rtw_dev *rtwdev, u8 rssi, u8 cur_rate,
91 u8 fixrate_en, u8 *new_rate);
92static inline void rtw_chip_config_bfee(struct rtw_dev *rtwdev, struct rtw_vif *vif,
93 struct rtw_bfee *bfee, bool enable)
94{
95 if (rtwdev->chip->ops->config_bfee)
96 rtwdev->chip->ops->config_bfee(rtwdev, vif, bfee, enable);
97}
98
99static inline void rtw_chip_set_gid_table(struct rtw_dev *rtwdev,
100 struct ieee80211_vif *vif,
101 struct ieee80211_bss_conf *conf)
102{
103 if (rtwdev->chip->ops->set_gid_table)
104 rtwdev->chip->ops->set_gid_table(rtwdev, vif, conf);
105}
106
107static inline void rtw_chip_cfg_csi_rate(struct rtw_dev *rtwdev, u8 rssi, u8 cur_rate,
108 u8 fixrate_en, u8 *new_rate)
109{
110 if (rtwdev->chip->ops->cfg_csi_rate)
111 rtwdev->chip->ops->cfg_csi_rate(rtwdev, rssi, cur_rate,
112 fixrate_en, new_rate);
113}
114#endif
115