xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8852be/phl/phl_def.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /******************************************************************************
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Copyright(c) 2019 - 2021 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_DEF_H_
16*4882a593Smuzhiyun #define _PHL_DEF_H_
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun enum phl_packet_type {
19*4882a593Smuzhiyun 	PACKET_NORMAL,
20*4882a593Smuzhiyun 	PACKET_DHCP,
21*4882a593Smuzhiyun 	PACKET_ARP,
22*4882a593Smuzhiyun 	PACKET_EAPOL,
23*4882a593Smuzhiyun 	PACKET_EAPOL_START,
24*4882a593Smuzhiyun 	PACKET_MAX
25*4882a593Smuzhiyun };
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun /*HW_BAND0 - CMAC0 + PHY0 + S0*/
28*4882a593Smuzhiyun /*HW_BAND1 - CMAC1 + PHY1 + S1*/
29*4882a593Smuzhiyun /*wifi_role->hw_band*/
30*4882a593Smuzhiyun enum phl_band_idx {
31*4882a593Smuzhiyun 	HW_BAND_0,
32*4882a593Smuzhiyun 	HW_BAND_1,
33*4882a593Smuzhiyun 	HW_BAND_MAX
34*4882a593Smuzhiyun };
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /*wifi_role->hw_port*/
37*4882a593Smuzhiyun enum phl_hw_port {
38*4882a593Smuzhiyun 	HW_PORT0,
39*4882a593Smuzhiyun 	HW_PORT1,
40*4882a593Smuzhiyun 	HW_PORT2,
41*4882a593Smuzhiyun 	HW_PORT3,
42*4882a593Smuzhiyun 	HW_PORT4,
43*4882a593Smuzhiyun 	HW_PORT_MAX,
44*4882a593Smuzhiyun };
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun #define RTW_MAX_TID_NUM 16
47*4882a593Smuzhiyun #define RTW_MAX_AC_QUEUE_NUM 4
48*4882a593Smuzhiyun enum phl_ac_queue {
49*4882a593Smuzhiyun 	PHL_BE_QUEUE_SEL		= 0,
50*4882a593Smuzhiyun 	PHL_BK_QUEUE_SEL		= 1,
51*4882a593Smuzhiyun 	PHL_VI_QUEUE_SEL		= 2,
52*4882a593Smuzhiyun 	PHL_VO_QUEUE_SEL		= 3,
53*4882a593Smuzhiyun 	PHL_AC_QUEUE_TOTAL
54*4882a593Smuzhiyun };
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun enum phl_stat_info_query {
57*4882a593Smuzhiyun 	STAT_INFO_FA_ALL,
58*4882a593Smuzhiyun 	STAT_INFO_CCA_ALL,
59*4882a593Smuzhiyun };
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun /**
62*4882a593Smuzhiyun  * struct rtw_chan_def - channel defination
63*4882a593Smuzhiyun  * @chan: the (control/primary) channel
64*4882a593Smuzhiyun  * @center_ch: the center channel
65*4882a593Smuzhiyun  * @bw: channel bandwidth
66*4882a593Smuzhiyun  * @center_freq1: center frequency of first segment
67*4882a593Smuzhiyun  * @center_freq2: center frequency of second segment
68*4882a593Smuzhiyun  *	(only with 80+80 MHz)
69*4882a593Smuzhiyun  */
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun struct rtw_chan_def {
72*4882a593Smuzhiyun 	enum band_type band; /* protocol -2.4G,5G,6G*/
73*4882a593Smuzhiyun 	enum channel_width bw;
74*4882a593Smuzhiyun 	enum chan_offset offset;
75*4882a593Smuzhiyun 	u8 chan; /*primary channel*/
76*4882a593Smuzhiyun 	u8 center_ch;
77*4882a593Smuzhiyun 	u16 hw_value;
78*4882a593Smuzhiyun 	u32 center_freq1;
79*4882a593Smuzhiyun 	u32 center_freq2;
80*4882a593Smuzhiyun };
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun struct chg_opch_param {
83*4882a593Smuzhiyun 	struct rtw_wifi_role_t *wrole;
84*4882a593Smuzhiyun 	struct rtw_chan_def new_chdef;
85*4882a593Smuzhiyun 	struct rtw_chan_def ori_chdef;
86*4882a593Smuzhiyun 	enum rtw_phl_status cmd_start_sts;
87*4882a593Smuzhiyun 	void (*chg_opch_done)(void *priv, u8 ridx, enum rtw_phl_status status);
88*4882a593Smuzhiyun };
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun /**
91*4882a593Smuzhiyun  * struct rtw_chan_ctx - channel context
92*4882a593Smuzhiyun  * @list:
93*4882a593Smuzhiyun  * @chan_ctx_lock:
94*4882a593Smuzhiyun  * @chan_def:
95*4882a593Smuzhiyun  */
96*4882a593Smuzhiyun struct rtw_chan_ctx {
97*4882a593Smuzhiyun 	_os_list list;
98*4882a593Smuzhiyun 	struct rtw_chan_def chan_def;
99*4882a593Smuzhiyun 	u8 role_map; /*used role_idx*/
100*4882a593Smuzhiyun 	bool dfs_enabled;
101*4882a593Smuzhiyun };
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun #ifdef CONFIG_PCI_HCI
105*4882a593Smuzhiyun struct rtw_pci_info {
106*4882a593Smuzhiyun 	u8 dummy;
107*4882a593Smuzhiyun };
108*4882a593Smuzhiyun #endif
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun #ifdef CONFIG_USB_HCI
112*4882a593Smuzhiyun struct rtw_usb_info {
113*4882a593Smuzhiyun 	enum rtw_usb_speed usb_speed; /* USB 1.1, 2.0 or 3.0 */
114*4882a593Smuzhiyun 	u16 usb_bulkout_size;
115*4882a593Smuzhiyun 	u8 outep_num;
116*4882a593Smuzhiyun 	u8 inep_num;
117*4882a593Smuzhiyun };
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun enum phl_usb_rx_agg_mode {
120*4882a593Smuzhiyun 	PHL_RX_AGG_DISABLE,
121*4882a593Smuzhiyun 	PHL_RX_AGG_DEFAULT,
122*4882a593Smuzhiyun 	PHL_RX_AGG_SMALL_PKT,
123*4882a593Smuzhiyun 	PHL_RX_AGG_USER_DEFINE,
124*4882a593Smuzhiyun };
125*4882a593Smuzhiyun /*
126*4882a593Smuzhiyun  * refers to _usb.h
127*4882a593Smuzhiyun  * #define SWITCHMODE           0x2
128*4882a593Smuzhiyun  * #define FORCEUSB3MODE        0x1
129*4882a593Smuzhiyun  * #define FORCEUSB2MODE        0x0
130*4882a593Smuzhiyun */
131*4882a593Smuzhiyun enum rtw_usb_sw_ability {
132*4882a593Smuzhiyun 	RTW_USB2_ONLY = 0,
133*4882a593Smuzhiyun 	RTW_USB3_ONLY,
134*4882a593Smuzhiyun 	RTW_USB_SUPPORT_SWITCH,
135*4882a593Smuzhiyun 	RTW_USB_SUPPORT_MAX
136*4882a593Smuzhiyun };
137*4882a593Smuzhiyun #endif
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun #ifdef CONFIG_SDIO_HCI
140*4882a593Smuzhiyun struct rtw_sdio_info {
141*4882a593Smuzhiyun 	unsigned int clock;
142*4882a593Smuzhiyun 	unsigned int timing;
143*4882a593Smuzhiyun 	u8 sd3_bus_mode;
144*4882a593Smuzhiyun 	u16 block_sz;
145*4882a593Smuzhiyun 	u16 io_align_sz;
146*4882a593Smuzhiyun 	u16 tx_align_sz;
147*4882a593Smuzhiyun 	bool tx_512_by_byte_mode;	/* Send 512 bytes by cmd53 byte or */
148*4882a593Smuzhiyun 					/* block mode. */
149*4882a593Smuzhiyun };
150*4882a593Smuzhiyun #endif
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun enum rtw_rx_status {
153*4882a593Smuzhiyun 	RTW_STATUS_RX_OK,
154*4882a593Smuzhiyun 	RTW_STATUS_RXDMA_HANG,
155*4882a593Smuzhiyun 	RTW_STATUS_RXFIFO_HANG
156*4882a593Smuzhiyun };
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun struct rtw_ic_info {
159*4882a593Smuzhiyun 	enum rtl_ic_id ic_id;
160*4882a593Smuzhiyun 	enum rtw_hci_type hci_type;
161*4882a593Smuzhiyun 	#ifdef CONFIG_SDIO_HCI
162*4882a593Smuzhiyun 	struct rtw_sdio_info sdio_info;
163*4882a593Smuzhiyun 	#endif
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun 	#ifdef CONFIG_USB_HCI
166*4882a593Smuzhiyun 	struct rtw_usb_info usb_info;
167*4882a593Smuzhiyun 	#endif
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 	#ifdef CONFIG_PCI_HCI
170*4882a593Smuzhiyun 	struct rtw_pci_info pci_info;
171*4882a593Smuzhiyun 	#endif
172*4882a593Smuzhiyun };
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun enum rtw_proc_cmd_type {
175*4882a593Smuzhiyun 	RTW_PROC_CMD_UNKNOW,
176*4882a593Smuzhiyun 	RTW_PROC_CMD_BB,	/* 1 */
177*4882a593Smuzhiyun 	RTW_PROC_CMD_RF,	/* 2 */
178*4882a593Smuzhiyun 	RTW_PROC_CMD_MAC,	/* 3 */
179*4882a593Smuzhiyun 	RTW_PROC_CMD_PHL,	/* 4 */
180*4882a593Smuzhiyun 	RTW_PROC_CMD_CORE,	/* 5 */
181*4882a593Smuzhiyun 	RTW_PROC_CMD_BTC,	/* 6 */
182*4882a593Smuzhiyun 	RTW_PROC_CMD_EFUSE,	/* 7 */
183*4882a593Smuzhiyun 	RTW_PROC_CMD_MAX
184*4882a593Smuzhiyun };
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun enum rtw_arg_type {
187*4882a593Smuzhiyun 	RTW_ARG_TYPE_UNKNOW,
188*4882a593Smuzhiyun 	RTW_ARG_TYPE_BUF,	/* 1 */
189*4882a593Smuzhiyun 	RTW_ARG_TYPE_ARRAY,	/* 2 */
190*4882a593Smuzhiyun 	RTW_ARG_TYPE_MAX
191*4882a593Smuzhiyun };
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun #define		MAX_ARGC	20
194*4882a593Smuzhiyun #define		MAX_ARGV	16
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun struct rtw_proc_cmd {
198*4882a593Smuzhiyun 	enum rtw_arg_type in_type;
199*4882a593Smuzhiyun 	u32 in_cnt_len;
200*4882a593Smuzhiyun 	union {
201*4882a593Smuzhiyun 		char *buf;
202*4882a593Smuzhiyun 		char vector[MAX_ARGC][MAX_ARGV];
203*4882a593Smuzhiyun 	}in;
204*4882a593Smuzhiyun };
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun enum rtw_para_src {
207*4882a593Smuzhiyun 	RTW_PARA_SRC_INTNAL, /* 0 */
208*4882a593Smuzhiyun 	RTW_PARA_SRC_EXTNAL, /* 1 */
209*4882a593Smuzhiyun 	RTW_PARA_SRC_EXTNAL_BUF, /* 2 */
210*4882a593Smuzhiyun 	RTW_PARA_SRC_CUSTOM, /* 3 */
211*4882a593Smuzhiyun 	RTW_PARA_SRC_MAX
212*4882a593Smuzhiyun };
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun struct rtw_para_info_t {
215*4882a593Smuzhiyun 	enum rtw_para_src para_src;
216*4882a593Smuzhiyun 	char para_path[256];
217*4882a593Smuzhiyun 	char *hal_phy_folder;
218*4882a593Smuzhiyun 	char postfix[33];
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun 	u8 *ext_para_file_buf;
221*4882a593Smuzhiyun 	u32 ext_para_file_buf_len;
222*4882a593Smuzhiyun 	u32 para_data_len;
223*4882a593Smuzhiyun 	u32 *para_data;
224*4882a593Smuzhiyun };
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun #define regd_name_max_size 32
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun struct rtw_para_pwrlmt_info_t {
229*4882a593Smuzhiyun 	enum rtw_para_src para_src;
230*4882a593Smuzhiyun 	char para_path[256];
231*4882a593Smuzhiyun 	char *hal_phy_folder;
232*4882a593Smuzhiyun 	char postfix[33];
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun 	u8 *ext_para_file_buf;
235*4882a593Smuzhiyun 	u32 ext_para_file_buf_len;
236*4882a593Smuzhiyun 	u32 para_data_len;
237*4882a593Smuzhiyun 	u32 *para_data;
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun 	char ext_regd_name[regd_name_max_size][10];
240*4882a593Smuzhiyun 	u16 ext_regd_arridx;
241*4882a593Smuzhiyun 	u16 ext_reg_map_num;
242*4882a593Smuzhiyun 	u8 *ext_reg_codemap;
243*4882a593Smuzhiyun };
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun #define RTW_PHL_HANDLER_STATUS_INITIALIZED BIT0
246*4882a593Smuzhiyun #define RTW_PHL_HANDLER_STATUS_SET BIT1
247*4882a593Smuzhiyun #define RTW_PHL_HANDLER_STATUS_RELEASED BIT2
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun #define RTW_PHL_HANDLER_PRIO_HIGH 0
250*4882a593Smuzhiyun #define RTW_PHL_HANDLER_PRIO_NORMAL 1
251*4882a593Smuzhiyun #define RTW_PHL_HANDLER_PRIO_LOW 2
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun enum rtw_phl_evt {
254*4882a593Smuzhiyun 	RTW_PHL_EVT_RX = BIT0,
255*4882a593Smuzhiyun 	RTW_PHL_EVT_TX_RECYCLE = BIT1,
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun 	RTW_PHL_EVT_MAX = BIT31
258*4882a593Smuzhiyun };
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun enum rtw_phl_config_int {
261*4882a593Smuzhiyun 	RTW_PHL_STOP_RX_INT,
262*4882a593Smuzhiyun 	RTW_PHL_RESUME_RX_INT,
263*4882a593Smuzhiyun 	RTW_PHL_SER_HANDSHAKE_MODE,
264*4882a593Smuzhiyun 	RTW_PHL_EN_HCI_INT,
265*4882a593Smuzhiyun 	RTW_PHL_DIS_HCI_INT,
266*4882a593Smuzhiyun 	RTW_PHL_CLR_HCI_INT,
267*4882a593Smuzhiyun 	RTW_PHL_CONFIG_INT_MAX
268*4882a593Smuzhiyun };
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun /**
271*4882a593Smuzhiyun  * phl_handler - scheduled by core layer or phl itself
272*4882a593Smuzhiyun  * and the properties is assigned by different hanlder type
273*4882a593Smuzhiyun  * @status: handler current status defined by RTW_PHL_HANDLER_STATUS_XXX
274*4882a593Smuzhiyun  * @type: define different properties of handler - tasklet, thread, workitem
275*4882a593Smuzhiyun  * @handle: store different type of handler structure
276*4882a593Smuzhiyun  * @callback: handler callback function
277*4882a593Smuzhiyun  * @context: context used in handler callback function
278*4882a593Smuzhiyun  */
279*4882a593Smuzhiyun struct rtw_phl_handler {
280*4882a593Smuzhiyun 	char status;
281*4882a593Smuzhiyun 	char type;
282*4882a593Smuzhiyun 	void *drv_priv;
283*4882a593Smuzhiyun 	struct _os_handler os_handler;
284*4882a593Smuzhiyun 	void (*callback)(void *context);
285*4882a593Smuzhiyun 	void *context;
286*4882a593Smuzhiyun };
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun struct rtw_xmit_req;
289*4882a593Smuzhiyun struct rtw_aoac_report;
290*4882a593Smuzhiyun struct rtw_phl_evt_ops {
291*4882a593Smuzhiyun 	enum rtw_phl_status (*rx_process)(void *drv_priv);
292*4882a593Smuzhiyun 	enum rtw_phl_status (*tx_recycle)(void *drv_priv, struct rtw_xmit_req *txreq);
293*4882a593Smuzhiyun 	enum rtw_phl_status (*tx_test_recycle)(void *phl, struct rtw_xmit_req *txreq);
294*4882a593Smuzhiyun 	bool (*set_rf_state)(void *drv_priv, enum rtw_rf_state state_to_set);
295*4882a593Smuzhiyun 	void (*wow_handle_sec_info_update)(void *drv_priv, struct rtw_aoac_report *aoac_info, u8 aoac_report_get_ok, u8 phase);
296*4882a593Smuzhiyun 	void (*indicate_wake_rsn)(void *drv_priv, u8 rsn);
297*4882a593Smuzhiyun #ifdef CONFIG_SYNC_INTERRUPT
298*4882a593Smuzhiyun 	void (*interrupt_restore)(void *drv_priv, u8 rx);
299*4882a593Smuzhiyun 	void (*set_interrupt_caps)(void *drv_priv, u8 en);
300*4882a593Smuzhiyun #endif /* CONFIG_SYNC_INTERRUPT */
301*4882a593Smuzhiyun 	void (*ap_ps_sta_ps_change)(void *drv_priv, u8 role_id, u8 *sta_mac,
302*4882a593Smuzhiyun 	                            int power_save);
303*4882a593Smuzhiyun 	u8 (*issue_null_data)(void *priv, u8 ridx, bool ps);
304*4882a593Smuzhiyun };
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun /*
307*4882a593Smuzhiyun  * PHL CMD support direct execution, no-wait: synchronization, wait:asynchronization
308*4882a593Smuzhiyun  * PHL_CMD_CMD_DIRECTLY: call PHL API including I/O operation directly
309*4882a593Smuzhiyun  * PHL_CMD_NO_WARIT: send phl cmd msg to cmd dispatcher and do not wait for completion
310*4882a593Smuzhiyun  * PHL_CMD_WAIT: send phl cmd msg to cmd dispatcher and wait for completion
311*4882a593Smuzhiyun  */
312*4882a593Smuzhiyun enum phl_cmd_type {
313*4882a593Smuzhiyun 	PHL_CMD_DIRECTLY,
314*4882a593Smuzhiyun 	PHL_CMD_NO_WAIT,
315*4882a593Smuzhiyun 	PHL_CMD_WAIT,
316*4882a593Smuzhiyun 	PHL_CMD_MAX,
317*4882a593Smuzhiyun };
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun enum role_type {
320*4882a593Smuzhiyun 	PHL_RTYPE_NONE,
321*4882a593Smuzhiyun 	PHL_RTYPE_STATION,
322*4882a593Smuzhiyun 	PHL_RTYPE_AP,
323*4882a593Smuzhiyun 	PHL_RTYPE_VAP,
324*4882a593Smuzhiyun 	PHL_RTYPE_ADHOC,
325*4882a593Smuzhiyun 	PHL_RTYPE_ADHOC_MASTER,
326*4882a593Smuzhiyun 	PHL_RTYPE_MESH,
327*4882a593Smuzhiyun 	PHL_RTYPE_MONITOR,
328*4882a593Smuzhiyun 	PHL_RTYPE_P2P_DEVICE,
329*4882a593Smuzhiyun 	PHL_RTYPE_P2P_GC,
330*4882a593Smuzhiyun 	PHL_RTYPE_P2P_GO,
331*4882a593Smuzhiyun 	PHL_RTYPE_TDLS,
332*4882a593Smuzhiyun 	PHL_RTYPE_NAN,
333*4882a593Smuzhiyun 	PHL_MLME_MAX
334*4882a593Smuzhiyun };
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun enum role_state {
337*4882a593Smuzhiyun 	PHL_ROLE_START, /* 0 - PHL*/
338*4882a593Smuzhiyun 	PHL_ROLE_STOP, /* 1 - PHL*/
339*4882a593Smuzhiyun 	PHL_ROLE_CHG_TYPE, /* 2 - PHL*/
340*4882a593Smuzhiyun 	PHL_ROLE_UPDATE_NOA, /* 3 - PHL*/
341*4882a593Smuzhiyun 	PHL_ROLE_MSTS_STA_CONN_START, /*CORE*/
342*4882a593Smuzhiyun 	PHL_ROLE_MSTS_STA_CONN_END,/*CORE*/
343*4882a593Smuzhiyun 	PHL_ROLE_MSTS_STA_DIS_CONN,/*CORE*/
344*4882a593Smuzhiyun 	PHL_ROLE_MSTS_AP_START,/*CORE*/
345*4882a593Smuzhiyun 	PHL_ROLE_MSTS_AP_STOP,/*CORE*/
346*4882a593Smuzhiyun 	PHL_ROLE_STATE_UNKNOWN,
347*4882a593Smuzhiyun };
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun enum mlme_state {
350*4882a593Smuzhiyun 	MLME_NO_LINK,
351*4882a593Smuzhiyun 	MLME_LINKING,
352*4882a593Smuzhiyun 	MLME_LINKED
353*4882a593Smuzhiyun };
354*4882a593Smuzhiyun enum wr_chg_id {
355*4882a593Smuzhiyun 	WR_CHG_TYPE,
356*4882a593Smuzhiyun 	WR_CHG_MADDR,
357*4882a593Smuzhiyun 	WR_CHG_AP_PARAM,
358*4882a593Smuzhiyun 	WR_CHG_EDCA_PARAM,
359*4882a593Smuzhiyun 	WR_CHG_MU_EDCA_PARAM,
360*4882a593Smuzhiyun 	WR_CHG_MU_EDCA_CFG,
361*4882a593Smuzhiyun 	WR_CHG_BSS_COLOR,
362*4882a593Smuzhiyun 	WR_CHG_RTS_TH,
363*4882a593Smuzhiyun 	WR_CHG_DFS_HE_TB_CFG,
364*4882a593Smuzhiyun 	WR_CHG_TRX_PATH,
365*4882a593Smuzhiyun 	WR_CHG_STBC_CFG,
366*4882a593Smuzhiyun 	WR_CHG_MAX,
367*4882a593Smuzhiyun };
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun enum wr_status{
370*4882a593Smuzhiyun 	WR_STATUS_PS_ANN = BIT0,
371*4882a593Smuzhiyun 	WR_STATUS_BCN_STOP = BIT1,
372*4882a593Smuzhiyun 	WR_STATUS_TSF_SYNC = BIT2,
373*4882a593Smuzhiyun 	WR_STATUS_MAX = BIT7
374*4882a593Smuzhiyun };
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun enum rtw_cfg_type { /* sync with pcfg_type */
377*4882a593Smuzhiyun 	CFG_TBTT_AGG,
378*4882a593Smuzhiyun 	CFG_TBTT_SHIFT,
379*4882a593Smuzhiyun 	CFG_HIQ_WIN,
380*4882a593Smuzhiyun 	CFG_HIQ_DTIM,
381*4882a593Smuzhiyun 	CFG_HIQ_MAX,
382*4882a593Smuzhiyun 	CFG_BCN_INTERVAL,	/* Beacon Interval */
383*4882a593Smuzhiyun 	CFG_BSS_CLR
384*4882a593Smuzhiyun };
385*4882a593Smuzhiyun 
386*4882a593Smuzhiyun struct rtw_ap_param {
387*4882a593Smuzhiyun 	u32 cfg_id;
388*4882a593Smuzhiyun 	u32 value;
389*4882a593Smuzhiyun };
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun struct rtw_edca_param {
392*4882a593Smuzhiyun 	/* Access Category, 0:BE, 1:BK, 2:VI, 3:VO */
393*4882a593Smuzhiyun 	u8 ac;
394*4882a593Smuzhiyun 	/*
395*4882a593Smuzhiyun 	 * EDCA parameter
396*4882a593Smuzhiyun 	 * |31...16|15...12|11...8|7...0|
397*4882a593Smuzhiyun 	 * |   TXOP|  CWMAX| CWMIN| AIFS|
398*4882a593Smuzhiyun 	 */
399*4882a593Smuzhiyun 	u32 param;
400*4882a593Smuzhiyun };
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun struct rtw_mu_edca_param {
403*4882a593Smuzhiyun 	u8 ac;
404*4882a593Smuzhiyun 	u8 aifsn;
405*4882a593Smuzhiyun 	u8 cw;
406*4882a593Smuzhiyun 	u8 timer;
407*4882a593Smuzhiyun };
408*4882a593Smuzhiyun 
409*4882a593Smuzhiyun struct rtw_trx_path_param {
410*4882a593Smuzhiyun 	enum rf_path tx;
411*4882a593Smuzhiyun 	enum rf_path rx;
412*4882a593Smuzhiyun 	u8 tx_nss;
413*4882a593Smuzhiyun 	u8 rx_nss;
414*4882a593Smuzhiyun };
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun #define MAX_STORE_BCN_NUM 3
417*4882a593Smuzhiyun enum conf_lvl {
418*4882a593Smuzhiyun 	CONF_LVL_NONE = 0,
419*4882a593Smuzhiyun 	CONF_LVL_LOW,
420*4882a593Smuzhiyun 	CONF_LVL_MID,
421*4882a593Smuzhiyun 	CONF_LVL_HIGH
422*4882a593Smuzhiyun };
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun struct rtw_bcn_offset {
425*4882a593Smuzhiyun 	u16 offset; /*TU*/
426*4882a593Smuzhiyun 	enum conf_lvl conf_lvl; /*confidence level*/
427*4882a593Smuzhiyun 	u16 cr_tbtt_shift; /* CR current setting */
428*4882a593Smuzhiyun };
429*4882a593Smuzhiyun 
430*4882a593Smuzhiyun /*
431*4882a593Smuzhiyun  * Store rx bcn tsf info
432*4882a593Smuzhiyun  * @num: the store noumber of "info" array
433*4882a593Smuzhiyun  * @idx: store current index of "info" array
434*4882a593Smuzhiyun  * @info: store array. info[0]: store tsf, info[1]: store mod(TU), info[2]: store hw rx time
435*4882a593Smuzhiyun  * @offset_i: Bcn offset info. Dont't access directionly this variable for application.
436*4882a593Smuzhiyun                    You can get offset_i info from phl_get_sta_bcn_offset_info.
437*4882a593Smuzhiyun  */
438*4882a593Smuzhiyun struct rtw_rx_bcn_info {
439*4882a593Smuzhiyun 	u8 idx;
440*4882a593Smuzhiyun 	u8 num;
441*4882a593Smuzhiyun 	u64 info[3][MAX_STORE_BCN_NUM];
442*4882a593Smuzhiyun 	struct rtw_bcn_offset offset_i;
443*4882a593Smuzhiyun };
444*4882a593Smuzhiyun 
445*4882a593Smuzhiyun struct rtw_bcn_pkt_info {
446*4882a593Smuzhiyun 	struct rtw_phl_stainfo_t *sta;
447*4882a593Smuzhiyun 	u64 tsf;
448*4882a593Smuzhiyun 	u64 hw_tsf;
449*4882a593Smuzhiyun };
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun struct rtw_rts_threshold {
452*4882a593Smuzhiyun 	u16 rts_time_th;
453*4882a593Smuzhiyun 	u16 rts_len_th;
454*4882a593Smuzhiyun };
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun enum phl_module_id{
457*4882a593Smuzhiyun 	/* 0 ~ 128 PHL background module starts from here*/
458*4882a593Smuzhiyun 	/* 1,2,3 cmd controller section */
459*4882a593Smuzhiyun 	PHL_BK_MDL_START = 0,
460*4882a593Smuzhiyun 	PHL_MDL_PHY_MGNT = 1,
461*4882a593Smuzhiyun 	PHL_MDL_TX = 2,
462*4882a593Smuzhiyun 	PHL_MDL_RX = 3,
463*4882a593Smuzhiyun 
464*4882a593Smuzhiyun 	/* above enum is fixed, add new module id from here*/
465*4882a593Smuzhiyun 	/* 10 ~ 40 protocol, wifi role section*/
466*4882a593Smuzhiyun 	PHL_BK_MDL_ROLE_START = 10,
467*4882a593Smuzhiyun 	PHL_MDL_MRC = 10, /* Multi-Role Controller intead of STA/P2P role /NAN/AP*/
468*4882a593Smuzhiyun 	PHL_MDL_SOUND = 11,
469*4882a593Smuzhiyun 
470*4882a593Smuzhiyun 	PHL_BK_MDL_ROLE_END = 40,
471*4882a593Smuzhiyun 
472*4882a593Smuzhiyun 	/* 41 ~ 70 mandatory background module section*/
473*4882a593Smuzhiyun 	PHL_BK_MDL_MDRY_START = 41,
474*4882a593Smuzhiyun 	PHL_MDL_POWER_MGNT = 41,
475*4882a593Smuzhiyun 	PHL_MDL_SER = 42,
476*4882a593Smuzhiyun 
477*4882a593Smuzhiyun 	PHL_BK_MDL_MDRY_END = 70,
478*4882a593Smuzhiyun 
479*4882a593Smuzhiyun 	/* 70 ~ 127 optional background module section*/
480*4882a593Smuzhiyun 	PHL_BK_MDL_OPT_START = 71,
481*4882a593Smuzhiyun 	PHL_MDL_BTC = 71,
482*4882a593Smuzhiyun 	/*PHL_MDL_RSVD = 72,*/
483*4882a593Smuzhiyun 	PHL_MDL_CUSTOM = 73,
484*4882a593Smuzhiyun 	PHL_MDL_WOW = 74,
485*4882a593Smuzhiyun 	PHL_MDL_PSTS = 75,
486*4882a593Smuzhiyun 	PHL_MDL_LED = 76,
487*4882a593Smuzhiyun 	PHL_MDL_GENERAL = 77,
488*4882a593Smuzhiyun 	PHL_MDL_REGU = 78,
489*4882a593Smuzhiyun 
490*4882a593Smuzhiyun 	PHL_BK_MDL_OPT_END = 127,
491*4882a593Smuzhiyun 
492*4882a593Smuzhiyun 	/* Fixed BK MDL Max Value*/
493*4882a593Smuzhiyun 	PHL_BK_MDL_END = 128,
494*4882a593Smuzhiyun 
495*4882a593Smuzhiyun 	/* 129 ~ 256 PHL foreground module starts from here*/
496*4882a593Smuzhiyun 	PHL_FG_MDL_START = 129,
497*4882a593Smuzhiyun 	PHL_FUNC_MDL_TEST_MODULE = 129,
498*4882a593Smuzhiyun 	PHL_FG_MDL_SCAN = 130,
499*4882a593Smuzhiyun 	PHL_FG_MDL_CONNECT = 131,
500*4882a593Smuzhiyun 	PHL_FG_MDL_DISCONNECT = 132,
501*4882a593Smuzhiyun 	PHL_FG_MDL_AP_START = 133,
502*4882a593Smuzhiyun 	PHL_FG_MDL_AP_STOP = 134,
503*4882a593Smuzhiyun 	PHL_FG_MDL_ECSA = 135,
504*4882a593Smuzhiyun 	PHL_FG_MDL_END = 254,
505*4882a593Smuzhiyun 
506*4882a593Smuzhiyun 	/* Fixed MDL Max Value*/
507*4882a593Smuzhiyun 	PHL_MDL_ID_MAX = 255
508*4882a593Smuzhiyun };
509*4882a593Smuzhiyun 
510*4882a593Smuzhiyun /* General phl event id shall share this common enum definition
511*4882a593Smuzhiyun  * if definition of private events for a specific module is required,
512*4882a593Smuzhiyun  * please be sure to start its enum from PRIVATE_EVT_START(0x8000)
513*4882a593Smuzhiyun  */
514*4882a593Smuzhiyun enum phl_msg_evt_id {
515*4882a593Smuzhiyun 	MSG_EVT_NONE = 0,
516*4882a593Smuzhiyun 	MSG_EVT_PHY_ON = 1,
517*4882a593Smuzhiyun 	MSG_EVT_PHY_IDLE = 2,
518*4882a593Smuzhiyun 	MSG_EVT_SCAN_START = 3,
519*4882a593Smuzhiyun 	MSG_EVT_SCAN_END = 4,
520*4882a593Smuzhiyun 	MSG_EVT_CONNECT_START = 5,
521*4882a593Smuzhiyun 	MSG_EVT_CONNECT_LINKED = 6,
522*4882a593Smuzhiyun 	MSG_EVT_CONNECT_END = 7,
523*4882a593Smuzhiyun 	MSG_EVT_SER_L1 = 8,
524*4882a593Smuzhiyun 	MSG_EVT_SER_L2 = 9,
525*4882a593Smuzhiyun 	MSG_EVT_FWDL_OK = 10,
526*4882a593Smuzhiyun 	MSG_EVT_FWDL_FAIL = 11,
527*4882a593Smuzhiyun 	MSG_EVT_HAL_INIT_OK = 12,
528*4882a593Smuzhiyun 	MSG_EVT_HAL_INIT_FAIL = 13,
529*4882a593Smuzhiyun 	MSG_EVT_MP_CMD_DONE = 14,
530*4882a593Smuzhiyun 	/* wow */
531*4882a593Smuzhiyun 	MSG_EVT_WOW_ENTER = 15,
532*4882a593Smuzhiyun 	MSG_EVT_WOW_LEAVE = 16,
533*4882a593Smuzhiyun 	MSG_EVT_WOW_WAKE_RSN = 17,
534*4882a593Smuzhiyun 	MSG_EVT_BCN_RESEND = 18,
535*4882a593Smuzhiyun 	MSG_EVT_DUMP_PLE_BUFFER = 19,
536*4882a593Smuzhiyun 	MSG_EVT_MP_RX_PHYSTS = 20,
537*4882a593Smuzhiyun 	MSG_EVT_ROLE_NTFY = 21,
538*4882a593Smuzhiyun 	MSG_EVT_RX_PSTS = 22,
539*4882a593Smuzhiyun 	MSG_EVT_SWCH_START = 23,
540*4882a593Smuzhiyun 	MSG_EVT_SWCH_DONE = 24,
541*4882a593Smuzhiyun 	MSG_EVT_DISCONNECT_PREPARE = 25,
542*4882a593Smuzhiyun 	MSG_EVT_DISCONNECT = 26,
543*4882a593Smuzhiyun 	MSG_EVT_TSF_SYNC_DONE = 27,
544*4882a593Smuzhiyun 	MSG_EVT_TX_RESUME = 28,
545*4882a593Smuzhiyun 	MSG_EVT_AP_START_PREPARE =29,
546*4882a593Smuzhiyun 	MSG_EVT_AP_START = 30,
547*4882a593Smuzhiyun 	MSG_EVT_AP_START_END = 31,
548*4882a593Smuzhiyun 	MSG_EVT_AP_STOP_PREPARE = 32,
549*4882a593Smuzhiyun 	MSG_EVT_AP_STOP = 33,
550*4882a593Smuzhiyun 	MSG_EVT_PCIE_TRX_MIT = 34,
551*4882a593Smuzhiyun 	MSG_EVT_BTC_TMR = 35,
552*4882a593Smuzhiyun 	MSG_EVT_BTC_FWEVNT = 36,
553*4882a593Smuzhiyun 	MSG_EVT_BTC_REQ_BT_SLOT = 37,
554*4882a593Smuzhiyun 	MSG_EVT_BTC_PKT_EVT_NTFY = 38,
555*4882a593Smuzhiyun 	/* ser*/
556*4882a593Smuzhiyun 	MSG_EVT_SER_L0_RESET = 39,		/* L0 notify only */
557*4882a593Smuzhiyun 	MSG_EVT_SER_M1_PAUSE_TRX = 40,
558*4882a593Smuzhiyun 	MSG_EVT_SER_IO_TIMER_EXPIRE = 41,
559*4882a593Smuzhiyun 	MSG_EVT_SER_FW_TIMER_EXPIRE = 42,
560*4882a593Smuzhiyun 	MSG_EVT_SER_M3_DO_RECOV = 43,
561*4882a593Smuzhiyun 	MSG_EVT_SER_M5_READY = 44,
562*4882a593Smuzhiyun 	MSG_EVT_SER_M9_L2_RESET = 45,
563*4882a593Smuzhiyun 	MSG_EVT_SER_EVENT_CHK = 46,
564*4882a593Smuzhiyun 	MSG_EVT_SER_POLLING_CHK = 47,
565*4882a593Smuzhiyun 	MSG_EVT_ECSA_START = 48,
566*4882a593Smuzhiyun 	MSG_EVT_ECSA_UPDATE_FIRST_BCN_DONE = 49,
567*4882a593Smuzhiyun 	MSG_EVT_ECSA_COUNT_DOWN = 50,
568*4882a593Smuzhiyun 	MSG_EVT_ECSA_SWITCH_START = 51,
569*4882a593Smuzhiyun 	MSG_EVT_ECSA_SWITCH_DONE = 52,
570*4882a593Smuzhiyun 	MSG_EVT_ECSA_CHECK_TX_RESUME = 53,
571*4882a593Smuzhiyun 	MSG_EVT_ECSA_DONE = 54,
572*4882a593Smuzhiyun 	MSG_EVT_LISTEN_STATE_EXPIRE = 55,
573*4882a593Smuzhiyun 	/* beamform */
574*4882a593Smuzhiyun 	MSG_EVT_SET_VHT_GID = 56,
575*4882a593Smuzhiyun 	MSG_EVT_HW_WATCHDOG = 57,
576*4882a593Smuzhiyun 	MSG_EVT_DEV_CANNOT_IO = 58,
577*4882a593Smuzhiyun 	MSG_EVT_DEV_RESUME_IO = 59,
578*4882a593Smuzhiyun 	MSG_EVT_FORCE_USB_SW = 60,
579*4882a593Smuzhiyun 	MSG_EVT_GET_USB_SPEED = 61,
580*4882a593Smuzhiyun 	MSG_EVT_GET_USB_SW_ABILITY = 62,
581*4882a593Smuzhiyun 	MSG_EVT_CFG_AMPDU = 63,
582*4882a593Smuzhiyun 	MSG_EVT_DFS_PAUSE_TX = 64,
583*4882a593Smuzhiyun 	MSG_EVT_ROLE_RECOVER = 65,
584*4882a593Smuzhiyun 	MSG_EVT_ROLE_SUSPEND = 66,
585*4882a593Smuzhiyun 	MSG_EVT_HAL_SET_L2_LEAVE = 67,
586*4882a593Smuzhiyun 	MSG_EVT_NOTIFY_HAL = 68,
587*4882a593Smuzhiyun 	MSG_EVT_ISSUE_BCN = 69,
588*4882a593Smuzhiyun 	MSG_EVT_FREE_BCN = 70,
589*4882a593Smuzhiyun 	MSG_EVT_STOP_BCN = 71,
590*4882a593Smuzhiyun 	MSG_EVT_SEC_KEY = 72,
591*4882a593Smuzhiyun 	MSG_EVT_ROLE_START = 73,
592*4882a593Smuzhiyun 	MSG_EVT_ROLE_CHANGE = 74,
593*4882a593Smuzhiyun 	MSG_EVT_ROLE_STOP = 75,
594*4882a593Smuzhiyun 	MSG_EVT_STA_INFO_CTRL = 76,
595*4882a593Smuzhiyun 	MSG_EVT_STA_MEDIA_STATUS_UPT = 77,
596*4882a593Smuzhiyun 	MSG_EVT_CFG_CHINFO = 78,
597*4882a593Smuzhiyun 	MSG_EVT_STA_CHG_STAINFO = 79,
598*4882a593Smuzhiyun 	MSG_EVT_HW_TRX_RST_RESUME = 80,
599*4882a593Smuzhiyun 	MSG_EVT_HW_TRX_PAUSE = 81,
600*4882a593Smuzhiyun 	MSG_EVT_SW_TX_RESUME = 82,
601*4882a593Smuzhiyun 	MSG_EVT_SW_RX_RESUME = 83,
602*4882a593Smuzhiyun 	MSG_EVT_SW_TX_PAUSE = 84,
603*4882a593Smuzhiyun 	MSG_EVT_SW_RX_PAUSE = 85,
604*4882a593Smuzhiyun 	MSG_EVT_SW_TX_RESET = 86,
605*4882a593Smuzhiyun 	MSG_EVT_SW_RX_RESET = 87,
606*4882a593Smuzhiyun 	MSG_EVT_TRX_SW_PAUSE = 88,
607*4882a593Smuzhiyun 	MSG_EVT_TRX_SW_RESUME = 89,
608*4882a593Smuzhiyun 	MSG_EVT_TRX_PAUSE_W_RST = 90,
609*4882a593Smuzhiyun 	MSG_EVT_TRX_RESUME_W_RST = 91,
610*4882a593Smuzhiyun 	/* Regulation*/
611*4882a593Smuzhiyun 	MSG_EVT_REGU_SET_DOMAIN = 92,
612*4882a593Smuzhiyun 	MSG_EVT_RF_ON = 93,
613*4882a593Smuzhiyun 	MSG_EVT_RF_OFF = 94,
614*4882a593Smuzhiyun 	MSG_EVT_WPS_PRESSED = 95,
615*4882a593Smuzhiyun 	MSG_EVT_WPS_RELEASED = 96,
616*4882a593Smuzhiyun 	MSG_EVT_SURPRISE_REMOVE = 97,
617*4882a593Smuzhiyun 	MSG_EVT_DATA_PATH_START = 98,
618*4882a593Smuzhiyun 	MSG_EVT_DATA_PATH_STOP = 99,
619*4882a593Smuzhiyun 	MSG_EVT_TRX_PWR_REQ = 100,
620*4882a593Smuzhiyun 	/* tdls */
621*4882a593Smuzhiyun 	MSG_EVT_TDLS_SYNC = 101,
622*4882a593Smuzhiyun 	/* beamformee */
623*4882a593Smuzhiyun 	MSG_EVT_SET_BFEE_AID = 102,
624*4882a593Smuzhiyun 	/* ccx */
625*4882a593Smuzhiyun 	MSG_EVT_CCX_REPORT_TX_OK = 103,
626*4882a593Smuzhiyun 	MSG_EVT_CCX_REPORT_TX_FAIL = 104,
627*4882a593Smuzhiyun 	/* ps */
628*4882a593Smuzhiyun 	MSG_EVT_PS_CAP_CHG = 105,
629*4882a593Smuzhiyun 	MSG_EVT_PS_PERIOD_CHK = 106,
630*4882a593Smuzhiyun 	MSG_EVT_PS_DBG_LPS_ENTER = 107,
631*4882a593Smuzhiyun 	MSG_EVT_PS_DBG_LPS_LEAVE = 108,
632*4882a593Smuzhiyun 	MSG_EVT_PS_DBG_IPS_ENTER = 109,
633*4882a593Smuzhiyun 	MSG_EVT_PS_DBG_IPS_LEAVE = 110,
634*4882a593Smuzhiyun 	/* Change operating ch def(ch / bw) */
635*4882a593Smuzhiyun 	MSG_EVT_CHG_OP_CH_DEF_START = 111,
636*4882a593Smuzhiyun 	MSG_EVT_CHG_OP_CH_DEF_END = 112,
637*4882a593Smuzhiyun 	MSG_EVT_MDL_CHECK_STOP = 113,
638*4882a593Smuzhiyun 	MSG_EVT_HW_RF_CHG = 114,
639*4882a593Smuzhiyun 
640*4882a593Smuzhiyun 	MSG_EVT_TX_PKT_NTFY = 115,
641*4882a593Smuzhiyun 	MSG_EVT_SW_WATCHDOG = 116,
642*4882a593Smuzhiyun 	/* ltr */
643*4882a593Smuzhiyun 	MSG_EVT_LTR_TX_DLY = 199,
644*4882a593Smuzhiyun 	/* dbg */
645*4882a593Smuzhiyun 	MSG_EVT_DBG_SIP_REG_DUMP = 200,
646*4882a593Smuzhiyun 	MSG_EVT_DBG_FULL_REG_DUMP = 201,
647*4882a593Smuzhiyun 	MSG_EVT_DBG_L2_DIAGNOSE = 202,
648*4882a593Smuzhiyun 	MSG_EVT_DBG_RX_DUMP = 203,
649*4882a593Smuzhiyun 	MSG_EVT_DBG_TX_DUMP = 204,
650*4882a593Smuzhiyun 	/* dbg end */
651*4882a593Smuzhiyun 	/* p2pps */
652*4882a593Smuzhiyun 	MSG_EVT_TSF32_TOG = 205,
653*4882a593Smuzhiyun 	/* p2pps end */
654*4882a593Smuzhiyun 	/*Add EVT-ID for linux core cmd temporality*/
655*4882a593Smuzhiyun 
656*4882a593Smuzhiyun 	/* sub module IO */
657*4882a593Smuzhiyun 	MSG_EVT_NOTIFY_BB = 300,
658*4882a593Smuzhiyun 	MSG_EVT_NOTIFY_RF = 301,
659*4882a593Smuzhiyun 	MSG_EVT_NOTIFY_MAC = 302,
660*4882a593Smuzhiyun 	/* sub module IO end*/
661*4882a593Smuzhiyun 
662*4882a593Smuzhiyun 	MSG_EVT_LINUX_CMD_WRK = 888,
663*4882a593Smuzhiyun 	MSG_EVT_LINUX_CMD_WRK_TRI_PS = 889,
664*4882a593Smuzhiyun 	/* LED */
665*4882a593Smuzhiyun 	MSG_EVT_LED_TICK = 5000,
666*4882a593Smuzhiyun 	MSG_EVT_LED_EVT_START = 5001,
667*4882a593Smuzhiyun 	MSG_EVT_LED_EVT_END = 5050,
668*4882a593Smuzhiyun 	MSG_EVT_MAX = 0x7fff
669*4882a593Smuzhiyun };
670*4882a593Smuzhiyun 
671*4882a593Smuzhiyun 
672*4882a593Smuzhiyun 
673*4882a593Smuzhiyun enum phl_msg_recver_layer {
674*4882a593Smuzhiyun 	MSG_RECV_PHL = 0,
675*4882a593Smuzhiyun 	MSG_RECV_CORE = 1,
676*4882a593Smuzhiyun 	MSG_RECV_MAX
677*4882a593Smuzhiyun };
678*4882a593Smuzhiyun 
679*4882a593Smuzhiyun enum phl_msg_indicator {
680*4882a593Smuzhiyun 	MSG_INDC_PRE_PHASE = BIT0,
681*4882a593Smuzhiyun 	MSG_INDC_FAIL = BIT1,
682*4882a593Smuzhiyun 	MSG_INDC_CANCEL = BIT2,
683*4882a593Smuzhiyun 	MSG_INDC_CANNOT_IO = BIT3
684*4882a593Smuzhiyun };
685*4882a593Smuzhiyun 
686*4882a593Smuzhiyun enum phl_msg_opt {
687*4882a593Smuzhiyun 	MSG_OPT_SKIP_NOTIFY_OPT_MDL = BIT0,
688*4882a593Smuzhiyun 	MSG_OPT_BLIST_PRESENT = BIT1,
689*4882a593Smuzhiyun 	MSG_OPT_CLR_SNDR_MSG_IF_PENDING = BIT2,
690*4882a593Smuzhiyun 	MSG_OPT_SEND_IN_ABORT = BIT3,
691*4882a593Smuzhiyun 	MSG_OPT_PENDING_DURING_CANNOT_IO = BIT4,
692*4882a593Smuzhiyun };
693*4882a593Smuzhiyun 
694*4882a593Smuzhiyun 
695*4882a593Smuzhiyun /* all module share this common enum definition */
696*4882a593Smuzhiyun enum phy_bk_module_opcode {
697*4882a593Smuzhiyun 	BK_MODL_OP_NONE = 0,
698*4882a593Smuzhiyun 	BK_MODL_OP_CHK_NEW_MSG,
699*4882a593Smuzhiyun 	BK_MODL_OP_INPUT_CMD,
700*4882a593Smuzhiyun 	BK_MODL_OP_STATE,
701*4882a593Smuzhiyun 	BK_MODL_OP_CUS_SET_ROLE_CAP,
702*4882a593Smuzhiyun 	BK_MODL_OP_CUS_UPDATE_ROLE_CAP,
703*4882a593Smuzhiyun 	BK_MODL_OP_MAX
704*4882a593Smuzhiyun };
705*4882a593Smuzhiyun 
706*4882a593Smuzhiyun /* Foreground cmd token opcode */
707*4882a593Smuzhiyun enum phy_fg_cmd_req_opcode {
708*4882a593Smuzhiyun 	FG_REQ_OP_NONE = 0,
709*4882a593Smuzhiyun 	FG_REQ_OP_GET_ROLE,
710*4882a593Smuzhiyun 	FG_REQ_OP_GET_MDL_ID,
711*4882a593Smuzhiyun #ifdef RTW_WKARD_MRC_ISSUE_NULL_WITH_SCAN_OPS
712*4882a593Smuzhiyun 	FG_REQ_OP_GET_SCAN_PARAM,
713*4882a593Smuzhiyun 	FG_REQ_OP_GET_ISSUE_NULL_OPS,
714*4882a593Smuzhiyun #endif
715*4882a593Smuzhiyun #ifdef RTW_WKARD_CMD_SCAN_EXTEND_ACTIVE_SCAN
716*4882a593Smuzhiyun 	FG_REQ_OP_NOTIFY_BCN_RCV,
717*4882a593Smuzhiyun #endif
718*4882a593Smuzhiyun #ifdef RTW_WKARD_CMD_SCAN_EXTEND_ACTION_FRAME_TX
719*4882a593Smuzhiyun 	FG_REQ_OP_NOTIFY_ACTION_FRAME_TX,
720*4882a593Smuzhiyun #endif
721*4882a593Smuzhiyun 	FG_REQ_OP_MAX
722*4882a593Smuzhiyun };
723*4882a593Smuzhiyun 
724*4882a593Smuzhiyun /* priority of phl background
725*4882a593Smuzhiyun module which would be considered when dispatching phl msg*/
726*4882a593Smuzhiyun enum phl_bk_module_priority {
727*4882a593Smuzhiyun 	PHL_MDL_PRI_ROLE = 0,
728*4882a593Smuzhiyun 	PHL_MDL_PRI_OPTIONAL,
729*4882a593Smuzhiyun 	PHL_MDL_PRI_MANDATORY,
730*4882a593Smuzhiyun 	PHL_MDL_PRI_MAX
731*4882a593Smuzhiyun };
732*4882a593Smuzhiyun 
733*4882a593Smuzhiyun enum phl_data_ctl_cmd {
734*4882a593Smuzhiyun 	PHL_DATA_CTL_HW_TRX_RST_RESUME = 1,
735*4882a593Smuzhiyun 	PHL_DATA_CTL_HW_TRX_PAUSE = 2,
736*4882a593Smuzhiyun 	PHL_DATA_CTL_SW_TX_RESUME = 3,
737*4882a593Smuzhiyun 	PHL_DATA_CTL_SW_RX_RESUME = 4,
738*4882a593Smuzhiyun 	PHL_DATA_CTL_SW_TX_PAUSE = 5,
739*4882a593Smuzhiyun 	PHL_DATA_CTL_SW_RX_PAUSE = 6,
740*4882a593Smuzhiyun 	PHL_DATA_CTL_SW_TX_RESET = 7,
741*4882a593Smuzhiyun 	PHL_DATA_CTL_SW_RX_RESET = 8,
742*4882a593Smuzhiyun 	PHL_DATA_CTL_TRX_SW_PAUSE = 9,
743*4882a593Smuzhiyun 	PHL_DATA_CTL_TRX_SW_RESUME = 10,
744*4882a593Smuzhiyun 	PHL_DATA_CTL_TRX_PAUSE_W_RST = 11,
745*4882a593Smuzhiyun 	PHL_DATA_CTL_TRX_RESUME_W_RST = 12,
746*4882a593Smuzhiyun 	PHL_DATA_CTL_MAX = 0xFF
747*4882a593Smuzhiyun };
748*4882a593Smuzhiyun 
749*4882a593Smuzhiyun /**
750*4882a593Smuzhiyun  * phl_msg - define a general msg format for PHL/CORE layer module to handle
751*4882a593Smuzhiyun  * one can easily extend additional mgnt info by encapsulating inside a file
752*4882a593Smuzhiyun  * refer to
753*4882a593Smuzhiyun  *		struct phl_msg_ex 		in phl_msg_hub.c
754*4882a593Smuzhiyun  *		struct phl_dispr_msg_ex		in phl_cmd_dispatcher.c
755*4882a593Smuzhiyun  *
756*4882a593Smuzhiyun  * @msg_id: indicate msg source & msg type
757*4882a593Smuzhiyun  *	    BYTE 3: RSVD
758*4882a593Smuzhiyun  *	    BYTE 2: PHL Module ID,  refer to enum phl_module_id
759*4882a593Smuzhiyun  *	    BYTE 0-1: event id, refer to enum phl_msg_evt_id
760*4882a593Smuzhiyun  * @inbuf: input buffer that sent along with msg
761*4882a593Smuzhiyun  * @inlen: input buffer length
762*4882a593Smuzhiyun  * @outbuf: output buffer that returned after all phl modules have recved msg.
763*4882a593Smuzhiyun  * @outlen: output buffer length
764*4882a593Smuzhiyun  * @band_idx: index of Band(PHY) which associate to this msg
765*4882a593Smuzhiyun 
766*4882a593Smuzhiyun  * @rsvd: feature reserved, passing object pointer.
767*4882a593Smuzhiyun  *        For example,
768*4882a593Smuzhiyun  *        - cmd_scan : [0]: wifi_role.
769*4882a593Smuzhiyun  *        - CANNOT_IO error: [0]: mdl handle.
770*4882a593Smuzhiyun  */
771*4882a593Smuzhiyun struct phl_msg{
772*4882a593Smuzhiyun 	u32 msg_id;
773*4882a593Smuzhiyun 	enum phl_band_idx band_idx;
774*4882a593Smuzhiyun 	u8* inbuf;
775*4882a593Smuzhiyun 	u8* outbuf;
776*4882a593Smuzhiyun 	u32 inlen;
777*4882a593Smuzhiyun 	u32 outlen;
778*4882a593Smuzhiyun 	void *rsvd[4];
779*4882a593Smuzhiyun };
780*4882a593Smuzhiyun 
781*4882a593Smuzhiyun struct msg_notify_map {
782*4882a593Smuzhiyun 	u8* id_arr;
783*4882a593Smuzhiyun 	u8 len;
784*4882a593Smuzhiyun };
785*4882a593Smuzhiyun struct msg_dispatch_seq {
786*4882a593Smuzhiyun 	struct msg_notify_map map[PHL_MDL_PRI_MAX];
787*4882a593Smuzhiyun };
788*4882a593Smuzhiyun struct msg_self_def_seq {
789*4882a593Smuzhiyun 	struct msg_dispatch_seq pre_prot_phase;
790*4882a593Smuzhiyun 	struct msg_dispatch_seq post_prot_phase;
791*4882a593Smuzhiyun };
792*4882a593Smuzhiyun struct msg_completion_routine {
793*4882a593Smuzhiyun 	void* priv;
794*4882a593Smuzhiyun 	void (*completion)(void* priv, struct phl_msg* msg);
795*4882a593Smuzhiyun };
796*4882a593Smuzhiyun /**
797*4882a593Smuzhiyun  * phl_msg_attribute: used in phl_disp_eng_send_msg
798*4882a593Smuzhiyun  * @opt: refers to enum phl_msg_opt.
799*4882a593Smuzhiyun  * @notify: input id array (refer to enum phl_module_id)
800*4882a593Smuzhiyun  * 	    for indicating additional dependency
801*4882a593Smuzhiyun  * @completion: completion routine
802*4882a593Smuzhiyun  */
803*4882a593Smuzhiyun struct phl_msg_attribute {
804*4882a593Smuzhiyun 	u8 opt;
805*4882a593Smuzhiyun 	struct msg_notify_map notify;
806*4882a593Smuzhiyun 	struct msg_completion_routine completion;
807*4882a593Smuzhiyun #ifdef CONFIG_CMD_DISP_SUPPORT_CUSTOM_SEQ
808*4882a593Smuzhiyun 	void *dispr_attr;
809*4882a593Smuzhiyun #endif
810*4882a593Smuzhiyun };
811*4882a593Smuzhiyun 
812*4882a593Smuzhiyun /**
813*4882a593Smuzhiyun  * phl_module_op_info - set by core layer or phl itself,
814*4882a593Smuzhiyun  * op code process is an synchronous process.
815*4882a593Smuzhiyun  * which would be handled directly by module handler
816*4882a593Smuzhiyun  * @op_code: refer to enum phy_module_opcode
817*4882a593Smuzhiyun  * @inbuf: input buffer that sent along with msg
818*4882a593Smuzhiyun  * @inlen: input buffer length
819*4882a593Smuzhiyun  * @outbuf: output buffer that returned after all phy modules have recved msg.
820*4882a593Smuzhiyun  * @outlen: output buffer length
821*4882a593Smuzhiyun  */
822*4882a593Smuzhiyun struct phl_module_op_info{
823*4882a593Smuzhiyun 	u32 op_code;
824*4882a593Smuzhiyun 	u8* inbuf;
825*4882a593Smuzhiyun 	u8* outbuf;
826*4882a593Smuzhiyun 	u32 inlen;
827*4882a593Smuzhiyun 	u32 outlen;
828*4882a593Smuzhiyun };
829*4882a593Smuzhiyun 
830*4882a593Smuzhiyun /**
831*4882a593Smuzhiyun  * phl_cmd_token_req - request foramt for applying token of a specific cmd
832*4882a593Smuzhiyun  * dispatcher.
833*4882a593Smuzhiyun  * cmd token request is regarded as foreground module, thus,
834*4882a593Smuzhiyun  * need to contend for cmd token.
835*4882a593Smuzhiyun  * Normally, these req would be linked to a specific wifi role
836*4882a593Smuzhiyun  * and acquiring RF resource for a specific task.
837*4882a593Smuzhiyun  *
838*4882a593Smuzhiyun  * @module_id: starting from PHL_FG_MDL_START
839*4882a593Smuzhiyun  * @priv: private context from requestor
840*4882a593Smuzhiyun  * @role: designated role info associated with current request.
841*4882a593Smuzhiyun  * -----------------------------------------
842*4882a593Smuzhiyun  * regarding on "return code" for following ops, refer to enum phl_mdl_ret_code
843*4882a593Smuzhiyun  * -----------------------------------------
844*4882a593Smuzhiyun  * @acquired: notify requestor when cmd token has acquired for this cmd and
845*4882a593Smuzhiyun               cannot have any I/O operation.
846*4882a593Smuzhiyun  * @abort: notify requestor when cmd has been canceled
847*4882a593Smuzhiyun            after calling rtw_phl_phy_cancel_token_req and
848*4882a593Smuzhiyun            cannot have any I/O operation.
849*4882a593Smuzhiyun  * @msg_hdlr: notify requestor about incoming msg.
850*4882a593Smuzhiyun  * @set_info: notify requestor to handle specific op code.
851*4882a593Smuzhiyun  * @query_info: notify requestor to handle specific op code.
852*4882a593Smuzhiyun  */
853*4882a593Smuzhiyun 
854*4882a593Smuzhiyun struct phl_cmd_token_req{
855*4882a593Smuzhiyun 	u8 module_id;
856*4882a593Smuzhiyun 	void* priv;
857*4882a593Smuzhiyun 	void* role;
858*4882a593Smuzhiyun 	enum phl_mdl_ret_code (*acquired)(void* dispr, void* priv);
859*4882a593Smuzhiyun 	enum phl_mdl_ret_code (*abort)(void* dispr, void* priv);
860*4882a593Smuzhiyun 	enum phl_mdl_ret_code (*msg_hdlr)(void* dispr, void* priv,
861*4882a593Smuzhiyun 							struct phl_msg* msg);
862*4882a593Smuzhiyun 	enum phl_mdl_ret_code (*set_info)(void* dispr, void* priv,
863*4882a593Smuzhiyun 					struct phl_module_op_info* info);
864*4882a593Smuzhiyun 	enum phl_mdl_ret_code (*query_info)(void* dispr, void* priv,
865*4882a593Smuzhiyun 				struct phl_module_op_info* info);
866*4882a593Smuzhiyun };
867*4882a593Smuzhiyun /**
868*4882a593Smuzhiyun  * phl_module_ops - standard interface for interacting with a cmd dispatcher.
869*4882a593Smuzhiyun  * -----------------------------------------
870*4882a593Smuzhiyun  * regarding on "return code" for following ops, refer to enum phl_mdl_ret_code
871*4882a593Smuzhiyun  * -----------------------------------------
872*4882a593Smuzhiyun  * @init: notify module for initialization.
873*4882a593Smuzhiyun  * @deinit: notify module for de-initialization.
874*4882a593Smuzhiyun  * @start: notify module to start.
875*4882a593Smuzhiyun  * @stop: notify module to stop.
876*4882a593Smuzhiyun  * @msg_hdlr: notify module about incoming msg.
877*4882a593Smuzhiyun  * @set_info: notify module to handle specific op code.
878*4882a593Smuzhiyun  * @query_info: notify module to handle specific op code.
879*4882a593Smuzhiyun  */
880*4882a593Smuzhiyun struct phl_bk_module_ops {
881*4882a593Smuzhiyun 	enum phl_mdl_ret_code (*init)(void* phl_info, void* dispr, void** priv);
882*4882a593Smuzhiyun 	void (*deinit)(void* dispr, void* priv);
883*4882a593Smuzhiyun 	enum phl_mdl_ret_code (*start)(void* dispr, void* priv);
884*4882a593Smuzhiyun 	enum phl_mdl_ret_code (*stop)(void* dispr, void* priv);
885*4882a593Smuzhiyun 	enum phl_mdl_ret_code (*msg_hdlr)(void* dispr, void* priv,
886*4882a593Smuzhiyun 							struct phl_msg* msg);
887*4882a593Smuzhiyun 	enum phl_mdl_ret_code (*set_info)(void* dispr, void* priv,
888*4882a593Smuzhiyun 			struct phl_module_op_info* info);
889*4882a593Smuzhiyun 	enum phl_mdl_ret_code (*query_info)(void* dispr, void* priv,
890*4882a593Smuzhiyun 			struct phl_module_op_info* info);
891*4882a593Smuzhiyun };
892*4882a593Smuzhiyun 
893*4882a593Smuzhiyun /**
894*4882a593Smuzhiyun  * phl_data_ctl_t - datapath control parameters for dispatcher controller
895*4882a593Smuzhiyun  * @cmd: data path control command
896*4882a593Smuzhiyun  * @id: module id which request data path control
897*4882a593Smuzhiyun  */
898*4882a593Smuzhiyun struct phl_data_ctl_t {
899*4882a593Smuzhiyun 	enum phl_data_ctl_cmd cmd;
900*4882a593Smuzhiyun 	enum phl_module_id id;
901*4882a593Smuzhiyun };
902*4882a593Smuzhiyun 
903*4882a593Smuzhiyun #define MSG_MDL_ID_FIELD(_msg_id) (((_msg_id) >> 16) & 0xFF)
904*4882a593Smuzhiyun #define MSG_EVT_ID_FIELD(_msg_id) ((_msg_id) & 0xFFFF)
905*4882a593Smuzhiyun #define MSG_INDC_FIELD(_msg_id) (((_msg_id) >> 24) & 0xFF)
906*4882a593Smuzhiyun #define IS_PRIVATE_MSG(_msg_id) ((_msg_id) & PRIVATE_EVT_START)
907*4882a593Smuzhiyun #define IS_MSG_FAIL(_msg_id) ((_msg_id) & ( MSG_INDC_FAIL <<  24))
908*4882a593Smuzhiyun #define IS_MSG_IN_PRE_PHASE(_msg_id) ((_msg_id) & ( MSG_INDC_PRE_PHASE <<  24))
909*4882a593Smuzhiyun #define IS_MSG_CANCEL(_msg_id) ((_msg_id) & ( MSG_INDC_CANCEL <<  24))
910*4882a593Smuzhiyun #define IS_MSG_CANNOT_IO(_msg_id) ((_msg_id) & ( MSG_INDC_CANNOT_IO <<  24))
911*4882a593Smuzhiyun #define SET_MSG_MDL_ID_FIELD(_msg_id, _id) \
912*4882a593Smuzhiyun 	((_msg_id) = (((_msg_id) & 0xFF00FFFF) | ((u32)(_id) << 16)))
913*4882a593Smuzhiyun #define SET_MSG_EVT_ID_FIELD(_msg_id, _id) \
914*4882a593Smuzhiyun 	((_msg_id) = (((_msg_id) & 0xFFFF0000) | (_id)))
915*4882a593Smuzhiyun #define SET_MSG_INDC_FIELD(_msg_id, _indc) \
916*4882a593Smuzhiyun 	((_msg_id) = (((_msg_id) & ~((u32)(_indc) << 24))|((u32)(_indc) << 24)))
917*4882a593Smuzhiyun #define CLEAR_MSG_INDC_FIELD(_msg_id, _indc) ((_msg_id) &= ~((_indc) << 24))
918*4882a593Smuzhiyun 
919*4882a593Smuzhiyun #ifdef CONFIG_PHL_REDUCE_MEM
920*4882a593Smuzhiyun #define RTW_MAX_FW_SIZE 0x100000
921*4882a593Smuzhiyun #else
922*4882a593Smuzhiyun #define RTW_MAX_FW_SIZE 0x400000
923*4882a593Smuzhiyun #endif
924*4882a593Smuzhiyun 
925*4882a593Smuzhiyun enum rtw_fw_src {
926*4882a593Smuzhiyun 	RTW_FW_SRC_INTNAL, /* 0 */
927*4882a593Smuzhiyun 	RTW_FW_SRC_EXTNAL, /* 1 */
928*4882a593Smuzhiyun 	RTW_FW_SRC_MAX
929*4882a593Smuzhiyun };
930*4882a593Smuzhiyun 
931*4882a593Smuzhiyun enum rtw_fw_rsn {
932*4882a593Smuzhiyun 	RTW_FW_RSN_INIT, /* 0 */
933*4882a593Smuzhiyun 	RTW_FW_RSN_SPIC, /* 1 */
934*4882a593Smuzhiyun 	RTW_FW_RSN_LPS, /* 2 */
935*4882a593Smuzhiyun 	RTW_FW_RSN_MCC, /* 3 */
936*4882a593Smuzhiyun 	RTW_FW_RSN_WOW, /* 4 */
937*4882a593Smuzhiyun 	RTW_FW_RSN_MAX
938*4882a593Smuzhiyun };
939*4882a593Smuzhiyun 
940*4882a593Smuzhiyun struct rtw_fw_cap_t {
941*4882a593Smuzhiyun 	enum rtw_fw_src fw_src;
942*4882a593Smuzhiyun 	u32 offload_cap;
943*4882a593Smuzhiyun 	u8 dlram_en;
944*4882a593Smuzhiyun 	u8 dlrom_en;
945*4882a593Smuzhiyun };
946*4882a593Smuzhiyun 
947*4882a593Smuzhiyun #define INVALID_WIFI_ROLE_IDX MAX_WIFI_ROLE_NUMBER
948*4882a593Smuzhiyun #define UNSPECIFIED_ROLE_ID 0xFF
949*4882a593Smuzhiyun #define MAX_SECCAM_NUM_PER_ENTRY 7
950*4882a593Smuzhiyun 
951*4882a593Smuzhiyun /* Role hw TX CAP*/
952*4882a593Smuzhiyun struct role_cap_t {
953*4882a593Smuzhiyun 	enum wlan_mode wmode;
954*4882a593Smuzhiyun 	enum channel_width bw;
955*4882a593Smuzhiyun 	u8 rty_lmt;		/* retry limit for DATA frame, 0xFF: invalid */
956*4882a593Smuzhiyun 	u8 rty_lmt_rts;		/* retry limit for RTS frame, 0xFF: invalid */
957*4882a593Smuzhiyun 
958*4882a593Smuzhiyun 	u8 tx_num_ampdu;
959*4882a593Smuzhiyun 	u8 tx_amsdu_in_ampdu; /*from SW & HW*/
960*4882a593Smuzhiyun 	u8 tx_ampdu_len_exp; /*from  SW & HW*/
961*4882a593Smuzhiyun 	u8 tx_htc;
962*4882a593Smuzhiyun 	u8 tx_sgi;
963*4882a593Smuzhiyun 
964*4882a593Smuzhiyun 	u8 tx_ht_ldpc:1;
965*4882a593Smuzhiyun 	u8 tx_vht_ldpc:1;
966*4882a593Smuzhiyun 	u8 tx_he_ldpc:1;
967*4882a593Smuzhiyun 	u8 tx_ht_stbc:1;
968*4882a593Smuzhiyun 	u8 tx_vht_stbc:1;
969*4882a593Smuzhiyun 	u8 tx_he_stbc:1;
970*4882a593Smuzhiyun 
971*4882a593Smuzhiyun 	u8 supported_rates[12];
972*4882a593Smuzhiyun };
973*4882a593Smuzhiyun 
974*4882a593Smuzhiyun struct role_sw_cap_t {
975*4882a593Smuzhiyun 	u16 bf_cap; /* use define : HW_CAP_BFER_XX_XX */
976*4882a593Smuzhiyun 	u16 stbc_cap;/* use define: HW_CAP_STBC_XX */
977*4882a593Smuzhiyun };
978*4882a593Smuzhiyun 
979*4882a593Smuzhiyun /*
980*4882a593Smuzhiyun Protocol - RX CAP from 80211 PKT,
981*4882a593Smuzhiyun driver TX related function need to
982*4882a593Smuzhiyun reference __rx__ of rtw_phl_stainfo_t->asoc_cap
983*4882a593Smuzhiyun */
984*4882a593Smuzhiyun struct protocol_cap_t {
985*4882a593Smuzhiyun 	/* MAC related */
986*4882a593Smuzhiyun 	u16 bcn_interval;	/* beacon interval */
987*4882a593Smuzhiyun 	u8 num_ampdu;
988*4882a593Smuzhiyun 	u8 ampdu_density:3;	/* rx ampdu cap */
989*4882a593Smuzhiyun 	u8 ampdu_len_exp; /* rx ampdu cap */
990*4882a593Smuzhiyun 	u8 amsdu_in_ampdu:1; /* rx ampdu cap */
991*4882a593Smuzhiyun 	u8 max_amsdu_len:2; /* 0: 4k, 1: 8k, 2: 11k */
992*4882a593Smuzhiyun 	u8 htc_rx:1;
993*4882a593Smuzhiyun 	u8 sm_ps:2;
994*4882a593Smuzhiyun 	u8 trig_padding:2;
995*4882a593Smuzhiyun 	u8 twt:6;
996*4882a593Smuzhiyun 	u8 all_ack:1;
997*4882a593Smuzhiyun 	u8 a_ctrl:4;
998*4882a593Smuzhiyun 	u8 ops:1;
999*4882a593Smuzhiyun 	u8 ht_vht_trig_rx:1;
1000*4882a593Smuzhiyun 	u8 bsscolor;
1001*4882a593Smuzhiyun 	u16 rts_th:10;
1002*4882a593Smuzhiyun 
1003*4882a593Smuzhiyun 	u8 short_slot:1;	/* Short Slot Time */
1004*4882a593Smuzhiyun 
1005*4882a593Smuzhiyun 	u8 preamble:1;		/* Preamble, 0: long, 1: short */
1006*4882a593Smuzhiyun 	u8 sgi_20:1;		/* HT Short GI for 20 MHz */
1007*4882a593Smuzhiyun 	u8 sgi_40:1;		/* HT Short GI for 40 MHz */
1008*4882a593Smuzhiyun 	u8 sgi_80:1;		/* VHT Short GI for 80 MHz */
1009*4882a593Smuzhiyun 	u8 sgi_160:1;		/* VHT Short GI for 160/80+80 MHz */
1010*4882a593Smuzhiyun 	struct rtw_edca_param edca[4]; 	/* Access Category, 0:BE, 1:BK, 2:VI, 3:VO */
1011*4882a593Smuzhiyun 	u8 mu_qos_info;
1012*4882a593Smuzhiyun 	struct rtw_mu_edca_param mu_edca[4];
1013*4882a593Smuzhiyun 
1014*4882a593Smuzhiyun 	/* BB related */
1015*4882a593Smuzhiyun 	u8 ht_ldpc:1;
1016*4882a593Smuzhiyun 	u8 vht_ldpc:1;
1017*4882a593Smuzhiyun 	u8 he_ldpc:1;
1018*4882a593Smuzhiyun 	u8 he_su_bfmr:1;
1019*4882a593Smuzhiyun 	u8 he_su_bfme:1;
1020*4882a593Smuzhiyun 	u8 he_mu_bfmr:1;
1021*4882a593Smuzhiyun 	u8 he_mu_bfme:1;
1022*4882a593Smuzhiyun 	u8 bfme_sts:3;
1023*4882a593Smuzhiyun 	u8 num_snd_dim:3;
1024*4882a593Smuzhiyun 
1025*4882a593Smuzhiyun 	u8 ht_su_bfmr:1;
1026*4882a593Smuzhiyun 	u8 ht_su_bfme:1;
1027*4882a593Smuzhiyun 	u8 vht_su_bfmr:1;
1028*4882a593Smuzhiyun 	u8 vht_su_bfme:1;
1029*4882a593Smuzhiyun 	u8 vht_mu_bfmr:1;
1030*4882a593Smuzhiyun 	u8 vht_mu_bfme:1;
1031*4882a593Smuzhiyun 	u8 ht_vht_ng:2;
1032*4882a593Smuzhiyun 	u8 ht_vht_cb:2;
1033*4882a593Smuzhiyun 	/*
1034*4882a593Smuzhiyun 	 * supported_rates: Supported data rate of CCK/OFDM.
1035*4882a593Smuzhiyun 	 * The rate definition follow Wi-Fi spec, unit is 500kb/s,
1036*4882a593Smuzhiyun 	 * and the MSB(bit 7) represent basic rate.
1037*4882a593Smuzhiyun 	 * ex. CCK 2Mbps not basic rate is encoded as 0x04,
1038*4882a593Smuzhiyun 	 *     and OFDM 6M basic rate is encoded as 0x8c.
1039*4882a593Smuzhiyun 	 * Suppose rates come from Supported Rates and Extended Supported
1040*4882a593Smuzhiyun 	 * Rates IE.
1041*4882a593Smuzhiyun 	 * Value 0 means it is end of array, and no more valid data rate follow.
1042*4882a593Smuzhiyun 	 */
1043*4882a593Smuzhiyun 	u8 supported_rates[12];
1044*4882a593Smuzhiyun 	u8 ht_rx_mcs[4];
1045*4882a593Smuzhiyun 	u8 ht_tx_mcs[4];
1046*4882a593Smuzhiyun 	u8 ht_basic_mcs[4];	/* Basic rate of HT */
1047*4882a593Smuzhiyun 	u8 vht_rx_mcs[2];
1048*4882a593Smuzhiyun 	u8 vht_tx_mcs[2];
1049*4882a593Smuzhiyun 	u8 vht_basic_mcs[2];	/* Basic rate of VHT */
1050*4882a593Smuzhiyun 	u8 he_rx_mcs[6];/*80,160,80+80*/
1051*4882a593Smuzhiyun 	u8 he_tx_mcs[6];/*80,160,80+80*/
1052*4882a593Smuzhiyun 	u8 he_basic_mcs[2];	/* Basic rate of HE */
1053*4882a593Smuzhiyun 	u8 stbc_ht_rx:2;
1054*4882a593Smuzhiyun 	u8 stbc_vht_rx:3;
1055*4882a593Smuzhiyun 	u8 stbc_he_rx:1;
1056*4882a593Smuzhiyun 	u8 stbc_tx:1;
1057*4882a593Smuzhiyun 	u8 stbc_ht_tx:1;
1058*4882a593Smuzhiyun 	u8 stbc_vht_tx:1;
1059*4882a593Smuzhiyun 	u8 stbc_he_tx:1;
1060*4882a593Smuzhiyun 	u8 ltf_gi;
1061*4882a593Smuzhiyun 	u8 doppler_tx:1;
1062*4882a593Smuzhiyun 	u8 doppler_rx:1;
1063*4882a593Smuzhiyun 	u8 dcm_max_const_tx:2;
1064*4882a593Smuzhiyun 	u8 dcm_max_nss_tx:1;
1065*4882a593Smuzhiyun 	u8 dcm_max_const_rx:2;
1066*4882a593Smuzhiyun 	u8 dcm_max_nss_rx:1;
1067*4882a593Smuzhiyun 	u8 partial_bw_su_in_mu:1;
1068*4882a593Smuzhiyun 	u8 bfme_sts_greater_80mhz:3;
1069*4882a593Smuzhiyun 	u8 num_snd_dim_greater_80mhz:3;
1070*4882a593Smuzhiyun 	u8 stbc_tx_greater_80mhz:1;
1071*4882a593Smuzhiyun 	u8 stbc_rx_greater_80mhz:1;
1072*4882a593Smuzhiyun 	u8 ng_16_su_fb:1;
1073*4882a593Smuzhiyun 	u8 ng_16_mu_fb:1;
1074*4882a593Smuzhiyun 	u8 cb_sz_su_fb:1;
1075*4882a593Smuzhiyun 	u8 cb_sz_mu_fb:1;
1076*4882a593Smuzhiyun 	u8 trig_su_bfm_fb:1;
1077*4882a593Smuzhiyun 	u8 trig_mu_bfm_fb:1;
1078*4882a593Smuzhiyun 	u8 trig_cqi_fb:1;
1079*4882a593Smuzhiyun 	u8 partial_bw_su_er:1;
1080*4882a593Smuzhiyun 	u8 pkt_padding:2;
1081*4882a593Smuzhiyun 	u8 ppe_thr[8][4];
1082*4882a593Smuzhiyun 	u8 pwr_bst_factor:1;
1083*4882a593Smuzhiyun 	u8 max_nc:3;
1084*4882a593Smuzhiyun 	u8 dcm_max_ru:2;
1085*4882a593Smuzhiyun 	u8 long_sigb_symbol:1;
1086*4882a593Smuzhiyun 	u8 non_trig_cqi_fb:1;
1087*4882a593Smuzhiyun 	u8 tx_1024q_ru:1;
1088*4882a593Smuzhiyun 	u8 rx_1024q_ru:1;
1089*4882a593Smuzhiyun 	u8 fbw_su_using_mu_cmprs_sigb:1;
1090*4882a593Smuzhiyun 	u8 fbw_su_using_mu_non_cmprs_sigb:1;
1091*4882a593Smuzhiyun 	u8 er_su:1;
1092*4882a593Smuzhiyun 	u8 tb_pe:3;
1093*4882a593Smuzhiyun 	u16 txop_du_rts_th;
1094*4882a593Smuzhiyun 	u8 he_rx_ndp_4x32:1;
1095*4882a593Smuzhiyun 
1096*4882a593Smuzhiyun 	/* RF related */
1097*4882a593Smuzhiyun 	u8 nss_tx:3;
1098*4882a593Smuzhiyun 	u8 nss_rx:3;
1099*4882a593Smuzhiyun 
1100*4882a593Smuzhiyun 	u8 num_ampdu_bk;
1101*4882a593Smuzhiyun 	u8 cap_option;
1102*4882a593Smuzhiyun };
1103*4882a593Smuzhiyun 
1104*4882a593Smuzhiyun #define EXT_CAP_LIMIT_2G_RX_STBC	BIT0
1105*4882a593Smuzhiyun 
1106*4882a593Smuzhiyun 
1107*4882a593Smuzhiyun #define LOAD_MAC_REG_FILE				BIT0
1108*4882a593Smuzhiyun #define LOAD_BB_PHY_REG_FILE			BIT1
1109*4882a593Smuzhiyun #define LOAD_BB_PHY_REG_MP_FILE			BIT2
1110*4882a593Smuzhiyun #define LOAD_RF_RADIO_FILE				BIT3
1111*4882a593Smuzhiyun #define LOAD_RF_TXPWR_BY_RATE			BIT4
1112*4882a593Smuzhiyun #define LOAD_RF_TXPWR_TRACK_FILE		BIT5
1113*4882a593Smuzhiyun #define LOAD_RF_TXPWR_LMT_FILE			BIT6
1114*4882a593Smuzhiyun #define LOAD_RF_TXPWR_LMT_RU_FILE		BIT7
1115*4882a593Smuzhiyun #define LOAD_BB_PHY_REG_GAIN_FILE		BIT8
1116*4882a593Smuzhiyun 
1117*4882a593Smuzhiyun #define PHL_UNDEFINED_SW_CAP 0xFF
1118*4882a593Smuzhiyun 
1119*4882a593Smuzhiyun struct rtw_pcie_ltr_lat_ctrl {
1120*4882a593Smuzhiyun 	enum rtw_pcie_bus_func_cap_t ctrl;
1121*4882a593Smuzhiyun 	u32 val;
1122*4882a593Smuzhiyun };
1123*4882a593Smuzhiyun 
1124*4882a593Smuzhiyun enum rtw_pcie_ltr_state {
1125*4882a593Smuzhiyun 	RTW_PCIE_LTR_SW_ACT = 1,
1126*4882a593Smuzhiyun 	RTW_PCIE_LTR_SW_IDLE = 2
1127*4882a593Smuzhiyun };
1128*4882a593Smuzhiyun 
1129*4882a593Smuzhiyun struct rtw_pcie_trx_mit_info_t {
1130*4882a593Smuzhiyun 	u32 tx_timer;
1131*4882a593Smuzhiyun 	u8 tx_counter;
1132*4882a593Smuzhiyun 	u32 rx_timer;
1133*4882a593Smuzhiyun 	u8 rx_counter;
1134*4882a593Smuzhiyun 	u8 fixed_mitigation; /*no watchdog dynamic setting*/
1135*4882a593Smuzhiyun 	void *priv;
1136*4882a593Smuzhiyun };
1137*4882a593Smuzhiyun 
1138*4882a593Smuzhiyun struct bus_sw_cap_t {
1139*4882a593Smuzhiyun #ifdef CONFIG_PCI_HCI
1140*4882a593Smuzhiyun 	enum rtw_pcie_bus_func_cap_t l0s_ctrl;
1141*4882a593Smuzhiyun 	enum rtw_pcie_bus_func_cap_t l1_ctrl;
1142*4882a593Smuzhiyun 	enum rtw_pcie_bus_func_cap_t l1ss_ctrl;
1143*4882a593Smuzhiyun 	enum rtw_pcie_bus_func_cap_t wake_ctrl;
1144*4882a593Smuzhiyun 	enum rtw_pcie_bus_func_cap_t crq_ctrl;
1145*4882a593Smuzhiyun 	u32 txbd_num;
1146*4882a593Smuzhiyun 	u32 rxbd_num;
1147*4882a593Smuzhiyun 	u32 rpbd_num;
1148*4882a593Smuzhiyun 	u32 rxbuf_num;
1149*4882a593Smuzhiyun 	u32 rpbuf_num;
1150*4882a593Smuzhiyun 	u32 read_txbd_lvl; /* 0: always read, 1: < 1/2 tx res, 2: < 1/4 tx res */
1151*4882a593Smuzhiyun 	struct rtw_pcie_trx_mit_info_t mit_ctl;
1152*4882a593Smuzhiyun 	u8 clkdly_ctrl;
1153*4882a593Smuzhiyun 	u8 l0sdly_ctrl;
1154*4882a593Smuzhiyun 	u8 l1dly_ctrl;
1155*4882a593Smuzhiyun 	struct rtw_pcie_ltr_lat_ctrl ltr_act;
1156*4882a593Smuzhiyun 	struct rtw_pcie_ltr_lat_ctrl ltr_idle;
1157*4882a593Smuzhiyun 	u8 ltr_init_state;
1158*4882a593Smuzhiyun 	u16 ltr_sw_ctrl_thre; /* [15:8] tx [7:0] rx */
1159*4882a593Smuzhiyun 	u8 ltr_sw_ctrl;
1160*4882a593Smuzhiyun 	u8 ltr_hw_ctrl;
1161*4882a593Smuzhiyun 	u32 ltr_last_trigger_time;
1162*4882a593Smuzhiyun 	u32 ltr_sw_act_tri_cnt;
1163*4882a593Smuzhiyun 	u32 ltr_sw_idle_tri_cnt;
1164*4882a593Smuzhiyun 	u8 ltr_cur_state;
1165*4882a593Smuzhiyun 	#ifdef RTW_WKARD_GET_PROCESSOR_ID
1166*4882a593Smuzhiyun 	u64 proc_id; /* processor id */
1167*4882a593Smuzhiyun 	#endif
1168*4882a593Smuzhiyun #elif defined (CONFIG_USB_HCI)
1169*4882a593Smuzhiyun 	u32 tx_buf_size;
1170*4882a593Smuzhiyun 	u32 tx_buf_num;
1171*4882a593Smuzhiyun 	u32 tx_mgnt_buf_size;
1172*4882a593Smuzhiyun 	u32 tx_mgnt_buf_num;
1173*4882a593Smuzhiyun 	u32 tx_h2c_buf_num;
1174*4882a593Smuzhiyun 	u32 rx_buf_size;
1175*4882a593Smuzhiyun 	u32 rx_buf_num;
1176*4882a593Smuzhiyun 	u32 in_token_num;
1177*4882a593Smuzhiyun #elif defined(CONFIG_SDIO_HCI)
1178*4882a593Smuzhiyun 	u32 tx_buf_size;
1179*4882a593Smuzhiyun 	u32 tx_buf_num;
1180*4882a593Smuzhiyun 	u32 tx_mgnt_buf_size;
1181*4882a593Smuzhiyun 	u32 tx_mgnt_buf_num;
1182*4882a593Smuzhiyun 	u32 rx_buf_size;
1183*4882a593Smuzhiyun 	u32 rx_buf_num;
1184*4882a593Smuzhiyun #else
1185*4882a593Smuzhiyun 	u8 temp_for_struct_empty; /* for undefined interface */
1186*4882a593Smuzhiyun #endif
1187*4882a593Smuzhiyun };
1188*4882a593Smuzhiyun struct bus_cap_t {
1189*4882a593Smuzhiyun #ifdef CONFIG_PCI_HCI
1190*4882a593Smuzhiyun 	enum rtw_pcie_bus_func_cap_t l0s_ctrl;
1191*4882a593Smuzhiyun 	enum rtw_pcie_bus_func_cap_t l1_ctrl;
1192*4882a593Smuzhiyun 	enum rtw_pcie_bus_func_cap_t l1ss_ctrl;
1193*4882a593Smuzhiyun 	enum rtw_pcie_bus_func_cap_t wake_ctrl;
1194*4882a593Smuzhiyun 	enum rtw_pcie_bus_func_cap_t crq_ctrl;
1195*4882a593Smuzhiyun 	u32 txbd_num;
1196*4882a593Smuzhiyun 	u32 rxbd_num;
1197*4882a593Smuzhiyun 	u32 rpbd_num;
1198*4882a593Smuzhiyun 	u32 rxbuf_num;
1199*4882a593Smuzhiyun 	u32 rpbuf_num;
1200*4882a593Smuzhiyun 	u32 read_txbd_th;
1201*4882a593Smuzhiyun 	u8 clkdly_ctrl;
1202*4882a593Smuzhiyun 	u8 l0sdly_ctrl;
1203*4882a593Smuzhiyun 	u8 l1dly_ctrl;
1204*4882a593Smuzhiyun 	struct rtw_pcie_ltr_lat_ctrl ltr_act;
1205*4882a593Smuzhiyun 	struct rtw_pcie_ltr_lat_ctrl ltr_idle;
1206*4882a593Smuzhiyun 	u8 ltr_init_state;
1207*4882a593Smuzhiyun 	u8 ltr_sw_ctrl;
1208*4882a593Smuzhiyun 	u8 ltr_hw_ctrl;
1209*4882a593Smuzhiyun 	#ifdef RTW_WKARD_GET_PROCESSOR_ID
1210*4882a593Smuzhiyun 	u64 proc_id; /* processor id */
1211*4882a593Smuzhiyun 	#endif
1212*4882a593Smuzhiyun #elif defined (CONFIG_USB_HCI)
1213*4882a593Smuzhiyun 	u32 tx_buf_size;
1214*4882a593Smuzhiyun 	u32 tx_buf_num;
1215*4882a593Smuzhiyun 	u32 tx_mgnt_buf_size;
1216*4882a593Smuzhiyun 	u32 tx_mgnt_buf_num;
1217*4882a593Smuzhiyun 	u32 tx_h2c_buf_num;
1218*4882a593Smuzhiyun 	u32 rx_buf_size;
1219*4882a593Smuzhiyun 	u32 rx_buf_num;
1220*4882a593Smuzhiyun 	u32 in_token_num;
1221*4882a593Smuzhiyun #elif defined(CONFIG_SDIO_HCI)
1222*4882a593Smuzhiyun 	u32 tx_buf_size;
1223*4882a593Smuzhiyun 	u32 tx_buf_num;
1224*4882a593Smuzhiyun 	u32 tx_mgnt_buf_size;
1225*4882a593Smuzhiyun 	u32 tx_mgnt_buf_num;
1226*4882a593Smuzhiyun 	u32 rx_buf_size;
1227*4882a593Smuzhiyun 	u32 rx_buf_num;
1228*4882a593Smuzhiyun #else
1229*4882a593Smuzhiyun 	u8 temp_for_struct_empty; /* for undefined interface */
1230*4882a593Smuzhiyun #endif
1231*4882a593Smuzhiyun };
1232*4882a593Smuzhiyun 
1233*4882a593Smuzhiyun #ifdef CONFIG_PHL_TWT
1234*4882a593Smuzhiyun 
1235*4882a593Smuzhiyun #define DELETE_ALL 0xFF
1236*4882a593Smuzhiyun #define IGNORE_CFG_ID 0xFF
1237*4882a593Smuzhiyun #define IGNORE_MACID 0xFF
1238*4882a593Smuzhiyun 
1239*4882a593Smuzhiyun enum rtw_phl_twt_sup_cap {
1240*4882a593Smuzhiyun 	RTW_PHL_TWT_REQ_SUP = BIT(0), /* REQUESTER */
1241*4882a593Smuzhiyun 	RTW_PHL_TWT_RSP_SUP = BIT(1)/* RESPONDER */
1242*4882a593Smuzhiyun };
1243*4882a593Smuzhiyun 
1244*4882a593Smuzhiyun enum rtw_phl_nego_type {
1245*4882a593Smuzhiyun 	RTW_PHL_INDIV_TWT = 0, /*individual TWT*/
1246*4882a593Smuzhiyun 	RTW_PHL_WAKE_TBTT_INR = 1, /*wake TBTT and wake interval*/
1247*4882a593Smuzhiyun 	RTW_PHL_BCAST_TWT = 2, /*Broadcast TWT*/
1248*4882a593Smuzhiyun 	RTW_PHL_MANAGE_BCAST_TWT = 3 /*Manage memberships in broadcast TWT schedules*/
1249*4882a593Smuzhiyun };
1250*4882a593Smuzhiyun 
1251*4882a593Smuzhiyun enum rtw_phl_wake_dur_unit{ /*wake duration unit*/
1252*4882a593Smuzhiyun 	RTW_PHL_WAKE_256US = 0,
1253*4882a593Smuzhiyun 	RTW_PHL_WAKE_1TU = 1
1254*4882a593Smuzhiyun };
1255*4882a593Smuzhiyun 
1256*4882a593Smuzhiyun enum rtw_phl_setup_cmd{
1257*4882a593Smuzhiyun 	RTW_PHL_REQUEST_TWT = 0,
1258*4882a593Smuzhiyun 	RTW_PHL_SUGGEST_TWT = 1,
1259*4882a593Smuzhiyun 	RTW_PHL_DEMAND_TWT = 2,
1260*4882a593Smuzhiyun 	RTW_PHL_TWT_GROUPING = 3,
1261*4882a593Smuzhiyun 	RTW_PHL_ACCEPT_TWT = 4,
1262*4882a593Smuzhiyun 	RTW_PHL_ALTERNATE_TWT = 5,
1263*4882a593Smuzhiyun 	RTW_PHL_DICTATE_TWT = 6,
1264*4882a593Smuzhiyun 	RTW_PHL_REJECT_TWT = 7
1265*4882a593Smuzhiyun };
1266*4882a593Smuzhiyun 
1267*4882a593Smuzhiyun enum rtw_phl_flow_type{
1268*4882a593Smuzhiyun 	RTW_PHL_ANNOUNCED_TWT = 0,
1269*4882a593Smuzhiyun 	RTW_PHL_UNANNOUNCED_TWT = 1
1270*4882a593Smuzhiyun };
1271*4882a593Smuzhiyun 
1272*4882a593Smuzhiyun enum rtw_phl_twt_sta_action {
1273*4882a593Smuzhiyun 	TWT_STA_NONE = 0,
1274*4882a593Smuzhiyun 	TWT_STA_ADD_MACID = 1,
1275*4882a593Smuzhiyun 	TWT_STA_DEL_MACID = 2,
1276*4882a593Smuzhiyun 	TWT_STA_TETMINATW_SP = 3,
1277*4882a593Smuzhiyun 	TWT_STA_SUSPEND_TWT = 4,
1278*4882a593Smuzhiyun 	TWT_STA_RESUME_TWT = 5
1279*4882a593Smuzhiyun };
1280*4882a593Smuzhiyun 
1281*4882a593Smuzhiyun enum rtw_phl_twt_cfg_action {
1282*4882a593Smuzhiyun 	TWT_CFG_ADD = 0,
1283*4882a593Smuzhiyun 	TWT_CFG_DELETE = 1,
1284*4882a593Smuzhiyun 	TWT_CFG_MODIFY = 2
1285*4882a593Smuzhiyun };
1286*4882a593Smuzhiyun 
1287*4882a593Smuzhiyun struct rtw_phl_twt_flow_type01 {
1288*4882a593Smuzhiyun 	u8 twt_flow_id;
1289*4882a593Smuzhiyun 	u8 teardown_all;
1290*4882a593Smuzhiyun };
1291*4882a593Smuzhiyun 
1292*4882a593Smuzhiyun struct rtw_phl_twt_flow_type2 {
1293*4882a593Smuzhiyun 	u8 reserved;
1294*4882a593Smuzhiyun };
1295*4882a593Smuzhiyun 
1296*4882a593Smuzhiyun struct rtw_phl_twt_flow_type3 {
1297*4882a593Smuzhiyun 	u8 bcast_twt_id;
1298*4882a593Smuzhiyun 	u8 teardown_all;
1299*4882a593Smuzhiyun };
1300*4882a593Smuzhiyun 
1301*4882a593Smuzhiyun struct rtw_phl_twt_flow_field{
1302*4882a593Smuzhiyun 	enum rtw_phl_nego_type nego_type;
1303*4882a593Smuzhiyun 	union {
1304*4882a593Smuzhiyun 		struct rtw_phl_twt_flow_type01 twt_flow01;
1305*4882a593Smuzhiyun 		struct rtw_phl_twt_flow_type2 twt_flow2;
1306*4882a593Smuzhiyun 		struct rtw_phl_twt_flow_type3 twt_flow3;
1307*4882a593Smuzhiyun 	} info;
1308*4882a593Smuzhiyun };
1309*4882a593Smuzhiyun 
1310*4882a593Smuzhiyun /*phl_twt_setup_info Start*/
1311*4882a593Smuzhiyun 
1312*4882a593Smuzhiyun /*Broadcast TWT Parameter Set field*/
1313*4882a593Smuzhiyun struct rtw_phl_bcast_twt_para_set{
1314*4882a593Smuzhiyun 	u8 reserved; /*todo*/
1315*4882a593Smuzhiyun };
1316*4882a593Smuzhiyun 
1317*4882a593Smuzhiyun /*Individual TWT Parameter Set field*/
1318*4882a593Smuzhiyun struct rtw_phl_twt_group_asgmt{
1319*4882a593Smuzhiyun 	u8 reserved; /*todo*/
1320*4882a593Smuzhiyun };
1321*4882a593Smuzhiyun 
1322*4882a593Smuzhiyun struct rtw_phl_req_type_indiv{
1323*4882a593Smuzhiyun 	enum rtw_phl_setup_cmd twt_setup_cmd; /*twt setup command*/
1324*4882a593Smuzhiyun 	enum rtw_phl_flow_type flow_type;
1325*4882a593Smuzhiyun 	u8 twt_request;
1326*4882a593Smuzhiyun 	u8 trigger;
1327*4882a593Smuzhiyun 	u8 implicit;
1328*4882a593Smuzhiyun 	u8 twt_flow_id;
1329*4882a593Smuzhiyun 	u8 twt_wake_int_exp;/*twt wake interval exponent*/
1330*4882a593Smuzhiyun 	u8 twt_protection;
1331*4882a593Smuzhiyun };
1332*4882a593Smuzhiyun 
1333*4882a593Smuzhiyun struct rtw_phl_indiv_twt_para_set{
1334*4882a593Smuzhiyun 	struct rtw_phl_req_type_indiv req_type;
1335*4882a593Smuzhiyun 	struct rtw_phl_twt_group_asgmt twt_group_asgmt; /* twt group assignment*/
1336*4882a593Smuzhiyun 	u32 target_wake_t_h; /* if contain twt_group_assignment then don't contain target_wake_time*/
1337*4882a593Smuzhiyun 	u32 target_wake_t_l;
1338*4882a593Smuzhiyun 	u16 twt_wake_int_mantissa; /*twt wake interval mantissa*/
1339*4882a593Smuzhiyun 	u8 nom_min_twt_wake_dur; /*nominal minimum twt wake duration*/
1340*4882a593Smuzhiyun 	u8 twt_channel;
1341*4882a593Smuzhiyun };
1342*4882a593Smuzhiyun 
1343*4882a593Smuzhiyun struct rtw_phl_twt_control{
1344*4882a593Smuzhiyun 	enum rtw_phl_nego_type nego_type; /*negotiation type*/
1345*4882a593Smuzhiyun 	enum rtw_phl_wake_dur_unit wake_dur_unit; /*wake duration unit*/
1346*4882a593Smuzhiyun 	u8 ndp_paging_indic; /*ndp paging indicator*/
1347*4882a593Smuzhiyun 	u8 responder_pm_mode;
1348*4882a593Smuzhiyun 	u8 twt_info_frame_disable; /*twt information frame disable*/
1349*4882a593Smuzhiyun };
1350*4882a593Smuzhiyun struct rtw_phl_twt_element{
1351*4882a593Smuzhiyun /* element info*/
1352*4882a593Smuzhiyun 	/*control filed*/
1353*4882a593Smuzhiyun 	struct rtw_phl_twt_control twt_ctrl;
1354*4882a593Smuzhiyun 	/*twt para info*/
1355*4882a593Smuzhiyun 	union {
1356*4882a593Smuzhiyun 		struct rtw_phl_indiv_twt_para_set i_twt_para_set;
1357*4882a593Smuzhiyun 		struct rtw_phl_bcast_twt_para_set b_twt_para_set;
1358*4882a593Smuzhiyun 	} info;
1359*4882a593Smuzhiyun };
1360*4882a593Smuzhiyun 
1361*4882a593Smuzhiyun struct rtw_phl_twt_setup_info{
1362*4882a593Smuzhiyun 	struct rtw_phl_twt_element twt_element;
1363*4882a593Smuzhiyun 	//struct rtw_phl_stainfo_t *phl_sta; //sta entry
1364*4882a593Smuzhiyun 	u8 dialog_token;
1365*4882a593Smuzhiyun };
1366*4882a593Smuzhiyun /*phl_twt_setup_info End*/
1367*4882a593Smuzhiyun 
1368*4882a593Smuzhiyun 
1369*4882a593Smuzhiyun /*phl_twt_info Start*/
1370*4882a593Smuzhiyun struct rtw_twt_sta_info{
1371*4882a593Smuzhiyun 	_os_list list;
1372*4882a593Smuzhiyun 	struct rtw_phl_stainfo_t *phl_sta; /*sta entry*/
1373*4882a593Smuzhiyun 	u8 id; /*twt_flow_identifier or broadcast_twt_id*/
1374*4882a593Smuzhiyun };
1375*4882a593Smuzhiyun 
1376*4882a593Smuzhiyun struct rtw_phl_twt_info{
1377*4882a593Smuzhiyun 	enum rtw_phl_wake_dur_unit wake_dur_unit;
1378*4882a593Smuzhiyun 	enum rtw_phl_nego_type nego_type;
1379*4882a593Smuzhiyun 	enum rtw_phl_flow_type flow_type;
1380*4882a593Smuzhiyun 	u8 twt_id; /*config id*/
1381*4882a593Smuzhiyun 	u8 bcast_twt_id; /*ignore in individual TWT*/
1382*4882a593Smuzhiyun 	u8 twt_action;
1383*4882a593Smuzhiyun 	u8 responder_pm_mode;
1384*4882a593Smuzhiyun 	u8 trigger;
1385*4882a593Smuzhiyun 	u8 implicit_lastbcast; /*implicit or lastbroadcast*/
1386*4882a593Smuzhiyun 	u8 twt_protection;
1387*4882a593Smuzhiyun 	u8 twt_wake_int_exp;
1388*4882a593Smuzhiyun 	u8 nom_min_twt_wake_dur;
1389*4882a593Smuzhiyun 	u16 twt_wake_int_mantissa;
1390*4882a593Smuzhiyun 	u32 target_wake_time_h;
1391*4882a593Smuzhiyun 	u32 target_wake_time_l;
1392*4882a593Smuzhiyun };
1393*4882a593Smuzhiyun 
1394*4882a593Smuzhiyun 
1395*4882a593Smuzhiyun #endif /* CONFIG_PHL_TWT */
1396*4882a593Smuzhiyun 
1397*4882a593Smuzhiyun 
1398*4882a593Smuzhiyun enum rtw_lps_listen_bcn_mode {
1399*4882a593Smuzhiyun 	RTW_LPS_RLBM_MIN         = 0,
1400*4882a593Smuzhiyun 	RTW_LPS_RLBM_MAX         = 1,
1401*4882a593Smuzhiyun 	RTW_LPS_RLBM_USERDEFINE  = 2,
1402*4882a593Smuzhiyun 	RTW_LPS_LISTEN_BCN_MAX,
1403*4882a593Smuzhiyun };
1404*4882a593Smuzhiyun 
1405*4882a593Smuzhiyun enum rtw_lps_smart_ps_mode {
1406*4882a593Smuzhiyun 	RTW_LPS_LEGACY_PWR1      = 0,
1407*4882a593Smuzhiyun 	RTW_LPS_TRX_PWR0         = 1,
1408*4882a593Smuzhiyun 	RTW_LPS_SMART_PS_MAX,
1409*4882a593Smuzhiyun };
1410*4882a593Smuzhiyun 
1411*4882a593Smuzhiyun struct  rtw_wow_cap_t {
1412*4882a593Smuzhiyun 	u8 magic_sup;
1413*4882a593Smuzhiyun 	u8 pattern_sup;
1414*4882a593Smuzhiyun 	u8 ping_pattern_wake_sup;
1415*4882a593Smuzhiyun 	u8 arp_ofld_sup;
1416*4882a593Smuzhiyun 	u8 ns_oflod_sup;
1417*4882a593Smuzhiyun 	u8 gtk_ofld_sup;
1418*4882a593Smuzhiyun 	u8 nlo_sup;
1419*4882a593Smuzhiyun };
1420*4882a593Smuzhiyun 
1421*4882a593Smuzhiyun /**
1422*4882a593Smuzhiyun  * enum phl_ps_leave_fail_act decide the action when leave ps fail
1423*4882a593Smuzhiyun  * BIT 0 : reject all subsequent power request
1424*4882a593Smuzhiyun  * BIT 1 : trigger L2 reset
1425*4882a593Smuzhiyun  */
1426*4882a593Smuzhiyun enum phl_ps_leave_fail_act {
1427*4882a593Smuzhiyun 	PS_LEAVE_FAIL_ACT_REJ_PWR = BIT0,
1428*4882a593Smuzhiyun 	PS_LEAVE_FAIL_ACT_L2 = BIT1
1429*4882a593Smuzhiyun };
1430*4882a593Smuzhiyun #define PS_LEAVE_FAIL_ACT_NONE 0
1431*4882a593Smuzhiyun 
1432*4882a593Smuzhiyun enum phl_ps_operation_mode {
1433*4882a593Smuzhiyun 	PS_OP_MODE_DISABLED = 0,
1434*4882a593Smuzhiyun 	PS_OP_MODE_FORCE_ENABLED = 1,
1435*4882a593Smuzhiyun 	PS_OP_MODE_AUTO = 2
1436*4882a593Smuzhiyun };
1437*4882a593Smuzhiyun 
1438*4882a593Smuzhiyun enum phl_ps_pwr_lvl {
1439*4882a593Smuzhiyun 	PS_PWR_LVL_PWROFF = 0, /* hal deinit */
1440*4882a593Smuzhiyun 	PS_PWR_LVL_PWR_GATED = 1, /* FW control*/
1441*4882a593Smuzhiyun 	PS_PWR_LVL_CLK_GATED = 2, /* FW control*/
1442*4882a593Smuzhiyun 	PS_PWR_LVL_RF_OFF = 3, /* FW control*/
1443*4882a593Smuzhiyun 	PS_PWR_LVL_PWRON = 4, /* hal init */
1444*4882a593Smuzhiyun 	PS_PWR_LVL_MAX
1445*4882a593Smuzhiyun };
1446*4882a593Smuzhiyun 
1447*4882a593Smuzhiyun /**
1448*4882a593Smuzhiyun  * enum phl_stop_rson record the reason to stop power saving
1449*4882a593Smuzhiyun  * BIT 0 : by core initialization setting
1450*4882a593Smuzhiyun  * BIT 1 : by debug flow setting
1451*4882a593Smuzhiyun  * BIT 2 : by battery change
1452*4882a593Smuzhiyun  */
1453*4882a593Smuzhiyun enum phl_ps_rt_rson {
1454*4882a593Smuzhiyun 	PS_RT_DEBUG = BIT0,
1455*4882a593Smuzhiyun 	PS_RT_CORE_INIT = BIT1,
1456*4882a593Smuzhiyun 	PS_RT_BATTERY_CHG = BIT2,
1457*4882a593Smuzhiyun };
1458*4882a593Smuzhiyun #define PS_RT_RSON_NONE 0
1459*4882a593Smuzhiyun 
1460*4882a593Smuzhiyun #define PS_CAP_PWRON BIT0
1461*4882a593Smuzhiyun #define PS_CAP_RF_OFF BIT1
1462*4882a593Smuzhiyun #define PS_CAP_CLK_GATED BIT2
1463*4882a593Smuzhiyun #define PS_CAP_PWR_GATED BIT3
1464*4882a593Smuzhiyun #define PS_CAP_PWR_OFF BIT4
1465*4882a593Smuzhiyun 
1466*4882a593Smuzhiyun /**
1467*4882a593Smuzhiyun  * ips_en/lps_en
1468*4882a593Smuzhiyun  * refs. structure "phl_ps_operation_mode"
1469*4882a593Smuzhiyun  * 0: disable -> disable all ps mechanism
1470*4882a593Smuzhiyun  * 1: force enable -> ignore all other condition, force enter ps
1471*4882a593Smuzhiyun  * 2: auto -> will be affected by runtime capability set by core
1472*4882a593Smuzhiyun  *
1473*4882a593Smuzhiyun  * ips_cap/ips_wow_cap/lps_cap/lps_wow_cap are bit defined
1474*4882a593Smuzhiyun  * corresponding bit is set if specific power level is supported
1475*4882a593Smuzhiyun  * BIT0: Power on
1476*4882a593Smuzhiyun  * BIT1: Rf off
1477*4882a593Smuzhiyun  * BIT2: Clock gating
1478*4882a593Smuzhiyun  * BIT3: Power gating
1479*4882a593Smuzhiyun  * BIT4: Power off
1480*4882a593Smuzhiyun  */
1481*4882a593Smuzhiyun struct rtw_ps_cap_t {
1482*4882a593Smuzhiyun 	/* rf state */
1483*4882a593Smuzhiyun 	enum rtw_rf_state init_rf_state;
1484*4882a593Smuzhiyun 	u8 init_rt_stop_rson;
1485*4882a593Smuzhiyun 	u8 leave_fail_act; /* action when leave ps fail */
1486*4882a593Smuzhiyun 	/* ips */
1487*4882a593Smuzhiyun 	u8 ips_en;
1488*4882a593Smuzhiyun 	u8 ips_cap;
1489*4882a593Smuzhiyun 	u8 ips_wow_en;
1490*4882a593Smuzhiyun 	u8 ips_wow_cap;
1491*4882a593Smuzhiyun 	/* lps */
1492*4882a593Smuzhiyun 	u8 lps_en;
1493*4882a593Smuzhiyun 	u8 lps_cap;
1494*4882a593Smuzhiyun 	u8 lps_awake_interval;
1495*4882a593Smuzhiyun 	enum rtw_lps_listen_bcn_mode lps_listen_bcn_mode;
1496*4882a593Smuzhiyun 	enum rtw_lps_smart_ps_mode lps_smart_ps_mode;
1497*4882a593Smuzhiyun 	u8 lps_rssi_enter_threshold;
1498*4882a593Smuzhiyun 	u8 lps_rssi_leave_threshold;
1499*4882a593Smuzhiyun 	u8 lps_rssi_diff_threshold;
1500*4882a593Smuzhiyun 	bool lps_pause_tx;
1501*4882a593Smuzhiyun 	/* wow lps */
1502*4882a593Smuzhiyun 	u8 lps_wow_en;
1503*4882a593Smuzhiyun 	u8 lps_wow_cap;
1504*4882a593Smuzhiyun 	u8 lps_wow_awake_interval;
1505*4882a593Smuzhiyun 	enum rtw_lps_listen_bcn_mode lps_wow_listen_bcn_mode;
1506*4882a593Smuzhiyun 	enum rtw_lps_smart_ps_mode lps_wow_smart_ps_mode;
1507*4882a593Smuzhiyun };
1508*4882a593Smuzhiyun 
1509*4882a593Smuzhiyun struct rtw_edcca_cap_t {
1510*4882a593Smuzhiyun 	u8 edcca_adap_th_2g;
1511*4882a593Smuzhiyun 	u8 edcca_adap_th_5g;
1512*4882a593Smuzhiyun 
1513*4882a593Smuzhiyun 	u8 edcca_carrier_sense_th;
1514*4882a593Smuzhiyun };
1515*4882a593Smuzhiyun 
1516*4882a593Smuzhiyun struct phy_sw_cap_t {
1517*4882a593Smuzhiyun 	struct rtw_para_info_t mac_reg_info;
1518*4882a593Smuzhiyun 	struct rtw_para_info_t bb_phy_reg_info;
1519*4882a593Smuzhiyun 	struct rtw_para_info_t bb_phy_reg_mp_info;
1520*4882a593Smuzhiyun 	struct rtw_para_info_t bb_phy_reg_gain_info;
1521*4882a593Smuzhiyun 
1522*4882a593Smuzhiyun 	struct rtw_para_info_t rf_radio_a_info;
1523*4882a593Smuzhiyun 	struct rtw_para_info_t rf_radio_b_info;
1524*4882a593Smuzhiyun 	struct rtw_para_info_t rf_txpwr_byrate_info;
1525*4882a593Smuzhiyun 	struct rtw_para_info_t rf_txpwrtrack_info;
1526*4882a593Smuzhiyun 
1527*4882a593Smuzhiyun 	struct rtw_para_pwrlmt_info_t rf_txpwrlmt_info;
1528*4882a593Smuzhiyun 	struct rtw_para_pwrlmt_info_t rf_txpwrlmt_ru_info;
1529*4882a593Smuzhiyun 
1530*4882a593Smuzhiyun 	u8 proto_sup;
1531*4882a593Smuzhiyun 	u8 band_sup;
1532*4882a593Smuzhiyun 	u8 bw_sup;
1533*4882a593Smuzhiyun 	u8 txss;
1534*4882a593Smuzhiyun 	u8 rxss;
1535*4882a593Smuzhiyun 	u16 hw_rts_time_th;
1536*4882a593Smuzhiyun 	u16 hw_rts_len_th;
1537*4882a593Smuzhiyun 	bool bfreed_para;
1538*4882a593Smuzhiyun };
1539*4882a593Smuzhiyun 
1540*4882a593Smuzhiyun /* final capability of phy */
1541*4882a593Smuzhiyun struct phy_cap_t {
1542*4882a593Smuzhiyun 	u8 proto_sup;
1543*4882a593Smuzhiyun 	u8 band_sup;
1544*4882a593Smuzhiyun 	u8 bw_sup;
1545*4882a593Smuzhiyun 	u8 txss;
1546*4882a593Smuzhiyun 	u8 rxss;
1547*4882a593Smuzhiyun 	u16 hw_rts_time_th;
1548*4882a593Smuzhiyun 	u16 hw_rts_len_th;
1549*4882a593Smuzhiyun };
1550*4882a593Smuzhiyun 
1551*4882a593Smuzhiyun /* final capability of device */
1552*4882a593Smuzhiyun struct dev_cap_t {
1553*4882a593Smuzhiyun 	u64 hw_sup_flags;/*hw's feature support flags*/
1554*4882a593Smuzhiyun #ifdef RTW_WKARD_LAMODE
1555*4882a593Smuzhiyun 	bool la_mode;
1556*4882a593Smuzhiyun #endif
1557*4882a593Smuzhiyun 	u8 pkg_type;
1558*4882a593Smuzhiyun 	u8 rfe_type;
1559*4882a593Smuzhiyun 	u8 bypass_rfe_chk;
1560*4882a593Smuzhiyun 	u8 xcap;
1561*4882a593Smuzhiyun 	struct rtw_fw_cap_t fw_cap;
1562*4882a593Smuzhiyun #ifdef CONFIG_MCC_SUPPORT
1563*4882a593Smuzhiyun 	bool mcc_sup;
1564*4882a593Smuzhiyun #endif
1565*4882a593Smuzhiyun #ifdef CONFIG_DBCC_SUPPORT
1566*4882a593Smuzhiyun 	bool dbcc_sup;
1567*4882a593Smuzhiyun #endif
1568*4882a593Smuzhiyun #ifdef CONFIG_PHL_TWT
1569*4882a593Smuzhiyun 	u8 twt_sup;
1570*4882a593Smuzhiyun #endif /* CONFIG_PHL_TWT */
1571*4882a593Smuzhiyun 
1572*4882a593Smuzhiyun 	struct rtw_wow_cap_t wow_cap;
1573*4882a593Smuzhiyun 	struct rtw_ps_cap_t ps_cap;
1574*4882a593Smuzhiyun 	u8 hw_hdr_conv;
1575*4882a593Smuzhiyun 	u8 domain;
1576*4882a593Smuzhiyun 	u8 btc_mode;
1577*4882a593Smuzhiyun 	u8 ap_ps;           /* support for AP mode PS in PHL */
1578*4882a593Smuzhiyun 	u8 pwrbyrate_off;
1579*4882a593Smuzhiyun 	u8 pwrlmt_type;
1580*4882a593Smuzhiyun 	u8 rf_board_opt;
1581*4882a593Smuzhiyun 	u8 sta_ulru; /* support UL OFDAM for STA mode (reply trigger frame) */
1582*4882a593Smuzhiyun #ifdef RTW_WKARD_BB_DISABLE_STA_2G40M_ULOFDMA
1583*4882a593Smuzhiyun 	u8 sta_ulru_2g40mhz; /* when "sta_ulru" is enabled, support UL OFDAM on 2.4G 40MHz ? */
1584*4882a593Smuzhiyun #endif
1585*4882a593Smuzhiyun 	u8 tx_mu_ru;
1586*4882a593Smuzhiyun 	struct rtw_edcca_cap_t edcca_cap;
1587*4882a593Smuzhiyun #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
1588*4882a593Smuzhiyun 	bool bfree_para_info;	/* keep load file para info buf,default 0*/
1589*4882a593Smuzhiyun #endif
1590*4882a593Smuzhiyun 	u8 hw_stype_cap;
1591*4882a593Smuzhiyun 	u8 wl_func_cap;
1592*4882a593Smuzhiyun 	u8 rpq_agg_num; /* 0: no adjust, use mac default size: 121 */
1593*4882a593Smuzhiyun 	bool quota_turbo;
1594*4882a593Smuzhiyun };
1595*4882a593Smuzhiyun 
1596*4882a593Smuzhiyun #ifdef RTW_PHL_BCN //phl def
1597*4882a593Smuzhiyun 
1598*4882a593Smuzhiyun #define BCN_ID_MAX		(0xFF)
1599*4882a593Smuzhiyun #define MAX_BCN_SIZE	1000
1600*4882a593Smuzhiyun 
1601*4882a593Smuzhiyun enum bcn_offload_flags{
1602*4882a593Smuzhiyun 	BCN_HW_SEQ = 0,
1603*4882a593Smuzhiyun 	BCN_HW_TIM,
1604*4882a593Smuzhiyun 
1605*4882a593Smuzhiyun 	BCN_HW_MAX = 32,
1606*4882a593Smuzhiyun };
1607*4882a593Smuzhiyun 
1608*4882a593Smuzhiyun struct rtw_bcn_info_cmn {
1609*4882a593Smuzhiyun 	u8 role_idx;
1610*4882a593Smuzhiyun 	u8 bcn_id;
1611*4882a593Smuzhiyun 	u8 bcn_added;
1612*4882a593Smuzhiyun 
1613*4882a593Smuzhiyun 	u8 bssid[6];
1614*4882a593Smuzhiyun 	u32 bcn_interval;
1615*4882a593Smuzhiyun 
1616*4882a593Smuzhiyun 	u8 bcn_buf[MAX_BCN_SIZE];
1617*4882a593Smuzhiyun 	u32 bcn_length;
1618*4882a593Smuzhiyun 	u32 bcn_rate;
1619*4882a593Smuzhiyun 
1620*4882a593Smuzhiyun 	u32 bcn_dtim;
1621*4882a593Smuzhiyun 	u32 ie_offset_tim;
1622*4882a593Smuzhiyun 
1623*4882a593Smuzhiyun 	u32 bcn_offload;
1624*4882a593Smuzhiyun };
1625*4882a593Smuzhiyun 
1626*4882a593Smuzhiyun struct rtw_bcn_info_hw {
1627*4882a593Smuzhiyun 	u8 band;
1628*4882a593Smuzhiyun 	u8 port;
1629*4882a593Smuzhiyun 	u8 mbssid;
1630*4882a593Smuzhiyun 	u8 mac_id;
1631*4882a593Smuzhiyun };
1632*4882a593Smuzhiyun 
1633*4882a593Smuzhiyun struct rtw_bcn_entry {
1634*4882a593Smuzhiyun 	_os_list list;
1635*4882a593Smuzhiyun 	struct rtw_bcn_info_cmn	*bcn_cmn;	//fill by core
1636*4882a593Smuzhiyun 	struct rtw_bcn_info_hw 	bcn_hw;	//fill by phl //?? void mapping ?? for 8852, 8834 ...blabla
1637*4882a593Smuzhiyun };
1638*4882a593Smuzhiyun #endif
1639*4882a593Smuzhiyun 
1640*4882a593Smuzhiyun struct rtw_phl_com_t;
1641*4882a593Smuzhiyun 
1642*4882a593Smuzhiyun struct phl_msg_receiver {
1643*4882a593Smuzhiyun 		void* priv;
1644*4882a593Smuzhiyun 		void (*incoming_evt_notify)(void* priv, struct phl_msg *msg);
1645*4882a593Smuzhiyun };
1646*4882a593Smuzhiyun 
1647*4882a593Smuzhiyun #ifdef CONFIG_PHL_P2PPS
1648*4882a593Smuzhiyun 
1649*4882a593Smuzhiyun #define MAX_NOA_DESC 5
1650*4882a593Smuzhiyun #define NOAID_NONE 0xFF
1651*4882a593Smuzhiyun 
1652*4882a593Smuzhiyun enum p2pps_trig_tag {
1653*4882a593Smuzhiyun 	P2PPS_TRIG_GO = 0,
1654*4882a593Smuzhiyun 	P2PPS_TRIG_GC = 1,
1655*4882a593Smuzhiyun 	P2PPS_TRIG_GC_255 = 2,
1656*4882a593Smuzhiyun 	P2PPS_TRIG_MCC = 3,
1657*4882a593Smuzhiyun 	P2PPS_TRIG_2G_SCC_1AP_1STA_BT = 4,
1658*4882a593Smuzhiyun 	P2PPS_TRIG_MAX = MAX_NOA_DESC
1659*4882a593Smuzhiyun };
1660*4882a593Smuzhiyun 
1661*4882a593Smuzhiyun struct rtw_phl_noa_desc {
1662*4882a593Smuzhiyun 	u8 enable; /*false=disable, true=enable*/
1663*4882a593Smuzhiyun 	struct rtw_wifi_role_t *w_role;
1664*4882a593Smuzhiyun 	enum p2pps_trig_tag tag;
1665*4882a593Smuzhiyun 	u32 start_t_h;
1666*4882a593Smuzhiyun 	u32 start_t_l;
1667*4882a593Smuzhiyun 	u32 interval;
1668*4882a593Smuzhiyun 	u32 duration;
1669*4882a593Smuzhiyun 	u8 count;
1670*4882a593Smuzhiyun 	u8 noa_id; /*filed by phl noa module*/
1671*4882a593Smuzhiyun };
1672*4882a593Smuzhiyun 
1673*4882a593Smuzhiyun struct rtw_phl_opps_desc {
1674*4882a593Smuzhiyun 	u16 ctw;
1675*4882a593Smuzhiyun 	u8 all_slep;
1676*4882a593Smuzhiyun };
1677*4882a593Smuzhiyun 
1678*4882a593Smuzhiyun struct rtw_phl_tsf32_tog_rpt{
1679*4882a593Smuzhiyun 	u8 band;
1680*4882a593Smuzhiyun 	u8 port;
1681*4882a593Smuzhiyun 	u8 valid;
1682*4882a593Smuzhiyun 	u16 early;
1683*4882a593Smuzhiyun 	u16 status;
1684*4882a593Smuzhiyun 	u32 tsf_l;
1685*4882a593Smuzhiyun 	u32 tsf_h;
1686*4882a593Smuzhiyun };
1687*4882a593Smuzhiyun 
1688*4882a593Smuzhiyun struct rtw_phl_p2pps_ops {
1689*4882a593Smuzhiyun 	void *priv; /* ops private, define by core layer*/
1690*4882a593Smuzhiyun 	void (*tsf32_tog_update_noa)(void *priv, struct rtw_wifi_role_t *w_role,
1691*4882a593Smuzhiyun 					struct rtw_phl_tsf32_tog_rpt *rpt);
1692*4882a593Smuzhiyun 	void (*tsf32_tog_update_single_noa)(void *priv,
1693*4882a593Smuzhiyun 					struct rtw_wifi_role_t *w_role,
1694*4882a593Smuzhiyun 					struct rtw_phl_noa_desc *desc);
1695*4882a593Smuzhiyun };
1696*4882a593Smuzhiyun 
1697*4882a593Smuzhiyun 
1698*4882a593Smuzhiyun #endif
1699*4882a593Smuzhiyun 
1700*4882a593Smuzhiyun struct rtw_wifi_role_t {
1701*4882a593Smuzhiyun 	struct rtw_phl_com_t *phl_com;/*point to phl_com*/
1702*4882a593Smuzhiyun 	#ifdef RTW_WKARD_ROLE_TYPE
1703*4882a593Smuzhiyun 	enum role_type real_type;
1704*4882a593Smuzhiyun 	#endif /* RTW_WKARD_ROLE_TYPE */
1705*4882a593Smuzhiyun 	enum role_type type;/*will mapping to net type*/
1706*4882a593Smuzhiyun 	enum role_type target_type;
1707*4882a593Smuzhiyun 	#ifdef RTW_WKARD_PHL_NTFY_MEDIA_STS
1708*4882a593Smuzhiyun 	bool is_gc;
1709*4882a593Smuzhiyun 	#endif
1710*4882a593Smuzhiyun 	enum mlme_state mstate;
1711*4882a593Smuzhiyun 	bool active;
1712*4882a593Smuzhiyun 	enum wr_status status;
1713*4882a593Smuzhiyun 	u8 id;/* recode role_idx in phl_com */
1714*4882a593Smuzhiyun 	u8 hw_wmm; /*HW EDCA - wmm0 or wmm1*/
1715*4882a593Smuzhiyun 	#ifdef RTW_WKARD_HW_WMM_ALLOCATE
1716*4882a593Smuzhiyun 	_os_atomic hw_wmm0_ref_cnt;
1717*4882a593Smuzhiyun 	#endif
1718*4882a593Smuzhiyun 	u8 mac_addr[MAC_ALEN];
1719*4882a593Smuzhiyun 	u8 hw_band; /*MAC Band0 or Band1*/
1720*4882a593Smuzhiyun 	u8 hw_port; /*MAC HW Port*/
1721*4882a593Smuzhiyun 	/*
1722*4882a593Smuzhiyun 	 * final protocol capability of role from intersection of
1723*4882a593Smuzhiyun 	 * sw role cap, sw protocol cap and hw protocol cap
1724*4882a593Smuzhiyun 	 */
1725*4882a593Smuzhiyun 	struct protocol_cap_t proto_role_cap;
1726*4882a593Smuzhiyun 
1727*4882a593Smuzhiyun 	/*
1728*4882a593Smuzhiyun 	 * final capability of role from intersection of
1729*4882a593Smuzhiyun 	 * sw role cap, final phy cap and final dev cap
1730*4882a593Smuzhiyun 	 */
1731*4882a593Smuzhiyun 	struct role_cap_t cap;
1732*4882a593Smuzhiyun 
1733*4882a593Smuzhiyun 	/*#ifdef CONFIG_AP*/
1734*4882a593Smuzhiyun #ifdef RTW_PHL_BCN
1735*4882a593Smuzhiyun 	struct rtw_bcn_info_cmn bcn_cmn; //todo: ieee mbssid case & multi-bcn (in one iface) case
1736*4882a593Smuzhiyun 	u8 hw_mbssid;
1737*4882a593Smuzhiyun #endif
1738*4882a593Smuzhiyun 	u8 dtim_period;
1739*4882a593Smuzhiyun 	u8 mbid_num;
1740*4882a593Smuzhiyun 	u32 hiq_win;
1741*4882a593Smuzhiyun 	/*#endif CONFIG_AP*/
1742*4882a593Smuzhiyun 
1743*4882a593Smuzhiyun 	struct rtw_chan_def chandef;
1744*4882a593Smuzhiyun 	struct rtw_chan_ctx *chanctx;/*point to chanctx*/
1745*4882a593Smuzhiyun 
1746*4882a593Smuzhiyun 	struct phl_queue assoc_sta_queue;
1747*4882a593Smuzhiyun 
1748*4882a593Smuzhiyun #ifdef CONFIG_PHL_TWT
1749*4882a593Smuzhiyun 	struct rtw_phl_twt_setup_info twt_setup_info;
1750*4882a593Smuzhiyun #endif /* CONFIG_PHL_TWT */
1751*4882a593Smuzhiyun 
1752*4882a593Smuzhiyun #ifdef CONFIG_PHL_P2PPS
1753*4882a593Smuzhiyun 	struct rtw_phl_noa_desc noa_desc[MAX_NOA_DESC];
1754*4882a593Smuzhiyun #endif
1755*4882a593Smuzhiyun 
1756*4882a593Smuzhiyun 	void *core_data; /* Track back to counter part in core layer */
1757*4882a593Smuzhiyun #ifdef RTW_WKARD_BFEE_SET_AID
1758*4882a593Smuzhiyun 	u16 last_set_aid;
1759*4882a593Smuzhiyun #endif
1760*4882a593Smuzhiyun };
1761*4882a593Smuzhiyun 
1762*4882a593Smuzhiyun #define TXTP_CALC_DIFF_MS 1000
1763*4882a593Smuzhiyun #define RXTP_CALC_DIFF_MS 1000
1764*4882a593Smuzhiyun 
1765*4882a593Smuzhiyun #define	TX_ULTRA_LOW_TP_THRES_KBPS 100
1766*4882a593Smuzhiyun #define	RX_ULTRA_LOW_TP_THRES_KBPS 100
1767*4882a593Smuzhiyun #define	TX_LOW_TP_THRES_MBPS 2
1768*4882a593Smuzhiyun #define	RX_LOW_TP_THRES_MBPS 2
1769*4882a593Smuzhiyun #define	TX_MID_TP_THRES_MBPS  10
1770*4882a593Smuzhiyun #define	RX_MID_TP_THRES_MBPS  10
1771*4882a593Smuzhiyun #define	TX_HIGH_TP_THRES_MBPS  50
1772*4882a593Smuzhiyun #define	RX_HIGH_TP_THRES_MBPS  50
1773*4882a593Smuzhiyun 
1774*4882a593Smuzhiyun 
1775*4882a593Smuzhiyun enum rtw_tfc_lvl {
1776*4882a593Smuzhiyun 	RTW_TFC_IDLE = 0,
1777*4882a593Smuzhiyun 	RTW_TFC_ULTRA_LOW = 1,
1778*4882a593Smuzhiyun 	RTW_TFC_LOW = 2,
1779*4882a593Smuzhiyun 	RTW_TFC_MID = 3,
1780*4882a593Smuzhiyun 	RTW_TFC_HIGH = 4,
1781*4882a593Smuzhiyun 	RTW_TFC_LVL_MAX = 0xFF
1782*4882a593Smuzhiyun };
1783*4882a593Smuzhiyun 
1784*4882a593Smuzhiyun enum rtw_tfc_sts {
1785*4882a593Smuzhiyun 	TRAFFIC_CHANGED = BIT0,
1786*4882a593Smuzhiyun 	TRAFFIC_INCREASE = BIT1,
1787*4882a593Smuzhiyun 	TRAFFIC_DECREASE = BIT2,
1788*4882a593Smuzhiyun 	TRAFFIC_STS_MAX = BIT7
1789*4882a593Smuzhiyun };
1790*4882a593Smuzhiyun 
1791*4882a593Smuzhiyun struct rtw_traffic_t {
1792*4882a593Smuzhiyun 	enum rtw_tfc_lvl lvl;
1793*4882a593Smuzhiyun 	enum rtw_tfc_sts sts;
1794*4882a593Smuzhiyun };
1795*4882a593Smuzhiyun 
1796*4882a593Smuzhiyun struct rtw_stats_tp {
1797*4882a593Smuzhiyun 	u64 last_calc_bits;
1798*4882a593Smuzhiyun 	u32 last_calc_time_ms;
1799*4882a593Smuzhiyun };
1800*4882a593Smuzhiyun /*statistic*/
1801*4882a593Smuzhiyun struct rtw_stats {
1802*4882a593Smuzhiyun 	u64 tx_byte_uni;/*unicast tx byte*/
1803*4882a593Smuzhiyun 	u64 rx_byte_uni;/*unicast rx byte*/
1804*4882a593Smuzhiyun 	u64 tx_byte_total;
1805*4882a593Smuzhiyun 	u64 rx_byte_total;
1806*4882a593Smuzhiyun 	u32 tx_tp_kbits;
1807*4882a593Smuzhiyun 	u32 rx_tp_kbits;
1808*4882a593Smuzhiyun 	u16 tx_moving_average_tp; /* tx average MBps*/
1809*4882a593Smuzhiyun 	u16 rx_moving_average_tp; /* rx average MBps*/
1810*4882a593Smuzhiyun 	u32 last_tx_time_ms;
1811*4882a593Smuzhiyun 	u32 last_rx_time_ms;
1812*4882a593Smuzhiyun 	u32 txreq_num;
1813*4882a593Smuzhiyun 	u32 rx_rate;
1814*4882a593Smuzhiyun 	u32 rx_rate_nmr[RTW_DATA_RATE_HE_NSS4_MCS11 +1];
1815*4882a593Smuzhiyun 	u64 ser_event[8]; /* RTW_PHL_SER_MAX */
1816*4882a593Smuzhiyun 	struct rtw_stats_tp txtp;
1817*4882a593Smuzhiyun 	struct rtw_stats_tp rxtp;
1818*4882a593Smuzhiyun 	struct rtw_traffic_t tx_traffic;
1819*4882a593Smuzhiyun 	struct rtw_traffic_t rx_traffic;
1820*4882a593Smuzhiyun 	u32 rx_tf_cnt; /* rx trigger frame number (accumulated, only reset in disconnect) */
1821*4882a593Smuzhiyun 	u32 pre_rx_tf_cnt; /* last record rx trigger frame number from BB */
1822*4882a593Smuzhiyun };
1823*4882a593Smuzhiyun enum sta_chg_id {
1824*4882a593Smuzhiyun 	STA_CHG_BW,
1825*4882a593Smuzhiyun 	STA_CHG_NSS,
1826*4882a593Smuzhiyun 	STA_CHG_RAMASK,
1827*4882a593Smuzhiyun 	STA_CHG_SEC_MODE,
1828*4882a593Smuzhiyun 	STA_CHG_MBSSID,
1829*4882a593Smuzhiyun 	STA_CHG_RA_GILTF,
1830*4882a593Smuzhiyun 	STA_CHG_MAX
1831*4882a593Smuzhiyun };
1832*4882a593Smuzhiyun 
1833*4882a593Smuzhiyun enum phl_upd_mode {
1834*4882a593Smuzhiyun 	PHL_UPD_ROLE_CREATE,
1835*4882a593Smuzhiyun 	PHL_UPD_ROLE_REMOVE,
1836*4882a593Smuzhiyun 	PHL_UPD_ROLE_TYPE_CHANGE,
1837*4882a593Smuzhiyun 	PHL_UPD_ROLE_INFO_CHANGE,
1838*4882a593Smuzhiyun 	PHL_UPD_STA_INFO_CHANGE,
1839*4882a593Smuzhiyun 	PHL_UPD_STA_CON_DISCONN,
1840*4882a593Smuzhiyun 	PHL_UPD_ROLE_MAX
1841*4882a593Smuzhiyun };
1842*4882a593Smuzhiyun 
1843*4882a593Smuzhiyun #ifdef CONFIG_PHL_TXSC
1844*4882a593Smuzhiyun #define PHL_TXSC_ENTRY_NUM 8
1845*4882a593Smuzhiyun #define MAX_WD_SIZE	128
1846*4882a593Smuzhiyun 
1847*4882a593Smuzhiyun struct phl_txsc_entry {
1848*4882a593Smuzhiyun 	bool txsc_wd_cached;
1849*4882a593Smuzhiyun 	u8 txsc_wd_cache[MAX_WD_SIZE];
1850*4882a593Smuzhiyun 	u8 txsc_wd_len;
1851*4882a593Smuzhiyun 	u32 txsc_cache_hit;
1852*4882a593Smuzhiyun };
1853*4882a593Smuzhiyun #endif
1854*4882a593Smuzhiyun 
1855*4882a593Smuzhiyun struct rtw_hal_stainfo_t;
1856*4882a593Smuzhiyun struct rtw_phl_stainfo_t {
1857*4882a593Smuzhiyun 	_os_list list;
1858*4882a593Smuzhiyun 	struct rtw_wifi_role_t *wrole;
1859*4882a593Smuzhiyun #ifdef RTW_WKARD_CHECK_STAINFO_DOUBLE_DEL
1860*4882a593Smuzhiyun 	bool allocated;
1861*4882a593Smuzhiyun #endif
1862*4882a593Smuzhiyun 	bool active;
1863*4882a593Smuzhiyun 	u16 aid;
1864*4882a593Smuzhiyun 	u16 macid;
1865*4882a593Smuzhiyun 	u8 mac_addr[MAC_ALEN];
1866*4882a593Smuzhiyun 
1867*4882a593Smuzhiyun 	struct rtw_chan_def chandef;
1868*4882a593Smuzhiyun 	struct rtw_stats stats;
1869*4882a593Smuzhiyun 	enum wlan_mode wmode;
1870*4882a593Smuzhiyun 
1871*4882a593Smuzhiyun 	/*mlme protocol or MAC related CAP*/
1872*4882a593Smuzhiyun 	u8 bcn_hit_cond;
1873*4882a593Smuzhiyun 	u8 hit_rule;
1874*4882a593Smuzhiyun 	u8 tf_trs;
1875*4882a593Smuzhiyun 	u8 tgt_ind;
1876*4882a593Smuzhiyun 	u8 frm_tgt_ind;
1877*4882a593Smuzhiyun 	u8 addr_sel;
1878*4882a593Smuzhiyun 	u8 addr_msk;
1879*4882a593Smuzhiyun 
1880*4882a593Smuzhiyun 	/* rx agg */
1881*4882a593Smuzhiyun 	struct phl_tid_ampdu_rx *tid_rx[RTW_MAX_TID_NUM]; /* TID_MAX_NUM */
1882*4882a593Smuzhiyun 	_os_lock tid_rx_lock;               /* guarding @tid_rx */
1883*4882a593Smuzhiyun 	_os_event comp_sync;     /* reorder timer completion event */
1884*4882a593Smuzhiyun 	_os_timer reorder_timer; /* reorder timer for all @tid_rx of the
1885*4882a593Smuzhiyun 	                          * stainfo */
1886*4882a593Smuzhiyun 	/* TODO: add missing part */
1887*4882a593Smuzhiyun 
1888*4882a593Smuzhiyun 	/*mlme protocol or PHY related CAP*/
1889*4882a593Smuzhiyun 	struct protocol_cap_t asoc_cap;
1890*4882a593Smuzhiyun 	enum rtw_protect_mode protect;
1891*4882a593Smuzhiyun 
1892*4882a593Smuzhiyun 	/*security related*/
1893*4882a593Smuzhiyun 	u8 wapi;
1894*4882a593Smuzhiyun 	u8 sec_mode;
1895*4882a593Smuzhiyun 
1896*4882a593Smuzhiyun 	/*
1897*4882a593Smuzhiyun 	 * STA powersave, those could be implemented as bit flags but there's no
1898*4882a593Smuzhiyun 	 * corresponding atomic bit operations available on Windows.
1899*4882a593Smuzhiyun 	 */
1900*4882a593Smuzhiyun 	_os_atomic ps_sta;      /* the sta is in PS mode or not */
1901*4882a593Smuzhiyun 
1902*4882a593Smuzhiyun 	struct rtw_hal_stainfo_t *hal_sta;
1903*4882a593Smuzhiyun 
1904*4882a593Smuzhiyun #ifdef CONFIG_PHL_TXSC
1905*4882a593Smuzhiyun 	struct phl_txsc_entry phl_txsc[PHL_TXSC_ENTRY_NUM];
1906*4882a593Smuzhiyun #endif
1907*4882a593Smuzhiyun 	struct rtw_rx_bcn_info bcn_i;
1908*4882a593Smuzhiyun 	void *core_data; /* Track back to counter part in core layer */
1909*4882a593Smuzhiyun };
1910*4882a593Smuzhiyun 
1911*4882a593Smuzhiyun 
1912*4882a593Smuzhiyun 
1913*4882a593Smuzhiyun 
1914*4882a593Smuzhiyun #define WL_FUNC_P2P		BIT0
1915*4882a593Smuzhiyun #define WL_FUNC_MIRACAST	BIT1
1916*4882a593Smuzhiyun #define WL_FUNC_TDLS		BIT2
1917*4882a593Smuzhiyun #define WL_FUNC_FTM		BIT3
1918*4882a593Smuzhiyun #define WL_FUNC_BIT_NUM	4
1919*4882a593Smuzhiyun 
1920*4882a593Smuzhiyun 
1921*4882a593Smuzhiyun /* HW MAC capability*/
1922*4882a593Smuzhiyun #define HW_SUP_DBCC			BIT0
1923*4882a593Smuzhiyun #define HW_SUP_AMSDU			BIT1
1924*4882a593Smuzhiyun #define HW_SUP_TCP_TX_CHKSUM		BIT2
1925*4882a593Smuzhiyun #define HW_SUP_TCP_RX_CHKSUM		BIT3
1926*4882a593Smuzhiyun #define HW_SUP_TXPKT_CONVR		BIT4
1927*4882a593Smuzhiyun #define HW_SUP_RXPKT_CONVR		BIT5
1928*4882a593Smuzhiyun #define HW_SUP_MULTI_BSSID		BIT6
1929*4882a593Smuzhiyun #define HW_SUP_OFDMA			BIT7
1930*4882a593Smuzhiyun #define HW_SUP_CHAN_INFO		BIT8
1931*4882a593Smuzhiyun #define HW_SUP_TSSI			BIT9
1932*4882a593Smuzhiyun #define HW_SUP_TANK_K			BIT10
1933*4882a593Smuzhiyun 
1934*4882a593Smuzhiyun /*BUS Section CAP */
1935*4882a593Smuzhiyun #define HW_SUP_PCIE_PLFH		BIT20	/*payload from host*/
1936*4882a593Smuzhiyun #define HW_SUP_USB_MULTI_FUN		BIT21
1937*4882a593Smuzhiyun #define HW_SUP_SDIO_MULTI_FUN		BIT22
1938*4882a593Smuzhiyun 
1939*4882a593Smuzhiyun /* Beamform CAP */
1940*4882a593Smuzhiyun #define HW_CAP_BF_NON_SUPPORT 0
1941*4882a593Smuzhiyun #define HW_CAP_BFEE_HT_SU BIT(0)
1942*4882a593Smuzhiyun #define HW_CAP_BFER_HT_SU BIT(1)
1943*4882a593Smuzhiyun #define HW_CAP_BFEE_VHT_SU BIT(2)
1944*4882a593Smuzhiyun #define HW_CAP_BFER_VHT_SU BIT(3)
1945*4882a593Smuzhiyun #define HW_CAP_BFEE_VHT_MU BIT(4)
1946*4882a593Smuzhiyun #define HW_CAP_BFER_VHT_MU BIT(5)
1947*4882a593Smuzhiyun #define HW_CAP_BFEE_HE_SU BIT(6)
1948*4882a593Smuzhiyun #define HW_CAP_BFER_HE_SU BIT(7)
1949*4882a593Smuzhiyun #define HW_CAP_BFEE_HE_MU BIT(8)
1950*4882a593Smuzhiyun #define HW_CAP_BFER_HE_MU BIT(9)
1951*4882a593Smuzhiyun #define HW_CAP_HE_NON_TB_CQI BIT(10)
1952*4882a593Smuzhiyun #define HW_CAP_HE_TB_CQI BIT(11)
1953*4882a593Smuzhiyun 
1954*4882a593Smuzhiyun #define RTW_HW_CAP_ULRU_AUTO 0
1955*4882a593Smuzhiyun #define RTW_HW_CAP_ULRU_DISABLE 1
1956*4882a593Smuzhiyun #define RTW_HW_CAP_ULRU_ENABLE 2
1957*4882a593Smuzhiyun 
1958*4882a593Smuzhiyun /* STBC CAP */
1959*4882a593Smuzhiyun #define HW_CAP_STBC_HT_TX BIT(0)
1960*4882a593Smuzhiyun #define HW_CAP_STBC_VHT_TX BIT(1)
1961*4882a593Smuzhiyun #define HW_CAP_STBC_HE_TX BIT(2)
1962*4882a593Smuzhiyun #define HW_CAP_STBC_HE_TX_GT_80M BIT(3)
1963*4882a593Smuzhiyun #define HW_CAP_STBC_HT_RX BIT(4)
1964*4882a593Smuzhiyun #define HW_CAP_STBC_VHT_RX BIT(5)
1965*4882a593Smuzhiyun #define HW_CAP_STBC_HE_RX BIT(6)
1966*4882a593Smuzhiyun #define HW_CAP_STBC_HE_RX_GT_80M BIT(7)
1967*4882a593Smuzhiyun 
1968*4882a593Smuzhiyun struct hal_spec_t {
1969*4882a593Smuzhiyun 	char *ic_name;
1970*4882a593Smuzhiyun 	u16 macid_num;
1971*4882a593Smuzhiyun 
1972*4882a593Smuzhiyun 	u8 sec_cam_ent_num;
1973*4882a593Smuzhiyun 	u8 sec_cap;
1974*4882a593Smuzhiyun 	u8 wow_cap;
1975*4882a593Smuzhiyun 
1976*4882a593Smuzhiyun 	u8 rfpath_num_2g:4;	/* used for tx power index path */
1977*4882a593Smuzhiyun 	u8 rfpath_num_5g:4;	/* used for tx power index path */
1978*4882a593Smuzhiyun 	u8 rf_reg_path_num;
1979*4882a593Smuzhiyun 	u8 max_tx_cnt;
1980*4882a593Smuzhiyun 
1981*4882a593Smuzhiyun 	u8 band_cap;	/* value of BAND_CAP_XXX */
1982*4882a593Smuzhiyun 	u8 bw_cap;	/* value of BW_CAP_XXX */
1983*4882a593Smuzhiyun 	u8 port_num;
1984*4882a593Smuzhiyun 	u8 wmm_num;
1985*4882a593Smuzhiyun 	u8 proto_cap;	/* value of PROTO_CAP_XXX */
1986*4882a593Smuzhiyun 	u8 wl_func;	/* value of WL_FUNC_XXX */
1987*4882a593Smuzhiyun 
1988*4882a593Smuzhiyun 	/********* xmit ************/
1989*4882a593Smuzhiyun 
1990*4882a593Smuzhiyun 
1991*4882a593Smuzhiyun 	/********* recv ************/
1992*4882a593Smuzhiyun 	u8 rx_bd_info_sz;
1993*4882a593Smuzhiyun 
1994*4882a593Smuzhiyun 	u16 rx_tag[2];
1995*4882a593Smuzhiyun 	#ifdef CONFIG_USB_HCI
1996*4882a593Smuzhiyun 	u8 max_bulkin_num;
1997*4882a593Smuzhiyun 	u8 max_bulkout_num;
1998*4882a593Smuzhiyun 	#endif
1999*4882a593Smuzhiyun 	#ifdef CONFIG_PCI_HCI
2000*4882a593Smuzhiyun 	u16 txbd_multi_tag;
2001*4882a593Smuzhiyun 	u8 txbd_upd_lmt;
2002*4882a593Smuzhiyun 	#ifdef RTW_WKARD_BUSCAP_IN_HALSPEC
2003*4882a593Smuzhiyun 	u8 phyaddr_num;
2004*4882a593Smuzhiyun 	#endif
2005*4882a593Smuzhiyun 	#endif
2006*4882a593Smuzhiyun 	u8 cts2_thres_en;
2007*4882a593Smuzhiyun 	u16 cts2_thres;
2008*4882a593Smuzhiyun 	/********* beamformer ************/
2009*4882a593Smuzhiyun 	u8 max_csi_buf_su_nr;
2010*4882a593Smuzhiyun 	u8 max_csi_buf_mu_nr;
2011*4882a593Smuzhiyun 	u8 max_bf_ent_nr;
2012*4882a593Smuzhiyun 	u8 max_su_sta_nr;
2013*4882a593Smuzhiyun 	u8 max_mu_sta_nr;
2014*4882a593Smuzhiyun 
2015*4882a593Smuzhiyun };
2016*4882a593Smuzhiyun 
2017*4882a593Smuzhiyun #define phl_get_hci_type(_phlcom) (_phlcom->hci_type)
2018*4882a593Smuzhiyun #define phl_get_ic_spec(_phlcom) (&_phlcom->hal_spec)
2019*4882a593Smuzhiyun #define phl_get_fw_buf(_phlcom) (_phlcom->fw_info.ram_buff)
2020*4882a593Smuzhiyun #define phl_get_fw_size(_phlcom) (_phlcom->fw_info.ram_size)
2021*4882a593Smuzhiyun 
2022*4882a593Smuzhiyun enum rtw_drv_mode {
2023*4882a593Smuzhiyun 	RTW_DRV_MODE_NORMAL = 0,
2024*4882a593Smuzhiyun 	RTW_DRV_MODE_EQC = 1,
2025*4882a593Smuzhiyun 	RTW_DRV_MODE_HIGH_THERMAL = 2,
2026*4882a593Smuzhiyun 
2027*4882a593Smuzhiyun 	/* 11~20 for MP submodule section*/
2028*4882a593Smuzhiyun 	RTW_DRV_MODE_MP_SMDL_START = 11,
2029*4882a593Smuzhiyun 	RTW_DRV_MODE_MP = 11,
2030*4882a593Smuzhiyun 	RTW_DRV_MODE_HOMOLOGATION = 12,
2031*4882a593Smuzhiyun 	RTW_DRV_MODE_MP_SMDL_END = 20,
2032*4882a593Smuzhiyun 
2033*4882a593Smuzhiyun 	/* 21~30 for FPGA submodule section*/
2034*4882a593Smuzhiyun 	RTW_DRV_MODE_FPGA_SMDL_START = 21,
2035*4882a593Smuzhiyun 	RTW_DRV_MODE_FPGA_SMDL_END = 30,
2036*4882a593Smuzhiyun 
2037*4882a593Smuzhiyun 	/* 31~60 for VERIFY submodule section*/
2038*4882a593Smuzhiyun 	RTW_DRV_MODE_VERIFY_SMDL_START = 31,
2039*4882a593Smuzhiyun 	RTW_DRV_MODE_VERIFY_SMDL_END = 60,
2040*4882a593Smuzhiyun 
2041*4882a593Smuzhiyun 	/* 61~80 for TOOL submodule section*/
2042*4882a593Smuzhiyun 	RTW_DRV_MODE_TOOL_SMDL_START = 61,
2043*4882a593Smuzhiyun 	RTW_DRV_MODE_TOOL_SMDL_END = 80,
2044*4882a593Smuzhiyun 
2045*4882a593Smuzhiyun 	/* Fixed Max Value*/
2046*4882a593Smuzhiyun 	RTW_DRV_MODE_MAX = 255
2047*4882a593Smuzhiyun };
2048*4882a593Smuzhiyun 
2049*4882a593Smuzhiyun struct rtw_evt_info_t {
2050*4882a593Smuzhiyun 	_os_lock evt_lock;
2051*4882a593Smuzhiyun 	enum rtw_phl_evt evt_bitmap;
2052*4882a593Smuzhiyun };
2053*4882a593Smuzhiyun 
2054*4882a593Smuzhiyun // WiFi FW
2055*4882a593Smuzhiyun struct rtw_fw_info_t {
2056*4882a593Smuzhiyun 	u8 fw_en;
2057*4882a593Smuzhiyun 	u8 fw_src;
2058*4882a593Smuzhiyun 	u8 fw_type;
2059*4882a593Smuzhiyun 	u8 dlram_en;
2060*4882a593Smuzhiyun 	u8 dlrom_en;
2061*4882a593Smuzhiyun 	u8 *rom_buff;
2062*4882a593Smuzhiyun 	u32 rom_addr;
2063*4882a593Smuzhiyun 	u32 rom_size;
2064*4882a593Smuzhiyun 	char rom_path[256];
2065*4882a593Smuzhiyun 	u8 *ram_buff;
2066*4882a593Smuzhiyun 	u32 ram_size;
2067*4882a593Smuzhiyun 	char ram_path[256];
2068*4882a593Smuzhiyun 	u8 *buf;
2069*4882a593Smuzhiyun 	u32 buf_size;
2070*4882a593Smuzhiyun 	u8 *wow_buf;
2071*4882a593Smuzhiyun 	u32 wow_buf_size;
2072*4882a593Smuzhiyun 	u8 *sym_buf;
2073*4882a593Smuzhiyun 	u32 sym_buf_size;
2074*4882a593Smuzhiyun };
2075*4882a593Smuzhiyun 
2076*4882a593Smuzhiyun enum rtw_fw_status {
2077*4882a593Smuzhiyun 	RTW_FW_STATUS_OK,
2078*4882a593Smuzhiyun 	RTW_FW_STATUS_NOFW,
2079*4882a593Smuzhiyun 	RTW_FW_STATUS_ASSERT,
2080*4882a593Smuzhiyun 	RTW_FW_STATUS_EXCEP,
2081*4882a593Smuzhiyun 	RTW_FW_STATUS_RXI300,
2082*4882a593Smuzhiyun 	RTW_FW_STATUS_HANG
2083*4882a593Smuzhiyun };
2084*4882a593Smuzhiyun 
2085*4882a593Smuzhiyun #ifdef CONFIG_PHL_DFS
2086*4882a593Smuzhiyun enum dfs_regd_t {
2087*4882a593Smuzhiyun 	DFS_REGD_UNKNOWN	= 0,
2088*4882a593Smuzhiyun 	DFS_REGD_FCC	= 1,
2089*4882a593Smuzhiyun 	DFS_REGD_JAP	= 2,
2090*4882a593Smuzhiyun 	DFS_REGD_ETSI	= 3,
2091*4882a593Smuzhiyun };
2092*4882a593Smuzhiyun struct rtw_dfs_t {
2093*4882a593Smuzhiyun 	u8 region_domain;
2094*4882a593Smuzhiyun 	bool dfs_enabled;
2095*4882a593Smuzhiyun };
2096*4882a593Smuzhiyun #endif
2097*4882a593Smuzhiyun 
2098*4882a593Smuzhiyun #ifdef CONFIG_PHL_CHANNEL_INFO
2099*4882a593Smuzhiyun 
2100*4882a593Smuzhiyun #define CHAN_INFO_MAX_SIZE 65535
2101*4882a593Smuzhiyun #define MAX_CHAN_INFO_PKT_KEEP 2
2102*4882a593Smuzhiyun #define CHAN_INFO_PKT_TOTAL MAX_CHAN_INFO_PKT_KEEP + 1
2103*4882a593Smuzhiyun 
2104*4882a593Smuzhiyun struct csi_header_t {
2105*4882a593Smuzhiyun 	u8 mac_addr[6];			/* mdata: u8 ta[6]? */
2106*4882a593Smuzhiyun 	u32 hw_assigned_timestamp;	/* mdata: u32 freerun_cnt */
2107*4882a593Smuzhiyun 	u8 channel;			/* Drv define */
2108*4882a593Smuzhiyun 	u8 bandwidth;			/* mdata: u8 bw */
2109*4882a593Smuzhiyun 	u16 rx_data_rate;		/* mdata: u16 rx_rate */
2110*4882a593Smuzhiyun 	u8 nc;				/* ch_rpt_hdr_info */
2111*4882a593Smuzhiyun 	u8 nr;				/* ch_rpt_hdr_info */
2112*4882a593Smuzhiyun 	u16 num_sub_carrier;		/* Drv define*/
2113*4882a593Smuzhiyun 	u8 num_bit_per_tone;		/* Drv define per I/Q */
2114*4882a593Smuzhiyun 	u8 avg_idle_noise_pwr;		/* ch_rpt_hdr_info */
2115*4882a593Smuzhiyun 	u8 evm[2];			/* ch_rpt_hdr_info */
2116*4882a593Smuzhiyun 	u8 rssi[2];			/* phy_info_rpt */
2117*4882a593Smuzhiyun 	u32 csi_data_length;		/* ch_rpt_hdr_info */
2118*4882a593Smuzhiyun 	u8 rxsc;			/* phy_info_rpt */
2119*4882a593Smuzhiyun 	u8 ch_matrix_report;		/* mdata: u8 get_ch_info */
2120*4882a593Smuzhiyun 	u8 csi_valid;			/* ch_rpt_hdr_info */
2121*4882a593Smuzhiyun };
2122*4882a593Smuzhiyun 
2123*4882a593Smuzhiyun struct chan_info_t {
2124*4882a593Smuzhiyun 	_os_list list;
2125*4882a593Smuzhiyun 	u8* chan_info_buffer;
2126*4882a593Smuzhiyun 	u32 length;
2127*4882a593Smuzhiyun 	struct csi_header_t csi_header;
2128*4882a593Smuzhiyun };
2129*4882a593Smuzhiyun 
2130*4882a593Smuzhiyun struct rx_chan_info_pool {
2131*4882a593Smuzhiyun 	struct chan_info_t channl_info_pkt[CHAN_INFO_PKT_TOTAL];
2132*4882a593Smuzhiyun 	_os_list idle;
2133*4882a593Smuzhiyun 	_os_list busy;
2134*4882a593Smuzhiyun 	_os_lock idle_lock;	/* spinlock */
2135*4882a593Smuzhiyun 	_os_lock busy_lock;	/* spinlock */
2136*4882a593Smuzhiyun 	u32 idle_cnt;
2137*4882a593Smuzhiyun 	u32 busy_cnt;
2138*4882a593Smuzhiyun };
2139*4882a593Smuzhiyun 
2140*4882a593Smuzhiyun #endif /* CONFIG_PHL_CHANNEL_INFO */
2141*4882a593Smuzhiyun 
2142*4882a593Smuzhiyun #ifdef CONFIG_MCC_SUPPORT
2143*4882a593Smuzhiyun #define BT_SEG_NUM 2
2144*4882a593Smuzhiyun #define SLOT_NUM 4
2145*4882a593Smuzhiyun #define MIN_TDMRA_SLOT_NUM 2
2146*4882a593Smuzhiyun #define NONSPECIFIC_SETTING 0xff
2147*4882a593Smuzhiyun 
2148*4882a593Smuzhiyun /*Export to core layer. Phl get the judgement of slot mode*/
2149*4882a593Smuzhiyun enum rtw_phl_mcc_coex_mode {
2150*4882a593Smuzhiyun 	RTW_PHL_MCC_COEX_MODE_NONE = 0,
2151*4882a593Smuzhiyun 	RTW_PHL_MCC_COEX_MODE_BT_MASTER,
2152*4882a593Smuzhiyun 	RTW_PHL_MCC_COEX_MODE_WIFI_MASTER,
2153*4882a593Smuzhiyun 	RTW_PHL_MCC_COEX_MODE_BT_WIFI_BALANCE
2154*4882a593Smuzhiyun };
2155*4882a593Smuzhiyun 
2156*4882a593Smuzhiyun enum rtw_phl_tdmra_wmode {
2157*4882a593Smuzhiyun 	RTW_PHL_TDMRA_WMODE_NONE = 0,
2158*4882a593Smuzhiyun 	RTW_PHL_TDMRA_AP_CLIENT_WMODE,
2159*4882a593Smuzhiyun 	RTW_PHL_TDMRA_2CLIENTS_WMODE,
2160*4882a593Smuzhiyun 	RTW_PHL_TDMRA_AP_WMODE,
2161*4882a593Smuzhiyun 	RTW_PHL_TDMRA_UNKNOWN_WMODE
2162*4882a593Smuzhiyun };
2163*4882a593Smuzhiyun 
2164*4882a593Smuzhiyun enum rtw_phl_mcc_dbg_type {
2165*4882a593Smuzhiyun 	MCC_DBG_NONE = 0,
2166*4882a593Smuzhiyun 	MCC_DBG_STATE,
2167*4882a593Smuzhiyun 	MCC_DBG_OP_MODE,
2168*4882a593Smuzhiyun 	MCC_DBG_COEX_MODE,
2169*4882a593Smuzhiyun 	MCC_DBG_BT_INFO,
2170*4882a593Smuzhiyun 	MCC_DBG_EN_INFO
2171*4882a593Smuzhiyun };
2172*4882a593Smuzhiyun 
2173*4882a593Smuzhiyun enum rtw_phl_mcc_state {
2174*4882a593Smuzhiyun 	MCC_NONE = 0,
2175*4882a593Smuzhiyun 	MCC_CFG_EN_INFO,
2176*4882a593Smuzhiyun 	MCC_TRIGGER_FW_EN,
2177*4882a593Smuzhiyun 	MCC_FW_EN_FAIL,
2178*4882a593Smuzhiyun 	MCC_RUNING,
2179*4882a593Smuzhiyun 	MCC_TRIGGER_FW_DIS,
2180*4882a593Smuzhiyun 	MCC_FW_DIS_FAIL,
2181*4882a593Smuzhiyun 	MCC_STOP
2182*4882a593Smuzhiyun };
2183*4882a593Smuzhiyun 
2184*4882a593Smuzhiyun enum rtw_phl_mcc_dur_lim_tag {
2185*4882a593Smuzhiyun 	RTW_MCC_DUR_LIM_NONE = 0,
2186*4882a593Smuzhiyun 	RTW_MCC_DUR_LIM_NOA
2187*4882a593Smuzhiyun };
2188*4882a593Smuzhiyun 
2189*4882a593Smuzhiyun /*Export to core layer and hal layyer. Phl get the c2h report mode and config to halmac*/
2190*4882a593Smuzhiyun enum rtw_phl_mcc_rpt {
2191*4882a593Smuzhiyun 	RTW_MCC_RPT_OFF = 0,
2192*4882a593Smuzhiyun 	RTW_MCC_RPT_FAIL_ONLY,
2193*4882a593Smuzhiyun 	RTW_MCC_RPT_ALL
2194*4882a593Smuzhiyun };
2195*4882a593Smuzhiyun 
2196*4882a593Smuzhiyun /*Export to core layer. Phl get switch ch setting of role from core layer*/
2197*4882a593Smuzhiyun struct rtw_phl_mcc_setting_info {
2198*4882a593Smuzhiyun 	struct rtw_wifi_role_t *wrole;
2199*4882a593Smuzhiyun 	u8 role_map;/*the wifi role map in operating mcc */
2200*4882a593Smuzhiyun 	u8 tx_null_early;
2201*4882a593Smuzhiyun 	u16 dur; /*core specific duration in a period of 100 ms */
2202*4882a593Smuzhiyun 	bool en_fw_mcc_log;
2203*4882a593Smuzhiyun 	u8 fw_mcc_log_lv;/* fw mcc log level */
2204*4882a593Smuzhiyun };
2205*4882a593Smuzhiyun 
2206*4882a593Smuzhiyun /*Export to core layer. Core get NOA info to update p2p beacon*/
2207*4882a593Smuzhiyun struct rtw_phl_mcc_noa {
2208*4882a593Smuzhiyun 	struct rtw_wifi_role_t *wrole;
2209*4882a593Smuzhiyun 	u32 start_t_h;
2210*4882a593Smuzhiyun 	u32 start_t_l;
2211*4882a593Smuzhiyun 	u16 dur;
2212*4882a593Smuzhiyun 	u16 interval;
2213*4882a593Smuzhiyun 	u8 cnt;
2214*4882a593Smuzhiyun };
2215*4882a593Smuzhiyun 
2216*4882a593Smuzhiyun struct rtw_phl_mcc_ops {
2217*4882a593Smuzhiyun 	void *priv; /* ops private, define by core layer*/
2218*4882a593Smuzhiyun 	int (*mcc_update_noa)(void *priv, struct rtw_phl_mcc_noa *param);
2219*4882a593Smuzhiyun 	int (*mcc_get_setting)(void *priv, struct rtw_phl_mcc_setting_info *param);
2220*4882a593Smuzhiyun };
2221*4882a593Smuzhiyun 
2222*4882a593Smuzhiyun /*
2223*4882a593Smuzhiyun  * Export to phl layer and hal layer.
2224*4882a593Smuzhiyun  * Record the debug info.
2225*4882a593Smuzhiyun */
2226*4882a593Smuzhiyun struct rtw_phl_mcc_dbg_slot_info {
2227*4882a593Smuzhiyun 	bool bt_role;
2228*4882a593Smuzhiyun 	u16 dur;
2229*4882a593Smuzhiyun 	u16 ch;
2230*4882a593Smuzhiyun 	u16 macid;
2231*4882a593Smuzhiyun };
2232*4882a593Smuzhiyun 
2233*4882a593Smuzhiyun struct rtw_phl_mcc_dbg_hal_info {
2234*4882a593Smuzhiyun 	u8 slot_num;
2235*4882a593Smuzhiyun 	struct rtw_phl_mcc_dbg_slot_info dbg_slot_i[SLOT_NUM];
2236*4882a593Smuzhiyun 	bool btc_in_group;
2237*4882a593Smuzhiyun };
2238*4882a593Smuzhiyun 
2239*4882a593Smuzhiyun struct rtw_phl_mcc_macid_bitmap {
2240*4882a593Smuzhiyun 	u32 *bitmap;
2241*4882a593Smuzhiyun 	u8 len;
2242*4882a593Smuzhiyun };
2243*4882a593Smuzhiyun 
2244*4882a593Smuzhiyun struct rtw_phl_mcc_sync_tsf_info {
2245*4882a593Smuzhiyun 	u8 sync_en;
2246*4882a593Smuzhiyun 	u16 source;
2247*4882a593Smuzhiyun 	u16 target;
2248*4882a593Smuzhiyun 	u16 offset;
2249*4882a593Smuzhiyun };
2250*4882a593Smuzhiyun 
2251*4882a593Smuzhiyun struct rtw_phl_mcc_dur_lim_info {
2252*4882a593Smuzhiyun 	bool enable;
2253*4882a593Smuzhiyun 	enum rtw_phl_mcc_dur_lim_tag tag;
2254*4882a593Smuzhiyun 	u16 max_tob;
2255*4882a593Smuzhiyun 	u16 max_toa;
2256*4882a593Smuzhiyun 	u16 max_dur;
2257*4882a593Smuzhiyun };
2258*4882a593Smuzhiyun 
2259*4882a593Smuzhiyun struct rtw_phl_mcc_dur_info {
2260*4882a593Smuzhiyun 	u16 dur;
2261*4882a593Smuzhiyun 	struct rtw_phl_mcc_dur_lim_info dur_limit;
2262*4882a593Smuzhiyun };
2263*4882a593Smuzhiyun 
2264*4882a593Smuzhiyun struct rtw_phl_mcc_policy_info {
2265*4882a593Smuzhiyun 	u8 c2h_rpt;
2266*4882a593Smuzhiyun 	u8 tx_null_early;
2267*4882a593Smuzhiyun 	u8 dis_tx_null;
2268*4882a593Smuzhiyun 	u8 in_curr_ch;
2269*4882a593Smuzhiyun 	u8 dis_sw_retry;
2270*4882a593Smuzhiyun 	u8 sw_retry_count;
2271*4882a593Smuzhiyun 	struct rtw_phl_mcc_dur_info dur_info;
2272*4882a593Smuzhiyun 	u8 rfk_chk;
2273*4882a593Smuzhiyun 	u8 protect_bcn;
2274*4882a593Smuzhiyun 	u8 courtesy_en;
2275*4882a593Smuzhiyun 	u8 courtesy_num;
2276*4882a593Smuzhiyun 	u8 courtesy_target;
2277*4882a593Smuzhiyun };
2278*4882a593Smuzhiyun 
2279*4882a593Smuzhiyun struct rtw_phl_mcc_role {
2280*4882a593Smuzhiyun 	struct rtw_wifi_role_t *wrole;
2281*4882a593Smuzhiyun 	struct rtw_phl_mcc_macid_bitmap used_macid;
2282*4882a593Smuzhiyun 	struct rtw_chan_def *chandef;
2283*4882a593Smuzhiyun 	struct rtw_phl_mcc_policy_info policy;
2284*4882a593Smuzhiyun 	u16 macid;
2285*4882a593Smuzhiyun 	u16 bcn_intvl;
2286*4882a593Smuzhiyun 	bool bt_role;
2287*4882a593Smuzhiyun 	u8 group;
2288*4882a593Smuzhiyun };
2289*4882a593Smuzhiyun 
2290*4882a593Smuzhiyun /*
2291*4882a593Smuzhiyun  * @c_en: Enable courtesy function
2292*4882a593Smuzhiyun  * @c_num: the time slot of src_role replace by tgt_role
2293*4882a593Smuzhiyun  */
2294*4882a593Smuzhiyun struct rtw_phl_mcc_courtesy {
2295*4882a593Smuzhiyun 	bool c_en;
2296*4882a593Smuzhiyun 	bool c_num;
2297*4882a593Smuzhiyun 	struct rtw_phl_mcc_role *src_role;
2298*4882a593Smuzhiyun 	struct rtw_phl_mcc_role *tgt_role;
2299*4882a593Smuzhiyun };
2300*4882a593Smuzhiyun 
2301*4882a593Smuzhiyun /*
2302*4882a593Smuzhiyun  * @slot: duration, unit: TU
2303*4882a593Smuzhiyun  * @bt_role: True: bt role, False: Wifi role
2304*4882a593Smuzhiyun  * @mrole: mcc role info for Wifi Role
2305*4882a593Smuzhiyun  */
2306*4882a593Smuzhiyun struct rtw_phl_mcc_slot_info {
2307*4882a593Smuzhiyun 	u16 slot;
2308*4882a593Smuzhiyun 	bool bt_role;
2309*4882a593Smuzhiyun 	struct rtw_phl_mcc_role *mrole;
2310*4882a593Smuzhiyun };
2311*4882a593Smuzhiyun 
2312*4882a593Smuzhiyun /*
2313*4882a593Smuzhiyun  * @slot_num: total slot num(Wifi+BT)
2314*4882a593Smuzhiyun  * @bt_slot_num: total BT slot num
2315*4882a593Smuzhiyun  * |      Dur1      |     Dur2      |
2316*4882a593Smuzhiyun  * 	bcn              bcn
2317*4882a593Smuzhiyun  * |tob_r | toa_r|tob_a | toa_a|
2318*4882a593Smuzhiyun  */
2319*4882a593Smuzhiyun struct rtw_phl_mcc_pattern {
2320*4882a593Smuzhiyun 	u8 slot_num;
2321*4882a593Smuzhiyun 	u8 bt_slot_num;
2322*4882a593Smuzhiyun 	struct rtw_phl_mcc_role *role_ref;
2323*4882a593Smuzhiyun 	struct rtw_phl_mcc_role *role_ano;
2324*4882a593Smuzhiyun 	s16 tob_r;
2325*4882a593Smuzhiyun 	s16 toa_r;
2326*4882a593Smuzhiyun 	s16 tob_a;
2327*4882a593Smuzhiyun 	s16 toa_a;
2328*4882a593Smuzhiyun 	u16 bcns_offset;
2329*4882a593Smuzhiyun 
2330*4882a593Smuzhiyun 	u16 calc_fail;
2331*4882a593Smuzhiyun 	/**
2332*4882a593Smuzhiyun 	* |tob_r|toa_r|
2333*4882a593Smuzhiyun 	* -----------<d_r_d_a_spacing>-----------
2334*4882a593Smuzhiyun 	*                                               |tob_a|toa_a|
2335*4882a593Smuzhiyun 	**/
2336*4882a593Smuzhiyun 	u16 d_r_d_a_spacing_max;
2337*4882a593Smuzhiyun 	struct rtw_phl_mcc_courtesy courtesy_i;
2338*4882a593Smuzhiyun 	/*record slot order for X wifi slot + Y bt slot*/
2339*4882a593Smuzhiyun 	struct rtw_phl_mcc_slot_info slot_order[SLOT_NUM];
2340*4882a593Smuzhiyun };
2341*4882a593Smuzhiyun 
2342*4882a593Smuzhiyun /*
2343*4882a593Smuzhiyun  * Enable info for mcc
2344*4882a593Smuzhiyun  * @ref_role_idx: the index of reference role
2345*4882a593Smuzhiyun  * @mrole_map: use mcc role num
2346*4882a593Smuzhiyun  * @mrole_num: use mcc role num
2347*4882a593Smuzhiyun  * @group: assigned by halmac mcc, the group resource of fw feture, phl layer ignore it
2348*4882a593Smuzhiyun  *	fw mcc can handle differenec slot pattern, and the group is the id of slot pattern.
2349*4882a593Smuzhiyun  * @tsf_high, tsf_low: Start TSF
2350*4882a593Smuzhiyun  * @tsf_high_l, tsf_low_l: Limitation of Start TSF
2351*4882a593Smuzhiyun  * @dbg_hal_i: Debug info for hal mcc
2352*4882a593Smuzhiyun  */
2353*4882a593Smuzhiyun struct rtw_phl_mcc_en_info {
2354*4882a593Smuzhiyun 	struct rtw_phl_mcc_role mcc_role[MCC_ROLE_NUM];
2355*4882a593Smuzhiyun 	struct rtw_phl_mcc_sync_tsf_info sync_tsf_info;
2356*4882a593Smuzhiyun 	struct rtw_phl_mcc_pattern m_pattern;
2357*4882a593Smuzhiyun 	u8 ref_role_idx;
2358*4882a593Smuzhiyun 	u8 mrole_map;
2359*4882a593Smuzhiyun 	u8 mrole_num;
2360*4882a593Smuzhiyun 	u8 group;
2361*4882a593Smuzhiyun 	u16 mcc_intvl;
2362*4882a593Smuzhiyun 	u32 tsf_high;
2363*4882a593Smuzhiyun 	u32 tsf_low;
2364*4882a593Smuzhiyun 	u32 tsf_high_l;
2365*4882a593Smuzhiyun 	u32 tsf_low_l;
2366*4882a593Smuzhiyun 	struct rtw_phl_mcc_dbg_hal_info dbg_hal_i;
2367*4882a593Smuzhiyun };
2368*4882a593Smuzhiyun 
2369*4882a593Smuzhiyun /*
2370*4882a593Smuzhiyun  * Bt info
2371*4882a593Smuzhiyun  * @bt_dur: bt slot
2372*4882a593Smuzhiyun  * @bt_seg: segment bt slot
2373*4882a593Smuzhiyun  * @bt_seg_num: segment num
2374*4882a593Smuzhiyun  * @add_bt_role: if add_bt_role = true, we need to add bt slot to fw
2375*4882a593Smuzhiyun  */
2376*4882a593Smuzhiyun struct rtw_phl_mcc_bt_info {
2377*4882a593Smuzhiyun 	u16 bt_dur;
2378*4882a593Smuzhiyun 	u16 bt_seg[BT_SEG_NUM];
2379*4882a593Smuzhiyun 	u8 bt_seg_num;
2380*4882a593Smuzhiyun 	bool add_bt_role;
2381*4882a593Smuzhiyun };
2382*4882a593Smuzhiyun 
2383*4882a593Smuzhiyun enum rtw_phl_mcc_chk_inprocess_type {
2384*4882a593Smuzhiyun 	RTW_PHL_MCC_CHK_INPROGRESS = 0,
2385*4882a593Smuzhiyun 	RTW_PHL_MCC_CHK_INPROGRESS_SINGLE_CH,
2386*4882a593Smuzhiyun 	RTW_PHL_MCC_CHK_INPROGRESS_MULTI_CH,
2387*4882a593Smuzhiyun 	RTW_PHL_MCC_CHK_MAX,
2388*4882a593Smuzhiyun };
2389*4882a593Smuzhiyun 
2390*4882a593Smuzhiyun enum mr_coex_trigger {
2391*4882a593Smuzhiyun 	MR_COEX_TRIG_BY_BT,
2392*4882a593Smuzhiyun 	MR_COEX_TRIG_BY_LINKING,
2393*4882a593Smuzhiyun 	MR_COEX_TRIG_BY_DIS_LINKING,
2394*4882a593Smuzhiyun 	MR_COEX_TRIG_BY_CHG_SLOT,
2395*4882a593Smuzhiyun 	MR_COEX_TRIG_BY_SCAN,
2396*4882a593Smuzhiyun 	MR_COEX_TRIG_BY_ECSA,
2397*4882a593Smuzhiyun 	MR_COEX_TRIG_BY_CHG_OP_CHDEF,
2398*4882a593Smuzhiyun 	MR_COEX_TRIG_MAX,
2399*4882a593Smuzhiyun };
2400*4882a593Smuzhiyun 
2401*4882a593Smuzhiyun #endif /* CONFIG_MCC_SUPPORT */
2402*4882a593Smuzhiyun 
2403*4882a593Smuzhiyun /*multi-roles control components*/
2404*4882a593Smuzhiyun enum mr_op_mode {
2405*4882a593Smuzhiyun 	MR_OP_NON,
2406*4882a593Smuzhiyun 	MR_OP_SCC,
2407*4882a593Smuzhiyun 	MR_OP_MCC,
2408*4882a593Smuzhiyun 	MR_OP_MAX,
2409*4882a593Smuzhiyun };
2410*4882a593Smuzhiyun 
2411*4882a593Smuzhiyun enum mr_op_type {
2412*4882a593Smuzhiyun 	MR_OP_TYPE_NONE,
2413*4882a593Smuzhiyun 	MR_OP_TYPE_STATION_ONLY,
2414*4882a593Smuzhiyun 	MR_OP_TYPE_AP_ONLY,
2415*4882a593Smuzhiyun 	MR_OP_TYPE_STATION_AP,
2416*4882a593Smuzhiyun 	MR_OP_TYPE_MAX,
2417*4882a593Smuzhiyun };
2418*4882a593Smuzhiyun 
2419*4882a593Smuzhiyun struct mr_info {
2420*4882a593Smuzhiyun 	u8 sta_num;
2421*4882a593Smuzhiyun 	u8 ld_sta_num;
2422*4882a593Smuzhiyun 	u8 lg_sta_num;		/* WIFI_STATION_STATE && WIFI_UNDER_LINKING */
2423*4882a593Smuzhiyun 
2424*4882a593Smuzhiyun 	u8 ap_num;
2425*4882a593Smuzhiyun 	u8 ld_ap_num;	/*&& asoc_sta_count > 2*/
2426*4882a593Smuzhiyun 	u8 monitor_num;
2427*4882a593Smuzhiyun 
2428*4882a593Smuzhiyun 	u8 p2p_device_num;
2429*4882a593Smuzhiyun 	u8 p2p_gc_num;
2430*4882a593Smuzhiyun 	u8 p2p_go_num;
2431*4882a593Smuzhiyun 
2432*4882a593Smuzhiyun #ifdef CONFIG_PHL_TDLS
2433*4882a593Smuzhiyun 	u8 ld_tdls_num;	/* phl_role->type == PHL_RTYPE_TDLS */
2434*4882a593Smuzhiyun #endif
2435*4882a593Smuzhiyun 
2436*4882a593Smuzhiyun #if 0
2437*4882a593Smuzhiyun #ifdef CONFIG_AP_MODE
2438*4882a593Smuzhiyun 	u8 starting_ap_num;	/*WIFI_FW_AP_STATE*/
2439*4882a593Smuzhiyun #endif
2440*4882a593Smuzhiyun 	u8 adhoc_num;		/* (WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE) && WIFI_ASOC_STATE */
2441*4882a593Smuzhiyun 	u8 ld_adhoc_num;	/* (WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE) && WIFI_ASOC_STATE && asoc_sta_count > 2 */
2442*4882a593Smuzhiyun #ifdef CONFIG_RTW_MESH
2443*4882a593Smuzhiyun 	u8 mesh_num;		/* WIFI_MESH_STATE &&  WIFI_ASOC_STATE */
2444*4882a593Smuzhiyun 	u8 ld_mesh_num;		/* WIFI_MESH_STATE &&  WIFI_ASOC_STATE && asoc_sta_count > 2 */
2445*4882a593Smuzhiyun #endif
2446*4882a593Smuzhiyun #endif
2447*4882a593Smuzhiyun };
2448*4882a593Smuzhiyun 
2449*4882a593Smuzhiyun enum mr_coex_mode {
2450*4882a593Smuzhiyun 	MR_COEX_MODE_NONE = 0,
2451*4882a593Smuzhiyun 	MR_COEX_MODE_2GSCC_1AP_1STA_BTC = 1,
2452*4882a593Smuzhiyun 	MR_COEX_MODE_TDMRA = 2
2453*4882a593Smuzhiyun };
2454*4882a593Smuzhiyun 
2455*4882a593Smuzhiyun /*export to core layer*/
2456*4882a593Smuzhiyun struct mr_query_info {
2457*4882a593Smuzhiyun 	struct mr_info cur_info;
2458*4882a593Smuzhiyun 	enum mr_op_mode op_mode;
2459*4882a593Smuzhiyun 	enum mr_op_type op_type;
2460*4882a593Smuzhiyun };
2461*4882a593Smuzhiyun 
2462*4882a593Smuzhiyun struct hw_band_ctl_t {
2463*4882a593Smuzhiyun 	_os_lock lock;
2464*4882a593Smuzhiyun 	u8 id;
2465*4882a593Smuzhiyun 	u8 port_map; /*used port_idx*/
2466*4882a593Smuzhiyun 	u8 role_map; /*used role_idx*/
2467*4882a593Smuzhiyun 	u8 wmm_map;
2468*4882a593Smuzhiyun 	struct mr_info cur_info;
2469*4882a593Smuzhiyun 	enum mr_op_mode op_mode;
2470*4882a593Smuzhiyun 	enum mr_op_type op_type;
2471*4882a593Smuzhiyun 	enum phl_hw_port tsf_sync_port;
2472*4882a593Smuzhiyun 	struct phl_queue chan_ctx_queue;/*struct rtw_chan_ctx*/
2473*4882a593Smuzhiyun 	enum mr_coex_mode coex_mode;
2474*4882a593Smuzhiyun #ifdef CONFIG_MCC_SUPPORT
2475*4882a593Smuzhiyun 	void *mcc_info; /*struct phl_mcc_info*/
2476*4882a593Smuzhiyun #endif
2477*4882a593Smuzhiyun };
2478*4882a593Smuzhiyun 
2479*4882a593Smuzhiyun #define MAX_BAND_NUM 2
2480*4882a593Smuzhiyun struct rtw_hal_com_t;
2481*4882a593Smuzhiyun 
2482*4882a593Smuzhiyun #ifdef CONFIG_PHL_P2PPS
2483*4882a593Smuzhiyun struct rtw_phl_noa {
2484*4882a593Smuzhiyun 	struct rtw_wifi_role_t *wrole;
2485*4882a593Smuzhiyun 	enum p2pps_trig_tag tag;
2486*4882a593Smuzhiyun 	u32 start_t_h;
2487*4882a593Smuzhiyun 	u32 start_t_l;
2488*4882a593Smuzhiyun 	u16 dur;
2489*4882a593Smuzhiyun 	u8 cnt;
2490*4882a593Smuzhiyun 	u16 interval;
2491*4882a593Smuzhiyun };
2492*4882a593Smuzhiyun #endif
2493*4882a593Smuzhiyun 
2494*4882a593Smuzhiyun struct rtw_phl_mr_ops {
2495*4882a593Smuzhiyun 	void *priv; /* ops private, define by core layer*/
2496*4882a593Smuzhiyun #ifdef CONFIG_PHL_P2PPS
2497*4882a593Smuzhiyun 	int (*phl_mr_update_noa)(void *priv, struct rtw_phl_noa *param);
2498*4882a593Smuzhiyun #endif
2499*4882a593Smuzhiyun #ifdef CONFIG_MCC_SUPPORT
2500*4882a593Smuzhiyun 	struct rtw_phl_mcc_ops *mcc_ops;
2501*4882a593Smuzhiyun #endif
2502*4882a593Smuzhiyun };
2503*4882a593Smuzhiyun 
2504*4882a593Smuzhiyun struct mr_ctl_t {
2505*4882a593Smuzhiyun 	struct rtw_hal_com_t *hal_com;
2506*4882a593Smuzhiyun 	_os_lock lock;
2507*4882a593Smuzhiyun 	struct hw_band_ctl_t band_ctrl[MAX_BAND_NUM];
2508*4882a593Smuzhiyun 	struct phl_bk_module_ops bk_ops;
2509*4882a593Smuzhiyun 	u8 role_map;
2510*4882a593Smuzhiyun 	bool is_sb;
2511*4882a593Smuzhiyun 	struct rtw_phl_mr_ops mr_ops;
2512*4882a593Smuzhiyun #ifdef CONFIG_MCC_SUPPORT
2513*4882a593Smuzhiyun 	u8 init_mcc;
2514*4882a593Smuzhiyun 	void *com_mcc;/*struct phl_com_mcc_info*/
2515*4882a593Smuzhiyun #endif
2516*4882a593Smuzhiyun };
2517*4882a593Smuzhiyun 
2518*4882a593Smuzhiyun enum rtw_rssi_type {
2519*4882a593Smuzhiyun 	RTW_RSSI_DATA_ACAM,
2520*4882a593Smuzhiyun 	RTW_RSSI_DATA_ACAM_A1M,
2521*4882a593Smuzhiyun 	RTW_RSSI_DATA_OTHER,
2522*4882a593Smuzhiyun 	RTW_RSSI_CTRL_ACAM,
2523*4882a593Smuzhiyun 	RTW_RSSI_CTRL_ACAM_A1M,
2524*4882a593Smuzhiyun 	RTW_RSSI_CTRL_OTHER,
2525*4882a593Smuzhiyun 	RTW_RSSI_MGNT_ACAM,
2526*4882a593Smuzhiyun 	RTW_RSSI_MGNT_ACAM_A1M,
2527*4882a593Smuzhiyun 	RTW_RSSI_MGNT_OTHER,
2528*4882a593Smuzhiyun 	RTW_RSSI_UNKNOWN,
2529*4882a593Smuzhiyun 	RTW_RSSI_TYPE_MAX
2530*4882a593Smuzhiyun };
2531*4882a593Smuzhiyun 
2532*4882a593Smuzhiyun #define PHL_MAX_RSSI 110
2533*4882a593Smuzhiyun #define PHL_RSSI_MAVG_NUM 16
2534*4882a593Smuzhiyun #define UPDATE_MA_RSSI(_RSSI, _TYPE, _VAL) \
2535*4882a593Smuzhiyun 	do { \
2536*4882a593Smuzhiyun 		u8 oldest_rssi = 0; \
2537*4882a593Smuzhiyun 		if(_RSSI->ma_rssi_ele_idx[_TYPE] < PHL_RSSI_MAVG_NUM) { \
2538*4882a593Smuzhiyun 			oldest_rssi = _RSSI->ma_rssi_ele[_TYPE][\
2539*4882a593Smuzhiyun 					_RSSI->ma_rssi_ele_idx[_TYPE]]; \
2540*4882a593Smuzhiyun 			_RSSI->ma_rssi_ele[_TYPE][_RSSI->ma_rssi_ele_idx[_TYPE]] = \
2541*4882a593Smuzhiyun 				((_VAL > PHL_MAX_RSSI) ? PHL_MAX_RSSI : _VAL ); \
2542*4882a593Smuzhiyun 		} else { \
2543*4882a593Smuzhiyun 			_RSSI->ma_rssi_ele_idx[_TYPE] = 0; \
2544*4882a593Smuzhiyun 			oldest_rssi = _RSSI->ma_rssi_ele[_TYPE][0]; \
2545*4882a593Smuzhiyun 			_RSSI->ma_rssi_ele[_TYPE][0] = \
2546*4882a593Smuzhiyun 				((_VAL > PHL_MAX_RSSI) ? PHL_MAX_RSSI : _VAL ); \
2547*4882a593Smuzhiyun 		} \
2548*4882a593Smuzhiyun 		_RSSI->ma_rssi_ele_sum[_TYPE] -= oldest_rssi;\
2549*4882a593Smuzhiyun 		_RSSI->ma_rssi_ele_sum[_TYPE] += \
2550*4882a593Smuzhiyun 			((_VAL > PHL_MAX_RSSI) ? PHL_MAX_RSSI : _VAL ); \
2551*4882a593Smuzhiyun 		_RSSI->ma_rssi_ele_idx[_TYPE]++; \
2552*4882a593Smuzhiyun 		if(_RSSI->ma_rssi_ele_cnt[_TYPE] < PHL_RSSI_MAVG_NUM) \
2553*4882a593Smuzhiyun 			_RSSI->ma_rssi_ele_cnt[_TYPE]++; \
2554*4882a593Smuzhiyun 		_RSSI->ma_rssi[_TYPE] = (u8)(_RSSI->ma_rssi_ele_sum[_TYPE] / \
2555*4882a593Smuzhiyun 			_RSSI->ma_rssi_ele_cnt[_TYPE]);\
2556*4882a593Smuzhiyun 	} while (0)
2557*4882a593Smuzhiyun 
2558*4882a593Smuzhiyun #define PHL_TRANS_2_RSSI(X) (X >> 1)
2559*4882a593Smuzhiyun 
2560*4882a593Smuzhiyun struct rtw_phl_rssi_stat {
2561*4882a593Smuzhiyun 	_os_lock lock;
2562*4882a593Smuzhiyun 	u8 ma_rssi_ele_idx[RTW_RSSI_TYPE_MAX];
2563*4882a593Smuzhiyun 	u8 ma_rssi_ele_cnt[RTW_RSSI_TYPE_MAX]; /* maximum : PHL_RSSI_MAVG_NUM */
2564*4882a593Smuzhiyun 	u8 ma_rssi_ele[RTW_RSSI_TYPE_MAX][PHL_RSSI_MAVG_NUM]; /* rssi element for moving average */
2565*4882a593Smuzhiyun 	u32 ma_rssi_ele_sum[RTW_RSSI_TYPE_MAX];
2566*4882a593Smuzhiyun 	u8 ma_rssi[RTW_RSSI_TYPE_MAX]; /* moving average : 0~PHL_MAX_RSSI (dBm = rssi - PHL_MAX_RSSI) */
2567*4882a593Smuzhiyun };
2568*4882a593Smuzhiyun 
2569*4882a593Smuzhiyun #define PHL_MAX_PPDU_CNT 8
2570*4882a593Smuzhiyun #define PHL_MAX_PPDU_STA_NUM 4
2571*4882a593Smuzhiyun struct rtw_phl_ppdu_sts_sta_ent {
2572*4882a593Smuzhiyun 	u8 vld;
2573*4882a593Smuzhiyun 	/*u8 rssi;*/
2574*4882a593Smuzhiyun 	u16 macid;
2575*4882a593Smuzhiyun };
2576*4882a593Smuzhiyun struct rtw_phl_ppdu_phy_info {
2577*4882a593Smuzhiyun 	bool is_valid;
2578*4882a593Smuzhiyun 	u8 rssi; /*signal power : 0 - PHL_MAX_RSSI, rssi dbm = PHL_MAX_RSSI - value*/
2579*4882a593Smuzhiyun 	u8 rssi_path[RTW_PHL_MAX_RF_PATH];/*PATH A, PATH B ... PATH D*/
2580*4882a593Smuzhiyun 	u8 ch_idx;
2581*4882a593Smuzhiyun 	u8 tx_bf;
2582*4882a593Smuzhiyun 	u8 frame_type; /* type + subtype */
2583*4882a593Smuzhiyun };
2584*4882a593Smuzhiyun #ifdef CONFIG_PHY_INFO_NTFY
2585*4882a593Smuzhiyun struct rtw_phl_ppdu_sts_ntfy {
2586*4882a593Smuzhiyun 	bool vld;
2587*4882a593Smuzhiyun 	u8 frame_type;
2588*4882a593Smuzhiyun 	u8 src_mac_addr[MAC_ADDRESS_LENGTH];
2589*4882a593Smuzhiyun 	struct rtw_phl_ppdu_phy_info phy_info;
2590*4882a593Smuzhiyun };
2591*4882a593Smuzhiyun #endif
2592*4882a593Smuzhiyun struct rtw_phl_ppdu_sts_ent {
2593*4882a593Smuzhiyun 	/* from normal data */
2594*4882a593Smuzhiyun 	u8 frame_type;
2595*4882a593Smuzhiyun 	u8 addr_cam_vld;
2596*4882a593Smuzhiyun 	u8 crc32;
2597*4882a593Smuzhiyun 	u8 ppdu_type;
2598*4882a593Smuzhiyun 	u16 rx_rate;
2599*4882a593Smuzhiyun 	u8 src_mac_addr[MAC_ADDRESS_LENGTH];
2600*4882a593Smuzhiyun 
2601*4882a593Smuzhiyun 	/* from ppdu status */
2602*4882a593Smuzhiyun 	bool valid;
2603*4882a593Smuzhiyun 	bool phl_done;
2604*4882a593Smuzhiyun 	u8 usr_num;
2605*4882a593Smuzhiyun 	u32 freerun_cnt;
2606*4882a593Smuzhiyun 	struct rtw_phl_ppdu_phy_info phy_info;
2607*4882a593Smuzhiyun 	struct rtw_phl_ppdu_sts_sta_ent sta[PHL_MAX_PPDU_STA_NUM];
2608*4882a593Smuzhiyun #ifdef CONFIG_PHL_RX_PSTS_PER_PKT
2609*4882a593Smuzhiyun 	/* for ppdu status per pkt */
2610*4882a593Smuzhiyun 	struct phl_queue frames;
2611*4882a593Smuzhiyun #endif
2612*4882a593Smuzhiyun };
2613*4882a593Smuzhiyun struct rtw_phl_ppdu_sts_info {
2614*4882a593Smuzhiyun 	struct rtw_phl_ppdu_sts_ent sts_ent[HW_BAND_MAX][PHL_MAX_PPDU_CNT];
2615*4882a593Smuzhiyun 	u8 cur_rx_ppdu_cnt[HW_BAND_MAX];
2616*4882a593Smuzhiyun 	bool en_ppdu_sts[HW_BAND_MAX];
2617*4882a593Smuzhiyun 	bool latest_rx_is_psts[HW_BAND_MAX];
2618*4882a593Smuzhiyun #ifdef CONFIG_PHL_RX_PSTS_PER_PKT
2619*4882a593Smuzhiyun 	bool en_psts_per_pkt;
2620*4882a593Smuzhiyun 	bool psts_ampdu;
2621*4882a593Smuzhiyun #define RTW_PHL_PSTS_FLTR_MGNT BIT(RTW_FRAME_TYPE_MGNT)
2622*4882a593Smuzhiyun #define RTW_PHL_PSTS_FLTR_CTRL BIT(RTW_FRAME_TYPE_CTRL)
2623*4882a593Smuzhiyun #define RTW_PHL_PSTS_FLTR_DATA BIT(RTW_FRAME_TYPE_DATA)
2624*4882a593Smuzhiyun #define RTW_PHL_PSTS_FLTR_EXT_RSVD BIT(RTW_FRAME_TYPE_EXT_RSVD)
2625*4882a593Smuzhiyun 	u8 ppdu_sts_filter;
2626*4882a593Smuzhiyun 	u8 en_fake_psts;
2627*4882a593Smuzhiyun 	u8 cur_ppdu_cnt[HW_BAND_MAX];
2628*4882a593Smuzhiyun #endif
2629*4882a593Smuzhiyun #ifdef CONFIG_PHY_INFO_NTFY
2630*4882a593Smuzhiyun #define MAX_PSTS_MSG_AGGR_NUM 10
2631*4882a593Smuzhiyun 	struct rtw_phl_ppdu_sts_ntfy msg_aggr_buf[MAX_PSTS_MSG_AGGR_NUM];
2632*4882a593Smuzhiyun 	u8 msg_aggr_cnt;
2633*4882a593Smuzhiyun #endif
2634*4882a593Smuzhiyun };
2635*4882a593Smuzhiyun 
2636*4882a593Smuzhiyun struct rtw_phl_gid_pos_tbl {
2637*4882a593Smuzhiyun #define RTW_VHT_GID_MGNT_FRAME_GID_SZ 8
2638*4882a593Smuzhiyun #define RTW_VHT_GID_MGNT_FRAME_POS_SZ 16
2639*4882a593Smuzhiyun 	u8 gid_vld[RTW_VHT_GID_MGNT_FRAME_GID_SZ]; /* from 0 - 63 */
2640*4882a593Smuzhiyun 	u8 pos[RTW_VHT_GID_MGNT_FRAME_POS_SZ]; /* 0 - 63, per 2 bit*/
2641*4882a593Smuzhiyun };
2642*4882a593Smuzhiyun 
2643*4882a593Smuzhiyun 
2644*4882a593Smuzhiyun struct rtw_iot_t {
2645*4882a593Smuzhiyun 	u32 id;
2646*4882a593Smuzhiyun };
2647*4882a593Smuzhiyun 
2648*4882a593Smuzhiyun #ifdef CONFIG_PHL_THERMAL_PROTECT
2649*4882a593Smuzhiyun enum phl_thermal_protect_action{
2650*4882a593Smuzhiyun 	PHL_THERMAL_PROTECT_ACTION_NONE = 0,
2651*4882a593Smuzhiyun 	PHL_THERMAL_PROTECT_ACTION_LEVEL1 = 1,
2652*4882a593Smuzhiyun 	PHL_THERMAL_PROTECT_ACTION_LEVEL2 = 2,
2653*4882a593Smuzhiyun };
2654*4882a593Smuzhiyun #endif
2655*4882a593Smuzhiyun 
2656*4882a593Smuzhiyun struct rtw_phl_evt_ops;
2657*4882a593Smuzhiyun struct rtw_phl_com_t {
2658*4882a593Smuzhiyun 	struct rtw_wifi_role_t wifi_roles[MAX_WIFI_ROLE_NUMBER];
2659*4882a593Smuzhiyun 	struct mr_ctl_t mr_ctrl; /*multi wifi_role control module*/
2660*4882a593Smuzhiyun 	struct rtw_phl_evt_ops evt_ops;
2661*4882a593Smuzhiyun 	enum rtw_hci_type hci_type;
2662*4882a593Smuzhiyun 	enum rtw_drv_mode drv_mode;/*normal or mp mode*/
2663*4882a593Smuzhiyun 	enum rtw_dev_state dev_state;
2664*4882a593Smuzhiyun 
2665*4882a593Smuzhiyun 	struct hal_spec_t hal_spec;
2666*4882a593Smuzhiyun 
2667*4882a593Smuzhiyun 	struct role_sw_cap_t role_sw_cap; /* SW control capability of role for any purpose */
2668*4882a593Smuzhiyun 	struct protocol_cap_t proto_sw_cap[2]; /* SW control wifi protocol capability for any purpose */
2669*4882a593Smuzhiyun 	struct phy_sw_cap_t phy_sw_cap[2]; /* SW control phy capability for any purpose */
2670*4882a593Smuzhiyun 	struct phy_cap_t phy_cap[2]; /* final capability of phy (intersection of sw/hw) */
2671*4882a593Smuzhiyun 
2672*4882a593Smuzhiyun 	struct dev_cap_t dev_sw_cap;
2673*4882a593Smuzhiyun 	struct dev_cap_t dev_cap; /* final capability of device (intersection of sw/hw) */
2674*4882a593Smuzhiyun 
2675*4882a593Smuzhiyun 	struct bus_sw_cap_t bus_sw_cap; /* SW controlled bus capability */
2676*4882a593Smuzhiyun 
2677*4882a593Smuzhiyun 	struct rtw_fw_info_t fw_info;
2678*4882a593Smuzhiyun 	struct rtw_evt_info_t evt_info;
2679*4882a593Smuzhiyun 	struct rtw_stats phl_stats;
2680*4882a593Smuzhiyun 	#ifdef CONFIG_PHL_DFS
2681*4882a593Smuzhiyun 	struct rtw_dfs_t dfs_info;
2682*4882a593Smuzhiyun 	#endif
2683*4882a593Smuzhiyun 	struct rtw_iot_t id;
2684*4882a593Smuzhiyun 	/* Flags to control/check RX packets */
2685*4882a593Smuzhiyun 	bool append_fcs;
2686*4882a593Smuzhiyun 	bool accept_icv_err;
2687*4882a593Smuzhiyun 
2688*4882a593Smuzhiyun 	u8 rf_type; /*enum rf_type , is RF_PATH - GET_HAL_RFPATH*/
2689*4882a593Smuzhiyun 	u8 rf_path_num; /*GET_HAL_RFPATH_NUM*/
2690*4882a593Smuzhiyun 	u8 regulation;  /*regulation*/
2691*4882a593Smuzhiyun 	u8 edcca_mode;
2692*4882a593Smuzhiyun 
2693*4882a593Smuzhiyun #ifdef CONFIG_PHL_CHANNEL_INFO
2694*4882a593Smuzhiyun 	struct rx_chan_info_pool *chan_info_pool;
2695*4882a593Smuzhiyun 	struct chan_info_t *chan_info; /* Handle channel info packet */
2696*4882a593Smuzhiyun #endif /* CONFIG_PHL_CHANNEL_INFO */
2697*4882a593Smuzhiyun 	void *p2pps_info;
2698*4882a593Smuzhiyun 
2699*4882a593Smuzhiyun 	struct rtw_phl_ppdu_sts_info ppdu_sts_info;
2700*4882a593Smuzhiyun 	struct rtw_phl_rssi_stat rssi_stat;
2701*4882a593Smuzhiyun #ifdef CONFIG_PHL_THERMAL_PROTECT
2702*4882a593Smuzhiyun 	enum phl_thermal_protect_action thermal_protect_action;
2703*4882a593Smuzhiyun #endif
2704*4882a593Smuzhiyun 	void *test_mgnt;
2705*4882a593Smuzhiyun 
2706*4882a593Smuzhiyun 	void *phl_priv; /* pointer to phl_info */
2707*4882a593Smuzhiyun 	void *drv_priv;
2708*4882a593Smuzhiyun #ifdef RTW_WKARD_BFEE_SET_AID
2709*4882a593Smuzhiyun 	u8 is_in_lps;
2710*4882a593Smuzhiyun #endif
2711*4882a593Smuzhiyun };
2712*4882a593Smuzhiyun 
2713*4882a593Smuzhiyun struct phl_sec_param_h {
2714*4882a593Smuzhiyun 	u8 keyid;
2715*4882a593Smuzhiyun 	u8 enc_type;
2716*4882a593Smuzhiyun 	u8 key_type;
2717*4882a593Smuzhiyun 	u8 key_len;
2718*4882a593Smuzhiyun 	u8 spp;
2719*4882a593Smuzhiyun };
2720*4882a593Smuzhiyun 
2721*4882a593Smuzhiyun #define PHL_MAX_AGG_WSIZE 32
2722*4882a593Smuzhiyun 
2723*4882a593Smuzhiyun struct mp_usr_sw_tx_gen_in {
2724*4882a593Smuzhiyun 	u32 data_rate : 9;
2725*4882a593Smuzhiyun 	u32 mcs : 6;
2726*4882a593Smuzhiyun 	u32 mpdu_len : 14;
2727*4882a593Smuzhiyun 	u32 n_mpdu : 9;
2728*4882a593Smuzhiyun 	u32 fec : 1;
2729*4882a593Smuzhiyun 	u32 dcm : 1;
2730*4882a593Smuzhiyun 	u32 rsvd0 : 1;
2731*4882a593Smuzhiyun 	u32 aid : 12;
2732*4882a593Smuzhiyun 	u32 scrambler_seed : 8; // rand (1~255)
2733*4882a593Smuzhiyun 	u32 random_init_seed : 8; // rand (1~255)
2734*4882a593Smuzhiyun 	u32 rsvd1 : 4;
2735*4882a593Smuzhiyun 	u32 apep : 22;
2736*4882a593Smuzhiyun 	u32 ru_alloc : 8;
2737*4882a593Smuzhiyun 	u32 rsvd2 : 2;
2738*4882a593Smuzhiyun 	u32 nss : 4;
2739*4882a593Smuzhiyun 	u32 txbf : 1;
2740*4882a593Smuzhiyun 	u32 pwr_boost_db : 5;
2741*4882a593Smuzhiyun 	u32 rsvd3 : 22;
2742*4882a593Smuzhiyun };
2743*4882a593Smuzhiyun 
2744*4882a593Smuzhiyun 
2745*4882a593Smuzhiyun struct mp_sw_tx_param_t {
2746*4882a593Smuzhiyun 	u32 dbw : 2; //0:BW20, 1:BW40, 2:BW80, 3:BW160/BW80+80
2747*4882a593Smuzhiyun 	u32 source_gen_mode : 2;
2748*4882a593Smuzhiyun 	u32 locked_clk : 1;
2749*4882a593Smuzhiyun 	u32 dyn_bw : 1;
2750*4882a593Smuzhiyun 	u32 ndp_en : 1;
2751*4882a593Smuzhiyun 	u32 long_preamble_en : 1; //bmode
2752*4882a593Smuzhiyun 	u32 stbc : 1;
2753*4882a593Smuzhiyun 	u32 gi : 2; //0:0.4,1:0.8,2:1.6,3:3.2
2754*4882a593Smuzhiyun 	u32 tb_l_len : 12;
2755*4882a593Smuzhiyun 	u32 tb_ru_tot_sts_max : 3;
2756*4882a593Smuzhiyun 	u32 vht_txop_not_allowed : 1;
2757*4882a593Smuzhiyun 	u32 tb_disam : 1;
2758*4882a593Smuzhiyun 	u32 doppler : 2;
2759*4882a593Smuzhiyun 	u32 he_ltf_type : 2;//0:1x,1:2x,2:4x
2760*4882a593Smuzhiyun 
2761*4882a593Smuzhiyun 	u32 ht_l_len : 12;
2762*4882a593Smuzhiyun 	u32 preamble_puncture : 1;
2763*4882a593Smuzhiyun 	u32 he_mcs_sigb : 3;//0~5
2764*4882a593Smuzhiyun 	u32 he_dcm_sigb : 1;
2765*4882a593Smuzhiyun 	u32 he_sigb_compress_en : 1;
2766*4882a593Smuzhiyun 	u32 max_tx_time_0p4us : 14;
2767*4882a593Smuzhiyun 
2768*4882a593Smuzhiyun 
2769*4882a593Smuzhiyun 	u32 ul_flag : 1;
2770*4882a593Smuzhiyun 	u32 tb_ldpc_extra : 1;
2771*4882a593Smuzhiyun 	u32 bss_color : 6;
2772*4882a593Smuzhiyun 	u32 sr : 4;
2773*4882a593Smuzhiyun 	u32 beamchange_en : 1;
2774*4882a593Smuzhiyun 	u32 he_er_u106ru_en : 1;
2775*4882a593Smuzhiyun 	u32 ul_srp1 : 4;
2776*4882a593Smuzhiyun 	u32 ul_srp2 : 4;
2777*4882a593Smuzhiyun 	u32 ul_srp3 : 4;
2778*4882a593Smuzhiyun 	u32 ul_srp4 : 4;
2779*4882a593Smuzhiyun 	u32 mode : 2;
2780*4882a593Smuzhiyun 
2781*4882a593Smuzhiyun 	u32 group_id : 6;
2782*4882a593Smuzhiyun 	u32 ppdu_type : 4;//0: bmode,1:Legacy,2:HT_MF,3:HT_GF,4:VHT,5:HE_SU,6:HE_ER_SU,7:HE_MU,8:HE_TB
2783*4882a593Smuzhiyun 	u32 txop : 7;
2784*4882a593Smuzhiyun 	u32 tb_strt_sts : 3;
2785*4882a593Smuzhiyun 	u32 tb_pre_fec_padding_factor : 2;
2786*4882a593Smuzhiyun 	u32 cbw : 2;
2787*4882a593Smuzhiyun 	u32 txsc : 4;
2788*4882a593Smuzhiyun 	u32 tb_mumimo_mode_en : 1;
2789*4882a593Smuzhiyun 	u32 rsvd1 : 3;
2790*4882a593Smuzhiyun 
2791*4882a593Smuzhiyun 	u8 nominal_t_pe : 2; // def = 2
2792*4882a593Smuzhiyun 	u8 ness : 2; // def = 0
2793*4882a593Smuzhiyun 	u8 rsvd2 : 4;
2794*4882a593Smuzhiyun 
2795*4882a593Smuzhiyun 	u8 n_user;
2796*4882a593Smuzhiyun 	u16 tb_rsvd : 9;//def = 0
2797*4882a593Smuzhiyun 	u16 rsvd3 : 7;
2798*4882a593Smuzhiyun 
2799*4882a593Smuzhiyun 	struct mp_usr_sw_tx_gen_in usr[4];
2800*4882a593Smuzhiyun };
2801*4882a593Smuzhiyun 
2802*4882a593Smuzhiyun struct mp_usr_plcp_gen_in {
2803*4882a593Smuzhiyun 	u32 mcs : 6;
2804*4882a593Smuzhiyun 	u32 mpdu_len : 14;
2805*4882a593Smuzhiyun 	u32 n_mpdu : 9;
2806*4882a593Smuzhiyun 	u32 fec : 1;
2807*4882a593Smuzhiyun 	u32 dcm : 1;
2808*4882a593Smuzhiyun 	u32 rsvd0 : 1;
2809*4882a593Smuzhiyun 	u32 aid : 12;
2810*4882a593Smuzhiyun 	u32 scrambler_seed : 8; // rand (1~255)
2811*4882a593Smuzhiyun 	u32 random_init_seed : 8; // rand (1~255)
2812*4882a593Smuzhiyun 	u32 rsvd1 : 4;
2813*4882a593Smuzhiyun 	u32 apep : 22;
2814*4882a593Smuzhiyun 	u32 ru_alloc : 8;
2815*4882a593Smuzhiyun 	u32 rsvd2 : 2;
2816*4882a593Smuzhiyun 	u32 nss : 4;
2817*4882a593Smuzhiyun 	u32 txbf : 1;
2818*4882a593Smuzhiyun 	u32 pwr_boost_db : 5;
2819*4882a593Smuzhiyun 	u32 rsvd3 : 22;
2820*4882a593Smuzhiyun };
2821*4882a593Smuzhiyun 
2822*4882a593Smuzhiyun enum pkt_ofld_type {
2823*4882a593Smuzhiyun 	PKT_TYPE_PROBE_RSP = 0,
2824*4882a593Smuzhiyun 	PKT_TYPE_PS_POLL = 1,
2825*4882a593Smuzhiyun 	PKT_TYPE_NULL_DATA = 2,
2826*4882a593Smuzhiyun 	PKT_TYPE_QOS_NULL = 3,
2827*4882a593Smuzhiyun 	PKT_TYPE_CTS2SELF = 4,
2828*4882a593Smuzhiyun 	PKT_TYPE_ARP_RSP = 5,
2829*4882a593Smuzhiyun 	PKT_TYPE_NDP = 6,
2830*4882a593Smuzhiyun 	PKT_TYPE_EAPOL_KEY = 7,
2831*4882a593Smuzhiyun 	PKT_TYPE_SA_QUERY = 8,
2832*4882a593Smuzhiyun 	PKT_TYPE_REALWOW_KAPKT = 9, /* RealWoW Keep Alive Packet */
2833*4882a593Smuzhiyun 	PKT_TYPE_REALWOW_ACK = 10, /* RealWoW Ack Patten */
2834*4882a593Smuzhiyun 	PKT_TYPE_REALWOW_WP = 11, /* RealWoW Wakeup Patten */
2835*4882a593Smuzhiyun 	PKT_TYPE_PROBE_REQ = 12,
2836*4882a593Smuzhiyun 	PKT_OFLD_TYPE_MAX,
2837*4882a593Smuzhiyun };
2838*4882a593Smuzhiyun 
2839*4882a593Smuzhiyun struct scan_ofld_ch_info {
2840*4882a593Smuzhiyun 	u8 center_chan;
2841*4882a593Smuzhiyun 	u8 chan; /* primary channel */
2842*4882a593Smuzhiyun 	u8 bw;
2843*4882a593Smuzhiyun 	u8 period;
2844*4882a593Smuzhiyun 	bool tx_pkt; /* 1:probe request will be sent */
2845*4882a593Smuzhiyun 	bool tx_data_pause; /* 1:no data will be sent during fw scanning */
2846*4882a593Smuzhiyun };
2847*4882a593Smuzhiyun 
2848*4882a593Smuzhiyun enum SCAN_OFLD_OP {
2849*4882a593Smuzhiyun 	SCAN_OFLD_OP_STOP,
2850*4882a593Smuzhiyun 	SCAN_OFLD_OP_START,
2851*4882a593Smuzhiyun 	SCAN_OFLD_OP_SET
2852*4882a593Smuzhiyun };
2853*4882a593Smuzhiyun 
2854*4882a593Smuzhiyun enum SCAN_OFLD_MD {
2855*4882a593Smuzhiyun 	/* scan once */
2856*4882a593Smuzhiyun 	SCAN_OFLD_MD_ONCE,
2857*4882a593Smuzhiyun 	/**
2858*4882a593Smuzhiyun 	 * normal period repeatd
2859*4882a593Smuzhiyun 	 * e.g., period = 2s
2860*4882a593Smuzhiyun 	 * scan - 2s - scan - 2s -....
2861*4882a593Smuzhiyun 	 */
2862*4882a593Smuzhiyun 
2863*4882a593Smuzhiyun 	SCAN_OFLD_MD_PD,
2864*4882a593Smuzhiyun 	/**
2865*4882a593Smuzhiyun 	 * slow period repeat
2866*4882a593Smuzhiyun 	 * e.g., period = 2s, cycle = 2, slow period = 3s
2867*4882a593Smuzhiyun 	 * scan - 2s - scan - 2s - scan - 3s - scan - 3s
2868*4882a593Smuzhiyun 	 */
2869*4882a593Smuzhiyun 	SCAN_OFLD_MD_PD_SLOW,
2870*4882a593Smuzhiyun 	/**
2871*4882a593Smuzhiyun 	 * seamless
2872*4882a593Smuzhiyun 	 * scan - scan - scan - scan - scan  -....
2873*4882a593Smuzhiyun 	 */
2874*4882a593Smuzhiyun 	SCAN_OFLD_MD_SEEMLESS,
2875*4882a593Smuzhiyun };
2876*4882a593Smuzhiyun 
2877*4882a593Smuzhiyun struct scan_ofld_info {
2878*4882a593Smuzhiyun 	enum SCAN_OFLD_OP operation;
2879*4882a593Smuzhiyun 	enum SCAN_OFLD_MD mode;
2880*4882a593Smuzhiyun 	/* destinated tsf to start scanning, set 0 for both to scan immediately*/
2881*4882a593Smuzhiyun 	u32 tsf_low;
2882*4882a593Smuzhiyun 	u32 tsf_high;
2883*4882a593Smuzhiyun 	u32 probe_req_pkt_id;
2884*4882a593Smuzhiyun 	u32 period; /* SCAN_OFLD_MD_PD & SCAN_OFLD_MD_PD_SLOW */
2885*4882a593Smuzhiyun 	u8 cycle; /* SCAN_OFLD_MD_PD & SCAN_OFLD_MD_PD_SLOW*/
2886*4882a593Smuzhiyun 	u32 slow_period; /* SCAN_OFLD_MD_PD_SLOW */
2887*4882a593Smuzhiyun };
2888*4882a593Smuzhiyun 
2889*4882a593Smuzhiyun struct mp_plcp_param_t {
2890*4882a593Smuzhiyun 	u32 dbw : 2; //0:BW20, 1:BW40, 2:BW80, 3:BW160/BW80+80
2891*4882a593Smuzhiyun 	u32 source_gen_mode : 2;
2892*4882a593Smuzhiyun 	u32 locked_clk : 1;
2893*4882a593Smuzhiyun 	u32 dyn_bw : 1;
2894*4882a593Smuzhiyun 	u32 ndp_en : 1;
2895*4882a593Smuzhiyun 	u32 long_preamble_en : 1; //bmode
2896*4882a593Smuzhiyun 	u32 stbc : 1;
2897*4882a593Smuzhiyun 	u32 gi : 2; //0:0.4,1:0.8,2:1.6,3:3.2
2898*4882a593Smuzhiyun 	u32 tb_l_len : 12;
2899*4882a593Smuzhiyun 	u32 tb_ru_tot_sts_max : 3;
2900*4882a593Smuzhiyun 	u32 vht_txop_not_allowed : 1;
2901*4882a593Smuzhiyun 	u32 tb_disam : 1;
2902*4882a593Smuzhiyun 	u32 doppler : 2;
2903*4882a593Smuzhiyun 	u32 he_ltf_type : 2;//0:1x,1:2x,2:4x
2904*4882a593Smuzhiyun 
2905*4882a593Smuzhiyun 	u32 ht_l_len : 12;
2906*4882a593Smuzhiyun 	u32 preamble_puncture : 1;
2907*4882a593Smuzhiyun 	u32 he_mcs_sigb : 3;//0~5
2908*4882a593Smuzhiyun 	u32 he_dcm_sigb : 1;
2909*4882a593Smuzhiyun 	u32 he_sigb_compress_en : 1;
2910*4882a593Smuzhiyun 	u32 max_tx_time_0p4us : 14;
2911*4882a593Smuzhiyun 
2912*4882a593Smuzhiyun 
2913*4882a593Smuzhiyun 	u32 ul_flag : 1;
2914*4882a593Smuzhiyun 	u32 tb_ldpc_extra : 1;
2915*4882a593Smuzhiyun 	u32 bss_color : 6;
2916*4882a593Smuzhiyun 	u32 sr : 4;
2917*4882a593Smuzhiyun 	u32 beamchange_en : 1;
2918*4882a593Smuzhiyun 	u32 he_er_u106ru_en : 1;
2919*4882a593Smuzhiyun 	u32 ul_srp1 : 4;
2920*4882a593Smuzhiyun 	u32 ul_srp2 : 4;
2921*4882a593Smuzhiyun 	u32 ul_srp3 : 4;
2922*4882a593Smuzhiyun 	u32 ul_srp4 : 4;
2923*4882a593Smuzhiyun 	u32 mode : 2;
2924*4882a593Smuzhiyun 
2925*4882a593Smuzhiyun 	u32 group_id : 6;
2926*4882a593Smuzhiyun 	u32 ppdu_type : 4;//0: bmode,1:Legacy,2:HT_MF,3:HT_GF,4:VHT,5:HE_SU,6:HE_ER_SU,7:HE_MU,8:HE_TB
2927*4882a593Smuzhiyun 	u32 txop : 7;
2928*4882a593Smuzhiyun 	u32 tb_strt_sts : 3;
2929*4882a593Smuzhiyun 	u32 tb_pre_fec_padding_factor : 2;
2930*4882a593Smuzhiyun 	u32 cbw : 2;
2931*4882a593Smuzhiyun 	u32 txsc : 4;
2932*4882a593Smuzhiyun 	u32 tb_mumimo_mode_en : 1;
2933*4882a593Smuzhiyun 	u32 rsvd1 : 3;
2934*4882a593Smuzhiyun 
2935*4882a593Smuzhiyun 	u8 nominal_t_pe : 2; // def = 2
2936*4882a593Smuzhiyun 	u8 ness : 2; // def = 0
2937*4882a593Smuzhiyun 	u8 rsvd2 : 4;
2938*4882a593Smuzhiyun 
2939*4882a593Smuzhiyun 	u8 n_user;
2940*4882a593Smuzhiyun 	u16 tb_rsvd : 9;//def = 0
2941*4882a593Smuzhiyun 	u16 rsvd3 : 7;
2942*4882a593Smuzhiyun 
2943*4882a593Smuzhiyun 	struct mp_usr_plcp_gen_in usr[4];
2944*4882a593Smuzhiyun };
2945*4882a593Smuzhiyun 
2946*4882a593Smuzhiyun 
2947*4882a593Smuzhiyun 
2948*4882a593Smuzhiyun #define MP_MAC_AX_MAX_RU_NUM	4
2949*4882a593Smuzhiyun 
2950*4882a593Smuzhiyun struct mp_mac_ax_tf_depend_user_para {
2951*4882a593Smuzhiyun 	u8 pref_AC: 2;
2952*4882a593Smuzhiyun 	u8 rsvd: 6;
2953*4882a593Smuzhiyun };
2954*4882a593Smuzhiyun 
2955*4882a593Smuzhiyun struct mp_mac_ax_tf_user_para {
2956*4882a593Smuzhiyun 	u16 aid12: 12;
2957*4882a593Smuzhiyun 	u16 ul_mcs: 4;
2958*4882a593Smuzhiyun 	u8 macid;
2959*4882a593Smuzhiyun 	u8 ru_pos;
2960*4882a593Smuzhiyun 
2961*4882a593Smuzhiyun 	u8 ul_fec_code: 1;
2962*4882a593Smuzhiyun 	u8 ul_dcm: 1;
2963*4882a593Smuzhiyun 	u8 ss_alloc: 6;
2964*4882a593Smuzhiyun 	u8 ul_tgt_rssi: 7;
2965*4882a593Smuzhiyun 	u8 rsvd: 1;
2966*4882a593Smuzhiyun 	u16 rsvd2;
2967*4882a593Smuzhiyun };
2968*4882a593Smuzhiyun 
2969*4882a593Smuzhiyun 
2970*4882a593Smuzhiyun struct mp_mac_ax_tf_pkt_para {
2971*4882a593Smuzhiyun 	u8 ul_bw: 2;
2972*4882a593Smuzhiyun 	u8 gi_ltf: 2;
2973*4882a593Smuzhiyun 	u8 num_he_ltf: 3;
2974*4882a593Smuzhiyun 	u8 ul_stbc: 1;
2975*4882a593Smuzhiyun 	u8 doppler: 1;
2976*4882a593Smuzhiyun 	u8 ap_tx_power: 6;
2977*4882a593Smuzhiyun 	u8 rsvd0: 1;
2978*4882a593Smuzhiyun 	u8 user_num: 3;
2979*4882a593Smuzhiyun 	u8 pktnum: 3;
2980*4882a593Smuzhiyun 	u8 rsvd1: 2;
2981*4882a593Smuzhiyun 	u8 pri20_bitmap;
2982*4882a593Smuzhiyun 
2983*4882a593Smuzhiyun 	struct mp_mac_ax_tf_user_para user[MP_MAC_AX_MAX_RU_NUM];
2984*4882a593Smuzhiyun 	struct mp_mac_ax_tf_depend_user_para dep_user[MP_MAC_AX_MAX_RU_NUM];
2985*4882a593Smuzhiyun };
2986*4882a593Smuzhiyun 
2987*4882a593Smuzhiyun struct mp_mac_ax_tf_wd_para {
2988*4882a593Smuzhiyun 	u16 datarate: 9;
2989*4882a593Smuzhiyun 	u16 mulport_id: 3;
2990*4882a593Smuzhiyun 	u16 pwr_ofset: 3;
2991*4882a593Smuzhiyun 	u16 rsvd: 1;
2992*4882a593Smuzhiyun };
2993*4882a593Smuzhiyun 
2994*4882a593Smuzhiyun struct mp_mac_ax_f2p_test_para {
2995*4882a593Smuzhiyun 	struct mp_mac_ax_tf_pkt_para tf_pkt;
2996*4882a593Smuzhiyun 	struct mp_mac_ax_tf_wd_para tf_wd;
2997*4882a593Smuzhiyun 	u8 mode: 2;
2998*4882a593Smuzhiyun 	u8 frexch_type: 6;
2999*4882a593Smuzhiyun 	u8 sigb_len;
3000*4882a593Smuzhiyun };
3001*4882a593Smuzhiyun 
3002*4882a593Smuzhiyun struct mp_mac_ax_f2p_wd {
3003*4882a593Smuzhiyun 	/* dword 0 */
3004*4882a593Smuzhiyun 	u32 cmd_qsel:6;
3005*4882a593Smuzhiyun 	u32 rsvd0:2;
3006*4882a593Smuzhiyun 	u32 rsvd1:2;
3007*4882a593Smuzhiyun 	u32 ls:1;
3008*4882a593Smuzhiyun 	u32 fs:1;
3009*4882a593Smuzhiyun 	u32 total_number:4;
3010*4882a593Smuzhiyun 	u32 seq:8;
3011*4882a593Smuzhiyun 	u32 length:8;
3012*4882a593Smuzhiyun 	/* dword 1 */
3013*4882a593Smuzhiyun 	u32 rsvd2;
3014*4882a593Smuzhiyun };
3015*4882a593Smuzhiyun 
3016*4882a593Smuzhiyun struct mp_mac_ax_f2p_tx_cmd {
3017*4882a593Smuzhiyun 	/* dword 0 */
3018*4882a593Smuzhiyun 	u32 cmd_type:8;
3019*4882a593Smuzhiyun 	u32 cmd_sub_type:8;
3020*4882a593Smuzhiyun 	u32 dl_user_num:5;
3021*4882a593Smuzhiyun 	u32 bw:2;
3022*4882a593Smuzhiyun 	u32 tx_power:9;
3023*4882a593Smuzhiyun 	/* dword 1 */
3024*4882a593Smuzhiyun 	u32 fw_define:16;
3025*4882a593Smuzhiyun 	u32 ss_sel_mode:2;
3026*4882a593Smuzhiyun 	u32 next_qsel:6;
3027*4882a593Smuzhiyun 	u32 twt_group:4;
3028*4882a593Smuzhiyun 	u32 dis_chk_slp:1;
3029*4882a593Smuzhiyun 	u32 ru_mu_2_su:1;
3030*4882a593Smuzhiyun 	u32 dl_t_pe:2;
3031*4882a593Smuzhiyun 	/* dword 2 */
3032*4882a593Smuzhiyun 	u32 sigb_ch1_len:8;
3033*4882a593Smuzhiyun 	u32 sigb_ch2_len:8;
3034*4882a593Smuzhiyun 	u32 sigb_sym_num:6;
3035*4882a593Smuzhiyun 	u32 sigb_ch2_ofs:5;
3036*4882a593Smuzhiyun 	u32 dis_htp_ack:1;
3037*4882a593Smuzhiyun 	u32 tx_time_ref:2;
3038*4882a593Smuzhiyun 	u32 pri_user_idx:2;
3039*4882a593Smuzhiyun 	/* dword 3 */
3040*4882a593Smuzhiyun 	u32 ampdu_max_txtime:14;
3041*4882a593Smuzhiyun 	u32 rsvd0:2;
3042*4882a593Smuzhiyun 	u32 group_id:6;
3043*4882a593Smuzhiyun 	u32 rsvd1:2;
3044*4882a593Smuzhiyun 	u32 rsvd2:4;
3045*4882a593Smuzhiyun 	u32 twt_chk_en:1;
3046*4882a593Smuzhiyun 	u32 twt_port_id:3;
3047*4882a593Smuzhiyun 	/* dword 4 */
3048*4882a593Smuzhiyun 	u32 twt_start_time:32;
3049*4882a593Smuzhiyun 	/* dword 5 */
3050*4882a593Smuzhiyun 	u32 twt_end_time:32;
3051*4882a593Smuzhiyun 	/* dword 6 */
3052*4882a593Smuzhiyun 	u32 apep_len:12;
3053*4882a593Smuzhiyun 	u32 tri_pad:2;
3054*4882a593Smuzhiyun 	u32 ul_t_pe:2;
3055*4882a593Smuzhiyun 	u32 rf_gain_idx:10;
3056*4882a593Smuzhiyun 	u32 fixed_gain_en:1;
3057*4882a593Smuzhiyun 	u32 ul_gi_ltf:3;
3058*4882a593Smuzhiyun 	u32 ul_doppler:1;
3059*4882a593Smuzhiyun 	u32 ul_stbc:1;
3060*4882a593Smuzhiyun 	/* dword 7 */
3061*4882a593Smuzhiyun 	u32 ul_mid_per:1;
3062*4882a593Smuzhiyun 	u32 ul_cqi_rrp_tri:1;
3063*4882a593Smuzhiyun 	u32 rsvd3:6;
3064*4882a593Smuzhiyun 	u32 rsvd4:8;
3065*4882a593Smuzhiyun 	u32 sigb_dcm:1;
3066*4882a593Smuzhiyun 	u32 sigb_comp:1;
3067*4882a593Smuzhiyun 	u32 doppler:1;
3068*4882a593Smuzhiyun 	u32 stbc:1;
3069*4882a593Smuzhiyun 	u32 mid_per:1;
3070*4882a593Smuzhiyun 	u32 gi_ltf_size:3;
3071*4882a593Smuzhiyun 	u32 sigb_mcs:3;
3072*4882a593Smuzhiyun 	u32 rsvd5:5;
3073*4882a593Smuzhiyun 	/* dword 8 */
3074*4882a593Smuzhiyun 	u32 macid_u0:8;
3075*4882a593Smuzhiyun 	u32 ac_type_u0:2;
3076*4882a593Smuzhiyun 	u32 mu_sta_pos_u0:2;
3077*4882a593Smuzhiyun 	u32 dl_rate_idx_u0:9;
3078*4882a593Smuzhiyun 	u32 dl_dcm_en_u0:1;
3079*4882a593Smuzhiyun 	u32 rsvd6:2;
3080*4882a593Smuzhiyun 	u32 ru_alo_idx_u0:8;
3081*4882a593Smuzhiyun 	/* dword 9 */
3082*4882a593Smuzhiyun 	u32 pwr_boost_u0:5;
3083*4882a593Smuzhiyun 	u32 agg_bmp_alo_u0:3;
3084*4882a593Smuzhiyun 	u32 ampdu_max_txnum_u0:8;
3085*4882a593Smuzhiyun 	u32 user_define_u0:8;
3086*4882a593Smuzhiyun 	u32 user_define_ext_u0:8;
3087*4882a593Smuzhiyun 	/* dword 10 */
3088*4882a593Smuzhiyun 	u32 ul_addr_idx_u0:8;
3089*4882a593Smuzhiyun 	u32 ul_dcm_u0:1;
3090*4882a593Smuzhiyun 	u32 ul_fec_cod_u0:1;
3091*4882a593Smuzhiyun 	u32 ul_ru_rate_u0:7;
3092*4882a593Smuzhiyun 	u32 rsvd8:7;
3093*4882a593Smuzhiyun 	u32 ul_ru_alo_idx_u0:8;
3094*4882a593Smuzhiyun 	/* dword 11 */
3095*4882a593Smuzhiyun 	u32 rsvd9:32;
3096*4882a593Smuzhiyun 	/* dword 12 */
3097*4882a593Smuzhiyun 	u32 macid_u1:8;
3098*4882a593Smuzhiyun 	u32 ac_type_u1:2;
3099*4882a593Smuzhiyun 	u32 mu_sta_pos_u1:2;
3100*4882a593Smuzhiyun 	u32 dl_rate_idx_u1:9;
3101*4882a593Smuzhiyun 	u32 dl_dcm_en_u1:1;
3102*4882a593Smuzhiyun 	u32 rsvd10:2;
3103*4882a593Smuzhiyun 	u32 ru_alo_idx_u1:8;
3104*4882a593Smuzhiyun 	/* dword 13 */
3105*4882a593Smuzhiyun 	u32 pwr_boost_u1:5;
3106*4882a593Smuzhiyun 	u32 agg_bmp_alo_u1:3;
3107*4882a593Smuzhiyun 	u32 ampdu_max_txnum_u1:8;
3108*4882a593Smuzhiyun 	u32 user_define_u1:8;
3109*4882a593Smuzhiyun 	u32 user_define_ext_u1:8;
3110*4882a593Smuzhiyun 	/* dword 14 */
3111*4882a593Smuzhiyun 	u32 ul_addr_idx_u1:8;
3112*4882a593Smuzhiyun 	u32 ul_dcm_u1:1;
3113*4882a593Smuzhiyun 	u32 ul_fec_cod_u1:1;
3114*4882a593Smuzhiyun 	u32 ul_ru_rate_u1:7;
3115*4882a593Smuzhiyun 	u32 rsvd12:7;
3116*4882a593Smuzhiyun 	u32 ul_ru_alo_idx_u1:8;
3117*4882a593Smuzhiyun 	/* dword 15 */
3118*4882a593Smuzhiyun 	u32 rsvd13:32;
3119*4882a593Smuzhiyun 	/* dword 16 */
3120*4882a593Smuzhiyun 	u32 macid_u2:8;
3121*4882a593Smuzhiyun 	u32 ac_type_u2:2;
3122*4882a593Smuzhiyun 	u32 mu_sta_pos_u2:2;
3123*4882a593Smuzhiyun 	u32 dl_rate_idx_u2:9;
3124*4882a593Smuzhiyun 	u32 dl_dcm_en_u2:1;
3125*4882a593Smuzhiyun 	u32 rsvd14:2;
3126*4882a593Smuzhiyun 	u32 ru_alo_idx_u2:8;
3127*4882a593Smuzhiyun 	/* dword 17 */
3128*4882a593Smuzhiyun 	u32 pwr_boost_u2:5;
3129*4882a593Smuzhiyun 	u32 agg_bmp_alo_u2:3;
3130*4882a593Smuzhiyun 	u32 ampdu_max_txnum_u2:8;
3131*4882a593Smuzhiyun 	u32 user_define_u2:8;
3132*4882a593Smuzhiyun 	u32 user_define_ext_u2:8;
3133*4882a593Smuzhiyun 	/* dword 18 */
3134*4882a593Smuzhiyun 	u32 ul_addr_idx_u2:8;
3135*4882a593Smuzhiyun 	u32 ul_dcm_u2:1;
3136*4882a593Smuzhiyun 	u32 ul_fec_cod_u2:1;
3137*4882a593Smuzhiyun 	u32 ul_ru_rate_u2:7;
3138*4882a593Smuzhiyun 	u32 rsvd16:7;
3139*4882a593Smuzhiyun 	u32 ul_ru_alo_idx_u2:8;
3140*4882a593Smuzhiyun 	/* dword 19 */
3141*4882a593Smuzhiyun 	u32 rsvd17:32;
3142*4882a593Smuzhiyun 	/* dword 20 */
3143*4882a593Smuzhiyun 	u32 macid_u3:8;
3144*4882a593Smuzhiyun 	u32 ac_type_u3:2;
3145*4882a593Smuzhiyun 	u32 mu_sta_pos_u3:2;
3146*4882a593Smuzhiyun 	u32 dl_rate_idx_u3:9;
3147*4882a593Smuzhiyun 	u32 dl_dcm_en_u3:1;
3148*4882a593Smuzhiyun 	u32 rsvd18:2;
3149*4882a593Smuzhiyun 	u32 ru_alo_idx_u3:8;
3150*4882a593Smuzhiyun 	/* dword 21 */
3151*4882a593Smuzhiyun 	u32 pwr_boost_u3:5;
3152*4882a593Smuzhiyun 	u32 agg_bmp_alo_u3:3;
3153*4882a593Smuzhiyun 	u32 ampdu_max_txnum_u3:8;
3154*4882a593Smuzhiyun 	u32 user_define_u3:8;
3155*4882a593Smuzhiyun 	u32 user_define_ext_u3:8;
3156*4882a593Smuzhiyun 	/* dword 22 */
3157*4882a593Smuzhiyun 	u32 ul_addr_idx_u3:8;
3158*4882a593Smuzhiyun 	u32 ul_dcm_u3:1;
3159*4882a593Smuzhiyun 	u32 ul_fec_cod_u3:1;
3160*4882a593Smuzhiyun 	u32 ul_ru_rate_u3:7;
3161*4882a593Smuzhiyun 	u32 rsvd20:7;
3162*4882a593Smuzhiyun 	u32 ul_ru_alo_idx_u3:8;
3163*4882a593Smuzhiyun 	/* dword 23 */
3164*4882a593Smuzhiyun 	u32 rsvd21:32;
3165*4882a593Smuzhiyun 	/* dword 24 */
3166*4882a593Smuzhiyun 	u32 pkt_id_0:12;
3167*4882a593Smuzhiyun 	u32 rsvd22:3;
3168*4882a593Smuzhiyun 	u32 valid_0:1;
3169*4882a593Smuzhiyun 	u32 ul_user_num_0:4;
3170*4882a593Smuzhiyun 	u32 rsvd23:12;
3171*4882a593Smuzhiyun 	/* dword 25 */
3172*4882a593Smuzhiyun 	u32 pkt_id_1:12;
3173*4882a593Smuzhiyun 	u32 rsvd24:3;
3174*4882a593Smuzhiyun 	u32 valid_1:1;
3175*4882a593Smuzhiyun 	u32 ul_user_num_1:4;
3176*4882a593Smuzhiyun 	u32 rsvd25:12;
3177*4882a593Smuzhiyun 	/* dword 26 */
3178*4882a593Smuzhiyun 	u32 pkt_id_2:12;
3179*4882a593Smuzhiyun 	u32 rsvd26:3;
3180*4882a593Smuzhiyun 	u32 valid_2:1;
3181*4882a593Smuzhiyun 	u32 ul_user_num_2:4;
3182*4882a593Smuzhiyun 	u32 rsvd27:12;
3183*4882a593Smuzhiyun 	/* dword 27 */
3184*4882a593Smuzhiyun 	u32 pkt_id_3:12;
3185*4882a593Smuzhiyun 	u32 rsvd28:3;
3186*4882a593Smuzhiyun 	u32 valid_3:1;
3187*4882a593Smuzhiyun 	u32 ul_user_num_3:4;
3188*4882a593Smuzhiyun 	u32 rsvd29:12;
3189*4882a593Smuzhiyun 	/* dword 28 */
3190*4882a593Smuzhiyun 	u32 pkt_id_4:12;
3191*4882a593Smuzhiyun 	u32 rsvd30:3;
3192*4882a593Smuzhiyun 	u32 valid_4:1;
3193*4882a593Smuzhiyun 	u32 ul_user_num_4:4;
3194*4882a593Smuzhiyun 	u32 rsvd31:12;
3195*4882a593Smuzhiyun 	/* dword 29 */
3196*4882a593Smuzhiyun 	u32 pkt_id_5:12;
3197*4882a593Smuzhiyun 	u32 rsvd32:3;
3198*4882a593Smuzhiyun 	u32 valid_5:1;
3199*4882a593Smuzhiyun 	u32 ul_user_num_5:4;
3200*4882a593Smuzhiyun 	u32 rsvd33:12;
3201*4882a593Smuzhiyun };
3202*4882a593Smuzhiyun 
3203*4882a593Smuzhiyun u8 mp_start(void *priv);
3204*4882a593Smuzhiyun 
3205*4882a593Smuzhiyun #ifdef CONFIG_DBCC_SUPPORT
3206*4882a593Smuzhiyun enum dbcc_test_id {
3207*4882a593Smuzhiyun 	DBCC_PRE_CFG,
3208*4882a593Smuzhiyun 	DBCC_CFG,
3209*4882a593Smuzhiyun 	DBCC_CLEAN_TXQ,
3210*4882a593Smuzhiyun };
3211*4882a593Smuzhiyun #endif
3212*4882a593Smuzhiyun 
3213*4882a593Smuzhiyun struct rtw_role_cmd {
3214*4882a593Smuzhiyun 	struct rtw_wifi_role_t *wrole;
3215*4882a593Smuzhiyun 	enum role_state rstate;
3216*4882a593Smuzhiyun };
3217*4882a593Smuzhiyun 
3218*4882a593Smuzhiyun enum phl_btc_pkt_evt_type {
3219*4882a593Smuzhiyun 	BTC_PKT_EVT_NORMAL,
3220*4882a593Smuzhiyun 	BTC_PKT_EVT_DHCP,
3221*4882a593Smuzhiyun 	BTC_PKT_EVT_ARP,
3222*4882a593Smuzhiyun 	BTC_PKT_EVT_EAPOL,
3223*4882a593Smuzhiyun 	BTC_PKT_EVT_EAPOL_START,
3224*4882a593Smuzhiyun 	BTC_PKT_EVT_ADD_KEY,
3225*4882a593Smuzhiyun 	BTC_PKT_EVT_MAX
3226*4882a593Smuzhiyun };
3227*4882a593Smuzhiyun 
3228*4882a593Smuzhiyun struct rtw_pkt_evt_ntfy {
3229*4882a593Smuzhiyun 	struct rtw_wifi_role_t *wrole;
3230*4882a593Smuzhiyun 	enum phl_btc_pkt_evt_type type;
3231*4882a593Smuzhiyun };
3232*4882a593Smuzhiyun 
3233*4882a593Smuzhiyun struct role_ntfy_info {
3234*4882a593Smuzhiyun 	u8 role_id;
3235*4882a593Smuzhiyun 	u16 macid;
3236*4882a593Smuzhiyun 	enum role_state rstate;
3237*4882a593Smuzhiyun };
3238*4882a593Smuzhiyun 
3239*4882a593Smuzhiyun struct battery_chg_ntfy_info {
3240*4882a593Smuzhiyun 	bool ips_allow;
3241*4882a593Smuzhiyun 	bool lps_allow;
3242*4882a593Smuzhiyun };
3243*4882a593Smuzhiyun 
3244*4882a593Smuzhiyun struct ps_ntfy_info {
3245*4882a593Smuzhiyun 	bool sync;
3246*4882a593Smuzhiyun 	void *ctx;
3247*4882a593Smuzhiyun 	void (*cb)(void *phl, void *hdl, void *ctx, enum rtw_phl_status stat);
3248*4882a593Smuzhiyun };
3249*4882a593Smuzhiyun 
3250*4882a593Smuzhiyun struct set_rf_ntfy_info {
3251*4882a593Smuzhiyun 	enum rtw_rf_state state_to_set;
3252*4882a593Smuzhiyun 	_os_event done;
3253*4882a593Smuzhiyun };
3254*4882a593Smuzhiyun 
3255*4882a593Smuzhiyun 
3256*4882a593Smuzhiyun /**
3257*4882a593Smuzhiyun  * rtw_phl_rainfo - structure use to query RA information
3258*4882a593Smuzhiyun  * from hal layer to core/phl layer
3259*4882a593Smuzhiyun  * @rate: current rate selected by RA, define by general definition enum rtw_data_rate
3260*4882a593Smuzhiyun  * @bw: current BW, define by general definition enum channel_width
3261*4882a593Smuzhiyun  * @gi_ltf: current gi_ltf, define by general definition enum rtw_gi_ltf
3262*4882a593Smuzhiyun  */
3263*4882a593Smuzhiyun struct rtw_phl_rainfo {
3264*4882a593Smuzhiyun 	enum rtw_data_rate rate;
3265*4882a593Smuzhiyun 	enum channel_width bw;
3266*4882a593Smuzhiyun 	enum rtw_gi_ltf gi_ltf;
3267*4882a593Smuzhiyun };
3268*4882a593Smuzhiyun 
3269*4882a593Smuzhiyun struct rtw_env_report {
3270*4882a593Smuzhiyun 	bool rpt_status; /*1 means CCX_SUCCESS,0 means fail*/
3271*4882a593Smuzhiyun 	u8 clm_ratio;
3272*4882a593Smuzhiyun 	u8 nhm_ratio;
3273*4882a593Smuzhiyun 	u8 nhm_tx_ratio;
3274*4882a593Smuzhiyun 	u8 nhm_pwr;
3275*4882a593Smuzhiyun 	u8 nhm_cca_ratio;
3276*4882a593Smuzhiyun };
3277*4882a593Smuzhiyun 
3278*4882a593Smuzhiyun enum rtw_phl_ser_lv1_recv_step {
3279*4882a593Smuzhiyun 	RTW_PHL_SER_LV1_RCVY_STEP_1 = 0,
3280*4882a593Smuzhiyun 	RTW_PHL_SER_LV1_SER_RCVY_STEP_2,
3281*4882a593Smuzhiyun 
3282*4882a593Smuzhiyun 	/* keep last */
3283*4882a593Smuzhiyun 	RTW_PHL_SER_LV1_RCVY_STEP_LAST,
3284*4882a593Smuzhiyun 	RTW_PHL_SER_LV1_RCVY_STEP_MAX = RTW_PHL_SER_LV1_RCVY_STEP_LAST,
3285*4882a593Smuzhiyun 	RTW_PHL_SER_LV1_RCVY_STEP_INVALID = RTW_PHL_SER_LV1_RCVY_STEP_LAST,
3286*4882a593Smuzhiyun };
3287*4882a593Smuzhiyun 
3288*4882a593Smuzhiyun #endif /*_PHL_DEF_H_*/
3289