xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8852be/phl/phl_sound.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /******************************************************************************
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Copyright(c) 2019 - 2020 Realtek Corporation.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * This program is free software; you can redistribute it and/or modify it
6*4882a593Smuzhiyun  * under the terms of version 2 of the GNU General Public License as
7*4882a593Smuzhiyun  * published by the Free Software Foundation.
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * This program is distributed in the hope that it will be useful, but WITHOUT
10*4882a593Smuzhiyun  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12*4882a593Smuzhiyun  * more details.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  *****************************************************************************/
15*4882a593Smuzhiyun #ifndef __PHL_SOUND_H__
16*4882a593Smuzhiyun #define __PHL_SOUND_H__
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #define MAX_SND_GRP_NUM 4
19*4882a593Smuzhiyun #define MAX_SND_HE_BFRP_NUM 2
20*4882a593Smuzhiyun #define MAX_SND_HE_BFRP_USER_NUM 4
21*4882a593Smuzhiyun #define MAX_SND_VHT_BFRP_NUM 3
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #define SND_PROC_DEFAULT_PERIOD 200 /* ms */
24*4882a593Smuzhiyun #define SND_PROC_DEFAULT_TIMEOUT 10 /* ms */
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun /* MAX_NUM_STA_SND_GRP :phl sounding design limit = 4, hw/fw support maximum 8 STA in a sounding frame exchange*/
27*4882a593Smuzhiyun #define MAX_NUM_STA_SND_GRP 4
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun enum snd_type {
30*4882a593Smuzhiyun 	PHL_SND_TYPE_INVALID,
31*4882a593Smuzhiyun 	PHL_SND_TYPE_VHT_HW,
32*4882a593Smuzhiyun 	PHL_SND_TYPE_VHT_SW,
33*4882a593Smuzhiyun 	PHL_SND_TYPE_HE_HW,
34*4882a593Smuzhiyun 	PHL_SND_TYPE_HE_SW
35*4882a593Smuzhiyun };
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun enum snd_fb_type {
38*4882a593Smuzhiyun 	PHL_SND_FB_TYPE_SU,
39*4882a593Smuzhiyun 	PHL_SND_FB_TYPE_MU,
40*4882a593Smuzhiyun 	PHL_SND_FB_TYPE_CQI
41*4882a593Smuzhiyun };
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun enum snd_status {
44*4882a593Smuzhiyun 	PHL_SND_STS_PENDING,
45*4882a593Smuzhiyun 	PHL_SND_STS_ON_PROC,
46*4882a593Smuzhiyun 	PHL_SND_STS_SUCCESS,
47*4882a593Smuzhiyun 	PHL_SND_STS_FAILURE
48*4882a593Smuzhiyun };
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun enum snd_grp_tier {
51*4882a593Smuzhiyun 	PHL_SND_GRP_TIER_0, /* TIER_0 Group will free sounding resource in state SND_PROC_TERMINATE or group removed*/
52*4882a593Smuzhiyun 	PHL_SND_GRP_TIER_1  /* TIER_1 Group will free sounding resource in next SND_PROC_IDLE*/
53*4882a593Smuzhiyun };
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun enum snd_test_flag {
56*4882a593Smuzhiyun 	PHL_SND_TEST_F_NONE = 0, /* default value */
57*4882a593Smuzhiyun 	PHL_SND_TEST_F_ONE_TIME = BIT(0), /* Test mode : only sounding one time */
58*4882a593Smuzhiyun 	PHL_SND_TEST_F_FIX_STA = BIT(1), /* forced SND STAs (skip grouping and check TP) */
59*4882a593Smuzhiyun 	PHL_SND_TEST_F_GRP_SND_PARA = BIT(2), /* Fixed SND STA's Feedback Type or BW from snd->fix_param */
60*4882a593Smuzhiyun 	PHL_SND_TEST_F_GRP_EN_BF_FIX = BIT(3), /* Enable grp->en_fix_mode in grouping function */
61*4882a593Smuzhiyun 	PHL_SND_TEST_F_PASS_STS_CHK = BIT(4) /* by pass sounding status check when post config */
62*4882a593Smuzhiyun };
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun struct npda_dialog_token {
65*4882a593Smuzhiyun 	u8 reserved:1;
66*4882a593Smuzhiyun 	u8 he:1;
67*4882a593Smuzhiyun 	u8 token:6;
68*4882a593Smuzhiyun };
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun struct vht_ndpa_sta_info {
71*4882a593Smuzhiyun 	u16 aid12:12;
72*4882a593Smuzhiyun #define VHT_NDPA_FB_TYPE_SU 0
73*4882a593Smuzhiyun #define VHT_NDPA_FB_TYPE_MU 1
74*4882a593Smuzhiyun 	u16 feedback_type:1;
75*4882a593Smuzhiyun 	u16 nc:3;
76*4882a593Smuzhiyun };
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun struct he_ndpa_sta_info {
79*4882a593Smuzhiyun 	u32 aid:11;
80*4882a593Smuzhiyun 	u32 bw:14;
81*4882a593Smuzhiyun 	u32 fb_ng:2;
82*4882a593Smuzhiyun 	u32 disambiguation:1;
83*4882a593Smuzhiyun 	u32 cb:1;
84*4882a593Smuzhiyun 	u32 nc:3;
85*4882a593Smuzhiyun };
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun struct phl_snd_sta {
88*4882a593Smuzhiyun 	u8 valid;
89*4882a593Smuzhiyun 	u16 macid;
90*4882a593Smuzhiyun 	enum channel_width bw; /* Sounding BW */
91*4882a593Smuzhiyun 	enum snd_fb_type snd_fb_t; /* Sounding feedback type : SU/MU/CQI */
92*4882a593Smuzhiyun 	u32 npda_sta_info; /* VHT/HE NDPA STA info*/
93*4882a593Smuzhiyun 	enum snd_status snd_sts;
94*4882a593Smuzhiyun 	/* Query resource in SND PROC */
95*4882a593Smuzhiyun 	void *bf_entry;/* HAL BF Entry for sounding */
96*4882a593Smuzhiyun };
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun struct phl_snd_grp {
100*4882a593Smuzhiyun 	u8 gidx;
101*4882a593Smuzhiyun 	enum snd_type snd_type;
102*4882a593Smuzhiyun 	enum snd_grp_tier grp_tier;
103*4882a593Smuzhiyun 	u8 wrole_idx;
104*4882a593Smuzhiyun 	u8 band;
105*4882a593Smuzhiyun 	u8 num_sta;
106*4882a593Smuzhiyun 	struct phl_snd_sta sta[MAX_NUM_STA_SND_GRP];
107*4882a593Smuzhiyun 	enum snd_status snd_sts;
108*4882a593Smuzhiyun 	u8 en_fix_mode; /* post confg forced mode setting */
109*4882a593Smuzhiyun 	/**
110*4882a593Smuzhiyun 	 * en_swap_mode : Only TIER_0 MU group support. When swap mode is enable,
111*4882a593Smuzhiyun 	 * each MU Entry will use two CSI MU buffer. Therefore, it cannan skip Disable
112*4882a593Smuzhiyun 	 * MU in Preconfig when next round sounding
113*4882a593Smuzhiyun 	 **/
114*4882a593Smuzhiyun 	u8 en_swap_mode;
115*4882a593Smuzhiyun 	u8 skip_post_cfg;/* 1: SKIP ALL; BIT1:Skip Group, BIT2:Skip GID, BIT3:Skip STA */
116*4882a593Smuzhiyun };
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun /* for whole phl snd fsm module fixed mode, only worked if snd_param->test_flag != 0 */
120*4882a593Smuzhiyun struct phl_snd_fix_param {
121*4882a593Smuzhiyun 	u8 en_fix_gidx;
122*4882a593Smuzhiyun 	u8 en_fix_fb_type;
123*4882a593Smuzhiyun 	u8 en_fix_sta;
124*4882a593Smuzhiyun 	u8 en_fix_snd_bw;
125*4882a593Smuzhiyun 	u8 grp_idx;
126*4882a593Smuzhiyun 	enum snd_fb_type snd_fb_type;
127*4882a593Smuzhiyun 	u16 sta_macid[MAX_NUM_STA_SND_GRP];
128*4882a593Smuzhiyun 	enum channel_width bw[MAX_NUM_STA_SND_GRP];
129*4882a593Smuzhiyun 	u8 f_ru_tbl_20[MAX_SND_HE_BFRP_USER_NUM][MAX_SND_HE_BFRP_USER_NUM];
130*4882a593Smuzhiyun 	u8 f_ru_tbl_80[MAX_SND_HE_BFRP_USER_NUM][MAX_SND_HE_BFRP_USER_NUM];
131*4882a593Smuzhiyun };
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun struct phl_sound_param {
134*4882a593Smuzhiyun 	void *m_wrole;
135*4882a593Smuzhiyun 	struct phl_snd_grp snd_grp[MAX_SND_GRP_NUM];
136*4882a593Smuzhiyun 	u32 grp_used_map;
137*4882a593Smuzhiyun 	u8 cur_proc_grp_idx;
138*4882a593Smuzhiyun 	u8 pre_proc_grp_idx;
139*4882a593Smuzhiyun 	u8 snd_func_grp_num;
140*4882a593Smuzhiyun 	u8 snd_dialog_token;
141*4882a593Smuzhiyun 	u8 snd_proc_timeout_ms;
142*4882a593Smuzhiyun 	u32 proc_start_time;
143*4882a593Smuzhiyun 	u8 snd_proc_period;
144*4882a593Smuzhiyun 	bool bypass_snd_sts_chk;
145*4882a593Smuzhiyun 	u32 test_flag;
146*4882a593Smuzhiyun 	struct phl_snd_fix_param fix_param;
147*4882a593Smuzhiyun 	u8 snd_fail_counter;
148*4882a593Smuzhiyun };
149*4882a593Smuzhiyun struct phl_snd_ops
150*4882a593Smuzhiyun {
151*4882a593Smuzhiyun 	enum rtw_phl_status (*snd_send_ndpa)(void *drv_priv,
152*4882a593Smuzhiyun                                              struct rtw_wifi_role_t *wrole,
153*4882a593Smuzhiyun                                              u8 *snd_dialog_tkn,
154*4882a593Smuzhiyun                                              u32 *ndpa_sta,
155*4882a593Smuzhiyun                                              enum channel_width snd_bw);
156*4882a593Smuzhiyun };
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun struct phl_sound_obj {
159*4882a593Smuzhiyun 	#ifdef CONFIG_FSM
160*4882a593Smuzhiyun 	struct fsm_main *fsm;
161*4882a593Smuzhiyun 	struct fsm_obj *fsm_obj;
162*4882a593Smuzhiyun 	#endif
163*4882a593Smuzhiyun 	struct phl_sound_param snd_param;
164*4882a593Smuzhiyun 	struct phl_snd_ops ops;
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun 	struct phl_info_t *phl_info;
167*4882a593Smuzhiyun 	void *iface;
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 	u8 snd_in_progress;
170*4882a593Smuzhiyun 	u8 is_terminated;
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun 	_os_lock snd_lock;
173*4882a593Smuzhiyun 	/* snd test */
174*4882a593Smuzhiyun 	u8 wrole_idx;
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun 	/* snd cmd disp related */
177*4882a593Smuzhiyun 	u8 msg_busy;
178*4882a593Smuzhiyun 	_os_lock cmd_lock;
179*4882a593Smuzhiyun };
180*4882a593Smuzhiyun #ifdef CONFIG_FSM
181*4882a593Smuzhiyun enum rtw_phl_status phl_snd_new_obj(
182*4882a593Smuzhiyun 	struct fsm_main *fsm,
183*4882a593Smuzhiyun 	struct phl_info_t *phl_info);
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun #endif
186*4882a593Smuzhiyun /* phl sounding intern api*/
187*4882a593Smuzhiyun enum rtw_phl_status phl_snd_func_snd_init(struct phl_info_t *phl_info);
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun enum rtw_phl_status phl_snd_func_pre_config(struct phl_info_t *phl_info);
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun /* phl sounding extern api*/
192*4882a593Smuzhiyun enum rtw_phl_status
193*4882a593Smuzhiyun rtw_phl_sound_start(void *phl, u8 wrole_idx, u8 st_dlg_tkn, u8 period, u8 test_flag);
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun enum rtw_phl_status
196*4882a593Smuzhiyun rtw_phl_sound_abort(void *phl);
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun enum rtw_phl_status
199*4882a593Smuzhiyun rtw_phl_sound_down_ev(void *phl);
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun void rtw_phl_snd_fix_tx_he_mu(struct phl_info_t *phl_info, u8 gid, bool en);
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun /* snd func grp */
204*4882a593Smuzhiyun struct phl_snd_grp *
205*4882a593Smuzhiyun phl_snd_get_grp_byidx(struct phl_info_t *phl_info, u8 gidx);
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun void
208*4882a593Smuzhiyun phl_snd_func_remove_grp_all(struct phl_info_t *phl_info);
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun enum rtw_phl_status
211*4882a593Smuzhiyun phl_snd_func_grouping(struct phl_info_t *phl_info, u8 wroleidx);
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun /* snd proc resource */
214*4882a593Smuzhiyun enum rtw_phl_status
215*4882a593Smuzhiyun phl_snd_proc_get_res(
216*4882a593Smuzhiyun 	struct phl_info_t *phl_info, struct phl_snd_grp *grp, u8 *nsta);
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun enum rtw_phl_status
219*4882a593Smuzhiyun phl_snd_proc_release_res(struct phl_info_t *phl_info, struct phl_snd_grp *grp);
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun /* snd proc precfg */
222*4882a593Smuzhiyun enum rtw_phl_status
223*4882a593Smuzhiyun phl_snd_proc_precfg(struct phl_info_t *phl_info, struct phl_snd_grp *grp);
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun /* snd proc busy cmd to fw */
227*4882a593Smuzhiyun enum rtw_phl_status
228*4882a593Smuzhiyun phl_snd_proc_start_sounding_fw(struct phl_info_t *phl_info,
229*4882a593Smuzhiyun 			       struct phl_snd_grp *grp);
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun /* snd proc postcfg */
232*4882a593Smuzhiyun enum rtw_phl_status
233*4882a593Smuzhiyun phl_snd_proc_postcfg(struct phl_info_t *phl_info, struct phl_snd_grp *grp);
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun enum rtw_phl_status
236*4882a593Smuzhiyun phl_snd_proc_chk_condition(struct phl_info_t *phl_info, struct phl_snd_grp *grp);
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun void
239*4882a593Smuzhiyun phl_snd_proc_chk_prev_grp(struct phl_info_t *phl_info,
240*4882a593Smuzhiyun 			  struct phl_snd_grp *grp);
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun enum rtw_phl_status
243*4882a593Smuzhiyun phl_snd_polling_pri_sta_sts(struct phl_info_t *phl_info,
244*4882a593Smuzhiyun 			    struct phl_snd_grp *grp);
245*4882a593Smuzhiyun void
246*4882a593Smuzhiyun phl_snd_mac_ctrl(struct phl_info_t *phl_info,
247*4882a593Smuzhiyun 		 struct rtw_wifi_role_t *wrole, u8 ctrl);
248*4882a593Smuzhiyun #endif
249