xref: /freebsd/sys/contrib/dev/mediatek/mt76/mt7996/mcu.h (revision 8ba4d145d351db26e07695b8e90697398c5dfec2)
1cbb3ec25SBjoern A. Zeeb /* SPDX-License-Identifier: ISC */
2cbb3ec25SBjoern A. Zeeb /*
3cbb3ec25SBjoern A. Zeeb  * Copyright (C) 2022 MediaTek Inc.
4cbb3ec25SBjoern A. Zeeb  */
5cbb3ec25SBjoern A. Zeeb 
6cbb3ec25SBjoern A. Zeeb #ifndef __MT7996_MCU_H
7cbb3ec25SBjoern A. Zeeb #define __MT7996_MCU_H
8cbb3ec25SBjoern A. Zeeb 
9cbb3ec25SBjoern A. Zeeb #include "../mt76_connac_mcu.h"
10cbb3ec25SBjoern A. Zeeb 
11cbb3ec25SBjoern A. Zeeb struct mt7996_mcu_rxd {
12cbb3ec25SBjoern A. Zeeb 	__le32 rxd[8];
13cbb3ec25SBjoern A. Zeeb 
14cbb3ec25SBjoern A. Zeeb 	__le16 len;
15cbb3ec25SBjoern A. Zeeb 	__le16 pkt_type_id;
16cbb3ec25SBjoern A. Zeeb 
17cbb3ec25SBjoern A. Zeeb 	u8 eid;
18cbb3ec25SBjoern A. Zeeb 	u8 seq;
19cbb3ec25SBjoern A. Zeeb 	u8 option;
20cbb3ec25SBjoern A. Zeeb 	u8 __rsv;
21cbb3ec25SBjoern A. Zeeb 
22cbb3ec25SBjoern A. Zeeb 	u8 ext_eid;
23cbb3ec25SBjoern A. Zeeb 	u8 __rsv1[2];
24cbb3ec25SBjoern A. Zeeb 	u8 s2d_index;
25cbb3ec25SBjoern A. Zeeb };
26cbb3ec25SBjoern A. Zeeb 
27cbb3ec25SBjoern A. Zeeb struct mt7996_mcu_uni_event {
28cbb3ec25SBjoern A. Zeeb 	u8 cid;
29cbb3ec25SBjoern A. Zeeb 	u8 __rsv[3];
30cbb3ec25SBjoern A. Zeeb 	__le32 status; /* 0: success, others: fail */
31cbb3ec25SBjoern A. Zeeb } __packed;
32cbb3ec25SBjoern A. Zeeb 
33*8ba4d145SBjoern A. Zeeb struct mt7996_mcu_thermal_ctrl {
34*8ba4d145SBjoern A. Zeeb 	u8 ctrl_id;
35*8ba4d145SBjoern A. Zeeb 	u8 band_idx;
36*8ba4d145SBjoern A. Zeeb 	union {
37*8ba4d145SBjoern A. Zeeb 		struct {
38*8ba4d145SBjoern A. Zeeb 			u8 protect_type; /* 1: duty admit, 2: radio off */
39*8ba4d145SBjoern A. Zeeb 			u8 trigger_type; /* 0: low, 1: high */
40*8ba4d145SBjoern A. Zeeb 		} __packed type;
41*8ba4d145SBjoern A. Zeeb 		struct {
42*8ba4d145SBjoern A. Zeeb 			u8 duty_level;	/* level 0~3 */
43*8ba4d145SBjoern A. Zeeb 			u8 duty_cycle;
44*8ba4d145SBjoern A. Zeeb 		} __packed duty;
45*8ba4d145SBjoern A. Zeeb 	};
46*8ba4d145SBjoern A. Zeeb } __packed;
47*8ba4d145SBjoern A. Zeeb 
48*8ba4d145SBjoern A. Zeeb struct mt7996_mcu_thermal_enable {
49*8ba4d145SBjoern A. Zeeb 	__le32 trigger_temp;
50*8ba4d145SBjoern A. Zeeb 	__le32 restore_temp;
51*8ba4d145SBjoern A. Zeeb 	__le16 sustain_time;
52*8ba4d145SBjoern A. Zeeb 	u8 rsv[2];
53*8ba4d145SBjoern A. Zeeb } __packed;
54*8ba4d145SBjoern A. Zeeb 
55cbb3ec25SBjoern A. Zeeb struct mt7996_mcu_csa_notify {
56cbb3ec25SBjoern A. Zeeb 	struct mt7996_mcu_rxd rxd;
57cbb3ec25SBjoern A. Zeeb 
58cbb3ec25SBjoern A. Zeeb 	u8 omac_idx;
59cbb3ec25SBjoern A. Zeeb 	u8 csa_count;
60cbb3ec25SBjoern A. Zeeb 	u8 band_idx;
61cbb3ec25SBjoern A. Zeeb 	u8 rsv;
62cbb3ec25SBjoern A. Zeeb } __packed;
63cbb3ec25SBjoern A. Zeeb 
64cbb3ec25SBjoern A. Zeeb struct mt7996_mcu_rdd_report {
65cbb3ec25SBjoern A. Zeeb 	struct mt7996_mcu_rxd rxd;
66cbb3ec25SBjoern A. Zeeb 
67cbb3ec25SBjoern A. Zeeb 	u8 __rsv1[4];
68cbb3ec25SBjoern A. Zeeb 
69cbb3ec25SBjoern A. Zeeb 	__le16 tag;
70cbb3ec25SBjoern A. Zeeb 	__le16 len;
71cbb3ec25SBjoern A. Zeeb 
72cbb3ec25SBjoern A. Zeeb 	u8 band_idx;
73cbb3ec25SBjoern A. Zeeb 	u8 long_detected;
74cbb3ec25SBjoern A. Zeeb 	u8 constant_prf_detected;
75cbb3ec25SBjoern A. Zeeb 	u8 staggered_prf_detected;
76cbb3ec25SBjoern A. Zeeb 	u8 radar_type_idx;
77cbb3ec25SBjoern A. Zeeb 	u8 periodic_pulse_num;
78cbb3ec25SBjoern A. Zeeb 	u8 long_pulse_num;
79cbb3ec25SBjoern A. Zeeb 	u8 hw_pulse_num;
80cbb3ec25SBjoern A. Zeeb 
81cbb3ec25SBjoern A. Zeeb 	u8 out_lpn;
82cbb3ec25SBjoern A. Zeeb 	u8 out_spn;
83cbb3ec25SBjoern A. Zeeb 	u8 out_crpn;
84cbb3ec25SBjoern A. Zeeb 	u8 out_crpw;
85cbb3ec25SBjoern A. Zeeb 	u8 out_crbn;
86cbb3ec25SBjoern A. Zeeb 	u8 out_stgpn;
87cbb3ec25SBjoern A. Zeeb 	u8 out_stgpw;
88cbb3ec25SBjoern A. Zeeb 
89cbb3ec25SBjoern A. Zeeb 	u8 __rsv2;
90cbb3ec25SBjoern A. Zeeb 
91cbb3ec25SBjoern A. Zeeb 	__le32 out_pri_const;
92cbb3ec25SBjoern A. Zeeb 	__le32 out_pri_stg[3];
93cbb3ec25SBjoern A. Zeeb 	__le32 out_pri_stg_dmin;
94cbb3ec25SBjoern A. Zeeb 
95cbb3ec25SBjoern A. Zeeb 	struct {
96cbb3ec25SBjoern A. Zeeb 		__le32 start;
97cbb3ec25SBjoern A. Zeeb 		__le16 pulse_width;
98cbb3ec25SBjoern A. Zeeb 		__le16 pulse_power;
99cbb3ec25SBjoern A. Zeeb 		u8 mdrdy_flag;
100cbb3ec25SBjoern A. Zeeb 		u8 rsv[3];
101cbb3ec25SBjoern A. Zeeb 	} long_pulse[32];
102cbb3ec25SBjoern A. Zeeb 
103cbb3ec25SBjoern A. Zeeb 	struct {
104cbb3ec25SBjoern A. Zeeb 		__le32 start;
105cbb3ec25SBjoern A. Zeeb 		__le16 pulse_width;
106cbb3ec25SBjoern A. Zeeb 		__le16 pulse_power;
107cbb3ec25SBjoern A. Zeeb 		u8 mdrdy_flag;
108cbb3ec25SBjoern A. Zeeb 		u8 rsv[3];
109cbb3ec25SBjoern A. Zeeb 	} periodic_pulse[32];
110cbb3ec25SBjoern A. Zeeb 
111cbb3ec25SBjoern A. Zeeb 	struct {
112cbb3ec25SBjoern A. Zeeb 		__le32 start;
113cbb3ec25SBjoern A. Zeeb 		__le16 pulse_width;
114cbb3ec25SBjoern A. Zeeb 		__le16 pulse_power;
115cbb3ec25SBjoern A. Zeeb 		u8 sc_pass;
116cbb3ec25SBjoern A. Zeeb 		u8 sw_reset;
117cbb3ec25SBjoern A. Zeeb 		u8 mdrdy_flag;
118cbb3ec25SBjoern A. Zeeb 		u8 tx_active;
119cbb3ec25SBjoern A. Zeeb 	} hw_pulse[32];
120cbb3ec25SBjoern A. Zeeb } __packed;
121cbb3ec25SBjoern A. Zeeb 
122cbb3ec25SBjoern A. Zeeb struct mt7996_mcu_background_chain_ctrl {
123cbb3ec25SBjoern A. Zeeb 	u8 _rsv[4];
124cbb3ec25SBjoern A. Zeeb 
125cbb3ec25SBjoern A. Zeeb 	__le16 tag;
126cbb3ec25SBjoern A. Zeeb 	__le16 len;
127cbb3ec25SBjoern A. Zeeb 
128cbb3ec25SBjoern A. Zeeb 	u8 chan;		/* primary channel */
129cbb3ec25SBjoern A. Zeeb 	u8 central_chan;	/* central channel */
130cbb3ec25SBjoern A. Zeeb 	u8 bw;
131cbb3ec25SBjoern A. Zeeb 	u8 tx_stream;
132cbb3ec25SBjoern A. Zeeb 	u8 rx_stream;
133cbb3ec25SBjoern A. Zeeb 
134cbb3ec25SBjoern A. Zeeb 	u8 monitor_chan;	/* monitor channel */
135cbb3ec25SBjoern A. Zeeb 	u8 monitor_central_chan;/* monitor central channel */
136cbb3ec25SBjoern A. Zeeb 	u8 monitor_bw;
137cbb3ec25SBjoern A. Zeeb 	u8 monitor_tx_stream;
138cbb3ec25SBjoern A. Zeeb 	u8 monitor_rx_stream;
139cbb3ec25SBjoern A. Zeeb 
140cbb3ec25SBjoern A. Zeeb 	u8 scan_mode;		/* 0: ScanStop
141cbb3ec25SBjoern A. Zeeb 				 * 1: ScanStart
142cbb3ec25SBjoern A. Zeeb 				 * 2: ScanRunning
143cbb3ec25SBjoern A. Zeeb 				 */
144cbb3ec25SBjoern A. Zeeb 	u8 band_idx;		/* DBDC */
145cbb3ec25SBjoern A. Zeeb 	u8 monitor_scan_type;
146cbb3ec25SBjoern A. Zeeb 	u8 band;		/* 0: 2.4GHz, 1: 5GHz */
147cbb3ec25SBjoern A. Zeeb 	u8 rsv[2];
148cbb3ec25SBjoern A. Zeeb } __packed;
149cbb3ec25SBjoern A. Zeeb 
150cbb3ec25SBjoern A. Zeeb struct mt7996_mcu_eeprom {
151cbb3ec25SBjoern A. Zeeb 	u8 _rsv[4];
152cbb3ec25SBjoern A. Zeeb 
153cbb3ec25SBjoern A. Zeeb 	__le16 tag;
154cbb3ec25SBjoern A. Zeeb 	__le16 len;
155cbb3ec25SBjoern A. Zeeb 	u8 buffer_mode;
156cbb3ec25SBjoern A. Zeeb 	u8 format;
157cbb3ec25SBjoern A. Zeeb 	__le16 buf_len;
158cbb3ec25SBjoern A. Zeeb } __packed;
159cbb3ec25SBjoern A. Zeeb 
160cbb3ec25SBjoern A. Zeeb struct mt7996_mcu_phy_rx_info {
161cbb3ec25SBjoern A. Zeeb 	u8 category;
162cbb3ec25SBjoern A. Zeeb 	u8 rate;
163cbb3ec25SBjoern A. Zeeb 	u8 mode;
164cbb3ec25SBjoern A. Zeeb 	u8 nsts;
165cbb3ec25SBjoern A. Zeeb 	u8 gi;
166cbb3ec25SBjoern A. Zeeb 	u8 coding;
167cbb3ec25SBjoern A. Zeeb 	u8 stbc;
168cbb3ec25SBjoern A. Zeeb 	u8 bw;
169cbb3ec25SBjoern A. Zeeb };
170cbb3ec25SBjoern A. Zeeb 
171cbb3ec25SBjoern A. Zeeb struct mt7996_mcu_mib {
172cbb3ec25SBjoern A. Zeeb 	__le16 tag;
173cbb3ec25SBjoern A. Zeeb 	__le16 len;
174cbb3ec25SBjoern A. Zeeb 	__le32 offs;
175cbb3ec25SBjoern A. Zeeb 	__le64 data;
176cbb3ec25SBjoern A. Zeeb } __packed;
177cbb3ec25SBjoern A. Zeeb 
178*8ba4d145SBjoern A. Zeeb struct all_sta_trx_rate {
179*8ba4d145SBjoern A. Zeeb 	__le16 wlan_idx;
180*8ba4d145SBjoern A. Zeeb 	u8 __rsv1[2];
181*8ba4d145SBjoern A. Zeeb 	u8 tx_mode;
182*8ba4d145SBjoern A. Zeeb 	u8 flags;
183*8ba4d145SBjoern A. Zeeb 	u8 tx_stbc;
184*8ba4d145SBjoern A. Zeeb 	u8 tx_gi;
185*8ba4d145SBjoern A. Zeeb 	u8 tx_bw;
186*8ba4d145SBjoern A. Zeeb 	u8 tx_ldpc;
187*8ba4d145SBjoern A. Zeeb 	u8 tx_mcs;
188*8ba4d145SBjoern A. Zeeb 	u8 tx_nss;
189*8ba4d145SBjoern A. Zeeb 	u8 rx_rate;
190*8ba4d145SBjoern A. Zeeb 	u8 rx_mode;
191*8ba4d145SBjoern A. Zeeb 	u8 rx_nsts;
192*8ba4d145SBjoern A. Zeeb 	u8 rx_gi;
193*8ba4d145SBjoern A. Zeeb 	u8 rx_coding;
194*8ba4d145SBjoern A. Zeeb 	u8 rx_stbc;
195*8ba4d145SBjoern A. Zeeb 	u8 rx_bw;
196*8ba4d145SBjoern A. Zeeb 	u8 __rsv2;
197*8ba4d145SBjoern A. Zeeb } __packed;
198*8ba4d145SBjoern A. Zeeb 
199*8ba4d145SBjoern A. Zeeb struct mt7996_mcu_all_sta_info_event {
200*8ba4d145SBjoern A. Zeeb 	u8 rsv[4];
201*8ba4d145SBjoern A. Zeeb 	__le16 tag;
202*8ba4d145SBjoern A. Zeeb 	__le16 len;
203*8ba4d145SBjoern A. Zeeb 	u8 more;
204*8ba4d145SBjoern A. Zeeb 	u8 rsv2;
205*8ba4d145SBjoern A. Zeeb 	__le16 sta_num;
206*8ba4d145SBjoern A. Zeeb 	u8 rsv3[4];
207*8ba4d145SBjoern A. Zeeb 
208*8ba4d145SBjoern A. Zeeb 	union {
209*8ba4d145SBjoern A. Zeeb 		DECLARE_FLEX_ARRAY(struct all_sta_trx_rate, rate);
210*8ba4d145SBjoern A. Zeeb 		DECLARE_FLEX_ARRAY(struct {
211*8ba4d145SBjoern A. Zeeb 			__le16 wlan_idx;
212*8ba4d145SBjoern A. Zeeb 			u8 rsv[2];
213*8ba4d145SBjoern A. Zeeb 			__le32 tx_bytes[IEEE80211_NUM_ACS];
214*8ba4d145SBjoern A. Zeeb 			__le32 rx_bytes[IEEE80211_NUM_ACS];
215*8ba4d145SBjoern A. Zeeb 		} __packed, adm_stat);
216*8ba4d145SBjoern A. Zeeb 
217*8ba4d145SBjoern A. Zeeb 		DECLARE_FLEX_ARRAY(struct {
218*8ba4d145SBjoern A. Zeeb 			__le16 wlan_idx;
219*8ba4d145SBjoern A. Zeeb 			u8 rsv[2];
220*8ba4d145SBjoern A. Zeeb 			__le32 tx_msdu_cnt;
221*8ba4d145SBjoern A. Zeeb 			__le32 rx_msdu_cnt;
222*8ba4d145SBjoern A. Zeeb 		} __packed, msdu_cnt);
223*8ba4d145SBjoern A. Zeeb 	} __packed;
224*8ba4d145SBjoern A. Zeeb } __packed;
225*8ba4d145SBjoern A. Zeeb 
226*8ba4d145SBjoern A. Zeeb struct mt7996_mcu_wed_rro_event {
227*8ba4d145SBjoern A. Zeeb 	struct mt7996_mcu_rxd rxd;
228*8ba4d145SBjoern A. Zeeb 
229*8ba4d145SBjoern A. Zeeb 	u8 __rsv1[4];
230*8ba4d145SBjoern A. Zeeb 
231*8ba4d145SBjoern A. Zeeb 	__le16 tag;
232*8ba4d145SBjoern A. Zeeb 	__le16 len;
233*8ba4d145SBjoern A. Zeeb } __packed;
234*8ba4d145SBjoern A. Zeeb 
235*8ba4d145SBjoern A. Zeeb struct mt7996_mcu_wed_rro_ba_event {
236*8ba4d145SBjoern A. Zeeb 	__le16 tag;
237*8ba4d145SBjoern A. Zeeb 	__le16 len;
238*8ba4d145SBjoern A. Zeeb 
239*8ba4d145SBjoern A. Zeeb 	__le16 wlan_id;
240*8ba4d145SBjoern A. Zeeb 	u8 tid;
241*8ba4d145SBjoern A. Zeeb 	u8 __rsv1;
242*8ba4d145SBjoern A. Zeeb 	__le32 status;
243*8ba4d145SBjoern A. Zeeb 	__le16 id;
244*8ba4d145SBjoern A. Zeeb 	u8 __rsv2[2];
245*8ba4d145SBjoern A. Zeeb } __packed;
246*8ba4d145SBjoern A. Zeeb 
247*8ba4d145SBjoern A. Zeeb struct mt7996_mcu_wed_rro_ba_delete_event {
248*8ba4d145SBjoern A. Zeeb 	__le16 tag;
249*8ba4d145SBjoern A. Zeeb 	__le16 len;
250*8ba4d145SBjoern A. Zeeb 
251*8ba4d145SBjoern A. Zeeb 	__le16 session_id;
252*8ba4d145SBjoern A. Zeeb 	u8 __rsv2[2];
253*8ba4d145SBjoern A. Zeeb } __packed;
254*8ba4d145SBjoern A. Zeeb 
255*8ba4d145SBjoern A. Zeeb enum  {
256*8ba4d145SBjoern A. Zeeb 	UNI_WED_RRO_BA_SESSION_STATUS,
257*8ba4d145SBjoern A. Zeeb 	UNI_WED_RRO_BA_SESSION_TBL,
258*8ba4d145SBjoern A. Zeeb 	UNI_WED_RRO_BA_SESSION_DELETE,
259*8ba4d145SBjoern A. Zeeb };
260*8ba4d145SBjoern A. Zeeb 
261*8ba4d145SBjoern A. Zeeb struct mt7996_mcu_thermal_notify {
262*8ba4d145SBjoern A. Zeeb 	struct mt7996_mcu_rxd rxd;
263*8ba4d145SBjoern A. Zeeb 
264*8ba4d145SBjoern A. Zeeb 	u8 __rsv1[4];
265*8ba4d145SBjoern A. Zeeb 
266*8ba4d145SBjoern A. Zeeb 	__le16 tag;
267*8ba4d145SBjoern A. Zeeb 	__le16 len;
268*8ba4d145SBjoern A. Zeeb 
269*8ba4d145SBjoern A. Zeeb 	u8 event_id;
270*8ba4d145SBjoern A. Zeeb 	u8 band_idx;
271*8ba4d145SBjoern A. Zeeb 	u8 level_idx;
272*8ba4d145SBjoern A. Zeeb 	u8 duty_percent;
273*8ba4d145SBjoern A. Zeeb 	__le32 restore_temp;
274*8ba4d145SBjoern A. Zeeb 	u8 __rsv2[4];
275*8ba4d145SBjoern A. Zeeb } __packed;
276*8ba4d145SBjoern A. Zeeb 
277cbb3ec25SBjoern A. Zeeb enum mt7996_chan_mib_offs {
278cbb3ec25SBjoern A. Zeeb 	UNI_MIB_OBSS_AIRTIME = 26,
279cbb3ec25SBjoern A. Zeeb 	UNI_MIB_NON_WIFI_TIME = 27,
280cbb3ec25SBjoern A. Zeeb 	UNI_MIB_TX_TIME = 28,
281cbb3ec25SBjoern A. Zeeb 	UNI_MIB_RX_TIME = 29
282cbb3ec25SBjoern A. Zeeb };
283cbb3ec25SBjoern A. Zeeb 
284cbb3ec25SBjoern A. Zeeb struct edca {
285cbb3ec25SBjoern A. Zeeb 	__le16 tag;
286cbb3ec25SBjoern A. Zeeb 	__le16 len;
287cbb3ec25SBjoern A. Zeeb 
288cbb3ec25SBjoern A. Zeeb 	u8 queue;
289cbb3ec25SBjoern A. Zeeb 	u8 set;
290cbb3ec25SBjoern A. Zeeb 	u8 cw_min;
291cbb3ec25SBjoern A. Zeeb 	u8 cw_max;
292cbb3ec25SBjoern A. Zeeb 	__le16 txop;
293cbb3ec25SBjoern A. Zeeb 	u8 aifs;
294cbb3ec25SBjoern A. Zeeb 	u8 __rsv;
295cbb3ec25SBjoern A. Zeeb };
296cbb3ec25SBjoern A. Zeeb 
297cbb3ec25SBjoern A. Zeeb #define MCU_PQ_ID(p, q)			(((p) << 15) | ((q) << 10))
298cbb3ec25SBjoern A. Zeeb #define MCU_PKT_ID			0xa0
299cbb3ec25SBjoern A. Zeeb 
300cbb3ec25SBjoern A. Zeeb enum {
301cbb3ec25SBjoern A. Zeeb 	MCU_FW_LOG_WM,
302cbb3ec25SBjoern A. Zeeb 	MCU_FW_LOG_WA,
303cbb3ec25SBjoern A. Zeeb 	MCU_FW_LOG_TO_HOST,
304cbb3ec25SBjoern A. Zeeb 	MCU_FW_LOG_RELAY = 16
305cbb3ec25SBjoern A. Zeeb };
306cbb3ec25SBjoern A. Zeeb 
307cbb3ec25SBjoern A. Zeeb enum {
308cbb3ec25SBjoern A. Zeeb 	MCU_TWT_AGRT_ADD,
309cbb3ec25SBjoern A. Zeeb 	MCU_TWT_AGRT_MODIFY,
310cbb3ec25SBjoern A. Zeeb 	MCU_TWT_AGRT_DELETE,
311cbb3ec25SBjoern A. Zeeb 	MCU_TWT_AGRT_TEARDOWN,
312cbb3ec25SBjoern A. Zeeb 	MCU_TWT_AGRT_GET_TSF,
313cbb3ec25SBjoern A. Zeeb };
314cbb3ec25SBjoern A. Zeeb 
315cbb3ec25SBjoern A. Zeeb enum {
316cbb3ec25SBjoern A. Zeeb 	MCU_WA_PARAM_CMD_QUERY,
317cbb3ec25SBjoern A. Zeeb 	MCU_WA_PARAM_CMD_SET,
318cbb3ec25SBjoern A. Zeeb 	MCU_WA_PARAM_CMD_CAPABILITY,
319cbb3ec25SBjoern A. Zeeb 	MCU_WA_PARAM_CMD_DEBUG,
320cbb3ec25SBjoern A. Zeeb };
321cbb3ec25SBjoern A. Zeeb 
322cbb3ec25SBjoern A. Zeeb enum {
323cbb3ec25SBjoern A. Zeeb 	MCU_WA_PARAM_PDMA_RX = 0x04,
324cbb3ec25SBjoern A. Zeeb 	MCU_WA_PARAM_CPU_UTIL = 0x0b,
325cbb3ec25SBjoern A. Zeeb 	MCU_WA_PARAM_RED = 0x0e,
326cbb3ec25SBjoern A. Zeeb 	MCU_WA_PARAM_HW_PATH_HIF_VER = 0x2f,
327cbb3ec25SBjoern A. Zeeb };
328cbb3ec25SBjoern A. Zeeb 
329cbb3ec25SBjoern A. Zeeb enum mcu_mmps_mode {
330cbb3ec25SBjoern A. Zeeb 	MCU_MMPS_STATIC,
331cbb3ec25SBjoern A. Zeeb 	MCU_MMPS_DYNAMIC,
332cbb3ec25SBjoern A. Zeeb 	MCU_MMPS_RSV,
333cbb3ec25SBjoern A. Zeeb 	MCU_MMPS_DISABLE,
334cbb3ec25SBjoern A. Zeeb };
335cbb3ec25SBjoern A. Zeeb 
336cbb3ec25SBjoern A. Zeeb struct bss_rate_tlv {
337cbb3ec25SBjoern A. Zeeb 	__le16 tag;
338cbb3ec25SBjoern A. Zeeb 	__le16 len;
339cbb3ec25SBjoern A. Zeeb 	u8 __rsv1[4];
340cbb3ec25SBjoern A. Zeeb 	__le16 bc_trans;
341cbb3ec25SBjoern A. Zeeb 	__le16 mc_trans;
342cbb3ec25SBjoern A. Zeeb 	u8 short_preamble;
343cbb3ec25SBjoern A. Zeeb 	u8 bc_fixed_rate;
344cbb3ec25SBjoern A. Zeeb 	u8 mc_fixed_rate;
345*8ba4d145SBjoern A. Zeeb 	u8 __rsv2[9];
346*8ba4d145SBjoern A. Zeeb } __packed;
347*8ba4d145SBjoern A. Zeeb 
348*8ba4d145SBjoern A. Zeeb enum {
349*8ba4d145SBjoern A. Zeeb 	BP_DISABLE,
350*8ba4d145SBjoern A. Zeeb 	BP_SW_MODE,
351*8ba4d145SBjoern A. Zeeb 	BP_HW_MODE,
352*8ba4d145SBjoern A. Zeeb };
353*8ba4d145SBjoern A. Zeeb 
354*8ba4d145SBjoern A. Zeeb struct mt7996_mcu_bcn_prot_tlv {
355*8ba4d145SBjoern A. Zeeb 	__le16 tag;
356*8ba4d145SBjoern A. Zeeb 	__le16 len;
357*8ba4d145SBjoern A. Zeeb 	u8 pn[6];
358*8ba4d145SBjoern A. Zeeb 	u8 enable;
359*8ba4d145SBjoern A. Zeeb 	u8 cipher_id;
360*8ba4d145SBjoern A. Zeeb 	u8 key[WLAN_MAX_KEY_LEN];
361*8ba4d145SBjoern A. Zeeb 	u8 key_id;
362*8ba4d145SBjoern A. Zeeb 	u8 __rsv[3];
363cbb3ec25SBjoern A. Zeeb } __packed;
364cbb3ec25SBjoern A. Zeeb 
365cbb3ec25SBjoern A. Zeeb struct bss_ra_tlv {
366cbb3ec25SBjoern A. Zeeb 	__le16 tag;
367cbb3ec25SBjoern A. Zeeb 	__le16 len;
368cbb3ec25SBjoern A. Zeeb 	u8 short_preamble;
369cbb3ec25SBjoern A. Zeeb 	u8 force_sgi;
370cbb3ec25SBjoern A. Zeeb 	u8 force_gf;
371cbb3ec25SBjoern A. Zeeb 	u8 ht_mode;
372cbb3ec25SBjoern A. Zeeb 	u8 se_off;
373cbb3ec25SBjoern A. Zeeb 	u8 antenna_idx;
374cbb3ec25SBjoern A. Zeeb 	__le16 max_phyrate;
375cbb3ec25SBjoern A. Zeeb 	u8 force_tx_streams;
376cbb3ec25SBjoern A. Zeeb 	u8 __rsv[3];
377cbb3ec25SBjoern A. Zeeb } __packed;
378cbb3ec25SBjoern A. Zeeb 
379cbb3ec25SBjoern A. Zeeb struct bss_rlm_tlv {
380cbb3ec25SBjoern A. Zeeb 	__le16 tag;
381cbb3ec25SBjoern A. Zeeb 	__le16 len;
382cbb3ec25SBjoern A. Zeeb 	u8 control_channel;
383cbb3ec25SBjoern A. Zeeb 	u8 center_chan;
384cbb3ec25SBjoern A. Zeeb 	u8 center_chan2;
385cbb3ec25SBjoern A. Zeeb 	u8 bw;
386cbb3ec25SBjoern A. Zeeb 	u8 tx_streams;
387cbb3ec25SBjoern A. Zeeb 	u8 rx_streams;
388cbb3ec25SBjoern A. Zeeb 	u8 ht_op_info;
389cbb3ec25SBjoern A. Zeeb 	u8 sco;
390cbb3ec25SBjoern A. Zeeb 	u8 band;
391cbb3ec25SBjoern A. Zeeb 	u8 __rsv[3];
392cbb3ec25SBjoern A. Zeeb } __packed;
393cbb3ec25SBjoern A. Zeeb 
394cbb3ec25SBjoern A. Zeeb struct bss_color_tlv {
395cbb3ec25SBjoern A. Zeeb 	__le16 tag;
396cbb3ec25SBjoern A. Zeeb 	__le16 len;
397cbb3ec25SBjoern A. Zeeb 	u8 enable;
398cbb3ec25SBjoern A. Zeeb 	u8 color;
399cbb3ec25SBjoern A. Zeeb 	u8 rsv[2];
400cbb3ec25SBjoern A. Zeeb } __packed;
401cbb3ec25SBjoern A. Zeeb 
402cbb3ec25SBjoern A. Zeeb struct bss_inband_discovery_tlv {
403cbb3ec25SBjoern A. Zeeb 	__le16 tag;
404cbb3ec25SBjoern A. Zeeb 	__le16 len;
405cbb3ec25SBjoern A. Zeeb 	u8 tx_type;
406cbb3ec25SBjoern A. Zeeb 	u8 tx_mode;
407cbb3ec25SBjoern A. Zeeb 	u8 tx_interval;
408cbb3ec25SBjoern A. Zeeb 	u8 enable;
409cbb3ec25SBjoern A. Zeeb 	__le16 wcid;
410cbb3ec25SBjoern A. Zeeb 	__le16 prob_rsp_len;
411cbb3ec25SBjoern A. Zeeb } __packed;
412cbb3ec25SBjoern A. Zeeb 
413cbb3ec25SBjoern A. Zeeb struct bss_bcn_content_tlv {
414cbb3ec25SBjoern A. Zeeb 	__le16 tag;
415cbb3ec25SBjoern A. Zeeb 	__le16 len;
416cbb3ec25SBjoern A. Zeeb 	__le16 tim_ie_pos;
417cbb3ec25SBjoern A. Zeeb 	__le16 csa_ie_pos;
418cbb3ec25SBjoern A. Zeeb 	__le16 bcc_ie_pos;
419cbb3ec25SBjoern A. Zeeb 	u8 enable;
420cbb3ec25SBjoern A. Zeeb 	u8 type;
421cbb3ec25SBjoern A. Zeeb 	__le16 pkt_len;
422cbb3ec25SBjoern A. Zeeb } __packed;
423cbb3ec25SBjoern A. Zeeb 
424cbb3ec25SBjoern A. Zeeb struct bss_bcn_cntdwn_tlv {
425cbb3ec25SBjoern A. Zeeb 	__le16 tag;
426cbb3ec25SBjoern A. Zeeb 	__le16 len;
427cbb3ec25SBjoern A. Zeeb 	u8 cnt;
428cbb3ec25SBjoern A. Zeeb 	u8 rsv[3];
429cbb3ec25SBjoern A. Zeeb } __packed;
430cbb3ec25SBjoern A. Zeeb 
431cbb3ec25SBjoern A. Zeeb struct bss_bcn_mbss_tlv {
432cbb3ec25SBjoern A. Zeeb 	__le16 tag;
433cbb3ec25SBjoern A. Zeeb 	__le16 len;
434cbb3ec25SBjoern A. Zeeb 	__le32 bitmap;
435cbb3ec25SBjoern A. Zeeb #define MAX_BEACON_NUM	32
436cbb3ec25SBjoern A. Zeeb 	__le16 offset[MAX_BEACON_NUM];
437cbb3ec25SBjoern A. Zeeb } __packed __aligned(4);
438cbb3ec25SBjoern A. Zeeb 
439cbb3ec25SBjoern A. Zeeb struct bss_txcmd_tlv {
440cbb3ec25SBjoern A. Zeeb 	__le16 tag;
441cbb3ec25SBjoern A. Zeeb 	__le16 len;
442cbb3ec25SBjoern A. Zeeb 	u8 txcmd_mode;
443cbb3ec25SBjoern A. Zeeb 	u8 __rsv[3];
444cbb3ec25SBjoern A. Zeeb } __packed;
445cbb3ec25SBjoern A. Zeeb 
446cbb3ec25SBjoern A. Zeeb struct bss_sec_tlv {
447cbb3ec25SBjoern A. Zeeb 	__le16 tag;
448cbb3ec25SBjoern A. Zeeb 	__le16 len;
449cbb3ec25SBjoern A. Zeeb 	u8 __rsv1[2];
450cbb3ec25SBjoern A. Zeeb 	u8 cipher;
451cbb3ec25SBjoern A. Zeeb 	u8 __rsv2[1];
452cbb3ec25SBjoern A. Zeeb } __packed;
453cbb3ec25SBjoern A. Zeeb 
454cbb3ec25SBjoern A. Zeeb struct bss_ifs_time_tlv {
455cbb3ec25SBjoern A. Zeeb 	__le16 tag;
456cbb3ec25SBjoern A. Zeeb 	__le16 len;
457cbb3ec25SBjoern A. Zeeb 	u8 slot_valid;
458cbb3ec25SBjoern A. Zeeb 	u8 sifs_valid;
459cbb3ec25SBjoern A. Zeeb 	u8 rifs_valid;
460cbb3ec25SBjoern A. Zeeb 	u8 eifs_valid;
461cbb3ec25SBjoern A. Zeeb 	__le16 slot_time;
462cbb3ec25SBjoern A. Zeeb 	__le16 sifs_time;
463cbb3ec25SBjoern A. Zeeb 	__le16 rifs_time;
464cbb3ec25SBjoern A. Zeeb 	__le16 eifs_time;
465cbb3ec25SBjoern A. Zeeb 	u8 eifs_cck_valid;
466cbb3ec25SBjoern A. Zeeb 	u8 rsv;
467cbb3ec25SBjoern A. Zeeb 	__le16 eifs_cck_time;
468cbb3ec25SBjoern A. Zeeb } __packed;
469cbb3ec25SBjoern A. Zeeb 
470cbb3ec25SBjoern A. Zeeb struct bss_power_save {
471cbb3ec25SBjoern A. Zeeb 	__le16 tag;
472cbb3ec25SBjoern A. Zeeb 	__le16 len;
473cbb3ec25SBjoern A. Zeeb 	u8 profile;
474cbb3ec25SBjoern A. Zeeb 	u8 _rsv[3];
475cbb3ec25SBjoern A. Zeeb } __packed;
476cbb3ec25SBjoern A. Zeeb 
477cbb3ec25SBjoern A. Zeeb struct bss_mld_tlv {
478cbb3ec25SBjoern A. Zeeb 	__le16 tag;
479cbb3ec25SBjoern A. Zeeb 	__le16 len;
480cbb3ec25SBjoern A. Zeeb 	u8 group_mld_id;
481cbb3ec25SBjoern A. Zeeb 	u8 own_mld_id;
482cbb3ec25SBjoern A. Zeeb 	u8 mac_addr[ETH_ALEN];
483cbb3ec25SBjoern A. Zeeb 	u8 remap_idx;
484cbb3ec25SBjoern A. Zeeb 	u8 __rsv[3];
485cbb3ec25SBjoern A. Zeeb } __packed;
486cbb3ec25SBjoern A. Zeeb 
487*8ba4d145SBjoern A. Zeeb struct sta_rec_ht_uni {
488*8ba4d145SBjoern A. Zeeb 	__le16 tag;
489*8ba4d145SBjoern A. Zeeb 	__le16 len;
490*8ba4d145SBjoern A. Zeeb 	__le16 ht_cap;
491*8ba4d145SBjoern A. Zeeb 	__le16 ht_cap_ext;
492*8ba4d145SBjoern A. Zeeb 	u8 ampdu_param;
493*8ba4d145SBjoern A. Zeeb 	u8 _rsv[3];
494*8ba4d145SBjoern A. Zeeb } __packed;
495*8ba4d145SBjoern A. Zeeb 
496cbb3ec25SBjoern A. Zeeb struct sta_rec_ba_uni {
497cbb3ec25SBjoern A. Zeeb 	__le16 tag;
498cbb3ec25SBjoern A. Zeeb 	__le16 len;
499cbb3ec25SBjoern A. Zeeb 	u8 tid;
500cbb3ec25SBjoern A. Zeeb 	u8 ba_type;
501cbb3ec25SBjoern A. Zeeb 	u8 amsdu;
502cbb3ec25SBjoern A. Zeeb 	u8 ba_en;
503cbb3ec25SBjoern A. Zeeb 	__le16 ssn;
504cbb3ec25SBjoern A. Zeeb 	__le16 winsize;
505cbb3ec25SBjoern A. Zeeb 	u8 ba_rdd_rro;
506cbb3ec25SBjoern A. Zeeb 	u8 __rsv[3];
507cbb3ec25SBjoern A. Zeeb } __packed;
508cbb3ec25SBjoern A. Zeeb 
509cbb3ec25SBjoern A. Zeeb struct sta_rec_eht {
510cbb3ec25SBjoern A. Zeeb 	__le16 tag;
511cbb3ec25SBjoern A. Zeeb 	__le16 len;
512cbb3ec25SBjoern A. Zeeb 	u8 tid_bitmap;
513cbb3ec25SBjoern A. Zeeb 	u8 _rsv;
514cbb3ec25SBjoern A. Zeeb 	__le16 mac_cap;
515cbb3ec25SBjoern A. Zeeb 	__le64 phy_cap;
516cbb3ec25SBjoern A. Zeeb 	__le64 phy_cap_ext;
517cbb3ec25SBjoern A. Zeeb 	u8 mcs_map_bw20[4];
518cbb3ec25SBjoern A. Zeeb 	u8 mcs_map_bw80[3];
519cbb3ec25SBjoern A. Zeeb 	u8 mcs_map_bw160[3];
520cbb3ec25SBjoern A. Zeeb 	u8 mcs_map_bw320[3];
521cbb3ec25SBjoern A. Zeeb 	u8 _rsv2[3];
522cbb3ec25SBjoern A. Zeeb } __packed;
523cbb3ec25SBjoern A. Zeeb 
524cbb3ec25SBjoern A. Zeeb struct sec_key_uni {
525cbb3ec25SBjoern A. Zeeb 	__le16 wlan_idx;
526cbb3ec25SBjoern A. Zeeb 	u8 mgmt_prot;
527cbb3ec25SBjoern A. Zeeb 	u8 cipher_id;
528cbb3ec25SBjoern A. Zeeb 	u8 cipher_len;
529cbb3ec25SBjoern A. Zeeb 	u8 key_id;
530cbb3ec25SBjoern A. Zeeb 	u8 key_len;
531cbb3ec25SBjoern A. Zeeb 	u8 need_resp;
532cbb3ec25SBjoern A. Zeeb 	u8 key[32];
533cbb3ec25SBjoern A. Zeeb } __packed;
534cbb3ec25SBjoern A. Zeeb 
535cbb3ec25SBjoern A. Zeeb struct sta_rec_sec_uni {
536cbb3ec25SBjoern A. Zeeb 	__le16 tag;
537cbb3ec25SBjoern A. Zeeb 	__le16 len;
538cbb3ec25SBjoern A. Zeeb 	u8 add;
539cbb3ec25SBjoern A. Zeeb 	u8 n_cipher;
540cbb3ec25SBjoern A. Zeeb 	u8 rsv[2];
541cbb3ec25SBjoern A. Zeeb 
542cbb3ec25SBjoern A. Zeeb 	struct sec_key_uni key[2];
543cbb3ec25SBjoern A. Zeeb } __packed;
544cbb3ec25SBjoern A. Zeeb 
545*8ba4d145SBjoern A. Zeeb struct sta_phy_uni {
546*8ba4d145SBjoern A. Zeeb 	u8 type;
547*8ba4d145SBjoern A. Zeeb 	u8 flag;
548*8ba4d145SBjoern A. Zeeb 	u8 stbc;
549*8ba4d145SBjoern A. Zeeb 	u8 sgi;
550*8ba4d145SBjoern A. Zeeb 	u8 bw;
551*8ba4d145SBjoern A. Zeeb 	u8 ldpc;
552*8ba4d145SBjoern A. Zeeb 	u8 mcs;
553*8ba4d145SBjoern A. Zeeb 	u8 nss;
554*8ba4d145SBjoern A. Zeeb 	u8 he_ltf;
555*8ba4d145SBjoern A. Zeeb 	u8 rsv[3];
556*8ba4d145SBjoern A. Zeeb };
557*8ba4d145SBjoern A. Zeeb 
558*8ba4d145SBjoern A. Zeeb struct sta_rec_ra_uni {
559*8ba4d145SBjoern A. Zeeb 	__le16 tag;
560*8ba4d145SBjoern A. Zeeb 	__le16 len;
561*8ba4d145SBjoern A. Zeeb 
562*8ba4d145SBjoern A. Zeeb 	u8 valid;
563*8ba4d145SBjoern A. Zeeb 	u8 auto_rate;
564*8ba4d145SBjoern A. Zeeb 	u8 phy_mode;
565*8ba4d145SBjoern A. Zeeb 	u8 channel;
566*8ba4d145SBjoern A. Zeeb 	u8 bw;
567*8ba4d145SBjoern A. Zeeb 	u8 disable_cck;
568*8ba4d145SBjoern A. Zeeb 	u8 ht_mcs32;
569*8ba4d145SBjoern A. Zeeb 	u8 ht_gf;
570*8ba4d145SBjoern A. Zeeb 	u8 ht_mcs[4];
571*8ba4d145SBjoern A. Zeeb 	u8 mmps_mode;
572*8ba4d145SBjoern A. Zeeb 	u8 gband_256;
573*8ba4d145SBjoern A. Zeeb 	u8 af;
574*8ba4d145SBjoern A. Zeeb 	u8 auth_wapi_mode;
575*8ba4d145SBjoern A. Zeeb 	u8 rate_len;
576*8ba4d145SBjoern A. Zeeb 
577*8ba4d145SBjoern A. Zeeb 	u8 supp_mode;
578*8ba4d145SBjoern A. Zeeb 	u8 supp_cck_rate;
579*8ba4d145SBjoern A. Zeeb 	u8 supp_ofdm_rate;
580*8ba4d145SBjoern A. Zeeb 	__le32 supp_ht_mcs;
581*8ba4d145SBjoern A. Zeeb 	__le16 supp_vht_mcs[4];
582*8ba4d145SBjoern A. Zeeb 
583*8ba4d145SBjoern A. Zeeb 	u8 op_mode;
584*8ba4d145SBjoern A. Zeeb 	u8 op_vht_chan_width;
585*8ba4d145SBjoern A. Zeeb 	u8 op_vht_rx_nss;
586*8ba4d145SBjoern A. Zeeb 	u8 op_vht_rx_nss_type;
587*8ba4d145SBjoern A. Zeeb 
588*8ba4d145SBjoern A. Zeeb 	__le32 sta_cap;
589*8ba4d145SBjoern A. Zeeb 
590*8ba4d145SBjoern A. Zeeb 	struct sta_phy_uni phy;
591*8ba4d145SBjoern A. Zeeb 	u8 rx_rcpi[4];
592*8ba4d145SBjoern A. Zeeb } __packed;
593*8ba4d145SBjoern A. Zeeb 
594*8ba4d145SBjoern A. Zeeb struct sta_rec_ra_fixed_uni {
595*8ba4d145SBjoern A. Zeeb 	__le16 tag;
596*8ba4d145SBjoern A. Zeeb 	__le16 len;
597*8ba4d145SBjoern A. Zeeb 
598*8ba4d145SBjoern A. Zeeb 	__le32 field;
599*8ba4d145SBjoern A. Zeeb 	u8 op_mode;
600*8ba4d145SBjoern A. Zeeb 	u8 op_vht_chan_width;
601*8ba4d145SBjoern A. Zeeb 	u8 op_vht_rx_nss;
602*8ba4d145SBjoern A. Zeeb 	u8 op_vht_rx_nss_type;
603*8ba4d145SBjoern A. Zeeb 
604*8ba4d145SBjoern A. Zeeb 	struct sta_phy_uni phy;
605*8ba4d145SBjoern A. Zeeb 
606*8ba4d145SBjoern A. Zeeb 	u8 spe_idx;
607*8ba4d145SBjoern A. Zeeb 	u8 short_preamble;
608*8ba4d145SBjoern A. Zeeb 	u8 is_5g;
609*8ba4d145SBjoern A. Zeeb 	u8 mmps_mode;
610*8ba4d145SBjoern A. Zeeb } __packed;
611*8ba4d145SBjoern A. Zeeb 
612cbb3ec25SBjoern A. Zeeb struct sta_rec_hdrt {
613cbb3ec25SBjoern A. Zeeb 	__le16 tag;
614cbb3ec25SBjoern A. Zeeb 	__le16 len;
615cbb3ec25SBjoern A. Zeeb 	u8 hdrt_mode;
616cbb3ec25SBjoern A. Zeeb 	u8 rsv[3];
617cbb3ec25SBjoern A. Zeeb } __packed;
618cbb3ec25SBjoern A. Zeeb 
619cbb3ec25SBjoern A. Zeeb struct sta_rec_hdr_trans {
620cbb3ec25SBjoern A. Zeeb 	__le16 tag;
621cbb3ec25SBjoern A. Zeeb 	__le16 len;
622cbb3ec25SBjoern A. Zeeb 	u8 from_ds;
623cbb3ec25SBjoern A. Zeeb 	u8 to_ds;
624cbb3ec25SBjoern A. Zeeb 	u8 dis_rx_hdr_tran;
625cbb3ec25SBjoern A. Zeeb 	u8 mesh;
626cbb3ec25SBjoern A. Zeeb } __packed;
627cbb3ec25SBjoern A. Zeeb 
628cbb3ec25SBjoern A. Zeeb struct hdr_trans_en {
629cbb3ec25SBjoern A. Zeeb 	__le16 tag;
630cbb3ec25SBjoern A. Zeeb 	__le16 len;
631cbb3ec25SBjoern A. Zeeb 	u8 enable;
632cbb3ec25SBjoern A. Zeeb 	u8 check_bssid;
633cbb3ec25SBjoern A. Zeeb 	u8 mode;
634cbb3ec25SBjoern A. Zeeb 	u8 __rsv;
635cbb3ec25SBjoern A. Zeeb } __packed;
636cbb3ec25SBjoern A. Zeeb 
637cbb3ec25SBjoern A. Zeeb struct hdr_trans_vlan {
638cbb3ec25SBjoern A. Zeeb 	__le16 tag;
639cbb3ec25SBjoern A. Zeeb 	__le16 len;
640cbb3ec25SBjoern A. Zeeb 	u8 insert_vlan;
641cbb3ec25SBjoern A. Zeeb 	u8 remove_vlan;
642cbb3ec25SBjoern A. Zeeb 	u8 tid;
643cbb3ec25SBjoern A. Zeeb 	u8 __rsv;
644cbb3ec25SBjoern A. Zeeb } __packed;
645cbb3ec25SBjoern A. Zeeb 
646cbb3ec25SBjoern A. Zeeb struct hdr_trans_blacklist {
647cbb3ec25SBjoern A. Zeeb 	__le16 tag;
648cbb3ec25SBjoern A. Zeeb 	__le16 len;
649cbb3ec25SBjoern A. Zeeb 	u8 idx;
650cbb3ec25SBjoern A. Zeeb 	u8 enable;
651cbb3ec25SBjoern A. Zeeb 	__le16 type;
652cbb3ec25SBjoern A. Zeeb } __packed;
653cbb3ec25SBjoern A. Zeeb 
654cbb3ec25SBjoern A. Zeeb struct uni_header {
655cbb3ec25SBjoern A. Zeeb 	u8 __rsv[4];
656cbb3ec25SBjoern A. Zeeb } __packed;
657cbb3ec25SBjoern A. Zeeb 
658cbb3ec25SBjoern A. Zeeb struct vow_rx_airtime {
659cbb3ec25SBjoern A. Zeeb 	__le16 tag;
660cbb3ec25SBjoern A. Zeeb 	__le16 len;
661cbb3ec25SBjoern A. Zeeb 
662cbb3ec25SBjoern A. Zeeb 	u8 enable;
663cbb3ec25SBjoern A. Zeeb 	u8 band;
664cbb3ec25SBjoern A. Zeeb 	u8 __rsv[2];
665cbb3ec25SBjoern A. Zeeb } __packed;
666cbb3ec25SBjoern A. Zeeb 
667cbb3ec25SBjoern A. Zeeb struct bf_sounding_on {
668cbb3ec25SBjoern A. Zeeb 	__le16 tag;
669cbb3ec25SBjoern A. Zeeb 	__le16 len;
670cbb3ec25SBjoern A. Zeeb 
671cbb3ec25SBjoern A. Zeeb 	u8 snd_mode;
672cbb3ec25SBjoern A. Zeeb 	u8 sta_num;
673cbb3ec25SBjoern A. Zeeb 	u8 __rsv[2];
674cbb3ec25SBjoern A. Zeeb 	__le16 wlan_id[4];
675cbb3ec25SBjoern A. Zeeb 	__le32 snd_period;
676cbb3ec25SBjoern A. Zeeb } __packed;
677cbb3ec25SBjoern A. Zeeb 
678cbb3ec25SBjoern A. Zeeb struct bf_hw_en_status_update {
679cbb3ec25SBjoern A. Zeeb 	__le16 tag;
680cbb3ec25SBjoern A. Zeeb 	__le16 len;
681cbb3ec25SBjoern A. Zeeb 
682cbb3ec25SBjoern A. Zeeb 	bool ebf;
683cbb3ec25SBjoern A. Zeeb 	bool ibf;
684cbb3ec25SBjoern A. Zeeb 	u8 __rsv[2];
685cbb3ec25SBjoern A. Zeeb } __packed;
686cbb3ec25SBjoern A. Zeeb 
687cbb3ec25SBjoern A. Zeeb struct bf_mod_en_ctrl {
688cbb3ec25SBjoern A. Zeeb 	__le16 tag;
689cbb3ec25SBjoern A. Zeeb 	__le16 len;
690cbb3ec25SBjoern A. Zeeb 
691cbb3ec25SBjoern A. Zeeb 	u8 bf_num;
692cbb3ec25SBjoern A. Zeeb 	u8 bf_bitmap;
693cbb3ec25SBjoern A. Zeeb 	u8 bf_sel[8];
694cbb3ec25SBjoern A. Zeeb 	u8 __rsv[2];
695cbb3ec25SBjoern A. Zeeb } __packed;
696cbb3ec25SBjoern A. Zeeb 
697cbb3ec25SBjoern A. Zeeb union bf_tag_tlv {
698cbb3ec25SBjoern A. Zeeb 	struct bf_sounding_on bf_snd;
699cbb3ec25SBjoern A. Zeeb 	struct bf_hw_en_status_update bf_hw_en;
700cbb3ec25SBjoern A. Zeeb 	struct bf_mod_en_ctrl bf_mod_en;
701cbb3ec25SBjoern A. Zeeb };
702cbb3ec25SBjoern A. Zeeb 
703cbb3ec25SBjoern A. Zeeb struct ra_rate {
704cbb3ec25SBjoern A. Zeeb 	__le16 wlan_idx;
705cbb3ec25SBjoern A. Zeeb 	u8 mode;
706cbb3ec25SBjoern A. Zeeb 	u8 stbc;
707cbb3ec25SBjoern A. Zeeb 	__le16 gi;
708cbb3ec25SBjoern A. Zeeb 	u8 bw;
709cbb3ec25SBjoern A. Zeeb 	u8 ldpc;
710cbb3ec25SBjoern A. Zeeb 	u8 mcs;
711cbb3ec25SBjoern A. Zeeb 	u8 nss;
712cbb3ec25SBjoern A. Zeeb 	__le16 ltf;
713cbb3ec25SBjoern A. Zeeb 	u8 spe;
714cbb3ec25SBjoern A. Zeeb 	u8 preamble;
715cbb3ec25SBjoern A. Zeeb 	u8 __rsv[2];
716cbb3ec25SBjoern A. Zeeb } __packed;
717cbb3ec25SBjoern A. Zeeb 
718cbb3ec25SBjoern A. Zeeb struct ra_fixed_rate {
719cbb3ec25SBjoern A. Zeeb 	__le16 tag;
720cbb3ec25SBjoern A. Zeeb 	__le16 len;
721cbb3ec25SBjoern A. Zeeb 
722cbb3ec25SBjoern A. Zeeb 	__le16 version;
723cbb3ec25SBjoern A. Zeeb 	struct ra_rate rate;
724cbb3ec25SBjoern A. Zeeb } __packed;
725cbb3ec25SBjoern A. Zeeb 
726cbb3ec25SBjoern A. Zeeb enum {
727cbb3ec25SBjoern A. Zeeb 	UNI_RA_FIXED_RATE = 0xf,
728cbb3ec25SBjoern A. Zeeb };
729cbb3ec25SBjoern A. Zeeb 
730cbb3ec25SBjoern A. Zeeb #define MT7996_HDR_TRANS_MAX_SIZE	(sizeof(struct hdr_trans_en) +	 \
731cbb3ec25SBjoern A. Zeeb 					 sizeof(struct hdr_trans_vlan) + \
732cbb3ec25SBjoern A. Zeeb 					 sizeof(struct hdr_trans_blacklist))
733cbb3ec25SBjoern A. Zeeb 
734cbb3ec25SBjoern A. Zeeb enum {
735cbb3ec25SBjoern A. Zeeb 	UNI_HDR_TRANS_EN,
736cbb3ec25SBjoern A. Zeeb 	UNI_HDR_TRANS_VLAN,
737cbb3ec25SBjoern A. Zeeb 	UNI_HDR_TRANS_BLACKLIST,
738cbb3ec25SBjoern A. Zeeb };
739cbb3ec25SBjoern A. Zeeb 
740cbb3ec25SBjoern A. Zeeb enum {
741cbb3ec25SBjoern A. Zeeb 	RATE_PARAM_FIXED = 3,
742cbb3ec25SBjoern A. Zeeb 	RATE_PARAM_MMPS_UPDATE = 5,
743cbb3ec25SBjoern A. Zeeb 	RATE_PARAM_FIXED_HE_LTF = 7,
744cbb3ec25SBjoern A. Zeeb 	RATE_PARAM_FIXED_MCS,
745cbb3ec25SBjoern A. Zeeb 	RATE_PARAM_FIXED_GI = 11,
746cbb3ec25SBjoern A. Zeeb 	RATE_PARAM_AUTO = 20,
747cbb3ec25SBjoern A. Zeeb };
748cbb3ec25SBjoern A. Zeeb 
749cbb3ec25SBjoern A. Zeeb enum {
750cbb3ec25SBjoern A. Zeeb 	BF_SOUNDING_ON = 1,
751cbb3ec25SBjoern A. Zeeb 	BF_HW_EN_UPDATE = 17,
752cbb3ec25SBjoern A. Zeeb 	BF_MOD_EN_CTRL = 20,
753cbb3ec25SBjoern A. Zeeb };
754cbb3ec25SBjoern A. Zeeb 
755cbb3ec25SBjoern A. Zeeb enum {
756cbb3ec25SBjoern A. Zeeb 	CMD_BAND_NONE,
757cbb3ec25SBjoern A. Zeeb 	CMD_BAND_24G,
758cbb3ec25SBjoern A. Zeeb 	CMD_BAND_5G,
759cbb3ec25SBjoern A. Zeeb 	CMD_BAND_6G,
760cbb3ec25SBjoern A. Zeeb };
761cbb3ec25SBjoern A. Zeeb 
762cbb3ec25SBjoern A. Zeeb struct bss_req_hdr {
763cbb3ec25SBjoern A. Zeeb 	u8 bss_idx;
764cbb3ec25SBjoern A. Zeeb 	u8 __rsv[3];
765cbb3ec25SBjoern A. Zeeb } __packed;
766cbb3ec25SBjoern A. Zeeb 
767cbb3ec25SBjoern A. Zeeb enum {
768cbb3ec25SBjoern A. Zeeb 	UNI_CHANNEL_SWITCH,
769cbb3ec25SBjoern A. Zeeb 	UNI_CHANNEL_RX_PATH,
770cbb3ec25SBjoern A. Zeeb };
771cbb3ec25SBjoern A. Zeeb 
772cbb3ec25SBjoern A. Zeeb #define MT7996_BSS_UPDATE_MAX_SIZE	(sizeof(struct bss_req_hdr) +		\
773cbb3ec25SBjoern A. Zeeb 					 sizeof(struct mt76_connac_bss_basic_tlv) +	\
774cbb3ec25SBjoern A. Zeeb 					 sizeof(struct bss_rlm_tlv) +		\
775cbb3ec25SBjoern A. Zeeb 					 sizeof(struct bss_ra_tlv) +		\
776cbb3ec25SBjoern A. Zeeb 					 sizeof(struct bss_info_uni_he) +	\
777cbb3ec25SBjoern A. Zeeb 					 sizeof(struct bss_rate_tlv) +		\
778cbb3ec25SBjoern A. Zeeb 					 sizeof(struct bss_txcmd_tlv) +		\
779cbb3ec25SBjoern A. Zeeb 					 sizeof(struct bss_power_save) +	\
780cbb3ec25SBjoern A. Zeeb 					 sizeof(struct bss_sec_tlv) +		\
781cbb3ec25SBjoern A. Zeeb 					 sizeof(struct bss_ifs_time_tlv) +	\
782cbb3ec25SBjoern A. Zeeb 					 sizeof(struct bss_mld_tlv))
783cbb3ec25SBjoern A. Zeeb 
784cbb3ec25SBjoern A. Zeeb #define MT7996_STA_UPDATE_MAX_SIZE	(sizeof(struct sta_req_hdr) +		\
785cbb3ec25SBjoern A. Zeeb 					 sizeof(struct sta_rec_basic) +		\
786cbb3ec25SBjoern A. Zeeb 					 sizeof(struct sta_rec_bf) +		\
787*8ba4d145SBjoern A. Zeeb 					 sizeof(struct sta_rec_ht_uni) +	\
788cbb3ec25SBjoern A. Zeeb 					 sizeof(struct sta_rec_he_v2) +		\
789cbb3ec25SBjoern A. Zeeb 					 sizeof(struct sta_rec_ba_uni) +	\
790cbb3ec25SBjoern A. Zeeb 					 sizeof(struct sta_rec_vht) +		\
791cbb3ec25SBjoern A. Zeeb 					 sizeof(struct sta_rec_uapsd) + 	\
792cbb3ec25SBjoern A. Zeeb 					 sizeof(struct sta_rec_amsdu) +		\
793cbb3ec25SBjoern A. Zeeb 					 sizeof(struct sta_rec_bfee) +		\
794*8ba4d145SBjoern A. Zeeb 					 sizeof(struct sta_rec_ra_uni) +	\
795cbb3ec25SBjoern A. Zeeb 					 sizeof(struct sta_rec_sec) +		\
796*8ba4d145SBjoern A. Zeeb 					 sizeof(struct sta_rec_ra_fixed_uni) +	\
797cbb3ec25SBjoern A. Zeeb 					 sizeof(struct sta_rec_he_6g_capa) +	\
798cbb3ec25SBjoern A. Zeeb 					 sizeof(struct sta_rec_eht) +		\
799cbb3ec25SBjoern A. Zeeb 					 sizeof(struct sta_rec_hdrt) +		\
800cbb3ec25SBjoern A. Zeeb 					 sizeof(struct sta_rec_hdr_trans) +	\
801cbb3ec25SBjoern A. Zeeb 					 sizeof(struct tlv))
802cbb3ec25SBjoern A. Zeeb 
803*8ba4d145SBjoern A. Zeeb #define MT7996_MAX_BEACON_SIZE		1338
804cbb3ec25SBjoern A. Zeeb #define MT7996_BEACON_UPDATE_SIZE	(sizeof(struct bss_req_hdr) +		\
805cbb3ec25SBjoern A. Zeeb 					 sizeof(struct bss_bcn_content_tlv) +	\
806*8ba4d145SBjoern A. Zeeb 					 4 + MT_TXD_SIZE +			\
807cbb3ec25SBjoern A. Zeeb 					 sizeof(struct bss_bcn_cntdwn_tlv) +	\
808cbb3ec25SBjoern A. Zeeb 					 sizeof(struct bss_bcn_mbss_tlv))
809*8ba4d145SBjoern A. Zeeb #define MT7996_MAX_BSS_OFFLOAD_SIZE	(MT7996_MAX_BEACON_SIZE +		\
810*8ba4d145SBjoern A. Zeeb 					 MT7996_BEACON_UPDATE_SIZE)
811cbb3ec25SBjoern A. Zeeb 
812*8ba4d145SBjoern A. Zeeb static inline s8
mt7996_get_power_bound(struct mt7996_phy * phy,s8 txpower)813*8ba4d145SBjoern A. Zeeb mt7996_get_power_bound(struct mt7996_phy *phy, s8 txpower)
814*8ba4d145SBjoern A. Zeeb {
815*8ba4d145SBjoern A. Zeeb 	struct mt76_phy *mphy = phy->mt76;
816*8ba4d145SBjoern A. Zeeb 	int n_chains = hweight16(mphy->chainmask);
817*8ba4d145SBjoern A. Zeeb 
818*8ba4d145SBjoern A. Zeeb 	txpower = mt76_get_sar_power(mphy, mphy->chandef.chan, txpower * 2);
819*8ba4d145SBjoern A. Zeeb 	txpower -= mt76_tx_power_nss_delta(n_chains);
820*8ba4d145SBjoern A. Zeeb 
821*8ba4d145SBjoern A. Zeeb 	return txpower;
822*8ba4d145SBjoern A. Zeeb }
823cbb3ec25SBjoern A. Zeeb 
824cbb3ec25SBjoern A. Zeeb enum {
825cbb3ec25SBjoern A. Zeeb 	UNI_BAND_CONFIG_RADIO_ENABLE,
826cbb3ec25SBjoern A. Zeeb 	UNI_BAND_CONFIG_RTS_THRESHOLD = 0x08,
827cbb3ec25SBjoern A. Zeeb };
828cbb3ec25SBjoern A. Zeeb 
829cbb3ec25SBjoern A. Zeeb enum {
830cbb3ec25SBjoern A. Zeeb 	UNI_WSYS_CONFIG_FW_LOG_CTRL,
831cbb3ec25SBjoern A. Zeeb 	UNI_WSYS_CONFIG_FW_DBG_CTRL,
832cbb3ec25SBjoern A. Zeeb };
833cbb3ec25SBjoern A. Zeeb 
834cbb3ec25SBjoern A. Zeeb enum {
835cbb3ec25SBjoern A. Zeeb 	UNI_RDD_CTRL_PARM,
836cbb3ec25SBjoern A. Zeeb 	UNI_RDD_CTRL_SET_TH = 0x3,
837cbb3ec25SBjoern A. Zeeb };
838cbb3ec25SBjoern A. Zeeb 
839cbb3ec25SBjoern A. Zeeb enum {
840cbb3ec25SBjoern A. Zeeb 	UNI_EFUSE_ACCESS = 1,
841cbb3ec25SBjoern A. Zeeb 	UNI_EFUSE_BUFFER_MODE,
842cbb3ec25SBjoern A. Zeeb 	UNI_EFUSE_FREE_BLOCK,
843cbb3ec25SBjoern A. Zeeb 	UNI_EFUSE_BUFFER_RD,
844cbb3ec25SBjoern A. Zeeb };
845cbb3ec25SBjoern A. Zeeb 
846cbb3ec25SBjoern A. Zeeb enum {
847cbb3ec25SBjoern A. Zeeb 	UNI_VOW_DRR_CTRL,
848cbb3ec25SBjoern A. Zeeb 	UNI_VOW_RX_AT_AIRTIME_EN = 0x0b,
849cbb3ec25SBjoern A. Zeeb 	UNI_VOW_RX_AT_AIRTIME_CLR_EN = 0x0e,
850cbb3ec25SBjoern A. Zeeb };
851cbb3ec25SBjoern A. Zeeb 
852cbb3ec25SBjoern A. Zeeb enum {
853cbb3ec25SBjoern A. Zeeb 	UNI_CMD_MIB_DATA,
854cbb3ec25SBjoern A. Zeeb };
855cbb3ec25SBjoern A. Zeeb 
856cbb3ec25SBjoern A. Zeeb enum {
857cbb3ec25SBjoern A. Zeeb 	UNI_POWER_OFF,
858cbb3ec25SBjoern A. Zeeb };
859cbb3ec25SBjoern A. Zeeb 
860cbb3ec25SBjoern A. Zeeb enum {
861cbb3ec25SBjoern A. Zeeb 	UNI_CMD_TWT_ARGT_UPDATE = 0x0,
862cbb3ec25SBjoern A. Zeeb 	UNI_CMD_TWT_MGMT_OFFLOAD,
863cbb3ec25SBjoern A. Zeeb };
864cbb3ec25SBjoern A. Zeeb 
865cbb3ec25SBjoern A. Zeeb enum {
866cbb3ec25SBjoern A. Zeeb 	UNI_RRO_DEL_ENTRY = 0x1,
867cbb3ec25SBjoern A. Zeeb 	UNI_RRO_SET_PLATFORM_TYPE,
868cbb3ec25SBjoern A. Zeeb 	UNI_RRO_GET_BA_SESSION_TABLE,
869cbb3ec25SBjoern A. Zeeb 	UNI_RRO_SET_BYPASS_MODE,
870cbb3ec25SBjoern A. Zeeb 	UNI_RRO_SET_TXFREE_PATH,
871*8ba4d145SBjoern A. Zeeb 	UNI_RRO_DEL_BA_SESSION,
872*8ba4d145SBjoern A. Zeeb 	UNI_RRO_SET_FLUSH_TIMEOUT
873cbb3ec25SBjoern A. Zeeb };
874cbb3ec25SBjoern A. Zeeb 
875cbb3ec25SBjoern A. Zeeb enum{
876cbb3ec25SBjoern A. Zeeb 	UNI_CMD_SR_ENABLE = 0x1,
877cbb3ec25SBjoern A. Zeeb 	UNI_CMD_SR_ENABLE_SD,
878cbb3ec25SBjoern A. Zeeb 	UNI_CMD_SR_ENABLE_MODE,
879cbb3ec25SBjoern A. Zeeb 	UNI_CMD_SR_ENABLE_DPD = 0x12,
880cbb3ec25SBjoern A. Zeeb 	UNI_CMD_SR_ENABLE_TX,
881cbb3ec25SBjoern A. Zeeb 	UNI_CMD_SR_SET_SRG_BITMAP = 0x80,
882cbb3ec25SBjoern A. Zeeb 	UNI_CMD_SR_SET_PARAM = 0xc1,
883cbb3ec25SBjoern A. Zeeb 	UNI_CMD_SR_SET_SIGA = 0xd0,
884cbb3ec25SBjoern A. Zeeb };
885cbb3ec25SBjoern A. Zeeb 
886cbb3ec25SBjoern A. Zeeb enum {
887*8ba4d145SBjoern A. Zeeb 	UNI_CMD_THERMAL_PROTECT_ENABLE = 0x6,
888*8ba4d145SBjoern A. Zeeb 	UNI_CMD_THERMAL_PROTECT_DISABLE,
889*8ba4d145SBjoern A. Zeeb 	UNI_CMD_THERMAL_PROTECT_DUTY_CONFIG,
890*8ba4d145SBjoern A. Zeeb };
891*8ba4d145SBjoern A. Zeeb 
892*8ba4d145SBjoern A. Zeeb enum {
893*8ba4d145SBjoern A. Zeeb 	UNI_TXPOWER_POWER_LIMIT_TABLE_CTRL = 4,
894*8ba4d145SBjoern A. Zeeb };
895*8ba4d145SBjoern A. Zeeb 
896*8ba4d145SBjoern A. Zeeb enum {
897cbb3ec25SBjoern A. Zeeb 	UNI_CMD_ACCESS_REG_BASIC = 0x0,
898cbb3ec25SBjoern A. Zeeb 	UNI_CMD_ACCESS_RF_REG_BASIC,
899cbb3ec25SBjoern A. Zeeb };
900cbb3ec25SBjoern A. Zeeb 
901cbb3ec25SBjoern A. Zeeb enum {
902cbb3ec25SBjoern A. Zeeb 	UNI_CMD_SER_QUERY,
903cbb3ec25SBjoern A. Zeeb 	/* recovery */
904cbb3ec25SBjoern A. Zeeb 	UNI_CMD_SER_SET_RECOVER_L1,
905cbb3ec25SBjoern A. Zeeb 	UNI_CMD_SER_SET_RECOVER_L2,
906cbb3ec25SBjoern A. Zeeb 	UNI_CMD_SER_SET_RECOVER_L3_RX_ABORT,
907cbb3ec25SBjoern A. Zeeb 	UNI_CMD_SER_SET_RECOVER_L3_TX_ABORT,
908cbb3ec25SBjoern A. Zeeb 	UNI_CMD_SER_SET_RECOVER_L3_TX_DISABLE,
909cbb3ec25SBjoern A. Zeeb 	UNI_CMD_SER_SET_RECOVER_L3_BF,
910cbb3ec25SBjoern A. Zeeb 	UNI_CMD_SER_SET_RECOVER_L4_MDP,
911cbb3ec25SBjoern A. Zeeb 	UNI_CMD_SER_SET_RECOVER_FULL,
912cbb3ec25SBjoern A. Zeeb 	UNI_CMD_SER_SET_SYSTEM_ASSERT,
913cbb3ec25SBjoern A. Zeeb 	/* action */
914cbb3ec25SBjoern A. Zeeb 	UNI_CMD_SER_ENABLE = 1,
915cbb3ec25SBjoern A. Zeeb 	UNI_CMD_SER_SET,
916cbb3ec25SBjoern A. Zeeb 	UNI_CMD_SER_TRIGGER
917cbb3ec25SBjoern A. Zeeb };
918cbb3ec25SBjoern A. Zeeb 
919cbb3ec25SBjoern A. Zeeb enum {
920cbb3ec25SBjoern A. Zeeb 	MT7996_SEC_MODE_PLAIN,
921cbb3ec25SBjoern A. Zeeb 	MT7996_SEC_MODE_AES,
922cbb3ec25SBjoern A. Zeeb 	MT7996_SEC_MODE_SCRAMBLE,
923cbb3ec25SBjoern A. Zeeb 	MT7996_SEC_MODE_MAX,
924cbb3ec25SBjoern A. Zeeb };
925cbb3ec25SBjoern A. Zeeb 
926cbb3ec25SBjoern A. Zeeb #define MT7996_PATCH_SEC		GENMASK(31, 24)
927cbb3ec25SBjoern A. Zeeb #define MT7996_PATCH_SCRAMBLE_KEY	GENMASK(15, 8)
928cbb3ec25SBjoern A. Zeeb #define MT7996_PATCH_AES_KEY		GENMASK(7, 0)
929cbb3ec25SBjoern A. Zeeb 
930cbb3ec25SBjoern A. Zeeb #define MT7996_SEC_ENCRYPT		BIT(0)
931cbb3ec25SBjoern A. Zeeb #define MT7996_SEC_KEY_IDX		GENMASK(2, 1)
932cbb3ec25SBjoern A. Zeeb #define MT7996_SEC_IV			BIT(3)
933cbb3ec25SBjoern A. Zeeb 
934*8ba4d145SBjoern A. Zeeb struct fixed_rate_table_ctrl {
935*8ba4d145SBjoern A. Zeeb 	u8 _rsv[4];
936*8ba4d145SBjoern A. Zeeb 
937*8ba4d145SBjoern A. Zeeb 	__le16 tag;
938*8ba4d145SBjoern A. Zeeb 	__le16 len;
939*8ba4d145SBjoern A. Zeeb 
940*8ba4d145SBjoern A. Zeeb 	u8 table_idx;
941*8ba4d145SBjoern A. Zeeb 	u8 antenna_idx;
942*8ba4d145SBjoern A. Zeeb 	__le16 rate_idx;
943*8ba4d145SBjoern A. Zeeb 	u8 spe_idx_sel;
944*8ba4d145SBjoern A. Zeeb 	u8 spe_idx;
945*8ba4d145SBjoern A. Zeeb 	u8 gi;
946*8ba4d145SBjoern A. Zeeb 	u8 he_ltf;
947*8ba4d145SBjoern A. Zeeb 	bool ldpc;
948*8ba4d145SBjoern A. Zeeb 	bool txbf;
949*8ba4d145SBjoern A. Zeeb 	bool dynamic_bw;
950*8ba4d145SBjoern A. Zeeb 
951*8ba4d145SBjoern A. Zeeb 	u8 _rsv2;
952*8ba4d145SBjoern A. Zeeb } __packed;
953*8ba4d145SBjoern A. Zeeb 
954cbb3ec25SBjoern A. Zeeb #endif
955