xref: /linux/drivers/net/wireless/realtek/rtw89/fw.h (revision 34f2573661e3e644efaf383178af634a2fd67828)
1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2 /* Copyright(c) 2019-2020  Realtek Corporation
3  */
4 
5 #ifndef __RTW89_FW_H__
6 #define __RTW89_FW_H__
7 
8 #include "core.h"
9 
10 enum rtw89_fw_dl_status {
11 	RTW89_FWDL_INITIAL_STATE = 0,
12 	RTW89_FWDL_FWDL_ONGOING = 1,
13 	RTW89_FWDL_CHECKSUM_FAIL = 2,
14 	RTW89_FWDL_SECURITY_FAIL = 3,
15 	RTW89_FWDL_CV_NOT_MATCH = 4,
16 	RTW89_FWDL_RSVD0 = 5,
17 	RTW89_FWDL_WCPU_FWDL_RDY = 6,
18 	RTW89_FWDL_WCPU_FW_INIT_RDY = 7
19 };
20 
21 struct rtw89_c2hreg_hdr {
22 	u32 w0;
23 };
24 
25 #define RTW89_C2HREG_HDR_FUNC_MASK GENMASK(6, 0)
26 #define RTW89_C2HREG_HDR_ACK BIT(7)
27 #define RTW89_C2HREG_HDR_LEN_MASK GENMASK(11, 8)
28 #define RTW89_C2HREG_HDR_SEQ_MASK GENMASK(15, 12)
29 
30 struct rtw89_c2hreg_phycap {
31 	u32 w0;
32 	u32 w1;
33 	u32 w2;
34 	u32 w3;
35 } __packed;
36 
37 #define RTW89_C2HREG_PHYCAP_W0_FUNC GENMASK(6, 0)
38 #define RTW89_C2HREG_PHYCAP_W0_ACK BIT(7)
39 #define RTW89_C2HREG_PHYCAP_W0_LEN GENMASK(11, 8)
40 #define RTW89_C2HREG_PHYCAP_W0_SEQ GENMASK(15, 12)
41 #define RTW89_C2HREG_PHYCAP_W0_RX_NSS GENMASK(23, 16)
42 #define RTW89_C2HREG_PHYCAP_W0_BW GENMASK(31, 24)
43 #define RTW89_C2HREG_PHYCAP_W1_TX_NSS GENMASK(7, 0)
44 #define RTW89_C2HREG_PHYCAP_W1_PROT GENMASK(15, 8)
45 #define RTW89_C2HREG_PHYCAP_W1_NIC GENMASK(23, 16)
46 #define RTW89_C2HREG_PHYCAP_W1_WL_FUNC GENMASK(31, 24)
47 #define RTW89_C2HREG_PHYCAP_W2_HW_TYPE GENMASK(7, 0)
48 #define RTW89_C2HREG_PHYCAP_W3_ANT_TX_NUM GENMASK(15, 8)
49 #define RTW89_C2HREG_PHYCAP_W3_ANT_RX_NUM GENMASK(23, 16)
50 #define RTW89_C2HREG_PHYCAP_W3_BAND_SEL GENMASK(31, 24)
51 
52 #define RTW89_C2HREG_PHYCAP_P1_W0_B1_RX_NSS GENMASK(23, 16)
53 #define RTW89_C2HREG_PHYCAP_P1_W0_B1_BW GENMASK(31, 24)
54 #define RTW89_C2HREG_PHYCAP_P1_W1_B1_TX_NSS GENMASK(7, 0)
55 #define RTW89_C2HREG_PHYCAP_P1_W1_B1_ANT_TX_NUM GENMASK(15, 8)
56 #define RTW89_C2HREG_PHYCAP_P1_W1_B1_ANT_RX_NUM GENMASK(23, 16)
57 #define RTW89_C2HREG_PHYCAP_P1_W1_B1_BAND_SEL GENMASK(31, 24)
58 #define RTW89_C2HREG_PHYCAP_P1_W2_QAM GENMASK(7, 0)
59 #define RTW89_C2HREG_PHYCAP_P1_W2_QAM_256  0x1
60 #define RTW89_C2HREG_PHYCAP_P1_W2_QAM_1024 0x2
61 #define RTW89_C2HREG_PHYCAP_P1_W2_QAM_4096 0x3
62 #define RTW89_C2HREG_PHYCAP_P1_W2_B1_QAM GENMASK(15, 8)
63 
64 #define RTW89_C2HREG_AOAC_RPT_1_W0_KEY_IDX GENMASK(23, 16)
65 #define RTW89_C2HREG_AOAC_RPT_1_W1_IV_0 GENMASK(7, 0)
66 #define RTW89_C2HREG_AOAC_RPT_1_W1_IV_1 GENMASK(15, 8)
67 #define RTW89_C2HREG_AOAC_RPT_1_W1_IV_2 GENMASK(23, 16)
68 #define RTW89_C2HREG_AOAC_RPT_1_W1_IV_3 GENMASK(31, 24)
69 #define RTW89_C2HREG_AOAC_RPT_1_W2_IV_4 GENMASK(7, 0)
70 #define RTW89_C2HREG_AOAC_RPT_1_W2_IV_5 GENMASK(15, 8)
71 #define RTW89_C2HREG_AOAC_RPT_1_W2_IV_6 GENMASK(23, 16)
72 #define RTW89_C2HREG_AOAC_RPT_1_W2_IV_7 GENMASK(31, 24)
73 #define RTW89_C2HREG_AOAC_RPT_1_W3_PTK_IV_0 GENMASK(7, 0)
74 #define RTW89_C2HREG_AOAC_RPT_1_W3_PTK_IV_1 GENMASK(15, 8)
75 #define RTW89_C2HREG_AOAC_RPT_1_W3_PTK_IV_2 GENMASK(23, 16)
76 #define RTW89_C2HREG_AOAC_RPT_1_W3_PTK_IV_3 GENMASK(31, 24)
77 #define RTW89_C2HREG_AOAC_RPT_2_W0_PTK_IV_4 GENMASK(23, 16)
78 #define RTW89_C2HREG_AOAC_RPT_2_W0_PTK_IV_5 GENMASK(31, 24)
79 #define RTW89_C2HREG_AOAC_RPT_2_W1_PTK_IV_6 GENMASK(7, 0)
80 #define RTW89_C2HREG_AOAC_RPT_2_W1_PTK_IV_7 GENMASK(15, 8)
81 #define RTW89_C2HREG_AOAC_RPT_2_W1_IGTK_IPN_IV_0 GENMASK(23, 16)
82 #define RTW89_C2HREG_AOAC_RPT_2_W1_IGTK_IPN_IV_1 GENMASK(31, 24)
83 #define RTW89_C2HREG_AOAC_RPT_2_W2_IGTK_IPN_IV_2 GENMASK(7, 0)
84 #define RTW89_C2HREG_AOAC_RPT_2_W2_IGTK_IPN_IV_3 GENMASK(15, 8)
85 #define RTW89_C2HREG_AOAC_RPT_2_W2_IGTK_IPN_IV_4 GENMASK(23, 16)
86 #define RTW89_C2HREG_AOAC_RPT_2_W2_IGTK_IPN_IV_5 GENMASK(31, 24)
87 #define RTW89_C2HREG_AOAC_RPT_2_W3_IGTK_IPN_IV_6 GENMASK(7, 0)
88 #define RTW89_C2HREG_AOAC_RPT_2_W3_IGTK_IPN_IV_7 GENMASK(15, 8)
89 
90 struct rtw89_h2creg_hdr {
91 	u32 w0;
92 };
93 
94 #define RTW89_H2CREG_HDR_FUNC_MASK GENMASK(6, 0)
95 #define RTW89_H2CREG_HDR_LEN_MASK GENMASK(11, 8)
96 
97 struct rtw89_h2creg_sch_tx_en {
98 	u32 w0;
99 	u32 w1;
100 } __packed;
101 
102 #define RTW89_H2CREG_SCH_TX_EN_W0_EN GENMASK(31, 16)
103 #define RTW89_H2CREG_SCH_TX_EN_W1_MASK GENMASK(15, 0)
104 #define RTW89_H2CREG_SCH_TX_EN_W1_BAND BIT(16)
105 
106 #define RTW89_H2CREG_WOW_CPUIO_RX_CTRL_EN GENMASK(23, 16)
107 
108 #define RTW89_H2CREG_GET_FEATURE_PART_NUM GENMASK(23, 16)
109 
110 #define RTW89_H2CREG_MAX 4
111 #define RTW89_C2HREG_MAX 4
112 #define RTW89_C2HREG_HDR_LEN 2
113 #define RTW89_H2CREG_HDR_LEN 2
114 #define RTW89_C2H_TIMEOUT 1000000
115 struct rtw89_mac_c2h_info {
116 	u8 id;
117 	u8 content_len;
118 	union {
119 		u32 c2hreg[RTW89_C2HREG_MAX];
120 		struct rtw89_c2hreg_hdr hdr;
121 		struct rtw89_c2hreg_phycap phycap;
122 	} u;
123 };
124 
125 struct rtw89_mac_h2c_info {
126 	u8 id;
127 	u8 content_len;
128 	union {
129 		u32 h2creg[RTW89_H2CREG_MAX];
130 		struct rtw89_h2creg_hdr hdr;
131 		struct rtw89_h2creg_sch_tx_en sch_tx_en;
132 	} u;
133 };
134 
135 enum rtw89_mac_h2c_type {
136 	RTW89_FWCMD_H2CREG_FUNC_H2CREG_LB = 0,
137 	RTW89_FWCMD_H2CREG_FUNC_CNSL_CMD,
138 	RTW89_FWCMD_H2CREG_FUNC_FWERR,
139 	RTW89_FWCMD_H2CREG_FUNC_GET_FEATURE,
140 	RTW89_FWCMD_H2CREG_FUNC_GETPKT_INFORM,
141 	RTW89_FWCMD_H2CREG_FUNC_SCH_TX_EN,
142 	RTW89_FWCMD_H2CREG_FUNC_WOW_TRX_STOP,
143 	RTW89_FWCMD_H2CREG_FUNC_AOAC_RPT_1,
144 	RTW89_FWCMD_H2CREG_FUNC_AOAC_RPT_2,
145 	RTW89_FWCMD_H2CREG_FUNC_AOAC_RPT_3_REQ,
146 	RTW89_FWCMD_H2CREG_FUNC_WOW_CPUIO_RX_CTRL,
147 };
148 
149 enum rtw89_mac_c2h_type {
150 	RTW89_FWCMD_C2HREG_FUNC_C2HREG_LB = 0,
151 	RTW89_FWCMD_C2HREG_FUNC_ERR_RPT,
152 	RTW89_FWCMD_C2HREG_FUNC_ERR_MSG,
153 	RTW89_FWCMD_C2HREG_FUNC_PHY_CAP,
154 	RTW89_FWCMD_C2HREG_FUNC_TX_PAUSE_RPT,
155 	RTW89_FWCMD_C2HREG_FUNC_WOW_CPUIO_RX_ACK = 0xA,
156 	RTW89_FWCMD_C2HREG_FUNC_PHY_CAP_PART1 = 0xC,
157 	RTW89_FWCMD_C2HREG_FUNC_NULL = 0xFF,
158 };
159 
160 enum rtw89_fw_c2h_category {
161 	RTW89_C2H_CAT_TEST,
162 	RTW89_C2H_CAT_MAC,
163 	RTW89_C2H_CAT_OUTSRC,
164 };
165 
166 enum rtw89_fw_log_level {
167 	RTW89_FW_LOG_LEVEL_OFF,
168 	RTW89_FW_LOG_LEVEL_CRT,
169 	RTW89_FW_LOG_LEVEL_SER,
170 	RTW89_FW_LOG_LEVEL_WARN,
171 	RTW89_FW_LOG_LEVEL_LOUD,
172 	RTW89_FW_LOG_LEVEL_TR,
173 };
174 
175 enum rtw89_fw_log_path {
176 	RTW89_FW_LOG_LEVEL_UART,
177 	RTW89_FW_LOG_LEVEL_C2H,
178 	RTW89_FW_LOG_LEVEL_SNI,
179 };
180 
181 enum rtw89_fw_log_comp {
182 	RTW89_FW_LOG_COMP_VER,
183 	RTW89_FW_LOG_COMP_INIT,
184 	RTW89_FW_LOG_COMP_TASK,
185 	RTW89_FW_LOG_COMP_CNS,
186 	RTW89_FW_LOG_COMP_H2C,
187 	RTW89_FW_LOG_COMP_C2H,
188 	RTW89_FW_LOG_COMP_TX,
189 	RTW89_FW_LOG_COMP_RX,
190 	RTW89_FW_LOG_COMP_IPSEC,
191 	RTW89_FW_LOG_COMP_TIMER,
192 	RTW89_FW_LOG_COMP_DBGPKT,
193 	RTW89_FW_LOG_COMP_PS,
194 	RTW89_FW_LOG_COMP_ERROR,
195 	RTW89_FW_LOG_COMP_WOWLAN,
196 	RTW89_FW_LOG_COMP_SECURE_BOOT,
197 	RTW89_FW_LOG_COMP_BTC,
198 	RTW89_FW_LOG_COMP_BB,
199 	RTW89_FW_LOG_COMP_TWT,
200 	RTW89_FW_LOG_COMP_RF,
201 	RTW89_FW_LOG_COMP_MCC = 20,
202 	RTW89_FW_LOG_COMP_MLO = 26,
203 	RTW89_FW_LOG_COMP_SCAN = 28,
204 };
205 
206 enum rtw89_pkt_offload_op {
207 	RTW89_PKT_OFLD_OP_ADD,
208 	RTW89_PKT_OFLD_OP_DEL,
209 	RTW89_PKT_OFLD_OP_READ,
210 
211 	NUM_OF_RTW89_PKT_OFFLOAD_OP,
212 };
213 
214 #define RTW89_PKT_OFLD_WAIT_TAG(pkt_id, pkt_op) \
215 	((pkt_id) * NUM_OF_RTW89_PKT_OFFLOAD_OP + (pkt_op))
216 
217 enum rtw89_scanofld_notify_reason {
218 	RTW89_SCAN_DWELL_NOTIFY,
219 	RTW89_SCAN_PRE_TX_NOTIFY,
220 	RTW89_SCAN_POST_TX_NOTIFY,
221 	RTW89_SCAN_ENTER_CH_NOTIFY,
222 	RTW89_SCAN_LEAVE_CH_NOTIFY,
223 	RTW89_SCAN_END_SCAN_NOTIFY,
224 	RTW89_SCAN_REPORT_NOTIFY,
225 	RTW89_SCAN_CHKPT_NOTIFY,
226 	RTW89_SCAN_ENTER_OP_NOTIFY,
227 	RTW89_SCAN_LEAVE_OP_NOTIFY,
228 };
229 
230 enum rtw89_scanofld_status {
231 	RTW89_SCAN_STATUS_NOTIFY,
232 	RTW89_SCAN_STATUS_SUCCESS,
233 	RTW89_SCAN_STATUS_FAIL,
234 };
235 
236 enum rtw89_chan_type {
237 	RTW89_CHAN_OPERATE = 0,
238 	RTW89_CHAN_ACTIVE,
239 	RTW89_CHAN_DFS,
240 	RTW89_CHAN_EXTRA_OP,
241 };
242 
243 enum rtw89_p2pps_action {
244 	RTW89_P2P_ACT_INIT = 0,
245 	RTW89_P2P_ACT_UPDATE = 1,
246 	RTW89_P2P_ACT_REMOVE = 2,
247 	RTW89_P2P_ACT_TERMINATE = 3,
248 };
249 
250 #define RTW89_DEFAULT_CQM_HYST 4
251 #define RTW89_DEFAULT_CQM_THOLD -70
252 
253 enum rtw89_bcn_fltr_offload_mode {
254 	RTW89_BCN_FLTR_OFFLOAD_MODE_0 = 0,
255 	RTW89_BCN_FLTR_OFFLOAD_MODE_1,
256 	RTW89_BCN_FLTR_OFFLOAD_MODE_2,
257 	RTW89_BCN_FLTR_OFFLOAD_MODE_3,
258 
259 	RTW89_BCN_FLTR_OFFLOAD_MODE_DEFAULT = RTW89_BCN_FLTR_OFFLOAD_MODE_0,
260 };
261 
262 enum rtw89_bcn_fltr_type {
263 	RTW89_BCN_FLTR_BEACON_LOSS,
264 	RTW89_BCN_FLTR_RSSI,
265 	RTW89_BCN_FLTR_NOTIFY,
266 };
267 
268 enum rtw89_bcn_fltr_rssi_event {
269 	RTW89_BCN_FLTR_RSSI_NOT_CHANGED,
270 	RTW89_BCN_FLTR_RSSI_HIGH,
271 	RTW89_BCN_FLTR_RSSI_LOW,
272 };
273 
274 #define FWDL_SECTION_MAX_NUM 10
275 #define FWDL_SECTION_CHKSUM_LEN	8
276 #define FWDL_SECTION_PER_PKT_LEN 2020
277 
278 struct rtw89_fw_hdr_section_info {
279 	u8 redl;
280 	const u8 *addr;
281 	u32 len;
282 	u32 len_override;
283 	u32 dladdr;
284 	u32 mssc;
285 	u8 type;
286 	bool ignore;
287 	const u8 *key_addr;
288 	u32 key_len;
289 	u32 key_idx;
290 };
291 
292 struct rtw89_fw_bin_info {
293 	u8 section_num;
294 	u32 hdr_len;
295 	bool dynamic_hdr_en;
296 	u32 dynamic_hdr_len;
297 	u8 idmem_share_mode;
298 	bool dsp_checksum;
299 	bool secure_section_exist;
300 	struct rtw89_fw_hdr_section_info section_info[FWDL_SECTION_MAX_NUM];
301 };
302 
303 struct rtw89_fw_macid_pause_grp {
304 	__le32 pause_grp[4];
305 	__le32 mask_grp[4];
306 } __packed;
307 
308 struct rtw89_fw_macid_pause_sleep_grp {
309 	struct {
310 		__le32 pause_grp[4];
311 		__le32 pause_mask_grp[4];
312 		__le32 sleep_grp[4];
313 		__le32 sleep_mask_grp[4];
314 	} __packed n[4];
315 } __packed;
316 
317 #define RTW89_H2C_MAX_SIZE 2048
318 #define RTW89_CHANNEL_TIME 45
319 #define RTW89_CHANNEL_TIME_6G 20
320 #define RTW89_CHANNEL_TIME_EXTRA_OP 30
321 #define RTW89_DFS_CHAN_TIME 105
322 #define RTW89_OFF_CHAN_TIME 100
323 #define RTW89_P2P_CHAN_TIME 105
324 #define RTW89_DWELL_TIME 20
325 #define RTW89_DWELL_TIME_6G 10
326 #define RTW89_SCAN_WIDTH 0
327 #define RTW89_SCANOFLD_MAX_SSID 8
328 #define RTW89_SCANOFLD_MAX_IE_LEN 512
329 #define RTW89_SCANOFLD_PKT_NONE 0xFF
330 #define RTW89_SCANOFLD_DEBUG_MASK 0x1F
331 #define RTW89_CHAN_INVALID 0xFF
332 #define RTW89_MAC_CHINFO_SIZE 28
333 #define RTW89_MAC_CHINFO_SIZE_BE 32
334 #define RTW89_SCAN_LIST_GUARD 4
335 #define RTW89_SCAN_LIST_LIMIT(size) \
336 		((RTW89_H2C_MAX_SIZE / (size)) - RTW89_SCAN_LIST_GUARD)
337 #define RTW89_SCAN_LIST_LIMIT_AX RTW89_SCAN_LIST_LIMIT(RTW89_MAC_CHINFO_SIZE)
338 #define RTW89_SCAN_LIST_LIMIT_BE RTW89_SCAN_LIST_LIMIT(RTW89_MAC_CHINFO_SIZE_BE)
339 
340 #define RTW89_BCN_LOSS_CNT 60
341 
342 struct rtw89_mac_chinfo_ax {
343 	u8 period;
344 	u8 dwell_time;
345 	u8 central_ch;
346 	u8 pri_ch;
347 	u8 bw:3;
348 	u8 notify_action:5;
349 	u8 num_pkt:4;
350 	u8 tx_pkt:1;
351 	u8 pause_data:1;
352 	u8 ch_band:2;
353 	u8 probe_id;
354 	u8 dfs_ch:1;
355 	u8 tx_null:1;
356 	u8 rand_seq_num:1;
357 	u8 cfg_tx_pwr:1;
358 	u8 macid_tx: 1;
359 	u8 rsvd0: 3;
360 	u8 pkt_id[RTW89_SCANOFLD_MAX_SSID];
361 	u16 tx_pwr_idx;
362 	u8 rsvd1;
363 	struct list_head list;
364 	bool is_psc;
365 };
366 
367 struct rtw89_mac_chinfo_be {
368 	u8 period;
369 	u8 dwell_time;
370 	u8 central_ch;
371 	u8 pri_ch;
372 	u8 bw:3;
373 	u8 ch_band:2;
374 	u8 dfs_ch:1;
375 	u8 pause_data:1;
376 	u8 tx_null:1;
377 	u8 rand_seq_num:1;
378 	u8 notify_action:5;
379 	u8 probe_id;
380 	u8 leave_crit;
381 	u8 chkpt_timer;
382 	u8 leave_time;
383 	u8 leave_th;
384 	u16 tx_pkt_ctrl;
385 	u8 pkt_id[RTW89_SCANOFLD_MAX_SSID];
386 	u8 sw_def;
387 	u16 fw_probe0_ssids;
388 	u16 fw_probe0_shortssids;
389 	u16 fw_probe0_bssids;
390 
391 	struct list_head list;
392 	bool is_psc;
393 };
394 
395 struct rtw89_pktofld_info {
396 	struct list_head list;
397 	u8 id;
398 	bool wildcard_6ghz;
399 
400 	/* Below fields are for WiFi 6 chips 6 GHz RNR use only */
401 	u8 ssid[IEEE80211_MAX_SSID_LEN];
402 	u8 ssid_len;
403 	u8 bssid[ETH_ALEN];
404 	u16 channel_6ghz;
405 	bool cancel;
406 };
407 
408 struct rtw89_h2c_ra {
409 	__le32 w0;
410 	__le32 w1;
411 	__le32 w2;
412 	__le32 w3;
413 } __packed;
414 
415 #define RTW89_H2C_RA_W0_IS_DIS BIT(0)
416 #define RTW89_H2C_RA_W0_MODE GENMASK(5, 1)
417 #define RTW89_H2C_RA_W0_BW_CAP GENMASK(7, 6)
418 #define RTW89_H2C_RA_W0_MACID GENMASK(15, 8)
419 #define RTW89_H2C_RA_W0_DCM BIT(16)
420 #define RTW89_H2C_RA_W0_ER BIT(17)
421 #define RTW89_H2C_RA_W0_INIT_RATE_LV GENMASK(19, 18)
422 #define RTW89_H2C_RA_W0_UPD_ALL BIT(20)
423 #define RTW89_H2C_RA_W0_SGI BIT(21)
424 #define RTW89_H2C_RA_W0_LDPC BIT(22)
425 #define RTW89_H2C_RA_W0_STBC BIT(23)
426 #define RTW89_H2C_RA_W0_SS_NUM GENMASK(26, 24)
427 #define RTW89_H2C_RA_W0_GILTF GENMASK(29, 27)
428 #define RTW89_H2C_RA_W0_UPD_BW_NSS_MASK BIT(30)
429 #define RTW89_H2C_RA_W0_UPD_MASK BIT(31)
430 #define RTW89_H2C_RA_W1_RAMASK_LO32 GENMASK(31, 0)
431 #define RTW89_H2C_RA_W2_RAMASK_HI32 GENMASK(30, 0)
432 #define RTW89_H2C_RA_W2_BFEE_CSI_CTL BIT(31)
433 #define RTW89_H2C_RA_W3_BAND_NUM GENMASK(7, 0)
434 #define RTW89_H2C_RA_W3_RA_CSI_RATE_EN BIT(8)
435 #define RTW89_H2C_RA_W3_FIXED_CSI_RATE_EN BIT(9)
436 #define RTW89_H2C_RA_W3_CR_TBL_SEL BIT(10)
437 #define RTW89_H2C_RA_W3_FIX_GILTF_EN BIT(11)
438 #define RTW89_H2C_RA_W3_FIX_GILTF GENMASK(14, 12)
439 #define RTW89_H2C_RA_W3_FIXED_CSI_MCS_SS_IDX GENMASK(23, 16)
440 #define RTW89_H2C_RA_W3_FIXED_CSI_MODE GENMASK(25, 24)
441 #define RTW89_H2C_RA_W3_FIXED_CSI_GI_LTF GENMASK(28, 26)
442 #define RTW89_H2C_RA_W3_FIXED_CSI_BW GENMASK(31, 29)
443 
444 struct rtw89_h2c_ra_v1 {
445 	struct rtw89_h2c_ra v0;
446 	__le32 w4;
447 	__le32 w5;
448 } __packed;
449 
450 #define RTW89_H2C_RA_V1_W4_MODE_EHT GENMASK(6, 0)
451 #define RTW89_H2C_RA_V1_W4_BW_EHT GENMASK(10, 8)
452 #define RTW89_H2C_RA_V1_W4_RAMASK_UHL16 GENMASK(31, 16)
453 #define RTW89_H2C_RA_V1_W5_RAMASK_UHH16 GENMASK(15, 0)
454 
455 static inline void RTW89_SET_FWCMD_SEC_IDX(void *cmd, u32 val)
456 {
457 	le32p_replace_bits((__le32 *)(cmd) + 0x00, val, GENMASK(7, 0));
458 }
459 
460 static inline void RTW89_SET_FWCMD_SEC_OFFSET(void *cmd, u32 val)
461 {
462 	le32p_replace_bits((__le32 *)(cmd) + 0x00, val, GENMASK(15, 8));
463 }
464 
465 static inline void RTW89_SET_FWCMD_SEC_LEN(void *cmd, u32 val)
466 {
467 	le32p_replace_bits((__le32 *)(cmd) + 0x00, val, GENMASK(23, 16));
468 }
469 
470 static inline void RTW89_SET_FWCMD_SEC_TYPE(void *cmd, u32 val)
471 {
472 	le32p_replace_bits((__le32 *)(cmd) + 0x01, val, GENMASK(3, 0));
473 }
474 
475 static inline void RTW89_SET_FWCMD_SEC_EXT_KEY(void *cmd, u32 val)
476 {
477 	le32p_replace_bits((__le32 *)(cmd) + 0x01, val, BIT(4));
478 }
479 
480 static inline void RTW89_SET_FWCMD_SEC_SPP_MODE(void *cmd, u32 val)
481 {
482 	le32p_replace_bits((__le32 *)(cmd) + 0x01, val, BIT(5));
483 }
484 
485 static inline void RTW89_SET_FWCMD_SEC_KEY0(void *cmd, u32 val)
486 {
487 	le32p_replace_bits((__le32 *)(cmd) + 0x02, val, GENMASK(31, 0));
488 }
489 
490 static inline void RTW89_SET_FWCMD_SEC_KEY1(void *cmd, u32 val)
491 {
492 	le32p_replace_bits((__le32 *)(cmd) + 0x03, val, GENMASK(31, 0));
493 }
494 
495 static inline void RTW89_SET_FWCMD_SEC_KEY2(void *cmd, u32 val)
496 {
497 	le32p_replace_bits((__le32 *)(cmd) + 0x04, val, GENMASK(31, 0));
498 }
499 
500 static inline void RTW89_SET_FWCMD_SEC_KEY3(void *cmd, u32 val)
501 {
502 	le32p_replace_bits((__le32 *)(cmd) + 0x05, val, GENMASK(31, 0));
503 }
504 
505 static inline void RTW89_SET_EDCA_SEL(void *cmd, u32 val)
506 {
507 	le32p_replace_bits((__le32 *)(cmd) + 0x00, val, GENMASK(1, 0));
508 }
509 
510 static inline void RTW89_SET_EDCA_BAND(void *cmd, u32 val)
511 {
512 	le32p_replace_bits((__le32 *)(cmd) + 0x00, val, BIT(3));
513 }
514 
515 static inline void RTW89_SET_EDCA_WMM(void *cmd, u32 val)
516 {
517 	le32p_replace_bits((__le32 *)(cmd) + 0x00, val, BIT(4));
518 }
519 
520 static inline void RTW89_SET_EDCA_AC(void *cmd, u32 val)
521 {
522 	le32p_replace_bits((__le32 *)(cmd) + 0x00, val, GENMASK(6, 5));
523 }
524 
525 static inline void RTW89_SET_EDCA_PARAM(void *cmd, u32 val)
526 {
527 	le32p_replace_bits((__le32 *)(cmd) + 0x01, val, GENMASK(31, 0));
528 }
529 #define FW_EDCA_PARAM_TXOPLMT_MSK GENMASK(26, 16)
530 #define FW_EDCA_PARAM_CWMAX_MSK GENMASK(15, 12)
531 #define FW_EDCA_PARAM_CWMIN_MSK GENMASK(11, 8)
532 #define FW_EDCA_PARAM_AIFS_MSK GENMASK(7, 0)
533 
534 #define FWDL_SECURITY_SECTION_TYPE 9
535 #define FWDL_SECURITY_SIGLEN 512
536 #define FWDL_SECURITY_CHKSUM_LEN 8
537 
538 struct rtw89_fw_dynhdr_sec {
539 	__le32 w0;
540 	u8 content[];
541 } __packed;
542 
543 struct rtw89_fw_dynhdr_hdr {
544 	__le32 hdr_len;
545 	__le32 setcion_count;
546 	/* struct rtw89_fw_dynhdr_sec (nested flexible structures) */
547 } __packed;
548 
549 struct rtw89_fw_hdr_section {
550 	__le32 w0;
551 	__le32 w1;
552 	__le32 w2;
553 	__le32 w3;
554 } __packed;
555 
556 #define FWSECTION_HDR_W0_DL_ADDR GENMASK(31, 0)
557 #define FWSECTION_HDR_W1_METADATA GENMASK(31, 24)
558 #define FWSECTION_HDR_W1_SECTIONTYPE GENMASK(27, 24)
559 #define FWSECTION_HDR_W1_SEC_SIZE GENMASK(23, 0)
560 #define FWSECTION_HDR_W1_CHECKSUM BIT(28)
561 #define FWSECTION_HDR_W1_REDL BIT(29)
562 #define FWSECTION_HDR_W2_MSSC GENMASK(31, 0)
563 
564 struct rtw89_fw_hdr {
565 	__le32 w0;
566 	__le32 w1;
567 	__le32 w2;
568 	__le32 w3;
569 	__le32 w4;
570 	__le32 w5;
571 	__le32 w6;
572 	__le32 w7;
573 	struct rtw89_fw_hdr_section sections[];
574 	/* struct rtw89_fw_dynhdr_hdr (optional) */
575 } __packed;
576 
577 #define FW_HDR_W1_MAJOR_VERSION GENMASK(7, 0)
578 #define FW_HDR_W1_MINOR_VERSION GENMASK(15, 8)
579 #define FW_HDR_W1_SUBVERSION GENMASK(23, 16)
580 #define FW_HDR_W1_SUBINDEX GENMASK(31, 24)
581 #define FW_HDR_W2_COMMITID GENMASK(31, 0)
582 #define FW_HDR_W3_LEN GENMASK(23, 16)
583 #define FW_HDR_W3_HDR_VER GENMASK(31, 24)
584 #define FW_HDR_W4_MONTH GENMASK(7, 0)
585 #define FW_HDR_W4_DATE GENMASK(15, 8)
586 #define FW_HDR_W4_HOUR GENMASK(23, 16)
587 #define FW_HDR_W4_MIN GENMASK(31, 24)
588 #define FW_HDR_W5_YEAR GENMASK(31, 0)
589 #define FW_HDR_W6_SEC_NUM GENMASK(15, 8)
590 #define FW_HDR_W7_PART_SIZE GENMASK(15, 0)
591 #define FW_HDR_W7_DYN_HDR BIT(16)
592 #define FW_HDR_W7_IDMEM_SHARE_MODE GENMASK(21, 18)
593 #define FW_HDR_W7_CMD_VERSERION GENMASK(31, 24)
594 
595 struct rtw89_fw_hdr_section_v1 {
596 	__le32 w0;
597 	__le32 w1;
598 	__le32 w2;
599 	__le32 w3;
600 } __packed;
601 
602 #define FWSECTION_HDR_V1_W0_DL_ADDR GENMASK(31, 0)
603 #define FWSECTION_HDR_V1_W1_METADATA GENMASK(31, 24)
604 #define FWSECTION_HDR_V1_W1_SECTIONTYPE GENMASK(27, 24)
605 #define FWSECTION_HDR_V1_W1_SEC_SIZE GENMASK(23, 0)
606 #define FWSECTION_HDR_V1_W1_CHECKSUM BIT(28)
607 #define FWSECTION_HDR_V1_W1_REDL BIT(29)
608 #define FWSECTION_HDR_V1_W2_MSSC GENMASK(7, 0)
609 #define FORMATTED_MSSC 0xFF
610 #define FORMATTED_MSSC_MASK GENMASK(7, 0)
611 #define FWSECTION_HDR_V1_W2_BBMCU_IDX GENMASK(27, 24)
612 
613 struct rtw89_fw_hdr_v1 {
614 	__le32 w0;
615 	__le32 w1;
616 	__le32 w2;
617 	__le32 w3;
618 	__le32 w4;
619 	__le32 w5;
620 	__le32 w6;
621 	__le32 w7;
622 	__le32 w8;
623 	__le32 w9;
624 	__le32 w10;
625 	__le32 w11;
626 	struct rtw89_fw_hdr_section_v1 sections[];
627 } __packed;
628 
629 #define FW_HDR_V1_W1_MAJOR_VERSION GENMASK(7, 0)
630 #define FW_HDR_V1_W1_MINOR_VERSION GENMASK(15, 8)
631 #define FW_HDR_V1_W1_SUBVERSION GENMASK(23, 16)
632 #define FW_HDR_V1_W1_SUBINDEX GENMASK(31, 24)
633 #define FW_HDR_V1_W2_COMMITID GENMASK(31, 0)
634 #define FW_HDR_V1_W3_CMD_VERSERION GENMASK(23, 16)
635 #define FW_HDR_V1_W3_HDR_VER GENMASK(31, 24)
636 #define FW_HDR_V1_W4_MONTH GENMASK(7, 0)
637 #define FW_HDR_V1_W4_DATE GENMASK(15, 8)
638 #define FW_HDR_V1_W4_HOUR GENMASK(23, 16)
639 #define FW_HDR_V1_W4_MIN GENMASK(31, 24)
640 #define FW_HDR_V1_W5_YEAR GENMASK(15, 0)
641 #define FW_HDR_V1_W5_HDR_SIZE GENMASK(31, 16)
642 #define FW_HDR_V1_W6_SEC_NUM GENMASK(15, 8)
643 #define FW_HDR_V1_W6_DSP_CHKSUM BIT(24)
644 #define FW_HDR_V1_W7_PART_SIZE GENMASK(15, 0)
645 #define FW_HDR_V1_W7_DYN_HDR BIT(16)
646 #define FW_HDR_V1_W7_IDMEM_SHARE_MODE GENMASK(21, 18)
647 
648 enum rtw89_fw_mss_pool_rmp_tbl_type {
649 	MSS_POOL_RMP_TBL_BITMASK = 0x0,
650 	MSS_POOL_RMP_TBL_RECORD = 0x1,
651 };
652 
653 #define FWDL_MSS_POOL_DEFKEYSETS_SIZE 8
654 
655 struct rtw89_fw_mss_pool_hdr {
656 	u8 signature[8]; /* equal to mss_signature[] */
657 	__le32 rmp_tbl_offset;
658 	__le32 key_raw_offset;
659 	u8 defen;
660 	u8 rsvd[3];
661 	u8 rmpfmt; /* enum rtw89_fw_mss_pool_rmp_tbl_type */
662 	u8 mssdev_max;
663 	__le16 keypair_num;
664 	__le16 msscust_max;
665 	__le16 msskey_num_max;
666 	__le32 rsvd3;
667 	u8 rmp_tbl[];
668 } __packed;
669 
670 union rtw89_fw_section_mssc_content {
671 	struct {
672 		u8 pad[0x20];
673 		u8 bit_in_chip_list;
674 		u8 ver;
675 	} __packed blacklist;
676 	struct {
677 		u8 pad[58];
678 		__le32 v;
679 	} __packed sb_sel_ver;
680 	struct {
681 		u8 pad[60];
682 		__le16 v;
683 	} __packed key_sign_len;
684 } __packed;
685 
686 struct rtw89_fw_blacklist {
687 	u8 ver;
688 	u8 list[32];
689 };
690 
691 extern const struct rtw89_fw_blacklist rtw89_fw_blacklist_default;
692 
693 static inline void SET_CTRL_INFO_MACID(void *table, u32 val)
694 {
695 	le32p_replace_bits((__le32 *)(table) + 0, val, GENMASK(6, 0));
696 }
697 
698 static inline void SET_CTRL_INFO_OPERATION(void *table, u32 val)
699 {
700 	le32p_replace_bits((__le32 *)(table) + 0, val, BIT(7));
701 }
702 #define SET_CMC_TBL_MASK_DATARATE GENMASK(8, 0)
703 static inline void SET_CMC_TBL_DATARATE(void *table, u32 val)
704 {
705 	le32p_replace_bits((__le32 *)(table) + 1, val, GENMASK(8, 0));
706 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_DATARATE,
707 			   GENMASK(8, 0));
708 }
709 #define SET_CMC_TBL_MASK_FORCE_TXOP BIT(0)
710 static inline void SET_CMC_TBL_FORCE_TXOP(void *table, u32 val)
711 {
712 	le32p_replace_bits((__le32 *)(table) + 1, val, BIT(9));
713 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_FORCE_TXOP,
714 			   BIT(9));
715 }
716 #define SET_CMC_TBL_MASK_DATA_BW GENMASK(1, 0)
717 static inline void SET_CMC_TBL_DATA_BW(void *table, u32 val)
718 {
719 	le32p_replace_bits((__le32 *)(table) + 1, val, GENMASK(11, 10));
720 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_DATA_BW,
721 			   GENMASK(11, 10));
722 }
723 #define SET_CMC_TBL_MASK_DATA_GI_LTF GENMASK(2, 0)
724 static inline void SET_CMC_TBL_DATA_GI_LTF(void *table, u32 val)
725 {
726 	le32p_replace_bits((__le32 *)(table) + 1, val, GENMASK(14, 12));
727 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_DATA_GI_LTF,
728 			   GENMASK(14, 12));
729 }
730 #define SET_CMC_TBL_MASK_DARF_TC_INDEX BIT(0)
731 static inline void SET_CMC_TBL_DARF_TC_INDEX(void *table, u32 val)
732 {
733 	le32p_replace_bits((__le32 *)(table) + 1, val, BIT(15));
734 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_DARF_TC_INDEX,
735 			   BIT(15));
736 }
737 #define SET_CMC_TBL_MASK_ARFR_CTRL GENMASK(3, 0)
738 static inline void SET_CMC_TBL_ARFR_CTRL(void *table, u32 val)
739 {
740 	le32p_replace_bits((__le32 *)(table) + 1, val, GENMASK(19, 16));
741 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_ARFR_CTRL,
742 			   GENMASK(19, 16));
743 }
744 #define SET_CMC_TBL_MASK_ACQ_RPT_EN BIT(0)
745 static inline void SET_CMC_TBL_ACQ_RPT_EN(void *table, u32 val)
746 {
747 	le32p_replace_bits((__le32 *)(table) + 1, val, BIT(20));
748 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_ACQ_RPT_EN,
749 			   BIT(20));
750 }
751 #define SET_CMC_TBL_MASK_MGQ_RPT_EN BIT(0)
752 static inline void SET_CMC_TBL_MGQ_RPT_EN(void *table, u32 val)
753 {
754 	le32p_replace_bits((__le32 *)(table) + 1, val, BIT(21));
755 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_MGQ_RPT_EN,
756 			   BIT(21));
757 }
758 #define SET_CMC_TBL_MASK_ULQ_RPT_EN BIT(0)
759 static inline void SET_CMC_TBL_ULQ_RPT_EN(void *table, u32 val)
760 {
761 	le32p_replace_bits((__le32 *)(table) + 1, val, BIT(22));
762 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_ULQ_RPT_EN,
763 			   BIT(22));
764 }
765 #define SET_CMC_TBL_MASK_TWTQ_RPT_EN BIT(0)
766 static inline void SET_CMC_TBL_TWTQ_RPT_EN(void *table, u32 val)
767 {
768 	le32p_replace_bits((__le32 *)(table) + 1, val, BIT(23));
769 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_TWTQ_RPT_EN,
770 			   BIT(23));
771 }
772 #define SET_CMC_TBL_MASK_DISRTSFB BIT(0)
773 static inline void SET_CMC_TBL_DISRTSFB(void *table, u32 val)
774 {
775 	le32p_replace_bits((__le32 *)(table) + 1, val, BIT(25));
776 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_DISRTSFB,
777 			   BIT(25));
778 }
779 #define SET_CMC_TBL_MASK_DISDATAFB BIT(0)
780 static inline void SET_CMC_TBL_DISDATAFB(void *table, u32 val)
781 {
782 	le32p_replace_bits((__le32 *)(table) + 1, val, BIT(26));
783 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_DISDATAFB,
784 			   BIT(26));
785 }
786 #define SET_CMC_TBL_MASK_TRYRATE BIT(0)
787 static inline void SET_CMC_TBL_TRYRATE(void *table, u32 val)
788 {
789 	le32p_replace_bits((__le32 *)(table) + 1, val, BIT(27));
790 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_TRYRATE,
791 			   BIT(27));
792 }
793 #define SET_CMC_TBL_MASK_AMPDU_DENSITY GENMASK(3, 0)
794 static inline void SET_CMC_TBL_AMPDU_DENSITY(void *table, u32 val)
795 {
796 	le32p_replace_bits((__le32 *)(table) + 1, val, GENMASK(31, 28));
797 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_AMPDU_DENSITY,
798 			   GENMASK(31, 28));
799 }
800 #define SET_CMC_TBL_MASK_DATA_RTY_LOWEST_RATE GENMASK(8, 0)
801 static inline void SET_CMC_TBL_DATA_RTY_LOWEST_RATE(void *table, u32 val)
802 {
803 	le32p_replace_bits((__le32 *)(table) + 2, val, GENMASK(8, 0));
804 	le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_DATA_RTY_LOWEST_RATE,
805 			   GENMASK(8, 0));
806 }
807 #define SET_CMC_TBL_MASK_AMPDU_TIME_SEL BIT(0)
808 static inline void SET_CMC_TBL_AMPDU_TIME_SEL(void *table, u32 val)
809 {
810 	le32p_replace_bits((__le32 *)(table) + 2, val, BIT(9));
811 	le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_AMPDU_TIME_SEL,
812 			   BIT(9));
813 }
814 #define SET_CMC_TBL_MASK_AMPDU_LEN_SEL BIT(0)
815 static inline void SET_CMC_TBL_AMPDU_LEN_SEL(void *table, u32 val)
816 {
817 	le32p_replace_bits((__le32 *)(table) + 2, val, BIT(10));
818 	le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_AMPDU_LEN_SEL,
819 			   BIT(10));
820 }
821 #define SET_CMC_TBL_MASK_RTS_TXCNT_LMT_SEL BIT(0)
822 static inline void SET_CMC_TBL_RTS_TXCNT_LMT_SEL(void *table, u32 val)
823 {
824 	le32p_replace_bits((__le32 *)(table) + 2, val, BIT(11));
825 	le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_RTS_TXCNT_LMT_SEL,
826 			   BIT(11));
827 }
828 #define SET_CMC_TBL_MASK_RTS_TXCNT_LMT GENMASK(3, 0)
829 static inline void SET_CMC_TBL_RTS_TXCNT_LMT(void *table, u32 val)
830 {
831 	le32p_replace_bits((__le32 *)(table) + 2, val, GENMASK(15, 12));
832 	le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_RTS_TXCNT_LMT,
833 			   GENMASK(15, 12));
834 }
835 #define SET_CMC_TBL_MASK_RTSRATE GENMASK(8, 0)
836 static inline void SET_CMC_TBL_RTSRATE(void *table, u32 val)
837 {
838 	le32p_replace_bits((__le32 *)(table) + 2, val, GENMASK(24, 16));
839 	le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_RTSRATE,
840 			   GENMASK(24, 16));
841 }
842 #define SET_CMC_TBL_MASK_VCS_STBC BIT(0)
843 static inline void SET_CMC_TBL_VCS_STBC(void *table, u32 val)
844 {
845 	le32p_replace_bits((__le32 *)(table) + 2, val, BIT(27));
846 	le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_VCS_STBC,
847 			   BIT(27));
848 }
849 #define SET_CMC_TBL_MASK_RTS_RTY_LOWEST_RATE GENMASK(3, 0)
850 static inline void SET_CMC_TBL_RTS_RTY_LOWEST_RATE(void *table, u32 val)
851 {
852 	le32p_replace_bits((__le32 *)(table) + 2, val, GENMASK(31, 28));
853 	le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_RTS_RTY_LOWEST_RATE,
854 			   GENMASK(31, 28));
855 }
856 #define SET_CMC_TBL_MASK_DATA_TX_CNT_LMT GENMASK(5, 0)
857 static inline void SET_CMC_TBL_DATA_TX_CNT_LMT(void *table, u32 val)
858 {
859 	le32p_replace_bits((__le32 *)(table) + 3, val, GENMASK(5, 0));
860 	le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_DATA_TX_CNT_LMT,
861 			   GENMASK(5, 0));
862 }
863 #define SET_CMC_TBL_MASK_DATA_TXCNT_LMT_SEL BIT(0)
864 static inline void SET_CMC_TBL_DATA_TXCNT_LMT_SEL(void *table, u32 val)
865 {
866 	le32p_replace_bits((__le32 *)(table) + 3, val, BIT(6));
867 	le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_DATA_TXCNT_LMT_SEL,
868 			   BIT(6));
869 }
870 #define SET_CMC_TBL_MASK_MAX_AGG_NUM_SEL BIT(0)
871 static inline void SET_CMC_TBL_MAX_AGG_NUM_SEL(void *table, u32 val)
872 {
873 	le32p_replace_bits((__le32 *)(table) + 3, val, BIT(7));
874 	le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_MAX_AGG_NUM_SEL,
875 			   BIT(7));
876 }
877 #define SET_CMC_TBL_MASK_RTS_EN BIT(0)
878 static inline void SET_CMC_TBL_RTS_EN(void *table, u32 val)
879 {
880 	le32p_replace_bits((__le32 *)(table) + 3, val, BIT(8));
881 	le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_RTS_EN,
882 			   BIT(8));
883 }
884 #define SET_CMC_TBL_MASK_CTS2SELF_EN BIT(0)
885 static inline void SET_CMC_TBL_CTS2SELF_EN(void *table, u32 val)
886 {
887 	le32p_replace_bits((__le32 *)(table) + 3, val, BIT(9));
888 	le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_CTS2SELF_EN,
889 			   BIT(9));
890 }
891 #define SET_CMC_TBL_MASK_CCA_RTS GENMASK(1, 0)
892 static inline void SET_CMC_TBL_CCA_RTS(void *table, u32 val)
893 {
894 	le32p_replace_bits((__le32 *)(table) + 3, val, GENMASK(11, 10));
895 	le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_CCA_RTS,
896 			   GENMASK(11, 10));
897 }
898 #define SET_CMC_TBL_MASK_HW_RTS_EN BIT(0)
899 static inline void SET_CMC_TBL_HW_RTS_EN(void *table, u32 val)
900 {
901 	le32p_replace_bits((__le32 *)(table) + 3, val, BIT(12));
902 	le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_HW_RTS_EN,
903 			   BIT(12));
904 }
905 #define SET_CMC_TBL_MASK_RTS_DROP_DATA_MODE GENMASK(1, 0)
906 static inline void SET_CMC_TBL_RTS_DROP_DATA_MODE(void *table, u32 val)
907 {
908 	le32p_replace_bits((__le32 *)(table) + 3, val, GENMASK(14, 13));
909 	le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_RTS_DROP_DATA_MODE,
910 			   GENMASK(14, 13));
911 }
912 #define SET_CMC_TBL_MASK_AMPDU_MAX_LEN GENMASK(10, 0)
913 static inline void SET_CMC_TBL_AMPDU_MAX_LEN(void *table, u32 val)
914 {
915 	le32p_replace_bits((__le32 *)(table) + 3, val, GENMASK(26, 16));
916 	le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_AMPDU_MAX_LEN,
917 			   GENMASK(26, 16));
918 }
919 #define SET_CMC_TBL_MASK_UL_MU_DIS BIT(0)
920 static inline void SET_CMC_TBL_UL_MU_DIS(void *table, u32 val)
921 {
922 	le32p_replace_bits((__le32 *)(table) + 3, val, BIT(27));
923 	le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_UL_MU_DIS,
924 			   BIT(27));
925 }
926 #define SET_CMC_TBL_MASK_AMPDU_MAX_TIME GENMASK(3, 0)
927 static inline void SET_CMC_TBL_AMPDU_MAX_TIME(void *table, u32 val)
928 {
929 	le32p_replace_bits((__le32 *)(table) + 3, val, GENMASK(31, 28));
930 	le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_AMPDU_MAX_TIME,
931 			   GENMASK(31, 28));
932 }
933 #define SET_CMC_TBL_MASK_MAX_AGG_NUM GENMASK(7, 0)
934 static inline void SET_CMC_TBL_MAX_AGG_NUM(void *table, u32 val)
935 {
936 	le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(7, 0));
937 	le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_MAX_AGG_NUM,
938 			   GENMASK(7, 0));
939 }
940 #define SET_CMC_TBL_MASK_BA_BMAP GENMASK(1, 0)
941 static inline void SET_CMC_TBL_BA_BMAP(void *table, u32 val)
942 {
943 	le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(9, 8));
944 	le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_BA_BMAP,
945 			   GENMASK(9, 8));
946 }
947 #define SET_CMC_TBL_MASK_VO_LFTIME_SEL GENMASK(2, 0)
948 static inline void SET_CMC_TBL_VO_LFTIME_SEL(void *table, u32 val)
949 {
950 	le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(18, 16));
951 	le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_VO_LFTIME_SEL,
952 			   GENMASK(18, 16));
953 }
954 #define SET_CMC_TBL_MASK_VI_LFTIME_SEL GENMASK(2, 0)
955 static inline void SET_CMC_TBL_VI_LFTIME_SEL(void *table, u32 val)
956 {
957 	le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(21, 19));
958 	le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_VI_LFTIME_SEL,
959 			   GENMASK(21, 19));
960 }
961 #define SET_CMC_TBL_MASK_BE_LFTIME_SEL GENMASK(2, 0)
962 static inline void SET_CMC_TBL_BE_LFTIME_SEL(void *table, u32 val)
963 {
964 	le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(24, 22));
965 	le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_BE_LFTIME_SEL,
966 			   GENMASK(24, 22));
967 }
968 #define SET_CMC_TBL_MASK_BK_LFTIME_SEL GENMASK(2, 0)
969 static inline void SET_CMC_TBL_BK_LFTIME_SEL(void *table, u32 val)
970 {
971 	le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(27, 25));
972 	le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_BK_LFTIME_SEL,
973 			   GENMASK(27, 25));
974 }
975 #define SET_CMC_TBL_MASK_SECTYPE GENMASK(3, 0)
976 static inline void SET_CMC_TBL_SECTYPE(void *table, u32 val)
977 {
978 	le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(31, 28));
979 	le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_SECTYPE,
980 			   GENMASK(31, 28));
981 }
982 #define SET_CMC_TBL_MASK_MULTI_PORT_ID GENMASK(2, 0)
983 static inline void SET_CMC_TBL_MULTI_PORT_ID(void *table, u32 val)
984 {
985 	le32p_replace_bits((__le32 *)(table) + 5, val, GENMASK(2, 0));
986 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_MULTI_PORT_ID,
987 			   GENMASK(2, 0));
988 }
989 #define SET_CMC_TBL_MASK_BMC BIT(0)
990 static inline void SET_CMC_TBL_BMC(void *table, u32 val)
991 {
992 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(3));
993 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_BMC,
994 			   BIT(3));
995 }
996 #define SET_CMC_TBL_MASK_MBSSID GENMASK(3, 0)
997 static inline void SET_CMC_TBL_MBSSID(void *table, u32 val)
998 {
999 	le32p_replace_bits((__le32 *)(table) + 5, val, GENMASK(7, 4));
1000 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_MBSSID,
1001 			   GENMASK(7, 4));
1002 }
1003 #define SET_CMC_TBL_MASK_NAVUSEHDR BIT(0)
1004 static inline void SET_CMC_TBL_NAVUSEHDR(void *table, u32 val)
1005 {
1006 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(8));
1007 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_NAVUSEHDR,
1008 			   BIT(8));
1009 }
1010 #define SET_CMC_TBL_MASK_TXPWR_MODE GENMASK(2, 0)
1011 static inline void SET_CMC_TBL_TXPWR_MODE(void *table, u32 val)
1012 {
1013 	le32p_replace_bits((__le32 *)(table) + 5, val, GENMASK(11, 9));
1014 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_TXPWR_MODE,
1015 			   GENMASK(11, 9));
1016 }
1017 #define SET_CMC_TBL_MASK_DATA_DCM BIT(0)
1018 static inline void SET_CMC_TBL_DATA_DCM(void *table, u32 val)
1019 {
1020 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(12));
1021 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_DATA_DCM,
1022 			   BIT(12));
1023 }
1024 #define SET_CMC_TBL_MASK_DATA_ER BIT(0)
1025 static inline void SET_CMC_TBL_DATA_ER(void *table, u32 val)
1026 {
1027 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(13));
1028 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_DATA_ER,
1029 			   BIT(13));
1030 }
1031 #define SET_CMC_TBL_MASK_DATA_LDPC BIT(0)
1032 static inline void SET_CMC_TBL_DATA_LDPC(void *table, u32 val)
1033 {
1034 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(14));
1035 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_DATA_LDPC,
1036 			   BIT(14));
1037 }
1038 #define SET_CMC_TBL_MASK_DATA_STBC BIT(0)
1039 static inline void SET_CMC_TBL_DATA_STBC(void *table, u32 val)
1040 {
1041 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(15));
1042 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_DATA_STBC,
1043 			   BIT(15));
1044 }
1045 #define SET_CMC_TBL_MASK_A_CTRL_BQR BIT(0)
1046 static inline void SET_CMC_TBL_A_CTRL_BQR(void *table, u32 val)
1047 {
1048 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(16));
1049 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_A_CTRL_BQR,
1050 			   BIT(16));
1051 }
1052 #define SET_CMC_TBL_MASK_A_CTRL_UPH BIT(0)
1053 static inline void SET_CMC_TBL_A_CTRL_UPH(void *table, u32 val)
1054 {
1055 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(17));
1056 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_A_CTRL_UPH,
1057 			   BIT(17));
1058 }
1059 #define SET_CMC_TBL_MASK_A_CTRL_BSR BIT(0)
1060 static inline void SET_CMC_TBL_A_CTRL_BSR(void *table, u32 val)
1061 {
1062 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(18));
1063 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_A_CTRL_BSR,
1064 			   BIT(18));
1065 }
1066 #define SET_CMC_TBL_MASK_A_CTRL_CAS BIT(0)
1067 static inline void SET_CMC_TBL_A_CTRL_CAS(void *table, u32 val)
1068 {
1069 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(19));
1070 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_A_CTRL_CAS,
1071 			   BIT(19));
1072 }
1073 #define SET_CMC_TBL_MASK_DATA_BW_ER BIT(0)
1074 static inline void SET_CMC_TBL_DATA_BW_ER(void *table, u32 val)
1075 {
1076 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(20));
1077 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_DATA_BW_ER,
1078 			   BIT(20));
1079 }
1080 #define SET_CMC_TBL_MASK_LSIG_TXOP_EN BIT(0)
1081 static inline void SET_CMC_TBL_LSIG_TXOP_EN(void *table, u32 val)
1082 {
1083 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(21));
1084 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_LSIG_TXOP_EN,
1085 			   BIT(21));
1086 }
1087 #define SET_CMC_TBL_MASK_CTRL_CNT_VLD BIT(0)
1088 static inline void SET_CMC_TBL_CTRL_CNT_VLD(void *table, u32 val)
1089 {
1090 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(27));
1091 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_CTRL_CNT_VLD,
1092 			   BIT(27));
1093 }
1094 #define SET_CMC_TBL_MASK_CTRL_CNT GENMASK(3, 0)
1095 static inline void SET_CMC_TBL_CTRL_CNT(void *table, u32 val)
1096 {
1097 	le32p_replace_bits((__le32 *)(table) + 5, val, GENMASK(31, 28));
1098 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_CTRL_CNT,
1099 			   GENMASK(31, 28));
1100 }
1101 #define SET_CMC_TBL_MASK_RESP_REF_RATE GENMASK(8, 0)
1102 static inline void SET_CMC_TBL_RESP_REF_RATE(void *table, u32 val)
1103 {
1104 	le32p_replace_bits((__le32 *)(table) + 6, val, GENMASK(8, 0));
1105 	le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_RESP_REF_RATE,
1106 			   GENMASK(8, 0));
1107 }
1108 #define SET_CMC_TBL_MASK_ALL_ACK_SUPPORT BIT(0)
1109 static inline void SET_CMC_TBL_ALL_ACK_SUPPORT(void *table, u32 val)
1110 {
1111 	le32p_replace_bits((__le32 *)(table) + 6, val, BIT(12));
1112 	le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_ALL_ACK_SUPPORT,
1113 			   BIT(12));
1114 }
1115 #define SET_CMC_TBL_MASK_BSR_QUEUE_SIZE_FORMAT BIT(0)
1116 static inline void SET_CMC_TBL_BSR_QUEUE_SIZE_FORMAT(void *table, u32 val)
1117 {
1118 	le32p_replace_bits((__le32 *)(table) + 6, val, BIT(13));
1119 	le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_BSR_QUEUE_SIZE_FORMAT,
1120 			   BIT(13));
1121 }
1122 #define SET_CMC_TBL_MASK_NTX_PATH_EN GENMASK(3, 0)
1123 static inline void SET_CMC_TBL_NTX_PATH_EN(void *table, u32 val)
1124 {
1125 	le32p_replace_bits((__le32 *)(table) + 6, val, GENMASK(19, 16));
1126 	le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_NTX_PATH_EN,
1127 			   GENMASK(19, 16));
1128 }
1129 #define SET_CMC_TBL_MASK_PATH_MAP_A GENMASK(1, 0)
1130 static inline void SET_CMC_TBL_PATH_MAP_A(void *table, u32 val)
1131 {
1132 	le32p_replace_bits((__le32 *)(table) + 6, val, GENMASK(21, 20));
1133 	le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_PATH_MAP_A,
1134 			   GENMASK(21, 20));
1135 }
1136 #define SET_CMC_TBL_MASK_PATH_MAP_B GENMASK(1, 0)
1137 static inline void SET_CMC_TBL_PATH_MAP_B(void *table, u32 val)
1138 {
1139 	le32p_replace_bits((__le32 *)(table) + 6, val, GENMASK(23, 22));
1140 	le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_PATH_MAP_B,
1141 			   GENMASK(23, 22));
1142 }
1143 #define SET_CMC_TBL_MASK_PATH_MAP_C GENMASK(1, 0)
1144 static inline void SET_CMC_TBL_PATH_MAP_C(void *table, u32 val)
1145 {
1146 	le32p_replace_bits((__le32 *)(table) + 6, val, GENMASK(25, 24));
1147 	le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_PATH_MAP_C,
1148 			   GENMASK(25, 24));
1149 }
1150 #define SET_CMC_TBL_MASK_PATH_MAP_D GENMASK(1, 0)
1151 static inline void SET_CMC_TBL_PATH_MAP_D(void *table, u32 val)
1152 {
1153 	le32p_replace_bits((__le32 *)(table) + 6, val, GENMASK(27, 26));
1154 	le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_PATH_MAP_D,
1155 			   GENMASK(27, 26));
1156 }
1157 #define SET_CMC_TBL_MASK_ANTSEL_A BIT(0)
1158 static inline void SET_CMC_TBL_ANTSEL_A(void *table, u32 val)
1159 {
1160 	le32p_replace_bits((__le32 *)(table) + 6, val, BIT(28));
1161 	le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_ANTSEL_A,
1162 			   BIT(28));
1163 }
1164 #define SET_CMC_TBL_MASK_ANTSEL_B BIT(0)
1165 static inline void SET_CMC_TBL_ANTSEL_B(void *table, u32 val)
1166 {
1167 	le32p_replace_bits((__le32 *)(table) + 6, val, BIT(29));
1168 	le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_ANTSEL_B,
1169 			   BIT(29));
1170 }
1171 #define SET_CMC_TBL_MASK_ANTSEL_C BIT(0)
1172 static inline void SET_CMC_TBL_ANTSEL_C(void *table, u32 val)
1173 {
1174 	le32p_replace_bits((__le32 *)(table) + 6, val, BIT(30));
1175 	le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_ANTSEL_C,
1176 			   BIT(30));
1177 }
1178 #define SET_CMC_TBL_MASK_ANTSEL_D BIT(0)
1179 static inline void SET_CMC_TBL_ANTSEL_D(void *table, u32 val)
1180 {
1181 	le32p_replace_bits((__le32 *)(table) + 6, val, BIT(31));
1182 	le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_ANTSEL_D,
1183 			   BIT(31));
1184 }
1185 
1186 #define SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING GENMASK(1, 0)
1187 static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING_V1(void *table, u32 val)
1188 {
1189 	le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(1, 0));
1190 	le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING,
1191 			   GENMASK(1, 0));
1192 }
1193 
1194 static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING40_V1(void *table, u32 val)
1195 {
1196 	le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(3, 2));
1197 	le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING,
1198 			   GENMASK(3, 2));
1199 }
1200 
1201 static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING80_V1(void *table, u32 val)
1202 {
1203 	le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(5, 4));
1204 	le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING,
1205 			   GENMASK(5, 4));
1206 }
1207 
1208 static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING160_V1(void *table, u32 val)
1209 {
1210 	le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(7, 6));
1211 	le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING,
1212 			   GENMASK(7, 6));
1213 }
1214 
1215 #define SET_CMC_TBL_MASK_ADDR_CAM_INDEX GENMASK(7, 0)
1216 static inline void SET_CMC_TBL_ADDR_CAM_INDEX(void *table, u32 val)
1217 {
1218 	le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(7, 0));
1219 	le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_ADDR_CAM_INDEX,
1220 			   GENMASK(7, 0));
1221 }
1222 #define SET_CMC_TBL_MASK_PAID GENMASK(8, 0)
1223 static inline void SET_CMC_TBL_PAID(void *table, u32 val)
1224 {
1225 	le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(16, 8));
1226 	le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_PAID,
1227 			   GENMASK(16, 8));
1228 }
1229 #define SET_CMC_TBL_MASK_ULDL BIT(0)
1230 static inline void SET_CMC_TBL_ULDL(void *table, u32 val)
1231 {
1232 	le32p_replace_bits((__le32 *)(table) + 7, val, BIT(17));
1233 	le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_ULDL,
1234 			   BIT(17));
1235 }
1236 #define SET_CMC_TBL_MASK_DOPPLER_CTRL GENMASK(1, 0)
1237 static inline void SET_CMC_TBL_DOPPLER_CTRL(void *table, u32 val)
1238 {
1239 	le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(19, 18));
1240 	le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_DOPPLER_CTRL,
1241 			   GENMASK(19, 18));
1242 }
1243 static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING(void *table, u32 val)
1244 {
1245 	le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(21, 20));
1246 	le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING,
1247 			   GENMASK(21, 20));
1248 }
1249 
1250 static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING40(void *table, u32 val)
1251 {
1252 	le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(23, 22));
1253 	le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING,
1254 			   GENMASK(23, 22));
1255 }
1256 #define SET_CMC_TBL_MASK_TXPWR_TOLERENCE GENMASK(3, 0)
1257 static inline void SET_CMC_TBL_TXPWR_TOLERENCE(void *table, u32 val)
1258 {
1259 	le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(27, 24));
1260 	le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_TXPWR_TOLERENCE,
1261 			   GENMASK(27, 24));
1262 }
1263 
1264 static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING80(void *table, u32 val)
1265 {
1266 	le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(31, 30));
1267 	le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING,
1268 			   GENMASK(31, 30));
1269 }
1270 #define SET_CMC_TBL_MASK_NC GENMASK(2, 0)
1271 static inline void SET_CMC_TBL_NC(void *table, u32 val)
1272 {
1273 	le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(2, 0));
1274 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_NC,
1275 			   GENMASK(2, 0));
1276 }
1277 #define SET_CMC_TBL_MASK_NR GENMASK(2, 0)
1278 static inline void SET_CMC_TBL_NR(void *table, u32 val)
1279 {
1280 	le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(5, 3));
1281 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_NR,
1282 			   GENMASK(5, 3));
1283 }
1284 #define SET_CMC_TBL_MASK_NG GENMASK(1, 0)
1285 static inline void SET_CMC_TBL_NG(void *table, u32 val)
1286 {
1287 	le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(7, 6));
1288 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_NG,
1289 			   GENMASK(7, 6));
1290 }
1291 #define SET_CMC_TBL_MASK_CB GENMASK(1, 0)
1292 static inline void SET_CMC_TBL_CB(void *table, u32 val)
1293 {
1294 	le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(9, 8));
1295 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CB,
1296 			   GENMASK(9, 8));
1297 }
1298 #define SET_CMC_TBL_MASK_CS GENMASK(1, 0)
1299 static inline void SET_CMC_TBL_CS(void *table, u32 val)
1300 {
1301 	le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(11, 10));
1302 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CS,
1303 			   GENMASK(11, 10));
1304 }
1305 #define SET_CMC_TBL_MASK_CSI_TXBF_EN BIT(0)
1306 static inline void SET_CMC_TBL_CSI_TXBF_EN(void *table, u32 val)
1307 {
1308 	le32p_replace_bits((__le32 *)(table) + 8, val, BIT(12));
1309 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_TXBF_EN,
1310 			   BIT(12));
1311 }
1312 #define SET_CMC_TBL_MASK_CSI_STBC_EN BIT(0)
1313 static inline void SET_CMC_TBL_CSI_STBC_EN(void *table, u32 val)
1314 {
1315 	le32p_replace_bits((__le32 *)(table) + 8, val, BIT(13));
1316 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_STBC_EN,
1317 			   BIT(13));
1318 }
1319 #define SET_CMC_TBL_MASK_CSI_LDPC_EN BIT(0)
1320 static inline void SET_CMC_TBL_CSI_LDPC_EN(void *table, u32 val)
1321 {
1322 	le32p_replace_bits((__le32 *)(table) + 8, val, BIT(14));
1323 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_LDPC_EN,
1324 			   BIT(14));
1325 }
1326 #define SET_CMC_TBL_MASK_CSI_PARA_EN BIT(0)
1327 static inline void SET_CMC_TBL_CSI_PARA_EN(void *table, u32 val)
1328 {
1329 	le32p_replace_bits((__le32 *)(table) + 8, val, BIT(15));
1330 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_PARA_EN,
1331 			   BIT(15));
1332 }
1333 #define SET_CMC_TBL_MASK_CSI_FIX_RATE GENMASK(8, 0)
1334 static inline void SET_CMC_TBL_CSI_FIX_RATE(void *table, u32 val)
1335 {
1336 	le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(24, 16));
1337 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_FIX_RATE,
1338 			   GENMASK(24, 16));
1339 }
1340 #define SET_CMC_TBL_MASK_CSI_GI_LTF GENMASK(2, 0)
1341 static inline void SET_CMC_TBL_CSI_GI_LTF(void *table, u32 val)
1342 {
1343 	le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(27, 25));
1344 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_GI_LTF,
1345 			   GENMASK(27, 25));
1346 }
1347 
1348 static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING160(void *table, u32 val)
1349 {
1350 	le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(29, 28));
1351 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING,
1352 			   GENMASK(29, 28));
1353 }
1354 
1355 #define SET_CMC_TBL_MASK_CSI_BW GENMASK(1, 0)
1356 static inline void SET_CMC_TBL_CSI_BW(void *table, u32 val)
1357 {
1358 	le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(31, 30));
1359 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_BW,
1360 			   GENMASK(31, 30));
1361 }
1362 
1363 struct rtw89_h2c_cctlinfo_ud_g7 {
1364 	__le32 c0;
1365 	__le32 w0;
1366 	__le32 w1;
1367 	__le32 w2;
1368 	__le32 w3;
1369 	__le32 w4;
1370 	__le32 w5;
1371 	__le32 w6;
1372 	__le32 w7;
1373 	__le32 w8;
1374 	__le32 w9;
1375 	__le32 w10;
1376 	__le32 w11;
1377 	__le32 w12;
1378 	__le32 w13;
1379 	__le32 w14;
1380 	__le32 w15;
1381 	__le32 m0;
1382 	__le32 m1;
1383 	__le32 m2;
1384 	__le32 m3;
1385 	__le32 m4;
1386 	__le32 m5;
1387 	__le32 m6;
1388 	__le32 m7;
1389 	__le32 m8;
1390 	__le32 m9;
1391 	__le32 m10;
1392 	__le32 m11;
1393 	__le32 m12;
1394 	__le32 m13;
1395 	__le32 m14;
1396 	__le32 m15;
1397 } __packed;
1398 
1399 #define CCTLINFO_G7_C0_MACID GENMASK(6, 0)
1400 #define CCTLINFO_G7_C0_OP BIT(7)
1401 
1402 #define CCTLINFO_G7_W0_DATARATE GENMASK(11, 0)
1403 #define CCTLINFO_G7_W0_DATA_GI_LTF GENMASK(14, 12)
1404 #define CCTLINFO_G7_W0_TRYRATE BIT(15)
1405 #define CCTLINFO_G7_W0_ARFR_CTRL GENMASK(17, 16)
1406 #define CCTLINFO_G7_W0_DIS_HE1SS_STBC BIT(18)
1407 #define CCTLINFO_G7_W0_ACQ_RPT_EN BIT(20)
1408 #define CCTLINFO_G7_W0_MGQ_RPT_EN BIT(21)
1409 #define CCTLINFO_G7_W0_ULQ_RPT_EN BIT(22)
1410 #define CCTLINFO_G7_W0_TWTQ_RPT_EN BIT(23)
1411 #define CCTLINFO_G7_W0_FORCE_TXOP BIT(24)
1412 #define CCTLINFO_G7_W0_DISRTSFB BIT(25)
1413 #define CCTLINFO_G7_W0_DISDATAFB BIT(26)
1414 #define CCTLINFO_G7_W0_NSTR_EN BIT(27)
1415 #define CCTLINFO_G7_W0_AMPDU_DENSITY GENMASK(31, 28)
1416 #define CCTLINFO_G7_W0_ALL (GENMASK(31, 20) | GENMASK(18, 0))
1417 #define CCTLINFO_G7_W1_DATA_RTY_LOWEST_RATE GENMASK(11, 0)
1418 #define CCTLINFO_G7_W1_RTS_TXCNT_LMT GENMASK(15, 12)
1419 #define CCTLINFO_G7_W1_RTSRATE GENMASK(27, 16)
1420 #define CCTLINFO_G7_W1_RTS_RTY_LOWEST_RATE GENMASK(31, 28)
1421 #define CCTLINFO_G7_W1_ALL GENMASK(31, 0)
1422 #define CCTLINFO_G7_W2_DATA_TX_CNT_LMT GENMASK(5, 0)
1423 #define CCTLINFO_G7_W2_DATA_TXCNT_LMT_SEL BIT(6)
1424 #define CCTLINFO_G7_W2_MAX_AGG_NUM_SEL BIT(7)
1425 #define CCTLINFO_G7_W2_RTS_EN BIT(8)
1426 #define CCTLINFO_G7_W2_CTS2SELF_EN BIT(9)
1427 #define CCTLINFO_G7_W2_CCA_RTS GENMASK(11, 10)
1428 #define CCTLINFO_G7_W2_HW_RTS_EN BIT(12)
1429 #define CCTLINFO_G7_W2_RTS_DROP_DATA_MODE GENMASK(14, 13)
1430 #define CCTLINFO_G7_W2_PRELD_EN BIT(15)
1431 #define CCTLINFO_G7_W2_AMPDU_MAX_LEN GENMASK(26, 16)
1432 #define CCTLINFO_G7_W2_UL_MU_DIS BIT(27)
1433 #define CCTLINFO_G7_W2_AMPDU_MAX_TIME GENMASK(31, 28)
1434 #define CCTLINFO_G7_W2_ALL GENMASK(31, 0)
1435 #define CCTLINFO_G7_W3_MAX_AGG_NUM GENMASK(7, 0)
1436 #define CCTLINFO_G7_W3_DATA_BW GENMASK(10, 8)
1437 #define CCTLINFO_G7_W3_DATA_BW_ER BIT(11)
1438 #define CCTLINFO_G7_W3_BA_BMAP GENMASK(14, 12)
1439 #define CCTLINFO_G7_W3_VCS_STBC BIT(15)
1440 #define CCTLINFO_G7_W3_VO_LFTIME_SEL GENMASK(18, 16)
1441 #define CCTLINFO_G7_W3_VI_LFTIME_SEL GENMASK(21, 19)
1442 #define CCTLINFO_G7_W3_BE_LFTIME_SEL GENMASK(24, 22)
1443 #define CCTLINFO_G7_W3_BK_LFTIME_SEL GENMASK(27, 25)
1444 #define CCTLINFO_G7_W3_AMPDU_TIME_SEL BIT(28)
1445 #define CCTLINFO_G7_W3_AMPDU_LEN_SEL BIT(29)
1446 #define CCTLINFO_G7_W3_RTS_TXCNT_LMT_SEL BIT(30)
1447 #define CCTLINFO_G7_W3_LSIG_TXOP_EN BIT(31)
1448 #define CCTLINFO_G7_W3_ALL GENMASK(31, 0)
1449 #define CCTLINFO_G7_W4_MULTI_PORT_ID GENMASK(2, 0)
1450 #define CCTLINFO_G7_W4_BYPASS_PUNC BIT(3)
1451 #define CCTLINFO_G7_W4_MBSSID GENMASK(7, 4)
1452 #define CCTLINFO_G7_W4_DATA_DCM BIT(8)
1453 #define CCTLINFO_G7_W4_DATA_ER BIT(9)
1454 #define CCTLINFO_G7_W4_DATA_LDPC BIT(10)
1455 #define CCTLINFO_G7_W4_DATA_STBC BIT(11)
1456 #define CCTLINFO_G7_W4_A_CTRL_BQR BIT(12)
1457 #define CCTLINFO_G7_W4_A_CTRL_BSR BIT(14)
1458 #define CCTLINFO_G7_W4_A_CTRL_CAS BIT(15)
1459 #define CCTLINFO_G7_W4_ACT_SUBCH_CBW GENMASK(31, 16)
1460 #define CCTLINFO_G7_W4_ALL (GENMASK(31, 14) | GENMASK(12, 0))
1461 #define CCTLINFO_G7_W5_NOMINAL_PKT_PADDING0 GENMASK(1, 0)
1462 #define CCTLINFO_G7_W5_NOMINAL_PKT_PADDING1 GENMASK(3, 2)
1463 #define CCTLINFO_G7_W5_NOMINAL_PKT_PADDING2 GENMASK(5, 4)
1464 #define CCTLINFO_G7_W5_NOMINAL_PKT_PADDING3 GENMASK(7, 6)
1465 #define CCTLINFO_G7_W5_NOMINAL_PKT_PADDING4 GENMASK(9, 8)
1466 #define CCTLINFO_G7_W5_SR_RATE GENMASK(14, 10)
1467 #define CCTLINFO_G7_W5_TID_DISABLE GENMASK(23, 16)
1468 #define CCTLINFO_G7_W5_ADDR_CAM_INDEX GENMASK(31, 24)
1469 #define CCTLINFO_G7_W5_ALL (GENMASK(31, 16) | GENMASK(14, 0))
1470 #define CCTLINFO_G7_W6_AID12_PAID GENMASK(11, 0)
1471 #define CCTLINFO_G7_W6_RESP_REF_RATE GENMASK(23, 12)
1472 #define CCTLINFO_G7_W6_ULDL BIT(31)
1473 #define CCTLINFO_G7_W6_ALL (BIT(31) | GENMASK(23, 0))
1474 #define CCTLINFO_G7_W7_NC GENMASK(2, 0)
1475 #define CCTLINFO_G7_W7_NR GENMASK(5, 3)
1476 #define CCTLINFO_G7_W7_NG GENMASK(7, 6)
1477 #define CCTLINFO_G7_W7_CB GENMASK(9, 8)
1478 #define CCTLINFO_G7_W7_CS GENMASK(11, 10)
1479 #define CCTLINFO_G7_W7_CSI_STBC_EN BIT(13)
1480 #define CCTLINFO_G7_W7_CSI_LDPC_EN BIT(14)
1481 #define CCTLINFO_G7_W7_CSI_PARA_EN BIT(15)
1482 #define CCTLINFO_G7_W7_CSI_FIX_RATE GENMASK(27, 16)
1483 #define CCTLINFO_G7_W7_CSI_BW GENMASK(31, 29)
1484 #define CCTLINFO_G7_W7_ALL (GENMASK(31, 29) | GENMASK(27, 13) | GENMASK(11, 0))
1485 #define CCTLINFO_G7_W8_ALL_ACK_SUPPORT BIT(0)
1486 #define CCTLINFO_G7_W8_BSR_QUEUE_SIZE_FORMAT BIT(1)
1487 #define CCTLINFO_G7_W8_BSR_OM_UPD_EN BIT(2)
1488 #define CCTLINFO_G7_W8_MACID_FWD_IDC BIT(3)
1489 #define CCTLINFO_G7_W8_AZ_SEC_EN BIT(4)
1490 #define CCTLINFO_G7_W8_CSI_SEC_EN BIT(5)
1491 #define CCTLINFO_G7_W8_FIX_UL_ADDRCAM_IDX BIT(6)
1492 #define CCTLINFO_G7_W8_CTRL_CNT_VLD BIT(7)
1493 #define CCTLINFO_G7_W8_CTRL_CNT GENMASK(11, 8)
1494 #define CCTLINFO_G7_W8_RESP_SEC_TYPE GENMASK(15, 12)
1495 #define CCTLINFO_G7_W8_ALL GENMASK(15, 0)
1496 /* W9~13 are reserved */
1497 #define CCTLINFO_G7_W14_VO_CURR_RATE GENMASK(11, 0)
1498 #define CCTLINFO_G7_W14_VI_CURR_RATE GENMASK(23, 12)
1499 #define CCTLINFO_G7_W14_BE_CURR_RATE_L GENMASK(31, 24)
1500 #define CCTLINFO_G7_W14_ALL GENMASK(31, 0)
1501 #define CCTLINFO_G7_W15_BE_CURR_RATE_H GENMASK(3, 0)
1502 #define CCTLINFO_G7_W15_BK_CURR_RATE GENMASK(15, 4)
1503 #define CCTLINFO_G7_W15_MGNT_CURR_RATE GENMASK(27, 16)
1504 #define CCTLINFO_G7_W15_ALL GENMASK(27, 0)
1505 
1506 struct rtw89_h2c_bcn_upd {
1507 	__le32 w0;
1508 	__le32 w1;
1509 	__le32 w2;
1510 } __packed;
1511 
1512 #define RTW89_H2C_BCN_UPD_W0_PORT GENMASK(7, 0)
1513 #define RTW89_H2C_BCN_UPD_W0_MBSSID GENMASK(15, 8)
1514 #define RTW89_H2C_BCN_UPD_W0_BAND GENMASK(23, 16)
1515 #define RTW89_H2C_BCN_UPD_W0_GRP_IE_OFST GENMASK(31, 24)
1516 #define RTW89_H2C_BCN_UPD_W1_MACID GENMASK(7, 0)
1517 #define RTW89_H2C_BCN_UPD_W1_SSN_SEL GENMASK(9, 8)
1518 #define RTW89_H2C_BCN_UPD_W1_SSN_MODE GENMASK(11, 10)
1519 #define RTW89_H2C_BCN_UPD_W1_RATE GENMASK(20, 12)
1520 #define RTW89_H2C_BCN_UPD_W1_TXPWR GENMASK(23, 21)
1521 #define RTW89_H2C_BCN_UPD_W2_TXINFO_CTRL_EN BIT(0)
1522 #define RTW89_H2C_BCN_UPD_W2_NTX_PATH_EN GENMASK(4, 1)
1523 #define RTW89_H2C_BCN_UPD_W2_PATH_MAP_A GENMASK(6, 5)
1524 #define RTW89_H2C_BCN_UPD_W2_PATH_MAP_B GENMASK(8, 7)
1525 #define RTW89_H2C_BCN_UPD_W2_PATH_MAP_C GENMASK(10, 9)
1526 #define RTW89_H2C_BCN_UPD_W2_PATH_MAP_D GENMASK(12, 11)
1527 #define RTW89_H2C_BCN_UPD_W2_PATH_ANTSEL_A BIT(13)
1528 #define RTW89_H2C_BCN_UPD_W2_PATH_ANTSEL_B BIT(14)
1529 #define RTW89_H2C_BCN_UPD_W2_PATH_ANTSEL_C BIT(15)
1530 #define RTW89_H2C_BCN_UPD_W2_PATH_ANTSEL_D BIT(16)
1531 #define RTW89_H2C_BCN_UPD_W2_CSA_OFST GENMASK(31, 17)
1532 
1533 struct rtw89_h2c_bcn_upd_be {
1534 	__le32 w0;
1535 	__le32 w1;
1536 	__le32 w2;
1537 	__le32 w3;
1538 	__le32 w4;
1539 	__le32 w5;
1540 	__le32 w6;
1541 	__le32 w7;
1542 	__le32 w8;
1543 	__le32 w9;
1544 	__le32 w10;
1545 	__le32 w11;
1546 	__le32 w12;
1547 	__le32 w13;
1548 	__le32 w14;
1549 	__le32 w15;
1550 	__le32 w16;
1551 	__le32 w17;
1552 	__le32 w18;
1553 	__le32 w19;
1554 	__le32 w20;
1555 	__le32 w21;
1556 	__le32 w22;
1557 	__le32 w23;
1558 	__le32 w24;
1559 	__le32 w25;
1560 	__le32 w26;
1561 	__le32 w27;
1562 	__le32 w28;
1563 	__le32 w29;
1564 } __packed;
1565 
1566 #define RTW89_H2C_BCN_UPD_BE_W0_PORT GENMASK(7, 0)
1567 #define RTW89_H2C_BCN_UPD_BE_W0_MBSSID GENMASK(15, 8)
1568 #define RTW89_H2C_BCN_UPD_BE_W0_BAND GENMASK(23, 16)
1569 #define RTW89_H2C_BCN_UPD_BE_W0_GRP_IE_OFST GENMASK(31, 24)
1570 #define RTW89_H2C_BCN_UPD_BE_W1_MACID GENMASK(7, 0)
1571 #define RTW89_H2C_BCN_UPD_BE_W1_SSN_SEL GENMASK(9, 8)
1572 #define RTW89_H2C_BCN_UPD_BE_W1_SSN_MODE GENMASK(11, 10)
1573 #define RTW89_H2C_BCN_UPD_BE_W1_RATE GENMASK(20, 12)
1574 #define RTW89_H2C_BCN_UPD_BE_W1_TXPWR GENMASK(23, 21)
1575 #define RTW89_H2C_BCN_UPD_BE_W1_MACID_EXT GENMASK(31, 24)
1576 #define RTW89_H2C_BCN_UPD_BE_W2_TXINFO_CTRL_EN BIT(0)
1577 #define RTW89_H2C_BCN_UPD_BE_W2_NTX_PATH_EN GENMASK(4, 1)
1578 #define RTW89_H2C_BCN_UPD_BE_W2_PATH_MAP_A GENMASK(6, 5)
1579 #define RTW89_H2C_BCN_UPD_BE_W2_PATH_MAP_B GENMASK(8, 7)
1580 #define RTW89_H2C_BCN_UPD_BE_W2_PATH_MAP_C GENMASK(10, 9)
1581 #define RTW89_H2C_BCN_UPD_BE_W2_PATH_MAP_D GENMASK(12, 11)
1582 #define RTW89_H2C_BCN_UPD_BE_W2_ANTSEL_A BIT(13)
1583 #define RTW89_H2C_BCN_UPD_BE_W2_ANTSEL_B BIT(14)
1584 #define RTW89_H2C_BCN_UPD_BE_W2_ANTSEL_C BIT(15)
1585 #define RTW89_H2C_BCN_UPD_BE_W2_ANTSEL_D BIT(16)
1586 #define RTW89_H2C_BCN_UPD_BE_W2_CSA_OFST GENMASK(31, 17)
1587 #define RTW89_H2C_BCN_UPD_BE_W3_MLIE_CSA_OFST GENMASK(15, 0)
1588 #define RTW89_H2C_BCN_UPD_BE_W3_CRITICAL_UPD_FLAG_OFST GENMASK(31, 16)
1589 #define RTW89_H2C_BCN_UPD_BE_W4_VAP1_DTIM_CNT_OFST GENMASK(15, 0)
1590 #define RTW89_H2C_BCN_UPD_BE_W4_VAP2_DTIM_CNT_OFST GENMASK(31, 16)
1591 #define RTW89_H2C_BCN_UPD_BE_W5_VAP3_DTIM_CNT_OFST GENMASK(15, 0)
1592 #define RTW89_H2C_BCN_UPD_BE_W5_VAP4_DTIM_CNT_OFST GENMASK(31, 16)
1593 #define RTW89_H2C_BCN_UPD_BE_W6_VAP5_DTIM_CNT_OFST GENMASK(15, 0)
1594 #define RTW89_H2C_BCN_UPD_BE_W6_VAP6_DTIM_CNT_OFST GENMASK(31, 16)
1595 #define RTW89_H2C_BCN_UPD_BE_W7_VAP7_DTIM_CNT_OFST GENMASK(15, 0)
1596 #define RTW89_H2C_BCN_UPD_BE_W7_ECSA_OFST GENMASK(30, 16)
1597 #define RTW89_H2C_BCN_UPD_BE_W7_PROTECTION_KEY_ID BIT(31)
1598 
1599 struct rtw89_h2c_role_maintain {
1600 	__le32 w0;
1601 };
1602 
1603 #define RTW89_H2C_ROLE_MAINTAIN_W0_MACID GENMASK(7, 0)
1604 #define RTW89_H2C_ROLE_MAINTAIN_W0_SELF_ROLE GENMASK(9, 8)
1605 #define RTW89_H2C_ROLE_MAINTAIN_W0_UPD_MODE GENMASK(12, 10)
1606 #define RTW89_H2C_ROLE_MAINTAIN_W0_WIFI_ROLE GENMASK(16, 13)
1607 #define RTW89_H2C_ROLE_MAINTAIN_W0_BAND GENMASK(18, 17)
1608 #define RTW89_H2C_ROLE_MAINTAIN_W0_PORT GENMASK(21, 19)
1609 #define RTW89_H2C_ROLE_MAINTAIN_W0_MACID_EXT GENMASK(31, 24)
1610 
1611 enum rtw89_fw_sta_type { /* value of RTW89_H2C_JOININFO_W1_STA_TYPE */
1612 	RTW89_FW_N_AC_STA = 0,
1613 	RTW89_FW_AX_STA = 1,
1614 	RTW89_FW_BE_STA = 2,
1615 };
1616 
1617 struct rtw89_h2c_join {
1618 	__le32 w0;
1619 } __packed;
1620 
1621 struct rtw89_h2c_join_v1 {
1622 	__le32 w0;
1623 	__le32 w1;
1624 	__le32 w2;
1625 } __packed;
1626 
1627 #define RTW89_H2C_JOININFO_W0_MACID GENMASK(7, 0)
1628 #define RTW89_H2C_JOININFO_W0_OP BIT(8)
1629 #define RTW89_H2C_JOININFO_W0_BAND BIT(9)
1630 #define RTW89_H2C_JOININFO_W0_WMM GENMASK(11, 10)
1631 #define RTW89_H2C_JOININFO_W0_TGR BIT(12)
1632 #define RTW89_H2C_JOININFO_W0_ISHESTA BIT(13)
1633 #define RTW89_H2C_JOININFO_W0_DLBW GENMASK(15, 14)
1634 #define RTW89_H2C_JOININFO_W0_TF_MAC_PAD GENMASK(17, 16)
1635 #define RTW89_H2C_JOININFO_W0_DL_T_PE GENMASK(20, 18)
1636 #define RTW89_H2C_JOININFO_W0_PORT_ID GENMASK(23, 21)
1637 #define RTW89_H2C_JOININFO_W0_NET_TYPE GENMASK(25, 24)
1638 #define RTW89_H2C_JOININFO_W0_WIFI_ROLE GENMASK(29, 26)
1639 #define RTW89_H2C_JOININFO_W0_SELF_ROLE GENMASK(31, 30)
1640 #define RTW89_H2C_JOININFO_W1_STA_TYPE GENMASK(2, 0)
1641 #define RTW89_H2C_JOININFO_W1_IS_MLD BIT(3)
1642 #define RTW89_H2C_JOININFO_W1_MAIN_MACID GENMASK(11, 4)
1643 #define RTW89_H2C_JOININFO_W1_MLO_MODE BIT(12)
1644 #define RTW89_H2C_JOININFO_MLO_MODE_MLMR 0
1645 #define RTW89_H2C_JOININFO_MLO_MODE_MLSR 1
1646 #define RTW89_H2C_JOININFO_W1_EMLSR_CAB BIT(13)
1647 #define RTW89_H2C_JOININFO_W1_NSTR_EN BIT(14)
1648 #define RTW89_H2C_JOININFO_W1_INIT_PWR_STATE BIT(15)
1649 #define RTW89_H2C_JOININFO_W1_EMLSR_PADDING GENMASK(18, 16)
1650 #define RTW89_H2C_JOININFO_W1_EMLSR_TRANS_DELAY GENMASK(21, 19)
1651 #define RTW89_H2C_JOININFO_W2_MACID_EXT GENMASK(7, 0)
1652 #define RTW89_H2C_JOININFO_W2_MAIN_MACID_EXT GENMASK(15, 8)
1653 
1654 struct rtw89_h2c_notify_dbcc {
1655 	__le32 w0;
1656 } __packed;
1657 
1658 #define RTW89_H2C_NOTIFY_DBCC_EN BIT(0)
1659 
1660 static inline void SET_GENERAL_PKT_MACID(void *h2c, u32 val)
1661 {
1662 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(7, 0));
1663 }
1664 
1665 static inline void SET_GENERAL_PKT_PROBRSP_ID(void *h2c, u32 val)
1666 {
1667 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(15, 8));
1668 }
1669 
1670 static inline void SET_GENERAL_PKT_PSPOLL_ID(void *h2c, u32 val)
1671 {
1672 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(23, 16));
1673 }
1674 
1675 static inline void SET_GENERAL_PKT_NULL_ID(void *h2c, u32 val)
1676 {
1677 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(31, 24));
1678 }
1679 
1680 static inline void SET_GENERAL_PKT_QOS_NULL_ID(void *h2c, u32 val)
1681 {
1682 	le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(7, 0));
1683 }
1684 
1685 static inline void SET_GENERAL_PKT_CTS2SELF_ID(void *h2c, u32 val)
1686 {
1687 	le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(15, 8));
1688 }
1689 
1690 static inline void SET_LOG_CFG_LEVEL(void *h2c, u32 val)
1691 {
1692 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(7, 0));
1693 }
1694 
1695 static inline void SET_LOG_CFG_PATH(void *h2c, u32 val)
1696 {
1697 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(15, 8));
1698 }
1699 
1700 static inline void SET_LOG_CFG_COMP(void *h2c, u32 val)
1701 {
1702 	le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(31, 0));
1703 }
1704 
1705 static inline void SET_LOG_CFG_COMP_EXT(void *h2c, u32 val)
1706 {
1707 	le32p_replace_bits((__le32 *)(h2c) + 2, val, GENMASK(31, 0));
1708 }
1709 
1710 struct rtw89_h2c_ba_cam {
1711 	__le32 w0;
1712 	__le32 w1;
1713 } __packed;
1714 
1715 #define RTW89_H2C_BA_CAM_W0_VALID BIT(0)
1716 #define RTW89_H2C_BA_CAM_W0_INIT_REQ BIT(1)
1717 #define RTW89_H2C_BA_CAM_W0_ENTRY_IDX GENMASK(3, 2)
1718 #define RTW89_H2C_BA_CAM_W0_TID GENMASK(7, 4)
1719 #define RTW89_H2C_BA_CAM_W0_MACID GENMASK(15, 8)
1720 #define RTW89_H2C_BA_CAM_W0_BMAP_SIZE GENMASK(19, 16)
1721 #define RTW89_H2C_BA_CAM_W0_SSN GENMASK(31, 20)
1722 #define RTW89_H2C_BA_CAM_W1_UID GENMASK(7, 0)
1723 #define RTW89_H2C_BA_CAM_W1_STD_EN BIT(8)
1724 #define RTW89_H2C_BA_CAM_W1_BAND BIT(9)
1725 #define RTW89_H2C_BA_CAM_W1_ENTRY_IDX_V1 GENMASK(31, 28)
1726 
1727 struct rtw89_h2c_ba_cam_v1 {
1728 	__le32 w0;
1729 	__le32 w1;
1730 } __packed;
1731 
1732 #define RTW89_H2C_BA_CAM_V1_W0_VALID BIT(0)
1733 #define RTW89_H2C_BA_CAM_V1_W0_INIT_REQ BIT(1)
1734 #define RTW89_H2C_BA_CAM_V1_W0_TID_MASK GENMASK(7, 4)
1735 #define RTW89_H2C_BA_CAM_V1_W0_MACID_MASK GENMASK(15, 8)
1736 #define RTW89_H2C_BA_CAM_V1_W0_BMAP_SIZE_MASK GENMASK(19, 16)
1737 #define RTW89_H2C_BA_CAM_V1_W0_SSN_MASK GENMASK(31, 20)
1738 #define RTW89_H2C_BA_CAM_V1_W1_UID_VALUE_MASK GENMASK(7, 0)
1739 #define RTW89_H2C_BA_CAM_V1_W1_STD_ENTRY_EN BIT(8)
1740 #define RTW89_H2C_BA_CAM_V1_W1_BAND_SEL BIT(9)
1741 #define RTW89_H2C_BA_CAM_V1_W1_MLD_EN BIT(10)
1742 #define RTW89_H2C_BA_CAM_V1_W1_ENTRY_IDX_MASK GENMASK(31, 24)
1743 
1744 struct rtw89_h2c_ba_cam_init {
1745 	__le32 w0;
1746 } __packed;
1747 
1748 #define RTW89_H2C_BA_CAM_INIT_USERS_MASK GENMASK(7, 0)
1749 #define RTW89_H2C_BA_CAM_INIT_OFFSET_MASK GENMASK(19, 12)
1750 #define RTW89_H2C_BA_CAM_INIT_BAND_SEL BIT(24)
1751 
1752 static inline void SET_LPS_PARM_MACID(void *h2c, u32 val)
1753 {
1754 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(7, 0));
1755 }
1756 
1757 static inline void SET_LPS_PARM_PSMODE(void *h2c, u32 val)
1758 {
1759 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(15, 8));
1760 }
1761 
1762 static inline void SET_LPS_PARM_RLBM(void *h2c, u32 val)
1763 {
1764 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(19, 16));
1765 }
1766 
1767 static inline void SET_LPS_PARM_SMARTPS(void *h2c, u32 val)
1768 {
1769 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(23, 20));
1770 }
1771 
1772 static inline void SET_LPS_PARM_AWAKEINTERVAL(void *h2c, u32 val)
1773 {
1774 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(31, 24));
1775 }
1776 
1777 static inline void SET_LPS_PARM_VOUAPSD(void *h2c, u32 val)
1778 {
1779 	le32p_replace_bits((__le32 *)(h2c) + 1, val, BIT(0));
1780 }
1781 
1782 static inline void SET_LPS_PARM_VIUAPSD(void *h2c, u32 val)
1783 {
1784 	le32p_replace_bits((__le32 *)(h2c) + 1, val, BIT(1));
1785 }
1786 
1787 static inline void SET_LPS_PARM_BEUAPSD(void *h2c, u32 val)
1788 {
1789 	le32p_replace_bits((__le32 *)(h2c) + 1, val, BIT(2));
1790 }
1791 
1792 static inline void SET_LPS_PARM_BKUAPSD(void *h2c, u32 val)
1793 {
1794 	le32p_replace_bits((__le32 *)(h2c) + 1, val, BIT(3));
1795 }
1796 
1797 static inline void SET_LPS_PARM_LASTRPWM(void *h2c, u32 val)
1798 {
1799 	le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(15, 8));
1800 }
1801 
1802 struct rtw89_h2c_lps_ch_info {
1803 	struct {
1804 		u8 pri_ch;
1805 		u8 central_ch;
1806 		u8 bw;
1807 		u8 band;
1808 	} __packed info[2];
1809 
1810 	__le32 mlo_dbcc_mode_lps;
1811 } __packed;
1812 
1813 struct rtw89_h2c_lps_ml_cmn_info {
1814 	u8 fmt_id;
1815 	u8 rfe_type;
1816 	u8 rsvd0[2];
1817 	__le32 mlo_dbcc_mode;
1818 	u8 central_ch[RTW89_PHY_NUM];
1819 	u8 pri_ch[RTW89_PHY_NUM];
1820 	u8 bw[RTW89_PHY_NUM];
1821 	u8 band[RTW89_PHY_NUM];
1822 	u8 bcn_rate_type[RTW89_PHY_NUM];
1823 	u8 rsvd1[2];
1824 	__le16 tia_gain[RTW89_PHY_NUM][TIA_GAIN_NUM];
1825 	u8 lna_gain[RTW89_PHY_NUM][LNA_GAIN_NUM];
1826 	u8 rsvd2[2];
1827 	u8 tia_lna_op1db[RTW89_PHY_NUM][LNA_GAIN_NUM + 1];
1828 	u8 lna_op1db[RTW89_PHY_NUM][LNA_GAIN_NUM];
1829 	u8 dup_bcn_ofst[RTW89_PHY_NUM];
1830 } __packed;
1831 
1832 static inline void RTW89_SET_FWCMD_CPU_EXCEPTION_TYPE(void *cmd, u32 val)
1833 {
1834 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 0));
1835 }
1836 
1837 static inline void RTW89_SET_FWCMD_PKT_DROP_SEL(void *cmd, u32 val)
1838 {
1839 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(7, 0));
1840 }
1841 
1842 static inline void RTW89_SET_FWCMD_PKT_DROP_MACID(void *cmd, u32 val)
1843 {
1844 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 8));
1845 }
1846 
1847 static inline void RTW89_SET_FWCMD_PKT_DROP_BAND(void *cmd, u32 val)
1848 {
1849 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(23, 16));
1850 }
1851 
1852 static inline void RTW89_SET_FWCMD_PKT_DROP_PORT(void *cmd, u32 val)
1853 {
1854 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 24));
1855 }
1856 
1857 static inline void RTW89_SET_FWCMD_PKT_DROP_MBSSID(void *cmd, u32 val)
1858 {
1859 	le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(7, 0));
1860 }
1861 
1862 static inline void RTW89_SET_FWCMD_PKT_DROP_ROLE_A_INFO_TF_TRS(void *cmd, u32 val)
1863 {
1864 	le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(15, 8));
1865 }
1866 
1867 static inline void RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_0(void *cmd, u32 val)
1868 {
1869 	le32p_replace_bits((__le32 *)cmd + 2, val, GENMASK(31, 0));
1870 }
1871 
1872 static inline void RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_1(void *cmd, u32 val)
1873 {
1874 	le32p_replace_bits((__le32 *)cmd + 3, val, GENMASK(31, 0));
1875 }
1876 
1877 static inline void RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_2(void *cmd, u32 val)
1878 {
1879 	le32p_replace_bits((__le32 *)cmd + 4, val, GENMASK(31, 0));
1880 }
1881 
1882 static inline void RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_3(void *cmd, u32 val)
1883 {
1884 	le32p_replace_bits((__le32 *)cmd + 5, val, GENMASK(31, 0));
1885 }
1886 
1887 static inline void RTW89_SET_KEEP_ALIVE_ENABLE(void *h2c, u32 val)
1888 {
1889 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(1, 0));
1890 }
1891 
1892 static inline void RTW89_SET_KEEP_ALIVE_PKT_NULL_ID(void *h2c, u32 val)
1893 {
1894 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(15, 8));
1895 }
1896 
1897 static inline void RTW89_SET_KEEP_ALIVE_PERIOD(void *h2c, u32 val)
1898 {
1899 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(24, 16));
1900 }
1901 
1902 static inline void RTW89_SET_KEEP_ALIVE_MACID(void *h2c, u32 val)
1903 {
1904 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(31, 24));
1905 }
1906 
1907 static inline void RTW89_SET_DISCONNECT_DETECT_ENABLE(void *h2c, u32 val)
1908 {
1909 	le32p_replace_bits((__le32 *)h2c, val, BIT(0));
1910 }
1911 
1912 static inline void RTW89_SET_DISCONNECT_DETECT_TRYOK_BCNFAIL_COUNT_EN(void *h2c, u32 val)
1913 {
1914 	le32p_replace_bits((__le32 *)h2c, val, BIT(1));
1915 }
1916 
1917 static inline void RTW89_SET_DISCONNECT_DETECT_DISCONNECT(void *h2c, u32 val)
1918 {
1919 	le32p_replace_bits((__le32 *)h2c, val, BIT(2));
1920 }
1921 
1922 static inline void RTW89_SET_DISCONNECT_DETECT_MAC_ID(void *h2c, u32 val)
1923 {
1924 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(15, 8));
1925 }
1926 
1927 static inline void RTW89_SET_DISCONNECT_DETECT_CHECK_PERIOD(void *h2c, u32 val)
1928 {
1929 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(23, 16));
1930 }
1931 
1932 static inline void RTW89_SET_DISCONNECT_DETECT_TRY_PKT_COUNT(void *h2c, u32 val)
1933 {
1934 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(31, 24));
1935 }
1936 
1937 static inline void RTW89_SET_DISCONNECT_DETECT_TRYOK_BCNFAIL_COUNT_LIMIT(void *h2c, u32 val)
1938 {
1939 	le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(7, 0));
1940 }
1941 
1942 struct rtw89_h2c_wow_global {
1943 	__le32 w0;
1944 	struct rtw89_wow_key_info key_info;
1945 } __packed;
1946 
1947 #define RTW89_H2C_WOW_GLOBAL_W0_ENABLE BIT(0)
1948 #define RTW89_H2C_WOW_GLOBAL_W0_DROP_ALL_PKT BIT(1)
1949 #define RTW89_H2C_WOW_GLOBAL_W0_RX_PARSE_AFTER_WAKE BIT(2)
1950 #define RTW89_H2C_WOW_GLOBAL_W0_WAKE_BAR_PULLED BIT(3)
1951 #define RTW89_H2C_WOW_GLOBAL_W0_MAC_ID GENMASK(15, 8)
1952 #define RTW89_H2C_WOW_GLOBAL_W0_PAIRWISE_SEC_ALGO GENMASK(23, 16)
1953 #define RTW89_H2C_WOW_GLOBAL_W0_GROUP_SEC_ALGO GENMASK(31, 24)
1954 
1955 #define RTW89_MAX_SUPPORT_NL_NUM	16
1956 struct rtw89_h2c_cfg_nlo {
1957 	__le32 w0;
1958 	u8 nlo_cnt;
1959 	u8 rsvd[3];
1960 	__le32 patterncheck;
1961 	__le32 rsvd1;
1962 	__le32 rsvd2;
1963 	u8 ssid_len[RTW89_MAX_SUPPORT_NL_NUM];
1964 	u8 chiper[RTW89_MAX_SUPPORT_NL_NUM];
1965 	u8 rsvd3[24];
1966 	u8 ssid[RTW89_MAX_SUPPORT_NL_NUM][IEEE80211_MAX_SSID_LEN];
1967 } __packed;
1968 
1969 #define RTW89_H2C_NLO_W0_ENABLE BIT(0)
1970 #define RTW89_H2C_NLO_W0_IGNORE_CIPHER BIT(2)
1971 #define RTW89_H2C_NLO_W0_MACID GENMASK(31, 24)
1972 
1973 static inline void RTW89_SET_WOW_WAKEUP_CTRL_PATTERN_MATCH_ENABLE(void *h2c, u32 val)
1974 {
1975 	le32p_replace_bits((__le32 *)h2c, val, BIT(0));
1976 }
1977 
1978 static inline void RTW89_SET_WOW_WAKEUP_CTRL_MAGIC_ENABLE(void *h2c, u32 val)
1979 {
1980 	le32p_replace_bits((__le32 *)h2c, val, BIT(1));
1981 }
1982 
1983 static inline void RTW89_SET_WOW_WAKEUP_CTRL_HW_UNICAST_ENABLE(void *h2c, u32 val)
1984 {
1985 	le32p_replace_bits((__le32 *)h2c, val, BIT(2));
1986 }
1987 
1988 static inline void RTW89_SET_WOW_WAKEUP_CTRL_FW_UNICAST_ENABLE(void *h2c, u32 val)
1989 {
1990 	le32p_replace_bits((__le32 *)h2c, val, BIT(3));
1991 }
1992 
1993 static inline void RTW89_SET_WOW_WAKEUP_CTRL_DEAUTH_ENABLE(void *h2c, u32 val)
1994 {
1995 	le32p_replace_bits((__le32 *)h2c, val, BIT(4));
1996 }
1997 
1998 static inline void RTW89_SET_WOW_WAKEUP_CTRL_REKEYP_ENABLE(void *h2c, u32 val)
1999 {
2000 	le32p_replace_bits((__le32 *)h2c, val, BIT(5));
2001 }
2002 
2003 static inline void RTW89_SET_WOW_WAKEUP_CTRL_EAP_ENABLE(void *h2c, u32 val)
2004 {
2005 	le32p_replace_bits((__le32 *)h2c, val, BIT(6));
2006 }
2007 
2008 static inline void RTW89_SET_WOW_WAKEUP_CTRL_ALL_DATA_ENABLE(void *h2c, u32 val)
2009 {
2010 	le32p_replace_bits((__le32 *)h2c, val, BIT(7));
2011 }
2012 
2013 static inline void RTW89_SET_WOW_WAKEUP_CTRL_MAC_ID(void *h2c, u32 val)
2014 {
2015 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(31, 24));
2016 }
2017 
2018 static inline void RTW89_SET_WOW_CAM_UPD_R_W(void *h2c, u32 val)
2019 {
2020 	le32p_replace_bits((__le32 *)h2c, val, BIT(0));
2021 }
2022 
2023 static inline void RTW89_SET_WOW_CAM_UPD_IDX(void *h2c, u32 val)
2024 {
2025 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(7, 1));
2026 }
2027 
2028 static inline void RTW89_SET_WOW_CAM_UPD_WKFM1(void *h2c, u32 val)
2029 {
2030 	le32p_replace_bits((__le32 *)h2c + 1, val, GENMASK(31, 0));
2031 }
2032 
2033 static inline void RTW89_SET_WOW_CAM_UPD_WKFM2(void *h2c, u32 val)
2034 {
2035 	le32p_replace_bits((__le32 *)h2c + 2, val, GENMASK(31, 0));
2036 }
2037 
2038 static inline void RTW89_SET_WOW_CAM_UPD_WKFM3(void *h2c, u32 val)
2039 {
2040 	le32p_replace_bits((__le32 *)h2c + 3, val, GENMASK(31, 0));
2041 }
2042 
2043 static inline void RTW89_SET_WOW_CAM_UPD_WKFM4(void *h2c, u32 val)
2044 {
2045 	le32p_replace_bits((__le32 *)h2c + 4, val, GENMASK(31, 0));
2046 }
2047 
2048 static inline void RTW89_SET_WOW_CAM_UPD_CRC(void *h2c, u32 val)
2049 {
2050 	le32p_replace_bits((__le32 *)h2c + 5, val, GENMASK(15, 0));
2051 }
2052 
2053 static inline void RTW89_SET_WOW_CAM_UPD_NEGATIVE_PATTERN_MATCH(void *h2c, u32 val)
2054 {
2055 	le32p_replace_bits((__le32 *)h2c + 5, val, BIT(22));
2056 }
2057 
2058 static inline void RTW89_SET_WOW_CAM_UPD_SKIP_MAC_HDR(void *h2c, u32 val)
2059 {
2060 	le32p_replace_bits((__le32 *)h2c + 5, val, BIT(23));
2061 }
2062 
2063 static inline void RTW89_SET_WOW_CAM_UPD_UC(void *h2c, u32 val)
2064 {
2065 	le32p_replace_bits((__le32 *)h2c + 5, val, BIT(24));
2066 }
2067 
2068 static inline void RTW89_SET_WOW_CAM_UPD_MC(void *h2c, u32 val)
2069 {
2070 	le32p_replace_bits((__le32 *)h2c + 5, val, BIT(25));
2071 }
2072 
2073 static inline void RTW89_SET_WOW_CAM_UPD_BC(void *h2c, u32 val)
2074 {
2075 	le32p_replace_bits((__le32 *)h2c + 5, val, BIT(26));
2076 }
2077 
2078 static inline void RTW89_SET_WOW_CAM_UPD_VALID(void *h2c, u32 val)
2079 {
2080 	le32p_replace_bits((__le32 *)h2c + 5, val, BIT(31));
2081 }
2082 
2083 struct rtw89_h2c_wow_gtk_ofld {
2084 	__le32 w0;
2085 	__le32 w1;
2086 	struct rtw89_wow_gtk_info gtk_info;
2087 } __packed;
2088 
2089 #define RTW89_H2C_WOW_GTK_OFLD_W0_EN BIT(0)
2090 #define RTW89_H2C_WOW_GTK_OFLD_W0_TKIP_EN BIT(1)
2091 #define RTW89_H2C_WOW_GTK_OFLD_W0_IEEE80211W_EN BIT(2)
2092 #define RTW89_H2C_WOW_GTK_OFLD_W0_PAIRWISE_WAKEUP BIT(3)
2093 #define RTW89_H2C_WOW_GTK_OFLD_W0_NOREKEY_WAKEUP BIT(4)
2094 #define RTW89_H2C_WOW_GTK_OFLD_W0_MAC_ID GENMASK(23, 16)
2095 #define RTW89_H2C_WOW_GTK_OFLD_W0_GTK_RSP_ID GENMASK(31, 24)
2096 #define RTW89_H2C_WOW_GTK_OFLD_W1_PMF_SA_QUERY_ID GENMASK(7, 0)
2097 #define RTW89_H2C_WOW_GTK_OFLD_W1_PMF_BIP_SEC_ALGO GENMASK(9, 8)
2098 #define RTW89_H2C_WOW_GTK_OFLD_W1_ALGO_AKM_SUIT GENMASK(17, 10)
2099 
2100 struct rtw89_h2c_arp_offload {
2101 	__le32 w0;
2102 	__le32 w1;
2103 } __packed;
2104 
2105 #define RTW89_H2C_ARP_OFFLOAD_W0_ENABLE BIT(0)
2106 #define RTW89_H2C_ARP_OFFLOAD_W0_ACTION BIT(1)
2107 #define RTW89_H2C_ARP_OFFLOAD_W0_MACID GENMASK(23, 16)
2108 #define RTW89_H2C_ARP_OFFLOAD_W0_PKT_ID GENMASK(31, 24)
2109 #define RTW89_H2C_ARP_OFFLOAD_W1_CONTENT GENMASK(31, 0)
2110 
2111 enum rtw89_btc_btf_h2c_class {
2112 	BTFC_SET = 0x10,
2113 	BTFC_GET = 0x11,
2114 	BTFC_FW_EVENT = 0x12,
2115 };
2116 
2117 enum rtw89_btc_btf_set {
2118 	SET_REPORT_EN = 0x0,
2119 	SET_SLOT_TABLE,
2120 	SET_MREG_TABLE,
2121 	SET_CX_POLICY,
2122 	SET_GPIO_DBG,
2123 	SET_DRV_INFO,
2124 	SET_DRV_EVENT,
2125 	SET_BT_WREG_ADDR,
2126 	SET_BT_WREG_VAL,
2127 	SET_BT_RREG_ADDR,
2128 	SET_BT_WL_CH_INFO,
2129 	SET_BT_INFO_REPORT,
2130 	SET_BT_IGNORE_WLAN_ACT,
2131 	SET_BT_TX_PWR,
2132 	SET_BT_LNA_CONSTRAIN,
2133 	SET_BT_QUERY_DEV_LIST,
2134 	SET_BT_QUERY_DEV_INFO,
2135 	SET_BT_PSD_REPORT,
2136 	SET_H2C_TEST,
2137 	SET_IOFLD_RF,
2138 	SET_IOFLD_BB,
2139 	SET_IOFLD_MAC,
2140 	SET_IOFLD_SCBD,
2141 	SET_H2C_MACRO,
2142 	SET_MAX1,
2143 };
2144 
2145 enum rtw89_btc_cxdrvinfo {
2146 	CXDRVINFO_INIT = 0,
2147 	CXDRVINFO_ROLE,
2148 	CXDRVINFO_DBCC,
2149 	CXDRVINFO_SMAP,
2150 	CXDRVINFO_RFK,
2151 	CXDRVINFO_RUN,
2152 	CXDRVINFO_CTRL,
2153 	CXDRVINFO_SCAN,
2154 	CXDRVINFO_TRX,  /* WL traffic to WL fw */
2155 	CXDRVINFO_TXPWR,
2156 	CXDRVINFO_FDDT,
2157 	CXDRVINFO_MLO,
2158 	CXDRVINFO_OSI,
2159 	CXDRVINFO_MAX,
2160 };
2161 
2162 enum rtw89_scan_mode {
2163 	RTW89_SCAN_IMMEDIATE,
2164 	RTW89_SCAN_DELAY,
2165 };
2166 
2167 enum rtw89_scan_type {
2168 	RTW89_SCAN_ONCE,
2169 	RTW89_SCAN_NORMAL,
2170 	RTW89_SCAN_NORMAL_SLOW,
2171 	RTW89_SCAN_SEAMLESS,
2172 	RTW89_SCAN_MAX,
2173 };
2174 
2175 static inline void RTW89_SET_FWCMD_CXHDR_TYPE(void *cmd, u8 val)
2176 {
2177 	u8p_replace_bits((u8 *)(cmd) + 0, val, GENMASK(7, 0));
2178 }
2179 
2180 static inline void RTW89_SET_FWCMD_CXHDR_LEN(void *cmd, u8 val)
2181 {
2182 	u8p_replace_bits((u8 *)(cmd) + 1, val, GENMASK(7, 0));
2183 }
2184 
2185 struct rtw89_h2c_cxhdr {
2186 	u8 type;
2187 	u8 len;
2188 } __packed;
2189 
2190 struct rtw89_h2c_cxhdr_v7 {
2191 	u8 type;
2192 	u8 ver;
2193 	u8 len;
2194 } __packed;
2195 
2196 struct rtw89_h2c_cxctrl_v7 {
2197 	struct rtw89_h2c_cxhdr_v7 hdr;
2198 	struct rtw89_btc_ctrl_v7 ctrl;
2199 } __packed;
2200 
2201 #define H2C_LEN_CXDRVHDR sizeof(struct rtw89_h2c_cxhdr)
2202 #define H2C_LEN_CXDRVHDR_V7 sizeof(struct rtw89_h2c_cxhdr_v7)
2203 
2204 struct rtw89_btc_wl_role_info_v7_u8 {
2205 	u8 connect_cnt;
2206 	u8 link_mode;
2207 	u8 link_mode_chg;
2208 	u8 p2p_2g;
2209 
2210 	struct rtw89_btc_wl_active_role_v7 active_role[RTW89_BE_BTC_WL_MAX_ROLE_NUMBER];
2211 } __packed;
2212 
2213 struct rtw89_btc_wl_role_info_v7_u32 {
2214 	__le32 role_map;
2215 	__le32 mrole_type;
2216 	__le32 mrole_noa_duration;
2217 	__le32 dbcc_en;
2218 	__le32 dbcc_chg;
2219 	__le32 dbcc_2g_phy;
2220 } __packed;
2221 
2222 struct rtw89_h2c_cxrole_v7 {
2223 	struct rtw89_h2c_cxhdr_v7 hdr;
2224 	struct rtw89_btc_wl_role_info_v7_u8 _u8;
2225 	struct rtw89_btc_wl_role_info_v7_u32 _u32;
2226 } __packed;
2227 
2228 struct rtw89_btc_wl_role_info_v8_u8 {
2229 	u8 connect_cnt;
2230 	u8 link_mode;
2231 	u8 link_mode_chg;
2232 	u8 p2p_2g;
2233 
2234 	u8 pta_req_band;
2235 	u8 dbcc_en;
2236 	u8 dbcc_chg;
2237 	u8 dbcc_2g_phy;
2238 
2239 	struct rtw89_btc_wl_rlink rlink[RTW89_BE_BTC_WL_MAX_ROLE_NUMBER][RTW89_MAC_NUM];
2240 } __packed;
2241 
2242 struct rtw89_btc_wl_role_info_v8_u32 {
2243 	__le32 role_map;
2244 	__le32 mrole_type;
2245 	__le32 mrole_noa_duration;
2246 } __packed;
2247 
2248 struct rtw89_h2c_cxrole_v8 {
2249 	struct rtw89_h2c_cxhdr_v7 hdr;
2250 	struct rtw89_btc_wl_role_info_v8_u8 _u8;
2251 	struct rtw89_btc_wl_role_info_v8_u32 _u32;
2252 } __packed;
2253 
2254 struct rtw89_h2c_cxosi {
2255 	struct rtw89_h2c_cxhdr_v7 hdr;
2256 	struct rtw89_btc_fbtc_outsrc_set_info osi;
2257 } __packed;
2258 
2259 struct rtw89_h2c_cxinit {
2260 	struct rtw89_h2c_cxhdr hdr;
2261 	u8 ant_type;
2262 	u8 ant_num;
2263 	u8 ant_iso;
2264 	u8 ant_info;
2265 	u8 mod_rfe;
2266 	u8 mod_cv;
2267 	u8 mod_info;
2268 	u8 mod_adie_kt;
2269 	u8 wl_gch;
2270 	u8 info;
2271 	u8 rsvd;
2272 	u8 rsvd1;
2273 } __packed;
2274 
2275 #define RTW89_H2C_CXINIT_ANT_INFO_POS BIT(0)
2276 #define RTW89_H2C_CXINIT_ANT_INFO_DIVERSITY BIT(1)
2277 #define RTW89_H2C_CXINIT_ANT_INFO_BTG_POS GENMASK(3, 2)
2278 #define RTW89_H2C_CXINIT_ANT_INFO_STREAM_CNT GENMASK(7, 4)
2279 
2280 #define RTW89_H2C_CXINIT_MOD_INFO_BT_SOLO BIT(0)
2281 #define RTW89_H2C_CXINIT_MOD_INFO_BT_POS BIT(1)
2282 #define RTW89_H2C_CXINIT_MOD_INFO_SW_TYPE BIT(2)
2283 #define RTW89_H2C_CXINIT_MOD_INFO_WA_TYPE GENMASK(5, 3)
2284 
2285 #define RTW89_H2C_CXINIT_INFO_WL_ONLY BIT(0)
2286 #define RTW89_H2C_CXINIT_INFO_WL_INITOK BIT(1)
2287 #define RTW89_H2C_CXINIT_INFO_DBCC_EN BIT(2)
2288 #define RTW89_H2C_CXINIT_INFO_CX_OTHER BIT(3)
2289 #define RTW89_H2C_CXINIT_INFO_BT_ONLY BIT(4)
2290 
2291 struct rtw89_h2c_cxinit_v7 {
2292 	struct rtw89_h2c_cxhdr_v7 hdr;
2293 	struct rtw89_btc_init_info_v7 init;
2294 } __packed;
2295 
2296 static inline void RTW89_SET_FWCMD_CXROLE_CONNECT_CNT(void *cmd, u8 val)
2297 {
2298 	u8p_replace_bits((u8 *)(cmd) + 2, val, GENMASK(7, 0));
2299 }
2300 
2301 static inline void RTW89_SET_FWCMD_CXROLE_LINK_MODE(void *cmd, u8 val)
2302 {
2303 	u8p_replace_bits((u8 *)(cmd) + 3, val, GENMASK(7, 0));
2304 }
2305 
2306 static inline void RTW89_SET_FWCMD_CXROLE_ROLE_NONE(void *cmd, u16 val)
2307 {
2308 	le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(0));
2309 }
2310 
2311 static inline void RTW89_SET_FWCMD_CXROLE_ROLE_STA(void *cmd, u16 val)
2312 {
2313 	le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(1));
2314 }
2315 
2316 static inline void RTW89_SET_FWCMD_CXROLE_ROLE_AP(void *cmd, u16 val)
2317 {
2318 	le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(2));
2319 }
2320 
2321 static inline void RTW89_SET_FWCMD_CXROLE_ROLE_VAP(void *cmd, u16 val)
2322 {
2323 	le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(3));
2324 }
2325 
2326 static inline void RTW89_SET_FWCMD_CXROLE_ROLE_ADHOC(void *cmd, u16 val)
2327 {
2328 	le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(4));
2329 }
2330 
2331 static inline void RTW89_SET_FWCMD_CXROLE_ROLE_ADHOC_MASTER(void *cmd, u16 val)
2332 {
2333 	le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(5));
2334 }
2335 
2336 static inline void RTW89_SET_FWCMD_CXROLE_ROLE_MESH(void *cmd, u16 val)
2337 {
2338 	le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(6));
2339 }
2340 
2341 static inline void RTW89_SET_FWCMD_CXROLE_ROLE_MONITOR(void *cmd, u16 val)
2342 {
2343 	le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(7));
2344 }
2345 
2346 static inline void RTW89_SET_FWCMD_CXROLE_ROLE_P2P_DEV(void *cmd, u16 val)
2347 {
2348 	le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(8));
2349 }
2350 
2351 static inline void RTW89_SET_FWCMD_CXROLE_ROLE_P2P_GC(void *cmd, u16 val)
2352 {
2353 	le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(9));
2354 }
2355 
2356 static inline void RTW89_SET_FWCMD_CXROLE_ROLE_P2P_GO(void *cmd, u16 val)
2357 {
2358 	le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(10));
2359 }
2360 
2361 static inline void RTW89_SET_FWCMD_CXROLE_ROLE_NAN(void *cmd, u16 val)
2362 {
2363 	le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(11));
2364 }
2365 
2366 static inline void RTW89_SET_FWCMD_CXROLE_ACT_CONNECTED(void *cmd, u8 val, int n, u8 offset)
2367 {
2368 	u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, BIT(0));
2369 }
2370 
2371 static inline void RTW89_SET_FWCMD_CXROLE_ACT_PID(void *cmd, u8 val, int n, u8 offset)
2372 {
2373 	u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, GENMASK(3, 1));
2374 }
2375 
2376 static inline void RTW89_SET_FWCMD_CXROLE_ACT_PHY(void *cmd, u8 val, int n, u8 offset)
2377 {
2378 	u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, BIT(4));
2379 }
2380 
2381 static inline void RTW89_SET_FWCMD_CXROLE_ACT_NOA(void *cmd, u8 val, int n, u8 offset)
2382 {
2383 	u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, BIT(5));
2384 }
2385 
2386 static inline void RTW89_SET_FWCMD_CXROLE_ACT_BAND(void *cmd, u8 val, int n, u8 offset)
2387 {
2388 	u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, GENMASK(7, 6));
2389 }
2390 
2391 static inline void RTW89_SET_FWCMD_CXROLE_ACT_CLIENT_PS(void *cmd, u8 val, int n, u8 offset)
2392 {
2393 	u8p_replace_bits((u8 *)cmd + (7 + (12 + offset) * n), val, BIT(0));
2394 }
2395 
2396 static inline void RTW89_SET_FWCMD_CXROLE_ACT_BW(void *cmd, u8 val, int n, u8 offset)
2397 {
2398 	u8p_replace_bits((u8 *)cmd + (7 + (12 + offset) * n), val, GENMASK(7, 1));
2399 }
2400 
2401 static inline void RTW89_SET_FWCMD_CXROLE_ACT_ROLE(void *cmd, u8 val, int n, u8 offset)
2402 {
2403 	u8p_replace_bits((u8 *)cmd + (8 + (12 + offset) * n), val, GENMASK(7, 0));
2404 }
2405 
2406 static inline void RTW89_SET_FWCMD_CXROLE_ACT_CH(void *cmd, u8 val, int n, u8 offset)
2407 {
2408 	u8p_replace_bits((u8 *)cmd + (9 + (12 + offset) * n), val, GENMASK(7, 0));
2409 }
2410 
2411 static inline void RTW89_SET_FWCMD_CXROLE_ACT_TX_LVL(void *cmd, u16 val, int n, u8 offset)
2412 {
2413 	le16p_replace_bits((__le16 *)((u8 *)cmd + (10 + (12 + offset) * n)), val, GENMASK(15, 0));
2414 }
2415 
2416 static inline void RTW89_SET_FWCMD_CXROLE_ACT_RX_LVL(void *cmd, u16 val, int n, u8 offset)
2417 {
2418 	le16p_replace_bits((__le16 *)((u8 *)cmd + (12 + (12 + offset) * n)), val, GENMASK(15, 0));
2419 }
2420 
2421 static inline void RTW89_SET_FWCMD_CXROLE_ACT_TX_RATE(void *cmd, u16 val, int n, u8 offset)
2422 {
2423 	le16p_replace_bits((__le16 *)((u8 *)cmd + (14 + (12 + offset) * n)), val, GENMASK(15, 0));
2424 }
2425 
2426 static inline void RTW89_SET_FWCMD_CXROLE_ACT_RX_RATE(void *cmd, u16 val, int n, u8 offset)
2427 {
2428 	le16p_replace_bits((__le16 *)((u8 *)cmd + (16 + (12 + offset) * n)), val, GENMASK(15, 0));
2429 }
2430 
2431 static inline void RTW89_SET_FWCMD_CXROLE_ACT_NOA_DUR(void *cmd, u32 val, int n, u8 offset)
2432 {
2433 	le32p_replace_bits((__le32 *)((u8 *)cmd + (20 + (12 + offset) * n)), val, GENMASK(31, 0));
2434 }
2435 
2436 static inline void RTW89_SET_FWCMD_CXROLE_ACT_CONNECTED_V2(void *cmd, u8 val, int n, u8 offset)
2437 {
2438 	u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, BIT(0));
2439 }
2440 
2441 static inline void RTW89_SET_FWCMD_CXROLE_ACT_PID_V2(void *cmd, u8 val, int n, u8 offset)
2442 {
2443 	u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, GENMASK(3, 1));
2444 }
2445 
2446 static inline void RTW89_SET_FWCMD_CXROLE_ACT_PHY_V2(void *cmd, u8 val, int n, u8 offset)
2447 {
2448 	u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, BIT(4));
2449 }
2450 
2451 static inline void RTW89_SET_FWCMD_CXROLE_ACT_NOA_V2(void *cmd, u8 val, int n, u8 offset)
2452 {
2453 	u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, BIT(5));
2454 }
2455 
2456 static inline void RTW89_SET_FWCMD_CXROLE_ACT_BAND_V2(void *cmd, u8 val, int n, u8 offset)
2457 {
2458 	u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, GENMASK(7, 6));
2459 }
2460 
2461 static inline void RTW89_SET_FWCMD_CXROLE_ACT_CLIENT_PS_V2(void *cmd, u8 val, int n, u8 offset)
2462 {
2463 	u8p_replace_bits((u8 *)cmd + (7 + (12 + offset) * n), val, BIT(0));
2464 }
2465 
2466 static inline void RTW89_SET_FWCMD_CXROLE_ACT_BW_V2(void *cmd, u8 val, int n, u8 offset)
2467 {
2468 	u8p_replace_bits((u8 *)cmd + (7 + (12 + offset) * n), val, GENMASK(7, 1));
2469 }
2470 
2471 static inline void RTW89_SET_FWCMD_CXROLE_ACT_ROLE_V2(void *cmd, u8 val, int n, u8 offset)
2472 {
2473 	u8p_replace_bits((u8 *)cmd + (8 + (12 + offset) * n), val, GENMASK(7, 0));
2474 }
2475 
2476 static inline void RTW89_SET_FWCMD_CXROLE_ACT_CH_V2(void *cmd, u8 val, int n, u8 offset)
2477 {
2478 	u8p_replace_bits((u8 *)cmd + (9 + (12 + offset) * n), val, GENMASK(7, 0));
2479 }
2480 
2481 static inline void RTW89_SET_FWCMD_CXROLE_ACT_NOA_DUR_V2(void *cmd, u32 val, int n, u8 offset)
2482 {
2483 	le32p_replace_bits((__le32 *)((u8 *)cmd + (10 + (12 + offset) * n)), val, GENMASK(31, 0));
2484 }
2485 
2486 static inline void RTW89_SET_FWCMD_CXROLE_MROLE_TYPE(void *cmd, u32 val, u8 offset)
2487 {
2488 	le32p_replace_bits((__le32 *)((u8 *)cmd + offset), val, GENMASK(31, 0));
2489 }
2490 
2491 static inline void RTW89_SET_FWCMD_CXROLE_MROLE_NOA(void *cmd, u32 val, u8 offset)
2492 {
2493 	le32p_replace_bits((__le32 *)((u8 *)cmd + offset + 4), val, GENMASK(31, 0));
2494 }
2495 
2496 static inline void RTW89_SET_FWCMD_CXROLE_DBCC_EN(void *cmd, u32 val, u8 offset)
2497 {
2498 	le32p_replace_bits((__le32 *)((u8 *)cmd + offset + 8), val, BIT(0));
2499 }
2500 
2501 static inline void RTW89_SET_FWCMD_CXROLE_DBCC_CHG(void *cmd, u32 val, u8 offset)
2502 {
2503 	le32p_replace_bits((__le32 *)((u8 *)cmd + offset + 8), val, BIT(1));
2504 }
2505 
2506 static inline void RTW89_SET_FWCMD_CXROLE_DBCC_2G_PHY(void *cmd, u32 val, u8 offset)
2507 {
2508 	le32p_replace_bits((__le32 *)((u8 *)cmd + offset + 8), val, GENMASK(3, 2));
2509 }
2510 
2511 static inline void RTW89_SET_FWCMD_CXROLE_LINK_MODE_CHG(void *cmd, u32 val, u8 offset)
2512 {
2513 	le32p_replace_bits((__le32 *)((u8 *)cmd + offset + 8), val, BIT(4));
2514 }
2515 
2516 static inline void RTW89_SET_FWCMD_CXCTRL_MANUAL(void *cmd, u32 val)
2517 {
2518 	le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, BIT(0));
2519 }
2520 
2521 static inline void RTW89_SET_FWCMD_CXCTRL_IGNORE_BT(void *cmd, u32 val)
2522 {
2523 	le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, BIT(1));
2524 }
2525 
2526 static inline void RTW89_SET_FWCMD_CXCTRL_ALWAYS_FREERUN(void *cmd, u32 val)
2527 {
2528 	le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, BIT(2));
2529 }
2530 
2531 static inline void RTW89_SET_FWCMD_CXCTRL_TRACE_STEP(void *cmd, u32 val)
2532 {
2533 	le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, GENMASK(18, 3));
2534 }
2535 
2536 static inline void RTW89_SET_FWCMD_CXTRX_TXLV(void *cmd, u8 val)
2537 {
2538 	u8p_replace_bits((u8 *)cmd + 2, val, GENMASK(7, 0));
2539 }
2540 
2541 static inline void RTW89_SET_FWCMD_CXTRX_RXLV(void *cmd, u8 val)
2542 {
2543 	u8p_replace_bits((u8 *)cmd + 3, val, GENMASK(7, 0));
2544 }
2545 
2546 static inline void RTW89_SET_FWCMD_CXTRX_WLRSSI(void *cmd, u8 val)
2547 {
2548 	u8p_replace_bits((u8 *)cmd + 4, val, GENMASK(7, 0));
2549 }
2550 
2551 static inline void RTW89_SET_FWCMD_CXTRX_BTRSSI(void *cmd, u8 val)
2552 {
2553 	u8p_replace_bits((u8 *)cmd + 5, val, GENMASK(7, 0));
2554 }
2555 
2556 static inline void RTW89_SET_FWCMD_CXTRX_TXPWR(void *cmd, s8 val)
2557 {
2558 	u8p_replace_bits((u8 *)cmd + 6, val, GENMASK(7, 0));
2559 }
2560 
2561 static inline void RTW89_SET_FWCMD_CXTRX_RXGAIN(void *cmd, s8 val)
2562 {
2563 	u8p_replace_bits((u8 *)cmd + 7, val, GENMASK(7, 0));
2564 }
2565 
2566 static inline void RTW89_SET_FWCMD_CXTRX_BTTXPWR(void *cmd, s8 val)
2567 {
2568 	u8p_replace_bits((u8 *)cmd + 8, val, GENMASK(7, 0));
2569 }
2570 
2571 static inline void RTW89_SET_FWCMD_CXTRX_BTRXGAIN(void *cmd, s8 val)
2572 {
2573 	u8p_replace_bits((u8 *)cmd + 9, val, GENMASK(7, 0));
2574 }
2575 
2576 static inline void RTW89_SET_FWCMD_CXTRX_CN(void *cmd, u8 val)
2577 {
2578 	u8p_replace_bits((u8 *)cmd + 10, val, GENMASK(7, 0));
2579 }
2580 
2581 static inline void RTW89_SET_FWCMD_CXTRX_NHM(void *cmd, s8 val)
2582 {
2583 	u8p_replace_bits((u8 *)cmd + 11, val, GENMASK(7, 0));
2584 }
2585 
2586 static inline void RTW89_SET_FWCMD_CXTRX_BTPROFILE(void *cmd, u8 val)
2587 {
2588 	u8p_replace_bits((u8 *)cmd + 12, val, GENMASK(7, 0));
2589 }
2590 
2591 static inline void RTW89_SET_FWCMD_CXTRX_RSVD2(void *cmd, u8 val)
2592 {
2593 	u8p_replace_bits((u8 *)cmd + 13, val, GENMASK(7, 0));
2594 }
2595 
2596 static inline void RTW89_SET_FWCMD_CXTRX_TXRATE(void *cmd, u16 val)
2597 {
2598 	le16p_replace_bits((__le16 *)((u8 *)cmd + 14), val, GENMASK(15, 0));
2599 }
2600 
2601 static inline void RTW89_SET_FWCMD_CXTRX_RXRATE(void *cmd, u16 val)
2602 {
2603 	le16p_replace_bits((__le16 *)((u8 *)cmd + 16), val, GENMASK(15, 0));
2604 }
2605 
2606 static inline void RTW89_SET_FWCMD_CXTRX_TXTP(void *cmd, u32 val)
2607 {
2608 	le32p_replace_bits((__le32 *)((u8 *)cmd + 18), val, GENMASK(31, 0));
2609 }
2610 
2611 static inline void RTW89_SET_FWCMD_CXTRX_RXTP(void *cmd, u32 val)
2612 {
2613 	le32p_replace_bits((__le32 *)((u8 *)cmd + 22), val, GENMASK(31, 0));
2614 }
2615 
2616 static inline void RTW89_SET_FWCMD_CXTRX_RXERRRA(void *cmd, u32 val)
2617 {
2618 	le32p_replace_bits((__le32 *)((u8 *)cmd + 26), val, GENMASK(31, 0));
2619 }
2620 
2621 static inline void RTW89_SET_FWCMD_CXRFK_STATE(void *cmd, u32 val)
2622 {
2623 	le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, GENMASK(1, 0));
2624 }
2625 
2626 static inline void RTW89_SET_FWCMD_CXRFK_PATH_MAP(void *cmd, u32 val)
2627 {
2628 	le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, GENMASK(5, 2));
2629 }
2630 
2631 static inline void RTW89_SET_FWCMD_CXRFK_PHY_MAP(void *cmd, u32 val)
2632 {
2633 	le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, GENMASK(7, 6));
2634 }
2635 
2636 static inline void RTW89_SET_FWCMD_CXRFK_BAND(void *cmd, u32 val)
2637 {
2638 	le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, GENMASK(9, 8));
2639 }
2640 
2641 static inline void RTW89_SET_FWCMD_CXRFK_TYPE(void *cmd, u32 val)
2642 {
2643 	le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, GENMASK(17, 10));
2644 }
2645 
2646 static inline void RTW89_SET_FWCMD_PACKET_OFLD_PKT_IDX(void *cmd, u32 val)
2647 {
2648 	le32p_replace_bits((__le32 *)((u8 *)(cmd)), val, GENMASK(7, 0));
2649 }
2650 
2651 static inline void RTW89_SET_FWCMD_PACKET_OFLD_PKT_OP(void *cmd, u32 val)
2652 {
2653 	le32p_replace_bits((__le32 *)((u8 *)(cmd)), val, GENMASK(10, 8));
2654 }
2655 
2656 static inline void RTW89_SET_FWCMD_PACKET_OFLD_PKT_LENGTH(void *cmd, u32 val)
2657 {
2658 	le32p_replace_bits((__le32 *)((u8 *)(cmd)), val, GENMASK(31, 16));
2659 }
2660 
2661 struct rtw89_h2c_chinfo_elem {
2662 	__le32 w0;
2663 	__le32 w1;
2664 	__le32 w2;
2665 	__le32 w3;
2666 	__le32 w4;
2667 	__le32 w5;
2668 	__le32 w6;
2669 } __packed;
2670 
2671 #define RTW89_H2C_CHINFO_W0_PERIOD GENMASK(7, 0)
2672 #define RTW89_H2C_CHINFO_W0_DWELL GENMASK(15, 8)
2673 #define RTW89_H2C_CHINFO_W0_CENTER_CH GENMASK(23, 16)
2674 #define RTW89_H2C_CHINFO_W0_PRI_CH GENMASK(31, 24)
2675 #define RTW89_H2C_CHINFO_W1_BW GENMASK(2, 0)
2676 #define RTW89_H2C_CHINFO_W1_ACTION GENMASK(7, 3)
2677 #define RTW89_H2C_CHINFO_W1_NUM_PKT GENMASK(11, 8)
2678 #define RTW89_H2C_CHINFO_W1_TX BIT(12)
2679 #define RTW89_H2C_CHINFO_W1_PAUSE_DATA BIT(13)
2680 #define RTW89_H2C_CHINFO_W1_BAND GENMASK(15, 14)
2681 #define RTW89_H2C_CHINFO_W1_PKT_ID GENMASK(23, 16)
2682 #define RTW89_H2C_CHINFO_W1_DFS BIT(24)
2683 #define RTW89_H2C_CHINFO_W1_TX_NULL BIT(25)
2684 #define RTW89_H2C_CHINFO_W1_RANDOM BIT(26)
2685 #define RTW89_H2C_CHINFO_W1_CFG_TX BIT(27)
2686 #define RTW89_H2C_CHINFO_W1_MACID_TX BIT(29)
2687 #define RTW89_H2C_CHINFO_W2_PKT0 GENMASK(7, 0)
2688 #define RTW89_H2C_CHINFO_W2_PKT1 GENMASK(15, 8)
2689 #define RTW89_H2C_CHINFO_W2_PKT2 GENMASK(23, 16)
2690 #define RTW89_H2C_CHINFO_W2_PKT3 GENMASK(31, 24)
2691 #define RTW89_H2C_CHINFO_W3_PKT4 GENMASK(7, 0)
2692 #define RTW89_H2C_CHINFO_W3_PKT5 GENMASK(15, 8)
2693 #define RTW89_H2C_CHINFO_W3_PKT6 GENMASK(23, 16)
2694 #define RTW89_H2C_CHINFO_W3_PKT7 GENMASK(31, 24)
2695 #define RTW89_H2C_CHINFO_W4_POWER_IDX GENMASK(15, 0)
2696 
2697 struct rtw89_h2c_chinfo_elem_be {
2698 	__le32 w0;
2699 	__le32 w1;
2700 	__le32 w2;
2701 	__le32 w3;
2702 	__le32 w4;
2703 	__le32 w5;
2704 	__le32 w6;
2705 	__le32 w7;
2706 } __packed;
2707 
2708 #define RTW89_H2C_CHINFO_BE_W0_PERIOD GENMASK(7, 0)
2709 #define RTW89_H2C_CHINFO_BE_W0_DWELL GENMASK(15, 8)
2710 #define RTW89_H2C_CHINFO_BE_W0_CENTER_CH GENMASK(23, 16)
2711 #define RTW89_H2C_CHINFO_BE_W0_PRI_CH GENMASK(31, 24)
2712 #define RTW89_H2C_CHINFO_BE_W1_BW GENMASK(2, 0)
2713 #define RTW89_H2C_CHINFO_BE_W1_CH_BAND GENMASK(4, 3)
2714 #define RTW89_H2C_CHINFO_BE_W1_DFS BIT(5)
2715 #define RTW89_H2C_CHINFO_BE_W1_PAUSE_DATA BIT(6)
2716 #define RTW89_H2C_CHINFO_BE_W1_TX_NULL BIT(7)
2717 #define RTW89_H2C_CHINFO_BE_W1_RANDOM BIT(8)
2718 #define RTW89_H2C_CHINFO_BE_W1_NOTIFY GENMASK(13, 9)
2719 #define RTW89_H2C_CHINFO_BE_W1_PROBE BIT(14)
2720 #define RTW89_H2C_CHINFO_BE_W1_EARLY_LEAVE_CRIT GENMASK(17, 15)
2721 #define RTW89_H2C_CHINFO_BE_W1_CHKPT_TIMER GENMASK(31, 24)
2722 #define RTW89_H2C_CHINFO_BE_W2_EARLY_LEAVE_TIME GENMASK(7, 0)
2723 #define RTW89_H2C_CHINFO_BE_W2_EARLY_LEAVE_TH GENMASK(15, 8)
2724 #define RTW89_H2C_CHINFO_BE_W2_TX_PKT_CTRL GENMASK(31, 16)
2725 #define RTW89_H2C_CHINFO_BE_W3_PKT0 GENMASK(7, 0)
2726 #define RTW89_H2C_CHINFO_BE_W3_PKT1 GENMASK(15, 8)
2727 #define RTW89_H2C_CHINFO_BE_W3_PKT2 GENMASK(23, 16)
2728 #define RTW89_H2C_CHINFO_BE_W3_PKT3 GENMASK(31, 24)
2729 #define RTW89_H2C_CHINFO_BE_W4_PKT4 GENMASK(7, 0)
2730 #define RTW89_H2C_CHINFO_BE_W4_PKT5 GENMASK(15, 8)
2731 #define RTW89_H2C_CHINFO_BE_W4_PKT6 GENMASK(23, 16)
2732 #define RTW89_H2C_CHINFO_BE_W4_PKT7 GENMASK(31, 24)
2733 #define RTW89_H2C_CHINFO_BE_W5_SW_DEF GENMASK(7, 0)
2734 #define RTW89_H2C_CHINFO_BE_W5_FW_PROBE0_SSIDS GENMASK(31, 16)
2735 #define RTW89_H2C_CHINFO_BE_W6_FW_PROBE0_SHORTSSIDS GENMASK(15, 0)
2736 #define RTW89_H2C_CHINFO_BE_W6_FW_PROBE0_BSSIDS GENMASK(31, 16)
2737 #define RTW89_H2C_CHINFO_BE_W7_PERIOD_V1 GENMASK(15, 0)
2738 
2739 struct rtw89_h2c_chinfo {
2740 	u8 ch_num;
2741 	u8 elem_size;
2742 	u8 arg;
2743 	u8 rsvd0;
2744 	struct rtw89_h2c_chinfo_elem elem[] __counted_by(ch_num);
2745 } __packed;
2746 
2747 struct rtw89_h2c_chinfo_be {
2748 	u8 ch_num;
2749 	u8 elem_size;
2750 	u8 arg;
2751 	u8 rsvd0;
2752 	struct rtw89_h2c_chinfo_elem_be elem[] __counted_by(ch_num);
2753 } __packed;
2754 
2755 #define RTW89_H2C_CHINFO_ARG_MAC_IDX_MASK BIT(0)
2756 #define RTW89_H2C_CHINFO_ARG_APPEND_MASK BIT(1)
2757 
2758 struct rtw89_h2c_scanofld {
2759 	__le32 w0;
2760 	__le32 w1;
2761 	__le32 w2;
2762 	__le32 tsf_high;
2763 	__le32 tsf_low;
2764 	__le32 w5;
2765 	__le32 w6;
2766 } __packed;
2767 
2768 #define RTW89_H2C_SCANOFLD_W0_MACID GENMASK(7, 0)
2769 #define RTW89_H2C_SCANOFLD_W0_NORM_CY GENMASK(15, 8)
2770 #define RTW89_H2C_SCANOFLD_W0_PORT_ID GENMASK(18, 16)
2771 #define RTW89_H2C_SCANOFLD_W0_BAND BIT(19)
2772 #define RTW89_H2C_SCANOFLD_W0_OPERATION GENMASK(21, 20)
2773 #define RTW89_H2C_SCANOFLD_W0_TARGET_CH_BAND GENMASK(23, 22)
2774 #define RTW89_H2C_SCANOFLD_W1_NOTIFY_END BIT(0)
2775 #define RTW89_H2C_SCANOFLD_W1_TARGET_CH_MODE BIT(1)
2776 #define RTW89_H2C_SCANOFLD_W1_START_MODE BIT(2)
2777 #define RTW89_H2C_SCANOFLD_W1_SCAN_TYPE GENMASK(4, 3)
2778 #define RTW89_H2C_SCANOFLD_W1_TARGET_CH_BW GENMASK(7, 5)
2779 #define RTW89_H2C_SCANOFLD_W1_TARGET_PRI_CH GENMASK(15, 8)
2780 #define RTW89_H2C_SCANOFLD_W1_TARGET_CENTRAL_CH GENMASK(23, 16)
2781 #define RTW89_H2C_SCANOFLD_W1_PROBE_REQ_PKT_ID GENMASK(31, 24)
2782 #define RTW89_H2C_SCANOFLD_W2_NORM_PD GENMASK(15, 0)
2783 #define RTW89_H2C_SCANOFLD_W2_SLOW_PD GENMASK(23, 16)
2784 #define RTW89_H2C_SCANOFLD_W3_TSF_HIGH GENMASK(31, 0)
2785 #define RTW89_H2C_SCANOFLD_W4_TSF_LOW GENMASK(31, 0)
2786 #define RTW89_H2C_SCANOFLD_W6_SECOND_MACID GENMASK(31, 24)
2787 
2788 struct rtw89_h2c_scanofld_be_macc_role {
2789 	__le32 w0;
2790 } __packed;
2791 
2792 #define RTW89_H2C_SCANOFLD_BE_MACC_ROLE_W0_BAND GENMASK(1, 0)
2793 #define RTW89_H2C_SCANOFLD_BE_MACC_ROLE_W0_PORT GENMASK(4, 2)
2794 #define RTW89_H2C_SCANOFLD_BE_MACC_ROLE_W0_MACID GENMASK(23, 8)
2795 #define RTW89_H2C_SCANOFLD_BE_MACC_ROLE_W0_OPCH_END GENMASK(31, 24)
2796 
2797 struct rtw89_h2c_scanofld_be_opch {
2798 	__le32 w0;
2799 	__le32 w1;
2800 	__le32 w2;
2801 	__le32 w3;
2802 	__le32 w4;
2803 } __packed;
2804 
2805 #define RTW89_H2C_SCANOFLD_BE_OPCH_W0_MACID GENMASK(15, 0)
2806 #define RTW89_H2C_SCANOFLD_BE_OPCH_W0_BAND GENMASK(17, 16)
2807 #define RTW89_H2C_SCANOFLD_BE_OPCH_W0_PORT GENMASK(20, 18)
2808 #define RTW89_H2C_SCANOFLD_BE_OPCH_W0_POLICY GENMASK(22, 21)
2809 #define RTW89_H2C_SCANOFLD_BE_OPCH_W0_TXNULL BIT(23)
2810 #define RTW89_H2C_SCANOFLD_BE_OPCH_W0_POLICY_VAL GENMASK(31, 24)
2811 #define RTW89_H2C_SCANOFLD_BE_OPCH_W1_DURATION GENMASK(7, 0)
2812 #define RTW89_H2C_SCANOFLD_BE_OPCH_W1_CH_BAND GENMASK(9, 8)
2813 #define RTW89_H2C_SCANOFLD_BE_OPCH_W1_BW GENMASK(12, 10)
2814 #define RTW89_H2C_SCANOFLD_BE_OPCH_W1_NOTIFY GENMASK(14, 13)
2815 #define RTW89_H2C_SCANOFLD_BE_OPCH_W1_PRI_CH GENMASK(23, 16)
2816 #define RTW89_H2C_SCANOFLD_BE_OPCH_W1_CENTRAL_CH GENMASK(31, 24)
2817 #define RTW89_H2C_SCANOFLD_BE_OPCH_W2_PKTS_CTRL GENMASK(7, 0)
2818 #define RTW89_H2C_SCANOFLD_BE_OPCH_W2_SW_DEF GENMASK(15, 8)
2819 #define RTW89_H2C_SCANOFLD_BE_OPCH_W2_SS GENMASK(18, 16)
2820 #define RTW89_H2C_SCANOFLD_BE_OPCH_W3_PKT0 GENMASK(7, 0)
2821 #define RTW89_H2C_SCANOFLD_BE_OPCH_W3_PKT1 GENMASK(15, 8)
2822 #define RTW89_H2C_SCANOFLD_BE_OPCH_W3_PKT2 GENMASK(23, 16)
2823 #define RTW89_H2C_SCANOFLD_BE_OPCH_W3_PKT3 GENMASK(31, 24)
2824 #define RTW89_H2C_SCANOFLD_BE_OPCH_W4_DURATION_V1 GENMASK(15, 0)
2825 
2826 struct rtw89_h2c_scanofld_be {
2827 	__le32 w0;
2828 	__le32 w1;
2829 	__le32 w2;
2830 	__le32 w3;
2831 	__le32 w4;
2832 	__le32 w5;
2833 	__le32 w6;
2834 	__le32 w7;
2835 	__le32 w8;
2836 	__le32 w9; /* Added after SCAN_OFFLOAD_BE_V1 */
2837 	/* struct rtw89_h2c_scanofld_be_macc_role (flexible number) */
2838 	/* struct rtw89_h2c_scanofld_be_opch (flexible number) */
2839 } __packed;
2840 
2841 #define RTW89_H2C_SCANOFLD_BE_W0_OP GENMASK(1, 0)
2842 #define RTW89_H2C_SCANOFLD_BE_W0_SCAN_MODE GENMASK(3, 2)
2843 #define RTW89_H2C_SCANOFLD_BE_W0_REPEAT GENMASK(5, 4)
2844 #define RTW89_H2C_SCANOFLD_BE_W0_NOTIFY_END BIT(6)
2845 #define RTW89_H2C_SCANOFLD_BE_W0_LEARN_CH BIT(7)
2846 #define RTW89_H2C_SCANOFLD_BE_W0_MACID GENMASK(23, 8)
2847 #define RTW89_H2C_SCANOFLD_BE_W0_PORT GENMASK(26, 24)
2848 #define RTW89_H2C_SCANOFLD_BE_W0_BAND GENMASK(28, 27)
2849 #define RTW89_H2C_SCANOFLD_BE_W0_PROBE_WITH_RATE BIT(29)
2850 #define RTW89_H2C_SCANOFLD_BE_W1_NUM_MACC_ROLE GENMASK(7, 0)
2851 #define RTW89_H2C_SCANOFLD_BE_W1_NUM_OP GENMASK(15, 8)
2852 #define RTW89_H2C_SCANOFLD_BE_W1_NORM_PD GENMASK(31, 16)
2853 #define RTW89_H2C_SCANOFLD_BE_W2_SLOW_PD GENMASK(15, 0)
2854 #define RTW89_H2C_SCANOFLD_BE_W2_NORM_CY GENMASK(23, 16)
2855 #define RTW89_H2C_SCANOFLD_BE_W2_OPCH_END GENMASK(31, 24)
2856 #define RTW89_H2C_SCANOFLD_BE_W3_NUM_SSID GENMASK(7, 0)
2857 #define RTW89_H2C_SCANOFLD_BE_W3_NUM_SHORT_SSID GENMASK(15, 8)
2858 #define RTW89_H2C_SCANOFLD_BE_W3_NUM_BSSID GENMASK(23, 16)
2859 #define RTW89_H2C_SCANOFLD_BE_W3_PROBEID GENMASK(31, 24)
2860 #define RTW89_H2C_SCANOFLD_BE_W4_PROBE_5G GENMASK(7, 0)
2861 #define RTW89_H2C_SCANOFLD_BE_W4_PROBE_6G GENMASK(15, 8)
2862 #define RTW89_H2C_SCANOFLD_BE_W4_DELAY_START GENMASK(31, 16)
2863 #define RTW89_H2C_SCANOFLD_BE_W5_MLO_MODE GENMASK(31, 0)
2864 #define RTW89_H2C_SCANOFLD_BE_W6_CHAN_PROHIB_LOW GENMASK(31, 0)
2865 #define RTW89_H2C_SCANOFLD_BE_W7_CHAN_PROHIB_HIGH GENMASK(31, 0)
2866 #define RTW89_H2C_SCANOFLD_BE_W8_PROBE_RATE_2GHZ GENMASK(7, 0)
2867 #define RTW89_H2C_SCANOFLD_BE_W8_PROBE_RATE_5GHZ GENMASK(15, 8)
2868 #define RTW89_H2C_SCANOFLD_BE_W8_PROBE_RATE_6GHZ GENMASK(23, 16)
2869 #define RTW89_H2C_SCANOFLD_BE_W9_SIZE_CFG GENMASK(7, 0)
2870 #define RTW89_H2C_SCANOFLD_BE_W9_SIZE_MACC GENMASK(15, 8)
2871 #define RTW89_H2C_SCANOFLD_BE_W9_SIZE_OP GENMASK(23, 16)
2872 
2873 struct rtw89_h2c_fwips {
2874 	__le32 w0;
2875 } __packed;
2876 
2877 #define RTW89_H2C_FW_IPS_W0_MACID GENMASK(7, 0)
2878 #define RTW89_H2C_FW_IPS_W0_ENABLE BIT(8)
2879 
2880 struct rtw89_h2c_mlo_link_cfg {
2881 	__le32 w0;
2882 };
2883 
2884 #define RTW89_H2C_MLO_LINK_CFG_W0_MACID GENMASK(15, 0)
2885 #define RTW89_H2C_MLO_LINK_CFG_W0_OPTION GENMASK(19, 16)
2886 
2887 static inline void RTW89_SET_FWCMD_P2P_MACID(void *cmd, u32 val)
2888 {
2889 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(7, 0));
2890 }
2891 
2892 static inline void RTW89_SET_FWCMD_P2P_P2PID(void *cmd, u32 val)
2893 {
2894 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(11, 8));
2895 }
2896 
2897 static inline void RTW89_SET_FWCMD_P2P_NOAID(void *cmd, u32 val)
2898 {
2899 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 12));
2900 }
2901 
2902 static inline void RTW89_SET_FWCMD_P2P_ACT(void *cmd, u32 val)
2903 {
2904 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(19, 16));
2905 }
2906 
2907 static inline void RTW89_SET_FWCMD_P2P_TYPE(void *cmd, u32 val)
2908 {
2909 	le32p_replace_bits((__le32 *)cmd, val, BIT(20));
2910 }
2911 
2912 static inline void RTW89_SET_FWCMD_P2P_ALL_SLEP(void *cmd, u32 val)
2913 {
2914 	le32p_replace_bits((__le32 *)cmd, val, BIT(21));
2915 }
2916 
2917 static inline void RTW89_SET_FWCMD_NOA_START_TIME(void *cmd, __le32 val)
2918 {
2919 	*((__le32 *)cmd + 1) = val;
2920 }
2921 
2922 static inline void RTW89_SET_FWCMD_NOA_INTERVAL(void *cmd, __le32 val)
2923 {
2924 	*((__le32 *)cmd + 2) = val;
2925 }
2926 
2927 static inline void RTW89_SET_FWCMD_NOA_DURATION(void *cmd, __le32 val)
2928 {
2929 	*((__le32 *)cmd + 3) = val;
2930 }
2931 
2932 static inline void RTW89_SET_FWCMD_NOA_COUNT(void *cmd, u32 val)
2933 {
2934 	le32p_replace_bits((__le32 *)(cmd) + 4, val, GENMASK(7, 0));
2935 }
2936 
2937 static inline void RTW89_SET_FWCMD_NOA_CTWINDOW(void *cmd, u32 val)
2938 {
2939 	u8 ctwnd;
2940 
2941 	if (!(val & IEEE80211_P2P_OPPPS_ENABLE_BIT))
2942 		return;
2943 	ctwnd = FIELD_GET(IEEE80211_P2P_OPPPS_CTWINDOW_MASK, val);
2944 	le32p_replace_bits((__le32 *)(cmd) + 4, ctwnd, GENMASK(23, 8));
2945 }
2946 
2947 static inline void RTW89_SET_FWCMD_TSF32_TOGL_BAND(void *cmd, u32 val)
2948 {
2949 	le32p_replace_bits((__le32 *)cmd, val, BIT(0));
2950 }
2951 
2952 static inline void RTW89_SET_FWCMD_TSF32_TOGL_EN(void *cmd, u32 val)
2953 {
2954 	le32p_replace_bits((__le32 *)cmd, val, BIT(1));
2955 }
2956 
2957 static inline void RTW89_SET_FWCMD_TSF32_TOGL_PORT(void *cmd, u32 val)
2958 {
2959 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(4, 2));
2960 }
2961 
2962 static inline void RTW89_SET_FWCMD_TSF32_TOGL_EARLY(void *cmd, u32 val)
2963 {
2964 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 16));
2965 }
2966 
2967 enum rtw89_fw_mcc_c2h_rpt_cfg {
2968 	RTW89_FW_MCC_C2H_RPT_OFF	= 0,
2969 	RTW89_FW_MCC_C2H_RPT_FAIL_ONLY	= 1,
2970 	RTW89_FW_MCC_C2H_RPT_ALL	= 2,
2971 };
2972 
2973 struct rtw89_fw_mcc_add_req {
2974 	u8 macid;
2975 	u8 central_ch_seg0;
2976 	u8 central_ch_seg1;
2977 	u8 primary_ch;
2978 	enum rtw89_bandwidth bandwidth: 4;
2979 	u32 group: 2;
2980 	u32 c2h_rpt: 2;
2981 	u32 dis_tx_null: 1;
2982 	u32 dis_sw_retry: 1;
2983 	u32 in_curr_ch: 1;
2984 	u32 sw_retry_count: 3;
2985 	u32 tx_null_early: 4;
2986 	u32 btc_in_2g: 1;
2987 	u32 pta_en: 1;
2988 	u32 rfk_by_pass: 1;
2989 	u32 ch_band_type: 2;
2990 	u32 rsvd0: 9;
2991 	u32 duration;
2992 	u8 courtesy_en;
2993 	u8 courtesy_num;
2994 	u8 courtesy_target;
2995 	u8 rsvd1;
2996 };
2997 
2998 static inline void RTW89_SET_FWCMD_ADD_MCC_MACID(void *cmd, u32 val)
2999 {
3000 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(7, 0));
3001 }
3002 
3003 static inline void RTW89_SET_FWCMD_ADD_MCC_CENTRAL_CH_SEG0(void *cmd, u32 val)
3004 {
3005 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 8));
3006 }
3007 
3008 static inline void RTW89_SET_FWCMD_ADD_MCC_CENTRAL_CH_SEG1(void *cmd, u32 val)
3009 {
3010 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(23, 16));
3011 }
3012 
3013 static inline void RTW89_SET_FWCMD_ADD_MCC_PRIMARY_CH(void *cmd, u32 val)
3014 {
3015 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 24));
3016 }
3017 
3018 static inline void RTW89_SET_FWCMD_ADD_MCC_BANDWIDTH(void *cmd, u32 val)
3019 {
3020 	le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(3, 0));
3021 }
3022 
3023 static inline void RTW89_SET_FWCMD_ADD_MCC_GROUP(void *cmd, u32 val)
3024 {
3025 	le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(5, 4));
3026 }
3027 
3028 static inline void RTW89_SET_FWCMD_ADD_MCC_C2H_RPT(void *cmd, u32 val)
3029 {
3030 	le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(7, 6));
3031 }
3032 
3033 static inline void RTW89_SET_FWCMD_ADD_MCC_DIS_TX_NULL(void *cmd, u32 val)
3034 {
3035 	le32p_replace_bits((__le32 *)cmd + 1, val, BIT(8));
3036 }
3037 
3038 static inline void RTW89_SET_FWCMD_ADD_MCC_DIS_SW_RETRY(void *cmd, u32 val)
3039 {
3040 	le32p_replace_bits((__le32 *)cmd + 1, val, BIT(9));
3041 }
3042 
3043 static inline void RTW89_SET_FWCMD_ADD_MCC_IN_CURR_CH(void *cmd, u32 val)
3044 {
3045 	le32p_replace_bits((__le32 *)cmd + 1, val, BIT(10));
3046 }
3047 
3048 static inline void RTW89_SET_FWCMD_ADD_MCC_SW_RETRY_COUNT(void *cmd, u32 val)
3049 {
3050 	le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(13, 11));
3051 }
3052 
3053 static inline void RTW89_SET_FWCMD_ADD_MCC_TX_NULL_EARLY(void *cmd, u32 val)
3054 {
3055 	le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(17, 14));
3056 }
3057 
3058 static inline void RTW89_SET_FWCMD_ADD_MCC_BTC_IN_2G(void *cmd, u32 val)
3059 {
3060 	le32p_replace_bits((__le32 *)cmd + 1, val, BIT(18));
3061 }
3062 
3063 static inline void RTW89_SET_FWCMD_ADD_MCC_PTA_EN(void *cmd, u32 val)
3064 {
3065 	le32p_replace_bits((__le32 *)cmd + 1, val, BIT(19));
3066 }
3067 
3068 static inline void RTW89_SET_FWCMD_ADD_MCC_RFK_BY_PASS(void *cmd, u32 val)
3069 {
3070 	le32p_replace_bits((__le32 *)cmd + 1, val, BIT(20));
3071 }
3072 
3073 static inline void RTW89_SET_FWCMD_ADD_MCC_CH_BAND_TYPE(void *cmd, u32 val)
3074 {
3075 	le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(22, 21));
3076 }
3077 
3078 static inline void RTW89_SET_FWCMD_ADD_MCC_DURATION(void *cmd, u32 val)
3079 {
3080 	le32p_replace_bits((__le32 *)cmd + 2, val, GENMASK(31, 0));
3081 }
3082 
3083 static inline void RTW89_SET_FWCMD_ADD_MCC_COURTESY_EN(void *cmd, u32 val)
3084 {
3085 	le32p_replace_bits((__le32 *)cmd + 3, val, BIT(0));
3086 }
3087 
3088 static inline void RTW89_SET_FWCMD_ADD_MCC_COURTESY_NUM(void *cmd, u32 val)
3089 {
3090 	le32p_replace_bits((__le32 *)cmd + 3, val, GENMASK(15, 8));
3091 }
3092 
3093 static inline void RTW89_SET_FWCMD_ADD_MCC_COURTESY_TARGET(void *cmd, u32 val)
3094 {
3095 	le32p_replace_bits((__le32 *)cmd + 3, val, GENMASK(23, 16));
3096 }
3097 
3098 enum rtw89_fw_mcc_old_group_actions {
3099 	RTW89_FW_MCC_OLD_GROUP_ACT_NONE = 0,
3100 	RTW89_FW_MCC_OLD_GROUP_ACT_REPLACE = 1,
3101 };
3102 
3103 struct rtw89_fw_mcc_start_req {
3104 	u32 group: 2;
3105 	u32 btc_in_group: 1;
3106 	u32 old_group_action: 2;
3107 	u32 old_group: 2;
3108 	u32 rsvd0: 9;
3109 	u32 notify_cnt: 3;
3110 	u32 rsvd1: 2;
3111 	u32 notify_rxdbg_en: 1;
3112 	u32 rsvd2: 2;
3113 	u32 macid: 8;
3114 	u32 tsf_low;
3115 	u32 tsf_high;
3116 };
3117 
3118 static inline void RTW89_SET_FWCMD_START_MCC_GROUP(void *cmd, u32 val)
3119 {
3120 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0));
3121 }
3122 
3123 static inline void RTW89_SET_FWCMD_START_MCC_BTC_IN_GROUP(void *cmd, u32 val)
3124 {
3125 	le32p_replace_bits((__le32 *)cmd, val, BIT(2));
3126 }
3127 
3128 static inline void RTW89_SET_FWCMD_START_MCC_OLD_GROUP_ACTION(void *cmd, u32 val)
3129 {
3130 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(4, 3));
3131 }
3132 
3133 static inline void RTW89_SET_FWCMD_START_MCC_OLD_GROUP(void *cmd, u32 val)
3134 {
3135 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(6, 5));
3136 }
3137 
3138 static inline void RTW89_SET_FWCMD_START_MCC_NOTIFY_CNT(void *cmd, u32 val)
3139 {
3140 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(18, 16));
3141 }
3142 
3143 static inline void RTW89_SET_FWCMD_START_MCC_NOTIFY_RXDBG_EN(void *cmd, u32 val)
3144 {
3145 	le32p_replace_bits((__le32 *)cmd, val, BIT(21));
3146 }
3147 
3148 static inline void RTW89_SET_FWCMD_START_MCC_MACID(void *cmd, u32 val)
3149 {
3150 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 24));
3151 }
3152 
3153 static inline void RTW89_SET_FWCMD_START_MCC_TSF_LOW(void *cmd, u32 val)
3154 {
3155 	le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(31, 0));
3156 }
3157 
3158 static inline void RTW89_SET_FWCMD_START_MCC_TSF_HIGH(void *cmd, u32 val)
3159 {
3160 	le32p_replace_bits((__le32 *)cmd + 2, val, GENMASK(31, 0));
3161 }
3162 
3163 static inline void RTW89_SET_FWCMD_STOP_MCC_MACID(void *cmd, u32 val)
3164 {
3165 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(7, 0));
3166 }
3167 
3168 static inline void RTW89_SET_FWCMD_STOP_MCC_GROUP(void *cmd, u32 val)
3169 {
3170 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(9, 8));
3171 }
3172 
3173 static inline void RTW89_SET_FWCMD_STOP_MCC_PREV_GROUPS(void *cmd, u32 val)
3174 {
3175 	le32p_replace_bits((__le32 *)cmd, val, BIT(10));
3176 }
3177 
3178 static inline void RTW89_SET_FWCMD_DEL_MCC_GROUP_GROUP(void *cmd, u32 val)
3179 {
3180 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0));
3181 }
3182 
3183 static inline void RTW89_SET_FWCMD_DEL_MCC_GROUP_PREV_GROUPS(void *cmd, u32 val)
3184 {
3185 	le32p_replace_bits((__le32 *)cmd, val, BIT(2));
3186 }
3187 
3188 static inline void RTW89_SET_FWCMD_RESET_MCC_GROUP_GROUP(void *cmd, u32 val)
3189 {
3190 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0));
3191 }
3192 
3193 struct rtw89_fw_mcc_tsf_req {
3194 	u8 group: 2;
3195 	u8 rsvd0: 6;
3196 	u8 macid_x;
3197 	u8 macid_y;
3198 	u8 rsvd1;
3199 };
3200 
3201 static inline void RTW89_SET_FWCMD_MCC_REQ_TSF_GROUP(void *cmd, u32 val)
3202 {
3203 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0));
3204 }
3205 
3206 static inline void RTW89_SET_FWCMD_MCC_REQ_TSF_MACID_X(void *cmd, u32 val)
3207 {
3208 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 8));
3209 }
3210 
3211 static inline void RTW89_SET_FWCMD_MCC_REQ_TSF_MACID_Y(void *cmd, u32 val)
3212 {
3213 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(23, 16));
3214 }
3215 
3216 static inline void RTW89_SET_FWCMD_MCC_MACID_BITMAP_GROUP(void *cmd, u32 val)
3217 {
3218 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0));
3219 }
3220 
3221 static inline void RTW89_SET_FWCMD_MCC_MACID_BITMAP_MACID(void *cmd, u32 val)
3222 {
3223 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 8));
3224 }
3225 
3226 static inline void RTW89_SET_FWCMD_MCC_MACID_BITMAP_BITMAP_LENGTH(void *cmd, u32 val)
3227 {
3228 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(23, 16));
3229 }
3230 
3231 static inline void RTW89_SET_FWCMD_MCC_MACID_BITMAP_BITMAP(void *cmd,
3232 							   u8 *bitmap, u8 len)
3233 {
3234 	memcpy((__le32 *)cmd + 1, bitmap, len);
3235 }
3236 
3237 static inline void RTW89_SET_FWCMD_MCC_SYNC_GROUP(void *cmd, u32 val)
3238 {
3239 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0));
3240 }
3241 
3242 static inline void RTW89_SET_FWCMD_MCC_SYNC_MACID_SOURCE(void *cmd, u32 val)
3243 {
3244 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 8));
3245 }
3246 
3247 static inline void RTW89_SET_FWCMD_MCC_SYNC_MACID_TARGET(void *cmd, u32 val)
3248 {
3249 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(23, 16));
3250 }
3251 
3252 static inline void RTW89_SET_FWCMD_MCC_SYNC_SYNC_OFFSET(void *cmd, u32 val)
3253 {
3254 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 24));
3255 }
3256 
3257 struct rtw89_fw_mcc_duration {
3258 	u32 group: 2;
3259 	u32 btc_in_group: 1;
3260 	u32 rsvd0: 5;
3261 	u32 start_macid: 8;
3262 	u32 macid_x: 8;
3263 	u32 macid_y: 8;
3264 	u32 start_tsf_low;
3265 	u32 start_tsf_high;
3266 	u32 duration_x;
3267 	u32 duration_y;
3268 };
3269 
3270 static inline void RTW89_SET_FWCMD_MCC_SET_DURATION_GROUP(void *cmd, u32 val)
3271 {
3272 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0));
3273 }
3274 
3275 static
3276 inline void RTW89_SET_FWCMD_MCC_SET_DURATION_BTC_IN_GROUP(void *cmd, u32 val)
3277 {
3278 	le32p_replace_bits((__le32 *)cmd, val, BIT(2));
3279 }
3280 
3281 static
3282 inline void RTW89_SET_FWCMD_MCC_SET_DURATION_START_MACID(void *cmd, u32 val)
3283 {
3284 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 8));
3285 }
3286 
3287 static inline void RTW89_SET_FWCMD_MCC_SET_DURATION_MACID_X(void *cmd, u32 val)
3288 {
3289 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(23, 16));
3290 }
3291 
3292 static inline void RTW89_SET_FWCMD_MCC_SET_DURATION_MACID_Y(void *cmd, u32 val)
3293 {
3294 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 24));
3295 }
3296 
3297 static
3298 inline void RTW89_SET_FWCMD_MCC_SET_DURATION_START_TSF_LOW(void *cmd, u32 val)
3299 {
3300 	le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(31, 0));
3301 }
3302 
3303 static
3304 inline void RTW89_SET_FWCMD_MCC_SET_DURATION_START_TSF_HIGH(void *cmd, u32 val)
3305 {
3306 	le32p_replace_bits((__le32 *)cmd + 2, val, GENMASK(31, 0));
3307 }
3308 
3309 static
3310 inline void RTW89_SET_FWCMD_MCC_SET_DURATION_DURATION_X(void *cmd, u32 val)
3311 {
3312 	le32p_replace_bits((__le32 *)cmd + 3, val, GENMASK(31, 0));
3313 }
3314 
3315 static
3316 inline void RTW89_SET_FWCMD_MCC_SET_DURATION_DURATION_Y(void *cmd, u32 val)
3317 {
3318 	le32p_replace_bits((__le32 *)cmd + 4, val, GENMASK(31, 0));
3319 }
3320 
3321 enum rtw89_h2c_mrc_sch_types {
3322 	RTW89_H2C_MRC_SCH_BAND0_ONLY = 0,
3323 	RTW89_H2C_MRC_SCH_BAND1_ONLY = 1,
3324 	RTW89_H2C_MRC_SCH_DUAL_BAND = 2,
3325 };
3326 
3327 enum rtw89_h2c_mrc_role_types {
3328 	RTW89_H2C_MRC_ROLE_WIFI = 0,
3329 	RTW89_H2C_MRC_ROLE_BT = 1,
3330 	RTW89_H2C_MRC_ROLE_EMPTY = 2,
3331 };
3332 
3333 #define RTW89_MAC_MRC_MAX_ADD_SLOT_NUM 3
3334 #define RTW89_MAC_MRC_MAX_ADD_ROLE_NUM_PER_SLOT 1 /* before MLO */
3335 
3336 struct rtw89_fw_mrc_add_slot_arg {
3337 	u16 duration; /* unit: TU */
3338 	bool courtesy_en;
3339 	u8 courtesy_period;
3340 	u8 courtesy_target; /* slot idx */
3341 
3342 	unsigned int role_num;
3343 	struct {
3344 		enum rtw89_h2c_mrc_role_types role_type;
3345 		bool is_master;
3346 		bool en_tx_null;
3347 		enum rtw89_band band;
3348 		enum rtw89_bandwidth bw;
3349 		u8 macid;
3350 		u8 central_ch;
3351 		u8 primary_ch;
3352 		u8 null_early; /* unit: TU */
3353 
3354 		/* if MLD, for macid: [0, chip::support_mld_num)
3355 		 * otherwise, for macid: [0, 32)
3356 		 */
3357 		u32 macid_main_bitmap;
3358 		/* for MLD, bit X maps to macid: X + chip::support_mld_num */
3359 		u32 macid_paired_bitmap;
3360 	} roles[RTW89_MAC_MRC_MAX_ADD_ROLE_NUM_PER_SLOT];
3361 };
3362 
3363 struct rtw89_fw_mrc_add_arg {
3364 	u8 sch_idx;
3365 	enum rtw89_h2c_mrc_sch_types sch_type;
3366 	bool btc_in_sch;
3367 
3368 	unsigned int slot_num;
3369 	struct rtw89_fw_mrc_add_slot_arg slots[RTW89_MAC_MRC_MAX_ADD_SLOT_NUM];
3370 };
3371 
3372 struct rtw89_h2c_mrc_add_role {
3373 	__le32 w0;
3374 	__le32 w1;
3375 	__le32 w2;
3376 	__le32 macid_main_bitmap;
3377 	__le32 macid_paired_bitmap;
3378 } __packed;
3379 
3380 #define RTW89_H2C_MRC_ADD_ROLE_W0_MACID GENMASK(15, 0)
3381 #define RTW89_H2C_MRC_ADD_ROLE_W0_ROLE_TYPE GENMASK(23, 16)
3382 #define RTW89_H2C_MRC_ADD_ROLE_W0_IS_MASTER BIT(24)
3383 #define RTW89_H2C_MRC_ADD_ROLE_W0_IS_ALT_ROLE BIT(25)
3384 #define RTW89_H2C_MRC_ADD_ROLE_W0_TX_NULL_EN BIT(26)
3385 #define RTW89_H2C_MRC_ADD_ROLE_W0_ROLE_ALT_EN BIT(27)
3386 #define RTW89_H2C_MRC_ADD_ROLE_W1_CENTRAL_CH_SEG GENMASK(7, 0)
3387 #define RTW89_H2C_MRC_ADD_ROLE_W1_PRI_CH GENMASK(15, 8)
3388 #define RTW89_H2C_MRC_ADD_ROLE_W1_BW GENMASK(19, 16)
3389 #define RTW89_H2C_MRC_ADD_ROLE_W1_CH_BAND_TYPE GENMASK(21, 20)
3390 #define RTW89_H2C_MRC_ADD_ROLE_W1_RFK_BY_PASS BIT(22)
3391 #define RTW89_H2C_MRC_ADD_ROLE_W1_CAN_BTC BIT(23)
3392 #define RTW89_H2C_MRC_ADD_ROLE_W1_NULL_EARLY GENMASK(31, 24)
3393 #define RTW89_H2C_MRC_ADD_ROLE_W2_ALT_PERIOD GENMASK(7, 0)
3394 #define RTW89_H2C_MRC_ADD_ROLE_W2_ALT_ROLE_TYPE GENMASK(15, 8)
3395 #define RTW89_H2C_MRC_ADD_ROLE_W2_ALT_ROLE_MACID GENMASK(23, 16)
3396 
3397 struct rtw89_h2c_mrc_add_slot {
3398 	__le32 w0;
3399 	__le32 w1;
3400 	struct rtw89_h2c_mrc_add_role roles[];
3401 } __packed;
3402 
3403 #define RTW89_H2C_MRC_ADD_SLOT_W0_DURATION GENMASK(15, 0)
3404 #define RTW89_H2C_MRC_ADD_SLOT_W0_COURTESY_EN BIT(17)
3405 #define RTW89_H2C_MRC_ADD_SLOT_W0_ROLE_NUM GENMASK(31, 24)
3406 #define RTW89_H2C_MRC_ADD_SLOT_W1_COURTESY_PERIOD GENMASK(7, 0)
3407 #define RTW89_H2C_MRC_ADD_SLOT_W1_COURTESY_TARGET GENMASK(15, 8)
3408 
3409 struct rtw89_h2c_mrc_add {
3410 	__le32 w0;
3411 	/* Logically append flexible struct rtw89_h2c_mrc_add_slot, but there
3412 	 * are other flexible array inside it. We cannot access them correctly
3413 	 * through this struct. So, in case misusing, we don't really declare
3414 	 * it here.
3415 	 */
3416 } __packed;
3417 
3418 #define RTW89_H2C_MRC_ADD_W0_SCH_IDX GENMASK(3, 0)
3419 #define RTW89_H2C_MRC_ADD_W0_SCH_TYPE GENMASK(7, 4)
3420 #define RTW89_H2C_MRC_ADD_W0_SLOT_NUM GENMASK(15, 8)
3421 #define RTW89_H2C_MRC_ADD_W0_BTC_IN_SCH BIT(16)
3422 
3423 enum rtw89_h2c_mrc_start_actions {
3424 	RTW89_H2C_MRC_START_ACTION_START_NEW = 0,
3425 	RTW89_H2C_MRC_START_ACTION_REPLACE_OLD = 1,
3426 };
3427 
3428 struct rtw89_fw_mrc_start_arg {
3429 	u8 sch_idx;
3430 	u8 old_sch_idx;
3431 	u64 start_tsf;
3432 	enum rtw89_h2c_mrc_start_actions action;
3433 };
3434 
3435 struct rtw89_h2c_mrc_start {
3436 	__le32 w0;
3437 	__le32 start_tsf_low;
3438 	__le32 start_tsf_high;
3439 } __packed;
3440 
3441 #define RTW89_H2C_MRC_START_W0_SCH_IDX GENMASK(3, 0)
3442 #define RTW89_H2C_MRC_START_W0_OLD_SCH_IDX GENMASK(7, 4)
3443 #define RTW89_H2C_MRC_START_W0_ACTION GENMASK(15, 8)
3444 
3445 struct rtw89_h2c_mrc_del {
3446 	__le32 w0;
3447 } __packed;
3448 
3449 #define RTW89_H2C_MRC_DEL_W0_SCH_IDX GENMASK(3, 0)
3450 #define RTW89_H2C_MRC_DEL_W0_DEL_ALL BIT(4)
3451 #define RTW89_H2C_MRC_DEL_W0_STOP_ONLY BIT(5)
3452 #define RTW89_H2C_MRC_DEL_W0_SPECIFIC_ROLE_EN BIT(6)
3453 #define RTW89_H2C_MRC_DEL_W0_STOP_SLOT_IDX GENMASK(15, 8)
3454 #define RTW89_H2C_MRC_DEL_W0_SPECIFIC_ROLE_MACID GENMASK(31, 16)
3455 
3456 #define RTW89_MAC_MRC_MAX_REQ_TSF_NUM 2
3457 
3458 struct rtw89_fw_mrc_req_tsf_arg {
3459 	unsigned int num;
3460 	struct {
3461 		u8 band;
3462 		u8 port;
3463 	} infos[RTW89_MAC_MRC_MAX_REQ_TSF_NUM];
3464 };
3465 
3466 struct rtw89_h2c_mrc_req_tsf {
3467 	u8 req_tsf_num;
3468 	u8 infos[] __counted_by(req_tsf_num);
3469 } __packed;
3470 
3471 #define RTW89_H2C_MRC_REQ_TSF_INFO_BAND GENMASK(3, 0)
3472 #define RTW89_H2C_MRC_REQ_TSF_INFO_PORT GENMASK(7, 4)
3473 
3474 enum rtw89_h2c_mrc_upd_bitmap_actions {
3475 	RTW89_H2C_MRC_UPD_BITMAP_ACTION_DEL = 0,
3476 	RTW89_H2C_MRC_UPD_BITMAP_ACTION_ADD = 1,
3477 };
3478 
3479 struct rtw89_fw_mrc_upd_bitmap_arg {
3480 	u8 sch_idx;
3481 	u8 macid;
3482 	u8 client_macid;
3483 	enum rtw89_h2c_mrc_upd_bitmap_actions action;
3484 };
3485 
3486 struct rtw89_h2c_mrc_upd_bitmap {
3487 	__le32 w0;
3488 	__le32 w1;
3489 } __packed;
3490 
3491 #define RTW89_H2C_MRC_UPD_BITMAP_W0_SCH_IDX GENMASK(3, 0)
3492 #define RTW89_H2C_MRC_UPD_BITMAP_W0_ACTION BIT(4)
3493 #define RTW89_H2C_MRC_UPD_BITMAP_W0_MACID GENMASK(31, 16)
3494 #define RTW89_H2C_MRC_UPD_BITMAP_W1_CLIENT_MACID GENMASK(15, 0)
3495 
3496 struct rtw89_fw_mrc_sync_arg {
3497 	u8 offset; /* unit: TU */
3498 	struct {
3499 		u8 band;
3500 		u8 port;
3501 	} src, dest;
3502 };
3503 
3504 struct rtw89_h2c_mrc_sync {
3505 	__le32 w0;
3506 	__le32 w1;
3507 } __packed;
3508 
3509 #define RTW89_H2C_MRC_SYNC_W0_SYNC_EN BIT(0)
3510 #define RTW89_H2C_MRC_SYNC_W0_SRC_PORT GENMASK(11, 8)
3511 #define RTW89_H2C_MRC_SYNC_W0_SRC_BAND GENMASK(15, 12)
3512 #define RTW89_H2C_MRC_SYNC_W0_DEST_PORT GENMASK(19, 16)
3513 #define RTW89_H2C_MRC_SYNC_W0_DEST_BAND GENMASK(23, 20)
3514 #define RTW89_H2C_MRC_SYNC_W1_OFFSET GENMASK(15, 0)
3515 
3516 struct rtw89_fw_mrc_upd_duration_arg {
3517 	u8 sch_idx;
3518 	u64 start_tsf;
3519 
3520 	unsigned int slot_num;
3521 	struct {
3522 		u8 slot_idx;
3523 		u16 duration; /* unit: TU */
3524 	} slots[RTW89_MAC_MRC_MAX_ADD_SLOT_NUM];
3525 };
3526 
3527 struct rtw89_h2c_mrc_upd_duration {
3528 	__le32 w0;
3529 	__le32 start_tsf_low;
3530 	__le32 start_tsf_high;
3531 	__le32 slots[];
3532 } __packed;
3533 
3534 #define RTW89_H2C_MRC_UPD_DURATION_W0_SCH_IDX GENMASK(3, 0)
3535 #define RTW89_H2C_MRC_UPD_DURATION_W0_SLOT_NUM GENMASK(15, 8)
3536 #define RTW89_H2C_MRC_UPD_DURATION_W0_BTC_IN_SCH BIT(16)
3537 #define RTW89_H2C_MRC_UPD_DURATION_SLOT_SLOT_IDX GENMASK(7, 0)
3538 #define RTW89_H2C_MRC_UPD_DURATION_SLOT_DURATION GENMASK(31, 16)
3539 
3540 struct rtw89_h2c_wow_aoac {
3541 	__le32 w0;
3542 } __packed;
3543 
3544 struct rtw89_h2c_ap_info {
3545 	__le32 w0;
3546 } __packed;
3547 
3548 #define RTW89_H2C_AP_INFO_W0_PWR_INT_EN BIT(0)
3549 
3550 #define RTW89_C2H_HEADER_LEN 8
3551 
3552 struct rtw89_c2h_hdr {
3553 	__le32 w0;
3554 	__le32 w1;
3555 } __packed;
3556 
3557 #define RTW89_C2H_HDR_W0_CATEGORY GENMASK(1, 0)
3558 #define RTW89_C2H_HDR_W0_CLASS GENMASK(7, 2)
3559 #define RTW89_C2H_HDR_W0_FUNC GENMASK(15, 8)
3560 #define RTW89_C2H_HDR_W1_LEN GENMASK(13, 0)
3561 
3562 struct rtw89_fw_c2h_attr {
3563 	u8 category;
3564 	u8 class;
3565 	u8 func;
3566 	u16 len;
3567 };
3568 
3569 static inline struct rtw89_fw_c2h_attr *RTW89_SKB_C2H_CB(struct sk_buff *skb)
3570 {
3571 	static_assert(sizeof(skb->cb) >= sizeof(struct rtw89_fw_c2h_attr));
3572 
3573 	return (struct rtw89_fw_c2h_attr *)skb->cb;
3574 }
3575 
3576 struct rtw89_c2h_done_ack {
3577 	__le32 w0;
3578 	__le32 w1;
3579 	__le32 w2;
3580 } __packed;
3581 
3582 #define RTW89_C2H_DONE_ACK_W2_CAT GENMASK(1, 0)
3583 #define RTW89_C2H_DONE_ACK_W2_CLASS GENMASK(7, 2)
3584 #define RTW89_C2H_DONE_ACK_W2_FUNC GENMASK(15, 8)
3585 #define RTW89_C2H_DONE_ACK_W2_H2C_RETURN GENMASK(23, 16)
3586 #define	RTW89_C2H_SCAN_DONE_ACK_RETURN GENMASK(5, 0)
3587 #define RTW89_C2H_DONE_ACK_W2_H2C_SEQ GENMASK(31, 24)
3588 
3589 #define RTW89_GET_MAC_C2H_REV_ACK_CAT(c2h) \
3590 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(1, 0))
3591 #define RTW89_GET_MAC_C2H_REV_ACK_CLASS(c2h) \
3592 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(7, 2))
3593 #define RTW89_GET_MAC_C2H_REV_ACK_FUNC(c2h) \
3594 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(15, 8))
3595 #define RTW89_GET_MAC_C2H_REV_ACK_H2C_SEQ(c2h) \
3596 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(23, 16))
3597 
3598 struct rtw89_fw_c2h_log_fmt {
3599 	__le16 signature;
3600 	u8 feature;
3601 	u8 syntax;
3602 	__le32 fmt_id;
3603 	u8 file_num;
3604 	__le16 line_num;
3605 	u8 argc;
3606 	union {
3607 		DECLARE_FLEX_ARRAY(u8, raw);
3608 		DECLARE_FLEX_ARRAY(__le32, argv);
3609 	} __packed u;
3610 } __packed;
3611 
3612 #define RTW89_C2H_FW_FORMATTED_LOG_MIN_LEN 11
3613 #define RTW89_C2H_FW_LOG_FEATURE_PARA_INT BIT(2)
3614 #define RTW89_C2H_FW_LOG_MAX_PARA_NUM 16
3615 #define RTW89_C2H_FW_LOG_SIGNATURE 0xA5A5
3616 #define RTW89_C2H_FW_LOG_STR_BUF_SIZE 512
3617 
3618 struct rtw89_c2h_mac_bcnfltr_rpt {
3619 	__le32 w0;
3620 	__le32 w1;
3621 	__le32 w2;
3622 } __packed;
3623 
3624 #define RTW89_C2H_MAC_BCNFLTR_RPT_W2_MACID GENMASK(7, 0)
3625 #define RTW89_C2H_MAC_BCNFLTR_RPT_W2_TYPE GENMASK(9, 8)
3626 #define RTW89_C2H_MAC_BCNFLTR_RPT_W2_EVENT GENMASK(11, 10)
3627 #define RTW89_C2H_MAC_BCNFLTR_RPT_W2_MA GENMASK(23, 16)
3628 
3629 struct rtw89_c2h_ra_rpt {
3630 	struct rtw89_c2h_hdr hdr;
3631 	__le32 w2;
3632 	__le32 w3;
3633 } __packed;
3634 
3635 #define RTW89_C2H_RA_RPT_W2_MACID GENMASK(15, 0)
3636 #define RTW89_C2H_RA_RPT_W2_RETRY_RATIO GENMASK(23, 16)
3637 #define RTW89_C2H_RA_RPT_W2_MCSNSS_B7 BIT(31)
3638 #define RTW89_C2H_RA_RPT_W3_MCSNSS GENMASK(6, 0)
3639 #define RTW89_C2H_RA_RPT_W3_MD_SEL GENMASK(9, 8)
3640 #define RTW89_C2H_RA_RPT_W3_GILTF GENMASK(12, 10)
3641 #define RTW89_C2H_RA_RPT_W3_BW GENMASK(14, 13)
3642 #define RTW89_C2H_RA_RPT_W3_MD_SEL_B2 BIT(15)
3643 #define RTW89_C2H_RA_RPT_W3_BW_B2 BIT(16)
3644 
3645 struct rtw89_c2h_fw_scan_rpt {
3646 	struct rtw89_c2h_hdr hdr;
3647 	u8 phy_idx;
3648 	u8 band;
3649 	u8 center_ch;
3650 	u8 ofdm_pd_idx; /* in unit of 2 dBm */
3651 #define PD_LOWER_BOUND_BASE 102
3652 	s8 cck_pd_idx;
3653 	u8 rsvd0;
3654 	u8 rsvd1;
3655 	u8 rsvd2;
3656 } __packed;
3657 
3658 /* For WiFi 6 chips:
3659  *   VHT, HE, HT-old: [6:4]: NSS, [3:0]: MCS
3660  *   HT-new: [6:5]: NA, [4:0]: MCS
3661  * For WiFi 7 chips (V1):
3662  *   HT, VHT, HE, EHT: [7:5]: NSS, [4:0]: MCS
3663  */
3664 #define RTW89_RA_RATE_MASK_NSS GENMASK(6, 4)
3665 #define RTW89_RA_RATE_MASK_MCS GENMASK(3, 0)
3666 #define RTW89_RA_RATE_MASK_NSS_V1 GENMASK(7, 5)
3667 #define RTW89_RA_RATE_MASK_MCS_V1 GENMASK(4, 0)
3668 #define RTW89_RA_RATE_MASK_HT_MCS GENMASK(4, 0)
3669 #define RTW89_MK_HT_RATE(nss, mcs) (FIELD_PREP(GENMASK(4, 3), nss) | \
3670 				    FIELD_PREP(GENMASK(2, 0), mcs))
3671 
3672 #define RTW89_GET_MAC_C2H_PKTOFLD_ID(c2h) \
3673 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(7, 0))
3674 #define RTW89_GET_MAC_C2H_PKTOFLD_OP(c2h) \
3675 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(10, 8))
3676 #define RTW89_GET_MAC_C2H_PKTOFLD_LEN(c2h) \
3677 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(31, 16))
3678 
3679 struct rtw89_c2h_scanofld {
3680 	__le32 w0;
3681 	__le32 w1;
3682 	__le32 w2;
3683 	__le32 w3;
3684 	__le32 w4;
3685 	__le32 w5;
3686 	__le32 w6;
3687 	__le32 w7;
3688 	__le32 w8;
3689 } __packed;
3690 
3691 #define RTW89_C2H_SCANOFLD_W2_PRI_CH GENMASK(7, 0)
3692 #define RTW89_C2H_SCANOFLD_W2_RSN GENMASK(19, 16)
3693 #define RTW89_C2H_SCANOFLD_W2_STATUS GENMASK(23, 20)
3694 #define RTW89_C2H_SCANOFLD_W2_PERIOD GENMASK(31, 24)
3695 #define RTW89_C2H_SCANOFLD_W5_TX_FAIL GENMASK(3, 0)
3696 #define RTW89_C2H_SCANOFLD_W5_AIR_DENSITY GENMASK(7, 4)
3697 #define RTW89_C2H_SCANOFLD_W5_BAND GENMASK(25, 24)
3698 #define RTW89_C2H_SCANOFLD_W5_MAC_IDX BIT(26)
3699 #define RTW89_C2H_SCANOFLD_W6_SW_DEF GENMASK(7, 0)
3700 #define RTW89_C2H_SCANOFLD_W6_EXPECT_PERIOD GENMASK(15, 8)
3701 #define RTW89_C2H_SCANOFLD_W6_FW_DEF GENMASK(23, 16)
3702 #define RTW89_C2H_SCANOFLD_W7_REPORT_TSF GENMASK(31, 0)
3703 #define RTW89_C2H_SCANOFLD_W8_PERIOD_V1 GENMASK(15, 0)
3704 #define RTW89_C2H_SCANOFLD_W8_EXPECT_PERIOD_V1 GENMASK(31, 16)
3705 
3706 #define RTW89_GET_MAC_C2H_MCC_RCV_ACK_GROUP(c2h) \
3707 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(1, 0))
3708 #define RTW89_GET_MAC_C2H_MCC_RCV_ACK_H2C_FUNC(c2h) \
3709 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(15, 8))
3710 
3711 #define RTW89_GET_MAC_C2H_MCC_REQ_ACK_GROUP(c2h) \
3712 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(1, 0))
3713 #define RTW89_GET_MAC_C2H_MCC_REQ_ACK_H2C_RETURN(c2h) \
3714 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(7, 2))
3715 #define RTW89_GET_MAC_C2H_MCC_REQ_ACK_H2C_FUNC(c2h) \
3716 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(15, 8))
3717 
3718 struct rtw89_mac_mcc_tsf_rpt {
3719 	u32 macid_x;
3720 	u32 macid_y;
3721 	u32 tsf_x_low;
3722 	u32 tsf_x_high;
3723 	u32 tsf_y_low;
3724 	u32 tsf_y_high;
3725 };
3726 
3727 static_assert(sizeof(struct rtw89_mac_mcc_tsf_rpt) <= RTW89_COMPLETION_BUF_SIZE);
3728 
3729 #define RTW89_GET_MAC_C2H_MCC_TSF_RPT_MACID_X(c2h) \
3730 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(7, 0))
3731 #define RTW89_GET_MAC_C2H_MCC_TSF_RPT_MACID_Y(c2h) \
3732 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(15, 8))
3733 #define RTW89_GET_MAC_C2H_MCC_TSF_RPT_GROUP(c2h) \
3734 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(17, 16))
3735 #define RTW89_GET_MAC_C2H_MCC_TSF_RPT_TSF_LOW_X(c2h) \
3736 	le32_get_bits(*((const __le32 *)(c2h) + 3), GENMASK(31, 0))
3737 #define RTW89_GET_MAC_C2H_MCC_TSF_RPT_TSF_HIGH_X(c2h) \
3738 	le32_get_bits(*((const __le32 *)(c2h) + 4), GENMASK(31, 0))
3739 #define RTW89_GET_MAC_C2H_MCC_TSF_RPT_TSF_LOW_Y(c2h) \
3740 	le32_get_bits(*((const __le32 *)(c2h) + 5), GENMASK(31, 0))
3741 #define RTW89_GET_MAC_C2H_MCC_TSF_RPT_TSF_HIGH_Y(c2h) \
3742 	le32_get_bits(*((const __le32 *)(c2h) + 6), GENMASK(31, 0))
3743 
3744 #define RTW89_GET_MAC_C2H_MCC_STATUS_RPT_STATUS(c2h) \
3745 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(5, 0))
3746 #define RTW89_GET_MAC_C2H_MCC_STATUS_RPT_GROUP(c2h) \
3747 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(7, 6))
3748 #define RTW89_GET_MAC_C2H_MCC_STATUS_RPT_MACID(c2h) \
3749 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(15, 8))
3750 #define RTW89_GET_MAC_C2H_MCC_STATUS_RPT_TSF_LOW(c2h) \
3751 	le32_get_bits(*((const __le32 *)(c2h) + 3), GENMASK(31, 0))
3752 #define RTW89_GET_MAC_C2H_MCC_STATUS_RPT_TSF_HIGH(c2h) \
3753 	le32_get_bits(*((const __le32 *)(c2h) + 4), GENMASK(31, 0))
3754 
3755 struct rtw89_c2h_mlo_link_cfg_rpt {
3756 	struct rtw89_c2h_hdr hdr;
3757 	__le32 w2;
3758 } __packed;
3759 
3760 #define RTW89_C2H_MLO_LINK_CFG_RPT_W2_MACID GENMASK(15, 0)
3761 #define RTW89_C2H_MLO_LINK_CFG_RPT_W2_STATUS GENMASK(19, 16)
3762 
3763 enum rtw89_c2h_mlo_link_status {
3764 	RTW89_C2H_MLO_LINK_CFG_IDLE = 0,
3765 	RTW89_C2H_MLO_LINK_CFG_DONE = 1,
3766 	RTW89_C2H_MLO_LINK_CFG_ISSUE_NULL_FAIL = 2,
3767 	RTW89_C2H_MLO_LINK_CFG_TX_NULL_FAIL = 3,
3768 	RTW89_C2H_MLO_LINK_CFG_ROLE_NOT_EXIST = 4,
3769 	RTW89_C2H_MLO_LINK_CFG_NULL_1_TIMEOUT = 5,
3770 	RTW89_C2H_MLO_LINK_CFG_NULL_0_TIMEOUT = 6,
3771 	RTW89_C2H_MLO_LINK_CFG_RUNNING = 0xff,
3772 };
3773 
3774 struct rtw89_mac_mrc_tsf_rpt {
3775 	unsigned int num;
3776 	u64 tsfs[RTW89_MAC_MRC_MAX_REQ_TSF_NUM];
3777 };
3778 
3779 static_assert(sizeof(struct rtw89_mac_mrc_tsf_rpt) <= RTW89_COMPLETION_BUF_SIZE);
3780 
3781 struct rtw89_c2h_mrc_tsf_rpt_info {
3782 	__le32 tsf_low;
3783 	__le32 tsf_high;
3784 } __packed;
3785 
3786 struct rtw89_c2h_mrc_tsf_rpt {
3787 	struct rtw89_c2h_hdr hdr;
3788 	__le32 w2;
3789 	struct rtw89_c2h_mrc_tsf_rpt_info infos[];
3790 } __packed;
3791 
3792 #define RTW89_C2H_MRC_TSF_RPT_W2_REQ_TSF_NUM GENMASK(7, 0)
3793 
3794 struct rtw89_c2h_mrc_status_rpt {
3795 	struct rtw89_c2h_hdr hdr;
3796 	__le32 w2;
3797 	__le32 tsf_low;
3798 	__le32 tsf_high;
3799 } __packed;
3800 
3801 #define RTW89_C2H_MRC_STATUS_RPT_W2_STATUS GENMASK(5, 0)
3802 #define RTW89_C2H_MRC_STATUS_RPT_W2_SCH_IDX GENMASK(7, 6)
3803 
3804 struct rtw89_c2h_pkt_ofld_rsp {
3805 	__le32 w0;
3806 	__le32 w1;
3807 	__le32 w2;
3808 } __packed;
3809 
3810 #define RTW89_C2H_PKT_OFLD_RSP_W2_PTK_ID GENMASK(7, 0)
3811 #define RTW89_C2H_PKT_OFLD_RSP_W2_PTK_OP GENMASK(10, 8)
3812 #define RTW89_C2H_PKT_OFLD_RSP_W2_PTK_LEN GENMASK(31, 16)
3813 
3814 struct rtw89_c2h_tx_duty_rpt {
3815 	struct rtw89_c2h_hdr c2h_hdr;
3816 	__le32 w2;
3817 } __packed;
3818 
3819 #define RTW89_C2H_TX_DUTY_RPT_W2_TIMER_ERR GENMASK(2, 0)
3820 
3821 struct rtw89_c2h_wow_aoac_report {
3822 	struct rtw89_c2h_hdr c2h_hdr;
3823 	u8 rpt_ver;
3824 	u8 sec_type;
3825 	u8 key_idx;
3826 	u8 pattern_idx;
3827 	u8 rekey_ok;
3828 	u8 rsvd1[3];
3829 	u8 ptk_tx_iv[8];
3830 	u8 eapol_key_replay_count[8];
3831 	u8 gtk[32];
3832 	u8 ptk_rx_iv[8];
3833 	u8 gtk_rx_iv[4][8];
3834 	__le64 igtk_key_id;
3835 	__le64 igtk_ipn;
3836 	u8 igtk[32];
3837 	u8 csa_pri_ch;
3838 	u8 csa_bw_ch_offset;
3839 	u8 csa_ch_band_chsw_failed;
3840 	u8 csa_rsvd1;
3841 } __packed;
3842 
3843 #define RTW89_C2H_WOW_AOAC_RPT_REKEY_IDX BIT(0)
3844 
3845 struct rtw89_c2h_pwr_int_notify {
3846 	struct rtw89_c2h_hdr hdr;
3847 	__le32 w2;
3848 } __packed;
3849 
3850 #define RTW89_C2H_PWR_INT_NOTIFY_W2_MACID GENMASK(15, 0)
3851 #define RTW89_C2H_PWR_INT_NOTIFY_W2_PWR_STATUS BIT(16)
3852 
3853 struct rtw89_h2c_tx_duty {
3854 	__le32 w0;
3855 	__le32 w1;
3856 } __packed;
3857 
3858 #define RTW89_H2C_TX_DUTY_W0_PAUSE_INTVL_MASK GENMASK(15, 0)
3859 #define RTW89_H2C_TX_DUTY_W0_TX_INTVL_MASK GENMASK(31, 16)
3860 #define RTW89_H2C_TX_DUTY_W1_STOP BIT(0)
3861 
3862 struct rtw89_h2c_bcnfltr {
3863 	__le32 w0;
3864 } __packed;
3865 
3866 #define RTW89_H2C_BCNFLTR_W0_MON_RSSI BIT(0)
3867 #define RTW89_H2C_BCNFLTR_W0_MON_BCN BIT(1)
3868 #define RTW89_H2C_BCNFLTR_W0_MON_EN BIT(2)
3869 #define RTW89_H2C_BCNFLTR_W0_MODE GENMASK(4, 3)
3870 #define RTW89_H2C_BCNFLTR_W0_BCN_LOSS_CNT_H3 GENMASK(7, 5)
3871 #define RTW89_H2C_BCNFLTR_W0_BCN_LOSS_CNT_L4 GENMASK(11, 8)
3872 #define RTW89_H2C_BCNFLTR_W0_RSSI_HYST GENMASK(15, 12)
3873 #define RTW89_H2C_BCNFLTR_W0_RSSI_THRESHOLD GENMASK(23, 16)
3874 #define RTW89_H2C_BCNFLTR_W0_MAC_ID GENMASK(31, 24)
3875 
3876 struct rtw89_h2c_ofld_rssi {
3877 	__le32 w0;
3878 	__le32 w1;
3879 } __packed;
3880 
3881 #define RTW89_H2C_OFLD_RSSI_W0_MACID GENMASK(7, 0)
3882 #define RTW89_H2C_OFLD_RSSI_W0_NUM GENMASK(15, 8)
3883 #define RTW89_H2C_OFLD_RSSI_W1_VAL GENMASK(7, 0)
3884 
3885 struct rtw89_h2c_ofld {
3886 	__le32 w0;
3887 } __packed;
3888 
3889 #define RTW89_H2C_OFLD_W0_MAC_ID GENMASK(7, 0)
3890 #define RTW89_H2C_OFLD_W0_TX_TP GENMASK(17, 8)
3891 #define RTW89_H2C_OFLD_W0_RX_TP GENMASK(27, 18)
3892 
3893 #define RTW89_MFW_SIG	0xFF
3894 
3895 struct rtw89_mfw_info {
3896 	u8 cv;
3897 	u8 type; /* enum rtw89_fw_type */
3898 	u8 mp;
3899 	u8 rsvd;
3900 	__le32 shift;
3901 	__le32 size;
3902 	u8 rsvd2[4];
3903 } __packed;
3904 
3905 struct rtw89_mfw_hdr {
3906 	u8 sig;	/* RTW89_MFW_SIG */
3907 	u8 fw_nr;
3908 	u8 rsvd0[2];
3909 	struct {
3910 		u8 major;
3911 		u8 minor;
3912 		u8 sub;
3913 		u8 idx;
3914 	} ver;
3915 	u8 rsvd1[8];
3916 	struct rtw89_mfw_info info[];
3917 } __packed;
3918 
3919 struct rtw89_fw_logsuit_hdr {
3920 	__le32 rsvd;
3921 	__le32 count;
3922 	__le32 ids[];
3923 } __packed;
3924 
3925 #define RTW89_FW_ELEMENT_ALIGN 16
3926 
3927 enum rtw89_fw_element_id {
3928 	RTW89_FW_ELEMENT_ID_BBMCU0 = 0,
3929 	RTW89_FW_ELEMENT_ID_BBMCU1 = 1,
3930 	RTW89_FW_ELEMENT_ID_BB_REG = 2,
3931 	RTW89_FW_ELEMENT_ID_BB_GAIN = 3,
3932 	RTW89_FW_ELEMENT_ID_RADIO_A = 4,
3933 	RTW89_FW_ELEMENT_ID_RADIO_B = 5,
3934 	RTW89_FW_ELEMENT_ID_RADIO_C = 6,
3935 	RTW89_FW_ELEMENT_ID_RADIO_D = 7,
3936 	RTW89_FW_ELEMENT_ID_RF_NCTL = 8,
3937 	RTW89_FW_ELEMENT_ID_TXPWR_BYRATE = 9,
3938 	RTW89_FW_ELEMENT_ID_TXPWR_LMT_2GHZ = 10,
3939 	RTW89_FW_ELEMENT_ID_TXPWR_LMT_5GHZ = 11,
3940 	RTW89_FW_ELEMENT_ID_TXPWR_LMT_6GHZ = 12,
3941 	RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_2GHZ = 13,
3942 	RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_5GHZ = 14,
3943 	RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_6GHZ = 15,
3944 	RTW89_FW_ELEMENT_ID_TX_SHAPE_LMT = 16,
3945 	RTW89_FW_ELEMENT_ID_TX_SHAPE_LMT_RU = 17,
3946 	RTW89_FW_ELEMENT_ID_TXPWR_TRK = 18,
3947 	RTW89_FW_ELEMENT_ID_RFKLOG_FMT = 19,
3948 	RTW89_FW_ELEMENT_ID_REGD = 20,
3949 	RTW89_FW_ELEMENT_ID_TXPWR_DA_LMT_2GHZ = 21,
3950 	RTW89_FW_ELEMENT_ID_TXPWR_DA_LMT_5GHZ = 22,
3951 	RTW89_FW_ELEMENT_ID_TXPWR_DA_LMT_6GHZ = 23,
3952 	RTW89_FW_ELEMENT_ID_TXPWR_DA_LMT_RU_2GHZ = 24,
3953 	RTW89_FW_ELEMENT_ID_TXPWR_DA_LMT_RU_5GHZ = 25,
3954 	RTW89_FW_ELEMENT_ID_TXPWR_DA_LMT_RU_6GHZ = 26,
3955 
3956 	RTW89_FW_ELEMENT_ID_NUM,
3957 };
3958 
3959 #define BITS_OF_RTW89_TXPWR_FW_ELEMENTS_NO_6GHZ \
3960 	(BIT(RTW89_FW_ELEMENT_ID_TXPWR_BYRATE) | \
3961 	 BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_2GHZ) | \
3962 	 BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_5GHZ) | \
3963 	 BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_2GHZ) | \
3964 	 BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_5GHZ) | \
3965 	 BIT(RTW89_FW_ELEMENT_ID_TX_SHAPE_LMT) | \
3966 	 BIT(RTW89_FW_ELEMENT_ID_TX_SHAPE_LMT_RU))
3967 
3968 #define BITS_OF_RTW89_TXPWR_FW_ELEMENTS \
3969 	(BITS_OF_RTW89_TXPWR_FW_ELEMENTS_NO_6GHZ | \
3970 	 BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_6GHZ) | \
3971 	 BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_6GHZ))
3972 
3973 #define RTW89_AX_GEN_DEF_NEEDED_FW_ELEMENTS_NO_6GHZ \
3974 	(BIT(RTW89_FW_ELEMENT_ID_BB_REG) | \
3975 	 BIT(RTW89_FW_ELEMENT_ID_RADIO_A) | \
3976 	 BIT(RTW89_FW_ELEMENT_ID_RADIO_B) | \
3977 	 BIT(RTW89_FW_ELEMENT_ID_RF_NCTL) | \
3978 	 BIT(RTW89_FW_ELEMENT_ID_TXPWR_TRK) | \
3979 	 BITS_OF_RTW89_TXPWR_FW_ELEMENTS_NO_6GHZ)
3980 
3981 #define RTW89_BE_GEN_DEF_NEEDED_FW_ELEMENTS (BIT(RTW89_FW_ELEMENT_ID_BBMCU0) | \
3982 					     BIT(RTW89_FW_ELEMENT_ID_BB_REG) | \
3983 					     BIT(RTW89_FW_ELEMENT_ID_RADIO_A) | \
3984 					     BIT(RTW89_FW_ELEMENT_ID_RADIO_B) | \
3985 					     BIT(RTW89_FW_ELEMENT_ID_RF_NCTL) | \
3986 					     BIT(RTW89_FW_ELEMENT_ID_TXPWR_TRK) | \
3987 					     BITS_OF_RTW89_TXPWR_FW_ELEMENTS)
3988 
3989 struct __rtw89_fw_txpwr_element {
3990 	u8 rsvd0;
3991 	u8 rsvd1;
3992 	u8 rfe_type;
3993 	u8 ent_sz;
3994 	__le32 num_ents;
3995 	u8 content[];
3996 } __packed;
3997 
3998 struct __rtw89_fw_regd_element {
3999 	u8 rsvd0;
4000 	u8 rsvd1;
4001 	u8 rsvd2;
4002 	u8 ent_sz;
4003 	__le32 num_ents;
4004 	u8 content[];
4005 } __packed;
4006 
4007 enum rtw89_fw_txpwr_trk_type {
4008 	__RTW89_FW_TXPWR_TRK_TYPE_6GHZ_START = 0,
4009 	RTW89_FW_TXPWR_TRK_TYPE_6GB_N = 0,
4010 	RTW89_FW_TXPWR_TRK_TYPE_6GB_P = 1,
4011 	RTW89_FW_TXPWR_TRK_TYPE_6GA_N = 2,
4012 	RTW89_FW_TXPWR_TRK_TYPE_6GA_P = 3,
4013 	__RTW89_FW_TXPWR_TRK_TYPE_6GHZ_MAX = 3,
4014 
4015 	__RTW89_FW_TXPWR_TRK_TYPE_5GHZ_START = 4,
4016 	RTW89_FW_TXPWR_TRK_TYPE_5GB_N = 4,
4017 	RTW89_FW_TXPWR_TRK_TYPE_5GB_P = 5,
4018 	RTW89_FW_TXPWR_TRK_TYPE_5GA_N = 6,
4019 	RTW89_FW_TXPWR_TRK_TYPE_5GA_P = 7,
4020 	__RTW89_FW_TXPWR_TRK_TYPE_5GHZ_MAX = 7,
4021 
4022 	__RTW89_FW_TXPWR_TRK_TYPE_2GHZ_START = 8,
4023 	RTW89_FW_TXPWR_TRK_TYPE_2GB_N = 8,
4024 	RTW89_FW_TXPWR_TRK_TYPE_2GB_P = 9,
4025 	RTW89_FW_TXPWR_TRK_TYPE_2GA_N = 10,
4026 	RTW89_FW_TXPWR_TRK_TYPE_2GA_P = 11,
4027 	RTW89_FW_TXPWR_TRK_TYPE_2G_CCK_B_N = 12,
4028 	RTW89_FW_TXPWR_TRK_TYPE_2G_CCK_B_P = 13,
4029 	RTW89_FW_TXPWR_TRK_TYPE_2G_CCK_A_N = 14,
4030 	RTW89_FW_TXPWR_TRK_TYPE_2G_CCK_A_P = 15,
4031 	__RTW89_FW_TXPWR_TRK_TYPE_2GHZ_MAX = 15,
4032 
4033 	RTW89_FW_TXPWR_TRK_TYPE_NR,
4034 };
4035 
4036 struct rtw89_fw_txpwr_track_cfg {
4037 	const s8 (*delta[RTW89_FW_TXPWR_TRK_TYPE_NR])[DELTA_SWINGIDX_SIZE];
4038 };
4039 
4040 #define RTW89_DEFAULT_NEEDED_FW_TXPWR_TRK_6GHZ \
4041 	(BIT(RTW89_FW_TXPWR_TRK_TYPE_6GB_N) | \
4042 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_6GB_P) | \
4043 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_6GA_N) | \
4044 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_6GA_P))
4045 #define RTW89_DEFAULT_NEEDED_FW_TXPWR_TRK_5GHZ \
4046 	(BIT(RTW89_FW_TXPWR_TRK_TYPE_5GB_N) | \
4047 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_5GB_P) | \
4048 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_5GA_N) | \
4049 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_5GA_P))
4050 #define RTW89_DEFAULT_NEEDED_FW_TXPWR_TRK_2GHZ \
4051 	(BIT(RTW89_FW_TXPWR_TRK_TYPE_2GB_N) | \
4052 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_2GB_P) | \
4053 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_2GA_N) | \
4054 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_2GA_P) | \
4055 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_2G_CCK_B_N) | \
4056 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_2G_CCK_B_P) | \
4057 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_2G_CCK_A_N) | \
4058 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_2G_CCK_A_P))
4059 
4060 struct rtw89_fw_element_hdr {
4061 	__le32 id; /* enum rtw89_fw_element_id */
4062 	__le32 size; /* exclude header size */
4063 	u8 ver[4];
4064 	__le32 rsvd0;
4065 	__le32 rsvd1;
4066 	__le32 rsvd2;
4067 	union {
4068 		struct {
4069 			u8 priv[8];
4070 			u8 contents[];
4071 		} __packed common;
4072 		struct {
4073 			u8 idx;
4074 			u8 rsvd[7];
4075 			struct {
4076 				__le32 addr;
4077 				__le32 data;
4078 			} __packed regs[];
4079 		} __packed reg2;
4080 		struct {
4081 			u8 cv;
4082 			u8 priv[7];
4083 			u8 contents[];
4084 		} __packed bbmcu;
4085 		struct {
4086 			__le32 bitmap; /* bitmap of enum rtw89_fw_txpwr_trk_type */
4087 			__le32 rsvd;
4088 			s8 contents[][DELTA_SWINGIDX_SIZE];
4089 		} __packed txpwr_trk;
4090 		struct {
4091 			u8 nr;
4092 			u8 rsvd[3];
4093 			u8 rfk_id; /* enum rtw89_phy_c2h_rfk_log_func */
4094 			u8 rsvd1[3];
4095 			__le16 offset[];
4096 		} __packed rfk_log_fmt;
4097 		struct __rtw89_fw_txpwr_element txpwr;
4098 		struct __rtw89_fw_regd_element regd;
4099 	} __packed u;
4100 } __packed;
4101 
4102 struct fwcmd_hdr {
4103 	__le32 hdr0;
4104 	__le32 hdr1;
4105 };
4106 
4107 union rtw89_compat_fw_hdr {
4108 	struct rtw89_mfw_hdr mfw_hdr;
4109 	struct rtw89_fw_hdr fw_hdr;
4110 };
4111 
4112 static inline u32 rtw89_compat_fw_hdr_ver_code(const void *fw_buf)
4113 {
4114 	const union rtw89_compat_fw_hdr *compat = (typeof(compat))fw_buf;
4115 
4116 	if (compat->mfw_hdr.sig == RTW89_MFW_SIG)
4117 		return RTW89_MFW_HDR_VER_CODE(&compat->mfw_hdr);
4118 	else
4119 		return RTW89_FW_HDR_VER_CODE(&compat->fw_hdr);
4120 }
4121 
4122 static inline void rtw89_fw_get_filename(char *buf, size_t size,
4123 					 const char *fw_basename, int fw_format)
4124 {
4125 	if (fw_format <= 0)
4126 		snprintf(buf, size, "%s.bin", fw_basename);
4127 	else
4128 		snprintf(buf, size, "%s-%d.bin", fw_basename, fw_format);
4129 }
4130 
4131 #define RTW89_H2C_RF_PAGE_SIZE 500
4132 #define RTW89_H2C_RF_PAGE_NUM 3
4133 struct rtw89_fw_h2c_rf_reg_info {
4134 	enum rtw89_rf_path rf_path;
4135 	__le32 rtw89_phy_config_rf_h2c[RTW89_H2C_RF_PAGE_NUM][RTW89_H2C_RF_PAGE_SIZE];
4136 	u16 curr_idx;
4137 };
4138 
4139 #define H2C_SEC_CAM_LEN			24
4140 
4141 #define H2C_HEADER_LEN			8
4142 #define H2C_HDR_CAT			GENMASK(1, 0)
4143 #define H2C_HDR_CLASS			GENMASK(7, 2)
4144 #define H2C_HDR_FUNC			GENMASK(15, 8)
4145 #define H2C_HDR_DEL_TYPE		GENMASK(19, 16)
4146 #define H2C_HDR_H2C_SEQ			GENMASK(31, 24)
4147 #define H2C_HDR_TOTAL_LEN		GENMASK(13, 0)
4148 #define H2C_HDR_REC_ACK			BIT(14)
4149 #define H2C_HDR_DONE_ACK		BIT(15)
4150 
4151 #define FWCMD_TYPE_H2C			0
4152 
4153 #define H2C_CAT_TEST		0x0
4154 
4155 /* CLASS 5 - FW STATUS TEST */
4156 #define H2C_CL_FW_STATUS_TEST		0x5
4157 #define H2C_FUNC_CPU_EXCEPTION		0x1
4158 
4159 #define H2C_CAT_MAC		0x1
4160 
4161 /* CLASS 0 - FW INFO */
4162 #define H2C_CL_FW_INFO			0x0
4163 #define H2C_FUNC_LOG_CFG		0x0
4164 #define H2C_FUNC_MAC_GENERAL_PKT	0x1
4165 
4166 /* CLASS 1 - WOW */
4167 #define H2C_CL_MAC_WOW			0x1
4168 enum rtw89_wow_h2c_func {
4169 	H2C_FUNC_KEEP_ALIVE		= 0x0,
4170 	H2C_FUNC_DISCONNECT_DETECT	= 0x1,
4171 	H2C_FUNC_WOW_GLOBAL		= 0x2,
4172 	H2C_FUNC_GTK_OFLD		= 0x3,
4173 	H2C_FUNC_ARP_OFLD		= 0x4,
4174 	H2C_FUNC_NLO			= 0x7,
4175 	H2C_FUNC_WAKEUP_CTRL		= 0x8,
4176 	H2C_FUNC_WOW_CAM_UPD		= 0xC,
4177 	H2C_FUNC_AOAC_REPORT_REQ	= 0xD,
4178 
4179 	NUM_OF_RTW89_WOW_H2C_FUNC,
4180 };
4181 
4182 #define RTW89_WOW_WAIT_COND(tag, func) \
4183 	((tag) * NUM_OF_RTW89_WOW_H2C_FUNC + (func))
4184 
4185 #define RTW89_WOW_WAIT_COND_AOAC \
4186 	RTW89_WOW_WAIT_COND(0 /* don't care */, H2C_FUNC_AOAC_REPORT_REQ)
4187 
4188 /* CLASS 2 - PS */
4189 #define H2C_CL_MAC_PS			0x2
4190 enum rtw89_ps_h2c_func {
4191 	H2C_FUNC_MAC_LPS_PARM		= 0x0,
4192 	H2C_FUNC_P2P_ACT		= 0x1,
4193 	H2C_FUNC_IPS_CFG		= 0x3,
4194 
4195 	NUM_OF_RTW89_PS_H2C_FUNC,
4196 };
4197 
4198 #define RTW89_PS_WAIT_COND(tag, func) \
4199 	((tag) * NUM_OF_RTW89_PS_H2C_FUNC + (func))
4200 
4201 #define RTW89_PS_WAIT_COND_IPS_CFG \
4202 	RTW89_PS_WAIT_COND(0 /* don't care */, H2C_FUNC_IPS_CFG)
4203 
4204 /* CLASS 3 - FW download */
4205 #define H2C_CL_MAC_FWDL		0x3
4206 #define H2C_FUNC_MAC_FWHDR_DL		0x0
4207 
4208 /* CLASS 5 - Frame Exchange */
4209 #define H2C_CL_MAC_FR_EXCHG		0x5
4210 #define H2C_FUNC_MAC_CCTLINFO_UD	0x2
4211 #define H2C_FUNC_MAC_BCN_UPD		0x5
4212 #define H2C_FUNC_MAC_DCTLINFO_UD_V1	0x9
4213 #define H2C_FUNC_MAC_CCTLINFO_UD_V1	0xa
4214 #define H2C_FUNC_MAC_DCTLINFO_UD_V2	0xc
4215 #define H2C_FUNC_MAC_BCN_UPD_BE		0xd
4216 #define H2C_FUNC_MAC_CCTLINFO_UD_G7	0x11
4217 
4218 /* CLASS 6 - Address CAM */
4219 #define H2C_CL_MAC_ADDR_CAM_UPDATE	0x6
4220 #define H2C_FUNC_MAC_ADDR_CAM_UPD	0x0
4221 
4222 /* CLASS 8 - Media Status Report */
4223 #define H2C_CL_MAC_MEDIA_RPT		0x8
4224 #define H2C_FUNC_MAC_JOININFO		0x0
4225 #define H2C_FUNC_MAC_FWROLE_MAINTAIN	0x4
4226 #define H2C_FUNC_NOTIFY_DBCC		0x5
4227 
4228 /* CLASS 9 - FW offload */
4229 #define H2C_CL_MAC_FW_OFLD		0x9
4230 enum rtw89_fw_ofld_h2c_func {
4231 	H2C_FUNC_PACKET_OFLD		= 0x1,
4232 	H2C_FUNC_MAC_MACID_PAUSE	= 0x8,
4233 	H2C_FUNC_USR_EDCA		= 0xF,
4234 	H2C_FUNC_TSF32_TOGL		= 0x10,
4235 	H2C_FUNC_OFLD_CFG		= 0x14,
4236 	H2C_FUNC_ADD_SCANOFLD_CH	= 0x16,
4237 	H2C_FUNC_SCANOFLD		= 0x17,
4238 	H2C_FUNC_TX_DUTY		= 0x18,
4239 	H2C_FUNC_PKT_DROP		= 0x1b,
4240 	H2C_FUNC_CFG_BCNFLTR		= 0x1e,
4241 	H2C_FUNC_OFLD_RSSI		= 0x1f,
4242 	H2C_FUNC_OFLD_TP		= 0x20,
4243 	H2C_FUNC_MAC_MACID_PAUSE_SLEEP	= 0x28,
4244 	H2C_FUNC_SCANOFLD_BE		= 0x2c,
4245 
4246 	NUM_OF_RTW89_FW_OFLD_H2C_FUNC,
4247 };
4248 
4249 #define RTW89_FW_OFLD_WAIT_COND(tag, func) \
4250 	((tag) * NUM_OF_RTW89_FW_OFLD_H2C_FUNC + (func))
4251 
4252 #define RTW89_FW_OFLD_WAIT_COND_PKT_OFLD(pkt_id, pkt_op) \
4253 	RTW89_FW_OFLD_WAIT_COND(RTW89_PKT_OFLD_WAIT_TAG(pkt_id, pkt_op), \
4254 				H2C_FUNC_PACKET_OFLD)
4255 
4256 #define RTW89_SCANOFLD_WAIT_COND_ADD_CH RTW89_FW_OFLD_WAIT_COND(0, H2C_FUNC_ADD_SCANOFLD_CH)
4257 
4258 #define RTW89_SCANOFLD_WAIT_COND_START RTW89_FW_OFLD_WAIT_COND(0, H2C_FUNC_SCANOFLD)
4259 #define RTW89_SCANOFLD_WAIT_COND_STOP RTW89_FW_OFLD_WAIT_COND(1, H2C_FUNC_SCANOFLD)
4260 #define RTW89_SCANOFLD_BE_WAIT_COND_START RTW89_FW_OFLD_WAIT_COND(0, H2C_FUNC_SCANOFLD_BE)
4261 #define RTW89_SCANOFLD_BE_WAIT_COND_STOP RTW89_FW_OFLD_WAIT_COND(1, H2C_FUNC_SCANOFLD_BE)
4262 
4263 
4264 /* CLASS 10 - Security CAM */
4265 #define H2C_CL_MAC_SEC_CAM		0xa
4266 #define H2C_FUNC_MAC_SEC_UPD		0x1
4267 
4268 /* CLASS 12 - BA CAM */
4269 #define H2C_CL_BA_CAM			0xc
4270 #define H2C_FUNC_MAC_BA_CAM		0x0
4271 #define H2C_FUNC_MAC_BA_CAM_V1		0x1
4272 #define H2C_FUNC_MAC_BA_CAM_INIT	0x2
4273 
4274 /* CLASS 14 - MCC */
4275 #define H2C_CL_MCC			0xe
4276 enum rtw89_mcc_h2c_func {
4277 	H2C_FUNC_ADD_MCC		= 0x0,
4278 	H2C_FUNC_START_MCC		= 0x1,
4279 	H2C_FUNC_STOP_MCC		= 0x2,
4280 	H2C_FUNC_DEL_MCC_GROUP		= 0x3,
4281 	H2C_FUNC_RESET_MCC_GROUP	= 0x4,
4282 	H2C_FUNC_MCC_REQ_TSF		= 0x5,
4283 	H2C_FUNC_MCC_MACID_BITMAP	= 0x6,
4284 	H2C_FUNC_MCC_SYNC		= 0x7,
4285 	H2C_FUNC_MCC_SET_DURATION	= 0x8,
4286 
4287 	NUM_OF_RTW89_MCC_H2C_FUNC,
4288 };
4289 
4290 #define RTW89_MCC_WAIT_COND(group, func) \
4291 	((group) * NUM_OF_RTW89_MCC_H2C_FUNC + (func))
4292 
4293 /* CLASS 20 - MLO */
4294 #define H2C_CL_MLO                     0x14
4295 enum rtw89_mlo_h2c_func {
4296 	H2C_FUNC_MLO_TBL_CFG		= 0x0,
4297 	H2C_FUNC_MLO_STA_CFG		= 0x1,
4298 	H2C_FUNC_MLO_TTLM		= 0x2,
4299 	H2C_FUNC_MLO_DM_CFG		= 0x3,
4300 	H2C_FUNC_MLO_EMLSR_STA_CFG	= 0x4,
4301 	H2C_FUNC_MLO_MCMLO_RELINK_DROP	= 0x5,
4302 	H2C_FUNC_MLO_MCMLO_SN_SYNC	= 0x6,
4303 	H2C_FUNC_MLO_RELINK		= 0x7,
4304 	H2C_FUNC_MLO_LINK_CFG		= 0x8,
4305 	H2C_FUNC_MLO_DM_DBG		= 0x9,
4306 
4307 	NUM_OF_RTW89_MLO_H2C_FUNC,
4308 };
4309 
4310 #define RTW89_MLO_WAIT_COND(macid, func) \
4311 	((macid) * NUM_OF_RTW89_MLO_H2C_FUNC + (func))
4312 
4313 /* CLASS 24 - MRC */
4314 #define H2C_CL_MRC			0x18
4315 enum rtw89_mrc_h2c_func {
4316 	H2C_FUNC_MRC_REQ_TSF		= 0x0,
4317 	H2C_FUNC_ADD_MRC		= 0x1,
4318 	H2C_FUNC_START_MRC		= 0x2,
4319 	H2C_FUNC_DEL_MRC		= 0x3,
4320 	H2C_FUNC_MRC_SYNC		= 0x4,
4321 	H2C_FUNC_MRC_UPD_DURATION	= 0x5,
4322 	H2C_FUNC_MRC_UPD_BITMAP		= 0x6,
4323 
4324 	NUM_OF_RTW89_MRC_H2C_FUNC,
4325 };
4326 
4327 /* can consider MRC's sch_idx as MCC's group */
4328 #define RTW89_MRC_WAIT_COND(sch_idx, func) \
4329 	((sch_idx) * NUM_OF_RTW89_MRC_H2C_FUNC + (func))
4330 
4331 #define RTW89_MRC_WAIT_COND_REQ_TSF \
4332 	RTW89_MRC_WAIT_COND(0 /* don't care */, H2C_FUNC_MRC_REQ_TSF)
4333 
4334 /* CLASS 36 - AP */
4335 #define H2C_CL_AP			0x24
4336 #define H2C_FUNC_AP_INFO 0x0
4337 
4338 #define H2C_CAT_OUTSRC			0x2
4339 
4340 #define H2C_CL_OUTSRC_RA		0x1
4341 #define H2C_FUNC_OUTSRC_RA_MACIDCFG	0x0
4342 
4343 #define H2C_CL_OUTSRC_DM		0x2
4344 #define H2C_FUNC_FW_LPS_CH_INFO		0xb
4345 #define H2C_FUNC_FW_LPS_ML_CMN_INFO	0xe
4346 
4347 #define H2C_CL_OUTSRC_RF_REG_A		0x8
4348 #define H2C_CL_OUTSRC_RF_REG_B		0x9
4349 #define H2C_CL_OUTSRC_RF_FW_NOTIFY	0xa
4350 #define H2C_FUNC_OUTSRC_RF_GET_MCCCH	0x2
4351 #define H2C_FUNC_OUTSRC_RF_PS_INFO	0x10
4352 #define H2C_CL_OUTSRC_RF_FW_RFK		0xb
4353 
4354 enum rtw89_rfk_offload_h2c_func {
4355 	H2C_FUNC_RFK_TSSI_OFFLOAD = 0x0,
4356 	H2C_FUNC_RFK_IQK_OFFLOAD = 0x1,
4357 	H2C_FUNC_RFK_DPK_OFFLOAD = 0x3,
4358 	H2C_FUNC_RFK_TXGAPK_OFFLOAD = 0x4,
4359 	H2C_FUNC_RFK_DACK_OFFLOAD = 0x5,
4360 	H2C_FUNC_RFK_RXDCK_OFFLOAD = 0x6,
4361 	H2C_FUNC_RFK_PRE_NOTIFY = 0x8,
4362 };
4363 
4364 struct rtw89_fw_h2c_rf_get_mccch {
4365 	__le32 ch_0_0;
4366 	__le32 ch_0_1;
4367 	__le32 ch_1_0;
4368 	__le32 ch_1_1;
4369 	__le32 current_channel;
4370 } __packed;
4371 
4372 struct rtw89_fw_h2c_rf_get_mccch_v0 {
4373 	__le32 ch_0;
4374 	__le32 ch_1;
4375 	__le32 band_0;
4376 	__le32 band_1;
4377 	__le32 current_channel;
4378 	__le32 current_band_type;
4379 } __packed;
4380 
4381 #define NUM_OF_RTW89_FW_RFK_PATH 2
4382 #define NUM_OF_RTW89_FW_RFK_TBL 3
4383 
4384 struct rtw89_h2c_rf_ps_info {
4385 	__le32 rf18[NUM_OF_RTW89_FW_RFK_PATH];
4386 	__le32 mlo_mode;
4387 	u8 pri_ch[NUM_OF_RTW89_FW_RFK_PATH];
4388 } __packed;
4389 
4390 struct rtw89_fw_h2c_rfk_pre_info_common {
4391 	struct {
4392 		__le32 ch[NUM_OF_RTW89_FW_RFK_PATH][NUM_OF_RTW89_FW_RFK_TBL];
4393 		__le32 band[NUM_OF_RTW89_FW_RFK_PATH][NUM_OF_RTW89_FW_RFK_TBL];
4394 	} __packed dbcc;
4395 
4396 	__le32 mlo_mode;
4397 	struct {
4398 		__le32 cur_ch[NUM_OF_RTW89_FW_RFK_PATH];
4399 		__le32 cur_band[NUM_OF_RTW89_FW_RFK_PATH];
4400 	} __packed tbl;
4401 
4402 	__le32 phy_idx;
4403 } __packed;
4404 
4405 struct rtw89_fw_h2c_rfk_pre_info_v0 {
4406 	struct rtw89_fw_h2c_rfk_pre_info_common common;
4407 
4408 	__le32 cur_band;
4409 	__le32 cur_bw;
4410 	__le32 cur_center_ch;
4411 
4412 	__le32 ktbl_sel0;
4413 	__le32 ktbl_sel1;
4414 	__le32 rfmod0;
4415 	__le32 rfmod1;
4416 
4417 	__le32 mlo_1_1;
4418 	__le32 rfe_type;
4419 	__le32 drv_mode;
4420 
4421 	struct {
4422 		__le32 ch[NUM_OF_RTW89_FW_RFK_PATH];
4423 		__le32 band[NUM_OF_RTW89_FW_RFK_PATH];
4424 	} __packed mlo;
4425 } __packed;
4426 
4427 struct rtw89_fw_h2c_rfk_pre_info_v1 {
4428 	struct rtw89_fw_h2c_rfk_pre_info_common common;
4429 	__le32 mlo_1_1;
4430 } __packed;
4431 
4432 struct rtw89_fw_h2c_rfk_pre_info {
4433 	struct rtw89_fw_h2c_rfk_pre_info_v1 base_v1;
4434 	__le32 cur_bandwidth[NUM_OF_RTW89_FW_RFK_PATH];
4435 } __packed;
4436 
4437 struct rtw89_h2c_rf_tssi {
4438 	__le16 len;
4439 	u8 phy;
4440 	u8 ch;
4441 	u8 bw;
4442 	u8 band;
4443 	u8 hwtx_en;
4444 	u8 cv;
4445 	s8 curr_tssi_cck_de[2];
4446 	s8 curr_tssi_cck_de_20m[2];
4447 	s8 curr_tssi_cck_de_40m[2];
4448 	s8 curr_tssi_efuse_cck_de[2];
4449 	s8 curr_tssi_ofdm_de[2];
4450 	s8 curr_tssi_ofdm_de_20m[2];
4451 	s8 curr_tssi_ofdm_de_40m[2];
4452 	s8 curr_tssi_ofdm_de_80m[2];
4453 	s8 curr_tssi_ofdm_de_160m[2];
4454 	s8 curr_tssi_ofdm_de_320m[2];
4455 	s8 curr_tssi_efuse_ofdm_de[2];
4456 	s8 curr_tssi_ofdm_de_diff_20m[2];
4457 	s8 curr_tssi_ofdm_de_diff_80m[2];
4458 	s8 curr_tssi_ofdm_de_diff_160m[2];
4459 	s8 curr_tssi_ofdm_de_diff_320m[2];
4460 	s8 curr_tssi_trim_de[2];
4461 	u8 pg_thermal[2];
4462 	u8 ftable[2][128];
4463 	u8 tssi_mode;
4464 	u8 rfe_type;
4465 } __packed;
4466 
4467 struct rtw89_h2c_rf_iqk_v0 {
4468 	__le32 phy_idx;
4469 	__le32 dbcc;
4470 } __packed;
4471 
4472 struct rtw89_h2c_rf_iqk {
4473 	u8 len;
4474 	u8 ktype;
4475 	u8 phy;
4476 	u8 kpath;
4477 	u8 band;
4478 	u8 bw;
4479 	u8 ch;
4480 	u8 cv;
4481 } __packed;
4482 
4483 struct rtw89_h2c_rf_dpk {
4484 	u8 len;
4485 	u8 phy;
4486 	u8 dpk_enable;
4487 	u8 kpath;
4488 	u8 cur_band;
4489 	u8 cur_bw;
4490 	u8 cur_ch;
4491 	u8 dpk_dbg_en;
4492 } __packed;
4493 
4494 struct rtw89_h2c_rf_txgapk {
4495 	u8 len;
4496 	u8 ktype;
4497 	u8 phy;
4498 	u8 kpath;
4499 	u8 band;
4500 	u8 bw;
4501 	u8 ch;
4502 	u8 cv;
4503 } __packed;
4504 
4505 struct rtw89_h2c_rf_dack {
4506 	__le32 len;
4507 	__le32 phy;
4508 	__le32 type;
4509 } __packed;
4510 
4511 struct rtw89_h2c_rf_rxdck_v0 {
4512 	u8 len;
4513 	u8 phy;
4514 	u8 is_afe;
4515 	u8 kpath;
4516 	u8 cur_band;
4517 	u8 cur_bw;
4518 	u8 cur_ch;
4519 	u8 rxdck_dbg_en;
4520 } __packed;
4521 
4522 struct rtw89_h2c_rf_rxdck {
4523 	struct rtw89_h2c_rf_rxdck_v0 v0;
4524 	u8 is_chl_k;
4525 } __packed;
4526 
4527 enum rtw89_rf_log_type {
4528 	RTW89_RF_RUN_LOG = 0,
4529 	RTW89_RF_RPT_LOG = 1,
4530 };
4531 
4532 struct rtw89_c2h_rf_log_hdr {
4533 	u8 type; /* enum rtw89_rf_log_type */
4534 	__le16 len;
4535 	u8 content[];
4536 } __packed;
4537 
4538 struct rtw89_c2h_rf_run_log {
4539 	__le32 fmt_idx;
4540 	__le32 arg[4];
4541 } __packed;
4542 
4543 struct rtw89_c2h_rf_iqk_rpt_log {
4544 	bool iqk_tx_fail[2];
4545 	bool iqk_rx_fail[2];
4546 	bool is_iqk_init;
4547 	bool is_reload;
4548 	bool is_wb_txiqk[2];
4549 	bool is_wb_rxiqk[2];
4550 	bool is_nbiqk;
4551 	bool txiqk_en;
4552 	bool rxiqk_en;
4553 	bool lok_en;
4554 	bool iqk_xym_en;
4555 	bool iqk_sram_en;
4556 	bool iqk_fft_en;
4557 	bool is_fw_iqk;
4558 	bool is_iqk_enable;
4559 	bool iqk_cfir_en;
4560 	bool thermal_rek_en;
4561 	u8 iqk_band[2];
4562 	u8 iqk_ch[2];
4563 	u8 iqk_bw[2];
4564 	u8 iqk_times;
4565 	u8 version;
4566 	u8 phy;
4567 	u8 fwk_status;
4568 	u8 rsvd;
4569 	__le32 reload_cnt;
4570 	__le32 iqk_fail_cnt;
4571 	__le32 lok_idac[2];
4572 	__le32 lok_vbuf[2];
4573 	__le32 rftxgain[2][4];
4574 	__le32 rfrxgain[2][4];
4575 	__le32 tx_xym[2][4];
4576 	__le32 rx_xym[2][4];
4577 } __packed;
4578 
4579 struct rtw89_c2h_rf_dpk_rpt_log {
4580 	u8 ver;
4581 	u8 idx[2];
4582 	u8 band[2];
4583 	u8 bw[2];
4584 	u8 ch[2];
4585 	u8 path_ok[2];
4586 	u8 txagc[2];
4587 	u8 ther[2];
4588 	u8 gs[2];
4589 	u8 dc_i[4];
4590 	u8 dc_q[4];
4591 	u8 corr_val[2];
4592 	u8 corr_idx[2];
4593 	u8 is_timeout[2];
4594 	u8 rxbb_ov[2];
4595 	u8 rsvd;
4596 } __packed;
4597 
4598 struct rtw89_c2h_rf_dack_rpt_log {
4599 	u8 fwdack_ver;
4600 	u8 fwdack_info_ver;
4601 	u8 msbk_d[2][2][16];
4602 	u8 dadck_d[2][2];
4603 	u8 cdack_d[2][2][2];
4604 	u8 addck2_hd[2][2][2];
4605 	u8 addck2_ld[2][2][2];
4606 	u8 adgaink_d[2][2];
4607 	u8 biask_hd[2][2];
4608 	u8 biask_ld[2][2];
4609 	u8 addck_timeout;
4610 	u8 cdack_timeout;
4611 	u8 dadck_timeout;
4612 	u8 msbk_timeout;
4613 	u8 adgaink_timeout;
4614 	u8 wbadcdck_timeout;
4615 	u8 drck_timeout;
4616 	u8 dack_fail;
4617 	u8 wbdck_d[2];
4618 	u8 rck_d;
4619 } __packed;
4620 
4621 struct rtw89_c2h_rf_rxdck_rpt_log {
4622 	u8 ver;
4623 	u8 band[2];
4624 	u8 bw[2];
4625 	u8 ch[2];
4626 	u8 timeout[2];
4627 } __packed;
4628 
4629 struct rtw89_c2h_rf_tssi_rpt_log {
4630 	s8 alignment_power[2][2][4];
4631 	u8 alignment_power_cw_h[2][2][4];
4632 	u8 alignment_power_cw_l[2][2][4];
4633 	u8 tssi_alimk_state[2][2];
4634 	u8 default_txagc_offset[2][2];
4635 } __packed;
4636 
4637 struct rtw89_c2h_rf_txgapk_rpt_log {
4638 	__le32 r0x8010[2];
4639 	__le32 chk_cnt;
4640 	u8 track_d[2][17];
4641 	u8 power_d[2][17];
4642 	u8 is_txgapk_ok;
4643 	u8 chk_id;
4644 	u8 ver;
4645 	u8 rsv1;
4646 } __packed;
4647 
4648 struct rtw89_c2h_rfk_report {
4649 	struct rtw89_c2h_hdr hdr;
4650 	u8 state; /* enum rtw89_rfk_report_state */
4651 	u8 version;
4652 } __packed;
4653 
4654 struct rtw89_c2h_rf_tas_info {
4655 	struct rtw89_c2h_hdr hdr;
4656 	__le32 cur_idx;
4657 	__le16 txpwr_history[20];
4658 } __packed;
4659 
4660 #define RTW89_FW_RSVD_PLE_SIZE 0x800
4661 
4662 #define RTW89_FW_BACKTRACE_INFO_SIZE 8
4663 #define RTW89_VALID_FW_BACKTRACE_SIZE(_size) \
4664 	((_size) % RTW89_FW_BACKTRACE_INFO_SIZE == 0)
4665 
4666 #define RTW89_FW_BACKTRACE_MAX_SIZE 512 /* 8 * 64 (entries) */
4667 #define RTW89_FW_BACKTRACE_KEY 0xBACEBACE
4668 
4669 #define FWDL_WAIT_CNT 400000
4670 
4671 int rtw89_fw_check_rdy(struct rtw89_dev *rtwdev, enum rtw89_fwdl_check_type type);
4672 int rtw89_fw_recognize(struct rtw89_dev *rtwdev);
4673 int rtw89_fw_recognize_elements(struct rtw89_dev *rtwdev);
4674 const struct firmware *
4675 rtw89_early_fw_feature_recognize(struct device *device,
4676 				 const struct rtw89_chip_info *chip,
4677 				 struct rtw89_fw_info *early_fw,
4678 				 int *used_fw_format);
4679 int rtw89_fw_download(struct rtw89_dev *rtwdev, enum rtw89_fw_type type,
4680 		      bool include_bb);
4681 void rtw89_load_firmware_work(struct work_struct *work);
4682 void rtw89_unload_firmware(struct rtw89_dev *rtwdev);
4683 int rtw89_wait_firmware_completion(struct rtw89_dev *rtwdev);
4684 int rtw89_fw_log_prepare(struct rtw89_dev *rtwdev);
4685 void rtw89_fw_log_dump(struct rtw89_dev *rtwdev, u8 *buf, u32 len);
4686 void rtw89_h2c_pkt_set_hdr(struct rtw89_dev *rtwdev, struct sk_buff *skb,
4687 			   u8 type, u8 cat, u8 class, u8 func,
4688 			   bool rack, bool dack, u32 len);
4689 int rtw89_fw_h2c_default_cmac_tbl(struct rtw89_dev *rtwdev,
4690 				  struct rtw89_vif_link *rtwvif_link,
4691 				  struct rtw89_sta_link *rtwsta_link);
4692 int rtw89_fw_h2c_default_cmac_tbl_g7(struct rtw89_dev *rtwdev,
4693 				     struct rtw89_vif_link *rtwvif_link,
4694 				     struct rtw89_sta_link *rtwsta_link);
4695 int rtw89_fw_h2c_default_dmac_tbl_v2(struct rtw89_dev *rtwdev,
4696 				     struct rtw89_vif_link *rtwvif_link,
4697 				     struct rtw89_sta_link *rtwsta_link);
4698 int rtw89_fw_h2c_assoc_cmac_tbl(struct rtw89_dev *rtwdev,
4699 				struct rtw89_vif_link *rtwvif_link,
4700 				struct rtw89_sta_link *rtwsta_link);
4701 int rtw89_fw_h2c_assoc_cmac_tbl_g7(struct rtw89_dev *rtwdev,
4702 				   struct rtw89_vif_link *rtwvif_link,
4703 				   struct rtw89_sta_link *rtwsta_link);
4704 int rtw89_fw_h2c_ampdu_cmac_tbl_g7(struct rtw89_dev *rtwdev,
4705 				   struct rtw89_vif_link *rtwvif_link,
4706 				   struct rtw89_sta_link *rtwsta_link);
4707 int rtw89_fw_h2c_txtime_cmac_tbl(struct rtw89_dev *rtwdev,
4708 				 struct rtw89_sta_link *rtwsta_link);
4709 int rtw89_fw_h2c_txtime_cmac_tbl_g7(struct rtw89_dev *rtwdev,
4710 				    struct rtw89_sta_link *rtwsta_link);
4711 int rtw89_fw_h2c_txpath_cmac_tbl(struct rtw89_dev *rtwdev,
4712 				 struct rtw89_sta_link *rtwsta_link);
4713 int rtw89_fw_h2c_update_beacon(struct rtw89_dev *rtwdev,
4714 			       struct rtw89_vif_link *rtwvif_link);
4715 int rtw89_fw_h2c_update_beacon_be(struct rtw89_dev *rtwdev,
4716 				  struct rtw89_vif_link *rtwvif_link);
4717 int rtw89_fw_h2c_cam(struct rtw89_dev *rtwdev, struct rtw89_vif_link *vif,
4718 		     struct rtw89_sta_link *rtwsta_link, const u8 *scan_mac_addr);
4719 int rtw89_fw_h2c_dctl_sec_cam_v1(struct rtw89_dev *rtwdev,
4720 				 struct rtw89_vif_link *rtwvif_link,
4721 				 struct rtw89_sta_link *rtwsta_link);
4722 int rtw89_fw_h2c_dctl_sec_cam_v2(struct rtw89_dev *rtwdev,
4723 				 struct rtw89_vif_link *rtwvif_link,
4724 				 struct rtw89_sta_link *rtwsta_link);
4725 void rtw89_fw_c2h_irqsafe(struct rtw89_dev *rtwdev, struct sk_buff *c2h);
4726 void rtw89_fw_c2h_work(struct wiphy *wiphy, struct wiphy_work *work);
4727 int rtw89_fw_h2c_role_maintain(struct rtw89_dev *rtwdev,
4728 			       struct rtw89_vif_link *rtwvif_link,
4729 			       struct rtw89_sta_link *rtwsta_link,
4730 			       enum rtw89_upd_mode upd_mode);
4731 int rtw89_fw_h2c_join_info(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
4732 			   struct rtw89_sta_link *rtwsta_link, bool dis_conn);
4733 int rtw89_fw_h2c_notify_dbcc(struct rtw89_dev *rtwdev, bool en);
4734 int rtw89_fw_h2c_macid_pause(struct rtw89_dev *rtwdev, u8 sh, u8 grp,
4735 			     bool pause);
4736 int rtw89_fw_h2c_set_edca(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
4737 			  u8 ac, u32 val);
4738 int rtw89_fw_h2c_set_ofld_cfg(struct rtw89_dev *rtwdev);
4739 int rtw89_fw_h2c_tx_duty(struct rtw89_dev *rtwdev, u8 lv);
4740 int rtw89_fw_h2c_set_bcn_fltr_cfg(struct rtw89_dev *rtwdev,
4741 				  struct rtw89_vif_link *rtwvif_link,
4742 				  bool connect);
4743 int rtw89_fw_h2c_rssi_offload(struct rtw89_dev *rtwdev,
4744 			      struct rtw89_rx_phy_ppdu *phy_ppdu);
4745 int rtw89_fw_h2c_tp_offload(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link);
4746 int rtw89_fw_h2c_ra(struct rtw89_dev *rtwdev, struct rtw89_ra_info *ra, bool csi);
4747 int rtw89_fw_h2c_cxdrv_init(struct rtw89_dev *rtwdev, u8 type);
4748 int rtw89_fw_h2c_cxdrv_init_v7(struct rtw89_dev *rtwdev, u8 type);
4749 int rtw89_fw_h2c_cxdrv_role(struct rtw89_dev *rtwdev, u8 type);
4750 int rtw89_fw_h2c_cxdrv_role_v1(struct rtw89_dev *rtwdev, u8 type);
4751 int rtw89_fw_h2c_cxdrv_role_v2(struct rtw89_dev *rtwdev, u8 type);
4752 int rtw89_fw_h2c_cxdrv_role_v7(struct rtw89_dev *rtwdev, u8 type);
4753 int rtw89_fw_h2c_cxdrv_role_v8(struct rtw89_dev *rtwdev, u8 type);
4754 int rtw89_fw_h2c_cxdrv_osi_info(struct rtw89_dev *rtwdev, u8 type);
4755 int rtw89_fw_h2c_cxdrv_ctrl(struct rtw89_dev *rtwdev, u8 type);
4756 int rtw89_fw_h2c_cxdrv_ctrl_v7(struct rtw89_dev *rtwdev, u8 type);
4757 int rtw89_fw_h2c_cxdrv_trx(struct rtw89_dev *rtwdev, u8 type);
4758 int rtw89_fw_h2c_cxdrv_rfk(struct rtw89_dev *rtwdev, u8 type);
4759 int rtw89_fw_h2c_del_pkt_offload(struct rtw89_dev *rtwdev, u8 id);
4760 int rtw89_fw_h2c_add_pkt_offload(struct rtw89_dev *rtwdev, u8 *id,
4761 				 struct sk_buff *skb_ofld);
4762 int rtw89_fw_h2c_scan_offload_ax(struct rtw89_dev *rtwdev,
4763 				 struct rtw89_scan_option *opt,
4764 				 struct rtw89_vif_link *vif,
4765 				 bool wowlan);
4766 int rtw89_fw_h2c_scan_offload_be(struct rtw89_dev *rtwdev,
4767 				 struct rtw89_scan_option *opt,
4768 				 struct rtw89_vif_link *vif,
4769 				 bool wowlan);
4770 int rtw89_fw_h2c_rf_reg(struct rtw89_dev *rtwdev,
4771 			struct rtw89_fw_h2c_rf_reg_info *info,
4772 			u16 len, u8 page);
4773 int rtw89_fw_h2c_rf_ntfy_mcc(struct rtw89_dev *rtwdev);
4774 int rtw89_fw_h2c_rf_ps_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
4775 int rtw89_fw_h2c_rf_pre_ntfy(struct rtw89_dev *rtwdev,
4776 			     enum rtw89_phy_idx phy_idx);
4777 int rtw89_fw_h2c_rf_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
4778 			 const struct rtw89_chan *chan, enum rtw89_tssi_mode tssi_mode);
4779 int rtw89_fw_h2c_rf_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
4780 			const struct rtw89_chan *chan);
4781 int rtw89_fw_h2c_rf_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
4782 			const struct rtw89_chan *chan);
4783 int rtw89_fw_h2c_rf_txgapk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
4784 			   const struct rtw89_chan *chan);
4785 int rtw89_fw_h2c_rf_dack(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
4786 			 const struct rtw89_chan *chan);
4787 int rtw89_fw_h2c_rf_rxdck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
4788 			  const struct rtw89_chan *chan, bool is_chl_k);
4789 int rtw89_fw_h2c_raw_with_hdr(struct rtw89_dev *rtwdev,
4790 			      u8 h2c_class, u8 h2c_func, u8 *buf, u16 len,
4791 			      bool rack, bool dack);
4792 int rtw89_fw_h2c_raw(struct rtw89_dev *rtwdev, const u8 *buf, u16 len);
4793 void rtw89_fw_send_all_early_h2c(struct rtw89_dev *rtwdev);
4794 void __rtw89_fw_free_all_early_h2c(struct rtw89_dev *rtwdev);
4795 void rtw89_fw_free_all_early_h2c(struct rtw89_dev *rtwdev);
4796 int rtw89_fw_h2c_general_pkt(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
4797 			     u8 macid);
4798 void rtw89_fw_release_general_pkt_list_vif(struct rtw89_dev *rtwdev,
4799 					   struct rtw89_vif_link *rtwvif_link,
4800 					   bool notify_fw);
4801 void rtw89_fw_release_general_pkt_list(struct rtw89_dev *rtwdev, bool notify_fw);
4802 int rtw89_fw_h2c_ba_cam(struct rtw89_dev *rtwdev,
4803 			struct rtw89_vif_link *rtwvif_link,
4804 			struct rtw89_sta_link *rtwsta_link,
4805 			bool valid, struct ieee80211_ampdu_params *params);
4806 int rtw89_fw_h2c_ba_cam_v1(struct rtw89_dev *rtwdev,
4807 			   struct rtw89_vif_link *rtwvif_link,
4808 			   struct rtw89_sta_link *rtwsta_link,
4809 			   bool valid, struct ieee80211_ampdu_params *params);
4810 void rtw89_fw_h2c_init_dynamic_ba_cam_v0_ext(struct rtw89_dev *rtwdev);
4811 int rtw89_fw_h2c_init_ba_cam_users(struct rtw89_dev *rtwdev, u8 users,
4812 				   u8 offset, u8 mac_idx);
4813 
4814 int rtw89_fw_h2c_lps_parm(struct rtw89_dev *rtwdev,
4815 			  struct rtw89_lps_parm *lps_param);
4816 int rtw89_fw_h2c_lps_ch_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
4817 int rtw89_fw_h2c_lps_ml_cmn_info(struct rtw89_dev *rtwdev,
4818 				 struct rtw89_vif *rtwvif);
4819 int rtw89_fw_h2c_fwips(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
4820 		       bool enable);
4821 struct sk_buff *rtw89_fw_h2c_alloc_skb_with_hdr(struct rtw89_dev *rtwdev, u32 len);
4822 struct sk_buff *rtw89_fw_h2c_alloc_skb_no_hdr(struct rtw89_dev *rtwdev, u32 len);
4823 int rtw89_fw_msg_reg(struct rtw89_dev *rtwdev,
4824 		     struct rtw89_mac_h2c_info *h2c_info,
4825 		     struct rtw89_mac_c2h_info *c2h_info);
4826 int rtw89_fw_h2c_fw_log(struct rtw89_dev *rtwdev, bool enable);
4827 void rtw89_fw_st_dbg_dump(struct rtw89_dev *rtwdev);
4828 int rtw89_hw_scan_start(struct rtw89_dev *rtwdev,
4829 			struct rtw89_vif_link *rtwvif_link,
4830 			struct ieee80211_scan_request *scan_req);
4831 void rtw89_hw_scan_complete(struct rtw89_dev *rtwdev,
4832 			    struct rtw89_vif_link *rtwvif_link,
4833 			    bool aborted);
4834 int rtw89_hw_scan_offload(struct rtw89_dev *rtwdev,
4835 			  struct rtw89_vif_link *rtwvif_link,
4836 			  bool enable);
4837 void rtw89_hw_scan_abort(struct rtw89_dev *rtwdev,
4838 			 struct rtw89_vif_link *rtwvif_link);
4839 int rtw89_hw_scan_prep_chan_list_ax(struct rtw89_dev *rtwdev,
4840 				    struct rtw89_vif_link *rtwvif_link);
4841 void rtw89_hw_scan_free_chan_list_ax(struct rtw89_dev *rtwdev);
4842 int rtw89_hw_scan_add_chan_list_ax(struct rtw89_dev *rtwdev,
4843 				   struct rtw89_vif_link *rtwvif_link);
4844 int rtw89_pno_scan_add_chan_list_ax(struct rtw89_dev *rtwdev,
4845 				    struct rtw89_vif_link *rtwvif_link);
4846 int rtw89_hw_scan_prep_chan_list_be(struct rtw89_dev *rtwdev,
4847 				    struct rtw89_vif_link *rtwvif_link);
4848 void rtw89_hw_scan_free_chan_list_be(struct rtw89_dev *rtwdev);
4849 int rtw89_hw_scan_add_chan_list_be(struct rtw89_dev *rtwdev,
4850 				   struct rtw89_vif_link *rtwvif_link);
4851 int rtw89_pno_scan_add_chan_list_be(struct rtw89_dev *rtwdev,
4852 				    struct rtw89_vif_link *rtwvif_link);
4853 int rtw89_fw_h2c_trigger_cpu_exception(struct rtw89_dev *rtwdev);
4854 int rtw89_fw_h2c_pkt_drop(struct rtw89_dev *rtwdev,
4855 			  const struct rtw89_pkt_drop_params *params);
4856 int rtw89_fw_h2c_p2p_act(struct rtw89_dev *rtwdev,
4857 			 struct rtw89_vif_link *rtwvif_link,
4858 			 struct ieee80211_p2p_noa_desc *desc,
4859 			 u8 act, u8 noa_id, u8 ctwindow_oppps);
4860 int rtw89_fw_h2c_tsf32_toggle(struct rtw89_dev *rtwdev,
4861 			      struct rtw89_vif_link *rtwvif_link,
4862 			      bool en);
4863 int rtw89_fw_h2c_wow_global(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
4864 			    bool enable);
4865 int rtw89_fw_h2c_wow_wakeup_ctrl(struct rtw89_dev *rtwdev,
4866 				 struct rtw89_vif_link *rtwvif_link, bool enable);
4867 int rtw89_fw_h2c_cfg_pno(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
4868 			 bool enable);
4869 int rtw89_fw_h2c_keep_alive(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
4870 			    bool enable);
4871 int rtw89_fw_h2c_arp_offload(struct rtw89_dev *rtwdev,
4872 			     struct rtw89_vif_link *rtwvif_link, bool enable);
4873 int rtw89_fw_h2c_disconnect_detect(struct rtw89_dev *rtwdev,
4874 				   struct rtw89_vif_link *rtwvif_link, bool enable);
4875 int rtw89_fw_h2c_wow_global(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
4876 			    bool enable);
4877 int rtw89_fw_h2c_wow_wakeup_ctrl(struct rtw89_dev *rtwdev,
4878 				 struct rtw89_vif_link *rtwvif_link, bool enable);
4879 int rtw89_fw_wow_cam_update(struct rtw89_dev *rtwdev,
4880 			    struct rtw89_wow_cam_info *cam_info);
4881 int rtw89_fw_h2c_wow_gtk_ofld(struct rtw89_dev *rtwdev,
4882 			      struct rtw89_vif_link *rtwvif_link,
4883 			      bool enable);
4884 int rtw89_fw_h2c_wow_request_aoac(struct rtw89_dev *rtwdev);
4885 int rtw89_fw_h2c_add_mcc(struct rtw89_dev *rtwdev,
4886 			 const struct rtw89_fw_mcc_add_req *p);
4887 int rtw89_fw_h2c_start_mcc(struct rtw89_dev *rtwdev,
4888 			   const struct rtw89_fw_mcc_start_req *p);
4889 int rtw89_fw_h2c_stop_mcc(struct rtw89_dev *rtwdev, u8 group, u8 macid,
4890 			  bool prev_groups);
4891 int rtw89_fw_h2c_del_mcc_group(struct rtw89_dev *rtwdev, u8 group,
4892 			       bool prev_groups);
4893 int rtw89_fw_h2c_reset_mcc_group(struct rtw89_dev *rtwdev, u8 group);
4894 int rtw89_fw_h2c_mcc_req_tsf(struct rtw89_dev *rtwdev,
4895 			     const struct rtw89_fw_mcc_tsf_req *req,
4896 			     struct rtw89_mac_mcc_tsf_rpt *rpt);
4897 int rtw89_fw_h2c_mcc_macid_bitmap(struct rtw89_dev *rtwdev, u8 group, u8 macid,
4898 				  u8 *bitmap);
4899 int rtw89_fw_h2c_mcc_sync(struct rtw89_dev *rtwdev, u8 group, u8 source,
4900 			  u8 target, u8 offset);
4901 int rtw89_fw_h2c_mcc_set_duration(struct rtw89_dev *rtwdev,
4902 				  const struct rtw89_fw_mcc_duration *p);
4903 int rtw89_fw_h2c_mrc_add(struct rtw89_dev *rtwdev,
4904 			 const struct rtw89_fw_mrc_add_arg *arg);
4905 int rtw89_fw_h2c_mrc_start(struct rtw89_dev *rtwdev,
4906 			   const struct rtw89_fw_mrc_start_arg *arg);
4907 int rtw89_fw_h2c_mrc_del(struct rtw89_dev *rtwdev, u8 sch_idx, u8 slot_idx);
4908 int rtw89_fw_h2c_mrc_req_tsf(struct rtw89_dev *rtwdev,
4909 			     const struct rtw89_fw_mrc_req_tsf_arg *arg,
4910 			     struct rtw89_mac_mrc_tsf_rpt *rpt);
4911 int rtw89_fw_h2c_mrc_upd_bitmap(struct rtw89_dev *rtwdev,
4912 				const struct rtw89_fw_mrc_upd_bitmap_arg *arg);
4913 int rtw89_fw_h2c_mrc_sync(struct rtw89_dev *rtwdev,
4914 			  const struct rtw89_fw_mrc_sync_arg *arg);
4915 int rtw89_fw_h2c_mrc_upd_duration(struct rtw89_dev *rtwdev,
4916 				  const struct rtw89_fw_mrc_upd_duration_arg *arg);
4917 int rtw89_fw_h2c_ap_info_refcount(struct rtw89_dev *rtwdev, bool en);
4918 int rtw89_fw_h2c_mlo_link_cfg(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
4919 			      bool enable);
4920 
4921 static inline void rtw89_fw_h2c_init_ba_cam(struct rtw89_dev *rtwdev)
4922 {
4923 	const struct rtw89_chip_info *chip = rtwdev->chip;
4924 
4925 	if (chip->bacam_ver == RTW89_BACAM_V0_EXT)
4926 		rtw89_fw_h2c_init_dynamic_ba_cam_v0_ext(rtwdev);
4927 }
4928 
4929 static inline int rtw89_chip_h2c_default_cmac_tbl(struct rtw89_dev *rtwdev,
4930 						  struct rtw89_vif_link *rtwvif_link,
4931 						  struct rtw89_sta_link *rtwsta_link)
4932 {
4933 	const struct rtw89_chip_info *chip = rtwdev->chip;
4934 
4935 	return chip->ops->h2c_default_cmac_tbl(rtwdev, rtwvif_link, rtwsta_link);
4936 }
4937 
4938 static inline int rtw89_chip_h2c_default_dmac_tbl(struct rtw89_dev *rtwdev,
4939 						  struct rtw89_vif_link *rtwvif_link,
4940 						  struct rtw89_sta_link *rtwsta_link)
4941 {
4942 	const struct rtw89_chip_info *chip = rtwdev->chip;
4943 
4944 	if (chip->ops->h2c_default_dmac_tbl)
4945 		return chip->ops->h2c_default_dmac_tbl(rtwdev, rtwvif_link, rtwsta_link);
4946 
4947 	return 0;
4948 }
4949 
4950 static inline int rtw89_chip_h2c_update_beacon(struct rtw89_dev *rtwdev,
4951 					       struct rtw89_vif_link *rtwvif_link)
4952 {
4953 	const struct rtw89_chip_info *chip = rtwdev->chip;
4954 
4955 	return chip->ops->h2c_update_beacon(rtwdev, rtwvif_link);
4956 }
4957 
4958 static inline int rtw89_chip_h2c_assoc_cmac_tbl(struct rtw89_dev *rtwdev,
4959 						struct rtw89_vif_link *rtwvif_link,
4960 						struct rtw89_sta_link *rtwsta_link)
4961 {
4962 	const struct rtw89_chip_info *chip = rtwdev->chip;
4963 
4964 	return chip->ops->h2c_assoc_cmac_tbl(rtwdev, rtwvif_link, rtwsta_link);
4965 }
4966 
4967 static inline
4968 int rtw89_chip_h2c_ampdu_link_cmac_tbl(struct rtw89_dev *rtwdev,
4969 				       struct rtw89_vif_link *rtwvif_link,
4970 				       struct rtw89_sta_link *rtwsta_link)
4971 {
4972 	const struct rtw89_chip_info *chip = rtwdev->chip;
4973 
4974 	if (chip->ops->h2c_ampdu_cmac_tbl)
4975 		return chip->ops->h2c_ampdu_cmac_tbl(rtwdev, rtwvif_link,
4976 						     rtwsta_link);
4977 
4978 	return 0;
4979 }
4980 
4981 static inline int rtw89_chip_h2c_ampdu_cmac_tbl(struct rtw89_dev *rtwdev,
4982 						struct rtw89_vif *rtwvif,
4983 						struct rtw89_sta *rtwsta)
4984 {
4985 	struct rtw89_vif_link *rtwvif_link;
4986 	struct rtw89_sta_link *rtwsta_link;
4987 	unsigned int link_id;
4988 	int ret;
4989 
4990 	rtw89_sta_for_each_link(rtwsta, rtwsta_link, link_id) {
4991 		rtwvif_link = rtwsta_link->rtwvif_link;
4992 		ret = rtw89_chip_h2c_ampdu_link_cmac_tbl(rtwdev, rtwvif_link,
4993 							 rtwsta_link);
4994 		if (ret)
4995 			return ret;
4996 	}
4997 
4998 	return 0;
4999 }
5000 
5001 static inline
5002 int rtw89_chip_h2c_txtime_cmac_tbl(struct rtw89_dev *rtwdev,
5003 				   struct rtw89_sta_link *rtwsta_link)
5004 {
5005 	const struct rtw89_chip_info *chip = rtwdev->chip;
5006 
5007 	return chip->ops->h2c_txtime_cmac_tbl(rtwdev, rtwsta_link);
5008 }
5009 
5010 static inline
5011 int rtw89_chip_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
5012 			  bool valid, struct ieee80211_ampdu_params *params)
5013 {
5014 	const struct rtw89_chip_info *chip = rtwdev->chip;
5015 	struct rtw89_vif_link *rtwvif_link;
5016 	struct rtw89_sta_link *rtwsta_link;
5017 	unsigned int link_id;
5018 	int ret;
5019 
5020 	rtw89_sta_for_each_link(rtwsta, rtwsta_link, link_id) {
5021 		rtwvif_link = rtwsta_link->rtwvif_link;
5022 		ret = chip->ops->h2c_ba_cam(rtwdev, rtwvif_link, rtwsta_link,
5023 					    valid, params);
5024 		if (ret)
5025 			return ret;
5026 	}
5027 
5028 	return 0;
5029 }
5030 
5031 /* Must consider compatibility; don't insert new in the mid.
5032  * Fill each field's default value in rtw89_regd_entcpy().
5033  */
5034 struct rtw89_fw_regd_entry {
5035 	u8 alpha2_0;
5036 	u8 alpha2_1;
5037 	u8 rule_2ghz;
5038 	u8 rule_5ghz;
5039 	u8 rule_6ghz;
5040 	__le32 fmap;
5041 } __packed;
5042 
5043 /* must consider compatibility; don't insert new in the mid */
5044 struct rtw89_fw_txpwr_byrate_entry {
5045 	u8 band;
5046 	u8 nss;
5047 	u8 rs;
5048 	u8 shf;
5049 	u8 len;
5050 	__le32 data;
5051 	u8 bw;
5052 	u8 ofdma;
5053 } __packed;
5054 
5055 /* must consider compatibility; don't insert new in the mid */
5056 struct rtw89_fw_txpwr_lmt_2ghz_entry {
5057 	u8 bw;
5058 	u8 nt;
5059 	u8 rs;
5060 	u8 bf;
5061 	u8 regd;
5062 	u8 ch_idx;
5063 	s8 v;
5064 } __packed;
5065 
5066 /* must consider compatibility; don't insert new in the mid */
5067 struct rtw89_fw_txpwr_lmt_5ghz_entry {
5068 	u8 bw;
5069 	u8 nt;
5070 	u8 rs;
5071 	u8 bf;
5072 	u8 regd;
5073 	u8 ch_idx;
5074 	s8 v;
5075 } __packed;
5076 
5077 /* must consider compatibility; don't insert new in the mid */
5078 struct rtw89_fw_txpwr_lmt_6ghz_entry {
5079 	u8 bw;
5080 	u8 nt;
5081 	u8 rs;
5082 	u8 bf;
5083 	u8 regd;
5084 	u8 reg_6ghz_power;
5085 	u8 ch_idx;
5086 	s8 v;
5087 } __packed;
5088 
5089 /* must consider compatibility; don't insert new in the mid */
5090 struct rtw89_fw_txpwr_lmt_ru_2ghz_entry {
5091 	u8 ru;
5092 	u8 nt;
5093 	u8 regd;
5094 	u8 ch_idx;
5095 	s8 v;
5096 } __packed;
5097 
5098 /* must consider compatibility; don't insert new in the mid */
5099 struct rtw89_fw_txpwr_lmt_ru_5ghz_entry {
5100 	u8 ru;
5101 	u8 nt;
5102 	u8 regd;
5103 	u8 ch_idx;
5104 	s8 v;
5105 } __packed;
5106 
5107 /* must consider compatibility; don't insert new in the mid */
5108 struct rtw89_fw_txpwr_lmt_ru_6ghz_entry {
5109 	u8 ru;
5110 	u8 nt;
5111 	u8 regd;
5112 	u8 reg_6ghz_power;
5113 	u8 ch_idx;
5114 	s8 v;
5115 } __packed;
5116 
5117 /* must consider compatibility; don't insert new in the mid */
5118 struct rtw89_fw_tx_shape_lmt_entry {
5119 	u8 band;
5120 	u8 tx_shape_rs;
5121 	u8 regd;
5122 	u8 v;
5123 } __packed;
5124 
5125 /* must consider compatibility; don't insert new in the mid */
5126 struct rtw89_fw_tx_shape_lmt_ru_entry {
5127 	u8 band;
5128 	u8 regd;
5129 	u8 v;
5130 } __packed;
5131 
5132 const struct rtw89_rfe_parms *
5133 rtw89_load_rfe_data_from_fw(struct rtw89_dev *rtwdev,
5134 			    const struct rtw89_rfe_parms *init);
5135 
5136 enum rtw89_wow_wakeup_ver {
5137 	RTW89_WOW_REASON_V0,
5138 	RTW89_WOW_REASON_V1,
5139 	RTW89_WOW_REASON_NUM,
5140 };
5141 
5142 #endif
5143