1e57b7901SRyder Lee /* SPDX-License-Identifier: ISC */
2e57b7901SRyder Lee /* Copyright (C) 2020 MediaTek Inc. */
3e57b7901SRyder Lee 
4e57b7901SRyder Lee #ifndef __MT7915_MCU_H
5e57b7901SRyder Lee #define __MT7915_MCU_H
6e57b7901SRyder Lee 
7e57b7901SRyder Lee struct mt7915_mcu_txd {
8e57b7901SRyder Lee 	__le32 txd[8];
9e57b7901SRyder Lee 
10e57b7901SRyder Lee 	__le16 len;
11e57b7901SRyder Lee 	__le16 pq_id;
12e57b7901SRyder Lee 
13e57b7901SRyder Lee 	u8 cid;
14e57b7901SRyder Lee 	u8 pkt_type;
15e57b7901SRyder Lee 	u8 set_query; /* FW don't care */
16e57b7901SRyder Lee 	u8 seq;
17e57b7901SRyder Lee 
18e57b7901SRyder Lee 	u8 uc_d2b0_rev;
19e57b7901SRyder Lee 	u8 ext_cid;
20e57b7901SRyder Lee 	u8 s2d_index;
21e57b7901SRyder Lee 	u8 ext_cid_ack;
22e57b7901SRyder Lee 
23e57b7901SRyder Lee 	u32 reserved[5];
24e57b7901SRyder Lee } __packed __aligned(4);
25e57b7901SRyder Lee 
26e57b7901SRyder Lee /* event table */
27e57b7901SRyder Lee enum {
28e57b7901SRyder Lee 	MCU_EVENT_TARGET_ADDRESS_LEN = 0x01,
29e57b7901SRyder Lee 	MCU_EVENT_FW_START = 0x01,
30e57b7901SRyder Lee 	MCU_EVENT_GENERIC = 0x01,
31e57b7901SRyder Lee 	MCU_EVENT_ACCESS_REG = 0x02,
32e57b7901SRyder Lee 	MCU_EVENT_MT_PATCH_SEM = 0x04,
33e57b7901SRyder Lee 	MCU_EVENT_CH_PRIVILEGE = 0x18,
34e57b7901SRyder Lee 	MCU_EVENT_EXT = 0xed,
35e57b7901SRyder Lee 	MCU_EVENT_RESTART_DL = 0xef,
36e57b7901SRyder Lee };
37e57b7901SRyder Lee 
38e57b7901SRyder Lee /* ext event table */
39e57b7901SRyder Lee enum {
40e57b7901SRyder Lee 	MCU_EXT_EVENT_PS_SYNC = 0x5,
415517f78bSRyder Lee 	MCU_EXT_EVENT_FW_LOG_2_HOST = 0x13,
42e57b7901SRyder Lee 	MCU_EXT_EVENT_THERMAL_PROTECT = 0x22,
43e57b7901SRyder Lee 	MCU_EXT_EVENT_ASSERT_DUMP = 0x23,
44e57b7901SRyder Lee 	MCU_EXT_EVENT_RDD_REPORT = 0x3a,
45e57b7901SRyder Lee 	MCU_EXT_EVENT_CSA_NOTIFY = 0x4f,
46e57b7901SRyder Lee 	MCU_EXT_EVENT_RATE_REPORT = 0x87,
47e57b7901SRyder Lee };
48e57b7901SRyder Lee 
49e57b7901SRyder Lee struct mt7915_mcu_rxd {
50e57b7901SRyder Lee 	__le32 rxd[6];
51e57b7901SRyder Lee 
52e57b7901SRyder Lee 	__le16 len;
53e57b7901SRyder Lee 	__le16 pkt_type_id;
54e57b7901SRyder Lee 
55e57b7901SRyder Lee 	u8 eid;
56e57b7901SRyder Lee 	u8 seq;
57e57b7901SRyder Lee 	__le16 __rsv;
58e57b7901SRyder Lee 
59e57b7901SRyder Lee 	u8 ext_eid;
60e57b7901SRyder Lee 	u8 __rsv1[2];
61e57b7901SRyder Lee 	u8 s2d_index;
62e57b7901SRyder Lee };
63e57b7901SRyder Lee 
64e57b7901SRyder Lee struct mt7915_mcu_rdd_report {
65e57b7901SRyder Lee 	struct mt7915_mcu_rxd rxd;
66e57b7901SRyder Lee 
67e57b7901SRyder Lee 	u8 idx;
68e57b7901SRyder Lee 	u8 long_detected;
69e57b7901SRyder Lee 	u8 constant_prf_detected;
70e57b7901SRyder Lee 	u8 staggered_prf_detected;
71e57b7901SRyder Lee 	u8 radar_type_idx;
72e57b7901SRyder Lee 	u8 periodic_pulse_num;
73e57b7901SRyder Lee 	u8 long_pulse_num;
74e57b7901SRyder Lee 	u8 hw_pulse_num;
75e57b7901SRyder Lee 
76e57b7901SRyder Lee 	u8 out_lpn;
77e57b7901SRyder Lee 	u8 out_spn;
78e57b7901SRyder Lee 	u8 out_crpn;
79e57b7901SRyder Lee 	u8 out_crpw;
80e57b7901SRyder Lee 	u8 out_crbn;
81e57b7901SRyder Lee 	u8 out_stgpn;
82e57b7901SRyder Lee 	u8 out_stgpw;
83e57b7901SRyder Lee 
84e57b7901SRyder Lee 	u8 rsv;
85e57b7901SRyder Lee 
86e57b7901SRyder Lee 	__le32 out_pri_const;
87e57b7901SRyder Lee 	__le32 out_pri_stg[3];
88e57b7901SRyder Lee 
89e57b7901SRyder Lee 	struct {
90e57b7901SRyder Lee 		__le32 start;
91e57b7901SRyder Lee 		__le16 pulse_width;
92e57b7901SRyder Lee 		__le16 pulse_power;
93e57b7901SRyder Lee 		u8 mdrdy_flag;
94e57b7901SRyder Lee 		u8 rsv[3];
95e57b7901SRyder Lee 	} long_pulse[32];
96e57b7901SRyder Lee 
97e57b7901SRyder Lee 	struct {
98e57b7901SRyder Lee 		__le32 start;
99e57b7901SRyder Lee 		__le16 pulse_width;
100e57b7901SRyder Lee 		__le16 pulse_power;
101e57b7901SRyder Lee 		u8 mdrdy_flag;
102e57b7901SRyder Lee 		u8 rsv[3];
103e57b7901SRyder Lee 	} periodic_pulse[32];
104e57b7901SRyder Lee 
105e57b7901SRyder Lee 	struct {
106e57b7901SRyder Lee 		__le32 start;
107e57b7901SRyder Lee 		__le16 pulse_width;
108e57b7901SRyder Lee 		__le16 pulse_power;
109e57b7901SRyder Lee 		u8 sc_pass;
110e57b7901SRyder Lee 		u8 sw_reset;
111e57b7901SRyder Lee 		u8 mdrdy_flag;
112e57b7901SRyder Lee 		u8 tx_active;
113e57b7901SRyder Lee 	} hw_pulse[32];
114e57b7901SRyder Lee } __packed;
115e57b7901SRyder Lee 
116e57b7901SRyder Lee struct mt7915_mcu_eeprom_info {
117e57b7901SRyder Lee 	__le32 addr;
118e57b7901SRyder Lee 	__le32 valid;
119e57b7901SRyder Lee 	u8 data[16];
120e57b7901SRyder Lee } __packed;
121e57b7901SRyder Lee 
122e57b7901SRyder Lee struct mt7915_mcu_ra_info {
123e57b7901SRyder Lee 	struct mt7915_mcu_rxd rxd;
124e57b7901SRyder Lee 
125e57b7901SRyder Lee 	__le32 event_id;
126e57b7901SRyder Lee 	__le16 wlan_idx;
127e57b7901SRyder Lee 	__le16 ru_idx;
128e57b7901SRyder Lee 	__le16 direction;
129e57b7901SRyder Lee 	__le16 dump_group;
130e57b7901SRyder Lee 
131e57b7901SRyder Lee 	__le32 suggest_rate;
132e57b7901SRyder Lee 	__le32 min_rate;	/* for dynamic sounding */
133e57b7901SRyder Lee 	__le32 max_rate;	/* for dynamic sounding */
134e57b7901SRyder Lee 	__le32 init_rate_down_rate;
135e57b7901SRyder Lee 
136e57b7901SRyder Lee 	__le16 curr_rate;
137e57b7901SRyder Lee 	__le16 init_rate_down_total;
138e57b7901SRyder Lee 	__le16 init_rate_down_succ;
139e57b7901SRyder Lee 	__le16 success;
140e57b7901SRyder Lee 	__le16 attempts;
141e57b7901SRyder Lee 
142e57b7901SRyder Lee 	__le16 prev_rate;
143e57b7901SRyder Lee 	__le16 prob_up_rate;
144e57b7901SRyder Lee 	u8 no_rate_up_cnt;
145e57b7901SRyder Lee 	u8 ppdu_cnt;
146e57b7901SRyder Lee 	u8 gi;
147e57b7901SRyder Lee 
148e57b7901SRyder Lee 	u8 try_up_fail;
149e57b7901SRyder Lee 	u8 try_up_total;
150e57b7901SRyder Lee 	u8 suggest_wf;
151e57b7901SRyder Lee 	u8 try_up_check;
152e57b7901SRyder Lee 	u8 prob_up_period;
153e57b7901SRyder Lee 	u8 prob_down_pending;
154e57b7901SRyder Lee } __packed;
155e57b7901SRyder Lee 
156*11553d88SFelix Fietkau 
157*11553d88SFelix Fietkau struct mt7915_mcu_phy_rx_info {
158*11553d88SFelix Fietkau 	u8 category;
159*11553d88SFelix Fietkau 	u8 rate;
160*11553d88SFelix Fietkau 	u8 mode;
161*11553d88SFelix Fietkau 	u8 nsts;
162*11553d88SFelix Fietkau 	u8 gi;
163*11553d88SFelix Fietkau 	u8 coding;
164*11553d88SFelix Fietkau 	u8 stbc;
165*11553d88SFelix Fietkau 	u8 bw;
166*11553d88SFelix Fietkau };
167*11553d88SFelix Fietkau 
168e57b7901SRyder Lee #define MT_RA_RATE_NSS			GENMASK(8, 6)
169e57b7901SRyder Lee #define MT_RA_RATE_MCS			GENMASK(3, 0)
170e57b7901SRyder Lee #define MT_RA_RATE_TX_MODE		GENMASK(12, 9)
171e57b7901SRyder Lee #define MT_RA_RATE_DCM_EN		BIT(4)
172e57b7901SRyder Lee #define MT_RA_RATE_BW			GENMASK(14, 13)
173e57b7901SRyder Lee 
174e57b7901SRyder Lee #define MCU_PQ_ID(p, q)			(((p) << 15) | ((q) << 10))
175e57b7901SRyder Lee #define MCU_PKT_ID			0xa0
176e57b7901SRyder Lee 
177e57b7901SRyder Lee enum {
178e57b7901SRyder Lee 	MCU_Q_QUERY,
179e57b7901SRyder Lee 	MCU_Q_SET,
180e57b7901SRyder Lee 	MCU_Q_RESERVED,
181e57b7901SRyder Lee 	MCU_Q_NA
182e57b7901SRyder Lee };
183e57b7901SRyder Lee 
184e57b7901SRyder Lee enum {
185e57b7901SRyder Lee 	MCU_S2D_H2N,
186e57b7901SRyder Lee 	MCU_S2D_C2N,
187e57b7901SRyder Lee 	MCU_S2D_H2C,
188e57b7901SRyder Lee 	MCU_S2D_H2CN
189e57b7901SRyder Lee };
190e57b7901SRyder Lee 
191e57b7901SRyder Lee enum {
192e57b7901SRyder Lee 	MCU_CMD_TARGET_ADDRESS_LEN_REQ = 0x01,
193e57b7901SRyder Lee 	MCU_CMD_FW_START_REQ = 0x02,
194e57b7901SRyder Lee 	MCU_CMD_INIT_ACCESS_REG = 0x3,
195e57b7901SRyder Lee 	MCU_CMD_NIC_POWER_CTRL = 0x4,
196e57b7901SRyder Lee 	MCU_CMD_PATCH_START_REQ = 0x05,
197e57b7901SRyder Lee 	MCU_CMD_PATCH_FINISH_REQ = 0x07,
198e57b7901SRyder Lee 	MCU_CMD_PATCH_SEM_CONTROL = 0x10,
199e57b7901SRyder Lee 	MCU_CMD_EXT_CID = 0xED,
200e57b7901SRyder Lee 	MCU_CMD_FW_SCATTER = 0xEE,
201e57b7901SRyder Lee 	MCU_CMD_RESTART_DL_REQ = 0xEF,
202e57b7901SRyder Lee };
203e57b7901SRyder Lee 
204e57b7901SRyder Lee enum {
205e57b7901SRyder Lee 	MCU_EXT_CMD_EFUSE_ACCESS = 0x01,
206e57b7901SRyder Lee 	MCU_EXT_CMD_PM_STATE_CTRL = 0x07,
207e57b7901SRyder Lee 	MCU_EXT_CMD_CHANNEL_SWITCH = 0x08,
2085517f78bSRyder Lee 	MCU_EXT_CMD_FW_LOG_2_HOST = 0x13,
20989029a85SRyder Lee 	MCU_EXT_CMD_TXBF_ACTION = 0x1e,
210e57b7901SRyder Lee 	MCU_EXT_CMD_EFUSE_BUFFER_MODE = 0x21,
211e57b7901SRyder Lee 	MCU_EXT_CMD_STA_REC_UPDATE = 0x25,
212e57b7901SRyder Lee 	MCU_EXT_CMD_BSS_INFO_UPDATE = 0x26,
213e57b7901SRyder Lee 	MCU_EXT_CMD_EDCA_UPDATE = 0x27,
214e57b7901SRyder Lee 	MCU_EXT_CMD_DEV_INFO_UPDATE = 0x2A,
215e57b7901SRyder Lee 	MCU_EXT_CMD_THERMAL_CTRL = 0x2c,
216e151d71eSFelix Fietkau 	MCU_EXT_CMD_WTBL_UPDATE = 0x32,
217f68e6a1fSRyder Lee 	MCU_EXT_CMD_SET_DRR_CTRL = 0x36,
218e57b7901SRyder Lee 	MCU_EXT_CMD_SET_RDD_CTRL = 0x3a,
219e57b7901SRyder Lee 	MCU_EXT_CMD_PROTECT_CTRL = 0x3e,
220e57b7901SRyder Lee 	MCU_EXT_CMD_MAC_INIT_CTRL = 0x46,
221e57b7901SRyder Lee 	MCU_EXT_CMD_RX_HDR_TRANS = 0x47,
2228aa2c6f4SFelix Fietkau 	MCU_EXT_CMD_MUAR_UPDATE = 0x48,
223e57b7901SRyder Lee 	MCU_EXT_CMD_SET_RX_PATH = 0x4e,
224f1d96236SRyder Lee 	MCU_EXT_CMD_TX_POWER_FEATURE_CTRL = 0x58,
225e151d71eSFelix Fietkau 	MCU_EXT_CMD_MWDS_SUPPORT = 0x80,
226e57b7901SRyder Lee 	MCU_EXT_CMD_SET_SER_TRIGGER = 0x81,
227e57b7901SRyder Lee 	MCU_EXT_CMD_SCS_CTRL = 0x82,
228e57b7901SRyder Lee 	MCU_EXT_CMD_RATE_CTRL = 0x87,
2295517f78bSRyder Lee 	MCU_EXT_CMD_FW_DBG_CTRL = 0x95,
230e57b7901SRyder Lee 	MCU_EXT_CMD_SET_RDD_TH = 0x9d,
23106acdd38SRyder Lee 	MCU_EXT_CMD_SET_SPR = 0xa8,
232*11553d88SFelix Fietkau 	MCU_EXT_CMD_PHY_STAT_INFO = 0xad,
233e57b7901SRyder Lee };
234e57b7901SRyder Lee 
235e57b7901SRyder Lee enum {
236e57b7901SRyder Lee 	PATCH_SEM_RELEASE,
237e57b7901SRyder Lee 	PATCH_SEM_GET
238e57b7901SRyder Lee };
239e57b7901SRyder Lee 
240e57b7901SRyder Lee enum {
241e57b7901SRyder Lee 	PATCH_NOT_DL_SEM_FAIL,
242e57b7901SRyder Lee 	PATCH_IS_DL,
243e57b7901SRyder Lee 	PATCH_NOT_DL_SEM_SUCCESS,
244e57b7901SRyder Lee 	PATCH_REL_SEM_SUCCESS
245e57b7901SRyder Lee };
246e57b7901SRyder Lee 
247e57b7901SRyder Lee enum {
248e57b7901SRyder Lee 	FW_STATE_INITIAL,
249e57b7901SRyder Lee 	FW_STATE_FW_DOWNLOAD,
250e57b7901SRyder Lee 	FW_STATE_NORMAL_OPERATION,
251e57b7901SRyder Lee 	FW_STATE_NORMAL_TRX,
252e57b7901SRyder Lee 	FW_STATE_WACPU_RDY        = 7
253e57b7901SRyder Lee };
254e57b7901SRyder Lee 
255e57b7901SRyder Lee enum {
256e57b7901SRyder Lee 	EE_MODE_EFUSE,
257e57b7901SRyder Lee 	EE_MODE_BUFFER,
258e57b7901SRyder Lee };
259e57b7901SRyder Lee 
260e57b7901SRyder Lee enum {
261e57b7901SRyder Lee 	EE_FORMAT_BIN,
262e57b7901SRyder Lee 	EE_FORMAT_WHOLE,
263e57b7901SRyder Lee 	EE_FORMAT_MULTIPLE,
264e57b7901SRyder Lee };
265e57b7901SRyder Lee 
266*11553d88SFelix Fietkau enum {
267*11553d88SFelix Fietkau 	MCU_PHY_STATE_TX_RATE,
268*11553d88SFelix Fietkau 	MCU_PHY_STATE_RX_RATE,
269*11553d88SFelix Fietkau 	MCU_PHY_STATE_RSSI,
270*11553d88SFelix Fietkau 	MCU_PHY_STATE_CONTENTION_RX_RATE,
271*11553d88SFelix Fietkau 	MCU_PHY_STATE_OFDMLQ_CNINFO,
272*11553d88SFelix Fietkau };
273*11553d88SFelix Fietkau 
274e57b7901SRyder Lee #define STA_TYPE_STA			BIT(0)
275e57b7901SRyder Lee #define STA_TYPE_AP			BIT(1)
276e57b7901SRyder Lee #define STA_TYPE_ADHOC			BIT(2)
277e57b7901SRyder Lee #define STA_TYPE_WDS			BIT(4)
278e57b7901SRyder Lee #define STA_TYPE_BC			BIT(5)
279e57b7901SRyder Lee 
280e57b7901SRyder Lee #define NETWORK_INFRA			BIT(16)
281e57b7901SRyder Lee #define NETWORK_P2P			BIT(17)
282e57b7901SRyder Lee #define NETWORK_IBSS			BIT(18)
283e57b7901SRyder Lee #define NETWORK_WDS			BIT(21)
284e57b7901SRyder Lee 
285e57b7901SRyder Lee #define CONNECTION_INFRA_STA		(STA_TYPE_STA | NETWORK_INFRA)
286e57b7901SRyder Lee #define CONNECTION_INFRA_AP		(STA_TYPE_AP | NETWORK_INFRA)
287e57b7901SRyder Lee #define CONNECTION_P2P_GC		(STA_TYPE_STA | NETWORK_P2P)
288e57b7901SRyder Lee #define CONNECTION_P2P_GO		(STA_TYPE_AP | NETWORK_P2P)
289e57b7901SRyder Lee #define CONNECTION_IBSS_ADHOC		(STA_TYPE_ADHOC | NETWORK_IBSS)
290e57b7901SRyder Lee #define CONNECTION_WDS			(STA_TYPE_WDS | NETWORK_WDS)
291e57b7901SRyder Lee #define CONNECTION_INFRA_BC		(STA_TYPE_BC | NETWORK_INFRA)
292e57b7901SRyder Lee 
293e57b7901SRyder Lee #define CONN_STATE_DISCONNECT		0
294e57b7901SRyder Lee #define CONN_STATE_CONNECT		1
295e57b7901SRyder Lee #define CONN_STATE_PORT_SECURE		2
296e57b7901SRyder Lee 
297e57b7901SRyder Lee enum {
298e57b7901SRyder Lee 	DEV_INFO_ACTIVE,
299e57b7901SRyder Lee 	DEV_INFO_MAX_NUM
300e57b7901SRyder Lee };
301e57b7901SRyder Lee 
302e57b7901SRyder Lee enum {
303e57b7901SRyder Lee 	SCS_SEND_DATA,
304e57b7901SRyder Lee 	SCS_SET_MANUAL_PD_TH,
305e57b7901SRyder Lee 	SCS_CONFIG,
306e57b7901SRyder Lee 	SCS_ENABLE,
307e57b7901SRyder Lee 	SCS_SHOW_INFO,
308e57b7901SRyder Lee 	SCS_GET_GLO_ADDR,
309e57b7901SRyder Lee 	SCS_GET_GLO_ADDR_EVENT,
310e57b7901SRyder Lee };
311e57b7901SRyder Lee 
312e57b7901SRyder Lee enum {
313e57b7901SRyder Lee 	CMD_CBW_20MHZ = IEEE80211_STA_RX_BW_20,
314e57b7901SRyder Lee 	CMD_CBW_40MHZ = IEEE80211_STA_RX_BW_40,
315e57b7901SRyder Lee 	CMD_CBW_80MHZ = IEEE80211_STA_RX_BW_80,
316e57b7901SRyder Lee 	CMD_CBW_160MHZ = IEEE80211_STA_RX_BW_160,
317e57b7901SRyder Lee 	CMD_CBW_10MHZ,
318e57b7901SRyder Lee 	CMD_CBW_5MHZ,
319e57b7901SRyder Lee 	CMD_CBW_8080MHZ,
320e57b7901SRyder Lee 
321e57b7901SRyder Lee 	CMD_HE_MCS_BW80 = 0,
322e57b7901SRyder Lee 	CMD_HE_MCS_BW160,
323e57b7901SRyder Lee 	CMD_HE_MCS_BW8080,
324e57b7901SRyder Lee 	CMD_HE_MCS_BW_NUM
325e57b7901SRyder Lee };
326e57b7901SRyder Lee 
327e57b7901SRyder Lee struct tlv {
328e57b7901SRyder Lee 	__le16 tag;
329e57b7901SRyder Lee 	__le16 len;
330e57b7901SRyder Lee } __packed;
331e57b7901SRyder Lee 
332e57b7901SRyder Lee struct bss_info_omac {
333e57b7901SRyder Lee 	__le16 tag;
334e57b7901SRyder Lee 	__le16 len;
335e57b7901SRyder Lee 	u8 hw_bss_idx;
336e57b7901SRyder Lee 	u8 omac_idx;
337e57b7901SRyder Lee 	u8 band_idx;
338e57b7901SRyder Lee 	u8 rsv0;
339e57b7901SRyder Lee 	__le32 conn_type;
340e57b7901SRyder Lee 	u32 rsv1;
341e57b7901SRyder Lee } __packed;
342e57b7901SRyder Lee 
343e57b7901SRyder Lee struct bss_info_basic {
344e57b7901SRyder Lee 	__le16 tag;
345e57b7901SRyder Lee 	__le16 len;
346e57b7901SRyder Lee 	__le32 network_type;
347e57b7901SRyder Lee 	u8 active;
348e57b7901SRyder Lee 	u8 rsv0;
349e57b7901SRyder Lee 	__le16 bcn_interval;
350e57b7901SRyder Lee 	u8 bssid[ETH_ALEN];
351e57b7901SRyder Lee 	u8 wmm_idx;
352e57b7901SRyder Lee 	u8 dtim_period;
353e57b7901SRyder Lee 	u8 bmc_wcid_lo;
354e57b7901SRyder Lee 	u8 cipher;
355e57b7901SRyder Lee 	u8 phy_mode;
356e57b7901SRyder Lee 	u8 max_bssid;	/* max BSSID. range: 1 ~ 8, 0: MBSSID disabled */
357e57b7901SRyder Lee 	u8 non_tx_bssid;/* non-transmitted BSSID, 0: transmitted BSSID */
358e57b7901SRyder Lee 	u8 bmc_wcid_hi;	/* high Byte and version */
359e57b7901SRyder Lee 	u8 rsv[2];
360e57b7901SRyder Lee } __packed;
361e57b7901SRyder Lee 
362e57b7901SRyder Lee struct bss_info_rf_ch {
363e57b7901SRyder Lee 	__le16 tag;
364e57b7901SRyder Lee 	__le16 len;
365e57b7901SRyder Lee 	u8 pri_ch;
366e57b7901SRyder Lee 	u8 center_ch0;
367e57b7901SRyder Lee 	u8 center_ch1;
368e57b7901SRyder Lee 	u8 bw;
369e57b7901SRyder Lee 	u8 he_ru26_block;	/* 1: don't send HETB in RU26, 0: allow */
370e57b7901SRyder Lee 	u8 he_all_disable;	/* 1: disallow all HETB, 0: allow */
371e57b7901SRyder Lee 	u8 rsv[2];
372e57b7901SRyder Lee } __packed;
373e57b7901SRyder Lee 
374e57b7901SRyder Lee struct bss_info_ext_bss {
375e57b7901SRyder Lee 	__le16 tag;
376e57b7901SRyder Lee 	__le16 len;
377e57b7901SRyder Lee 	__le32 mbss_tsf_offset; /* in unit of us */
378e57b7901SRyder Lee 	u8 rsv[8];
379e57b7901SRyder Lee } __packed;
380e57b7901SRyder Lee 
381e57b7901SRyder Lee struct bss_info_sync_mode {
382e57b7901SRyder Lee 	__le16 tag;
383e57b7901SRyder Lee 	__le16 len;
384e57b7901SRyder Lee 	__le16 bcn_interval;
385e57b7901SRyder Lee 	u8 enable;
386e57b7901SRyder Lee 	u8 dtim_period;
387e57b7901SRyder Lee 	u8 rsv[8];
388e57b7901SRyder Lee } __packed;
389e57b7901SRyder Lee 
390e57b7901SRyder Lee struct bss_info_bmc_rate {
391e57b7901SRyder Lee 	__le16 tag;
392e57b7901SRyder Lee 	__le16 len;
393e57b7901SRyder Lee 	__le16 bc_trans;
394e57b7901SRyder Lee 	__le16 mc_trans;
395e57b7901SRyder Lee 	u8 short_preamble;
396e57b7901SRyder Lee 	u8 rsv[7];
397e57b7901SRyder Lee } __packed;
398e57b7901SRyder Lee 
399e57b7901SRyder Lee struct bss_info_ra {
400e57b7901SRyder Lee 	__le16 tag;
401e57b7901SRyder Lee 	__le16 len;
402e57b7901SRyder Lee 	u8 op_mode;
403e57b7901SRyder Lee 	u8 adhoc_en;
404e57b7901SRyder Lee 	u8 short_preamble;
405e57b7901SRyder Lee 	u8 tx_streams;
406e57b7901SRyder Lee 	u8 rx_streams;
407e57b7901SRyder Lee 	u8 algo;
408e57b7901SRyder Lee 	u8 force_sgi;
409e57b7901SRyder Lee 	u8 force_gf;
410e57b7901SRyder Lee 	u8 ht_mode;
411e57b7901SRyder Lee 	u8 has_20_sta;		/* Check if any sta support GF. */
412e57b7901SRyder Lee 	u8 bss_width_trigger_events;
413e57b7901SRyder Lee 	u8 vht_nss_cap;
414e57b7901SRyder Lee 	u8 vht_bw_signal;	/* not use */
415e57b7901SRyder Lee 	u8 vht_force_sgi;	/* not use */
416e57b7901SRyder Lee 	u8 se_off;
417e57b7901SRyder Lee 	u8 antenna_idx;
418e57b7901SRyder Lee 	u8 train_up_rule;
419e57b7901SRyder Lee 	u8 rsv[3];
420e57b7901SRyder Lee 	unsigned short train_up_high_thres;
421e57b7901SRyder Lee 	short train_up_rule_rssi;
422e57b7901SRyder Lee 	unsigned short low_traffic_thres;
423e57b7901SRyder Lee 	__le16 max_phyrate;
424e57b7901SRyder Lee 	__le32 phy_cap;
425e57b7901SRyder Lee 	__le32 interval;
426e57b7901SRyder Lee 	__le32 fast_interval;
427e57b7901SRyder Lee } __packed;
428e57b7901SRyder Lee 
429b443e55fSRyder Lee struct bss_info_hw_amsdu {
430b443e55fSRyder Lee 	__le16 tag;
431b443e55fSRyder Lee 	__le16 len;
432b443e55fSRyder Lee 	__le32 cmp_bitmap_0;
433b443e55fSRyder Lee 	__le32 cmp_bitmap_1;
434b443e55fSRyder Lee 	__le16 trig_thres;
435b443e55fSRyder Lee 	u8 enable;
436b443e55fSRyder Lee 	u8 rsv;
437b443e55fSRyder Lee } __packed;
438b443e55fSRyder Lee 
4396094f86fSRyder Lee struct bss_info_he {
4406094f86fSRyder Lee 	__le16 tag;
4416094f86fSRyder Lee 	__le16 len;
4426094f86fSRyder Lee 	u8 he_pe_duration;
4436094f86fSRyder Lee 	u8 vht_op_info_present;
4446094f86fSRyder Lee 	__le16 he_rts_thres;
4456094f86fSRyder Lee 	__le16 max_nss_mcs[CMD_HE_MCS_BW_NUM];
4466094f86fSRyder Lee 	u8 rsv[6];
4476094f86fSRyder Lee } __packed;
4486094f86fSRyder Lee 
449e57b7901SRyder Lee struct bss_info_bcn {
450e57b7901SRyder Lee 	__le16 tag;
451e57b7901SRyder Lee 	__le16 len;
452e57b7901SRyder Lee 	u8 ver;
453e57b7901SRyder Lee 	u8 enable;
454e57b7901SRyder Lee 	__le16 sub_ntlv;
455e57b7901SRyder Lee } __packed __aligned(4);
456e57b7901SRyder Lee 
457e57b7901SRyder Lee struct bss_info_bcn_csa {
458e57b7901SRyder Lee 	__le16 tag;
459e57b7901SRyder Lee 	__le16 len;
460e57b7901SRyder Lee 	u8 cnt;
461e57b7901SRyder Lee 	u8 rsv[3];
462e57b7901SRyder Lee } __packed __aligned(4);
463e57b7901SRyder Lee 
464e57b7901SRyder Lee struct bss_info_bcn_bcc {
465e57b7901SRyder Lee 	__le16 tag;
466e57b7901SRyder Lee 	__le16 len;
467e57b7901SRyder Lee 	u8 cnt;
468e57b7901SRyder Lee 	u8 rsv[3];
469e57b7901SRyder Lee } __packed __aligned(4);
470e57b7901SRyder Lee 
471e57b7901SRyder Lee struct bss_info_bcn_mbss {
472e57b7901SRyder Lee #define MAX_BEACON_NUM	32
473e57b7901SRyder Lee 	__le16 tag;
474e57b7901SRyder Lee 	__le16 len;
475e57b7901SRyder Lee 	__le32 bitmap;
476e57b7901SRyder Lee 	__le16 offset[MAX_BEACON_NUM];
477e57b7901SRyder Lee 	u8 rsv[8];
478e57b7901SRyder Lee } __packed __aligned(4);
479e57b7901SRyder Lee 
480e57b7901SRyder Lee struct bss_info_bcn_cont {
481e57b7901SRyder Lee 	__le16 tag;
482e57b7901SRyder Lee 	__le16 len;
483e57b7901SRyder Lee 	__le16 tim_ofs;
484e57b7901SRyder Lee 	__le16 csa_ofs;
485e57b7901SRyder Lee 	__le16 bcc_ofs;
486e57b7901SRyder Lee 	__le16 pkt_len;
487e57b7901SRyder Lee } __packed __aligned(4);
488e57b7901SRyder Lee 
489e57b7901SRyder Lee enum {
490e57b7901SRyder Lee 	BSS_INFO_BCN_CSA,
491e57b7901SRyder Lee 	BSS_INFO_BCN_BCC,
492e57b7901SRyder Lee 	BSS_INFO_BCN_MBSSID,
493e57b7901SRyder Lee 	BSS_INFO_BCN_CONTENT,
494e57b7901SRyder Lee 	BSS_INFO_BCN_MAX
495e57b7901SRyder Lee };
496e57b7901SRyder Lee 
497e57b7901SRyder Lee enum {
498e57b7901SRyder Lee 	BSS_INFO_OMAC,
499e57b7901SRyder Lee 	BSS_INFO_BASIC,
500e57b7901SRyder Lee 	BSS_INFO_RF_CH,		/* optional, for BT/LTE coex */
501e57b7901SRyder Lee 	BSS_INFO_PM,		/* sta only */
502e57b7901SRyder Lee 	BSS_INFO_UAPSD,		/* sta only */
503e57b7901SRyder Lee 	BSS_INFO_ROAM_DETECT,	/* obsoleted */
504e57b7901SRyder Lee 	BSS_INFO_LQ_RM,		/* obsoleted */
505e57b7901SRyder Lee 	BSS_INFO_EXT_BSS,
506e57b7901SRyder Lee 	BSS_INFO_BMC_RATE,	/* for bmc rate control in CR4 */
507e57b7901SRyder Lee 	BSS_INFO_SYNC_MODE,
508e57b7901SRyder Lee 	BSS_INFO_RA,
509e57b7901SRyder Lee 	BSS_INFO_HW_AMSDU,
510e57b7901SRyder Lee 	BSS_INFO_BSS_COLOR,
511e57b7901SRyder Lee 	BSS_INFO_HE_BASIC,
512e57b7901SRyder Lee 	BSS_INFO_PROTECT_INFO,
513e57b7901SRyder Lee 	BSS_INFO_OFFLOAD,
514e57b7901SRyder Lee 	BSS_INFO_11V_MBSSID,
515e57b7901SRyder Lee 	BSS_INFO_MAX_NUM
516e57b7901SRyder Lee };
517e57b7901SRyder Lee 
518e57b7901SRyder Lee enum {
519e57b7901SRyder Lee 	WTBL_RESET_AND_SET = 1,
520e57b7901SRyder Lee 	WTBL_SET,
521e57b7901SRyder Lee 	WTBL_QUERY,
522e57b7901SRyder Lee 	WTBL_RESET_ALL
523e57b7901SRyder Lee };
524e57b7901SRyder Lee 
525e57b7901SRyder Lee struct wtbl_req_hdr {
526e57b7901SRyder Lee 	u8 wlan_idx_lo;
527e57b7901SRyder Lee 	u8 operation;
528e57b7901SRyder Lee 	__le16 tlv_num;
529e57b7901SRyder Lee 	u8 wlan_idx_hi;
530e57b7901SRyder Lee 	u8 rsv[3];
531e57b7901SRyder Lee } __packed;
532e57b7901SRyder Lee 
533e57b7901SRyder Lee struct wtbl_generic {
534e57b7901SRyder Lee 	__le16 tag;
535e57b7901SRyder Lee 	__le16 len;
536e57b7901SRyder Lee 	u8 peer_addr[ETH_ALEN];
537e57b7901SRyder Lee 	u8 muar_idx;
538e57b7901SRyder Lee 	u8 skip_tx;
539e57b7901SRyder Lee 	u8 cf_ack;
540e57b7901SRyder Lee 	u8 qos;
541e57b7901SRyder Lee 	u8 mesh;
542e57b7901SRyder Lee 	u8 adm;
543e57b7901SRyder Lee 	__le16 partial_aid;
544e57b7901SRyder Lee 	u8 baf_en;
545e57b7901SRyder Lee 	u8 aad_om;
546e57b7901SRyder Lee } __packed;
547e57b7901SRyder Lee 
548e57b7901SRyder Lee struct wtbl_rx {
549e57b7901SRyder Lee 	__le16 tag;
550e57b7901SRyder Lee 	__le16 len;
551e57b7901SRyder Lee 	u8 rcid;
552e57b7901SRyder Lee 	u8 rca1;
553e57b7901SRyder Lee 	u8 rca2;
554e57b7901SRyder Lee 	u8 rv;
555e57b7901SRyder Lee 	u8 rsv[4];
556e57b7901SRyder Lee } __packed;
557e57b7901SRyder Lee 
558e57b7901SRyder Lee struct wtbl_ht {
559e57b7901SRyder Lee 	__le16 tag;
560e57b7901SRyder Lee 	__le16 len;
561e57b7901SRyder Lee 	u8 ht;
562e57b7901SRyder Lee 	u8 ldpc;
563e57b7901SRyder Lee 	u8 af;
564e57b7901SRyder Lee 	u8 mm;
565e57b7901SRyder Lee 	u8 rsv[4];
566e57b7901SRyder Lee } __packed;
567e57b7901SRyder Lee 
568e57b7901SRyder Lee struct wtbl_vht {
569e57b7901SRyder Lee 	__le16 tag;
570e57b7901SRyder Lee 	__le16 len;
571e57b7901SRyder Lee 	u8 ldpc;
572e57b7901SRyder Lee 	u8 dyn_bw;
573e57b7901SRyder Lee 	u8 vht;
574e57b7901SRyder Lee 	u8 txop_ps;
575e57b7901SRyder Lee 	u8 rsv[4];
576e57b7901SRyder Lee } __packed;
577e57b7901SRyder Lee 
57855f7c9b0SFelix Fietkau struct wtbl_hdr_trans {
57955f7c9b0SFelix Fietkau 	__le16 tag;
58055f7c9b0SFelix Fietkau 	__le16 len;
58155f7c9b0SFelix Fietkau 	u8 to_ds;
58255f7c9b0SFelix Fietkau 	u8 from_ds;
58355f7c9b0SFelix Fietkau 	u8 no_rx_trans;
58455f7c9b0SFelix Fietkau 	u8 _rsv;
58555f7c9b0SFelix Fietkau };
58655f7c9b0SFelix Fietkau 
587e57b7901SRyder Lee enum {
588e57b7901SRyder Lee 	MT_BA_TYPE_INVALID,
589e57b7901SRyder Lee 	MT_BA_TYPE_ORIGINATOR,
590e57b7901SRyder Lee 	MT_BA_TYPE_RECIPIENT
591e57b7901SRyder Lee };
592e57b7901SRyder Lee 
593e57b7901SRyder Lee enum {
594e57b7901SRyder Lee 	RST_BA_MAC_TID_MATCH,
595e57b7901SRyder Lee 	RST_BA_MAC_MATCH,
596e57b7901SRyder Lee 	RST_BA_NO_MATCH
597e57b7901SRyder Lee };
598e57b7901SRyder Lee 
599e57b7901SRyder Lee struct wtbl_ba {
600e57b7901SRyder Lee 	__le16 tag;
601e57b7901SRyder Lee 	__le16 len;
602e57b7901SRyder Lee 	/* common */
603e57b7901SRyder Lee 	u8 tid;
604e57b7901SRyder Lee 	u8 ba_type;
605e57b7901SRyder Lee 	u8 rsv0[2];
606e57b7901SRyder Lee 	/* originator only */
607e57b7901SRyder Lee 	__le16 sn;
608e57b7901SRyder Lee 	u8 ba_en;
609e57b7901SRyder Lee 	u8 ba_winsize_idx;
610e57b7901SRyder Lee 	__le16 ba_winsize;
611e57b7901SRyder Lee 	/* recipient only */
612e57b7901SRyder Lee 	u8 peer_addr[ETH_ALEN];
613e57b7901SRyder Lee 	u8 rst_ba_tid;
614e57b7901SRyder Lee 	u8 rst_ba_sel;
615e57b7901SRyder Lee 	u8 rst_ba_sb;
616e57b7901SRyder Lee 	u8 band_idx;
617e57b7901SRyder Lee 	u8 rsv1[4];
618e57b7901SRyder Lee } __packed;
619e57b7901SRyder Lee 
620e57b7901SRyder Lee struct wtbl_smps {
621e57b7901SRyder Lee 	__le16 tag;
622e57b7901SRyder Lee 	__le16 len;
623e57b7901SRyder Lee 	u8 smps;
624e57b7901SRyder Lee 	u8 rsv[3];
625e57b7901SRyder Lee } __packed;
626e57b7901SRyder Lee 
627e57b7901SRyder Lee enum {
628e57b7901SRyder Lee 	WTBL_GENERIC,
629e57b7901SRyder Lee 	WTBL_RX,
630e57b7901SRyder Lee 	WTBL_HT,
631e57b7901SRyder Lee 	WTBL_VHT,
632e57b7901SRyder Lee 	WTBL_PEER_PS,		/* not used */
633e57b7901SRyder Lee 	WTBL_TX_PS,
634e57b7901SRyder Lee 	WTBL_HDR_TRANS,
635e57b7901SRyder Lee 	WTBL_SEC_KEY,
636e57b7901SRyder Lee 	WTBL_BA,
637e57b7901SRyder Lee 	WTBL_RDG,		/* obsoleted */
638e57b7901SRyder Lee 	WTBL_PROTECT,		/* not used */
639e57b7901SRyder Lee 	WTBL_CLEAR,		/* not used */
640e57b7901SRyder Lee 	WTBL_BF,
641e57b7901SRyder Lee 	WTBL_SMPS,
642e57b7901SRyder Lee 	WTBL_RAW_DATA,		/* debug only */
643e57b7901SRyder Lee 	WTBL_PN,
644e57b7901SRyder Lee 	WTBL_SPE,
645e57b7901SRyder Lee 	WTBL_MAX_NUM
646e57b7901SRyder Lee };
647e57b7901SRyder Lee 
648e57b7901SRyder Lee struct sta_ntlv_hdr {
649e57b7901SRyder Lee 	u8 rsv[2];
650e57b7901SRyder Lee 	__le16 tlv_num;
651e57b7901SRyder Lee } __packed;
652e57b7901SRyder Lee 
653e57b7901SRyder Lee struct sta_req_hdr {
654e57b7901SRyder Lee 	u8 bss_idx;
655e57b7901SRyder Lee 	u8 wlan_idx_lo;
656e57b7901SRyder Lee 	__le16 tlv_num;
657e57b7901SRyder Lee 	u8 is_tlv_append;
658e57b7901SRyder Lee 	u8 muar_idx;
659e57b7901SRyder Lee 	u8 wlan_idx_hi;
660e57b7901SRyder Lee 	u8 rsv;
661e57b7901SRyder Lee } __packed;
662e57b7901SRyder Lee 
663e57b7901SRyder Lee struct sta_rec_basic {
664e57b7901SRyder Lee 	__le16 tag;
665e57b7901SRyder Lee 	__le16 len;
666e57b7901SRyder Lee 	__le32 conn_type;
667e57b7901SRyder Lee 	u8 conn_state;
668e57b7901SRyder Lee 	u8 qos;
669e57b7901SRyder Lee 	__le16 aid;
670e57b7901SRyder Lee 	u8 peer_addr[ETH_ALEN];
671e57b7901SRyder Lee 	__le16 extra_info;
672e57b7901SRyder Lee } __packed;
673e57b7901SRyder Lee 
674e57b7901SRyder Lee struct sta_rec_ht {
675e57b7901SRyder Lee 	__le16 tag;
676e57b7901SRyder Lee 	__le16 len;
677e57b7901SRyder Lee 	__le16 ht_cap;
678e57b7901SRyder Lee 	u16 rsv;
679e57b7901SRyder Lee } __packed;
680e57b7901SRyder Lee 
681e57b7901SRyder Lee struct sta_rec_vht {
682e57b7901SRyder Lee 	__le16 tag;
683e57b7901SRyder Lee 	__le16 len;
684e57b7901SRyder Lee 	__le32 vht_cap;
685e57b7901SRyder Lee 	__le16 vht_rx_mcs_map;
686e57b7901SRyder Lee 	__le16 vht_tx_mcs_map;
687e57b7901SRyder Lee 	u8 rts_bw_sig;
688e57b7901SRyder Lee 	u8 rsv[3];
689e57b7901SRyder Lee } __packed;
690e57b7901SRyder Lee 
6914bf04d33SRyder Lee struct sta_rec_uapsd {
6924bf04d33SRyder Lee 	__le16 tag;
6934bf04d33SRyder Lee 	__le16 len;
6944bf04d33SRyder Lee 	u8 dac_map;
6954bf04d33SRyder Lee 	u8 tac_map;
6964bf04d33SRyder Lee 	u8 max_sp;
6974bf04d33SRyder Lee 	u8 rsv0;
6984bf04d33SRyder Lee 	__le16 listen_interval;
6994bf04d33SRyder Lee 	u8 rsv1[2];
7004bf04d33SRyder Lee } __packed;
7014bf04d33SRyder Lee 
702c336318fSRyder Lee struct sta_rec_muru {
703c336318fSRyder Lee 	__le16 tag;
704c336318fSRyder Lee 	__le16 len;
705c336318fSRyder Lee 
706c336318fSRyder Lee 	struct {
707c336318fSRyder Lee 		bool ofdma_dl_en;
708c336318fSRyder Lee 		bool ofdma_ul_en;
709c336318fSRyder Lee 		bool mimo_dl_en;
710c336318fSRyder Lee 		bool mimo_ul_en;
711f68e6a1fSRyder Lee 		u8 rsv[4];
712c336318fSRyder Lee 	} cfg;
713c336318fSRyder Lee 
714c336318fSRyder Lee 	struct {
715c336318fSRyder Lee 		u8 punc_pream_rx;
716c336318fSRyder Lee 		bool he_20m_in_40m_2g;
717c336318fSRyder Lee 		bool he_20m_in_160m;
718c336318fSRyder Lee 		bool he_80m_in_160m;
719c336318fSRyder Lee 		bool lt16_sigb;
720c336318fSRyder Lee 		bool rx_su_comp_sigb;
721c336318fSRyder Lee 		bool rx_su_non_comp_sigb;
722f68e6a1fSRyder Lee 		u8 rsv;
723c336318fSRyder Lee 	} ofdma_dl;
724c336318fSRyder Lee 
725c336318fSRyder Lee 	struct {
726c336318fSRyder Lee 		u8 t_frame_dur;
727c336318fSRyder Lee 		u8 mu_cascading;
728c336318fSRyder Lee 		u8 uo_ra;
729c336318fSRyder Lee 		u8 he_2x996_tone;
730c336318fSRyder Lee 		u8 rx_t_frame_11ac;
731c336318fSRyder Lee 		u8 rsv[3];
732c336318fSRyder Lee 	} ofdma_ul;
733c336318fSRyder Lee 
734c336318fSRyder Lee 	struct {
735c336318fSRyder Lee 		bool vht_mu_bfee;
736c336318fSRyder Lee 		bool partial_bw_dl_mimo;
737c336318fSRyder Lee 		u8 rsv[2];
738c336318fSRyder Lee 	} mimo_dl;
739c336318fSRyder Lee 
740c336318fSRyder Lee 	struct {
741c336318fSRyder Lee 		bool full_ul_mimo;
742c336318fSRyder Lee 		bool partial_ul_mimo;
743c336318fSRyder Lee 		u8 rsv[2];
744c336318fSRyder Lee 	} mimo_ul;
745c336318fSRyder Lee } __packed;
746c336318fSRyder Lee 
747c336318fSRyder Lee struct sta_rec_he {
748c336318fSRyder Lee 	__le16 tag;
749c336318fSRyder Lee 	__le16 len;
750c336318fSRyder Lee 
751c336318fSRyder Lee 	__le32 he_cap;
752c336318fSRyder Lee 
753c336318fSRyder Lee 	u8 t_frame_dur;
754c336318fSRyder Lee 	u8 max_ampdu_exp;
755c336318fSRyder Lee 	u8 bw_set;
756c336318fSRyder Lee 	u8 device_class;
757c336318fSRyder Lee 	u8 dcm_tx_mode;
758c336318fSRyder Lee 	u8 dcm_tx_max_nss;
759c336318fSRyder Lee 	u8 dcm_rx_mode;
760c336318fSRyder Lee 	u8 dcm_rx_max_nss;
761c336318fSRyder Lee 	u8 dcm_max_ru;
762c336318fSRyder Lee 	u8 punc_pream_rx;
763c336318fSRyder Lee 	u8 pkt_ext;
764c336318fSRyder Lee 	u8 rsv1;
765c336318fSRyder Lee 
766c336318fSRyder Lee 	__le16 max_nss_mcs[CMD_HE_MCS_BW_NUM];
767c336318fSRyder Lee 
768c336318fSRyder Lee 	u8 rsv2[2];
769c336318fSRyder Lee } __packed;
770c336318fSRyder Lee 
771e57b7901SRyder Lee struct sta_rec_ba {
772e57b7901SRyder Lee 	__le16 tag;
773e57b7901SRyder Lee 	__le16 len;
774e57b7901SRyder Lee 	u8 tid;
775e57b7901SRyder Lee 	u8 ba_type;
776e57b7901SRyder Lee 	u8 amsdu;
777e57b7901SRyder Lee 	u8 ba_en;
778e57b7901SRyder Lee 	__le16 ssn;
779e57b7901SRyder Lee 	__le16 winsize;
780e57b7901SRyder Lee } __packed;
781e57b7901SRyder Lee 
782b443e55fSRyder Lee struct sta_rec_amsdu {
783b443e55fSRyder Lee 	__le16 tag;
784b443e55fSRyder Lee 	__le16 len;
785b443e55fSRyder Lee 	u8 max_amsdu_num;
786b443e55fSRyder Lee 	u8 max_mpdu_size;
787b443e55fSRyder Lee 	u8 amsdu_en;
788b443e55fSRyder Lee 	u8 rsv;
789b443e55fSRyder Lee } __packed;
790b443e55fSRyder Lee 
791e57b7901SRyder Lee struct sec_key {
792e57b7901SRyder Lee 	u8 cipher_id;
793e57b7901SRyder Lee 	u8 cipher_len;
794e57b7901SRyder Lee 	u8 key_id;
795e57b7901SRyder Lee 	u8 key_len;
796e57b7901SRyder Lee 	u8 key[32];
797e57b7901SRyder Lee } __packed;
798e57b7901SRyder Lee 
799e57b7901SRyder Lee struct sta_rec_sec {
800e57b7901SRyder Lee 	__le16 tag;
801e57b7901SRyder Lee 	__le16 len;
802e57b7901SRyder Lee 	u8 add;
803e57b7901SRyder Lee 	u8 n_cipher;
804e57b7901SRyder Lee 	u8 rsv[2];
805e57b7901SRyder Lee 
806e57b7901SRyder Lee 	struct sec_key key[2];
807e57b7901SRyder Lee } __packed;
808e57b7901SRyder Lee 
809e57b7901SRyder Lee struct ra_phy {
810e57b7901SRyder Lee 	u8 type;
811e57b7901SRyder Lee 	u8 flag;
812e57b7901SRyder Lee 	u8 stbc;
813e57b7901SRyder Lee 	u8 sgi;
814e57b7901SRyder Lee 	u8 bw;
815e57b7901SRyder Lee 	u8 ldpc;
816e57b7901SRyder Lee 	u8 mcs;
817e57b7901SRyder Lee 	u8 nss;
818e57b7901SRyder Lee 	u8 he_ltf;
819e57b7901SRyder Lee };
820e57b7901SRyder Lee 
821e57b7901SRyder Lee struct sta_rec_ra {
822e57b7901SRyder Lee 	__le16 tag;
823e57b7901SRyder Lee 	__le16 len;
824e57b7901SRyder Lee 
825e57b7901SRyder Lee 	u8 valid;
826e57b7901SRyder Lee 	u8 auto_rate;
827e57b7901SRyder Lee 	u8 phy_mode;
828e57b7901SRyder Lee 	u8 channel;
829e57b7901SRyder Lee 	u8 bw;
830e57b7901SRyder Lee 	u8 disable_cck;
831e57b7901SRyder Lee 	u8 ht_mcs32;
832e57b7901SRyder Lee 	u8 ht_gf;
833e57b7901SRyder Lee 	u8 ht_mcs[4];
834e57b7901SRyder Lee 	u8 mmps_mode;
835e57b7901SRyder Lee 	u8 gband_256;
836e57b7901SRyder Lee 	u8 af;
837e57b7901SRyder Lee 	u8 auth_wapi_mode;
838e57b7901SRyder Lee 	u8 rate_len;
839e57b7901SRyder Lee 
840e57b7901SRyder Lee 	u8 supp_mode;
841e57b7901SRyder Lee 	u8 supp_cck_rate;
842e57b7901SRyder Lee 	u8 supp_ofdm_rate;
843e57b7901SRyder Lee 	__le32 supp_ht_mcs;
844e57b7901SRyder Lee 	__le16 supp_vht_mcs[4];
845e57b7901SRyder Lee 
846e57b7901SRyder Lee 	u8 op_mode;
847e57b7901SRyder Lee 	u8 op_vht_chan_width;
848e57b7901SRyder Lee 	u8 op_vht_rx_nss;
849e57b7901SRyder Lee 	u8 op_vht_rx_nss_type;
850e57b7901SRyder Lee 
851e57b7901SRyder Lee 	__le32 sta_status;
852e57b7901SRyder Lee 
853e57b7901SRyder Lee 	struct ra_phy phy;
854e57b7901SRyder Lee } __packed;
855e57b7901SRyder Lee 
8569fac3c81SRyder Lee struct sta_rec_ra_fixed {
8579fac3c81SRyder Lee 	__le16 tag;
8589fac3c81SRyder Lee 	__le16 len;
8599fac3c81SRyder Lee 
8609fac3c81SRyder Lee 	__le32 field;
8619fac3c81SRyder Lee 	u8 op_mode;
8629fac3c81SRyder Lee 	u8 op_vht_chan_width;
8639fac3c81SRyder Lee 	u8 op_vht_rx_nss;
8649fac3c81SRyder Lee 	u8 op_vht_rx_nss_type;
8659fac3c81SRyder Lee 
8669fac3c81SRyder Lee 	struct ra_phy phy;
8679fac3c81SRyder Lee 
8689fac3c81SRyder Lee 	u8 spe_en;
8699fac3c81SRyder Lee 	u8 short_preamble;
8709fac3c81SRyder Lee 	u8 is_5g;
8719fac3c81SRyder Lee 	u8 mmps_mode;
8729fac3c81SRyder Lee } __packed;
8739fac3c81SRyder Lee 
8749fac3c81SRyder Lee #define RATE_PARAM_FIXED		3
8759fac3c81SRyder Lee #define RATE_PARAM_AUTO			20
8769fac3c81SRyder Lee #define RATE_CFG_MCS			GENMASK(3, 0)
8779fac3c81SRyder Lee #define RATE_CFG_NSS			GENMASK(7, 4)
8789fac3c81SRyder Lee #define RATE_CFG_GI			GENMASK(11, 8)
8799fac3c81SRyder Lee #define RATE_CFG_BW			GENMASK(15, 12)
8809fac3c81SRyder Lee #define RATE_CFG_STBC			GENMASK(19, 16)
8819fac3c81SRyder Lee #define RATE_CFG_LDPC			GENMASK(23, 20)
8829fac3c81SRyder Lee #define RATE_CFG_PHY_TYPE		GENMASK(27, 24)
8839fac3c81SRyder Lee 
88489029a85SRyder Lee struct sta_rec_bf {
88589029a85SRyder Lee 	__le16 tag;
88689029a85SRyder Lee 	__le16 len;
88789029a85SRyder Lee 
88889029a85SRyder Lee 	__le16 pfmu;		/* 0xffff: no access right for PFMU */
88989029a85SRyder Lee 	bool su_mu;		/* 0: SU, 1: MU */
89089029a85SRyder Lee 	u8 bf_cap;		/* 0: iBF, 1: eBF */
89189029a85SRyder Lee 	u8 sounding_phy;	/* 0: legacy, 1: OFDM, 2: HT, 4: VHT */
89289029a85SRyder Lee 	u8 ndpa_rate;
89389029a85SRyder Lee 	u8 ndp_rate;
89489029a85SRyder Lee 	u8 rept_poll_rate;
89589029a85SRyder Lee 	u8 tx_mode;		/* 0: legacy, 1: OFDM, 2: HT, 4: VHT ... */
89689029a85SRyder Lee 	u8 nc;
89789029a85SRyder Lee 	u8 nr;
89889029a85SRyder Lee 	u8 bw;			/* 0: 20M, 1: 40M, 2: 80M, 3: 160M */
89989029a85SRyder Lee 
90089029a85SRyder Lee 	u8 mem_total;
90189029a85SRyder Lee 	u8 mem_20m;
90289029a85SRyder Lee 	struct {
90389029a85SRyder Lee 		u8 row;
90489029a85SRyder Lee 		u8 col: 6, row_msb: 2;
90589029a85SRyder Lee 	} mem[4];
90689029a85SRyder Lee 
90789029a85SRyder Lee 	__le16 smart_ant;
90889029a85SRyder Lee 	u8 se_idx;
90989029a85SRyder Lee 	u8 auto_sounding;	/* b7: low traffic indicator
91089029a85SRyder Lee 				 * b6: Stop sounding for this entry
91189029a85SRyder Lee 				 * b5 ~ b0: postpone sounding
91289029a85SRyder Lee 				 */
91389029a85SRyder Lee 	u8 ibf_timeout;
91489029a85SRyder Lee 	u8 ibf_dbw;
91589029a85SRyder Lee 	u8 ibf_ncol;
91689029a85SRyder Lee 	u8 ibf_nrow;
91789029a85SRyder Lee 	u8 nr_bw160;
91889029a85SRyder Lee 	u8 nc_bw160;
91989029a85SRyder Lee 	u8 ru_start_idx;
92089029a85SRyder Lee 	u8 ru_end_idx;
92189029a85SRyder Lee 
92289029a85SRyder Lee 	bool trigger_su;
92389029a85SRyder Lee 	bool trigger_mu;
92489029a85SRyder Lee 	bool ng16_su;
92589029a85SRyder Lee 	bool ng16_mu;
92689029a85SRyder Lee 	bool codebook42_su;
92789029a85SRyder Lee 	bool codebook75_mu;
92889029a85SRyder Lee 
92989029a85SRyder Lee 	u8 he_ltf;
93089029a85SRyder Lee 	u8 rsv[2];
93189029a85SRyder Lee } __packed;
93289029a85SRyder Lee 
9332af34fa3SRyder Lee struct sta_rec_bfee {
9342af34fa3SRyder Lee 	__le16 tag;
9352af34fa3SRyder Lee 	__le16 len;
9362af34fa3SRyder Lee 	bool fb_identity_matrix;	/* 1: feedback identity matrix */
9372af34fa3SRyder Lee 	bool ignore_feedback;		/* 1: ignore */
9382af34fa3SRyder Lee 	u8 rsv[2];
9392af34fa3SRyder Lee } __packed;
9402af34fa3SRyder Lee 
941e57b7901SRyder Lee enum {
942e57b7901SRyder Lee 	STA_REC_BASIC,
943e57b7901SRyder Lee 	STA_REC_RA,
944e57b7901SRyder Lee 	STA_REC_RA_CMM_INFO,
945e57b7901SRyder Lee 	STA_REC_RA_UPDATE,
946e57b7901SRyder Lee 	STA_REC_BF,
947e57b7901SRyder Lee 	STA_REC_AMSDU,
948e57b7901SRyder Lee 	STA_REC_BA,
949e57b7901SRyder Lee 	STA_REC_RED,		/* not used */
950e57b7901SRyder Lee 	STA_REC_TX_PROC,	/* for hdr trans and CSO in CR4 */
951e57b7901SRyder Lee 	STA_REC_HT,
952e57b7901SRyder Lee 	STA_REC_VHT,
953e57b7901SRyder Lee 	STA_REC_APPS,
954e57b7901SRyder Lee 	STA_REC_KEY,
955e57b7901SRyder Lee 	STA_REC_WTBL,
956e57b7901SRyder Lee 	STA_REC_HE,
957e57b7901SRyder Lee 	STA_REC_HW_AMSDU,
958e57b7901SRyder Lee 	STA_REC_WTBL_AADOM,
959e57b7901SRyder Lee 	STA_REC_KEY_V2,
960e57b7901SRyder Lee 	STA_REC_MURU,
961e57b7901SRyder Lee 	STA_REC_MUEDCA,
9622af34fa3SRyder Lee 	STA_REC_BFEE,
963e57b7901SRyder Lee 	STA_REC_MAX_NUM
964e57b7901SRyder Lee };
965e57b7901SRyder Lee 
966e57b7901SRyder Lee enum mt7915_cipher_type {
967e57b7901SRyder Lee 	MT_CIPHER_NONE,
968e57b7901SRyder Lee 	MT_CIPHER_WEP40,
969e57b7901SRyder Lee 	MT_CIPHER_WEP104,
970e57b7901SRyder Lee 	MT_CIPHER_WEP128,
971e57b7901SRyder Lee 	MT_CIPHER_TKIP,
972e57b7901SRyder Lee 	MT_CIPHER_AES_CCMP,
973e57b7901SRyder Lee 	MT_CIPHER_CCMP_256,
974e57b7901SRyder Lee 	MT_CIPHER_GCMP,
975e57b7901SRyder Lee 	MT_CIPHER_GCMP_256,
976e57b7901SRyder Lee 	MT_CIPHER_WAPI,
977e57b7901SRyder Lee 	MT_CIPHER_BIP_CMAC_128,
978e57b7901SRyder Lee };
979e57b7901SRyder Lee 
980e57b7901SRyder Lee enum {
981e57b7901SRyder Lee 	CH_SWITCH_NORMAL = 0,
982e57b7901SRyder Lee 	CH_SWITCH_SCAN = 3,
983e57b7901SRyder Lee 	CH_SWITCH_MCC = 4,
984e57b7901SRyder Lee 	CH_SWITCH_DFS = 5,
985e57b7901SRyder Lee 	CH_SWITCH_BACKGROUND_SCAN_START = 6,
986e57b7901SRyder Lee 	CH_SWITCH_BACKGROUND_SCAN_RUNNING = 7,
987e57b7901SRyder Lee 	CH_SWITCH_BACKGROUND_SCAN_STOP = 8,
988e57b7901SRyder Lee 	CH_SWITCH_SCAN_BYPASS_DPD = 9
989e57b7901SRyder Lee };
990e57b7901SRyder Lee 
991e57b7901SRyder Lee enum {
992e57b7901SRyder Lee 	THERMAL_SENSOR_TEMP_QUERY,
993e57b7901SRyder Lee 	THERMAL_SENSOR_MANUAL_CTRL,
994e57b7901SRyder Lee 	THERMAL_SENSOR_INFO_QUERY,
995e57b7901SRyder Lee 	THERMAL_SENSOR_TASK_CTRL,
996e57b7901SRyder Lee };
997e57b7901SRyder Lee 
99889029a85SRyder Lee enum {
99989029a85SRyder Lee 	MT_EBF = BIT(0),	/* explicit beamforming */
100089029a85SRyder Lee 	MT_IBF = BIT(1)		/* implicit beamforming */
100189029a85SRyder Lee };
100289029a85SRyder Lee 
1003e57b7901SRyder Lee #define MT7915_WTBL_UPDATE_MAX_SIZE	(sizeof(struct wtbl_req_hdr) +	\
1004e57b7901SRyder Lee 					 sizeof(struct wtbl_generic) +	\
1005e57b7901SRyder Lee 					 sizeof(struct wtbl_rx) +	\
1006e57b7901SRyder Lee 					 sizeof(struct wtbl_ht) +	\
1007e57b7901SRyder Lee 					 sizeof(struct wtbl_vht) +	\
100855f7c9b0SFelix Fietkau 					 sizeof(struct wtbl_hdr_trans) +\
1009e57b7901SRyder Lee 					 sizeof(struct wtbl_ba) +	\
101089029a85SRyder Lee 					 sizeof(struct wtbl_smps))
1011e57b7901SRyder Lee 
1012e57b7901SRyder Lee #define MT7915_STA_UPDATE_MAX_SIZE	(sizeof(struct sta_req_hdr) +	\
1013e57b7901SRyder Lee 					 sizeof(struct sta_rec_basic) +	\
1014e57b7901SRyder Lee 					 sizeof(struct sta_rec_ht) +	\
1015c336318fSRyder Lee 					 sizeof(struct sta_rec_he) +	\
1016e57b7901SRyder Lee 					 sizeof(struct sta_rec_ba) +	\
1017e57b7901SRyder Lee 					 sizeof(struct sta_rec_vht) +	\
10184bf04d33SRyder Lee 					 sizeof(struct sta_rec_uapsd) + \
1019b443e55fSRyder Lee 					 sizeof(struct sta_rec_amsdu) +	\
1020e57b7901SRyder Lee 					 sizeof(struct tlv) +		\
1021e57b7901SRyder Lee 					 MT7915_WTBL_UPDATE_MAX_SIZE)
1022e57b7901SRyder Lee 
1023e57b7901SRyder Lee #define MT7915_WTBL_UPDATE_BA_SIZE	(sizeof(struct wtbl_req_hdr) +	\
1024e57b7901SRyder Lee 					 sizeof(struct wtbl_ba))
1025e57b7901SRyder Lee 
10263e68af62SRyder Lee #define MT7915_BSS_UPDATE_MAX_SIZE	(sizeof(struct sta_req_hdr) +	\
10273e68af62SRyder Lee 					 sizeof(struct bss_info_omac) +	\
10283e68af62SRyder Lee 					 sizeof(struct bss_info_basic) +\
10293e68af62SRyder Lee 					 sizeof(struct bss_info_rf_ch) +\
10303e68af62SRyder Lee 					 sizeof(struct bss_info_ra) +	\
1031b443e55fSRyder Lee 					 sizeof(struct bss_info_hw_amsdu) +\
10323e68af62SRyder Lee 					 sizeof(struct bss_info_he) +	\
10333e68af62SRyder Lee 					 sizeof(struct bss_info_bmc_rate) +\
10343e68af62SRyder Lee 					 sizeof(struct bss_info_ext_bss) +\
10353e68af62SRyder Lee 					 sizeof(struct bss_info_sync_mode))
10363e68af62SRyder Lee 
1037e57b7901SRyder Lee #define MT7915_BEACON_UPDATE_SIZE	(sizeof(struct sta_req_hdr) +	\
1038e57b7901SRyder Lee 					 sizeof(struct bss_info_bcn_csa) + \
1039e57b7901SRyder Lee 					 sizeof(struct bss_info_bcn_bcc) + \
1040e57b7901SRyder Lee 					 sizeof(struct bss_info_bcn_mbss) + \
1041e57b7901SRyder Lee 					 sizeof(struct bss_info_bcn_cont))
1042e57b7901SRyder Lee 
1043e57b7901SRyder Lee #define PHY_MODE_A			BIT(0)
1044e57b7901SRyder Lee #define PHY_MODE_B			BIT(1)
1045e57b7901SRyder Lee #define PHY_MODE_G			BIT(2)
1046e57b7901SRyder Lee #define PHY_MODE_GN			BIT(3)
1047e57b7901SRyder Lee #define PHY_MODE_AN			BIT(4)
1048e57b7901SRyder Lee #define PHY_MODE_AC			BIT(5)
104937f4ca90SRyder Lee #define PHY_MODE_AX_24G			BIT(6)
105037f4ca90SRyder Lee #define PHY_MODE_AX_5G			BIT(7)
105137f4ca90SRyder Lee #define PHY_MODE_AX_6G			BIT(8)
1052e57b7901SRyder Lee 
1053e57b7901SRyder Lee #define MODE_CCK			BIT(0)
1054e57b7901SRyder Lee #define MODE_OFDM			BIT(1)
1055e57b7901SRyder Lee #define MODE_HT				BIT(2)
1056e57b7901SRyder Lee #define MODE_VHT			BIT(3)
1057c336318fSRyder Lee #define MODE_HE				BIT(4)
1058e57b7901SRyder Lee 
1059e57b7901SRyder Lee #define STA_CAP_WMM			BIT(0)
1060e57b7901SRyder Lee #define STA_CAP_SGI_20			BIT(4)
1061e57b7901SRyder Lee #define STA_CAP_SGI_40			BIT(5)
1062e57b7901SRyder Lee #define STA_CAP_TX_STBC			BIT(6)
1063e57b7901SRyder Lee #define STA_CAP_RX_STBC			BIT(7)
1064e57b7901SRyder Lee #define STA_CAP_VHT_SGI_80		BIT(16)
1065e57b7901SRyder Lee #define STA_CAP_VHT_SGI_160		BIT(17)
1066e57b7901SRyder Lee #define STA_CAP_VHT_TX_STBC		BIT(18)
1067e57b7901SRyder Lee #define STA_CAP_VHT_RX_STBC		BIT(19)
1068e57b7901SRyder Lee #define STA_CAP_VHT_LDPC		BIT(23)
1069e57b7901SRyder Lee #define STA_CAP_LDPC			BIT(24)
1070e57b7901SRyder Lee #define STA_CAP_HT			BIT(26)
1071e57b7901SRyder Lee #define STA_CAP_VHT			BIT(27)
1072c336318fSRyder Lee #define STA_CAP_HE			BIT(28)
1073c336318fSRyder Lee 
1074c336318fSRyder Lee /* HE MAC */
1075c336318fSRyder Lee #define STA_REC_HE_CAP_HTC			BIT(0)
1076c336318fSRyder Lee #define STA_REC_HE_CAP_BQR			BIT(1)
1077c336318fSRyder Lee #define STA_REC_HE_CAP_BSR			BIT(2)
1078c336318fSRyder Lee #define STA_REC_HE_CAP_OM			BIT(3)
1079c336318fSRyder Lee #define STA_REC_HE_CAP_AMSDU_IN_AMPDU		BIT(4)
1080c336318fSRyder Lee /* HE PHY */
1081c336318fSRyder Lee #define STA_REC_HE_CAP_DUAL_BAND		BIT(5)
1082c336318fSRyder Lee #define STA_REC_HE_CAP_LDPC			BIT(6)
1083c336318fSRyder Lee #define STA_REC_HE_CAP_TRIG_CQI_FK		BIT(7)
1084c336318fSRyder Lee #define STA_REC_HE_CAP_PARTIAL_BW_EXT_RANGE	BIT(8)
1085c336318fSRyder Lee /* STBC */
1086c336318fSRyder Lee #define STA_REC_HE_CAP_LE_EQ_80M_TX_STBC	BIT(9)
1087c336318fSRyder Lee #define STA_REC_HE_CAP_LE_EQ_80M_RX_STBC	BIT(10)
1088c336318fSRyder Lee #define STA_REC_HE_CAP_GT_80M_TX_STBC		BIT(11)
1089c336318fSRyder Lee #define STA_REC_HE_CAP_GT_80M_RX_STBC		BIT(12)
1090c336318fSRyder Lee /* GI */
1091c336318fSRyder Lee #define STA_REC_HE_CAP_SU_PPDU_1LTF_8US_GI	BIT(13)
1092c336318fSRyder Lee #define STA_REC_HE_CAP_SU_MU_PPDU_4LTF_8US_GI	BIT(14)
1093c336318fSRyder Lee #define STA_REC_HE_CAP_ER_SU_PPDU_1LTF_8US_GI	BIT(15)
1094c336318fSRyder Lee #define STA_REC_HE_CAP_ER_SU_PPDU_4LTF_8US_GI	BIT(16)
1095c336318fSRyder Lee #define STA_REC_HE_CAP_NDP_4LTF_3DOT2MS_GI	BIT(17)
1096c336318fSRyder Lee /* 242 TONE */
1097c336318fSRyder Lee #define STA_REC_HE_CAP_BW20_RU242_SUPPORT	BIT(18)
1098c336318fSRyder Lee #define STA_REC_HE_CAP_TX_1024QAM_UNDER_RU242	BIT(19)
1099c336318fSRyder Lee #define STA_REC_HE_CAP_RX_1024QAM_UNDER_RU242	BIT(20)
1100e57b7901SRyder Lee 
1101e57b7901SRyder Lee #endif
1102