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