xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8852be/phl/phl_twt.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /******************************************************************************
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Copyright(c) 2019 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_TWT_H_
16*4882a593Smuzhiyun #define _PHL_TWT_H_
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #ifdef CONFIG_PHL_TWT
19*4882a593Smuzhiyun #define MIN_TWT_ELE_LEN 15
20*4882a593Smuzhiyun #define MAX_NUM_HW_TWT_CONFIG 4
21*4882a593Smuzhiyun #define CONTROL_LENGTH 1
22*4882a593Smuzhiyun #define REQUEST_TYPE_LENGTH 2
23*4882a593Smuzhiyun #define NOMINAL_MINIMUM_TWT_WAKE_DURATION_LENGTH 1
24*4882a593Smuzhiyun #define TARGET_WAKE_TIME_LENGTH 8
25*4882a593Smuzhiyun #define NOMINAL_MIN_TWT_WAKE_DURATION_LENGTH 1
26*4882a593Smuzhiyun #define TWT_WAKE_INTERVAL_MANTISSA_LENGTH 2
27*4882a593Smuzhiyun #define TWT_CHANNEL_LENGTH 1
28*4882a593Smuzhiyun #define TWT_FLOW_FIELD_LENGTH 1
29*4882a593Smuzhiyun #define TOKEN_OFFSET 2
30*4882a593Smuzhiyun #define TOKEN_LENGTH 1
31*4882a593Smuzhiyun #define ELEM_ID_LEN 1 /* Length of element id*/
32*4882a593Smuzhiyun #define ELEM_LEN_LEN 1 /* Length of element Length*/
33*4882a593Smuzhiyun #define C2H_FUN_WAIT_ANNC 0x0
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun #define get_twt_info(_phl) (struct phl_twt_info *)(_phl->phl_twt_info)
36*4882a593Smuzhiyun #define set_config_state(_state, set_state) (_state = set_state)
37*4882a593Smuzhiyun #define twt_init(_phl) (NULL != (get_twt_info(_phl)))
38*4882a593Smuzhiyun #define twt_sup(_phl) (((struct phl_info_t *)_phl)->phl_com->dev_cap.twt_sup)
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun enum phl_operate_config_type {
41*4882a593Smuzhiyun 	PHL_OP_TYPE_NONE = 0,
42*4882a593Smuzhiyun 	PHL_GET_NEW_CONFIG,
43*4882a593Smuzhiyun 	PHL_FREE_CONFIG,
44*4882a593Smuzhiyun 	PHL_GET_CONFIG_BY_ID,
45*4882a593Smuzhiyun 	PHL_GET_CONFIG_BY_ROLE,
46*4882a593Smuzhiyun 	PHL_GET_CONFIG_BY_PARA,
47*4882a593Smuzhiyun 	PHL_GET_NEXT_CONFIG,
48*4882a593Smuzhiyun 	PHL_GET_HEAD_CONFIG
49*4882a593Smuzhiyun };
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun enum phl_twt_action {
52*4882a593Smuzhiyun 	PHL_TWT_ACTION_NONE = 0,
53*4882a593Smuzhiyun 	PHL_TWT_ACTION_FREE,
54*4882a593Smuzhiyun 	PHL_TWT_ACTION_ALLOC,
55*4882a593Smuzhiyun 	PHL_TWT_ACTION_ENABLE,
56*4882a593Smuzhiyun 	PHL_TWT_ACTION_DISABLE,
57*4882a593Smuzhiyun 	PHL_TWT_ACTION_UP_ERROR
58*4882a593Smuzhiyun };
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun enum phl_wait_annc_type {
61*4882a593Smuzhiyun 	PHL_WAIT_ANNC_DISABLE = 0,
62*4882a593Smuzhiyun 	PHL_WAIT_ANNC_ENABLE = 1
63*4882a593Smuzhiyun };
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun enum twt_config_state {
66*4882a593Smuzhiyun 	twt_config_state_free = 0,
67*4882a593Smuzhiyun 	twt_config_state_idle,
68*4882a593Smuzhiyun 	twt_config_state_enable,
69*4882a593Smuzhiyun 	twt_config_state_error,
70*4882a593Smuzhiyun 	twt_config_state_unknown
71*4882a593Smuzhiyun };
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun struct phl_twt_config{
74*4882a593Smuzhiyun 	u8 idx;
75*4882a593Smuzhiyun 	enum twt_config_state state;
76*4882a593Smuzhiyun 	struct rtw_wifi_role_t *role;
77*4882a593Smuzhiyun 	struct rtw_phl_twt_info twt_info;
78*4882a593Smuzhiyun 	struct phl_queue twt_sta_queue; /*struct rtw_twt_sta_info*/
79*4882a593Smuzhiyun };
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun struct phl_twt_cfg_info {
82*4882a593Smuzhiyun 	u8 twt_cfg_num;
83*4882a593Smuzhiyun 	void *twt_cfg_ring; /*struct phl_twt_config*/
84*4882a593Smuzhiyun };
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun struct phl_twt_info {
87*4882a593Smuzhiyun 	struct phl_twt_cfg_info twt_cfg_info;
88*4882a593Smuzhiyun 	struct phl_queue twt_annc_queue;/*struct _twt_announce_info*/
89*4882a593Smuzhiyun };
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun struct _twt_announce_info{
92*4882a593Smuzhiyun 	_os_list list;
93*4882a593Smuzhiyun 	u8 map_offset;
94*4882a593Smuzhiyun 	u32 wait_macid_map;
95*4882a593Smuzhiyun };
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun struct _twt_compare {
98*4882a593Smuzhiyun 	struct rtw_phl_twt_setup_info twt_setup;
99*4882a593Smuzhiyun 	struct rtw_wifi_role_t *role;
100*4882a593Smuzhiyun };
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun struct _twt_teardown {
103*4882a593Smuzhiyun 	struct rtw_phl_stainfo_t *phl_sta;
104*4882a593Smuzhiyun 	enum rtw_phl_nego_type nego_type;
105*4882a593Smuzhiyun 	u8 id;
106*4882a593Smuzhiyun };
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun /* TWT element */
109*4882a593Smuzhiyun /*Control*/
110*4882a593Smuzhiyun #define SET_TWT_CONTROL_NDP_PAGING_INDICATOR(_ele_start, _val) \
111*4882a593Smuzhiyun 	SET_BITS_TO_LE_1BYTE(_ele_start, 0, 1, _val)
112*4882a593Smuzhiyun #define SET_TWT_CONTROL_RESPONDER_PM_MODE(_ele_start, _val) \
113*4882a593Smuzhiyun 	SET_BITS_TO_LE_1BYTE(_ele_start, 1, 1, _val)
114*4882a593Smuzhiyun #define SET_TWT_CONTROL_NEGOTIATION_TYPE(_ele_start, _val) \
115*4882a593Smuzhiyun 	SET_BITS_TO_LE_1BYTE(_ele_start, 2, 2, _val)
116*4882a593Smuzhiyun #define SET_TWT_CONTROL_TWT_INFORMATION_FRAME_DISABLE(_ele_start, _val) \
117*4882a593Smuzhiyun 	SET_BITS_TO_LE_1BYTE(_ele_start, 4, 1, _val)
118*4882a593Smuzhiyun #define SET_TWT_CONTROL_WAKE_DURATION_UNIT(_ele_start, _val) \
119*4882a593Smuzhiyun 	SET_BITS_TO_LE_1BYTE(_ele_start, 5, 1, _val)
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun /*Individual TWT Parameter Set field*/
122*4882a593Smuzhiyun /*Request Type*/
123*4882a593Smuzhiyun #define SET_TWT_REQ_TYPE_TWT_REQUEST(_ele_start, _val) \
124*4882a593Smuzhiyun 	SET_BITS_TO_LE_1BYTE(_ele_start, 0, 1, _val)
125*4882a593Smuzhiyun #define SET_TWT_REQ_TYPE_TWT_SETUP_COMMAND(_ele_start, _val) \
126*4882a593Smuzhiyun 	SET_BITS_TO_LE_1BYTE(_ele_start, 1, 3, _val)
127*4882a593Smuzhiyun #define SET_TWT_REQ_TYPE_TRIGGER(_ele_start, _val) \
128*4882a593Smuzhiyun 	SET_BITS_TO_LE_1BYTE(_ele_start, 4, 1, _val)
129*4882a593Smuzhiyun #define SET_TWT_REQ_TYPE_IMPLICIT(_ele_start, _val) \
130*4882a593Smuzhiyun 	SET_BITS_TO_LE_1BYTE(_ele_start, 5, 1, _val)
131*4882a593Smuzhiyun #define SET_TWT_REQ_TYPE_FLOW_TYPE(_ele_start, _val) \
132*4882a593Smuzhiyun 	SET_BITS_TO_LE_1BYTE(_ele_start, 6, 1, _val)
133*4882a593Smuzhiyun #define SET_TWT_REQ_TYPE_TWT_FLOW_IDENTIFER(_ele_start, _val) \
134*4882a593Smuzhiyun 	SET_BITS_TO_LE_2BYTE(_ele_start, 7, 3, _val)
135*4882a593Smuzhiyun #define SET_TWT_REQ_TYPE_TWT_WAKE_INTERVAL_EXPONENT(_ele_start, _val) \
136*4882a593Smuzhiyun 	SET_BITS_TO_LE_2BYTE(_ele_start, 10, 5, _val)
137*4882a593Smuzhiyun #define SET_TWT_REQ_TYPE_TWT_PROTECTION(_ele_start, _val) \
138*4882a593Smuzhiyun 	SET_BITS_TO_LE_2BYTE(_ele_start, 15, 1, _val)
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun #define SET_TWT_TARGET_WAKE_TIME_L(_ele_start, _val) \
141*4882a593Smuzhiyun 	SET_BITS_TO_LE_4BYTE((_ele_start) + 2, 0, 32, _val)
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun #define SET_TWT_TARGET_WAKE_TIME_H(_ele_start, _val) \
144*4882a593Smuzhiyun 	SET_BITS_TO_LE_4BYTE((_ele_start) + 6, 0, 32, _val)
145*4882a593Smuzhiyun /*twt group assignment*/
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun #define SET_TWT_NOMINAL_MINIMUM_TWT_WAKE_DURATION(_ele_start, _offset, _val) \
149*4882a593Smuzhiyun 	SET_BITS_TO_LE_1BYTE((_ele_start) + _offset, 0, 8, _val)
150*4882a593Smuzhiyun #define SET_TWT_TWT_WAKE_INTERVAL_MANTISSA(_ele_start, _offset, _val) \
151*4882a593Smuzhiyun 	SET_BITS_TO_LE_2BYTE((_ele_start) + _offset, 0, 16, _val)
152*4882a593Smuzhiyun #define SET_TWT_TWT_CHANNEL(_ele_start, _offset, _val) \
153*4882a593Smuzhiyun 	SET_BITS_TO_LE_1BYTE((_ele_start) + _offset, 0, 8, _val)
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun /*Broadcast TWT Parameter Set field*/
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun /*TWT FLOW field*/
160*4882a593Smuzhiyun #define SET_TWT_FLOW_ID(_ele_start, _val) \
161*4882a593Smuzhiyun 	SET_BITS_TO_LE_1BYTE(_ele_start, 0, 3, _val)
162*4882a593Smuzhiyun #define SET_NEGOTIATION_TYPE(_ele_start, _val) \
163*4882a593Smuzhiyun 	SET_BITS_TO_LE_1BYTE(_ele_start, 5, 2, _val)
164*4882a593Smuzhiyun #define SET_TEARDOWN_ALL_TWT(_ele_start, _val) \
165*4882a593Smuzhiyun 	SET_BITS_TO_LE_1BYTE(_ele_start, 7, 1, _val)
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun #define SET_BROADCAST_TWT_ID(_ele_start, _val) \
168*4882a593Smuzhiyun 	SET_BITS_TO_LE_1BYTE(_ele_start, 0, 5, _val)
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun /*Control*/
171*4882a593Smuzhiyun /*Bit0*/
172*4882a593Smuzhiyun #define GET_TWT_CONTROL_NDP_PAGING_INDICATOR(_buf) \
173*4882a593Smuzhiyun 	LE_BITS_TO_1BYTE(_buf, 0, 1)
174*4882a593Smuzhiyun /*Bit1*/
175*4882a593Smuzhiyun #define GET_TWT_CONTROL_RESPONDER_PM_MODE(_buf) \
176*4882a593Smuzhiyun 	LE_BITS_TO_1BYTE(_buf, 1, 1)
177*4882a593Smuzhiyun /*Bit2-3*/
178*4882a593Smuzhiyun #define GET_TWT_CONTROL_NEGOTIATION_TYPE(_buf) \
179*4882a593Smuzhiyun 	LE_BITS_TO_1BYTE(_buf, 2, 2)
180*4882a593Smuzhiyun /*Bit4*/
181*4882a593Smuzhiyun #define GET_TWT_CONTROL_TWT_INFORMATION_FRAME_DISABLE(_buf) \
182*4882a593Smuzhiyun 	LE_BITS_TO_1BYTE(_buf, 4, 1)
183*4882a593Smuzhiyun /*Bit5*/
184*4882a593Smuzhiyun #define GET_TWT_CONTROL_WAKE_DURATION_UNIT(_buf) \
185*4882a593Smuzhiyun 	LE_BITS_TO_1BYTE(_buf, 5, 1)
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun /*Request Type*/
188*4882a593Smuzhiyun /*Bit0*/
189*4882a593Smuzhiyun #define GET_TWT_REQ_TYPE_TWT_REQUEST(_buf) \
190*4882a593Smuzhiyun 	LE_BITS_TO_2BYTE(_buf, 0, 1)
191*4882a593Smuzhiyun /*Bit1-3*/
192*4882a593Smuzhiyun #define GET_TWT_REQ_TYPE_TWT_SETUP_COMMAND(_buf) \
193*4882a593Smuzhiyun 	LE_BITS_TO_2BYTE(_buf, 1, 3)
194*4882a593Smuzhiyun /*Bit4*/
195*4882a593Smuzhiyun #define GET_TWT_REQ_TYPE_TRIGGER(_buf) \
196*4882a593Smuzhiyun 	LE_BITS_TO_2BYTE(_buf, 4, 1)
197*4882a593Smuzhiyun /*Bit5*/
198*4882a593Smuzhiyun #define GET_TWT_REQ_TYPE_IMPLICIT(_buf) \
199*4882a593Smuzhiyun 	LE_BITS_TO_2BYTE(_buf, 5, 1)
200*4882a593Smuzhiyun /*Bit6*/
201*4882a593Smuzhiyun #define GET_TWT_REQ_TYPE_FLOW_TYPE(_buf) \
202*4882a593Smuzhiyun 	LE_BITS_TO_2BYTE(_buf, 6, 1)
203*4882a593Smuzhiyun /*Bit7-9*/
204*4882a593Smuzhiyun #define GET_TWT_REQ_TYPE_TWT_FLOW_IDENTIFER(_buf) \
205*4882a593Smuzhiyun 	LE_BITS_TO_2BYTE(_buf, 7, 3)
206*4882a593Smuzhiyun /*Bit10-14*/
207*4882a593Smuzhiyun #define GET_TWT_REQ_TYPE_TWT_WAKE_INTERVAL_EXPONENT(_buf) \
208*4882a593Smuzhiyun 	LE_BITS_TO_2BYTE(_buf, 10, 5)
209*4882a593Smuzhiyun /*Bit15*/
210*4882a593Smuzhiyun #define GET_TWT_REQ_TYPE_TWT_PROTECTION(_buf) \
211*4882a593Smuzhiyun 	LE_BITS_TO_2BYTE(_buf, 15, 1)
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun #define GET_TWT_TARGET_WAKE_TIME_L(_buf) \
214*4882a593Smuzhiyun 	LE_BITS_TO_4BYTE(_buf, 0, 32)
215*4882a593Smuzhiyun #define GET_TWT_TARGET_WAKE_TIME_H(_buf) \
216*4882a593Smuzhiyun 	LE_BITS_TO_4BYTE((_buf) + 4, 0, 32)
217*4882a593Smuzhiyun #define GET_TWT_NOMINAL_MINIMUM_TWT_WAKE_DURATION(_buf) \
218*4882a593Smuzhiyun 	LE_BITS_TO_1BYTE(_buf, 0 , 8);
219*4882a593Smuzhiyun #define GET_TWT_TWT_WAKE_INTERVAL_MANTISSA(_buf) \
220*4882a593Smuzhiyun 	LE_BITS_TO_2BYTE(_buf, 0, 16);
221*4882a593Smuzhiyun #define GET_TWT_TWT_CHANNEL(_buf) \
222*4882a593Smuzhiyun 	LE_BITS_TO_1BYTE(_buf, 0 ,8);
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun /*TWT FLOW field*/
225*4882a593Smuzhiyun /*Bit0-2*/
226*4882a593Smuzhiyun #define GET_TWT_FLOW_ID(_buf) \
227*4882a593Smuzhiyun 	LE_BITS_TO_1BYTE(_buf, 0, 3)
228*4882a593Smuzhiyun /*Bit5-6*/
229*4882a593Smuzhiyun #define GET_NEGOTIATION_TYPE(_buf) \
230*4882a593Smuzhiyun 	LE_BITS_TO_1BYTE(_buf, 5 , 2);
231*4882a593Smuzhiyun /*Bit7*/
232*4882a593Smuzhiyun #define GET_TEARDOWN_ALL_TWT(_buf) \
233*4882a593Smuzhiyun 	LE_BITS_TO_1BYTE(_buf, 7, 1)
234*4882a593Smuzhiyun /*Bit0-4*/
235*4882a593Smuzhiyun #define GET_BROADCAST_TWT_ID(_buf) \
236*4882a593Smuzhiyun 	LE_BITS_TO_1BYTE(_buf, 0, 5)
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun #define GET_ELE_ID(_buf) \
240*4882a593Smuzhiyun 	LE_BITS_TO_1BYTE(_buf, 0, 8);
241*4882a593Smuzhiyun #define GET_ELE_LEN(_buf) \
242*4882a593Smuzhiyun 	LE_BITS_TO_1BYTE(_buf, 0, 8);
243*4882a593Smuzhiyun #define GET_DIALOG_TOKEN(_buf) \
244*4882a593Smuzhiyun 	LE_BITS_TO_1BYTE(_buf, 0, 8);
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun enum rtw_phl_status phl_twt_init(void *phl);
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun void phl_twt_deinit(void *phl);
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun enum rtw_phl_status
252*4882a593Smuzhiyun rtw_phl_twt_disable_all_twt_by_role(void *phl, struct rtw_wifi_role_t *role);
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_twt_alloc_twt_config(void *phl, struct rtw_wifi_role_t *role,
255*4882a593Smuzhiyun 		struct rtw_phl_twt_setup_info setup_info, u8 benable, u8 *id);
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_twt_free_twt_config(void *phl, u8 id);
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_twt_add_sta_info(void *phl, struct rtw_phl_stainfo_t *phl_sta,
260*4882a593Smuzhiyun 			u8 config_id, u8 id);
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun #else
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun #define phl_twt_init(_phl) RTW_PHL_STATUS_SUCCESS
265*4882a593Smuzhiyun #define phl_twt_deinit(_phl)
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun #endif /* CONFIG_PHL_TWT */
268*4882a593Smuzhiyun #endif /*_PHL_TWT_H_*/
269