xref: /freebsd/sys/contrib/dev/rtw89/fw.h (revision df279a26d3315e7abc9e6f0744137959a4c2fb86)
18e93258fSBjoern A. Zeeb /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
28e93258fSBjoern A. Zeeb /* Copyright(c) 2019-2020  Realtek Corporation
38e93258fSBjoern A. Zeeb  */
48e93258fSBjoern A. Zeeb 
58e93258fSBjoern A. Zeeb #ifndef __RTW89_FW_H__
68e93258fSBjoern A. Zeeb #define __RTW89_FW_H__
78e93258fSBjoern A. Zeeb 
88e93258fSBjoern A. Zeeb #include "core.h"
98e93258fSBjoern A. Zeeb 
108e93258fSBjoern A. Zeeb enum rtw89_fw_dl_status {
118e93258fSBjoern A. Zeeb 	RTW89_FWDL_INITIAL_STATE = 0,
128e93258fSBjoern A. Zeeb 	RTW89_FWDL_FWDL_ONGOING = 1,
138e93258fSBjoern A. Zeeb 	RTW89_FWDL_CHECKSUM_FAIL = 2,
148e93258fSBjoern A. Zeeb 	RTW89_FWDL_SECURITY_FAIL = 3,
158e93258fSBjoern A. Zeeb 	RTW89_FWDL_CV_NOT_MATCH = 4,
168e93258fSBjoern A. Zeeb 	RTW89_FWDL_RSVD0 = 5,
178e93258fSBjoern A. Zeeb 	RTW89_FWDL_WCPU_FWDL_RDY = 6,
188e93258fSBjoern A. Zeeb 	RTW89_FWDL_WCPU_FW_INIT_RDY = 7
198e93258fSBjoern A. Zeeb };
208e93258fSBjoern A. Zeeb 
21e2340276SBjoern A. Zeeb struct rtw89_c2hreg_hdr {
22e2340276SBjoern A. Zeeb 	u32 w0;
23e2340276SBjoern A. Zeeb };
248e93258fSBjoern A. Zeeb 
25e2340276SBjoern A. Zeeb #define RTW89_C2HREG_HDR_FUNC_MASK GENMASK(6, 0)
26e2340276SBjoern A. Zeeb #define RTW89_C2HREG_HDR_ACK BIT(7)
27e2340276SBjoern A. Zeeb #define RTW89_C2HREG_HDR_LEN_MASK GENMASK(11, 8)
28e2340276SBjoern A. Zeeb #define RTW89_C2HREG_HDR_SEQ_MASK GENMASK(15, 12)
29e2340276SBjoern A. Zeeb 
30e2340276SBjoern A. Zeeb struct rtw89_c2hreg_phycap {
31e2340276SBjoern A. Zeeb 	u32 w0;
32e2340276SBjoern A. Zeeb 	u32 w1;
33e2340276SBjoern A. Zeeb 	u32 w2;
34e2340276SBjoern A. Zeeb 	u32 w3;
35e2340276SBjoern A. Zeeb } __packed;
36e2340276SBjoern A. Zeeb 
37e2340276SBjoern A. Zeeb #define RTW89_C2HREG_PHYCAP_W0_FUNC GENMASK(6, 0)
38e2340276SBjoern A. Zeeb #define RTW89_C2HREG_PHYCAP_W0_ACK BIT(7)
39e2340276SBjoern A. Zeeb #define RTW89_C2HREG_PHYCAP_W0_LEN GENMASK(11, 8)
40e2340276SBjoern A. Zeeb #define RTW89_C2HREG_PHYCAP_W0_SEQ GENMASK(15, 12)
41e2340276SBjoern A. Zeeb #define RTW89_C2HREG_PHYCAP_W0_RX_NSS GENMASK(23, 16)
42e2340276SBjoern A. Zeeb #define RTW89_C2HREG_PHYCAP_W0_BW GENMASK(31, 24)
43e2340276SBjoern A. Zeeb #define RTW89_C2HREG_PHYCAP_W1_TX_NSS GENMASK(7, 0)
44e2340276SBjoern A. Zeeb #define RTW89_C2HREG_PHYCAP_W1_PROT GENMASK(15, 8)
45e2340276SBjoern A. Zeeb #define RTW89_C2HREG_PHYCAP_W1_NIC GENMASK(23, 16)
46e2340276SBjoern A. Zeeb #define RTW89_C2HREG_PHYCAP_W1_WL_FUNC GENMASK(31, 24)
47e2340276SBjoern A. Zeeb #define RTW89_C2HREG_PHYCAP_W2_HW_TYPE GENMASK(7, 0)
48e2340276SBjoern A. Zeeb #define RTW89_C2HREG_PHYCAP_W3_ANT_TX_NUM GENMASK(15, 8)
49e2340276SBjoern A. Zeeb #define RTW89_C2HREG_PHYCAP_W3_ANT_RX_NUM GENMASK(23, 16)
50*df279a26SBjoern A. Zeeb #define RTW89_C2HREG_PHYCAP_W3_BAND_SEL GENMASK(31, 24)
51*df279a26SBjoern A. Zeeb 
52*df279a26SBjoern A. Zeeb #define RTW89_C2HREG_PHYCAP_P1_W0_B1_RX_NSS GENMASK(23, 16)
53*df279a26SBjoern A. Zeeb #define RTW89_C2HREG_PHYCAP_P1_W0_B1_BW GENMASK(31, 24)
54*df279a26SBjoern A. Zeeb #define RTW89_C2HREG_PHYCAP_P1_W1_B1_TX_NSS GENMASK(7, 0)
55*df279a26SBjoern A. Zeeb #define RTW89_C2HREG_PHYCAP_P1_W1_B1_ANT_TX_NUM GENMASK(15, 8)
56*df279a26SBjoern A. Zeeb #define RTW89_C2HREG_PHYCAP_P1_W1_B1_ANT_RX_NUM GENMASK(23, 16)
57*df279a26SBjoern A. Zeeb #define RTW89_C2HREG_PHYCAP_P1_W1_B1_BAND_SEL GENMASK(31, 24)
58*df279a26SBjoern A. Zeeb #define RTW89_C2HREG_PHYCAP_P1_W2_QAM GENMASK(7, 0)
59*df279a26SBjoern A. Zeeb #define RTW89_C2HREG_PHYCAP_P1_W2_QAM_256  0x1
60*df279a26SBjoern A. Zeeb #define RTW89_C2HREG_PHYCAP_P1_W2_QAM_1024 0x2
61*df279a26SBjoern A. Zeeb #define RTW89_C2HREG_PHYCAP_P1_W2_QAM_4096 0x3
62*df279a26SBjoern A. Zeeb #define RTW89_C2HREG_PHYCAP_P1_W2_B1_QAM GENMASK(15, 8)
63e2340276SBjoern A. Zeeb 
646d67aabdSBjoern A. Zeeb #define RTW89_C2HREG_AOAC_RPT_1_W0_KEY_IDX GENMASK(23, 16)
656d67aabdSBjoern A. Zeeb #define RTW89_C2HREG_AOAC_RPT_1_W1_IV_0 GENMASK(7, 0)
666d67aabdSBjoern A. Zeeb #define RTW89_C2HREG_AOAC_RPT_1_W1_IV_1 GENMASK(15, 8)
676d67aabdSBjoern A. Zeeb #define RTW89_C2HREG_AOAC_RPT_1_W1_IV_2 GENMASK(23, 16)
686d67aabdSBjoern A. Zeeb #define RTW89_C2HREG_AOAC_RPT_1_W1_IV_3 GENMASK(31, 24)
696d67aabdSBjoern A. Zeeb #define RTW89_C2HREG_AOAC_RPT_1_W2_IV_4 GENMASK(7, 0)
706d67aabdSBjoern A. Zeeb #define RTW89_C2HREG_AOAC_RPT_1_W2_IV_5 GENMASK(15, 8)
716d67aabdSBjoern A. Zeeb #define RTW89_C2HREG_AOAC_RPT_1_W2_IV_6 GENMASK(23, 16)
726d67aabdSBjoern A. Zeeb #define RTW89_C2HREG_AOAC_RPT_1_W2_IV_7 GENMASK(31, 24)
736d67aabdSBjoern A. Zeeb #define RTW89_C2HREG_AOAC_RPT_1_W3_PTK_IV_0 GENMASK(7, 0)
746d67aabdSBjoern A. Zeeb #define RTW89_C2HREG_AOAC_RPT_1_W3_PTK_IV_1 GENMASK(15, 8)
756d67aabdSBjoern A. Zeeb #define RTW89_C2HREG_AOAC_RPT_1_W3_PTK_IV_2 GENMASK(23, 16)
766d67aabdSBjoern A. Zeeb #define RTW89_C2HREG_AOAC_RPT_1_W3_PTK_IV_3 GENMASK(31, 24)
776d67aabdSBjoern A. Zeeb #define RTW89_C2HREG_AOAC_RPT_2_W0_PTK_IV_4 GENMASK(23, 16)
786d67aabdSBjoern A. Zeeb #define RTW89_C2HREG_AOAC_RPT_2_W0_PTK_IV_5 GENMASK(31, 24)
796d67aabdSBjoern A. Zeeb #define RTW89_C2HREG_AOAC_RPT_2_W1_PTK_IV_6 GENMASK(7, 0)
806d67aabdSBjoern A. Zeeb #define RTW89_C2HREG_AOAC_RPT_2_W1_PTK_IV_7 GENMASK(15, 8)
816d67aabdSBjoern A. Zeeb #define RTW89_C2HREG_AOAC_RPT_2_W1_IGTK_IPN_IV_0 GENMASK(23, 16)
826d67aabdSBjoern A. Zeeb #define RTW89_C2HREG_AOAC_RPT_2_W1_IGTK_IPN_IV_1 GENMASK(31, 24)
836d67aabdSBjoern A. Zeeb #define RTW89_C2HREG_AOAC_RPT_2_W2_IGTK_IPN_IV_2 GENMASK(7, 0)
846d67aabdSBjoern A. Zeeb #define RTW89_C2HREG_AOAC_RPT_2_W2_IGTK_IPN_IV_3 GENMASK(15, 8)
856d67aabdSBjoern A. Zeeb #define RTW89_C2HREG_AOAC_RPT_2_W2_IGTK_IPN_IV_4 GENMASK(23, 16)
866d67aabdSBjoern A. Zeeb #define RTW89_C2HREG_AOAC_RPT_2_W2_IGTK_IPN_IV_5 GENMASK(31, 24)
876d67aabdSBjoern A. Zeeb #define RTW89_C2HREG_AOAC_RPT_2_W3_IGTK_IPN_IV_6 GENMASK(7, 0)
886d67aabdSBjoern A. Zeeb #define RTW89_C2HREG_AOAC_RPT_2_W3_IGTK_IPN_IV_7 GENMASK(15, 8)
896d67aabdSBjoern A. Zeeb 
90e2340276SBjoern A. Zeeb struct rtw89_h2creg_hdr {
91e2340276SBjoern A. Zeeb 	u32 w0;
92e2340276SBjoern A. Zeeb };
93e2340276SBjoern A. Zeeb 
94e2340276SBjoern A. Zeeb #define RTW89_H2CREG_HDR_FUNC_MASK GENMASK(6, 0)
95e2340276SBjoern A. Zeeb #define RTW89_H2CREG_HDR_LEN_MASK GENMASK(11, 8)
96e2340276SBjoern A. Zeeb 
97e2340276SBjoern A. Zeeb struct rtw89_h2creg_sch_tx_en {
98e2340276SBjoern A. Zeeb 	u32 w0;
99e2340276SBjoern A. Zeeb 	u32 w1;
100e2340276SBjoern A. Zeeb } __packed;
101e2340276SBjoern A. Zeeb 
102e2340276SBjoern A. Zeeb #define RTW89_H2CREG_SCH_TX_EN_W0_EN GENMASK(31, 16)
103e2340276SBjoern A. Zeeb #define RTW89_H2CREG_SCH_TX_EN_W1_MASK GENMASK(15, 0)
104e2340276SBjoern A. Zeeb #define RTW89_H2CREG_SCH_TX_EN_W1_BAND BIT(16)
1058e93258fSBjoern A. Zeeb 
1066d67aabdSBjoern A. Zeeb #define RTW89_H2CREG_WOW_CPUIO_RX_CTRL_EN GENMASK(23, 16)
1076d67aabdSBjoern A. Zeeb 
108*df279a26SBjoern A. Zeeb #define RTW89_H2CREG_GET_FEATURE_PART_NUM GENMASK(23, 16)
109*df279a26SBjoern A. Zeeb 
1108e93258fSBjoern A. Zeeb #define RTW89_H2CREG_MAX 4
1118e93258fSBjoern A. Zeeb #define RTW89_C2HREG_MAX 4
1128e93258fSBjoern A. Zeeb #define RTW89_C2HREG_HDR_LEN 2
1138e93258fSBjoern A. Zeeb #define RTW89_H2CREG_HDR_LEN 2
1148e93258fSBjoern A. Zeeb #define RTW89_C2H_TIMEOUT 1000000
1158e93258fSBjoern A. Zeeb struct rtw89_mac_c2h_info {
1168e93258fSBjoern A. Zeeb 	u8 id;
1178e93258fSBjoern A. Zeeb 	u8 content_len;
118e2340276SBjoern A. Zeeb 	union {
1198e93258fSBjoern A. Zeeb 		u32 c2hreg[RTW89_C2HREG_MAX];
120e2340276SBjoern A. Zeeb 		struct rtw89_c2hreg_hdr hdr;
121e2340276SBjoern A. Zeeb 		struct rtw89_c2hreg_phycap phycap;
122e2340276SBjoern A. Zeeb 	} u;
1238e93258fSBjoern A. Zeeb };
1248e93258fSBjoern A. Zeeb 
1258e93258fSBjoern A. Zeeb struct rtw89_mac_h2c_info {
1268e93258fSBjoern A. Zeeb 	u8 id;
1278e93258fSBjoern A. Zeeb 	u8 content_len;
128e2340276SBjoern A. Zeeb 	union {
1298e93258fSBjoern A. Zeeb 		u32 h2creg[RTW89_H2CREG_MAX];
130e2340276SBjoern A. Zeeb 		struct rtw89_h2creg_hdr hdr;
131e2340276SBjoern A. Zeeb 		struct rtw89_h2creg_sch_tx_en sch_tx_en;
132e2340276SBjoern A. Zeeb 	} u;
1338e93258fSBjoern A. Zeeb };
1348e93258fSBjoern A. Zeeb 
1358e93258fSBjoern A. Zeeb enum rtw89_mac_h2c_type {
1368e93258fSBjoern A. Zeeb 	RTW89_FWCMD_H2CREG_FUNC_H2CREG_LB = 0,
1378e93258fSBjoern A. Zeeb 	RTW89_FWCMD_H2CREG_FUNC_CNSL_CMD,
1388e93258fSBjoern A. Zeeb 	RTW89_FWCMD_H2CREG_FUNC_FWERR,
1398e93258fSBjoern A. Zeeb 	RTW89_FWCMD_H2CREG_FUNC_GET_FEATURE,
1408e93258fSBjoern A. Zeeb 	RTW89_FWCMD_H2CREG_FUNC_GETPKT_INFORM,
1416d67aabdSBjoern A. Zeeb 	RTW89_FWCMD_H2CREG_FUNC_SCH_TX_EN,
1426d67aabdSBjoern A. Zeeb 	RTW89_FWCMD_H2CREG_FUNC_WOW_TRX_STOP,
1436d67aabdSBjoern A. Zeeb 	RTW89_FWCMD_H2CREG_FUNC_AOAC_RPT_1,
1446d67aabdSBjoern A. Zeeb 	RTW89_FWCMD_H2CREG_FUNC_AOAC_RPT_2,
1456d67aabdSBjoern A. Zeeb 	RTW89_FWCMD_H2CREG_FUNC_AOAC_RPT_3_REQ,
1466d67aabdSBjoern A. Zeeb 	RTW89_FWCMD_H2CREG_FUNC_WOW_CPUIO_RX_CTRL,
1478e93258fSBjoern A. Zeeb };
1488e93258fSBjoern A. Zeeb 
1498e93258fSBjoern A. Zeeb enum rtw89_mac_c2h_type {
1508e93258fSBjoern A. Zeeb 	RTW89_FWCMD_C2HREG_FUNC_C2HREG_LB = 0,
1518e93258fSBjoern A. Zeeb 	RTW89_FWCMD_C2HREG_FUNC_ERR_RPT,
1528e93258fSBjoern A. Zeeb 	RTW89_FWCMD_C2HREG_FUNC_ERR_MSG,
1538e93258fSBjoern A. Zeeb 	RTW89_FWCMD_C2HREG_FUNC_PHY_CAP,
1548e93258fSBjoern A. Zeeb 	RTW89_FWCMD_C2HREG_FUNC_TX_PAUSE_RPT,
1556d67aabdSBjoern A. Zeeb 	RTW89_FWCMD_C2HREG_FUNC_WOW_CPUIO_RX_ACK = 0xA,
156*df279a26SBjoern A. Zeeb 	RTW89_FWCMD_C2HREG_FUNC_PHY_CAP_PART1 = 0xC,
1576d67aabdSBjoern A. Zeeb 	RTW89_FWCMD_C2HREG_FUNC_NULL = 0xFF,
1588e93258fSBjoern A. Zeeb };
1598e93258fSBjoern A. Zeeb 
1608e93258fSBjoern A. Zeeb enum rtw89_fw_c2h_category {
1618e93258fSBjoern A. Zeeb 	RTW89_C2H_CAT_TEST,
1628e93258fSBjoern A. Zeeb 	RTW89_C2H_CAT_MAC,
1638e93258fSBjoern A. Zeeb 	RTW89_C2H_CAT_OUTSRC,
1648e93258fSBjoern A. Zeeb };
1658e93258fSBjoern A. Zeeb 
1668e93258fSBjoern A. Zeeb enum rtw89_fw_log_level {
1678e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_LEVEL_OFF,
1688e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_LEVEL_CRT,
1698e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_LEVEL_SER,
1708e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_LEVEL_WARN,
1718e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_LEVEL_LOUD,
1728e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_LEVEL_TR,
1738e93258fSBjoern A. Zeeb };
1748e93258fSBjoern A. Zeeb 
1758e93258fSBjoern A. Zeeb enum rtw89_fw_log_path {
1768e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_LEVEL_UART,
1778e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_LEVEL_C2H,
1788e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_LEVEL_SNI,
1798e93258fSBjoern A. Zeeb };
1808e93258fSBjoern A. Zeeb 
1818e93258fSBjoern A. Zeeb enum rtw89_fw_log_comp {
1828e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_COMP_VER,
1838e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_COMP_INIT,
1848e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_COMP_TASK,
1858e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_COMP_CNS,
1868e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_COMP_H2C,
1878e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_COMP_C2H,
1888e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_COMP_TX,
1898e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_COMP_RX,
1908e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_COMP_IPSEC,
1918e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_COMP_TIMER,
1928e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_COMP_DBGPKT,
1938e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_COMP_PS,
1948e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_COMP_ERROR,
1958e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_COMP_WOWLAN,
1968e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_COMP_SECURE_BOOT,
1978e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_COMP_BTC,
1988e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_COMP_BB,
1998e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_COMP_TWT,
2008e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_COMP_RF,
2018e93258fSBjoern A. Zeeb 	RTW89_FW_LOG_COMP_MCC = 20,
2026d67aabdSBjoern A. Zeeb 	RTW89_FW_LOG_COMP_SCAN = 28,
2038e93258fSBjoern A. Zeeb };
2048e93258fSBjoern A. Zeeb 
2058e93258fSBjoern A. Zeeb enum rtw89_pkt_offload_op {
2068e93258fSBjoern A. Zeeb 	RTW89_PKT_OFLD_OP_ADD,
2078e93258fSBjoern A. Zeeb 	RTW89_PKT_OFLD_OP_DEL,
2088e93258fSBjoern A. Zeeb 	RTW89_PKT_OFLD_OP_READ,
209e2340276SBjoern A. Zeeb 
210e2340276SBjoern A. Zeeb 	NUM_OF_RTW89_PKT_OFFLOAD_OP,
2118e93258fSBjoern A. Zeeb };
2128e93258fSBjoern A. Zeeb 
213e2340276SBjoern A. Zeeb #define RTW89_PKT_OFLD_WAIT_TAG(pkt_id, pkt_op) \
214e2340276SBjoern A. Zeeb 	((pkt_id) * NUM_OF_RTW89_PKT_OFFLOAD_OP + (pkt_op))
215e2340276SBjoern A. Zeeb 
2168e93258fSBjoern A. Zeeb enum rtw89_scanofld_notify_reason {
2178e93258fSBjoern A. Zeeb 	RTW89_SCAN_DWELL_NOTIFY,
2188e93258fSBjoern A. Zeeb 	RTW89_SCAN_PRE_TX_NOTIFY,
2198e93258fSBjoern A. Zeeb 	RTW89_SCAN_POST_TX_NOTIFY,
2208e93258fSBjoern A. Zeeb 	RTW89_SCAN_ENTER_CH_NOTIFY,
2218e93258fSBjoern A. Zeeb 	RTW89_SCAN_LEAVE_CH_NOTIFY,
2228e93258fSBjoern A. Zeeb 	RTW89_SCAN_END_SCAN_NOTIFY,
2236d67aabdSBjoern A. Zeeb 	RTW89_SCAN_REPORT_NOTIFY,
2246d67aabdSBjoern A. Zeeb 	RTW89_SCAN_CHKPT_NOTIFY,
2256d67aabdSBjoern A. Zeeb 	RTW89_SCAN_ENTER_OP_NOTIFY,
2266d67aabdSBjoern A. Zeeb 	RTW89_SCAN_LEAVE_OP_NOTIFY,
2276d67aabdSBjoern A. Zeeb };
2286d67aabdSBjoern A. Zeeb 
2296d67aabdSBjoern A. Zeeb enum rtw89_scanofld_status {
2306d67aabdSBjoern A. Zeeb 	RTW89_SCAN_STATUS_NOTIFY,
2316d67aabdSBjoern A. Zeeb 	RTW89_SCAN_STATUS_SUCCESS,
2326d67aabdSBjoern A. Zeeb 	RTW89_SCAN_STATUS_FAIL,
2338e93258fSBjoern A. Zeeb };
2348e93258fSBjoern A. Zeeb 
2358e93258fSBjoern A. Zeeb enum rtw89_chan_type {
2368e93258fSBjoern A. Zeeb 	RTW89_CHAN_OPERATE = 0,
2378e93258fSBjoern A. Zeeb 	RTW89_CHAN_ACTIVE,
2388e93258fSBjoern A. Zeeb 	RTW89_CHAN_DFS,
2398e93258fSBjoern A. Zeeb };
2408e93258fSBjoern A. Zeeb 
241e2340276SBjoern A. Zeeb enum rtw89_p2pps_action {
242e2340276SBjoern A. Zeeb 	RTW89_P2P_ACT_INIT = 0,
243e2340276SBjoern A. Zeeb 	RTW89_P2P_ACT_UPDATE = 1,
244e2340276SBjoern A. Zeeb 	RTW89_P2P_ACT_REMOVE = 2,
245e2340276SBjoern A. Zeeb 	RTW89_P2P_ACT_TERMINATE = 3,
246e2340276SBjoern A. Zeeb };
247e2340276SBjoern A. Zeeb 
2486d67aabdSBjoern A. Zeeb #define RTW89_DEFAULT_CQM_HYST 4
2496d67aabdSBjoern A. Zeeb #define RTW89_DEFAULT_CQM_THOLD -70
2506d67aabdSBjoern A. Zeeb 
251e2340276SBjoern A. Zeeb enum rtw89_bcn_fltr_offload_mode {
252e2340276SBjoern A. Zeeb 	RTW89_BCN_FLTR_OFFLOAD_MODE_0 = 0,
253e2340276SBjoern A. Zeeb 	RTW89_BCN_FLTR_OFFLOAD_MODE_1,
254e2340276SBjoern A. Zeeb 	RTW89_BCN_FLTR_OFFLOAD_MODE_2,
255e2340276SBjoern A. Zeeb 	RTW89_BCN_FLTR_OFFLOAD_MODE_3,
256e2340276SBjoern A. Zeeb 
257e2340276SBjoern A. Zeeb 	RTW89_BCN_FLTR_OFFLOAD_MODE_DEFAULT = RTW89_BCN_FLTR_OFFLOAD_MODE_0,
258e2340276SBjoern A. Zeeb };
259e2340276SBjoern A. Zeeb 
260e2340276SBjoern A. Zeeb enum rtw89_bcn_fltr_type {
261e2340276SBjoern A. Zeeb 	RTW89_BCN_FLTR_BEACON_LOSS,
262e2340276SBjoern A. Zeeb 	RTW89_BCN_FLTR_RSSI,
263e2340276SBjoern A. Zeeb 	RTW89_BCN_FLTR_NOTIFY,
264e2340276SBjoern A. Zeeb };
265e2340276SBjoern A. Zeeb 
266e2340276SBjoern A. Zeeb enum rtw89_bcn_fltr_rssi_event {
267e2340276SBjoern A. Zeeb 	RTW89_BCN_FLTR_RSSI_NOT_CHANGED,
268e2340276SBjoern A. Zeeb 	RTW89_BCN_FLTR_RSSI_HIGH,
269e2340276SBjoern A. Zeeb 	RTW89_BCN_FLTR_RSSI_LOW,
270e2340276SBjoern A. Zeeb };
271e2340276SBjoern A. Zeeb 
2728e93258fSBjoern A. Zeeb #define FWDL_SECTION_MAX_NUM 10
2738e93258fSBjoern A. Zeeb #define FWDL_SECTION_CHKSUM_LEN	8
2748e93258fSBjoern A. Zeeb #define FWDL_SECTION_PER_PKT_LEN 2020
2758e93258fSBjoern A. Zeeb 
2768e93258fSBjoern A. Zeeb struct rtw89_fw_hdr_section_info {
2778e93258fSBjoern A. Zeeb 	u8 redl;
2788e93258fSBjoern A. Zeeb 	const u8 *addr;
2798e93258fSBjoern A. Zeeb 	u32 len;
280*df279a26SBjoern A. Zeeb 	u32 len_override;
2818e93258fSBjoern A. Zeeb 	u32 dladdr;
282e2340276SBjoern A. Zeeb 	u32 mssc;
283e2340276SBjoern A. Zeeb 	u8 type;
2846d67aabdSBjoern A. Zeeb 	bool ignore;
2856d67aabdSBjoern A. Zeeb 	const u8 *key_addr;
2866d67aabdSBjoern A. Zeeb 	u32 key_len;
2876d67aabdSBjoern A. Zeeb 	u32 key_idx;
2888e93258fSBjoern A. Zeeb };
2898e93258fSBjoern A. Zeeb 
2908e93258fSBjoern A. Zeeb struct rtw89_fw_bin_info {
2918e93258fSBjoern A. Zeeb 	u8 section_num;
2928e93258fSBjoern A. Zeeb 	u32 hdr_len;
293e2340276SBjoern A. Zeeb 	bool dynamic_hdr_en;
294e2340276SBjoern A. Zeeb 	u32 dynamic_hdr_len;
295*df279a26SBjoern A. Zeeb 	u8 idmem_share_mode;
2966d67aabdSBjoern A. Zeeb 	bool dsp_checksum;
2976d67aabdSBjoern A. Zeeb 	bool secure_section_exist;
2988e93258fSBjoern A. Zeeb 	struct rtw89_fw_hdr_section_info section_info[FWDL_SECTION_MAX_NUM];
2998e93258fSBjoern A. Zeeb };
3008e93258fSBjoern A. Zeeb 
3018e93258fSBjoern A. Zeeb struct rtw89_fw_macid_pause_grp {
3028e93258fSBjoern A. Zeeb 	__le32 pause_grp[4];
3038e93258fSBjoern A. Zeeb 	__le32 mask_grp[4];
3048e93258fSBjoern A. Zeeb } __packed;
3058e93258fSBjoern A. Zeeb 
3066d67aabdSBjoern A. Zeeb struct rtw89_fw_macid_pause_sleep_grp {
3076d67aabdSBjoern A. Zeeb 	struct {
3086d67aabdSBjoern A. Zeeb 		__le32 pause_grp[4];
3096d67aabdSBjoern A. Zeeb 		__le32 pause_mask_grp[4];
3106d67aabdSBjoern A. Zeeb 		__le32 sleep_grp[4];
3116d67aabdSBjoern A. Zeeb 		__le32 sleep_mask_grp[4];
3126d67aabdSBjoern A. Zeeb 	} __packed n[4];
3136d67aabdSBjoern A. Zeeb } __packed;
3146d67aabdSBjoern A. Zeeb 
315e2340276SBjoern A. Zeeb #define RTW89_H2C_MAX_SIZE 2048
3168e93258fSBjoern A. Zeeb #define RTW89_CHANNEL_TIME 45
317e2340276SBjoern A. Zeeb #define RTW89_CHANNEL_TIME_6G 20
3188e93258fSBjoern A. Zeeb #define RTW89_DFS_CHAN_TIME 105
3198e93258fSBjoern A. Zeeb #define RTW89_OFF_CHAN_TIME 100
3208e93258fSBjoern A. Zeeb #define RTW89_DWELL_TIME 20
321e2340276SBjoern A. Zeeb #define RTW89_DWELL_TIME_6G 10
3228e93258fSBjoern A. Zeeb #define RTW89_SCAN_WIDTH 0
3238e93258fSBjoern A. Zeeb #define RTW89_SCANOFLD_MAX_SSID 8
3248e93258fSBjoern A. Zeeb #define RTW89_SCANOFLD_MAX_IE_LEN 512
3258e93258fSBjoern A. Zeeb #define RTW89_SCANOFLD_PKT_NONE 0xFF
3268e93258fSBjoern A. Zeeb #define RTW89_SCANOFLD_DEBUG_MASK 0x1F
3276d67aabdSBjoern A. Zeeb #define RTW89_CHAN_INVALID 0xFF
328e2340276SBjoern A. Zeeb #define RTW89_MAC_CHINFO_SIZE 28
329*df279a26SBjoern A. Zeeb #define RTW89_MAC_CHINFO_SIZE_BE 32
330e2340276SBjoern A. Zeeb #define RTW89_SCAN_LIST_GUARD 4
331*df279a26SBjoern A. Zeeb #define RTW89_SCAN_LIST_LIMIT(size) \
332*df279a26SBjoern A. Zeeb 		((RTW89_H2C_MAX_SIZE / (size)) - RTW89_SCAN_LIST_GUARD)
333*df279a26SBjoern A. Zeeb #define RTW89_SCAN_LIST_LIMIT_AX RTW89_SCAN_LIST_LIMIT(RTW89_MAC_CHINFO_SIZE)
334*df279a26SBjoern A. Zeeb #define RTW89_SCAN_LIST_LIMIT_BE RTW89_SCAN_LIST_LIMIT(RTW89_MAC_CHINFO_SIZE_BE)
335e2340276SBjoern A. Zeeb 
336e2340276SBjoern A. Zeeb #define RTW89_BCN_LOSS_CNT 10
3378e93258fSBjoern A. Zeeb 
3388e93258fSBjoern A. Zeeb struct rtw89_mac_chinfo {
3398e93258fSBjoern A. Zeeb 	u8 period;
3408e93258fSBjoern A. Zeeb 	u8 dwell_time;
3418e93258fSBjoern A. Zeeb 	u8 central_ch;
3428e93258fSBjoern A. Zeeb 	u8 pri_ch;
3438e93258fSBjoern A. Zeeb 	u8 bw:3;
3448e93258fSBjoern A. Zeeb 	u8 notify_action:5;
3458e93258fSBjoern A. Zeeb 	u8 num_pkt:4;
3468e93258fSBjoern A. Zeeb 	u8 tx_pkt:1;
3478e93258fSBjoern A. Zeeb 	u8 pause_data:1;
3488e93258fSBjoern A. Zeeb 	u8 ch_band:2;
3498e93258fSBjoern A. Zeeb 	u8 probe_id;
3508e93258fSBjoern A. Zeeb 	u8 dfs_ch:1;
3518e93258fSBjoern A. Zeeb 	u8 tx_null:1;
3528e93258fSBjoern A. Zeeb 	u8 rand_seq_num:1;
3538e93258fSBjoern A. Zeeb 	u8 cfg_tx_pwr:1;
3548e93258fSBjoern A. Zeeb 	u8 rsvd0: 4;
3558e93258fSBjoern A. Zeeb 	u8 pkt_id[RTW89_SCANOFLD_MAX_SSID];
3568e93258fSBjoern A. Zeeb 	u16 tx_pwr_idx;
3578e93258fSBjoern A. Zeeb 	u8 rsvd1;
3588e93258fSBjoern A. Zeeb 	struct list_head list;
359e2340276SBjoern A. Zeeb 	bool is_psc;
3608e93258fSBjoern A. Zeeb };
3618e93258fSBjoern A. Zeeb 
3626d67aabdSBjoern A. Zeeb struct rtw89_mac_chinfo_be {
3636d67aabdSBjoern A. Zeeb 	u8 period;
3646d67aabdSBjoern A. Zeeb 	u8 dwell_time;
3656d67aabdSBjoern A. Zeeb 	u8 central_ch;
3666d67aabdSBjoern A. Zeeb 	u8 pri_ch;
3676d67aabdSBjoern A. Zeeb 	u8 bw:3;
3686d67aabdSBjoern A. Zeeb 	u8 ch_band:2;
3696d67aabdSBjoern A. Zeeb 	u8 dfs_ch:1;
3706d67aabdSBjoern A. Zeeb 	u8 pause_data:1;
3716d67aabdSBjoern A. Zeeb 	u8 tx_null:1;
3726d67aabdSBjoern A. Zeeb 	u8 rand_seq_num:1;
3736d67aabdSBjoern A. Zeeb 	u8 notify_action:5;
3746d67aabdSBjoern A. Zeeb 	u8 probe_id;
3756d67aabdSBjoern A. Zeeb 	u8 leave_crit;
3766d67aabdSBjoern A. Zeeb 	u8 chkpt_timer;
3776d67aabdSBjoern A. Zeeb 	u8 leave_time;
3786d67aabdSBjoern A. Zeeb 	u8 leave_th;
3796d67aabdSBjoern A. Zeeb 	u16 tx_pkt_ctrl;
3806d67aabdSBjoern A. Zeeb 	u8 pkt_id[RTW89_SCANOFLD_MAX_SSID];
3816d67aabdSBjoern A. Zeeb 	u8 sw_def;
3826d67aabdSBjoern A. Zeeb 	u16 fw_probe0_ssids;
3836d67aabdSBjoern A. Zeeb 	u16 fw_probe0_shortssids;
3846d67aabdSBjoern A. Zeeb 	u16 fw_probe0_bssids;
3856d67aabdSBjoern A. Zeeb 
3866d67aabdSBjoern A. Zeeb 	struct list_head list;
3876d67aabdSBjoern A. Zeeb 	bool is_psc;
3888e93258fSBjoern A. Zeeb };
3898e93258fSBjoern A. Zeeb 
3908e93258fSBjoern A. Zeeb struct rtw89_pktofld_info {
3918e93258fSBjoern A. Zeeb 	struct list_head list;
3928e93258fSBjoern A. Zeeb 	u8 id;
3936d67aabdSBjoern A. Zeeb 	bool wildcard_6ghz;
394e2340276SBjoern A. Zeeb 
3956d67aabdSBjoern A. Zeeb 	/* Below fields are for WiFi 6 chips 6 GHz RNR use only */
396e2340276SBjoern A. Zeeb 	u8 ssid[IEEE80211_MAX_SSID_LEN];
397e2340276SBjoern A. Zeeb 	u8 ssid_len;
398e2340276SBjoern A. Zeeb 	u8 bssid[ETH_ALEN];
399e2340276SBjoern A. Zeeb 	u16 channel_6ghz;
400e2340276SBjoern A. Zeeb 	bool cancel;
4018e93258fSBjoern A. Zeeb };
4028e93258fSBjoern A. Zeeb 
403e2340276SBjoern A. Zeeb struct rtw89_h2c_ra {
404e2340276SBjoern A. Zeeb 	__le32 w0;
405e2340276SBjoern A. Zeeb 	__le32 w1;
406e2340276SBjoern A. Zeeb 	__le32 w2;
407e2340276SBjoern A. Zeeb 	__le32 w3;
408e2340276SBjoern A. Zeeb } __packed;
4098e93258fSBjoern A. Zeeb 
410e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W0_IS_DIS BIT(0)
411e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W0_MODE GENMASK(5, 1)
412e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W0_BW_CAP GENMASK(7, 6)
413e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W0_MACID GENMASK(15, 8)
414e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W0_DCM BIT(16)
415e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W0_ER BIT(17)
416e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W0_INIT_RATE_LV GENMASK(19, 18)
417e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W0_UPD_ALL BIT(20)
418e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W0_SGI BIT(21)
419e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W0_LDPC BIT(22)
420e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W0_STBC BIT(23)
421e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W0_SS_NUM GENMASK(26, 24)
422e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W0_GILTF GENMASK(29, 27)
423e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W0_UPD_BW_NSS_MASK BIT(30)
424e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W0_UPD_MASK BIT(31)
425e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W1_RAMASK_LO32 GENMASK(31, 0)
426e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W2_RAMASK_HI32 GENMASK(30, 0)
427e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W2_BFEE_CSI_CTL BIT(31)
428e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W3_BAND_NUM GENMASK(7, 0)
429e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W3_RA_CSI_RATE_EN BIT(8)
430e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W3_FIXED_CSI_RATE_EN BIT(9)
431e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W3_CR_TBL_SEL BIT(10)
432e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W3_FIX_GILTF_EN BIT(11)
433e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W3_FIX_GILTF GENMASK(14, 12)
434e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W3_FIXED_CSI_MCS_SS_IDX GENMASK(23, 16)
435e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W3_FIXED_CSI_MODE GENMASK(25, 24)
436e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W3_FIXED_CSI_GI_LTF GENMASK(28, 26)
437e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_W3_FIXED_CSI_BW GENMASK(31, 29)
4388e93258fSBjoern A. Zeeb 
439e2340276SBjoern A. Zeeb struct rtw89_h2c_ra_v1 {
440e2340276SBjoern A. Zeeb 	struct rtw89_h2c_ra v0;
441e2340276SBjoern A. Zeeb 	__le32 w4;
442e2340276SBjoern A. Zeeb 	__le32 w5;
443e2340276SBjoern A. Zeeb } __packed;
4448e93258fSBjoern A. Zeeb 
445e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_V1_W4_MODE_EHT GENMASK(6, 0)
446e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_V1_W4_BW_EHT GENMASK(10, 8)
447e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_V1_W4_RAMASK_UHL16 GENMASK(31, 16)
448e2340276SBjoern A. Zeeb #define RTW89_H2C_RA_V1_W5_RAMASK_UHH16 GENMASK(15, 0)
4498e93258fSBjoern A. Zeeb 
4508e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_SEC_IDX(void *cmd, u32 val)
4518e93258fSBjoern A. Zeeb {
4528e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(cmd) + 0x00, val, GENMASK(7, 0));
4538e93258fSBjoern A. Zeeb }
4548e93258fSBjoern A. Zeeb 
4558e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_SEC_OFFSET(void *cmd, u32 val)
4568e93258fSBjoern A. Zeeb {
4578e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(cmd) + 0x00, val, GENMASK(15, 8));
4588e93258fSBjoern A. Zeeb }
4598e93258fSBjoern A. Zeeb 
4608e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_SEC_LEN(void *cmd, u32 val)
4618e93258fSBjoern A. Zeeb {
4628e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(cmd) + 0x00, val, GENMASK(23, 16));
4638e93258fSBjoern A. Zeeb }
4648e93258fSBjoern A. Zeeb 
4658e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_SEC_TYPE(void *cmd, u32 val)
4668e93258fSBjoern A. Zeeb {
4678e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(cmd) + 0x01, val, GENMASK(3, 0));
4688e93258fSBjoern A. Zeeb }
4698e93258fSBjoern A. Zeeb 
4708e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_SEC_EXT_KEY(void *cmd, u32 val)
4718e93258fSBjoern A. Zeeb {
4728e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(cmd) + 0x01, val, BIT(4));
4738e93258fSBjoern A. Zeeb }
4748e93258fSBjoern A. Zeeb 
4758e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_SEC_SPP_MODE(void *cmd, u32 val)
4768e93258fSBjoern A. Zeeb {
4778e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(cmd) + 0x01, val, BIT(5));
4788e93258fSBjoern A. Zeeb }
4798e93258fSBjoern A. Zeeb 
4808e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_SEC_KEY0(void *cmd, u32 val)
4818e93258fSBjoern A. Zeeb {
4828e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(cmd) + 0x02, val, GENMASK(31, 0));
4838e93258fSBjoern A. Zeeb }
4848e93258fSBjoern A. Zeeb 
4858e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_SEC_KEY1(void *cmd, u32 val)
4868e93258fSBjoern A. Zeeb {
4878e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(cmd) + 0x03, val, GENMASK(31, 0));
4888e93258fSBjoern A. Zeeb }
4898e93258fSBjoern A. Zeeb 
4908e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_SEC_KEY2(void *cmd, u32 val)
4918e93258fSBjoern A. Zeeb {
4928e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(cmd) + 0x04, val, GENMASK(31, 0));
4938e93258fSBjoern A. Zeeb }
4948e93258fSBjoern A. Zeeb 
4958e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_SEC_KEY3(void *cmd, u32 val)
4968e93258fSBjoern A. Zeeb {
4978e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(cmd) + 0x05, val, GENMASK(31, 0));
4988e93258fSBjoern A. Zeeb }
4998e93258fSBjoern A. Zeeb 
5008e93258fSBjoern A. Zeeb static inline void RTW89_SET_EDCA_SEL(void *cmd, u32 val)
5018e93258fSBjoern A. Zeeb {
5028e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(cmd) + 0x00, val, GENMASK(1, 0));
5038e93258fSBjoern A. Zeeb }
5048e93258fSBjoern A. Zeeb 
5058e93258fSBjoern A. Zeeb static inline void RTW89_SET_EDCA_BAND(void *cmd, u32 val)
5068e93258fSBjoern A. Zeeb {
5078e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(cmd) + 0x00, val, BIT(3));
5088e93258fSBjoern A. Zeeb }
5098e93258fSBjoern A. Zeeb 
5108e93258fSBjoern A. Zeeb static inline void RTW89_SET_EDCA_WMM(void *cmd, u32 val)
5118e93258fSBjoern A. Zeeb {
5128e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(cmd) + 0x00, val, BIT(4));
5138e93258fSBjoern A. Zeeb }
5148e93258fSBjoern A. Zeeb 
5158e93258fSBjoern A. Zeeb static inline void RTW89_SET_EDCA_AC(void *cmd, u32 val)
5168e93258fSBjoern A. Zeeb {
5178e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(cmd) + 0x00, val, GENMASK(6, 5));
5188e93258fSBjoern A. Zeeb }
5198e93258fSBjoern A. Zeeb 
5208e93258fSBjoern A. Zeeb static inline void RTW89_SET_EDCA_PARAM(void *cmd, u32 val)
5218e93258fSBjoern A. Zeeb {
5228e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(cmd) + 0x01, val, GENMASK(31, 0));
5238e93258fSBjoern A. Zeeb }
5248e93258fSBjoern A. Zeeb #define FW_EDCA_PARAM_TXOPLMT_MSK GENMASK(26, 16)
5258e93258fSBjoern A. Zeeb #define FW_EDCA_PARAM_CWMAX_MSK GENMASK(15, 12)
5268e93258fSBjoern A. Zeeb #define FW_EDCA_PARAM_CWMIN_MSK GENMASK(11, 8)
5278e93258fSBjoern A. Zeeb #define FW_EDCA_PARAM_AIFS_MSK GENMASK(7, 0)
5288e93258fSBjoern A. Zeeb 
529e2340276SBjoern A. Zeeb #define FWDL_SECURITY_SECTION_TYPE 9
530e2340276SBjoern A. Zeeb #define FWDL_SECURITY_SIGLEN 512
5316d67aabdSBjoern A. Zeeb #define FWDL_SECURITY_CHKSUM_LEN 8
5328e93258fSBjoern A. Zeeb 
533e2340276SBjoern A. Zeeb struct rtw89_fw_dynhdr_sec {
534e2340276SBjoern A. Zeeb 	__le32 w0;
535e2340276SBjoern A. Zeeb 	u8 content[];
536e2340276SBjoern A. Zeeb } __packed;
537e2340276SBjoern A. Zeeb 
538e2340276SBjoern A. Zeeb struct rtw89_fw_dynhdr_hdr {
539e2340276SBjoern A. Zeeb 	__le32 hdr_len;
540e2340276SBjoern A. Zeeb 	__le32 setcion_count;
541e2340276SBjoern A. Zeeb 	/* struct rtw89_fw_dynhdr_sec (nested flexible structures) */
542e2340276SBjoern A. Zeeb } __packed;
543e2340276SBjoern A. Zeeb 
544e2340276SBjoern A. Zeeb struct rtw89_fw_hdr_section {
545e2340276SBjoern A. Zeeb 	__le32 w0;
546e2340276SBjoern A. Zeeb 	__le32 w1;
547e2340276SBjoern A. Zeeb 	__le32 w2;
548e2340276SBjoern A. Zeeb 	__le32 w3;
549e2340276SBjoern A. Zeeb } __packed;
550e2340276SBjoern A. Zeeb 
551e2340276SBjoern A. Zeeb #define FWSECTION_HDR_W0_DL_ADDR GENMASK(31, 0)
552e2340276SBjoern A. Zeeb #define FWSECTION_HDR_W1_METADATA GENMASK(31, 24)
553e2340276SBjoern A. Zeeb #define FWSECTION_HDR_W1_SECTIONTYPE GENMASK(27, 24)
554e2340276SBjoern A. Zeeb #define FWSECTION_HDR_W1_SEC_SIZE GENMASK(23, 0)
555e2340276SBjoern A. Zeeb #define FWSECTION_HDR_W1_CHECKSUM BIT(28)
556e2340276SBjoern A. Zeeb #define FWSECTION_HDR_W1_REDL BIT(29)
557e2340276SBjoern A. Zeeb #define FWSECTION_HDR_W2_MSSC GENMASK(31, 0)
558e2340276SBjoern A. Zeeb 
559e2340276SBjoern A. Zeeb struct rtw89_fw_hdr {
560e2340276SBjoern A. Zeeb 	__le32 w0;
561e2340276SBjoern A. Zeeb 	__le32 w1;
562e2340276SBjoern A. Zeeb 	__le32 w2;
563e2340276SBjoern A. Zeeb 	__le32 w3;
564e2340276SBjoern A. Zeeb 	__le32 w4;
565e2340276SBjoern A. Zeeb 	__le32 w5;
566e2340276SBjoern A. Zeeb 	__le32 w6;
567e2340276SBjoern A. Zeeb 	__le32 w7;
568e2340276SBjoern A. Zeeb 	struct rtw89_fw_hdr_section sections[];
569e2340276SBjoern A. Zeeb 	/* struct rtw89_fw_dynhdr_hdr (optional) */
570e2340276SBjoern A. Zeeb } __packed;
571e2340276SBjoern A. Zeeb 
572e2340276SBjoern A. Zeeb #define FW_HDR_W1_MAJOR_VERSION GENMASK(7, 0)
573e2340276SBjoern A. Zeeb #define FW_HDR_W1_MINOR_VERSION GENMASK(15, 8)
574e2340276SBjoern A. Zeeb #define FW_HDR_W1_SUBVERSION GENMASK(23, 16)
575e2340276SBjoern A. Zeeb #define FW_HDR_W1_SUBINDEX GENMASK(31, 24)
576e2340276SBjoern A. Zeeb #define FW_HDR_W2_COMMITID GENMASK(31, 0)
577e2340276SBjoern A. Zeeb #define FW_HDR_W3_LEN GENMASK(23, 16)
578e2340276SBjoern A. Zeeb #define FW_HDR_W3_HDR_VER GENMASK(31, 24)
579e2340276SBjoern A. Zeeb #define FW_HDR_W4_MONTH GENMASK(7, 0)
580e2340276SBjoern A. Zeeb #define FW_HDR_W4_DATE GENMASK(15, 8)
581e2340276SBjoern A. Zeeb #define FW_HDR_W4_HOUR GENMASK(23, 16)
582e2340276SBjoern A. Zeeb #define FW_HDR_W4_MIN GENMASK(31, 24)
583e2340276SBjoern A. Zeeb #define FW_HDR_W5_YEAR GENMASK(31, 0)
584e2340276SBjoern A. Zeeb #define FW_HDR_W6_SEC_NUM GENMASK(15, 8)
5856d67aabdSBjoern A. Zeeb #define FW_HDR_W7_PART_SIZE GENMASK(15, 0)
586e2340276SBjoern A. Zeeb #define FW_HDR_W7_DYN_HDR BIT(16)
587*df279a26SBjoern A. Zeeb #define FW_HDR_W7_IDMEM_SHARE_MODE GENMASK(21, 18)
588e2340276SBjoern A. Zeeb #define FW_HDR_W7_CMD_VERSERION GENMASK(31, 24)
589e2340276SBjoern A. Zeeb 
590e2340276SBjoern A. Zeeb struct rtw89_fw_hdr_section_v1 {
591e2340276SBjoern A. Zeeb 	__le32 w0;
592e2340276SBjoern A. Zeeb 	__le32 w1;
593e2340276SBjoern A. Zeeb 	__le32 w2;
594e2340276SBjoern A. Zeeb 	__le32 w3;
595e2340276SBjoern A. Zeeb } __packed;
596e2340276SBjoern A. Zeeb 
597e2340276SBjoern A. Zeeb #define FWSECTION_HDR_V1_W0_DL_ADDR GENMASK(31, 0)
598e2340276SBjoern A. Zeeb #define FWSECTION_HDR_V1_W1_METADATA GENMASK(31, 24)
599e2340276SBjoern A. Zeeb #define FWSECTION_HDR_V1_W1_SECTIONTYPE GENMASK(27, 24)
600e2340276SBjoern A. Zeeb #define FWSECTION_HDR_V1_W1_SEC_SIZE GENMASK(23, 0)
601e2340276SBjoern A. Zeeb #define FWSECTION_HDR_V1_W1_CHECKSUM BIT(28)
602e2340276SBjoern A. Zeeb #define FWSECTION_HDR_V1_W1_REDL BIT(29)
603e2340276SBjoern A. Zeeb #define FWSECTION_HDR_V1_W2_MSSC GENMASK(7, 0)
6046d67aabdSBjoern A. Zeeb #define FORMATTED_MSSC 0xFF
605*df279a26SBjoern A. Zeeb #define FORMATTED_MSSC_MASK GENMASK(7, 0)
606e2340276SBjoern A. Zeeb #define FWSECTION_HDR_V1_W2_BBMCU_IDX GENMASK(27, 24)
607e2340276SBjoern A. Zeeb 
608e2340276SBjoern A. Zeeb struct rtw89_fw_hdr_v1 {
609e2340276SBjoern A. Zeeb 	__le32 w0;
610e2340276SBjoern A. Zeeb 	__le32 w1;
611e2340276SBjoern A. Zeeb 	__le32 w2;
612e2340276SBjoern A. Zeeb 	__le32 w3;
613e2340276SBjoern A. Zeeb 	__le32 w4;
614e2340276SBjoern A. Zeeb 	__le32 w5;
615e2340276SBjoern A. Zeeb 	__le32 w6;
616e2340276SBjoern A. Zeeb 	__le32 w7;
617e2340276SBjoern A. Zeeb 	__le32 w8;
618e2340276SBjoern A. Zeeb 	__le32 w9;
619e2340276SBjoern A. Zeeb 	__le32 w10;
620e2340276SBjoern A. Zeeb 	__le32 w11;
621e2340276SBjoern A. Zeeb 	struct rtw89_fw_hdr_section_v1 sections[];
622e2340276SBjoern A. Zeeb } __packed;
623e2340276SBjoern A. Zeeb 
624e2340276SBjoern A. Zeeb #define FW_HDR_V1_W1_MAJOR_VERSION GENMASK(7, 0)
625e2340276SBjoern A. Zeeb #define FW_HDR_V1_W1_MINOR_VERSION GENMASK(15, 8)
626e2340276SBjoern A. Zeeb #define FW_HDR_V1_W1_SUBVERSION GENMASK(23, 16)
627e2340276SBjoern A. Zeeb #define FW_HDR_V1_W1_SUBINDEX GENMASK(31, 24)
628e2340276SBjoern A. Zeeb #define FW_HDR_V1_W2_COMMITID GENMASK(31, 0)
629e2340276SBjoern A. Zeeb #define FW_HDR_V1_W3_CMD_VERSERION GENMASK(23, 16)
630e2340276SBjoern A. Zeeb #define FW_HDR_V1_W3_HDR_VER GENMASK(31, 24)
631e2340276SBjoern A. Zeeb #define FW_HDR_V1_W4_MONTH GENMASK(7, 0)
632e2340276SBjoern A. Zeeb #define FW_HDR_V1_W4_DATE GENMASK(15, 8)
633e2340276SBjoern A. Zeeb #define FW_HDR_V1_W4_HOUR GENMASK(23, 16)
634e2340276SBjoern A. Zeeb #define FW_HDR_V1_W4_MIN GENMASK(31, 24)
635e2340276SBjoern A. Zeeb #define FW_HDR_V1_W5_YEAR GENMASK(15, 0)
636e2340276SBjoern A. Zeeb #define FW_HDR_V1_W5_HDR_SIZE GENMASK(31, 16)
637e2340276SBjoern A. Zeeb #define FW_HDR_V1_W6_SEC_NUM GENMASK(15, 8)
6386d67aabdSBjoern A. Zeeb #define FW_HDR_V1_W6_DSP_CHKSUM BIT(24)
6396d67aabdSBjoern A. Zeeb #define FW_HDR_V1_W7_PART_SIZE GENMASK(15, 0)
640e2340276SBjoern A. Zeeb #define FW_HDR_V1_W7_DYN_HDR BIT(16)
641*df279a26SBjoern A. Zeeb #define FW_HDR_V1_W7_IDMEM_SHARE_MODE GENMASK(21, 18)
642e2340276SBjoern A. Zeeb 
6436d67aabdSBjoern A. Zeeb enum rtw89_fw_mss_pool_rmp_tbl_type {
6446d67aabdSBjoern A. Zeeb 	MSS_POOL_RMP_TBL_BITMASK = 0x0,
6456d67aabdSBjoern A. Zeeb 	MSS_POOL_RMP_TBL_RECORD = 0x1,
6466d67aabdSBjoern A. Zeeb };
6476d67aabdSBjoern A. Zeeb 
6486d67aabdSBjoern A. Zeeb #define FWDL_MSS_POOL_DEFKEYSETS_SIZE 8
6496d67aabdSBjoern A. Zeeb 
6506d67aabdSBjoern A. Zeeb struct rtw89_fw_mss_pool_hdr {
6516d67aabdSBjoern A. Zeeb 	u8 signature[8]; /* equal to mss_signature[] */
6526d67aabdSBjoern A. Zeeb 	__le32 rmp_tbl_offset;
6536d67aabdSBjoern A. Zeeb 	__le32 key_raw_offset;
6546d67aabdSBjoern A. Zeeb 	u8 defen;
6556d67aabdSBjoern A. Zeeb 	u8 rsvd[3];
6566d67aabdSBjoern A. Zeeb 	u8 rmpfmt; /* enum rtw89_fw_mss_pool_rmp_tbl_type */
6576d67aabdSBjoern A. Zeeb 	u8 mssdev_max;
6586d67aabdSBjoern A. Zeeb 	__le16 keypair_num;
6596d67aabdSBjoern A. Zeeb 	__le16 msscust_max;
6606d67aabdSBjoern A. Zeeb 	__le16 msskey_num_max;
6616d67aabdSBjoern A. Zeeb 	__le32 rsvd3;
6626d67aabdSBjoern A. Zeeb 	u8 rmp_tbl[];
6636d67aabdSBjoern A. Zeeb } __packed;
6646d67aabdSBjoern A. Zeeb 
6656d67aabdSBjoern A. Zeeb union rtw89_fw_section_mssc_content {
6666d67aabdSBjoern A. Zeeb 	struct {
6676d67aabdSBjoern A. Zeeb 		u8 pad[58];
6686d67aabdSBjoern A. Zeeb 		__le32 v;
6696d67aabdSBjoern A. Zeeb 	} __packed sb_sel_ver;
6706d67aabdSBjoern A. Zeeb 	struct {
6716d67aabdSBjoern A. Zeeb 		u8 pad[60];
6726d67aabdSBjoern A. Zeeb 		__le16 v;
6736d67aabdSBjoern A. Zeeb 	} __packed key_sign_len;
6746d67aabdSBjoern A. Zeeb } __packed;
6758e93258fSBjoern A. Zeeb 
6768e93258fSBjoern A. Zeeb static inline void SET_CTRL_INFO_MACID(void *table, u32 val)
6778e93258fSBjoern A. Zeeb {
6788e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 0, val, GENMASK(6, 0));
6798e93258fSBjoern A. Zeeb }
6808e93258fSBjoern A. Zeeb 
6818e93258fSBjoern A. Zeeb static inline void SET_CTRL_INFO_OPERATION(void *table, u32 val)
6828e93258fSBjoern A. Zeeb {
6838e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 0, val, BIT(7));
6848e93258fSBjoern A. Zeeb }
6858e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_DATARATE GENMASK(8, 0)
6868e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_DATARATE(void *table, u32 val)
6878e93258fSBjoern A. Zeeb {
6888e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 1, val, GENMASK(8, 0));
6898e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_DATARATE,
6908e93258fSBjoern A. Zeeb 			   GENMASK(8, 0));
6918e93258fSBjoern A. Zeeb }
6928e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_FORCE_TXOP BIT(0)
6938e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_FORCE_TXOP(void *table, u32 val)
6948e93258fSBjoern A. Zeeb {
6958e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 1, val, BIT(9));
6968e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_FORCE_TXOP,
6978e93258fSBjoern A. Zeeb 			   BIT(9));
6988e93258fSBjoern A. Zeeb }
6998e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_DATA_BW GENMASK(1, 0)
7008e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_DATA_BW(void *table, u32 val)
7018e93258fSBjoern A. Zeeb {
7028e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 1, val, GENMASK(11, 10));
7038e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_DATA_BW,
7048e93258fSBjoern A. Zeeb 			   GENMASK(11, 10));
7058e93258fSBjoern A. Zeeb }
7068e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_DATA_GI_LTF GENMASK(2, 0)
7078e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_DATA_GI_LTF(void *table, u32 val)
7088e93258fSBjoern A. Zeeb {
7098e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 1, val, GENMASK(14, 12));
7108e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_DATA_GI_LTF,
7118e93258fSBjoern A. Zeeb 			   GENMASK(14, 12));
7128e93258fSBjoern A. Zeeb }
7138e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_DARF_TC_INDEX BIT(0)
7148e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_DARF_TC_INDEX(void *table, u32 val)
7158e93258fSBjoern A. Zeeb {
7168e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 1, val, BIT(15));
7178e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_DARF_TC_INDEX,
7188e93258fSBjoern A. Zeeb 			   BIT(15));
7198e93258fSBjoern A. Zeeb }
7208e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_ARFR_CTRL GENMASK(3, 0)
7218e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_ARFR_CTRL(void *table, u32 val)
7228e93258fSBjoern A. Zeeb {
7238e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 1, val, GENMASK(19, 16));
7248e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_ARFR_CTRL,
7258e93258fSBjoern A. Zeeb 			   GENMASK(19, 16));
7268e93258fSBjoern A. Zeeb }
7278e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_ACQ_RPT_EN BIT(0)
7288e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_ACQ_RPT_EN(void *table, u32 val)
7298e93258fSBjoern A. Zeeb {
7308e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 1, val, BIT(20));
7318e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_ACQ_RPT_EN,
7328e93258fSBjoern A. Zeeb 			   BIT(20));
7338e93258fSBjoern A. Zeeb }
7348e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_MGQ_RPT_EN BIT(0)
7358e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_MGQ_RPT_EN(void *table, u32 val)
7368e93258fSBjoern A. Zeeb {
7378e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 1, val, BIT(21));
7388e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_MGQ_RPT_EN,
7398e93258fSBjoern A. Zeeb 			   BIT(21));
7408e93258fSBjoern A. Zeeb }
7418e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_ULQ_RPT_EN BIT(0)
7428e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_ULQ_RPT_EN(void *table, u32 val)
7438e93258fSBjoern A. Zeeb {
7448e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 1, val, BIT(22));
7458e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_ULQ_RPT_EN,
7468e93258fSBjoern A. Zeeb 			   BIT(22));
7478e93258fSBjoern A. Zeeb }
7488e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_TWTQ_RPT_EN BIT(0)
7498e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_TWTQ_RPT_EN(void *table, u32 val)
7508e93258fSBjoern A. Zeeb {
7518e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 1, val, BIT(23));
7528e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_TWTQ_RPT_EN,
7538e93258fSBjoern A. Zeeb 			   BIT(23));
7548e93258fSBjoern A. Zeeb }
7558e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_DISRTSFB BIT(0)
7568e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_DISRTSFB(void *table, u32 val)
7578e93258fSBjoern A. Zeeb {
7588e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 1, val, BIT(25));
7598e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_DISRTSFB,
7608e93258fSBjoern A. Zeeb 			   BIT(25));
7618e93258fSBjoern A. Zeeb }
7628e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_DISDATAFB BIT(0)
7638e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_DISDATAFB(void *table, u32 val)
7648e93258fSBjoern A. Zeeb {
7658e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 1, val, BIT(26));
7668e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_DISDATAFB,
7678e93258fSBjoern A. Zeeb 			   BIT(26));
7688e93258fSBjoern A. Zeeb }
7698e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_TRYRATE BIT(0)
7708e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_TRYRATE(void *table, u32 val)
7718e93258fSBjoern A. Zeeb {
7728e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 1, val, BIT(27));
7738e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_TRYRATE,
7748e93258fSBjoern A. Zeeb 			   BIT(27));
7758e93258fSBjoern A. Zeeb }
7768e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_AMPDU_DENSITY GENMASK(3, 0)
7778e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_AMPDU_DENSITY(void *table, u32 val)
7788e93258fSBjoern A. Zeeb {
7798e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 1, val, GENMASK(31, 28));
7808e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_AMPDU_DENSITY,
7818e93258fSBjoern A. Zeeb 			   GENMASK(31, 28));
7828e93258fSBjoern A. Zeeb }
7838e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_DATA_RTY_LOWEST_RATE GENMASK(8, 0)
7848e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_DATA_RTY_LOWEST_RATE(void *table, u32 val)
7858e93258fSBjoern A. Zeeb {
7868e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 2, val, GENMASK(8, 0));
7878e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_DATA_RTY_LOWEST_RATE,
7888e93258fSBjoern A. Zeeb 			   GENMASK(8, 0));
7898e93258fSBjoern A. Zeeb }
7908e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_AMPDU_TIME_SEL BIT(0)
7918e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_AMPDU_TIME_SEL(void *table, u32 val)
7928e93258fSBjoern A. Zeeb {
7938e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 2, val, BIT(9));
7948e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_AMPDU_TIME_SEL,
7958e93258fSBjoern A. Zeeb 			   BIT(9));
7968e93258fSBjoern A. Zeeb }
7978e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_AMPDU_LEN_SEL BIT(0)
7988e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_AMPDU_LEN_SEL(void *table, u32 val)
7998e93258fSBjoern A. Zeeb {
8008e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 2, val, BIT(10));
8018e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_AMPDU_LEN_SEL,
8028e93258fSBjoern A. Zeeb 			   BIT(10));
8038e93258fSBjoern A. Zeeb }
8048e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_RTS_TXCNT_LMT_SEL BIT(0)
8058e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_RTS_TXCNT_LMT_SEL(void *table, u32 val)
8068e93258fSBjoern A. Zeeb {
8078e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 2, val, BIT(11));
8088e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_RTS_TXCNT_LMT_SEL,
8098e93258fSBjoern A. Zeeb 			   BIT(11));
8108e93258fSBjoern A. Zeeb }
8118e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_RTS_TXCNT_LMT GENMASK(3, 0)
8128e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_RTS_TXCNT_LMT(void *table, u32 val)
8138e93258fSBjoern A. Zeeb {
8148e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 2, val, GENMASK(15, 12));
8158e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_RTS_TXCNT_LMT,
8168e93258fSBjoern A. Zeeb 			   GENMASK(15, 12));
8178e93258fSBjoern A. Zeeb }
8188e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_RTSRATE GENMASK(8, 0)
8198e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_RTSRATE(void *table, u32 val)
8208e93258fSBjoern A. Zeeb {
8218e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 2, val, GENMASK(24, 16));
8228e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_RTSRATE,
8238e93258fSBjoern A. Zeeb 			   GENMASK(24, 16));
8248e93258fSBjoern A. Zeeb }
8258e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_VCS_STBC BIT(0)
8268e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_VCS_STBC(void *table, u32 val)
8278e93258fSBjoern A. Zeeb {
8288e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 2, val, BIT(27));
8298e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_VCS_STBC,
8308e93258fSBjoern A. Zeeb 			   BIT(27));
8318e93258fSBjoern A. Zeeb }
8328e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_RTS_RTY_LOWEST_RATE GENMASK(3, 0)
8338e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_RTS_RTY_LOWEST_RATE(void *table, u32 val)
8348e93258fSBjoern A. Zeeb {
8358e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 2, val, GENMASK(31, 28));
8368e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_RTS_RTY_LOWEST_RATE,
8378e93258fSBjoern A. Zeeb 			   GENMASK(31, 28));
8388e93258fSBjoern A. Zeeb }
8398e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_DATA_TX_CNT_LMT GENMASK(5, 0)
8408e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_DATA_TX_CNT_LMT(void *table, u32 val)
8418e93258fSBjoern A. Zeeb {
8428e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 3, val, GENMASK(5, 0));
8438e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_DATA_TX_CNT_LMT,
8448e93258fSBjoern A. Zeeb 			   GENMASK(5, 0));
8458e93258fSBjoern A. Zeeb }
8468e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_DATA_TXCNT_LMT_SEL BIT(0)
8478e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_DATA_TXCNT_LMT_SEL(void *table, u32 val)
8488e93258fSBjoern A. Zeeb {
8498e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 3, val, BIT(6));
8508e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_DATA_TXCNT_LMT_SEL,
8518e93258fSBjoern A. Zeeb 			   BIT(6));
8528e93258fSBjoern A. Zeeb }
8538e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_MAX_AGG_NUM_SEL BIT(0)
8548e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_MAX_AGG_NUM_SEL(void *table, u32 val)
8558e93258fSBjoern A. Zeeb {
8568e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 3, val, BIT(7));
8578e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_MAX_AGG_NUM_SEL,
8588e93258fSBjoern A. Zeeb 			   BIT(7));
8598e93258fSBjoern A. Zeeb }
8608e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_RTS_EN BIT(0)
8618e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_RTS_EN(void *table, u32 val)
8628e93258fSBjoern A. Zeeb {
8638e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 3, val, BIT(8));
8648e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_RTS_EN,
8658e93258fSBjoern A. Zeeb 			   BIT(8));
8668e93258fSBjoern A. Zeeb }
8678e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_CTS2SELF_EN BIT(0)
8688e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_CTS2SELF_EN(void *table, u32 val)
8698e93258fSBjoern A. Zeeb {
8708e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 3, val, BIT(9));
8718e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_CTS2SELF_EN,
8728e93258fSBjoern A. Zeeb 			   BIT(9));
8738e93258fSBjoern A. Zeeb }
8748e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_CCA_RTS GENMASK(1, 0)
8758e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_CCA_RTS(void *table, u32 val)
8768e93258fSBjoern A. Zeeb {
8778e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 3, val, GENMASK(11, 10));
8788e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_CCA_RTS,
8798e93258fSBjoern A. Zeeb 			   GENMASK(11, 10));
8808e93258fSBjoern A. Zeeb }
8818e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_HW_RTS_EN BIT(0)
8828e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_HW_RTS_EN(void *table, u32 val)
8838e93258fSBjoern A. Zeeb {
8848e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 3, val, BIT(12));
8858e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_HW_RTS_EN,
8868e93258fSBjoern A. Zeeb 			   BIT(12));
8878e93258fSBjoern A. Zeeb }
8888e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_RTS_DROP_DATA_MODE GENMASK(1, 0)
8898e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_RTS_DROP_DATA_MODE(void *table, u32 val)
8908e93258fSBjoern A. Zeeb {
8918e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 3, val, GENMASK(14, 13));
8928e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_RTS_DROP_DATA_MODE,
8938e93258fSBjoern A. Zeeb 			   GENMASK(14, 13));
8948e93258fSBjoern A. Zeeb }
8958e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_AMPDU_MAX_LEN GENMASK(10, 0)
8968e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_AMPDU_MAX_LEN(void *table, u32 val)
8978e93258fSBjoern A. Zeeb {
8988e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 3, val, GENMASK(26, 16));
8998e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_AMPDU_MAX_LEN,
9008e93258fSBjoern A. Zeeb 			   GENMASK(26, 16));
9018e93258fSBjoern A. Zeeb }
9028e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_UL_MU_DIS BIT(0)
9038e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_UL_MU_DIS(void *table, u32 val)
9048e93258fSBjoern A. Zeeb {
9058e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 3, val, BIT(27));
9068e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_UL_MU_DIS,
9078e93258fSBjoern A. Zeeb 			   BIT(27));
9088e93258fSBjoern A. Zeeb }
9098e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_AMPDU_MAX_TIME GENMASK(3, 0)
9108e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_AMPDU_MAX_TIME(void *table, u32 val)
9118e93258fSBjoern A. Zeeb {
9128e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 3, val, GENMASK(31, 28));
9138e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_AMPDU_MAX_TIME,
9148e93258fSBjoern A. Zeeb 			   GENMASK(31, 28));
9158e93258fSBjoern A. Zeeb }
9168e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_MAX_AGG_NUM GENMASK(7, 0)
9178e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_MAX_AGG_NUM(void *table, u32 val)
9188e93258fSBjoern A. Zeeb {
9198e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(7, 0));
9208e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_MAX_AGG_NUM,
9218e93258fSBjoern A. Zeeb 			   GENMASK(7, 0));
9228e93258fSBjoern A. Zeeb }
9238e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_BA_BMAP GENMASK(1, 0)
9248e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_BA_BMAP(void *table, u32 val)
9258e93258fSBjoern A. Zeeb {
9268e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(9, 8));
9278e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_BA_BMAP,
9288e93258fSBjoern A. Zeeb 			   GENMASK(9, 8));
9298e93258fSBjoern A. Zeeb }
9308e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_VO_LFTIME_SEL GENMASK(2, 0)
9318e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_VO_LFTIME_SEL(void *table, u32 val)
9328e93258fSBjoern A. Zeeb {
9338e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(18, 16));
9348e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_VO_LFTIME_SEL,
9358e93258fSBjoern A. Zeeb 			   GENMASK(18, 16));
9368e93258fSBjoern A. Zeeb }
9378e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_VI_LFTIME_SEL GENMASK(2, 0)
9388e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_VI_LFTIME_SEL(void *table, u32 val)
9398e93258fSBjoern A. Zeeb {
9408e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(21, 19));
9418e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_VI_LFTIME_SEL,
9428e93258fSBjoern A. Zeeb 			   GENMASK(21, 19));
9438e93258fSBjoern A. Zeeb }
9448e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_BE_LFTIME_SEL GENMASK(2, 0)
9458e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_BE_LFTIME_SEL(void *table, u32 val)
9468e93258fSBjoern A. Zeeb {
9478e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(24, 22));
9488e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_BE_LFTIME_SEL,
9498e93258fSBjoern A. Zeeb 			   GENMASK(24, 22));
9508e93258fSBjoern A. Zeeb }
9518e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_BK_LFTIME_SEL GENMASK(2, 0)
9528e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_BK_LFTIME_SEL(void *table, u32 val)
9538e93258fSBjoern A. Zeeb {
9548e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(27, 25));
9558e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_BK_LFTIME_SEL,
9568e93258fSBjoern A. Zeeb 			   GENMASK(27, 25));
9578e93258fSBjoern A. Zeeb }
9588e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_SECTYPE GENMASK(3, 0)
9598e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_SECTYPE(void *table, u32 val)
9608e93258fSBjoern A. Zeeb {
9618e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(31, 28));
9628e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_SECTYPE,
9638e93258fSBjoern A. Zeeb 			   GENMASK(31, 28));
9648e93258fSBjoern A. Zeeb }
9658e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_MULTI_PORT_ID GENMASK(2, 0)
9668e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_MULTI_PORT_ID(void *table, u32 val)
9678e93258fSBjoern A. Zeeb {
9688e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 5, val, GENMASK(2, 0));
9698e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_MULTI_PORT_ID,
9708e93258fSBjoern A. Zeeb 			   GENMASK(2, 0));
9718e93258fSBjoern A. Zeeb }
9728e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_BMC BIT(0)
9738e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_BMC(void *table, u32 val)
9748e93258fSBjoern A. Zeeb {
9758e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(3));
9768e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_BMC,
9778e93258fSBjoern A. Zeeb 			   BIT(3));
9788e93258fSBjoern A. Zeeb }
9798e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_MBSSID GENMASK(3, 0)
9808e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_MBSSID(void *table, u32 val)
9818e93258fSBjoern A. Zeeb {
9828e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 5, val, GENMASK(7, 4));
9838e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_MBSSID,
9848e93258fSBjoern A. Zeeb 			   GENMASK(7, 4));
9858e93258fSBjoern A. Zeeb }
9868e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_NAVUSEHDR BIT(0)
9878e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_NAVUSEHDR(void *table, u32 val)
9888e93258fSBjoern A. Zeeb {
9898e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(8));
9908e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_NAVUSEHDR,
9918e93258fSBjoern A. Zeeb 			   BIT(8));
9928e93258fSBjoern A. Zeeb }
9938e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_TXPWR_MODE GENMASK(2, 0)
9948e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_TXPWR_MODE(void *table, u32 val)
9958e93258fSBjoern A. Zeeb {
9968e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 5, val, GENMASK(11, 9));
9978e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_TXPWR_MODE,
9988e93258fSBjoern A. Zeeb 			   GENMASK(11, 9));
9998e93258fSBjoern A. Zeeb }
10008e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_DATA_DCM BIT(0)
10018e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_DATA_DCM(void *table, u32 val)
10028e93258fSBjoern A. Zeeb {
10038e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(12));
10048e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_DATA_DCM,
10058e93258fSBjoern A. Zeeb 			   BIT(12));
10068e93258fSBjoern A. Zeeb }
10078e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_DATA_ER BIT(0)
10088e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_DATA_ER(void *table, u32 val)
10098e93258fSBjoern A. Zeeb {
10108e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(13));
10118e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_DATA_ER,
10128e93258fSBjoern A. Zeeb 			   BIT(13));
10138e93258fSBjoern A. Zeeb }
10148e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_DATA_LDPC BIT(0)
10158e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_DATA_LDPC(void *table, u32 val)
10168e93258fSBjoern A. Zeeb {
10178e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(14));
10188e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_DATA_LDPC,
10198e93258fSBjoern A. Zeeb 			   BIT(14));
10208e93258fSBjoern A. Zeeb }
10218e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_DATA_STBC BIT(0)
10228e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_DATA_STBC(void *table, u32 val)
10238e93258fSBjoern A. Zeeb {
10248e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(15));
10258e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_DATA_STBC,
10268e93258fSBjoern A. Zeeb 			   BIT(15));
10278e93258fSBjoern A. Zeeb }
10288e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_A_CTRL_BQR BIT(0)
10298e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_A_CTRL_BQR(void *table, u32 val)
10308e93258fSBjoern A. Zeeb {
10318e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(16));
10328e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_A_CTRL_BQR,
10338e93258fSBjoern A. Zeeb 			   BIT(16));
10348e93258fSBjoern A. Zeeb }
10358e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_A_CTRL_UPH BIT(0)
10368e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_A_CTRL_UPH(void *table, u32 val)
10378e93258fSBjoern A. Zeeb {
10388e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(17));
10398e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_A_CTRL_UPH,
10408e93258fSBjoern A. Zeeb 			   BIT(17));
10418e93258fSBjoern A. Zeeb }
10428e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_A_CTRL_BSR BIT(0)
10438e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_A_CTRL_BSR(void *table, u32 val)
10448e93258fSBjoern A. Zeeb {
10458e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(18));
10468e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_A_CTRL_BSR,
10478e93258fSBjoern A. Zeeb 			   BIT(18));
10488e93258fSBjoern A. Zeeb }
10498e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_A_CTRL_CAS BIT(0)
10508e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_A_CTRL_CAS(void *table, u32 val)
10518e93258fSBjoern A. Zeeb {
10528e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(19));
10538e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_A_CTRL_CAS,
10548e93258fSBjoern A. Zeeb 			   BIT(19));
10558e93258fSBjoern A. Zeeb }
10568e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_DATA_BW_ER BIT(0)
10578e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_DATA_BW_ER(void *table, u32 val)
10588e93258fSBjoern A. Zeeb {
10598e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(20));
10608e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_DATA_BW_ER,
10618e93258fSBjoern A. Zeeb 			   BIT(20));
10628e93258fSBjoern A. Zeeb }
10638e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_LSIG_TXOP_EN BIT(0)
10648e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_LSIG_TXOP_EN(void *table, u32 val)
10658e93258fSBjoern A. Zeeb {
10668e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(21));
10678e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_LSIG_TXOP_EN,
10688e93258fSBjoern A. Zeeb 			   BIT(21));
10698e93258fSBjoern A. Zeeb }
10708e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_CTRL_CNT_VLD BIT(0)
10718e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_CTRL_CNT_VLD(void *table, u32 val)
10728e93258fSBjoern A. Zeeb {
10738e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 5, val, BIT(27));
10748e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_CTRL_CNT_VLD,
10758e93258fSBjoern A. Zeeb 			   BIT(27));
10768e93258fSBjoern A. Zeeb }
10778e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_CTRL_CNT GENMASK(3, 0)
10788e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_CTRL_CNT(void *table, u32 val)
10798e93258fSBjoern A. Zeeb {
10808e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 5, val, GENMASK(31, 28));
10818e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_CTRL_CNT,
10828e93258fSBjoern A. Zeeb 			   GENMASK(31, 28));
10838e93258fSBjoern A. Zeeb }
10848e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_RESP_REF_RATE GENMASK(8, 0)
10858e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_RESP_REF_RATE(void *table, u32 val)
10868e93258fSBjoern A. Zeeb {
10878e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 6, val, GENMASK(8, 0));
10888e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_RESP_REF_RATE,
10898e93258fSBjoern A. Zeeb 			   GENMASK(8, 0));
10908e93258fSBjoern A. Zeeb }
10918e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_ALL_ACK_SUPPORT BIT(0)
10928e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_ALL_ACK_SUPPORT(void *table, u32 val)
10938e93258fSBjoern A. Zeeb {
10948e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 6, val, BIT(12));
10958e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_ALL_ACK_SUPPORT,
10968e93258fSBjoern A. Zeeb 			   BIT(12));
10978e93258fSBjoern A. Zeeb }
10988e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_BSR_QUEUE_SIZE_FORMAT BIT(0)
10998e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_BSR_QUEUE_SIZE_FORMAT(void *table, u32 val)
11008e93258fSBjoern A. Zeeb {
11018e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 6, val, BIT(13));
11028e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_BSR_QUEUE_SIZE_FORMAT,
11038e93258fSBjoern A. Zeeb 			   BIT(13));
11048e93258fSBjoern A. Zeeb }
11058e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_NTX_PATH_EN GENMASK(3, 0)
11068e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_NTX_PATH_EN(void *table, u32 val)
11078e93258fSBjoern A. Zeeb {
11088e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 6, val, GENMASK(19, 16));
11098e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_NTX_PATH_EN,
11108e93258fSBjoern A. Zeeb 			   GENMASK(19, 16));
11118e93258fSBjoern A. Zeeb }
11128e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_PATH_MAP_A GENMASK(1, 0)
11138e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_PATH_MAP_A(void *table, u32 val)
11148e93258fSBjoern A. Zeeb {
11158e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 6, val, GENMASK(21, 20));
11168e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_PATH_MAP_A,
11178e93258fSBjoern A. Zeeb 			   GENMASK(21, 20));
11188e93258fSBjoern A. Zeeb }
11198e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_PATH_MAP_B GENMASK(1, 0)
11208e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_PATH_MAP_B(void *table, u32 val)
11218e93258fSBjoern A. Zeeb {
11228e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 6, val, GENMASK(23, 22));
11238e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_PATH_MAP_B,
11248e93258fSBjoern A. Zeeb 			   GENMASK(23, 22));
11258e93258fSBjoern A. Zeeb }
11268e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_PATH_MAP_C GENMASK(1, 0)
11278e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_PATH_MAP_C(void *table, u32 val)
11288e93258fSBjoern A. Zeeb {
11298e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 6, val, GENMASK(25, 24));
11308e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_PATH_MAP_C,
11318e93258fSBjoern A. Zeeb 			   GENMASK(25, 24));
11328e93258fSBjoern A. Zeeb }
11338e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_PATH_MAP_D GENMASK(1, 0)
11348e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_PATH_MAP_D(void *table, u32 val)
11358e93258fSBjoern A. Zeeb {
11368e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 6, val, GENMASK(27, 26));
11378e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_PATH_MAP_D,
11388e93258fSBjoern A. Zeeb 			   GENMASK(27, 26));
11398e93258fSBjoern A. Zeeb }
11408e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_ANTSEL_A BIT(0)
11418e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_ANTSEL_A(void *table, u32 val)
11428e93258fSBjoern A. Zeeb {
11438e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 6, val, BIT(28));
11448e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_ANTSEL_A,
11458e93258fSBjoern A. Zeeb 			   BIT(28));
11468e93258fSBjoern A. Zeeb }
11478e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_ANTSEL_B BIT(0)
11488e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_ANTSEL_B(void *table, u32 val)
11498e93258fSBjoern A. Zeeb {
11508e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 6, val, BIT(29));
11518e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_ANTSEL_B,
11528e93258fSBjoern A. Zeeb 			   BIT(29));
11538e93258fSBjoern A. Zeeb }
11548e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_ANTSEL_C BIT(0)
11558e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_ANTSEL_C(void *table, u32 val)
11568e93258fSBjoern A. Zeeb {
11578e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 6, val, BIT(30));
11588e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_ANTSEL_C,
11598e93258fSBjoern A. Zeeb 			   BIT(30));
11608e93258fSBjoern A. Zeeb }
11618e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_ANTSEL_D BIT(0)
11628e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_ANTSEL_D(void *table, u32 val)
11638e93258fSBjoern A. Zeeb {
11648e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 6, val, BIT(31));
11658e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_ANTSEL_D,
11668e93258fSBjoern A. Zeeb 			   BIT(31));
11678e93258fSBjoern A. Zeeb }
11688e93258fSBjoern A. Zeeb 
11698e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING GENMASK(1, 0)
11708e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING_V1(void *table, u32 val)
11718e93258fSBjoern A. Zeeb {
11728e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(1, 0));
11738e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING,
11748e93258fSBjoern A. Zeeb 			   GENMASK(1, 0));
11758e93258fSBjoern A. Zeeb }
11768e93258fSBjoern A. Zeeb 
11778e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING40_V1(void *table, u32 val)
11788e93258fSBjoern A. Zeeb {
11798e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(3, 2));
11808e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING,
11818e93258fSBjoern A. Zeeb 			   GENMASK(3, 2));
11828e93258fSBjoern A. Zeeb }
11838e93258fSBjoern A. Zeeb 
11848e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING80_V1(void *table, u32 val)
11858e93258fSBjoern A. Zeeb {
11868e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(5, 4));
11878e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING,
11888e93258fSBjoern A. Zeeb 			   GENMASK(5, 4));
11898e93258fSBjoern A. Zeeb }
11908e93258fSBjoern A. Zeeb 
11918e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING160_V1(void *table, u32 val)
11928e93258fSBjoern A. Zeeb {
11938e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(7, 6));
11948e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING,
11958e93258fSBjoern A. Zeeb 			   GENMASK(7, 6));
11968e93258fSBjoern A. Zeeb }
11978e93258fSBjoern A. Zeeb 
11988e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_ADDR_CAM_INDEX GENMASK(7, 0)
11998e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_ADDR_CAM_INDEX(void *table, u32 val)
12008e93258fSBjoern A. Zeeb {
12018e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(7, 0));
12028e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_ADDR_CAM_INDEX,
12038e93258fSBjoern A. Zeeb 			   GENMASK(7, 0));
12048e93258fSBjoern A. Zeeb }
12058e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_PAID GENMASK(8, 0)
12068e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_PAID(void *table, u32 val)
12078e93258fSBjoern A. Zeeb {
12088e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(16, 8));
12098e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_PAID,
12108e93258fSBjoern A. Zeeb 			   GENMASK(16, 8));
12118e93258fSBjoern A. Zeeb }
12128e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_ULDL BIT(0)
12138e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_ULDL(void *table, u32 val)
12148e93258fSBjoern A. Zeeb {
12158e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 7, val, BIT(17));
12168e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_ULDL,
12178e93258fSBjoern A. Zeeb 			   BIT(17));
12188e93258fSBjoern A. Zeeb }
12198e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_DOPPLER_CTRL GENMASK(1, 0)
12208e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_DOPPLER_CTRL(void *table, u32 val)
12218e93258fSBjoern A. Zeeb {
12228e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(19, 18));
12238e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_DOPPLER_CTRL,
12248e93258fSBjoern A. Zeeb 			   GENMASK(19, 18));
12258e93258fSBjoern A. Zeeb }
12268e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING(void *table, u32 val)
12278e93258fSBjoern A. Zeeb {
12288e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(21, 20));
12298e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING,
12308e93258fSBjoern A. Zeeb 			   GENMASK(21, 20));
12318e93258fSBjoern A. Zeeb }
12328e93258fSBjoern A. Zeeb 
12338e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING40(void *table, u32 val)
12348e93258fSBjoern A. Zeeb {
12358e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(23, 22));
12368e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING,
12378e93258fSBjoern A. Zeeb 			   GENMASK(23, 22));
12388e93258fSBjoern A. Zeeb }
12398e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_TXPWR_TOLERENCE GENMASK(3, 0)
12408e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_TXPWR_TOLERENCE(void *table, u32 val)
12418e93258fSBjoern A. Zeeb {
12428e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(27, 24));
12438e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_TXPWR_TOLERENCE,
12448e93258fSBjoern A. Zeeb 			   GENMASK(27, 24));
12458e93258fSBjoern A. Zeeb }
12468e93258fSBjoern A. Zeeb 
12478e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING80(void *table, u32 val)
12488e93258fSBjoern A. Zeeb {
12498e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(31, 30));
12508e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING,
12518e93258fSBjoern A. Zeeb 			   GENMASK(31, 30));
12528e93258fSBjoern A. Zeeb }
12538e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_NC GENMASK(2, 0)
12548e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_NC(void *table, u32 val)
12558e93258fSBjoern A. Zeeb {
12568e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(2, 0));
12578e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_NC,
12588e93258fSBjoern A. Zeeb 			   GENMASK(2, 0));
12598e93258fSBjoern A. Zeeb }
12608e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_NR GENMASK(2, 0)
12618e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_NR(void *table, u32 val)
12628e93258fSBjoern A. Zeeb {
12638e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(5, 3));
12648e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_NR,
12658e93258fSBjoern A. Zeeb 			   GENMASK(5, 3));
12668e93258fSBjoern A. Zeeb }
12678e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_NG GENMASK(1, 0)
12688e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_NG(void *table, u32 val)
12698e93258fSBjoern A. Zeeb {
12708e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(7, 6));
12718e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_NG,
12728e93258fSBjoern A. Zeeb 			   GENMASK(7, 6));
12738e93258fSBjoern A. Zeeb }
12748e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_CB GENMASK(1, 0)
12758e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_CB(void *table, u32 val)
12768e93258fSBjoern A. Zeeb {
12778e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(9, 8));
12788e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CB,
12798e93258fSBjoern A. Zeeb 			   GENMASK(9, 8));
12808e93258fSBjoern A. Zeeb }
12818e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_CS GENMASK(1, 0)
12828e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_CS(void *table, u32 val)
12838e93258fSBjoern A. Zeeb {
12848e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(11, 10));
12858e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CS,
12868e93258fSBjoern A. Zeeb 			   GENMASK(11, 10));
12878e93258fSBjoern A. Zeeb }
12888e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_CSI_TXBF_EN BIT(0)
12898e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_CSI_TXBF_EN(void *table, u32 val)
12908e93258fSBjoern A. Zeeb {
12918e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 8, val, BIT(12));
12928e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_TXBF_EN,
12938e93258fSBjoern A. Zeeb 			   BIT(12));
12948e93258fSBjoern A. Zeeb }
12958e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_CSI_STBC_EN BIT(0)
12968e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_CSI_STBC_EN(void *table, u32 val)
12978e93258fSBjoern A. Zeeb {
12988e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 8, val, BIT(13));
12998e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_STBC_EN,
13008e93258fSBjoern A. Zeeb 			   BIT(13));
13018e93258fSBjoern A. Zeeb }
13028e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_CSI_LDPC_EN BIT(0)
13038e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_CSI_LDPC_EN(void *table, u32 val)
13048e93258fSBjoern A. Zeeb {
13058e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 8, val, BIT(14));
13068e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_LDPC_EN,
13078e93258fSBjoern A. Zeeb 			   BIT(14));
13088e93258fSBjoern A. Zeeb }
13098e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_CSI_PARA_EN BIT(0)
13108e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_CSI_PARA_EN(void *table, u32 val)
13118e93258fSBjoern A. Zeeb {
13128e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 8, val, BIT(15));
13138e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_PARA_EN,
13148e93258fSBjoern A. Zeeb 			   BIT(15));
13158e93258fSBjoern A. Zeeb }
13168e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_CSI_FIX_RATE GENMASK(8, 0)
13178e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_CSI_FIX_RATE(void *table, u32 val)
13188e93258fSBjoern A. Zeeb {
13198e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(24, 16));
13208e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_FIX_RATE,
13218e93258fSBjoern A. Zeeb 			   GENMASK(24, 16));
13228e93258fSBjoern A. Zeeb }
13238e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_CSI_GI_LTF GENMASK(2, 0)
13248e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_CSI_GI_LTF(void *table, u32 val)
13258e93258fSBjoern A. Zeeb {
13268e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(27, 25));
13278e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_GI_LTF,
13288e93258fSBjoern A. Zeeb 			   GENMASK(27, 25));
13298e93258fSBjoern A. Zeeb }
13308e93258fSBjoern A. Zeeb 
13318e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING160(void *table, u32 val)
13328e93258fSBjoern A. Zeeb {
13338e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(29, 28));
13348e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING,
13358e93258fSBjoern A. Zeeb 			   GENMASK(29, 28));
13368e93258fSBjoern A. Zeeb }
13378e93258fSBjoern A. Zeeb 
13388e93258fSBjoern A. Zeeb #define SET_CMC_TBL_MASK_CSI_BW GENMASK(1, 0)
13398e93258fSBjoern A. Zeeb static inline void SET_CMC_TBL_CSI_BW(void *table, u32 val)
13408e93258fSBjoern A. Zeeb {
13418e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(31, 30));
13428e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_BW,
13438e93258fSBjoern A. Zeeb 			   GENMASK(31, 30));
13448e93258fSBjoern A. Zeeb }
13458e93258fSBjoern A. Zeeb 
13466d67aabdSBjoern A. Zeeb struct rtw89_h2c_cctlinfo_ud_g7 {
13476d67aabdSBjoern A. Zeeb 	__le32 c0;
13486d67aabdSBjoern A. Zeeb 	__le32 w0;
13496d67aabdSBjoern A. Zeeb 	__le32 w1;
13506d67aabdSBjoern A. Zeeb 	__le32 w2;
13516d67aabdSBjoern A. Zeeb 	__le32 w3;
13526d67aabdSBjoern A. Zeeb 	__le32 w4;
13536d67aabdSBjoern A. Zeeb 	__le32 w5;
13546d67aabdSBjoern A. Zeeb 	__le32 w6;
13556d67aabdSBjoern A. Zeeb 	__le32 w7;
13566d67aabdSBjoern A. Zeeb 	__le32 w8;
13576d67aabdSBjoern A. Zeeb 	__le32 w9;
13586d67aabdSBjoern A. Zeeb 	__le32 w10;
13596d67aabdSBjoern A. Zeeb 	__le32 w11;
13606d67aabdSBjoern A. Zeeb 	__le32 w12;
13616d67aabdSBjoern A. Zeeb 	__le32 w13;
13626d67aabdSBjoern A. Zeeb 	__le32 w14;
13636d67aabdSBjoern A. Zeeb 	__le32 w15;
13646d67aabdSBjoern A. Zeeb 	__le32 m0;
13656d67aabdSBjoern A. Zeeb 	__le32 m1;
13666d67aabdSBjoern A. Zeeb 	__le32 m2;
13676d67aabdSBjoern A. Zeeb 	__le32 m3;
13686d67aabdSBjoern A. Zeeb 	__le32 m4;
13696d67aabdSBjoern A. Zeeb 	__le32 m5;
13706d67aabdSBjoern A. Zeeb 	__le32 m6;
13716d67aabdSBjoern A. Zeeb 	__le32 m7;
13726d67aabdSBjoern A. Zeeb 	__le32 m8;
13736d67aabdSBjoern A. Zeeb 	__le32 m9;
13746d67aabdSBjoern A. Zeeb 	__le32 m10;
13756d67aabdSBjoern A. Zeeb 	__le32 m11;
13766d67aabdSBjoern A. Zeeb 	__le32 m12;
13776d67aabdSBjoern A. Zeeb 	__le32 m13;
13786d67aabdSBjoern A. Zeeb 	__le32 m14;
13796d67aabdSBjoern A. Zeeb 	__le32 m15;
13806d67aabdSBjoern A. Zeeb } __packed;
13818e93258fSBjoern A. Zeeb 
13826d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_C0_MACID GENMASK(6, 0)
13836d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_C0_OP BIT(7)
13848e93258fSBjoern A. Zeeb 
13856d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W0_DATARATE GENMASK(11, 0)
13866d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W0_DATA_GI_LTF GENMASK(14, 12)
13876d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W0_TRYRATE BIT(15)
13886d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W0_ARFR_CTRL GENMASK(17, 16)
13896d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W0_DIS_HE1SS_STBC BIT(18)
13906d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W0_ACQ_RPT_EN BIT(20)
13916d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W0_MGQ_RPT_EN BIT(21)
13926d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W0_ULQ_RPT_EN BIT(22)
13936d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W0_TWTQ_RPT_EN BIT(23)
13946d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W0_FORCE_TXOP BIT(24)
13956d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W0_DISRTSFB BIT(25)
13966d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W0_DISDATAFB BIT(26)
13976d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W0_NSTR_EN BIT(27)
13986d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W0_AMPDU_DENSITY GENMASK(31, 28)
13996d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W0_ALL (GENMASK(31, 20) | GENMASK(18, 0))
14006d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W1_DATA_RTY_LOWEST_RATE GENMASK(11, 0)
14016d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W1_RTS_TXCNT_LMT GENMASK(15, 12)
14026d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W1_RTSRATE GENMASK(27, 16)
14036d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W1_RTS_RTY_LOWEST_RATE GENMASK(31, 28)
14046d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W1_ALL GENMASK(31, 0)
14056d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W2_DATA_TX_CNT_LMT GENMASK(5, 0)
14066d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W2_DATA_TXCNT_LMT_SEL BIT(6)
14076d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W2_MAX_AGG_NUM_SEL BIT(7)
14086d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W2_RTS_EN BIT(8)
14096d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W2_CTS2SELF_EN BIT(9)
14106d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W2_CCA_RTS GENMASK(11, 10)
14116d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W2_HW_RTS_EN BIT(12)
14126d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W2_RTS_DROP_DATA_MODE GENMASK(14, 13)
14136d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W2_PRELD_EN BIT(15)
14146d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W2_AMPDU_MAX_LEN GENMASK(26, 16)
14156d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W2_UL_MU_DIS BIT(27)
14166d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W2_AMPDU_MAX_TIME GENMASK(31, 28)
14176d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W2_ALL GENMASK(31, 0)
14186d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W3_MAX_AGG_NUM GENMASK(7, 0)
14196d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W3_DATA_BW GENMASK(10, 8)
14206d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W3_DATA_BW_ER BIT(11)
14216d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W3_BA_BMAP GENMASK(14, 12)
14226d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W3_VCS_STBC BIT(15)
14236d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W3_VO_LFTIME_SEL GENMASK(18, 16)
14246d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W3_VI_LFTIME_SEL GENMASK(21, 19)
14256d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W3_BE_LFTIME_SEL GENMASK(24, 22)
14266d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W3_BK_LFTIME_SEL GENMASK(27, 25)
14276d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W3_AMPDU_TIME_SEL BIT(28)
14286d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W3_AMPDU_LEN_SEL BIT(29)
14296d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W3_RTS_TXCNT_LMT_SEL BIT(30)
14306d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W3_LSIG_TXOP_EN BIT(31)
14316d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W3_ALL GENMASK(31, 0)
14326d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W4_MULTI_PORT_ID GENMASK(2, 0)
14336d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W4_BYPASS_PUNC BIT(3)
14346d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W4_MBSSID GENMASK(7, 4)
14356d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W4_DATA_DCM BIT(8)
14366d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W4_DATA_ER BIT(9)
14376d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W4_DATA_LDPC BIT(10)
14386d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W4_DATA_STBC BIT(11)
14396d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W4_A_CTRL_BQR BIT(12)
14406d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W4_A_CTRL_BSR BIT(14)
14416d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W4_A_CTRL_CAS BIT(15)
14426d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W4_ACT_SUBCH_CBW GENMASK(31, 16)
14436d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W4_ALL (GENMASK(31, 14) | GENMASK(12, 0))
14446d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W5_NOMINAL_PKT_PADDING0 GENMASK(1, 0)
14456d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W5_NOMINAL_PKT_PADDING1 GENMASK(3, 2)
14466d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W5_NOMINAL_PKT_PADDING2 GENMASK(5, 4)
14476d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W5_NOMINAL_PKT_PADDING3 GENMASK(7, 6)
14486d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W5_NOMINAL_PKT_PADDING4 GENMASK(9, 8)
14496d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W5_SR_RATE GENMASK(14, 10)
14506d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W5_TID_DISABLE GENMASK(23, 16)
14516d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W5_ADDR_CAM_INDEX GENMASK(31, 24)
14526d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W5_ALL (GENMASK(31, 16) | GENMASK(14, 0))
14536d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W6_AID12_PAID GENMASK(11, 0)
14546d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W6_RESP_REF_RATE GENMASK(23, 12)
14556d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W6_ULDL BIT(31)
14566d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W6_ALL (BIT(31) | GENMASK(23, 0))
14576d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W7_NC GENMASK(2, 0)
14586d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W7_NR GENMASK(5, 3)
14596d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W7_NG GENMASK(7, 6)
14606d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W7_CB GENMASK(9, 8)
14616d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W7_CS GENMASK(11, 10)
14626d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W7_CSI_STBC_EN BIT(13)
14636d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W7_CSI_LDPC_EN BIT(14)
14646d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W7_CSI_PARA_EN BIT(15)
14656d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W7_CSI_FIX_RATE GENMASK(27, 16)
14666d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W7_CSI_BW GENMASK(31, 29)
14676d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W7_ALL (GENMASK(31, 29) | GENMASK(27, 13) | GENMASK(11, 0))
14686d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W8_ALL_ACK_SUPPORT BIT(0)
14696d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W8_BSR_QUEUE_SIZE_FORMAT BIT(1)
14706d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W8_BSR_OM_UPD_EN BIT(2)
14716d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W8_MACID_FWD_IDC BIT(3)
14726d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W8_AZ_SEC_EN BIT(4)
14736d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W8_CSI_SEC_EN BIT(5)
14746d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W8_FIX_UL_ADDRCAM_IDX BIT(6)
14756d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W8_CTRL_CNT_VLD BIT(7)
14766d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W8_CTRL_CNT GENMASK(11, 8)
14776d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W8_RESP_SEC_TYPE GENMASK(15, 12)
14786d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W8_ALL GENMASK(15, 0)
14796d67aabdSBjoern A. Zeeb /* W9~13 are reserved */
14806d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W14_VO_CURR_RATE GENMASK(11, 0)
14816d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W14_VI_CURR_RATE GENMASK(23, 12)
14826d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W14_BE_CURR_RATE_L GENMASK(31, 24)
14836d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W14_ALL GENMASK(31, 0)
14846d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W15_BE_CURR_RATE_H GENMASK(3, 0)
14856d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W15_BK_CURR_RATE GENMASK(15, 4)
14866d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W15_MGNT_CURR_RATE GENMASK(27, 16)
14876d67aabdSBjoern A. Zeeb #define CCTLINFO_G7_W15_ALL GENMASK(27, 0)
14888e93258fSBjoern A. Zeeb 
14896d67aabdSBjoern A. Zeeb struct rtw89_h2c_bcn_upd {
14906d67aabdSBjoern A. Zeeb 	__le32 w0;
14916d67aabdSBjoern A. Zeeb 	__le32 w1;
14926d67aabdSBjoern A. Zeeb 	__le32 w2;
14936d67aabdSBjoern A. Zeeb } __packed;
14948e93258fSBjoern A. Zeeb 
14956d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_W0_PORT GENMASK(7, 0)
14966d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_W0_MBSSID GENMASK(15, 8)
14976d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_W0_BAND GENMASK(23, 16)
14986d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_W0_GRP_IE_OFST GENMASK(31, 24)
14996d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_W1_MACID GENMASK(7, 0)
15006d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_W1_SSN_SEL GENMASK(9, 8)
15016d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_W1_SSN_MODE GENMASK(11, 10)
15026d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_W1_RATE GENMASK(20, 12)
15036d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_W1_TXPWR GENMASK(23, 21)
15046d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_W2_TXINFO_CTRL_EN BIT(0)
15056d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_W2_NTX_PATH_EN GENMASK(4, 1)
15066d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_W2_PATH_MAP_A GENMASK(6, 5)
15076d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_W2_PATH_MAP_B GENMASK(8, 7)
15086d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_W2_PATH_MAP_C GENMASK(10, 9)
15096d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_W2_PATH_MAP_D GENMASK(12, 11)
15106d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_W2_PATH_ANTSEL_A BIT(13)
15116d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_W2_PATH_ANTSEL_B BIT(14)
15126d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_W2_PATH_ANTSEL_C BIT(15)
15136d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_W2_PATH_ANTSEL_D BIT(16)
15146d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_W2_CSA_OFST GENMASK(31, 17)
15158e93258fSBjoern A. Zeeb 
15166d67aabdSBjoern A. Zeeb struct rtw89_h2c_bcn_upd_be {
15176d67aabdSBjoern A. Zeeb 	__le32 w0;
15186d67aabdSBjoern A. Zeeb 	__le32 w1;
15196d67aabdSBjoern A. Zeeb 	__le32 w2;
15206d67aabdSBjoern A. Zeeb 	__le32 w3;
15216d67aabdSBjoern A. Zeeb 	__le32 w4;
15226d67aabdSBjoern A. Zeeb 	__le32 w5;
15236d67aabdSBjoern A. Zeeb 	__le32 w6;
15246d67aabdSBjoern A. Zeeb 	__le32 w7;
15256d67aabdSBjoern A. Zeeb 	__le32 w8;
15266d67aabdSBjoern A. Zeeb 	__le32 w9;
15276d67aabdSBjoern A. Zeeb 	__le32 w10;
15286d67aabdSBjoern A. Zeeb 	__le32 w11;
15296d67aabdSBjoern A. Zeeb 	__le32 w12;
15306d67aabdSBjoern A. Zeeb 	__le32 w13;
15316d67aabdSBjoern A. Zeeb 	__le32 w14;
15326d67aabdSBjoern A. Zeeb 	__le32 w15;
15336d67aabdSBjoern A. Zeeb 	__le32 w16;
15346d67aabdSBjoern A. Zeeb 	__le32 w17;
15356d67aabdSBjoern A. Zeeb 	__le32 w18;
15366d67aabdSBjoern A. Zeeb 	__le32 w19;
15376d67aabdSBjoern A. Zeeb 	__le32 w20;
15386d67aabdSBjoern A. Zeeb 	__le32 w21;
15396d67aabdSBjoern A. Zeeb 	__le32 w22;
15406d67aabdSBjoern A. Zeeb 	__le32 w23;
15416d67aabdSBjoern A. Zeeb 	__le32 w24;
15426d67aabdSBjoern A. Zeeb 	__le32 w25;
15436d67aabdSBjoern A. Zeeb 	__le32 w26;
15446d67aabdSBjoern A. Zeeb 	__le32 w27;
15456d67aabdSBjoern A. Zeeb 	__le32 w28;
15466d67aabdSBjoern A. Zeeb 	__le32 w29;
15476d67aabdSBjoern A. Zeeb } __packed;
15488e93258fSBjoern A. Zeeb 
15496d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W0_PORT GENMASK(7, 0)
15506d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W0_MBSSID GENMASK(15, 8)
15516d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W0_BAND GENMASK(23, 16)
15526d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W0_GRP_IE_OFST GENMASK(31, 24)
15536d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W1_MACID GENMASK(7, 0)
15546d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W1_SSN_SEL GENMASK(9, 8)
15556d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W1_SSN_MODE GENMASK(11, 10)
15566d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W1_RATE GENMASK(20, 12)
15576d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W1_TXPWR GENMASK(23, 21)
15586d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W1_MACID_EXT GENMASK(31, 24)
15596d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W2_TXINFO_CTRL_EN BIT(0)
15606d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W2_NTX_PATH_EN GENMASK(4, 1)
15616d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W2_PATH_MAP_A GENMASK(6, 5)
15626d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W2_PATH_MAP_B GENMASK(8, 7)
15636d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W2_PATH_MAP_C GENMASK(10, 9)
15646d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W2_PATH_MAP_D GENMASK(12, 11)
15656d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W2_ANTSEL_A BIT(13)
15666d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W2_ANTSEL_B BIT(14)
15676d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W2_ANTSEL_C BIT(15)
15686d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W2_ANTSEL_D BIT(16)
15696d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W2_CSA_OFST GENMASK(31, 17)
15706d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W3_MLIE_CSA_OFST GENMASK(15, 0)
15716d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W3_CRITICAL_UPD_FLAG_OFST GENMASK(31, 16)
15726d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W4_VAP1_DTIM_CNT_OFST GENMASK(15, 0)
15736d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W4_VAP2_DTIM_CNT_OFST GENMASK(31, 16)
15746d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W5_VAP3_DTIM_CNT_OFST GENMASK(15, 0)
15756d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W5_VAP4_DTIM_CNT_OFST GENMASK(31, 16)
15766d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W6_VAP5_DTIM_CNT_OFST GENMASK(15, 0)
15776d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W6_VAP6_DTIM_CNT_OFST GENMASK(31, 16)
15786d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W7_VAP7_DTIM_CNT_OFST GENMASK(15, 0)
15796d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W7_ECSA_OFST GENMASK(30, 16)
15806d67aabdSBjoern A. Zeeb #define RTW89_H2C_BCN_UPD_BE_W7_PROTECTION_KEY_ID BIT(31)
15818e93258fSBjoern A. Zeeb 
15828e93258fSBjoern A. Zeeb static inline void SET_FWROLE_MAINTAIN_MACID(void *h2c, u32 val)
15838e93258fSBjoern A. Zeeb {
15848e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(7, 0));
15858e93258fSBjoern A. Zeeb }
15868e93258fSBjoern A. Zeeb 
15878e93258fSBjoern A. Zeeb static inline void SET_FWROLE_MAINTAIN_SELF_ROLE(void *h2c, u32 val)
15888e93258fSBjoern A. Zeeb {
15898e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(9, 8));
15908e93258fSBjoern A. Zeeb }
15918e93258fSBjoern A. Zeeb 
15928e93258fSBjoern A. Zeeb static inline void SET_FWROLE_MAINTAIN_UPD_MODE(void *h2c, u32 val)
15938e93258fSBjoern A. Zeeb {
15948e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(12, 10));
15958e93258fSBjoern A. Zeeb }
15968e93258fSBjoern A. Zeeb 
15978e93258fSBjoern A. Zeeb static inline void SET_FWROLE_MAINTAIN_WIFI_ROLE(void *h2c, u32 val)
15988e93258fSBjoern A. Zeeb {
15998e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(16, 13));
16008e93258fSBjoern A. Zeeb }
16018e93258fSBjoern A. Zeeb 
16026d67aabdSBjoern A. Zeeb enum rtw89_fw_sta_type { /* value of RTW89_H2C_JOININFO_W1_STA_TYPE */
16036d67aabdSBjoern A. Zeeb 	RTW89_FW_N_AC_STA = 0,
16046d67aabdSBjoern A. Zeeb 	RTW89_FW_AX_STA = 1,
16056d67aabdSBjoern A. Zeeb 	RTW89_FW_BE_STA = 2,
16066d67aabdSBjoern A. Zeeb };
16078e93258fSBjoern A. Zeeb 
16086d67aabdSBjoern A. Zeeb struct rtw89_h2c_join {
16096d67aabdSBjoern A. Zeeb 	__le32 w0;
16106d67aabdSBjoern A. Zeeb } __packed;
16118e93258fSBjoern A. Zeeb 
16126d67aabdSBjoern A. Zeeb struct rtw89_h2c_join_v1 {
16136d67aabdSBjoern A. Zeeb 	__le32 w0;
16146d67aabdSBjoern A. Zeeb 	__le32 w1;
16156d67aabdSBjoern A. Zeeb 	__le32 w2;
16166d67aabdSBjoern A. Zeeb } __packed;
16178e93258fSBjoern A. Zeeb 
16186d67aabdSBjoern A. Zeeb #define RTW89_H2C_JOININFO_W0_MACID GENMASK(7, 0)
16196d67aabdSBjoern A. Zeeb #define RTW89_H2C_JOININFO_W0_OP BIT(8)
16206d67aabdSBjoern A. Zeeb #define RTW89_H2C_JOININFO_W0_BAND BIT(9)
16216d67aabdSBjoern A. Zeeb #define RTW89_H2C_JOININFO_W0_WMM GENMASK(11, 10)
16226d67aabdSBjoern A. Zeeb #define RTW89_H2C_JOININFO_W0_TGR BIT(12)
16236d67aabdSBjoern A. Zeeb #define RTW89_H2C_JOININFO_W0_ISHESTA BIT(13)
16246d67aabdSBjoern A. Zeeb #define RTW89_H2C_JOININFO_W0_DLBW GENMASK(15, 14)
16256d67aabdSBjoern A. Zeeb #define RTW89_H2C_JOININFO_W0_TF_MAC_PAD GENMASK(17, 16)
16266d67aabdSBjoern A. Zeeb #define RTW89_H2C_JOININFO_W0_DL_T_PE GENMASK(20, 18)
16276d67aabdSBjoern A. Zeeb #define RTW89_H2C_JOININFO_W0_PORT_ID GENMASK(23, 21)
16286d67aabdSBjoern A. Zeeb #define RTW89_H2C_JOININFO_W0_NET_TYPE GENMASK(25, 24)
16296d67aabdSBjoern A. Zeeb #define RTW89_H2C_JOININFO_W0_WIFI_ROLE GENMASK(29, 26)
16306d67aabdSBjoern A. Zeeb #define RTW89_H2C_JOININFO_W0_SELF_ROLE GENMASK(31, 30)
16316d67aabdSBjoern A. Zeeb #define RTW89_H2C_JOININFO_W1_STA_TYPE GENMASK(2, 0)
16326d67aabdSBjoern A. Zeeb #define RTW89_H2C_JOININFO_W1_IS_MLD BIT(3)
16336d67aabdSBjoern A. Zeeb #define RTW89_H2C_JOININFO_W1_MAIN_MACID GENMASK(11, 4)
16346d67aabdSBjoern A. Zeeb #define RTW89_H2C_JOININFO_W1_MLO_MODE BIT(12)
16356d67aabdSBjoern A. Zeeb #define RTW89_H2C_JOININFO_W1_EMLSR_CAB BIT(13)
16366d67aabdSBjoern A. Zeeb #define RTW89_H2C_JOININFO_W1_NSTR_EN BIT(14)
16376d67aabdSBjoern A. Zeeb #define RTW89_H2C_JOININFO_W1_INIT_PWR_STATE BIT(15)
16386d67aabdSBjoern A. Zeeb #define RTW89_H2C_JOININFO_W1_EMLSR_PADDING GENMASK(18, 16)
16396d67aabdSBjoern A. Zeeb #define RTW89_H2C_JOININFO_W1_EMLSR_TRANS_DELAY GENMASK(21, 19)
16406d67aabdSBjoern A. Zeeb #define RTW89_H2C_JOININFO_W2_MACID_EXT GENMASK(7, 0)
16416d67aabdSBjoern A. Zeeb #define RTW89_H2C_JOININFO_W2_MAIN_MACID_EXT GENMASK(15, 8)
16428e93258fSBjoern A. Zeeb 
16436d67aabdSBjoern A. Zeeb struct rtw89_h2c_notify_dbcc {
16446d67aabdSBjoern A. Zeeb 	__le32 w0;
16456d67aabdSBjoern A. Zeeb } __packed;
16468e93258fSBjoern A. Zeeb 
16476d67aabdSBjoern A. Zeeb #define RTW89_H2C_NOTIFY_DBCC_EN BIT(0)
16488e93258fSBjoern A. Zeeb 
16498e93258fSBjoern A. Zeeb static inline void SET_GENERAL_PKT_MACID(void *h2c, u32 val)
16508e93258fSBjoern A. Zeeb {
16518e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(7, 0));
16528e93258fSBjoern A. Zeeb }
16538e93258fSBjoern A. Zeeb 
16548e93258fSBjoern A. Zeeb static inline void SET_GENERAL_PKT_PROBRSP_ID(void *h2c, u32 val)
16558e93258fSBjoern A. Zeeb {
16568e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(15, 8));
16578e93258fSBjoern A. Zeeb }
16588e93258fSBjoern A. Zeeb 
16598e93258fSBjoern A. Zeeb static inline void SET_GENERAL_PKT_PSPOLL_ID(void *h2c, u32 val)
16608e93258fSBjoern A. Zeeb {
16618e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(23, 16));
16628e93258fSBjoern A. Zeeb }
16638e93258fSBjoern A. Zeeb 
16648e93258fSBjoern A. Zeeb static inline void SET_GENERAL_PKT_NULL_ID(void *h2c, u32 val)
16658e93258fSBjoern A. Zeeb {
16668e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(31, 24));
16678e93258fSBjoern A. Zeeb }
16688e93258fSBjoern A. Zeeb 
16698e93258fSBjoern A. Zeeb static inline void SET_GENERAL_PKT_QOS_NULL_ID(void *h2c, u32 val)
16708e93258fSBjoern A. Zeeb {
16718e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(7, 0));
16728e93258fSBjoern A. Zeeb }
16738e93258fSBjoern A. Zeeb 
16748e93258fSBjoern A. Zeeb static inline void SET_GENERAL_PKT_CTS2SELF_ID(void *h2c, u32 val)
16758e93258fSBjoern A. Zeeb {
16768e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(15, 8));
16778e93258fSBjoern A. Zeeb }
16788e93258fSBjoern A. Zeeb 
16798e93258fSBjoern A. Zeeb static inline void SET_LOG_CFG_LEVEL(void *h2c, u32 val)
16808e93258fSBjoern A. Zeeb {
16818e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(7, 0));
16828e93258fSBjoern A. Zeeb }
16838e93258fSBjoern A. Zeeb 
16848e93258fSBjoern A. Zeeb static inline void SET_LOG_CFG_PATH(void *h2c, u32 val)
16858e93258fSBjoern A. Zeeb {
16868e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(15, 8));
16878e93258fSBjoern A. Zeeb }
16888e93258fSBjoern A. Zeeb 
16898e93258fSBjoern A. Zeeb static inline void SET_LOG_CFG_COMP(void *h2c, u32 val)
16908e93258fSBjoern A. Zeeb {
16918e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(31, 0));
16928e93258fSBjoern A. Zeeb }
16938e93258fSBjoern A. Zeeb 
16948e93258fSBjoern A. Zeeb static inline void SET_LOG_CFG_COMP_EXT(void *h2c, u32 val)
16958e93258fSBjoern A. Zeeb {
16968e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(h2c) + 2, val, GENMASK(31, 0));
16978e93258fSBjoern A. Zeeb }
16988e93258fSBjoern A. Zeeb 
16996d67aabdSBjoern A. Zeeb struct rtw89_h2c_ba_cam {
17006d67aabdSBjoern A. Zeeb 	__le32 w0;
17016d67aabdSBjoern A. Zeeb 	__le32 w1;
17026d67aabdSBjoern A. Zeeb } __packed;
17038e93258fSBjoern A. Zeeb 
17046d67aabdSBjoern A. Zeeb #define RTW89_H2C_BA_CAM_W0_VALID BIT(0)
17056d67aabdSBjoern A. Zeeb #define RTW89_H2C_BA_CAM_W0_INIT_REQ BIT(1)
17066d67aabdSBjoern A. Zeeb #define RTW89_H2C_BA_CAM_W0_ENTRY_IDX GENMASK(3, 2)
17076d67aabdSBjoern A. Zeeb #define RTW89_H2C_BA_CAM_W0_TID GENMASK(7, 4)
17086d67aabdSBjoern A. Zeeb #define RTW89_H2C_BA_CAM_W0_MACID GENMASK(15, 8)
17096d67aabdSBjoern A. Zeeb #define RTW89_H2C_BA_CAM_W0_BMAP_SIZE GENMASK(19, 16)
17106d67aabdSBjoern A. Zeeb #define RTW89_H2C_BA_CAM_W0_SSN GENMASK(31, 20)
17116d67aabdSBjoern A. Zeeb #define RTW89_H2C_BA_CAM_W1_UID GENMASK(7, 0)
17126d67aabdSBjoern A. Zeeb #define RTW89_H2C_BA_CAM_W1_STD_EN BIT(8)
17136d67aabdSBjoern A. Zeeb #define RTW89_H2C_BA_CAM_W1_BAND BIT(9)
17146d67aabdSBjoern A. Zeeb #define RTW89_H2C_BA_CAM_W1_ENTRY_IDX_V1 GENMASK(31, 28)
17158e93258fSBjoern A. Zeeb 
17166d67aabdSBjoern A. Zeeb struct rtw89_h2c_ba_cam_v1 {
17176d67aabdSBjoern A. Zeeb 	__le32 w0;
17186d67aabdSBjoern A. Zeeb 	__le32 w1;
17196d67aabdSBjoern A. Zeeb } __packed;
17208e93258fSBjoern A. Zeeb 
17216d67aabdSBjoern A. Zeeb #define RTW89_H2C_BA_CAM_V1_W0_VALID BIT(0)
17226d67aabdSBjoern A. Zeeb #define RTW89_H2C_BA_CAM_V1_W0_INIT_REQ BIT(1)
17236d67aabdSBjoern A. Zeeb #define RTW89_H2C_BA_CAM_V1_W0_TID_MASK GENMASK(7, 4)
17246d67aabdSBjoern A. Zeeb #define RTW89_H2C_BA_CAM_V1_W0_MACID_MASK GENMASK(15, 8)
17256d67aabdSBjoern A. Zeeb #define RTW89_H2C_BA_CAM_V1_W0_BMAP_SIZE_MASK GENMASK(19, 16)
17266d67aabdSBjoern A. Zeeb #define RTW89_H2C_BA_CAM_V1_W0_SSN_MASK GENMASK(31, 20)
17276d67aabdSBjoern A. Zeeb #define RTW89_H2C_BA_CAM_V1_W1_UID_VALUE_MASK GENMASK(7, 0)
17286d67aabdSBjoern A. Zeeb #define RTW89_H2C_BA_CAM_V1_W1_STD_ENTRY_EN BIT(8)
17296d67aabdSBjoern A. Zeeb #define RTW89_H2C_BA_CAM_V1_W1_BAND_SEL BIT(9)
17306d67aabdSBjoern A. Zeeb #define RTW89_H2C_BA_CAM_V1_W1_MLD_EN BIT(10)
17316d67aabdSBjoern A. Zeeb #define RTW89_H2C_BA_CAM_V1_W1_ENTRY_IDX_MASK GENMASK(31, 24)
17328e93258fSBjoern A. Zeeb 
17336d67aabdSBjoern A. Zeeb struct rtw89_h2c_ba_cam_init {
17346d67aabdSBjoern A. Zeeb 	__le32 w0;
17356d67aabdSBjoern A. Zeeb } __packed;
17368e93258fSBjoern A. Zeeb 
17376d67aabdSBjoern A. Zeeb #define RTW89_H2C_BA_CAM_INIT_USERS_MASK GENMASK(7, 0)
17386d67aabdSBjoern A. Zeeb #define RTW89_H2C_BA_CAM_INIT_OFFSET_MASK GENMASK(19, 12)
17396d67aabdSBjoern A. Zeeb #define RTW89_H2C_BA_CAM_INIT_BAND_SEL BIT(24)
17408e93258fSBjoern A. Zeeb 
17418e93258fSBjoern A. Zeeb static inline void SET_LPS_PARM_MACID(void *h2c, u32 val)
17428e93258fSBjoern A. Zeeb {
17438e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(7, 0));
17448e93258fSBjoern A. Zeeb }
17458e93258fSBjoern A. Zeeb 
17468e93258fSBjoern A. Zeeb static inline void SET_LPS_PARM_PSMODE(void *h2c, u32 val)
17478e93258fSBjoern A. Zeeb {
17488e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(15, 8));
17498e93258fSBjoern A. Zeeb }
17508e93258fSBjoern A. Zeeb 
17518e93258fSBjoern A. Zeeb static inline void SET_LPS_PARM_RLBM(void *h2c, u32 val)
17528e93258fSBjoern A. Zeeb {
17538e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(19, 16));
17548e93258fSBjoern A. Zeeb }
17558e93258fSBjoern A. Zeeb 
17568e93258fSBjoern A. Zeeb static inline void SET_LPS_PARM_SMARTPS(void *h2c, u32 val)
17578e93258fSBjoern A. Zeeb {
17588e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(23, 20));
17598e93258fSBjoern A. Zeeb }
17608e93258fSBjoern A. Zeeb 
17618e93258fSBjoern A. Zeeb static inline void SET_LPS_PARM_AWAKEINTERVAL(void *h2c, u32 val)
17628e93258fSBjoern A. Zeeb {
17638e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(31, 24));
17648e93258fSBjoern A. Zeeb }
17658e93258fSBjoern A. Zeeb 
17668e93258fSBjoern A. Zeeb static inline void SET_LPS_PARM_VOUAPSD(void *h2c, u32 val)
17678e93258fSBjoern A. Zeeb {
17688e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(h2c) + 1, val, BIT(0));
17698e93258fSBjoern A. Zeeb }
17708e93258fSBjoern A. Zeeb 
17718e93258fSBjoern A. Zeeb static inline void SET_LPS_PARM_VIUAPSD(void *h2c, u32 val)
17728e93258fSBjoern A. Zeeb {
17738e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(h2c) + 1, val, BIT(1));
17748e93258fSBjoern A. Zeeb }
17758e93258fSBjoern A. Zeeb 
17768e93258fSBjoern A. Zeeb static inline void SET_LPS_PARM_BEUAPSD(void *h2c, u32 val)
17778e93258fSBjoern A. Zeeb {
17788e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(h2c) + 1, val, BIT(2));
17798e93258fSBjoern A. Zeeb }
17808e93258fSBjoern A. Zeeb 
17818e93258fSBjoern A. Zeeb static inline void SET_LPS_PARM_BKUAPSD(void *h2c, u32 val)
17828e93258fSBjoern A. Zeeb {
17838e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(h2c) + 1, val, BIT(3));
17848e93258fSBjoern A. Zeeb }
17858e93258fSBjoern A. Zeeb 
17868e93258fSBjoern A. Zeeb static inline void SET_LPS_PARM_LASTRPWM(void *h2c, u32 val)
17878e93258fSBjoern A. Zeeb {
17888e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(15, 8));
17898e93258fSBjoern A. Zeeb }
17908e93258fSBjoern A. Zeeb 
17916d67aabdSBjoern A. Zeeb struct rtw89_h2c_lps_ch_info {
17926d67aabdSBjoern A. Zeeb 	struct {
17936d67aabdSBjoern A. Zeeb 		u8 pri_ch;
17946d67aabdSBjoern A. Zeeb 		u8 central_ch;
17956d67aabdSBjoern A. Zeeb 		u8 bw;
17966d67aabdSBjoern A. Zeeb 		u8 band;
17976d67aabdSBjoern A. Zeeb 	} __packed info[2];
17986d67aabdSBjoern A. Zeeb 
17996d67aabdSBjoern A. Zeeb 	__le32 mlo_dbcc_mode_lps;
18006d67aabdSBjoern A. Zeeb } __packed;
18016d67aabdSBjoern A. Zeeb 
1802*df279a26SBjoern A. Zeeb struct rtw89_h2c_lps_ml_cmn_info {
1803*df279a26SBjoern A. Zeeb 	u8 fmt_id;
1804*df279a26SBjoern A. Zeeb 	u8 rsvd0[3];
1805*df279a26SBjoern A. Zeeb 	__le32 mlo_dbcc_mode;
1806*df279a26SBjoern A. Zeeb 	u8 central_ch[RTW89_PHY_MAX];
1807*df279a26SBjoern A. Zeeb 	u8 pri_ch[RTW89_PHY_MAX];
1808*df279a26SBjoern A. Zeeb 	u8 bw[RTW89_PHY_MAX];
1809*df279a26SBjoern A. Zeeb 	u8 band[RTW89_PHY_MAX];
1810*df279a26SBjoern A. Zeeb 	u8 bcn_rate_type[RTW89_PHY_MAX];
1811*df279a26SBjoern A. Zeeb 	u8 rsvd1[2];
1812*df279a26SBjoern A. Zeeb 	__le16 tia_gain[RTW89_PHY_MAX][TIA_GAIN_NUM];
1813*df279a26SBjoern A. Zeeb 	u8 lna_gain[RTW89_PHY_MAX][LNA_GAIN_NUM];
1814*df279a26SBjoern A. Zeeb 	u8 rsvd2[2];
1815*df279a26SBjoern A. Zeeb } __packed;
1816*df279a26SBjoern A. Zeeb 
18178e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CPU_EXCEPTION_TYPE(void *cmd, u32 val)
18188e93258fSBjoern A. Zeeb {
18198e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 0));
18208e93258fSBjoern A. Zeeb }
18218e93258fSBjoern A. Zeeb 
1822e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_PKT_DROP_SEL(void *cmd, u32 val)
1823e2340276SBjoern A. Zeeb {
1824e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(7, 0));
1825e2340276SBjoern A. Zeeb }
1826e2340276SBjoern A. Zeeb 
1827e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_PKT_DROP_MACID(void *cmd, u32 val)
1828e2340276SBjoern A. Zeeb {
1829e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 8));
1830e2340276SBjoern A. Zeeb }
1831e2340276SBjoern A. Zeeb 
1832e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_PKT_DROP_BAND(void *cmd, u32 val)
1833e2340276SBjoern A. Zeeb {
1834e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(23, 16));
1835e2340276SBjoern A. Zeeb }
1836e2340276SBjoern A. Zeeb 
1837e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_PKT_DROP_PORT(void *cmd, u32 val)
1838e2340276SBjoern A. Zeeb {
1839e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 24));
1840e2340276SBjoern A. Zeeb }
1841e2340276SBjoern A. Zeeb 
1842e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_PKT_DROP_MBSSID(void *cmd, u32 val)
1843e2340276SBjoern A. Zeeb {
1844e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(7, 0));
1845e2340276SBjoern A. Zeeb }
1846e2340276SBjoern A. Zeeb 
1847e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_PKT_DROP_ROLE_A_INFO_TF_TRS(void *cmd, u32 val)
1848e2340276SBjoern A. Zeeb {
1849e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(15, 8));
1850e2340276SBjoern A. Zeeb }
1851e2340276SBjoern A. Zeeb 
1852e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_0(void *cmd, u32 val)
1853e2340276SBjoern A. Zeeb {
1854e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 2, val, GENMASK(31, 0));
1855e2340276SBjoern A. Zeeb }
1856e2340276SBjoern A. Zeeb 
1857e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_1(void *cmd, u32 val)
1858e2340276SBjoern A. Zeeb {
1859e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 3, val, GENMASK(31, 0));
1860e2340276SBjoern A. Zeeb }
1861e2340276SBjoern A. Zeeb 
1862e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_2(void *cmd, u32 val)
1863e2340276SBjoern A. Zeeb {
1864e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 4, val, GENMASK(31, 0));
1865e2340276SBjoern A. Zeeb }
1866e2340276SBjoern A. Zeeb 
1867e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_3(void *cmd, u32 val)
1868e2340276SBjoern A. Zeeb {
1869e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 5, val, GENMASK(31, 0));
1870e2340276SBjoern A. Zeeb }
1871e2340276SBjoern A. Zeeb 
1872e2340276SBjoern A. Zeeb static inline void RTW89_SET_KEEP_ALIVE_ENABLE(void *h2c, u32 val)
1873e2340276SBjoern A. Zeeb {
1874e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(1, 0));
1875e2340276SBjoern A. Zeeb }
1876e2340276SBjoern A. Zeeb 
1877e2340276SBjoern A. Zeeb static inline void RTW89_SET_KEEP_ALIVE_PKT_NULL_ID(void *h2c, u32 val)
1878e2340276SBjoern A. Zeeb {
1879e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(15, 8));
1880e2340276SBjoern A. Zeeb }
1881e2340276SBjoern A. Zeeb 
1882e2340276SBjoern A. Zeeb static inline void RTW89_SET_KEEP_ALIVE_PERIOD(void *h2c, u32 val)
1883e2340276SBjoern A. Zeeb {
1884e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(24, 16));
1885e2340276SBjoern A. Zeeb }
1886e2340276SBjoern A. Zeeb 
1887e2340276SBjoern A. Zeeb static inline void RTW89_SET_KEEP_ALIVE_MACID(void *h2c, u32 val)
1888e2340276SBjoern A. Zeeb {
1889e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(31, 24));
1890e2340276SBjoern A. Zeeb }
1891e2340276SBjoern A. Zeeb 
1892e2340276SBjoern A. Zeeb static inline void RTW89_SET_DISCONNECT_DETECT_ENABLE(void *h2c, u32 val)
1893e2340276SBjoern A. Zeeb {
1894e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, BIT(0));
1895e2340276SBjoern A. Zeeb }
1896e2340276SBjoern A. Zeeb 
1897e2340276SBjoern A. Zeeb static inline void RTW89_SET_DISCONNECT_DETECT_TRYOK_BCNFAIL_COUNT_EN(void *h2c, u32 val)
1898e2340276SBjoern A. Zeeb {
1899e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, BIT(1));
1900e2340276SBjoern A. Zeeb }
1901e2340276SBjoern A. Zeeb 
1902e2340276SBjoern A. Zeeb static inline void RTW89_SET_DISCONNECT_DETECT_DISCONNECT(void *h2c, u32 val)
1903e2340276SBjoern A. Zeeb {
1904e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, BIT(2));
1905e2340276SBjoern A. Zeeb }
1906e2340276SBjoern A. Zeeb 
1907e2340276SBjoern A. Zeeb static inline void RTW89_SET_DISCONNECT_DETECT_MAC_ID(void *h2c, u32 val)
1908e2340276SBjoern A. Zeeb {
1909e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(15, 8));
1910e2340276SBjoern A. Zeeb }
1911e2340276SBjoern A. Zeeb 
1912e2340276SBjoern A. Zeeb static inline void RTW89_SET_DISCONNECT_DETECT_CHECK_PERIOD(void *h2c, u32 val)
1913e2340276SBjoern A. Zeeb {
1914e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(23, 16));
1915e2340276SBjoern A. Zeeb }
1916e2340276SBjoern A. Zeeb 
1917e2340276SBjoern A. Zeeb static inline void RTW89_SET_DISCONNECT_DETECT_TRY_PKT_COUNT(void *h2c, u32 val)
1918e2340276SBjoern A. Zeeb {
1919e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(31, 24));
1920e2340276SBjoern A. Zeeb }
1921e2340276SBjoern A. Zeeb 
1922e2340276SBjoern A. Zeeb static inline void RTW89_SET_DISCONNECT_DETECT_TRYOK_BCNFAIL_COUNT_LIMIT(void *h2c, u32 val)
1923e2340276SBjoern A. Zeeb {
1924e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(7, 0));
1925e2340276SBjoern A. Zeeb }
1926e2340276SBjoern A. Zeeb 
19276d67aabdSBjoern A. Zeeb struct rtw89_h2c_wow_global {
19286d67aabdSBjoern A. Zeeb 	__le32 w0;
19296d67aabdSBjoern A. Zeeb 	struct rtw89_wow_key_info key_info;
19306d67aabdSBjoern A. Zeeb } __packed;
1931e2340276SBjoern A. Zeeb 
19326d67aabdSBjoern A. Zeeb #define RTW89_H2C_WOW_GLOBAL_W0_ENABLE BIT(0)
19336d67aabdSBjoern A. Zeeb #define RTW89_H2C_WOW_GLOBAL_W0_DROP_ALL_PKT BIT(1)
19346d67aabdSBjoern A. Zeeb #define RTW89_H2C_WOW_GLOBAL_W0_RX_PARSE_AFTER_WAKE BIT(2)
19356d67aabdSBjoern A. Zeeb #define RTW89_H2C_WOW_GLOBAL_W0_WAKE_BAR_PULLED BIT(3)
19366d67aabdSBjoern A. Zeeb #define RTW89_H2C_WOW_GLOBAL_W0_MAC_ID GENMASK(15, 8)
19376d67aabdSBjoern A. Zeeb #define RTW89_H2C_WOW_GLOBAL_W0_PAIRWISE_SEC_ALGO GENMASK(23, 16)
19386d67aabdSBjoern A. Zeeb #define RTW89_H2C_WOW_GLOBAL_W0_GROUP_SEC_ALGO GENMASK(31, 24)
1939e2340276SBjoern A. Zeeb 
1940*df279a26SBjoern A. Zeeb #define RTW89_MAX_SUPPORT_NL_NUM	16
1941*df279a26SBjoern A. Zeeb struct rtw89_h2c_cfg_nlo {
1942*df279a26SBjoern A. Zeeb 	__le32 w0;
1943*df279a26SBjoern A. Zeeb 	u8 nlo_cnt;
1944*df279a26SBjoern A. Zeeb 	u8 rsvd[3];
1945*df279a26SBjoern A. Zeeb 	__le32 patterncheck;
1946*df279a26SBjoern A. Zeeb 	__le32 rsvd1;
1947*df279a26SBjoern A. Zeeb 	__le32 rsvd2;
1948*df279a26SBjoern A. Zeeb 	u8 ssid_len[RTW89_MAX_SUPPORT_NL_NUM];
1949*df279a26SBjoern A. Zeeb 	u8 chiper[RTW89_MAX_SUPPORT_NL_NUM];
1950*df279a26SBjoern A. Zeeb 	u8 rsvd3[24];
1951*df279a26SBjoern A. Zeeb 	u8 ssid[RTW89_MAX_SUPPORT_NL_NUM][IEEE80211_MAX_SSID_LEN];
1952*df279a26SBjoern A. Zeeb } __packed;
1953*df279a26SBjoern A. Zeeb 
1954*df279a26SBjoern A. Zeeb #define RTW89_H2C_NLO_W0_ENABLE BIT(0)
1955*df279a26SBjoern A. Zeeb #define RTW89_H2C_NLO_W0_IGNORE_CIPHER BIT(2)
1956*df279a26SBjoern A. Zeeb #define RTW89_H2C_NLO_W0_MACID GENMASK(31, 24)
1957*df279a26SBjoern A. Zeeb 
1958e2340276SBjoern A. Zeeb static inline void RTW89_SET_WOW_WAKEUP_CTRL_PATTERN_MATCH_ENABLE(void *h2c, u32 val)
1959e2340276SBjoern A. Zeeb {
1960e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, BIT(0));
1961e2340276SBjoern A. Zeeb }
1962e2340276SBjoern A. Zeeb 
1963e2340276SBjoern A. Zeeb static inline void RTW89_SET_WOW_WAKEUP_CTRL_MAGIC_ENABLE(void *h2c, u32 val)
1964e2340276SBjoern A. Zeeb {
1965e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, BIT(1));
1966e2340276SBjoern A. Zeeb }
1967e2340276SBjoern A. Zeeb 
1968e2340276SBjoern A. Zeeb static inline void RTW89_SET_WOW_WAKEUP_CTRL_HW_UNICAST_ENABLE(void *h2c, u32 val)
1969e2340276SBjoern A. Zeeb {
1970e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, BIT(2));
1971e2340276SBjoern A. Zeeb }
1972e2340276SBjoern A. Zeeb 
1973e2340276SBjoern A. Zeeb static inline void RTW89_SET_WOW_WAKEUP_CTRL_FW_UNICAST_ENABLE(void *h2c, u32 val)
1974e2340276SBjoern A. Zeeb {
1975e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, BIT(3));
1976e2340276SBjoern A. Zeeb }
1977e2340276SBjoern A. Zeeb 
1978e2340276SBjoern A. Zeeb static inline void RTW89_SET_WOW_WAKEUP_CTRL_DEAUTH_ENABLE(void *h2c, u32 val)
1979e2340276SBjoern A. Zeeb {
1980e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, BIT(4));
1981e2340276SBjoern A. Zeeb }
1982e2340276SBjoern A. Zeeb 
1983e2340276SBjoern A. Zeeb static inline void RTW89_SET_WOW_WAKEUP_CTRL_REKEYP_ENABLE(void *h2c, u32 val)
1984e2340276SBjoern A. Zeeb {
1985e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, BIT(5));
1986e2340276SBjoern A. Zeeb }
1987e2340276SBjoern A. Zeeb 
1988e2340276SBjoern A. Zeeb static inline void RTW89_SET_WOW_WAKEUP_CTRL_EAP_ENABLE(void *h2c, u32 val)
1989e2340276SBjoern A. Zeeb {
1990e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, BIT(6));
1991e2340276SBjoern A. Zeeb }
1992e2340276SBjoern A. Zeeb 
1993e2340276SBjoern A. Zeeb static inline void RTW89_SET_WOW_WAKEUP_CTRL_ALL_DATA_ENABLE(void *h2c, u32 val)
1994e2340276SBjoern A. Zeeb {
1995e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, BIT(7));
1996e2340276SBjoern A. Zeeb }
1997e2340276SBjoern A. Zeeb 
1998e2340276SBjoern A. Zeeb static inline void RTW89_SET_WOW_WAKEUP_CTRL_MAC_ID(void *h2c, u32 val)
1999e2340276SBjoern A. Zeeb {
2000e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(31, 24));
2001e2340276SBjoern A. Zeeb }
2002e2340276SBjoern A. Zeeb 
2003e2340276SBjoern A. Zeeb static inline void RTW89_SET_WOW_CAM_UPD_R_W(void *h2c, u32 val)
2004e2340276SBjoern A. Zeeb {
2005e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, BIT(0));
2006e2340276SBjoern A. Zeeb }
2007e2340276SBjoern A. Zeeb 
2008e2340276SBjoern A. Zeeb static inline void RTW89_SET_WOW_CAM_UPD_IDX(void *h2c, u32 val)
2009e2340276SBjoern A. Zeeb {
2010e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c, val, GENMASK(7, 1));
2011e2340276SBjoern A. Zeeb }
2012e2340276SBjoern A. Zeeb 
2013e2340276SBjoern A. Zeeb static inline void RTW89_SET_WOW_CAM_UPD_WKFM1(void *h2c, u32 val)
2014e2340276SBjoern A. Zeeb {
2015e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c + 1, val, GENMASK(31, 0));
2016e2340276SBjoern A. Zeeb }
2017e2340276SBjoern A. Zeeb 
2018e2340276SBjoern A. Zeeb static inline void RTW89_SET_WOW_CAM_UPD_WKFM2(void *h2c, u32 val)
2019e2340276SBjoern A. Zeeb {
2020e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c + 2, val, GENMASK(31, 0));
2021e2340276SBjoern A. Zeeb }
2022e2340276SBjoern A. Zeeb 
2023e2340276SBjoern A. Zeeb static inline void RTW89_SET_WOW_CAM_UPD_WKFM3(void *h2c, u32 val)
2024e2340276SBjoern A. Zeeb {
2025e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c + 3, val, GENMASK(31, 0));
2026e2340276SBjoern A. Zeeb }
2027e2340276SBjoern A. Zeeb 
2028e2340276SBjoern A. Zeeb static inline void RTW89_SET_WOW_CAM_UPD_WKFM4(void *h2c, u32 val)
2029e2340276SBjoern A. Zeeb {
2030e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c + 4, val, GENMASK(31, 0));
2031e2340276SBjoern A. Zeeb }
2032e2340276SBjoern A. Zeeb 
2033e2340276SBjoern A. Zeeb static inline void RTW89_SET_WOW_CAM_UPD_CRC(void *h2c, u32 val)
2034e2340276SBjoern A. Zeeb {
2035e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c + 5, val, GENMASK(15, 0));
2036e2340276SBjoern A. Zeeb }
2037e2340276SBjoern A. Zeeb 
2038e2340276SBjoern A. Zeeb static inline void RTW89_SET_WOW_CAM_UPD_NEGATIVE_PATTERN_MATCH(void *h2c, u32 val)
2039e2340276SBjoern A. Zeeb {
2040e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c + 5, val, BIT(22));
2041e2340276SBjoern A. Zeeb }
2042e2340276SBjoern A. Zeeb 
2043e2340276SBjoern A. Zeeb static inline void RTW89_SET_WOW_CAM_UPD_SKIP_MAC_HDR(void *h2c, u32 val)
2044e2340276SBjoern A. Zeeb {
2045e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c + 5, val, BIT(23));
2046e2340276SBjoern A. Zeeb }
2047e2340276SBjoern A. Zeeb 
2048e2340276SBjoern A. Zeeb static inline void RTW89_SET_WOW_CAM_UPD_UC(void *h2c, u32 val)
2049e2340276SBjoern A. Zeeb {
2050e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c + 5, val, BIT(24));
2051e2340276SBjoern A. Zeeb }
2052e2340276SBjoern A. Zeeb 
2053e2340276SBjoern A. Zeeb static inline void RTW89_SET_WOW_CAM_UPD_MC(void *h2c, u32 val)
2054e2340276SBjoern A. Zeeb {
2055e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c + 5, val, BIT(25));
2056e2340276SBjoern A. Zeeb }
2057e2340276SBjoern A. Zeeb 
2058e2340276SBjoern A. Zeeb static inline void RTW89_SET_WOW_CAM_UPD_BC(void *h2c, u32 val)
2059e2340276SBjoern A. Zeeb {
2060e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c + 5, val, BIT(26));
2061e2340276SBjoern A. Zeeb }
2062e2340276SBjoern A. Zeeb 
2063e2340276SBjoern A. Zeeb static inline void RTW89_SET_WOW_CAM_UPD_VALID(void *h2c, u32 val)
2064e2340276SBjoern A. Zeeb {
2065e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)h2c + 5, val, BIT(31));
2066e2340276SBjoern A. Zeeb }
2067e2340276SBjoern A. Zeeb 
20686d67aabdSBjoern A. Zeeb struct rtw89_h2c_wow_gtk_ofld {
20696d67aabdSBjoern A. Zeeb 	__le32 w0;
20706d67aabdSBjoern A. Zeeb 	__le32 w1;
20716d67aabdSBjoern A. Zeeb 	struct rtw89_wow_gtk_info gtk_info;
20726d67aabdSBjoern A. Zeeb } __packed;
20736d67aabdSBjoern A. Zeeb 
20746d67aabdSBjoern A. Zeeb #define RTW89_H2C_WOW_GTK_OFLD_W0_EN BIT(0)
20756d67aabdSBjoern A. Zeeb #define RTW89_H2C_WOW_GTK_OFLD_W0_TKIP_EN BIT(1)
20766d67aabdSBjoern A. Zeeb #define RTW89_H2C_WOW_GTK_OFLD_W0_IEEE80211W_EN BIT(2)
20776d67aabdSBjoern A. Zeeb #define RTW89_H2C_WOW_GTK_OFLD_W0_PAIRWISE_WAKEUP BIT(3)
20786d67aabdSBjoern A. Zeeb #define RTW89_H2C_WOW_GTK_OFLD_W0_NOREKEY_WAKEUP BIT(4)
20796d67aabdSBjoern A. Zeeb #define RTW89_H2C_WOW_GTK_OFLD_W0_MAC_ID GENMASK(23, 16)
20806d67aabdSBjoern A. Zeeb #define RTW89_H2C_WOW_GTK_OFLD_W0_GTK_RSP_ID GENMASK(31, 24)
20816d67aabdSBjoern A. Zeeb #define RTW89_H2C_WOW_GTK_OFLD_W1_PMF_SA_QUERY_ID GENMASK(7, 0)
20826d67aabdSBjoern A. Zeeb #define RTW89_H2C_WOW_GTK_OFLD_W1_PMF_BIP_SEC_ALGO GENMASK(9, 8)
20836d67aabdSBjoern A. Zeeb #define RTW89_H2C_WOW_GTK_OFLD_W1_ALGO_AKM_SUIT GENMASK(17, 10)
20846d67aabdSBjoern A. Zeeb 
20856d67aabdSBjoern A. Zeeb struct rtw89_h2c_arp_offload {
20866d67aabdSBjoern A. Zeeb 	__le32 w0;
20876d67aabdSBjoern A. Zeeb 	__le32 w1;
20886d67aabdSBjoern A. Zeeb } __packed;
20896d67aabdSBjoern A. Zeeb 
20906d67aabdSBjoern A. Zeeb #define RTW89_H2C_ARP_OFFLOAD_W0_ENABLE BIT(0)
20916d67aabdSBjoern A. Zeeb #define RTW89_H2C_ARP_OFFLOAD_W0_ACTION BIT(1)
20926d67aabdSBjoern A. Zeeb #define RTW89_H2C_ARP_OFFLOAD_W0_MACID GENMASK(23, 16)
20936d67aabdSBjoern A. Zeeb #define RTW89_H2C_ARP_OFFLOAD_W0_PKT_ID GENMASK(31, 24)
20946d67aabdSBjoern A. Zeeb #define RTW89_H2C_ARP_OFFLOAD_W1_CONTENT GENMASK(31, 0)
20956d67aabdSBjoern A. Zeeb 
20968e93258fSBjoern A. Zeeb enum rtw89_btc_btf_h2c_class {
20978e93258fSBjoern A. Zeeb 	BTFC_SET = 0x10,
20988e93258fSBjoern A. Zeeb 	BTFC_GET = 0x11,
20998e93258fSBjoern A. Zeeb 	BTFC_FW_EVENT = 0x12,
21008e93258fSBjoern A. Zeeb };
21018e93258fSBjoern A. Zeeb 
21028e93258fSBjoern A. Zeeb enum rtw89_btc_btf_set {
21038e93258fSBjoern A. Zeeb 	SET_REPORT_EN = 0x0,
21048e93258fSBjoern A. Zeeb 	SET_SLOT_TABLE,
21058e93258fSBjoern A. Zeeb 	SET_MREG_TABLE,
21068e93258fSBjoern A. Zeeb 	SET_CX_POLICY,
21078e93258fSBjoern A. Zeeb 	SET_GPIO_DBG,
21088e93258fSBjoern A. Zeeb 	SET_DRV_INFO,
21098e93258fSBjoern A. Zeeb 	SET_DRV_EVENT,
21108e93258fSBjoern A. Zeeb 	SET_BT_WREG_ADDR,
21118e93258fSBjoern A. Zeeb 	SET_BT_WREG_VAL,
21128e93258fSBjoern A. Zeeb 	SET_BT_RREG_ADDR,
21138e93258fSBjoern A. Zeeb 	SET_BT_WL_CH_INFO,
21148e93258fSBjoern A. Zeeb 	SET_BT_INFO_REPORT,
21158e93258fSBjoern A. Zeeb 	SET_BT_IGNORE_WLAN_ACT,
21168e93258fSBjoern A. Zeeb 	SET_BT_TX_PWR,
21178e93258fSBjoern A. Zeeb 	SET_BT_LNA_CONSTRAIN,
21186d67aabdSBjoern A. Zeeb 	SET_BT_QUERY_DEV_LIST,
21196d67aabdSBjoern A. Zeeb 	SET_BT_QUERY_DEV_INFO,
21208e93258fSBjoern A. Zeeb 	SET_BT_PSD_REPORT,
21218e93258fSBjoern A. Zeeb 	SET_H2C_TEST,
21226d67aabdSBjoern A. Zeeb 	SET_IOFLD_RF,
21236d67aabdSBjoern A. Zeeb 	SET_IOFLD_BB,
21246d67aabdSBjoern A. Zeeb 	SET_IOFLD_MAC,
21256d67aabdSBjoern A. Zeeb 	SET_IOFLD_SCBD,
21266d67aabdSBjoern A. Zeeb 	SET_H2C_MACRO,
21278e93258fSBjoern A. Zeeb 	SET_MAX1,
21288e93258fSBjoern A. Zeeb };
21298e93258fSBjoern A. Zeeb 
21308e93258fSBjoern A. Zeeb enum rtw89_btc_cxdrvinfo {
21318e93258fSBjoern A. Zeeb 	CXDRVINFO_INIT = 0,
21328e93258fSBjoern A. Zeeb 	CXDRVINFO_ROLE,
21338e93258fSBjoern A. Zeeb 	CXDRVINFO_DBCC,
21348e93258fSBjoern A. Zeeb 	CXDRVINFO_SMAP,
21358e93258fSBjoern A. Zeeb 	CXDRVINFO_RFK,
21368e93258fSBjoern A. Zeeb 	CXDRVINFO_RUN,
21378e93258fSBjoern A. Zeeb 	CXDRVINFO_CTRL,
21388e93258fSBjoern A. Zeeb 	CXDRVINFO_SCAN,
2139e2340276SBjoern A. Zeeb 	CXDRVINFO_TRX,  /* WL traffic to WL fw */
21406d67aabdSBjoern A. Zeeb 	CXDRVINFO_TXPWR,
21416d67aabdSBjoern A. Zeeb 	CXDRVINFO_FDDT,
21426d67aabdSBjoern A. Zeeb 	CXDRVINFO_MLO,
21436d67aabdSBjoern A. Zeeb 	CXDRVINFO_OSI,
21448e93258fSBjoern A. Zeeb 	CXDRVINFO_MAX,
21458e93258fSBjoern A. Zeeb };
21468e93258fSBjoern A. Zeeb 
21478e93258fSBjoern A. Zeeb enum rtw89_scan_mode {
21488e93258fSBjoern A. Zeeb 	RTW89_SCAN_IMMEDIATE,
2149*df279a26SBjoern A. Zeeb 	RTW89_SCAN_DELAY,
21508e93258fSBjoern A. Zeeb };
21518e93258fSBjoern A. Zeeb 
21528e93258fSBjoern A. Zeeb enum rtw89_scan_type {
21538e93258fSBjoern A. Zeeb 	RTW89_SCAN_ONCE,
2154*df279a26SBjoern A. Zeeb 	RTW89_SCAN_NORMAL,
2155*df279a26SBjoern A. Zeeb 	RTW89_SCAN_NORMAL_SLOW,
2156*df279a26SBjoern A. Zeeb 	RTW89_SCAN_SEAMLESS,
2157*df279a26SBjoern A. Zeeb 	RTW89_SCAN_MAX,
21588e93258fSBjoern A. Zeeb };
21598e93258fSBjoern A. Zeeb 
21608e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXHDR_TYPE(void *cmd, u8 val)
21618e93258fSBjoern A. Zeeb {
21628e93258fSBjoern A. Zeeb 	u8p_replace_bits((u8 *)(cmd) + 0, val, GENMASK(7, 0));
21638e93258fSBjoern A. Zeeb }
21648e93258fSBjoern A. Zeeb 
21658e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXHDR_LEN(void *cmd, u8 val)
21668e93258fSBjoern A. Zeeb {
21678e93258fSBjoern A. Zeeb 	u8p_replace_bits((u8 *)(cmd) + 1, val, GENMASK(7, 0));
21688e93258fSBjoern A. Zeeb }
21698e93258fSBjoern A. Zeeb 
2170e2340276SBjoern A. Zeeb struct rtw89_h2c_cxhdr {
2171e2340276SBjoern A. Zeeb 	u8 type;
2172e2340276SBjoern A. Zeeb 	u8 len;
2173e2340276SBjoern A. Zeeb } __packed;
21748e93258fSBjoern A. Zeeb 
21756d67aabdSBjoern A. Zeeb struct rtw89_h2c_cxhdr_v7 {
21766d67aabdSBjoern A. Zeeb 	u8 type;
21776d67aabdSBjoern A. Zeeb 	u8 ver;
21786d67aabdSBjoern A. Zeeb 	u8 len;
21796d67aabdSBjoern A. Zeeb } __packed;
21806d67aabdSBjoern A. Zeeb 
21816d67aabdSBjoern A. Zeeb struct rtw89_h2c_cxctrl_v7 {
21826d67aabdSBjoern A. Zeeb 	struct rtw89_h2c_cxhdr_v7 hdr;
21836d67aabdSBjoern A. Zeeb 	struct rtw89_btc_ctrl_v7 ctrl;
21846d67aabdSBjoern A. Zeeb } __packed;
21856d67aabdSBjoern A. Zeeb 
2186e2340276SBjoern A. Zeeb #define H2C_LEN_CXDRVHDR sizeof(struct rtw89_h2c_cxhdr)
21876d67aabdSBjoern A. Zeeb #define H2C_LEN_CXDRVHDR_V7 sizeof(struct rtw89_h2c_cxhdr_v7)
21886d67aabdSBjoern A. Zeeb 
2189*df279a26SBjoern A. Zeeb struct rtw89_btc_wl_role_info_v7_u8 {
2190*df279a26SBjoern A. Zeeb 	u8 connect_cnt;
2191*df279a26SBjoern A. Zeeb 	u8 link_mode;
2192*df279a26SBjoern A. Zeeb 	u8 link_mode_chg;
2193*df279a26SBjoern A. Zeeb 	u8 p2p_2g;
2194*df279a26SBjoern A. Zeeb 
2195*df279a26SBjoern A. Zeeb 	struct rtw89_btc_wl_active_role_v7 active_role[RTW89_BE_BTC_WL_MAX_ROLE_NUMBER];
2196*df279a26SBjoern A. Zeeb } __packed;
2197*df279a26SBjoern A. Zeeb 
2198*df279a26SBjoern A. Zeeb struct rtw89_btc_wl_role_info_v7_u32 {
2199*df279a26SBjoern A. Zeeb 	__le32 role_map;
2200*df279a26SBjoern A. Zeeb 	__le32 mrole_type;
2201*df279a26SBjoern A. Zeeb 	__le32 mrole_noa_duration;
2202*df279a26SBjoern A. Zeeb 	__le32 dbcc_en;
2203*df279a26SBjoern A. Zeeb 	__le32 dbcc_chg;
2204*df279a26SBjoern A. Zeeb 	__le32 dbcc_2g_phy;
2205*df279a26SBjoern A. Zeeb } __packed;
2206*df279a26SBjoern A. Zeeb 
2207*df279a26SBjoern A. Zeeb struct rtw89_h2c_cxrole_v7 {
2208*df279a26SBjoern A. Zeeb 	struct rtw89_h2c_cxhdr_v7 hdr;
2209*df279a26SBjoern A. Zeeb 	struct rtw89_btc_wl_role_info_v7_u8 _u8;
2210*df279a26SBjoern A. Zeeb 	struct rtw89_btc_wl_role_info_v7_u32 _u32;
2211*df279a26SBjoern A. Zeeb } __packed;
2212*df279a26SBjoern A. Zeeb 
22136d67aabdSBjoern A. Zeeb struct rtw89_btc_wl_role_info_v8_u8 {
22146d67aabdSBjoern A. Zeeb 	u8 connect_cnt;
22156d67aabdSBjoern A. Zeeb 	u8 link_mode;
22166d67aabdSBjoern A. Zeeb 	u8 link_mode_chg;
22176d67aabdSBjoern A. Zeeb 	u8 p2p_2g;
22186d67aabdSBjoern A. Zeeb 
22196d67aabdSBjoern A. Zeeb 	u8 pta_req_band;
22206d67aabdSBjoern A. Zeeb 	u8 dbcc_en;
22216d67aabdSBjoern A. Zeeb 	u8 dbcc_chg;
22226d67aabdSBjoern A. Zeeb 	u8 dbcc_2g_phy;
22236d67aabdSBjoern A. Zeeb 
22246d67aabdSBjoern A. Zeeb 	struct rtw89_btc_wl_rlink rlink[RTW89_BE_BTC_WL_MAX_ROLE_NUMBER][RTW89_MAC_NUM];
22256d67aabdSBjoern A. Zeeb } __packed;
22266d67aabdSBjoern A. Zeeb 
22276d67aabdSBjoern A. Zeeb struct rtw89_btc_wl_role_info_v8_u32 {
22286d67aabdSBjoern A. Zeeb 	__le32 role_map;
22296d67aabdSBjoern A. Zeeb 	__le32 mrole_type;
22306d67aabdSBjoern A. Zeeb 	__le32 mrole_noa_duration;
22316d67aabdSBjoern A. Zeeb } __packed;
22326d67aabdSBjoern A. Zeeb 
22336d67aabdSBjoern A. Zeeb struct rtw89_h2c_cxrole_v8 {
2234*df279a26SBjoern A. Zeeb 	struct rtw89_h2c_cxhdr_v7 hdr;
22356d67aabdSBjoern A. Zeeb 	struct rtw89_btc_wl_role_info_v8_u8 _u8;
22366d67aabdSBjoern A. Zeeb 	struct rtw89_btc_wl_role_info_v8_u32 _u32;
22376d67aabdSBjoern A. Zeeb } __packed;
22388e93258fSBjoern A. Zeeb 
2239e2340276SBjoern A. Zeeb struct rtw89_h2c_cxinit {
2240e2340276SBjoern A. Zeeb 	struct rtw89_h2c_cxhdr hdr;
2241e2340276SBjoern A. Zeeb 	u8 ant_type;
2242e2340276SBjoern A. Zeeb 	u8 ant_num;
2243e2340276SBjoern A. Zeeb 	u8 ant_iso;
2244e2340276SBjoern A. Zeeb 	u8 ant_info;
2245e2340276SBjoern A. Zeeb 	u8 mod_rfe;
2246e2340276SBjoern A. Zeeb 	u8 mod_cv;
2247e2340276SBjoern A. Zeeb 	u8 mod_info;
2248e2340276SBjoern A. Zeeb 	u8 mod_adie_kt;
2249e2340276SBjoern A. Zeeb 	u8 wl_gch;
2250e2340276SBjoern A. Zeeb 	u8 info;
2251e2340276SBjoern A. Zeeb 	u8 rsvd;
2252e2340276SBjoern A. Zeeb 	u8 rsvd1;
2253e2340276SBjoern A. Zeeb } __packed;
22548e93258fSBjoern A. Zeeb 
2255e2340276SBjoern A. Zeeb #define RTW89_H2C_CXINIT_ANT_INFO_POS BIT(0)
2256e2340276SBjoern A. Zeeb #define RTW89_H2C_CXINIT_ANT_INFO_DIVERSITY BIT(1)
2257e2340276SBjoern A. Zeeb #define RTW89_H2C_CXINIT_ANT_INFO_BTG_POS GENMASK(3, 2)
2258e2340276SBjoern A. Zeeb #define RTW89_H2C_CXINIT_ANT_INFO_STREAM_CNT GENMASK(7, 4)
22598e93258fSBjoern A. Zeeb 
2260e2340276SBjoern A. Zeeb #define RTW89_H2C_CXINIT_MOD_INFO_BT_SOLO BIT(0)
2261e2340276SBjoern A. Zeeb #define RTW89_H2C_CXINIT_MOD_INFO_BT_POS BIT(1)
2262e2340276SBjoern A. Zeeb #define RTW89_H2C_CXINIT_MOD_INFO_SW_TYPE BIT(2)
2263e2340276SBjoern A. Zeeb #define RTW89_H2C_CXINIT_MOD_INFO_WA_TYPE GENMASK(5, 3)
22648e93258fSBjoern A. Zeeb 
2265e2340276SBjoern A. Zeeb #define RTW89_H2C_CXINIT_INFO_WL_ONLY BIT(0)
2266e2340276SBjoern A. Zeeb #define RTW89_H2C_CXINIT_INFO_WL_INITOK BIT(1)
2267e2340276SBjoern A. Zeeb #define RTW89_H2C_CXINIT_INFO_DBCC_EN BIT(2)
2268e2340276SBjoern A. Zeeb #define RTW89_H2C_CXINIT_INFO_CX_OTHER BIT(3)
2269e2340276SBjoern A. Zeeb #define RTW89_H2C_CXINIT_INFO_BT_ONLY BIT(4)
22708e93258fSBjoern A. Zeeb 
22716d67aabdSBjoern A. Zeeb struct rtw89_h2c_cxinit_v7 {
22726d67aabdSBjoern A. Zeeb 	struct rtw89_h2c_cxhdr_v7 hdr;
22736d67aabdSBjoern A. Zeeb 	struct rtw89_btc_init_info_v7 init;
22746d67aabdSBjoern A. Zeeb } __packed;
22756d67aabdSBjoern A. Zeeb 
22768e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_CONNECT_CNT(void *cmd, u8 val)
22778e93258fSBjoern A. Zeeb {
22788e93258fSBjoern A. Zeeb 	u8p_replace_bits((u8 *)(cmd) + 2, val, GENMASK(7, 0));
22798e93258fSBjoern A. Zeeb }
22808e93258fSBjoern A. Zeeb 
22818e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_LINK_MODE(void *cmd, u8 val)
22828e93258fSBjoern A. Zeeb {
22838e93258fSBjoern A. Zeeb 	u8p_replace_bits((u8 *)(cmd) + 3, val, GENMASK(7, 0));
22848e93258fSBjoern A. Zeeb }
22858e93258fSBjoern A. Zeeb 
22868e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ROLE_NONE(void *cmd, u16 val)
22878e93258fSBjoern A. Zeeb {
22888e93258fSBjoern A. Zeeb 	le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(0));
22898e93258fSBjoern A. Zeeb }
22908e93258fSBjoern A. Zeeb 
22918e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ROLE_STA(void *cmd, u16 val)
22928e93258fSBjoern A. Zeeb {
22938e93258fSBjoern A. Zeeb 	le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(1));
22948e93258fSBjoern A. Zeeb }
22958e93258fSBjoern A. Zeeb 
22968e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ROLE_AP(void *cmd, u16 val)
22978e93258fSBjoern A. Zeeb {
22988e93258fSBjoern A. Zeeb 	le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(2));
22998e93258fSBjoern A. Zeeb }
23008e93258fSBjoern A. Zeeb 
23018e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ROLE_VAP(void *cmd, u16 val)
23028e93258fSBjoern A. Zeeb {
23038e93258fSBjoern A. Zeeb 	le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(3));
23048e93258fSBjoern A. Zeeb }
23058e93258fSBjoern A. Zeeb 
23068e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ROLE_ADHOC(void *cmd, u16 val)
23078e93258fSBjoern A. Zeeb {
23088e93258fSBjoern A. Zeeb 	le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(4));
23098e93258fSBjoern A. Zeeb }
23108e93258fSBjoern A. Zeeb 
23118e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ROLE_ADHOC_MASTER(void *cmd, u16 val)
23128e93258fSBjoern A. Zeeb {
23138e93258fSBjoern A. Zeeb 	le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(5));
23148e93258fSBjoern A. Zeeb }
23158e93258fSBjoern A. Zeeb 
23168e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ROLE_MESH(void *cmd, u16 val)
23178e93258fSBjoern A. Zeeb {
23188e93258fSBjoern A. Zeeb 	le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(6));
23198e93258fSBjoern A. Zeeb }
23208e93258fSBjoern A. Zeeb 
23218e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ROLE_MONITOR(void *cmd, u16 val)
23228e93258fSBjoern A. Zeeb {
23238e93258fSBjoern A. Zeeb 	le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(7));
23248e93258fSBjoern A. Zeeb }
23258e93258fSBjoern A. Zeeb 
23268e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ROLE_P2P_DEV(void *cmd, u16 val)
23278e93258fSBjoern A. Zeeb {
23288e93258fSBjoern A. Zeeb 	le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(8));
23298e93258fSBjoern A. Zeeb }
23308e93258fSBjoern A. Zeeb 
23318e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ROLE_P2P_GC(void *cmd, u16 val)
23328e93258fSBjoern A. Zeeb {
23338e93258fSBjoern A. Zeeb 	le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(9));
23348e93258fSBjoern A. Zeeb }
23358e93258fSBjoern A. Zeeb 
23368e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ROLE_P2P_GO(void *cmd, u16 val)
23378e93258fSBjoern A. Zeeb {
23388e93258fSBjoern A. Zeeb 	le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(10));
23398e93258fSBjoern A. Zeeb }
23408e93258fSBjoern A. Zeeb 
23418e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ROLE_NAN(void *cmd, u16 val)
23428e93258fSBjoern A. Zeeb {
23438e93258fSBjoern A. Zeeb 	le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(11));
23448e93258fSBjoern A. Zeeb }
23458e93258fSBjoern A. Zeeb 
23468e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ACT_CONNECTED(void *cmd, u8 val, int n, u8 offset)
23478e93258fSBjoern A. Zeeb {
23488e93258fSBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, BIT(0));
23498e93258fSBjoern A. Zeeb }
23508e93258fSBjoern A. Zeeb 
23518e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ACT_PID(void *cmd, u8 val, int n, u8 offset)
23528e93258fSBjoern A. Zeeb {
23538e93258fSBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, GENMASK(3, 1));
23548e93258fSBjoern A. Zeeb }
23558e93258fSBjoern A. Zeeb 
23568e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ACT_PHY(void *cmd, u8 val, int n, u8 offset)
23578e93258fSBjoern A. Zeeb {
23588e93258fSBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, BIT(4));
23598e93258fSBjoern A. Zeeb }
23608e93258fSBjoern A. Zeeb 
23618e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ACT_NOA(void *cmd, u8 val, int n, u8 offset)
23628e93258fSBjoern A. Zeeb {
23638e93258fSBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, BIT(5));
23648e93258fSBjoern A. Zeeb }
23658e93258fSBjoern A. Zeeb 
23668e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ACT_BAND(void *cmd, u8 val, int n, u8 offset)
23678e93258fSBjoern A. Zeeb {
23688e93258fSBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, GENMASK(7, 6));
23698e93258fSBjoern A. Zeeb }
23708e93258fSBjoern A. Zeeb 
23718e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ACT_CLIENT_PS(void *cmd, u8 val, int n, u8 offset)
23728e93258fSBjoern A. Zeeb {
23738e93258fSBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + (7 + (12 + offset) * n), val, BIT(0));
23748e93258fSBjoern A. Zeeb }
23758e93258fSBjoern A. Zeeb 
23768e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ACT_BW(void *cmd, u8 val, int n, u8 offset)
23778e93258fSBjoern A. Zeeb {
23788e93258fSBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + (7 + (12 + offset) * n), val, GENMASK(7, 1));
23798e93258fSBjoern A. Zeeb }
23808e93258fSBjoern A. Zeeb 
23818e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ACT_ROLE(void *cmd, u8 val, int n, u8 offset)
23828e93258fSBjoern A. Zeeb {
23838e93258fSBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + (8 + (12 + offset) * n), val, GENMASK(7, 0));
23848e93258fSBjoern A. Zeeb }
23858e93258fSBjoern A. Zeeb 
23868e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ACT_CH(void *cmd, u8 val, int n, u8 offset)
23878e93258fSBjoern A. Zeeb {
23888e93258fSBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + (9 + (12 + offset) * n), val, GENMASK(7, 0));
23898e93258fSBjoern A. Zeeb }
23908e93258fSBjoern A. Zeeb 
23918e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ACT_TX_LVL(void *cmd, u16 val, int n, u8 offset)
23928e93258fSBjoern A. Zeeb {
23938e93258fSBjoern A. Zeeb 	le16p_replace_bits((__le16 *)((u8 *)cmd + (10 + (12 + offset) * n)), val, GENMASK(15, 0));
23948e93258fSBjoern A. Zeeb }
23958e93258fSBjoern A. Zeeb 
23968e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ACT_RX_LVL(void *cmd, u16 val, int n, u8 offset)
23978e93258fSBjoern A. Zeeb {
23988e93258fSBjoern A. Zeeb 	le16p_replace_bits((__le16 *)((u8 *)cmd + (12 + (12 + offset) * n)), val, GENMASK(15, 0));
23998e93258fSBjoern A. Zeeb }
24008e93258fSBjoern A. Zeeb 
24018e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ACT_TX_RATE(void *cmd, u16 val, int n, u8 offset)
24028e93258fSBjoern A. Zeeb {
24038e93258fSBjoern A. Zeeb 	le16p_replace_bits((__le16 *)((u8 *)cmd + (14 + (12 + offset) * n)), val, GENMASK(15, 0));
24048e93258fSBjoern A. Zeeb }
24058e93258fSBjoern A. Zeeb 
24068e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ACT_RX_RATE(void *cmd, u16 val, int n, u8 offset)
24078e93258fSBjoern A. Zeeb {
24088e93258fSBjoern A. Zeeb 	le16p_replace_bits((__le16 *)((u8 *)cmd + (16 + (12 + offset) * n)), val, GENMASK(15, 0));
24098e93258fSBjoern A. Zeeb }
24108e93258fSBjoern A. Zeeb 
24118e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ACT_NOA_DUR(void *cmd, u32 val, int n, u8 offset)
24128e93258fSBjoern A. Zeeb {
24138e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)((u8 *)cmd + (20 + (12 + offset) * n)), val, GENMASK(31, 0));
24148e93258fSBjoern A. Zeeb }
24158e93258fSBjoern A. Zeeb 
2416e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ACT_CONNECTED_V2(void *cmd, u8 val, int n, u8 offset)
2417e2340276SBjoern A. Zeeb {
2418e2340276SBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, BIT(0));
2419e2340276SBjoern A. Zeeb }
2420e2340276SBjoern A. Zeeb 
2421e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ACT_PID_V2(void *cmd, u8 val, int n, u8 offset)
2422e2340276SBjoern A. Zeeb {
2423e2340276SBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, GENMASK(3, 1));
2424e2340276SBjoern A. Zeeb }
2425e2340276SBjoern A. Zeeb 
2426e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ACT_PHY_V2(void *cmd, u8 val, int n, u8 offset)
2427e2340276SBjoern A. Zeeb {
2428e2340276SBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, BIT(4));
2429e2340276SBjoern A. Zeeb }
2430e2340276SBjoern A. Zeeb 
2431e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ACT_NOA_V2(void *cmd, u8 val, int n, u8 offset)
2432e2340276SBjoern A. Zeeb {
2433e2340276SBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, BIT(5));
2434e2340276SBjoern A. Zeeb }
2435e2340276SBjoern A. Zeeb 
2436e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ACT_BAND_V2(void *cmd, u8 val, int n, u8 offset)
2437e2340276SBjoern A. Zeeb {
2438e2340276SBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, GENMASK(7, 6));
2439e2340276SBjoern A. Zeeb }
2440e2340276SBjoern A. Zeeb 
2441e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ACT_CLIENT_PS_V2(void *cmd, u8 val, int n, u8 offset)
2442e2340276SBjoern A. Zeeb {
2443e2340276SBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + (7 + (12 + offset) * n), val, BIT(0));
2444e2340276SBjoern A. Zeeb }
2445e2340276SBjoern A. Zeeb 
2446e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ACT_BW_V2(void *cmd, u8 val, int n, u8 offset)
2447e2340276SBjoern A. Zeeb {
2448e2340276SBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + (7 + (12 + offset) * n), val, GENMASK(7, 1));
2449e2340276SBjoern A. Zeeb }
2450e2340276SBjoern A. Zeeb 
2451e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ACT_ROLE_V2(void *cmd, u8 val, int n, u8 offset)
2452e2340276SBjoern A. Zeeb {
2453e2340276SBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + (8 + (12 + offset) * n), val, GENMASK(7, 0));
2454e2340276SBjoern A. Zeeb }
2455e2340276SBjoern A. Zeeb 
2456e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ACT_CH_V2(void *cmd, u8 val, int n, u8 offset)
2457e2340276SBjoern A. Zeeb {
2458e2340276SBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + (9 + (12 + offset) * n), val, GENMASK(7, 0));
2459e2340276SBjoern A. Zeeb }
2460e2340276SBjoern A. Zeeb 
2461e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_ACT_NOA_DUR_V2(void *cmd, u32 val, int n, u8 offset)
2462e2340276SBjoern A. Zeeb {
2463e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)((u8 *)cmd + (10 + (12 + offset) * n)), val, GENMASK(31, 0));
2464e2340276SBjoern A. Zeeb }
2465e2340276SBjoern A. Zeeb 
24668e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_MROLE_TYPE(void *cmd, u32 val, u8 offset)
24678e93258fSBjoern A. Zeeb {
24688e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)((u8 *)cmd + offset), val, GENMASK(31, 0));
24698e93258fSBjoern A. Zeeb }
24708e93258fSBjoern A. Zeeb 
24718e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_MROLE_NOA(void *cmd, u32 val, u8 offset)
24728e93258fSBjoern A. Zeeb {
24738e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)((u8 *)cmd + offset + 4), val, GENMASK(31, 0));
24748e93258fSBjoern A. Zeeb }
24758e93258fSBjoern A. Zeeb 
24768e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_DBCC_EN(void *cmd, u32 val, u8 offset)
24778e93258fSBjoern A. Zeeb {
24788e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)((u8 *)cmd + offset + 8), val, BIT(0));
24798e93258fSBjoern A. Zeeb }
24808e93258fSBjoern A. Zeeb 
24818e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_DBCC_CHG(void *cmd, u32 val, u8 offset)
24828e93258fSBjoern A. Zeeb {
24838e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)((u8 *)cmd + offset + 8), val, BIT(1));
24848e93258fSBjoern A. Zeeb }
24858e93258fSBjoern A. Zeeb 
24868e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_DBCC_2G_PHY(void *cmd, u32 val, u8 offset)
24878e93258fSBjoern A. Zeeb {
24888e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)((u8 *)cmd + offset + 8), val, GENMASK(3, 2));
24898e93258fSBjoern A. Zeeb }
24908e93258fSBjoern A. Zeeb 
24918e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXROLE_LINK_MODE_CHG(void *cmd, u32 val, u8 offset)
24928e93258fSBjoern A. Zeeb {
24938e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)((u8 *)cmd + offset + 8), val, BIT(4));
24948e93258fSBjoern A. Zeeb }
24958e93258fSBjoern A. Zeeb 
24968e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXCTRL_MANUAL(void *cmd, u32 val)
24978e93258fSBjoern A. Zeeb {
24988e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, BIT(0));
24998e93258fSBjoern A. Zeeb }
25008e93258fSBjoern A. Zeeb 
25018e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXCTRL_IGNORE_BT(void *cmd, u32 val)
25028e93258fSBjoern A. Zeeb {
25038e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, BIT(1));
25048e93258fSBjoern A. Zeeb }
25058e93258fSBjoern A. Zeeb 
25068e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXCTRL_ALWAYS_FREERUN(void *cmd, u32 val)
25078e93258fSBjoern A. Zeeb {
25088e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, BIT(2));
25098e93258fSBjoern A. Zeeb }
25108e93258fSBjoern A. Zeeb 
25118e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXCTRL_TRACE_STEP(void *cmd, u32 val)
25128e93258fSBjoern A. Zeeb {
25138e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, GENMASK(18, 3));
25148e93258fSBjoern A. Zeeb }
25158e93258fSBjoern A. Zeeb 
2516e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXTRX_TXLV(void *cmd, u8 val)
2517e2340276SBjoern A. Zeeb {
2518e2340276SBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + 2, val, GENMASK(7, 0));
2519e2340276SBjoern A. Zeeb }
2520e2340276SBjoern A. Zeeb 
2521e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXTRX_RXLV(void *cmd, u8 val)
2522e2340276SBjoern A. Zeeb {
2523e2340276SBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + 3, val, GENMASK(7, 0));
2524e2340276SBjoern A. Zeeb }
2525e2340276SBjoern A. Zeeb 
2526e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXTRX_WLRSSI(void *cmd, u8 val)
2527e2340276SBjoern A. Zeeb {
2528e2340276SBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + 4, val, GENMASK(7, 0));
2529e2340276SBjoern A. Zeeb }
2530e2340276SBjoern A. Zeeb 
2531e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXTRX_BTRSSI(void *cmd, u8 val)
2532e2340276SBjoern A. Zeeb {
2533e2340276SBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + 5, val, GENMASK(7, 0));
2534e2340276SBjoern A. Zeeb }
2535e2340276SBjoern A. Zeeb 
2536e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXTRX_TXPWR(void *cmd, s8 val)
2537e2340276SBjoern A. Zeeb {
2538e2340276SBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + 6, val, GENMASK(7, 0));
2539e2340276SBjoern A. Zeeb }
2540e2340276SBjoern A. Zeeb 
2541e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXTRX_RXGAIN(void *cmd, s8 val)
2542e2340276SBjoern A. Zeeb {
2543e2340276SBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + 7, val, GENMASK(7, 0));
2544e2340276SBjoern A. Zeeb }
2545e2340276SBjoern A. Zeeb 
2546e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXTRX_BTTXPWR(void *cmd, s8 val)
2547e2340276SBjoern A. Zeeb {
2548e2340276SBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + 8, val, GENMASK(7, 0));
2549e2340276SBjoern A. Zeeb }
2550e2340276SBjoern A. Zeeb 
2551e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXTRX_BTRXGAIN(void *cmd, s8 val)
2552e2340276SBjoern A. Zeeb {
2553e2340276SBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + 9, val, GENMASK(7, 0));
2554e2340276SBjoern A. Zeeb }
2555e2340276SBjoern A. Zeeb 
2556e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXTRX_CN(void *cmd, u8 val)
2557e2340276SBjoern A. Zeeb {
2558e2340276SBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + 10, val, GENMASK(7, 0));
2559e2340276SBjoern A. Zeeb }
2560e2340276SBjoern A. Zeeb 
2561e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXTRX_NHM(void *cmd, s8 val)
2562e2340276SBjoern A. Zeeb {
2563e2340276SBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + 11, val, GENMASK(7, 0));
2564e2340276SBjoern A. Zeeb }
2565e2340276SBjoern A. Zeeb 
2566e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXTRX_BTPROFILE(void *cmd, u8 val)
2567e2340276SBjoern A. Zeeb {
2568e2340276SBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + 12, val, GENMASK(7, 0));
2569e2340276SBjoern A. Zeeb }
2570e2340276SBjoern A. Zeeb 
2571e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXTRX_RSVD2(void *cmd, u8 val)
2572e2340276SBjoern A. Zeeb {
2573e2340276SBjoern A. Zeeb 	u8p_replace_bits((u8 *)cmd + 13, val, GENMASK(7, 0));
2574e2340276SBjoern A. Zeeb }
2575e2340276SBjoern A. Zeeb 
2576e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXTRX_TXRATE(void *cmd, u16 val)
2577e2340276SBjoern A. Zeeb {
2578e2340276SBjoern A. Zeeb 	le16p_replace_bits((__le16 *)((u8 *)cmd + 14), val, GENMASK(15, 0));
2579e2340276SBjoern A. Zeeb }
2580e2340276SBjoern A. Zeeb 
2581e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXTRX_RXRATE(void *cmd, u16 val)
2582e2340276SBjoern A. Zeeb {
2583e2340276SBjoern A. Zeeb 	le16p_replace_bits((__le16 *)((u8 *)cmd + 16), val, GENMASK(15, 0));
2584e2340276SBjoern A. Zeeb }
2585e2340276SBjoern A. Zeeb 
2586e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXTRX_TXTP(void *cmd, u32 val)
2587e2340276SBjoern A. Zeeb {
2588e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)((u8 *)cmd + 18), val, GENMASK(31, 0));
2589e2340276SBjoern A. Zeeb }
2590e2340276SBjoern A. Zeeb 
2591e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXTRX_RXTP(void *cmd, u32 val)
2592e2340276SBjoern A. Zeeb {
2593e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)((u8 *)cmd + 22), val, GENMASK(31, 0));
2594e2340276SBjoern A. Zeeb }
2595e2340276SBjoern A. Zeeb 
2596e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXTRX_RXERRRA(void *cmd, u32 val)
2597e2340276SBjoern A. Zeeb {
2598e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)((u8 *)cmd + 26), val, GENMASK(31, 0));
2599e2340276SBjoern A. Zeeb }
2600e2340276SBjoern A. Zeeb 
26018e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXRFK_STATE(void *cmd, u32 val)
26028e93258fSBjoern A. Zeeb {
26038e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, GENMASK(1, 0));
26048e93258fSBjoern A. Zeeb }
26058e93258fSBjoern A. Zeeb 
26068e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXRFK_PATH_MAP(void *cmd, u32 val)
26078e93258fSBjoern A. Zeeb {
26088e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, GENMASK(5, 2));
26098e93258fSBjoern A. Zeeb }
26108e93258fSBjoern A. Zeeb 
26118e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXRFK_PHY_MAP(void *cmd, u32 val)
26128e93258fSBjoern A. Zeeb {
26138e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, GENMASK(7, 6));
26148e93258fSBjoern A. Zeeb }
26158e93258fSBjoern A. Zeeb 
26168e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXRFK_BAND(void *cmd, u32 val)
26178e93258fSBjoern A. Zeeb {
26188e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, GENMASK(9, 8));
26198e93258fSBjoern A. Zeeb }
26208e93258fSBjoern A. Zeeb 
26218e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_CXRFK_TYPE(void *cmd, u32 val)
26228e93258fSBjoern A. Zeeb {
26238e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, GENMASK(17, 10));
26248e93258fSBjoern A. Zeeb }
26258e93258fSBjoern A. Zeeb 
26268e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_PACKET_OFLD_PKT_IDX(void *cmd, u32 val)
26278e93258fSBjoern A. Zeeb {
26288e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)((u8 *)(cmd)), val, GENMASK(7, 0));
26298e93258fSBjoern A. Zeeb }
26308e93258fSBjoern A. Zeeb 
26318e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_PACKET_OFLD_PKT_OP(void *cmd, u32 val)
26328e93258fSBjoern A. Zeeb {
26338e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)((u8 *)(cmd)), val, GENMASK(10, 8));
26348e93258fSBjoern A. Zeeb }
26358e93258fSBjoern A. Zeeb 
26368e93258fSBjoern A. Zeeb static inline void RTW89_SET_FWCMD_PACKET_OFLD_PKT_LENGTH(void *cmd, u32 val)
26378e93258fSBjoern A. Zeeb {
26388e93258fSBjoern A. Zeeb 	le32p_replace_bits((__le32 *)((u8 *)(cmd)), val, GENMASK(31, 16));
26398e93258fSBjoern A. Zeeb }
26408e93258fSBjoern A. Zeeb 
26416d67aabdSBjoern A. Zeeb struct rtw89_h2c_chinfo_elem {
26426d67aabdSBjoern A. Zeeb 	__le32 w0;
26436d67aabdSBjoern A. Zeeb 	__le32 w1;
26446d67aabdSBjoern A. Zeeb 	__le32 w2;
26456d67aabdSBjoern A. Zeeb 	__le32 w3;
26466d67aabdSBjoern A. Zeeb 	__le32 w4;
26476d67aabdSBjoern A. Zeeb 	__le32 w5;
26486d67aabdSBjoern A. Zeeb 	__le32 w6;
26496d67aabdSBjoern A. Zeeb } __packed;
26508e93258fSBjoern A. Zeeb 
26516d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_W0_PERIOD GENMASK(7, 0)
26526d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_W0_DWELL GENMASK(15, 8)
26536d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_W0_CENTER_CH GENMASK(23, 16)
26546d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_W0_PRI_CH GENMASK(31, 24)
26556d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_W1_BW GENMASK(2, 0)
26566d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_W1_ACTION GENMASK(7, 3)
26576d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_W1_NUM_PKT GENMASK(11, 8)
26586d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_W1_TX BIT(12)
26596d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_W1_PAUSE_DATA BIT(13)
26606d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_W1_BAND GENMASK(15, 14)
26616d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_W1_PKT_ID GENMASK(23, 16)
26626d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_W1_DFS BIT(24)
26636d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_W1_TX_NULL BIT(25)
26646d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_W1_RANDOM BIT(26)
26656d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_W1_CFG_TX BIT(27)
26666d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_W2_PKT0 GENMASK(7, 0)
26676d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_W2_PKT1 GENMASK(15, 8)
26686d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_W2_PKT2 GENMASK(23, 16)
26696d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_W2_PKT3 GENMASK(31, 24)
26706d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_W3_PKT4 GENMASK(7, 0)
26716d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_W3_PKT5 GENMASK(15, 8)
26726d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_W3_PKT6 GENMASK(23, 16)
26736d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_W3_PKT7 GENMASK(31, 24)
26746d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_W4_POWER_IDX GENMASK(15, 0)
26758e93258fSBjoern A. Zeeb 
26766d67aabdSBjoern A. Zeeb struct rtw89_h2c_chinfo_elem_be {
26776d67aabdSBjoern A. Zeeb 	__le32 w0;
26786d67aabdSBjoern A. Zeeb 	__le32 w1;
26796d67aabdSBjoern A. Zeeb 	__le32 w2;
26806d67aabdSBjoern A. Zeeb 	__le32 w3;
26816d67aabdSBjoern A. Zeeb 	__le32 w4;
26826d67aabdSBjoern A. Zeeb 	__le32 w5;
26836d67aabdSBjoern A. Zeeb 	__le32 w6;
2684*df279a26SBjoern A. Zeeb 	__le32 w7;
26856d67aabdSBjoern A. Zeeb } __packed;
26868e93258fSBjoern A. Zeeb 
26876d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W0_PERIOD GENMASK(7, 0)
26886d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W0_DWELL GENMASK(15, 8)
26896d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W0_CENTER_CH GENMASK(23, 16)
26906d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W0_PRI_CH GENMASK(31, 24)
26916d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W1_BW GENMASK(2, 0)
26926d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W1_CH_BAND GENMASK(4, 3)
26936d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W1_DFS BIT(5)
26946d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W1_PAUSE_DATA BIT(6)
26956d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W1_TX_NULL BIT(7)
26966d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W1_RANDOM BIT(8)
26976d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W1_NOTIFY GENMASK(13, 9)
26986d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W1_PROBE BIT(14)
26996d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W1_EARLY_LEAVE_CRIT GENMASK(17, 15)
27006d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W1_CHKPT_TIMER GENMASK(31, 24)
27016d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W2_EARLY_LEAVE_TIME GENMASK(7, 0)
27026d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W2_EARLY_LEAVE_TH GENMASK(15, 8)
27036d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W2_TX_PKT_CTRL GENMASK(31, 16)
27046d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W3_PKT0 GENMASK(7, 0)
27056d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W3_PKT1 GENMASK(15, 8)
27066d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W3_PKT2 GENMASK(23, 16)
27076d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W3_PKT3 GENMASK(31, 24)
27086d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W4_PKT4 GENMASK(7, 0)
27096d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W4_PKT5 GENMASK(15, 8)
27106d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W4_PKT6 GENMASK(23, 16)
27116d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W4_PKT7 GENMASK(31, 24)
27126d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W5_SW_DEF GENMASK(7, 0)
27136d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W5_FW_PROBE0_SSIDS GENMASK(31, 16)
27146d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W6_FW_PROBE0_SHORTSSIDS GENMASK(15, 0)
27156d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W6_FW_PROBE0_BSSIDS GENMASK(31, 16)
2716*df279a26SBjoern A. Zeeb #define RTW89_H2C_CHINFO_BE_W7_PERIOD_V1 GENMASK(15, 0)
27178e93258fSBjoern A. Zeeb 
27186d67aabdSBjoern A. Zeeb struct rtw89_h2c_chinfo {
27196d67aabdSBjoern A. Zeeb 	u8 ch_num;
27206d67aabdSBjoern A. Zeeb 	u8 elem_size;
27216d67aabdSBjoern A. Zeeb 	u8 arg;
27226d67aabdSBjoern A. Zeeb 	u8 rsvd0;
27236d67aabdSBjoern A. Zeeb 	struct rtw89_h2c_chinfo_elem elem[] __counted_by(ch_num);
27246d67aabdSBjoern A. Zeeb } __packed;
27258e93258fSBjoern A. Zeeb 
2726*df279a26SBjoern A. Zeeb struct rtw89_h2c_chinfo_be {
2727*df279a26SBjoern A. Zeeb 	u8 ch_num;
2728*df279a26SBjoern A. Zeeb 	u8 elem_size;
2729*df279a26SBjoern A. Zeeb 	u8 arg;
2730*df279a26SBjoern A. Zeeb 	u8 rsvd0;
2731*df279a26SBjoern A. Zeeb 	struct rtw89_h2c_chinfo_elem_be elem[] __counted_by(ch_num);
2732*df279a26SBjoern A. Zeeb } __packed;
2733*df279a26SBjoern A. Zeeb 
27346d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_ARG_MAC_IDX_MASK BIT(0)
27356d67aabdSBjoern A. Zeeb #define RTW89_H2C_CHINFO_ARG_APPEND_MASK BIT(1)
27368e93258fSBjoern A. Zeeb 
2737e2340276SBjoern A. Zeeb struct rtw89_h2c_scanofld {
2738e2340276SBjoern A. Zeeb 	__le32 w0;
2739e2340276SBjoern A. Zeeb 	__le32 w1;
2740e2340276SBjoern A. Zeeb 	__le32 w2;
2741e2340276SBjoern A. Zeeb 	__le32 tsf_high;
2742e2340276SBjoern A. Zeeb 	__le32 tsf_low;
2743e2340276SBjoern A. Zeeb 	__le32 w5;
2744e2340276SBjoern A. Zeeb 	__le32 w6;
2745e2340276SBjoern A. Zeeb } __packed;
2746e2340276SBjoern A. Zeeb 
2747e2340276SBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_W0_MACID GENMASK(7, 0)
2748e2340276SBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_W0_NORM_CY GENMASK(15, 8)
2749e2340276SBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_W0_PORT_ID GENMASK(18, 16)
2750e2340276SBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_W0_BAND BIT(19)
2751e2340276SBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_W0_OPERATION GENMASK(21, 20)
2752e2340276SBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_W0_TARGET_CH_BAND GENMASK(23, 22)
2753e2340276SBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_W1_NOTIFY_END BIT(0)
2754e2340276SBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_W1_TARGET_CH_MODE BIT(1)
2755e2340276SBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_W1_START_MODE BIT(2)
2756e2340276SBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_W1_SCAN_TYPE GENMASK(4, 3)
2757e2340276SBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_W1_TARGET_CH_BW GENMASK(7, 5)
2758e2340276SBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_W1_TARGET_PRI_CH GENMASK(15, 8)
2759e2340276SBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_W1_TARGET_CENTRAL_CH GENMASK(23, 16)
2760e2340276SBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_W1_PROBE_REQ_PKT_ID GENMASK(31, 24)
2761e2340276SBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_W2_NORM_PD GENMASK(15, 0)
2762e2340276SBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_W2_SLOW_PD GENMASK(23, 16)
2763*df279a26SBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_W3_TSF_HIGH GENMASK(31, 0)
2764*df279a26SBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_W4_TSF_LOW GENMASK(31, 0)
2765e2340276SBjoern A. Zeeb 
27666d67aabdSBjoern A. Zeeb struct rtw89_h2c_scanofld_be_macc_role {
27676d67aabdSBjoern A. Zeeb 	__le32 w0;
27686d67aabdSBjoern A. Zeeb } __packed;
27696d67aabdSBjoern A. Zeeb 
27706d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_MACC_ROLE_W0_BAND GENMASK(1, 0)
27716d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_MACC_ROLE_W0_PORT GENMASK(4, 2)
27726d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_MACC_ROLE_W0_MACID GENMASK(23, 8)
27736d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_MACC_ROLE_W0_OPCH_END GENMASK(31, 24)
27746d67aabdSBjoern A. Zeeb 
27756d67aabdSBjoern A. Zeeb struct rtw89_h2c_scanofld_be_opch {
27766d67aabdSBjoern A. Zeeb 	__le32 w0;
27776d67aabdSBjoern A. Zeeb 	__le32 w1;
27786d67aabdSBjoern A. Zeeb 	__le32 w2;
27796d67aabdSBjoern A. Zeeb 	__le32 w3;
2780*df279a26SBjoern A. Zeeb 	__le32 w4;
27816d67aabdSBjoern A. Zeeb } __packed;
27826d67aabdSBjoern A. Zeeb 
27836d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_OPCH_W0_MACID GENMASK(15, 0)
27846d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_OPCH_W0_BAND GENMASK(17, 16)
27856d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_OPCH_W0_PORT GENMASK(20, 18)
27866d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_OPCH_W0_POLICY GENMASK(22, 21)
27876d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_OPCH_W0_TXNULL BIT(23)
27886d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_OPCH_W0_POLICY_VAL GENMASK(31, 24)
27896d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_OPCH_W1_DURATION GENMASK(7, 0)
27906d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_OPCH_W1_CH_BAND GENMASK(9, 8)
27916d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_OPCH_W1_BW GENMASK(12, 10)
27926d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_OPCH_W1_NOTIFY GENMASK(14, 13)
27936d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_OPCH_W1_PRI_CH GENMASK(23, 16)
27946d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_OPCH_W1_CENTRAL_CH GENMASK(31, 24)
27956d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_OPCH_W2_PKTS_CTRL GENMASK(7, 0)
27966d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_OPCH_W2_SW_DEF GENMASK(15, 8)
27976d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_OPCH_W2_SS GENMASK(18, 16)
27986d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_OPCH_W3_PKT0 GENMASK(7, 0)
27996d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_OPCH_W3_PKT1 GENMASK(15, 8)
28006d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_OPCH_W3_PKT2 GENMASK(23, 16)
28016d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_OPCH_W3_PKT3 GENMASK(31, 24)
2802*df279a26SBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_OPCH_W4_DURATION_V1 GENMASK(15, 0)
28036d67aabdSBjoern A. Zeeb 
28046d67aabdSBjoern A. Zeeb struct rtw89_h2c_scanofld_be {
28056d67aabdSBjoern A. Zeeb 	__le32 w0;
28066d67aabdSBjoern A. Zeeb 	__le32 w1;
28076d67aabdSBjoern A. Zeeb 	__le32 w2;
28086d67aabdSBjoern A. Zeeb 	__le32 w3;
28096d67aabdSBjoern A. Zeeb 	__le32 w4;
28106d67aabdSBjoern A. Zeeb 	__le32 w5;
28116d67aabdSBjoern A. Zeeb 	__le32 w6;
28126d67aabdSBjoern A. Zeeb 	__le32 w7;
28136d67aabdSBjoern A. Zeeb 	__le32 w8;
2814*df279a26SBjoern A. Zeeb 	__le32 w9; /* Added after SCAN_OFFLOAD_BE_V1 */
2815*df279a26SBjoern A. Zeeb 	/* struct rtw89_h2c_scanofld_be_macc_role (flexible number) */
2816*df279a26SBjoern A. Zeeb 	/* struct rtw89_h2c_scanofld_be_opch (flexible number) */
28176d67aabdSBjoern A. Zeeb } __packed;
28186d67aabdSBjoern A. Zeeb 
28196d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W0_OP GENMASK(1, 0)
28206d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W0_SCAN_MODE GENMASK(3, 2)
28216d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W0_REPEAT GENMASK(5, 4)
28226d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W0_NOTIFY_END BIT(6)
28236d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W0_LEARN_CH BIT(7)
28246d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W0_MACID GENMASK(23, 8)
28256d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W0_PORT GENMASK(26, 24)
28266d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W0_BAND GENMASK(28, 27)
28276d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W0_PROBE_WITH_RATE BIT(29)
28286d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W1_NUM_MACC_ROLE GENMASK(7, 0)
28296d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W1_NUM_OP GENMASK(15, 8)
28306d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W1_NORM_PD GENMASK(31, 16)
28316d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W2_SLOW_PD GENMASK(15, 0)
28326d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W2_NORM_CY GENMASK(23, 16)
28336d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W2_OPCH_END GENMASK(31, 24)
28346d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W3_NUM_SSID GENMASK(7, 0)
28356d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W3_NUM_SHORT_SSID GENMASK(15, 8)
28366d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W3_NUM_BSSID GENMASK(23, 16)
28376d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W3_PROBEID GENMASK(31, 24)
28386d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W4_PROBE_5G GENMASK(7, 0)
28396d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W4_PROBE_6G GENMASK(15, 8)
28406d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W4_DELAY_START GENMASK(31, 16)
28416d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W5_MLO_MODE GENMASK(31, 0)
28426d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W6_CHAN_PROHIB_LOW GENMASK(31, 0)
28436d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W7_CHAN_PROHIB_HIGH GENMASK(31, 0)
28446d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W8_PROBE_RATE_2GHZ GENMASK(7, 0)
28456d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W8_PROBE_RATE_5GHZ GENMASK(15, 8)
28466d67aabdSBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W8_PROBE_RATE_6GHZ GENMASK(23, 16)
2847*df279a26SBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W9_SIZE_CFG GENMASK(7, 0)
2848*df279a26SBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W9_SIZE_MACC GENMASK(15, 8)
2849*df279a26SBjoern A. Zeeb #define RTW89_H2C_SCANOFLD_BE_W9_SIZE_OP GENMASK(23, 16)
2850*df279a26SBjoern A. Zeeb 
2851*df279a26SBjoern A. Zeeb struct rtw89_h2c_fwips {
2852*df279a26SBjoern A. Zeeb 	__le32 w0;
2853*df279a26SBjoern A. Zeeb } __packed;
2854*df279a26SBjoern A. Zeeb 
2855*df279a26SBjoern A. Zeeb #define RTW89_H2C_FW_IPS_W0_MACID GENMASK(7, 0)
2856*df279a26SBjoern A. Zeeb #define RTW89_H2C_FW_IPS_W0_ENABLE BIT(8)
28576d67aabdSBjoern A. Zeeb 
2858e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_P2P_MACID(void *cmd, u32 val)
28598e93258fSBjoern A. Zeeb {
2860e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(7, 0));
28618e93258fSBjoern A. Zeeb }
28628e93258fSBjoern A. Zeeb 
2863e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_P2P_P2PID(void *cmd, u32 val)
28648e93258fSBjoern A. Zeeb {
2865e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(11, 8));
28668e93258fSBjoern A. Zeeb }
28678e93258fSBjoern A. Zeeb 
2868e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_P2P_NOAID(void *cmd, u32 val)
28698e93258fSBjoern A. Zeeb {
2870e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 12));
28718e93258fSBjoern A. Zeeb }
28728e93258fSBjoern A. Zeeb 
2873e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_P2P_ACT(void *cmd, u32 val)
28748e93258fSBjoern A. Zeeb {
2875e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(19, 16));
28768e93258fSBjoern A. Zeeb }
28778e93258fSBjoern A. Zeeb 
2878e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_P2P_TYPE(void *cmd, u32 val)
28798e93258fSBjoern A. Zeeb {
2880e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, BIT(20));
28818e93258fSBjoern A. Zeeb }
28828e93258fSBjoern A. Zeeb 
2883e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_P2P_ALL_SLEP(void *cmd, u32 val)
28848e93258fSBjoern A. Zeeb {
2885e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, BIT(21));
28868e93258fSBjoern A. Zeeb }
28878e93258fSBjoern A. Zeeb 
2888e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_NOA_START_TIME(void *cmd, __le32 val)
28898e93258fSBjoern A. Zeeb {
2890e2340276SBjoern A. Zeeb 	*((__le32 *)cmd + 1) = val;
28918e93258fSBjoern A. Zeeb }
28928e93258fSBjoern A. Zeeb 
2893e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_NOA_INTERVAL(void *cmd, __le32 val)
28948e93258fSBjoern A. Zeeb {
2895e2340276SBjoern A. Zeeb 	*((__le32 *)cmd + 2) = val;
28968e93258fSBjoern A. Zeeb }
28978e93258fSBjoern A. Zeeb 
2898e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_NOA_DURATION(void *cmd, __le32 val)
28998e93258fSBjoern A. Zeeb {
2900e2340276SBjoern A. Zeeb 	*((__le32 *)cmd + 3) = val;
29018e93258fSBjoern A. Zeeb }
29028e93258fSBjoern A. Zeeb 
2903e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_NOA_COUNT(void *cmd, u32 val)
29048e93258fSBjoern A. Zeeb {
2905e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(cmd) + 4, val, GENMASK(7, 0));
29068e93258fSBjoern A. Zeeb }
29078e93258fSBjoern A. Zeeb 
2908e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_NOA_CTWINDOW(void *cmd, u32 val)
29098e93258fSBjoern A. Zeeb {
2910e2340276SBjoern A. Zeeb 	u8 ctwnd;
2911e2340276SBjoern A. Zeeb 
2912e2340276SBjoern A. Zeeb 	if (!(val & IEEE80211_P2P_OPPPS_ENABLE_BIT))
2913e2340276SBjoern A. Zeeb 		return;
2914e2340276SBjoern A. Zeeb 	ctwnd = FIELD_GET(IEEE80211_P2P_OPPPS_CTWINDOW_MASK, val);
2915e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)(cmd) + 4, ctwnd, GENMASK(23, 8));
29168e93258fSBjoern A. Zeeb }
29178e93258fSBjoern A. Zeeb 
2918e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_TSF32_TOGL_BAND(void *cmd, u32 val)
29198e93258fSBjoern A. Zeeb {
2920e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, BIT(0));
29218e93258fSBjoern A. Zeeb }
29228e93258fSBjoern A. Zeeb 
2923e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_TSF32_TOGL_EN(void *cmd, u32 val)
29248e93258fSBjoern A. Zeeb {
2925e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, BIT(1));
29268e93258fSBjoern A. Zeeb }
29278e93258fSBjoern A. Zeeb 
2928e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_TSF32_TOGL_PORT(void *cmd, u32 val)
29298e93258fSBjoern A. Zeeb {
2930e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(4, 2));
29318e93258fSBjoern A. Zeeb }
29328e93258fSBjoern A. Zeeb 
2933e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_TSF32_TOGL_EARLY(void *cmd, u32 val)
29348e93258fSBjoern A. Zeeb {
2935e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 16));
29368e93258fSBjoern A. Zeeb }
29378e93258fSBjoern A. Zeeb 
2938e2340276SBjoern A. Zeeb enum rtw89_fw_mcc_c2h_rpt_cfg {
2939e2340276SBjoern A. Zeeb 	RTW89_FW_MCC_C2H_RPT_OFF	= 0,
2940e2340276SBjoern A. Zeeb 	RTW89_FW_MCC_C2H_RPT_FAIL_ONLY	= 1,
2941e2340276SBjoern A. Zeeb 	RTW89_FW_MCC_C2H_RPT_ALL	= 2,
2942e2340276SBjoern A. Zeeb };
2943e2340276SBjoern A. Zeeb 
2944e2340276SBjoern A. Zeeb struct rtw89_fw_mcc_add_req {
2945e2340276SBjoern A. Zeeb 	u8 macid;
2946e2340276SBjoern A. Zeeb 	u8 central_ch_seg0;
2947e2340276SBjoern A. Zeeb 	u8 central_ch_seg1;
2948e2340276SBjoern A. Zeeb 	u8 primary_ch;
2949e2340276SBjoern A. Zeeb 	enum rtw89_bandwidth bandwidth: 4;
2950e2340276SBjoern A. Zeeb 	u32 group: 2;
2951e2340276SBjoern A. Zeeb 	u32 c2h_rpt: 2;
2952e2340276SBjoern A. Zeeb 	u32 dis_tx_null: 1;
2953e2340276SBjoern A. Zeeb 	u32 dis_sw_retry: 1;
2954e2340276SBjoern A. Zeeb 	u32 in_curr_ch: 1;
2955e2340276SBjoern A. Zeeb 	u32 sw_retry_count: 3;
2956e2340276SBjoern A. Zeeb 	u32 tx_null_early: 4;
2957e2340276SBjoern A. Zeeb 	u32 btc_in_2g: 1;
2958e2340276SBjoern A. Zeeb 	u32 pta_en: 1;
2959e2340276SBjoern A. Zeeb 	u32 rfk_by_pass: 1;
2960e2340276SBjoern A. Zeeb 	u32 ch_band_type: 2;
2961e2340276SBjoern A. Zeeb 	u32 rsvd0: 9;
2962e2340276SBjoern A. Zeeb 	u32 duration;
2963e2340276SBjoern A. Zeeb 	u8 courtesy_en;
2964e2340276SBjoern A. Zeeb 	u8 courtesy_num;
2965e2340276SBjoern A. Zeeb 	u8 courtesy_target;
2966e2340276SBjoern A. Zeeb 	u8 rsvd1;
2967e2340276SBjoern A. Zeeb };
2968e2340276SBjoern A. Zeeb 
2969e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_ADD_MCC_MACID(void *cmd, u32 val)
29708e93258fSBjoern A. Zeeb {
2971e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(7, 0));
29728e93258fSBjoern A. Zeeb }
29738e93258fSBjoern A. Zeeb 
2974e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_ADD_MCC_CENTRAL_CH_SEG0(void *cmd, u32 val)
29758e93258fSBjoern A. Zeeb {
2976e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 8));
29778e93258fSBjoern A. Zeeb }
29788e93258fSBjoern A. Zeeb 
2979e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_ADD_MCC_CENTRAL_CH_SEG1(void *cmd, u32 val)
29808e93258fSBjoern A. Zeeb {
2981e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(23, 16));
2982e2340276SBjoern A. Zeeb }
2983e2340276SBjoern A. Zeeb 
2984e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_ADD_MCC_PRIMARY_CH(void *cmd, u32 val)
2985e2340276SBjoern A. Zeeb {
2986e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 24));
2987e2340276SBjoern A. Zeeb }
2988e2340276SBjoern A. Zeeb 
2989e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_ADD_MCC_BANDWIDTH(void *cmd, u32 val)
2990e2340276SBjoern A. Zeeb {
2991e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(3, 0));
2992e2340276SBjoern A. Zeeb }
2993e2340276SBjoern A. Zeeb 
2994e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_ADD_MCC_GROUP(void *cmd, u32 val)
2995e2340276SBjoern A. Zeeb {
2996e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(5, 4));
2997e2340276SBjoern A. Zeeb }
2998e2340276SBjoern A. Zeeb 
2999e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_ADD_MCC_C2H_RPT(void *cmd, u32 val)
3000e2340276SBjoern A. Zeeb {
3001e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(7, 6));
3002e2340276SBjoern A. Zeeb }
3003e2340276SBjoern A. Zeeb 
3004e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_ADD_MCC_DIS_TX_NULL(void *cmd, u32 val)
3005e2340276SBjoern A. Zeeb {
3006e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 1, val, BIT(8));
3007e2340276SBjoern A. Zeeb }
3008e2340276SBjoern A. Zeeb 
3009e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_ADD_MCC_DIS_SW_RETRY(void *cmd, u32 val)
3010e2340276SBjoern A. Zeeb {
3011e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 1, val, BIT(9));
3012e2340276SBjoern A. Zeeb }
3013e2340276SBjoern A. Zeeb 
3014e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_ADD_MCC_IN_CURR_CH(void *cmd, u32 val)
3015e2340276SBjoern A. Zeeb {
3016e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 1, val, BIT(10));
3017e2340276SBjoern A. Zeeb }
3018e2340276SBjoern A. Zeeb 
3019e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_ADD_MCC_SW_RETRY_COUNT(void *cmd, u32 val)
3020e2340276SBjoern A. Zeeb {
3021e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(13, 11));
3022e2340276SBjoern A. Zeeb }
3023e2340276SBjoern A. Zeeb 
3024e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_ADD_MCC_TX_NULL_EARLY(void *cmd, u32 val)
3025e2340276SBjoern A. Zeeb {
3026e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(17, 14));
3027e2340276SBjoern A. Zeeb }
3028e2340276SBjoern A. Zeeb 
3029e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_ADD_MCC_BTC_IN_2G(void *cmd, u32 val)
3030e2340276SBjoern A. Zeeb {
3031e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 1, val, BIT(18));
3032e2340276SBjoern A. Zeeb }
3033e2340276SBjoern A. Zeeb 
3034e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_ADD_MCC_PTA_EN(void *cmd, u32 val)
3035e2340276SBjoern A. Zeeb {
3036e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 1, val, BIT(19));
3037e2340276SBjoern A. Zeeb }
3038e2340276SBjoern A. Zeeb 
3039e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_ADD_MCC_RFK_BY_PASS(void *cmd, u32 val)
3040e2340276SBjoern A. Zeeb {
3041e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 1, val, BIT(20));
3042e2340276SBjoern A. Zeeb }
3043e2340276SBjoern A. Zeeb 
3044e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_ADD_MCC_CH_BAND_TYPE(void *cmd, u32 val)
3045e2340276SBjoern A. Zeeb {
3046e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(22, 21));
3047e2340276SBjoern A. Zeeb }
3048e2340276SBjoern A. Zeeb 
3049e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_ADD_MCC_DURATION(void *cmd, u32 val)
3050e2340276SBjoern A. Zeeb {
3051e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 2, val, GENMASK(31, 0));
3052e2340276SBjoern A. Zeeb }
3053e2340276SBjoern A. Zeeb 
3054e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_ADD_MCC_COURTESY_EN(void *cmd, u32 val)
3055e2340276SBjoern A. Zeeb {
3056e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 3, val, BIT(0));
3057e2340276SBjoern A. Zeeb }
3058e2340276SBjoern A. Zeeb 
3059e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_ADD_MCC_COURTESY_NUM(void *cmd, u32 val)
3060e2340276SBjoern A. Zeeb {
3061e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 3, val, GENMASK(15, 8));
3062e2340276SBjoern A. Zeeb }
3063e2340276SBjoern A. Zeeb 
3064e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_ADD_MCC_COURTESY_TARGET(void *cmd, u32 val)
3065e2340276SBjoern A. Zeeb {
3066e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 3, val, GENMASK(23, 16));
3067e2340276SBjoern A. Zeeb }
3068e2340276SBjoern A. Zeeb 
30696d67aabdSBjoern A. Zeeb enum rtw89_fw_mcc_old_group_actions {
30706d67aabdSBjoern A. Zeeb 	RTW89_FW_MCC_OLD_GROUP_ACT_NONE = 0,
30716d67aabdSBjoern A. Zeeb 	RTW89_FW_MCC_OLD_GROUP_ACT_REPLACE = 1,
30726d67aabdSBjoern A. Zeeb };
30736d67aabdSBjoern A. Zeeb 
3074e2340276SBjoern A. Zeeb struct rtw89_fw_mcc_start_req {
3075e2340276SBjoern A. Zeeb 	u32 group: 2;
3076e2340276SBjoern A. Zeeb 	u32 btc_in_group: 1;
3077e2340276SBjoern A. Zeeb 	u32 old_group_action: 2;
3078e2340276SBjoern A. Zeeb 	u32 old_group: 2;
3079e2340276SBjoern A. Zeeb 	u32 rsvd0: 9;
3080e2340276SBjoern A. Zeeb 	u32 notify_cnt: 3;
3081e2340276SBjoern A. Zeeb 	u32 rsvd1: 2;
3082e2340276SBjoern A. Zeeb 	u32 notify_rxdbg_en: 1;
3083e2340276SBjoern A. Zeeb 	u32 rsvd2: 2;
3084e2340276SBjoern A. Zeeb 	u32 macid: 8;
3085e2340276SBjoern A. Zeeb 	u32 tsf_low;
3086e2340276SBjoern A. Zeeb 	u32 tsf_high;
3087e2340276SBjoern A. Zeeb };
3088e2340276SBjoern A. Zeeb 
3089e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_START_MCC_GROUP(void *cmd, u32 val)
3090e2340276SBjoern A. Zeeb {
3091e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0));
3092e2340276SBjoern A. Zeeb }
3093e2340276SBjoern A. Zeeb 
3094e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_START_MCC_BTC_IN_GROUP(void *cmd, u32 val)
3095e2340276SBjoern A. Zeeb {
3096e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, BIT(2));
3097e2340276SBjoern A. Zeeb }
3098e2340276SBjoern A. Zeeb 
3099e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_START_MCC_OLD_GROUP_ACTION(void *cmd, u32 val)
3100e2340276SBjoern A. Zeeb {
3101e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(4, 3));
3102e2340276SBjoern A. Zeeb }
3103e2340276SBjoern A. Zeeb 
3104e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_START_MCC_OLD_GROUP(void *cmd, u32 val)
3105e2340276SBjoern A. Zeeb {
3106e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(6, 5));
3107e2340276SBjoern A. Zeeb }
3108e2340276SBjoern A. Zeeb 
3109e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_START_MCC_NOTIFY_CNT(void *cmd, u32 val)
3110e2340276SBjoern A. Zeeb {
3111e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(18, 16));
3112e2340276SBjoern A. Zeeb }
3113e2340276SBjoern A. Zeeb 
3114e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_START_MCC_NOTIFY_RXDBG_EN(void *cmd, u32 val)
3115e2340276SBjoern A. Zeeb {
3116e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, BIT(21));
3117e2340276SBjoern A. Zeeb }
3118e2340276SBjoern A. Zeeb 
3119e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_START_MCC_MACID(void *cmd, u32 val)
3120e2340276SBjoern A. Zeeb {
3121e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 24));
3122e2340276SBjoern A. Zeeb }
3123e2340276SBjoern A. Zeeb 
3124e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_START_MCC_TSF_LOW(void *cmd, u32 val)
3125e2340276SBjoern A. Zeeb {
3126e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(31, 0));
3127e2340276SBjoern A. Zeeb }
3128e2340276SBjoern A. Zeeb 
3129e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_START_MCC_TSF_HIGH(void *cmd, u32 val)
3130e2340276SBjoern A. Zeeb {
3131e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 2, val, GENMASK(31, 0));
3132e2340276SBjoern A. Zeeb }
3133e2340276SBjoern A. Zeeb 
3134e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_STOP_MCC_MACID(void *cmd, u32 val)
3135e2340276SBjoern A. Zeeb {
3136e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(7, 0));
3137e2340276SBjoern A. Zeeb }
3138e2340276SBjoern A. Zeeb 
3139e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_STOP_MCC_GROUP(void *cmd, u32 val)
3140e2340276SBjoern A. Zeeb {
3141e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(9, 8));
3142e2340276SBjoern A. Zeeb }
3143e2340276SBjoern A. Zeeb 
3144e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_STOP_MCC_PREV_GROUPS(void *cmd, u32 val)
3145e2340276SBjoern A. Zeeb {
3146e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, BIT(10));
3147e2340276SBjoern A. Zeeb }
3148e2340276SBjoern A. Zeeb 
3149e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_DEL_MCC_GROUP_GROUP(void *cmd, u32 val)
3150e2340276SBjoern A. Zeeb {
3151e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0));
3152e2340276SBjoern A. Zeeb }
3153e2340276SBjoern A. Zeeb 
3154e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_DEL_MCC_GROUP_PREV_GROUPS(void *cmd, u32 val)
3155e2340276SBjoern A. Zeeb {
3156e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, BIT(2));
3157e2340276SBjoern A. Zeeb }
3158e2340276SBjoern A. Zeeb 
3159e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_RESET_MCC_GROUP_GROUP(void *cmd, u32 val)
3160e2340276SBjoern A. Zeeb {
3161e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0));
3162e2340276SBjoern A. Zeeb }
3163e2340276SBjoern A. Zeeb 
3164e2340276SBjoern A. Zeeb struct rtw89_fw_mcc_tsf_req {
3165e2340276SBjoern A. Zeeb 	u8 group: 2;
3166e2340276SBjoern A. Zeeb 	u8 rsvd0: 6;
3167e2340276SBjoern A. Zeeb 	u8 macid_x;
3168e2340276SBjoern A. Zeeb 	u8 macid_y;
3169e2340276SBjoern A. Zeeb 	u8 rsvd1;
3170e2340276SBjoern A. Zeeb };
3171e2340276SBjoern A. Zeeb 
3172e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_MCC_REQ_TSF_GROUP(void *cmd, u32 val)
3173e2340276SBjoern A. Zeeb {
3174e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0));
3175e2340276SBjoern A. Zeeb }
3176e2340276SBjoern A. Zeeb 
3177e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_MCC_REQ_TSF_MACID_X(void *cmd, u32 val)
3178e2340276SBjoern A. Zeeb {
3179e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 8));
3180e2340276SBjoern A. Zeeb }
3181e2340276SBjoern A. Zeeb 
3182e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_MCC_REQ_TSF_MACID_Y(void *cmd, u32 val)
3183e2340276SBjoern A. Zeeb {
3184e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(23, 16));
3185e2340276SBjoern A. Zeeb }
3186e2340276SBjoern A. Zeeb 
3187e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_MCC_MACID_BITMAP_GROUP(void *cmd, u32 val)
3188e2340276SBjoern A. Zeeb {
3189e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0));
3190e2340276SBjoern A. Zeeb }
3191e2340276SBjoern A. Zeeb 
3192e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_MCC_MACID_BITMAP_MACID(void *cmd, u32 val)
3193e2340276SBjoern A. Zeeb {
3194e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 8));
3195e2340276SBjoern A. Zeeb }
3196e2340276SBjoern A. Zeeb 
3197e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_MCC_MACID_BITMAP_BITMAP_LENGTH(void *cmd, u32 val)
3198e2340276SBjoern A. Zeeb {
3199e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(23, 16));
3200e2340276SBjoern A. Zeeb }
3201e2340276SBjoern A. Zeeb 
3202e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_MCC_MACID_BITMAP_BITMAP(void *cmd,
3203e2340276SBjoern A. Zeeb 							   u8 *bitmap, u8 len)
3204e2340276SBjoern A. Zeeb {
3205e2340276SBjoern A. Zeeb 	memcpy((__le32 *)cmd + 1, bitmap, len);
3206e2340276SBjoern A. Zeeb }
3207e2340276SBjoern A. Zeeb 
3208e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_MCC_SYNC_GROUP(void *cmd, u32 val)
3209e2340276SBjoern A. Zeeb {
3210e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0));
3211e2340276SBjoern A. Zeeb }
3212e2340276SBjoern A. Zeeb 
3213e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_MCC_SYNC_MACID_SOURCE(void *cmd, u32 val)
3214e2340276SBjoern A. Zeeb {
3215e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 8));
3216e2340276SBjoern A. Zeeb }
3217e2340276SBjoern A. Zeeb 
3218e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_MCC_SYNC_MACID_TARGET(void *cmd, u32 val)
3219e2340276SBjoern A. Zeeb {
3220e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(23, 16));
3221e2340276SBjoern A. Zeeb }
3222e2340276SBjoern A. Zeeb 
3223e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_MCC_SYNC_SYNC_OFFSET(void *cmd, u32 val)
3224e2340276SBjoern A. Zeeb {
3225e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 24));
3226e2340276SBjoern A. Zeeb }
3227e2340276SBjoern A. Zeeb 
3228e2340276SBjoern A. Zeeb struct rtw89_fw_mcc_duration {
3229e2340276SBjoern A. Zeeb 	u32 group: 2;
3230e2340276SBjoern A. Zeeb 	u32 btc_in_group: 1;
3231e2340276SBjoern A. Zeeb 	u32 rsvd0: 5;
3232e2340276SBjoern A. Zeeb 	u32 start_macid: 8;
3233e2340276SBjoern A. Zeeb 	u32 macid_x: 8;
3234e2340276SBjoern A. Zeeb 	u32 macid_y: 8;
3235e2340276SBjoern A. Zeeb 	u32 start_tsf_low;
3236e2340276SBjoern A. Zeeb 	u32 start_tsf_high;
3237e2340276SBjoern A. Zeeb 	u32 duration_x;
3238e2340276SBjoern A. Zeeb 	u32 duration_y;
3239e2340276SBjoern A. Zeeb };
3240e2340276SBjoern A. Zeeb 
3241e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_MCC_SET_DURATION_GROUP(void *cmd, u32 val)
3242e2340276SBjoern A. Zeeb {
3243e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0));
3244e2340276SBjoern A. Zeeb }
3245e2340276SBjoern A. Zeeb 
3246e2340276SBjoern A. Zeeb static
3247e2340276SBjoern A. Zeeb inline void RTW89_SET_FWCMD_MCC_SET_DURATION_BTC_IN_GROUP(void *cmd, u32 val)
3248e2340276SBjoern A. Zeeb {
3249e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, BIT(2));
3250e2340276SBjoern A. Zeeb }
3251e2340276SBjoern A. Zeeb 
3252e2340276SBjoern A. Zeeb static
3253e2340276SBjoern A. Zeeb inline void RTW89_SET_FWCMD_MCC_SET_DURATION_START_MACID(void *cmd, u32 val)
3254e2340276SBjoern A. Zeeb {
3255e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 8));
3256e2340276SBjoern A. Zeeb }
3257e2340276SBjoern A. Zeeb 
3258e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_MCC_SET_DURATION_MACID_X(void *cmd, u32 val)
3259e2340276SBjoern A. Zeeb {
3260e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(23, 16));
3261e2340276SBjoern A. Zeeb }
3262e2340276SBjoern A. Zeeb 
3263e2340276SBjoern A. Zeeb static inline void RTW89_SET_FWCMD_MCC_SET_DURATION_MACID_Y(void *cmd, u32 val)
3264e2340276SBjoern A. Zeeb {
3265e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 24));
3266e2340276SBjoern A. Zeeb }
3267e2340276SBjoern A. Zeeb 
3268e2340276SBjoern A. Zeeb static
3269e2340276SBjoern A. Zeeb inline void RTW89_SET_FWCMD_MCC_SET_DURATION_START_TSF_LOW(void *cmd, u32 val)
3270e2340276SBjoern A. Zeeb {
3271e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(31, 0));
3272e2340276SBjoern A. Zeeb }
3273e2340276SBjoern A. Zeeb 
3274e2340276SBjoern A. Zeeb static
3275e2340276SBjoern A. Zeeb inline void RTW89_SET_FWCMD_MCC_SET_DURATION_START_TSF_HIGH(void *cmd, u32 val)
3276e2340276SBjoern A. Zeeb {
3277e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 2, val, GENMASK(31, 0));
3278e2340276SBjoern A. Zeeb }
3279e2340276SBjoern A. Zeeb 
3280e2340276SBjoern A. Zeeb static
3281e2340276SBjoern A. Zeeb inline void RTW89_SET_FWCMD_MCC_SET_DURATION_DURATION_X(void *cmd, u32 val)
3282e2340276SBjoern A. Zeeb {
3283e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 3, val, GENMASK(31, 0));
3284e2340276SBjoern A. Zeeb }
3285e2340276SBjoern A. Zeeb 
3286e2340276SBjoern A. Zeeb static
3287e2340276SBjoern A. Zeeb inline void RTW89_SET_FWCMD_MCC_SET_DURATION_DURATION_Y(void *cmd, u32 val)
3288e2340276SBjoern A. Zeeb {
3289e2340276SBjoern A. Zeeb 	le32p_replace_bits((__le32 *)cmd + 4, val, GENMASK(31, 0));
32908e93258fSBjoern A. Zeeb }
32918e93258fSBjoern A. Zeeb 
32926d67aabdSBjoern A. Zeeb enum rtw89_h2c_mrc_sch_types {
32936d67aabdSBjoern A. Zeeb 	RTW89_H2C_MRC_SCH_BAND0_ONLY = 0,
32946d67aabdSBjoern A. Zeeb 	RTW89_H2C_MRC_SCH_BAND1_ONLY = 1,
32956d67aabdSBjoern A. Zeeb 	RTW89_H2C_MRC_SCH_DUAL_BAND = 2,
32966d67aabdSBjoern A. Zeeb };
32976d67aabdSBjoern A. Zeeb 
32986d67aabdSBjoern A. Zeeb enum rtw89_h2c_mrc_role_types {
32996d67aabdSBjoern A. Zeeb 	RTW89_H2C_MRC_ROLE_WIFI = 0,
33006d67aabdSBjoern A. Zeeb 	RTW89_H2C_MRC_ROLE_BT = 1,
33016d67aabdSBjoern A. Zeeb 	RTW89_H2C_MRC_ROLE_EMPTY = 2,
33026d67aabdSBjoern A. Zeeb };
33036d67aabdSBjoern A. Zeeb 
33046d67aabdSBjoern A. Zeeb #define RTW89_MAC_MRC_MAX_ADD_SLOT_NUM 3
33056d67aabdSBjoern A. Zeeb #define RTW89_MAC_MRC_MAX_ADD_ROLE_NUM_PER_SLOT 1 /* before MLO */
33066d67aabdSBjoern A. Zeeb 
33076d67aabdSBjoern A. Zeeb struct rtw89_fw_mrc_add_slot_arg {
33086d67aabdSBjoern A. Zeeb 	u16 duration; /* unit: TU */
33096d67aabdSBjoern A. Zeeb 	bool courtesy_en;
33106d67aabdSBjoern A. Zeeb 	u8 courtesy_period;
33116d67aabdSBjoern A. Zeeb 	u8 courtesy_target; /* slot idx */
33126d67aabdSBjoern A. Zeeb 
33136d67aabdSBjoern A. Zeeb 	unsigned int role_num;
33146d67aabdSBjoern A. Zeeb 	struct {
33156d67aabdSBjoern A. Zeeb 		enum rtw89_h2c_mrc_role_types role_type;
33166d67aabdSBjoern A. Zeeb 		bool is_master;
33176d67aabdSBjoern A. Zeeb 		bool en_tx_null;
33186d67aabdSBjoern A. Zeeb 		enum rtw89_band band;
33196d67aabdSBjoern A. Zeeb 		enum rtw89_bandwidth bw;
33206d67aabdSBjoern A. Zeeb 		u8 macid;
33216d67aabdSBjoern A. Zeeb 		u8 central_ch;
33226d67aabdSBjoern A. Zeeb 		u8 primary_ch;
33236d67aabdSBjoern A. Zeeb 		u8 null_early; /* unit: TU */
33246d67aabdSBjoern A. Zeeb 
33256d67aabdSBjoern A. Zeeb 		/* if MLD, for macid: [0, chip::support_mld_num)
33266d67aabdSBjoern A. Zeeb 		 * otherwise, for macid: [0, 32)
33276d67aabdSBjoern A. Zeeb 		 */
33286d67aabdSBjoern A. Zeeb 		u32 macid_main_bitmap;
33296d67aabdSBjoern A. Zeeb 		/* for MLD, bit X maps to macid: X + chip::support_mld_num */
33306d67aabdSBjoern A. Zeeb 		u32 macid_paired_bitmap;
33316d67aabdSBjoern A. Zeeb 	} roles[RTW89_MAC_MRC_MAX_ADD_ROLE_NUM_PER_SLOT];
33326d67aabdSBjoern A. Zeeb };
33336d67aabdSBjoern A. Zeeb 
33346d67aabdSBjoern A. Zeeb struct rtw89_fw_mrc_add_arg {
33356d67aabdSBjoern A. Zeeb 	u8 sch_idx;
33366d67aabdSBjoern A. Zeeb 	enum rtw89_h2c_mrc_sch_types sch_type;
33376d67aabdSBjoern A. Zeeb 	bool btc_in_sch;
33386d67aabdSBjoern A. Zeeb 
33396d67aabdSBjoern A. Zeeb 	unsigned int slot_num;
33406d67aabdSBjoern A. Zeeb 	struct rtw89_fw_mrc_add_slot_arg slots[RTW89_MAC_MRC_MAX_ADD_SLOT_NUM];
33416d67aabdSBjoern A. Zeeb };
33426d67aabdSBjoern A. Zeeb 
33436d67aabdSBjoern A. Zeeb struct rtw89_h2c_mrc_add_role {
33446d67aabdSBjoern A. Zeeb 	__le32 w0;
33456d67aabdSBjoern A. Zeeb 	__le32 w1;
33466d67aabdSBjoern A. Zeeb 	__le32 w2;
33476d67aabdSBjoern A. Zeeb 	__le32 macid_main_bitmap;
33486d67aabdSBjoern A. Zeeb 	__le32 macid_paired_bitmap;
33496d67aabdSBjoern A. Zeeb } __packed;
33506d67aabdSBjoern A. Zeeb 
33516d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_ADD_ROLE_W0_MACID GENMASK(15, 0)
33526d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_ADD_ROLE_W0_ROLE_TYPE GENMASK(23, 16)
33536d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_ADD_ROLE_W0_IS_MASTER BIT(24)
33546d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_ADD_ROLE_W0_IS_ALT_ROLE BIT(25)
33556d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_ADD_ROLE_W0_TX_NULL_EN BIT(26)
33566d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_ADD_ROLE_W0_ROLE_ALT_EN BIT(27)
33576d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_ADD_ROLE_W1_CENTRAL_CH_SEG GENMASK(7, 0)
33586d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_ADD_ROLE_W1_PRI_CH GENMASK(15, 8)
33596d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_ADD_ROLE_W1_BW GENMASK(19, 16)
33606d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_ADD_ROLE_W1_CH_BAND_TYPE GENMASK(21, 20)
33616d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_ADD_ROLE_W1_RFK_BY_PASS BIT(22)
33626d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_ADD_ROLE_W1_CAN_BTC BIT(23)
33636d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_ADD_ROLE_W1_NULL_EARLY GENMASK(31, 24)
33646d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_ADD_ROLE_W2_ALT_PERIOD GENMASK(7, 0)
33656d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_ADD_ROLE_W2_ALT_ROLE_TYPE GENMASK(15, 8)
33666d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_ADD_ROLE_W2_ALT_ROLE_MACID GENMASK(23, 16)
33676d67aabdSBjoern A. Zeeb 
33686d67aabdSBjoern A. Zeeb struct rtw89_h2c_mrc_add_slot {
33696d67aabdSBjoern A. Zeeb 	__le32 w0;
33706d67aabdSBjoern A. Zeeb 	__le32 w1;
33716d67aabdSBjoern A. Zeeb 	struct rtw89_h2c_mrc_add_role roles[];
33726d67aabdSBjoern A. Zeeb } __packed;
33736d67aabdSBjoern A. Zeeb 
33746d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_ADD_SLOT_W0_DURATION GENMASK(15, 0)
33756d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_ADD_SLOT_W0_COURTESY_EN BIT(17)
33766d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_ADD_SLOT_W0_ROLE_NUM GENMASK(31, 24)
33776d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_ADD_SLOT_W1_COURTESY_PERIOD GENMASK(7, 0)
33786d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_ADD_SLOT_W1_COURTESY_TARGET GENMASK(15, 8)
33796d67aabdSBjoern A. Zeeb 
33806d67aabdSBjoern A. Zeeb struct rtw89_h2c_mrc_add {
33816d67aabdSBjoern A. Zeeb 	__le32 w0;
33826d67aabdSBjoern A. Zeeb 	/* Logically append flexible struct rtw89_h2c_mrc_add_slot, but there
33836d67aabdSBjoern A. Zeeb 	 * are other flexible array inside it. We cannot access them correctly
33846d67aabdSBjoern A. Zeeb 	 * through this struct. So, in case misusing, we don't really declare
33856d67aabdSBjoern A. Zeeb 	 * it here.
33866d67aabdSBjoern A. Zeeb 	 */
33876d67aabdSBjoern A. Zeeb } __packed;
33886d67aabdSBjoern A. Zeeb 
33896d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_ADD_W0_SCH_IDX GENMASK(3, 0)
33906d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_ADD_W0_SCH_TYPE GENMASK(7, 4)
33916d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_ADD_W0_SLOT_NUM GENMASK(15, 8)
33926d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_ADD_W0_BTC_IN_SCH BIT(16)
33936d67aabdSBjoern A. Zeeb 
33946d67aabdSBjoern A. Zeeb enum rtw89_h2c_mrc_start_actions {
33956d67aabdSBjoern A. Zeeb 	RTW89_H2C_MRC_START_ACTION_START_NEW = 0,
33966d67aabdSBjoern A. Zeeb 	RTW89_H2C_MRC_START_ACTION_REPLACE_OLD = 1,
33976d67aabdSBjoern A. Zeeb };
33986d67aabdSBjoern A. Zeeb 
33996d67aabdSBjoern A. Zeeb struct rtw89_fw_mrc_start_arg {
34006d67aabdSBjoern A. Zeeb 	u8 sch_idx;
34016d67aabdSBjoern A. Zeeb 	u8 old_sch_idx;
34026d67aabdSBjoern A. Zeeb 	u64 start_tsf;
34036d67aabdSBjoern A. Zeeb 	enum rtw89_h2c_mrc_start_actions action;
34046d67aabdSBjoern A. Zeeb };
34056d67aabdSBjoern A. Zeeb 
34066d67aabdSBjoern A. Zeeb struct rtw89_h2c_mrc_start {
34076d67aabdSBjoern A. Zeeb 	__le32 w0;
34086d67aabdSBjoern A. Zeeb 	__le32 start_tsf_low;
34096d67aabdSBjoern A. Zeeb 	__le32 start_tsf_high;
34106d67aabdSBjoern A. Zeeb } __packed;
34116d67aabdSBjoern A. Zeeb 
34126d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_START_W0_SCH_IDX GENMASK(3, 0)
34136d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_START_W0_OLD_SCH_IDX GENMASK(7, 4)
34146d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_START_W0_ACTION GENMASK(15, 8)
34156d67aabdSBjoern A. Zeeb 
34166d67aabdSBjoern A. Zeeb struct rtw89_h2c_mrc_del {
34176d67aabdSBjoern A. Zeeb 	__le32 w0;
34186d67aabdSBjoern A. Zeeb } __packed;
34196d67aabdSBjoern A. Zeeb 
34206d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_DEL_W0_SCH_IDX GENMASK(3, 0)
34216d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_DEL_W0_DEL_ALL BIT(4)
34226d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_DEL_W0_STOP_ONLY BIT(5)
34236d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_DEL_W0_SPECIFIC_ROLE_EN BIT(6)
34246d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_DEL_W0_STOP_SLOT_IDX GENMASK(15, 8)
34256d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_DEL_W0_SPECIFIC_ROLE_MACID GENMASK(31, 16)
34266d67aabdSBjoern A. Zeeb 
34276d67aabdSBjoern A. Zeeb #define RTW89_MAC_MRC_MAX_REQ_TSF_NUM 2
34286d67aabdSBjoern A. Zeeb 
34296d67aabdSBjoern A. Zeeb struct rtw89_fw_mrc_req_tsf_arg {
34306d67aabdSBjoern A. Zeeb 	unsigned int num;
34316d67aabdSBjoern A. Zeeb 	struct {
34326d67aabdSBjoern A. Zeeb 		u8 band;
34336d67aabdSBjoern A. Zeeb 		u8 port;
34346d67aabdSBjoern A. Zeeb 	} infos[RTW89_MAC_MRC_MAX_REQ_TSF_NUM];
34356d67aabdSBjoern A. Zeeb };
34366d67aabdSBjoern A. Zeeb 
34376d67aabdSBjoern A. Zeeb struct rtw89_h2c_mrc_req_tsf {
34386d67aabdSBjoern A. Zeeb 	u8 req_tsf_num;
34396d67aabdSBjoern A. Zeeb 	u8 infos[] __counted_by(req_tsf_num);
34406d67aabdSBjoern A. Zeeb } __packed;
34416d67aabdSBjoern A. Zeeb 
34426d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_REQ_TSF_INFO_BAND GENMASK(3, 0)
34436d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_REQ_TSF_INFO_PORT GENMASK(7, 4)
34446d67aabdSBjoern A. Zeeb 
34456d67aabdSBjoern A. Zeeb enum rtw89_h2c_mrc_upd_bitmap_actions {
34466d67aabdSBjoern A. Zeeb 	RTW89_H2C_MRC_UPD_BITMAP_ACTION_DEL = 0,
34476d67aabdSBjoern A. Zeeb 	RTW89_H2C_MRC_UPD_BITMAP_ACTION_ADD = 1,
34486d67aabdSBjoern A. Zeeb };
34496d67aabdSBjoern A. Zeeb 
34506d67aabdSBjoern A. Zeeb struct rtw89_fw_mrc_upd_bitmap_arg {
34516d67aabdSBjoern A. Zeeb 	u8 sch_idx;
34526d67aabdSBjoern A. Zeeb 	u8 macid;
34536d67aabdSBjoern A. Zeeb 	u8 client_macid;
34546d67aabdSBjoern A. Zeeb 	enum rtw89_h2c_mrc_upd_bitmap_actions action;
34556d67aabdSBjoern A. Zeeb };
34566d67aabdSBjoern A. Zeeb 
34576d67aabdSBjoern A. Zeeb struct rtw89_h2c_mrc_upd_bitmap {
34586d67aabdSBjoern A. Zeeb 	__le32 w0;
34596d67aabdSBjoern A. Zeeb 	__le32 w1;
34606d67aabdSBjoern A. Zeeb } __packed;
34616d67aabdSBjoern A. Zeeb 
34626d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_UPD_BITMAP_W0_SCH_IDX GENMASK(3, 0)
34636d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_UPD_BITMAP_W0_ACTION BIT(4)
34646d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_UPD_BITMAP_W0_MACID GENMASK(31, 16)
34656d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_UPD_BITMAP_W1_CLIENT_MACID GENMASK(15, 0)
34666d67aabdSBjoern A. Zeeb 
34676d67aabdSBjoern A. Zeeb struct rtw89_fw_mrc_sync_arg {
34686d67aabdSBjoern A. Zeeb 	u8 offset; /* unit: TU */
34696d67aabdSBjoern A. Zeeb 	struct {
34706d67aabdSBjoern A. Zeeb 		u8 band;
34716d67aabdSBjoern A. Zeeb 		u8 port;
34726d67aabdSBjoern A. Zeeb 	} src, dest;
34736d67aabdSBjoern A. Zeeb };
34746d67aabdSBjoern A. Zeeb 
34756d67aabdSBjoern A. Zeeb struct rtw89_h2c_mrc_sync {
34766d67aabdSBjoern A. Zeeb 	__le32 w0;
34776d67aabdSBjoern A. Zeeb 	__le32 w1;
34786d67aabdSBjoern A. Zeeb } __packed;
34796d67aabdSBjoern A. Zeeb 
34806d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_SYNC_W0_SYNC_EN BIT(0)
34816d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_SYNC_W0_SRC_PORT GENMASK(11, 8)
34826d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_SYNC_W0_SRC_BAND GENMASK(15, 12)
34836d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_SYNC_W0_DEST_PORT GENMASK(19, 16)
34846d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_SYNC_W0_DEST_BAND GENMASK(23, 20)
34856d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_SYNC_W1_OFFSET GENMASK(15, 0)
34866d67aabdSBjoern A. Zeeb 
34876d67aabdSBjoern A. Zeeb struct rtw89_fw_mrc_upd_duration_arg {
34886d67aabdSBjoern A. Zeeb 	u8 sch_idx;
34896d67aabdSBjoern A. Zeeb 	u64 start_tsf;
34906d67aabdSBjoern A. Zeeb 
34916d67aabdSBjoern A. Zeeb 	unsigned int slot_num;
34926d67aabdSBjoern A. Zeeb 	struct {
34936d67aabdSBjoern A. Zeeb 		u8 slot_idx;
34946d67aabdSBjoern A. Zeeb 		u16 duration; /* unit: TU */
34956d67aabdSBjoern A. Zeeb 	} slots[RTW89_MAC_MRC_MAX_ADD_SLOT_NUM];
34966d67aabdSBjoern A. Zeeb };
34976d67aabdSBjoern A. Zeeb 
34986d67aabdSBjoern A. Zeeb struct rtw89_h2c_mrc_upd_duration {
34996d67aabdSBjoern A. Zeeb 	__le32 w0;
35006d67aabdSBjoern A. Zeeb 	__le32 start_tsf_low;
35016d67aabdSBjoern A. Zeeb 	__le32 start_tsf_high;
35026d67aabdSBjoern A. Zeeb 	__le32 slots[];
35036d67aabdSBjoern A. Zeeb } __packed;
35046d67aabdSBjoern A. Zeeb 
35056d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_UPD_DURATION_W0_SCH_IDX GENMASK(3, 0)
35066d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_UPD_DURATION_W0_SLOT_NUM GENMASK(15, 8)
35076d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_UPD_DURATION_W0_BTC_IN_SCH BIT(16)
35086d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_UPD_DURATION_SLOT_SLOT_IDX GENMASK(7, 0)
35096d67aabdSBjoern A. Zeeb #define RTW89_H2C_MRC_UPD_DURATION_SLOT_DURATION GENMASK(31, 16)
35106d67aabdSBjoern A. Zeeb 
35116d67aabdSBjoern A. Zeeb struct rtw89_h2c_wow_aoac {
35126d67aabdSBjoern A. Zeeb 	__le32 w0;
35136d67aabdSBjoern A. Zeeb } __packed;
35146d67aabdSBjoern A. Zeeb 
3515*df279a26SBjoern A. Zeeb struct rtw89_h2c_ap_info {
3516*df279a26SBjoern A. Zeeb 	__le32 w0;
3517*df279a26SBjoern A. Zeeb } __packed;
3518*df279a26SBjoern A. Zeeb 
3519*df279a26SBjoern A. Zeeb #define RTW89_H2C_AP_INFO_W0_PWR_INT_EN BIT(0)
3520*df279a26SBjoern A. Zeeb 
35218e93258fSBjoern A. Zeeb #define RTW89_C2H_HEADER_LEN 8
35228e93258fSBjoern A. Zeeb 
3523e2340276SBjoern A. Zeeb struct rtw89_c2h_hdr {
3524e2340276SBjoern A. Zeeb 	__le32 w0;
3525e2340276SBjoern A. Zeeb 	__le32 w1;
3526e2340276SBjoern A. Zeeb } __packed;
35278e93258fSBjoern A. Zeeb 
3528e2340276SBjoern A. Zeeb #define RTW89_C2H_HDR_W0_CATEGORY GENMASK(1, 0)
3529e2340276SBjoern A. Zeeb #define RTW89_C2H_HDR_W0_CLASS GENMASK(7, 2)
3530e2340276SBjoern A. Zeeb #define RTW89_C2H_HDR_W0_FUNC GENMASK(15, 8)
3531e2340276SBjoern A. Zeeb #define RTW89_C2H_HDR_W1_LEN GENMASK(13, 0)
35328e93258fSBjoern A. Zeeb 
3533e2340276SBjoern A. Zeeb struct rtw89_fw_c2h_attr {
3534e2340276SBjoern A. Zeeb 	u8 category;
3535e2340276SBjoern A. Zeeb 	u8 class;
3536e2340276SBjoern A. Zeeb 	u8 func;
3537e2340276SBjoern A. Zeeb 	u16 len;
3538e2340276SBjoern A. Zeeb };
3539e2340276SBjoern A. Zeeb 
3540e2340276SBjoern A. Zeeb static inline struct rtw89_fw_c2h_attr *RTW89_SKB_C2H_CB(struct sk_buff *skb)
3541e2340276SBjoern A. Zeeb {
3542e2340276SBjoern A. Zeeb #if defined(__linux__)
3543e2340276SBjoern A. Zeeb 	static_assert(sizeof(skb->cb) >= sizeof(struct rtw89_fw_c2h_attr));
3544e2340276SBjoern A. Zeeb #elif defined(__FreeBSD__)
3545e2340276SBjoern A. Zeeb 	rtw89_static_assert(sizeof(skb->cb) >= sizeof(struct rtw89_fw_c2h_attr));
3546e2340276SBjoern A. Zeeb #endif
3547e2340276SBjoern A. Zeeb 
3548e2340276SBjoern A. Zeeb 	return (struct rtw89_fw_c2h_attr *)skb->cb;
3549e2340276SBjoern A. Zeeb }
3550e2340276SBjoern A. Zeeb 
3551e2340276SBjoern A. Zeeb struct rtw89_c2h_done_ack {
3552e2340276SBjoern A. Zeeb 	__le32 w0;
3553e2340276SBjoern A. Zeeb 	__le32 w1;
3554e2340276SBjoern A. Zeeb 	__le32 w2;
3555e2340276SBjoern A. Zeeb } __packed;
3556e2340276SBjoern A. Zeeb 
3557e2340276SBjoern A. Zeeb #define RTW89_C2H_DONE_ACK_W2_CAT GENMASK(1, 0)
3558e2340276SBjoern A. Zeeb #define RTW89_C2H_DONE_ACK_W2_CLASS GENMASK(7, 2)
3559e2340276SBjoern A. Zeeb #define RTW89_C2H_DONE_ACK_W2_FUNC GENMASK(15, 8)
3560e2340276SBjoern A. Zeeb #define RTW89_C2H_DONE_ACK_W2_H2C_RETURN GENMASK(23, 16)
3561e2340276SBjoern A. Zeeb #define RTW89_C2H_DONE_ACK_W2_H2C_SEQ GENMASK(31, 24)
35628e93258fSBjoern A. Zeeb 
35638e93258fSBjoern A. Zeeb #define RTW89_GET_MAC_C2H_REV_ACK_CAT(c2h) \
35648e93258fSBjoern A. Zeeb 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(1, 0))
35658e93258fSBjoern A. Zeeb #define RTW89_GET_MAC_C2H_REV_ACK_CLASS(c2h) \
35668e93258fSBjoern A. Zeeb 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(7, 2))
35678e93258fSBjoern A. Zeeb #define RTW89_GET_MAC_C2H_REV_ACK_FUNC(c2h) \
35688e93258fSBjoern A. Zeeb 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(15, 8))
35698e93258fSBjoern A. Zeeb #define RTW89_GET_MAC_C2H_REV_ACK_H2C_SEQ(c2h) \
35708e93258fSBjoern A. Zeeb 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(23, 16))
35718e93258fSBjoern A. Zeeb 
3572e2340276SBjoern A. Zeeb struct rtw89_fw_c2h_log_fmt {
3573e2340276SBjoern A. Zeeb 	__le16 signature;
3574e2340276SBjoern A. Zeeb 	u8 feature;
3575e2340276SBjoern A. Zeeb 	u8 syntax;
3576e2340276SBjoern A. Zeeb 	__le32 fmt_id;
3577e2340276SBjoern A. Zeeb 	u8 file_num;
3578e2340276SBjoern A. Zeeb 	__le16 line_num;
3579e2340276SBjoern A. Zeeb 	u8 argc;
3580e2340276SBjoern A. Zeeb 	union {
3581e2340276SBjoern A. Zeeb 		DECLARE_FLEX_ARRAY(u8, raw);
3582e2340276SBjoern A. Zeeb 		DECLARE_FLEX_ARRAY(__le32, argv);
3583e2340276SBjoern A. Zeeb 	} __packed u;
3584e2340276SBjoern A. Zeeb } __packed;
35858e93258fSBjoern A. Zeeb 
3586e2340276SBjoern A. Zeeb #define RTW89_C2H_FW_FORMATTED_LOG_MIN_LEN 11
3587e2340276SBjoern A. Zeeb #define RTW89_C2H_FW_LOG_FEATURE_PARA_INT BIT(2)
3588e2340276SBjoern A. Zeeb #define RTW89_C2H_FW_LOG_MAX_PARA_NUM 16
3589e2340276SBjoern A. Zeeb #define RTW89_C2H_FW_LOG_SIGNATURE 0xA5A5
3590e2340276SBjoern A. Zeeb #define RTW89_C2H_FW_LOG_STR_BUF_SIZE 512
3591e2340276SBjoern A. Zeeb 
3592e2340276SBjoern A. Zeeb struct rtw89_c2h_mac_bcnfltr_rpt {
3593e2340276SBjoern A. Zeeb 	__le32 w0;
3594e2340276SBjoern A. Zeeb 	__le32 w1;
3595e2340276SBjoern A. Zeeb 	__le32 w2;
3596e2340276SBjoern A. Zeeb } __packed;
3597e2340276SBjoern A. Zeeb 
3598e2340276SBjoern A. Zeeb #define RTW89_C2H_MAC_BCNFLTR_RPT_W2_MACID GENMASK(7, 0)
3599e2340276SBjoern A. Zeeb #define RTW89_C2H_MAC_BCNFLTR_RPT_W2_TYPE GENMASK(9, 8)
3600e2340276SBjoern A. Zeeb #define RTW89_C2H_MAC_BCNFLTR_RPT_W2_EVENT GENMASK(11, 10)
3601e2340276SBjoern A. Zeeb #define RTW89_C2H_MAC_BCNFLTR_RPT_W2_MA GENMASK(23, 16)
3602e2340276SBjoern A. Zeeb 
3603e2340276SBjoern A. Zeeb struct rtw89_c2h_ra_rpt {
3604e2340276SBjoern A. Zeeb 	struct rtw89_c2h_hdr hdr;
3605e2340276SBjoern A. Zeeb 	__le32 w2;
3606e2340276SBjoern A. Zeeb 	__le32 w3;
3607e2340276SBjoern A. Zeeb } __packed;
3608e2340276SBjoern A. Zeeb 
3609e2340276SBjoern A. Zeeb #define RTW89_C2H_RA_RPT_W2_MACID GENMASK(15, 0)
3610e2340276SBjoern A. Zeeb #define RTW89_C2H_RA_RPT_W2_RETRY_RATIO GENMASK(23, 16)
3611e2340276SBjoern A. Zeeb #define RTW89_C2H_RA_RPT_W2_MCSNSS_B7 BIT(31)
3612e2340276SBjoern A. Zeeb #define RTW89_C2H_RA_RPT_W3_MCSNSS GENMASK(6, 0)
3613e2340276SBjoern A. Zeeb #define RTW89_C2H_RA_RPT_W3_MD_SEL GENMASK(9, 8)
3614e2340276SBjoern A. Zeeb #define RTW89_C2H_RA_RPT_W3_GILTF GENMASK(12, 10)
3615e2340276SBjoern A. Zeeb #define RTW89_C2H_RA_RPT_W3_BW GENMASK(14, 13)
3616e2340276SBjoern A. Zeeb #define RTW89_C2H_RA_RPT_W3_MD_SEL_B2 BIT(15)
3617e2340276SBjoern A. Zeeb #define RTW89_C2H_RA_RPT_W3_BW_B2 BIT(16)
3618e2340276SBjoern A. Zeeb 
3619e2340276SBjoern A. Zeeb /* For WiFi 6 chips:
3620e2340276SBjoern A. Zeeb  *   VHT, HE, HT-old: [6:4]: NSS, [3:0]: MCS
36218e93258fSBjoern A. Zeeb  *   HT-new: [6:5]: NA, [4:0]: MCS
3622e2340276SBjoern A. Zeeb  * For WiFi 7 chips (V1):
3623e2340276SBjoern A. Zeeb  *   HT, VHT, HE, EHT: [7:5]: NSS, [4:0]: MCS
36248e93258fSBjoern A. Zeeb  */
36258e93258fSBjoern A. Zeeb #define RTW89_RA_RATE_MASK_NSS GENMASK(6, 4)
36268e93258fSBjoern A. Zeeb #define RTW89_RA_RATE_MASK_MCS GENMASK(3, 0)
3627e2340276SBjoern A. Zeeb #define RTW89_RA_RATE_MASK_NSS_V1 GENMASK(7, 5)
3628e2340276SBjoern A. Zeeb #define RTW89_RA_RATE_MASK_MCS_V1 GENMASK(4, 0)
36298e93258fSBjoern A. Zeeb #define RTW89_RA_RATE_MASK_HT_MCS GENMASK(4, 0)
36308e93258fSBjoern A. Zeeb #define RTW89_MK_HT_RATE(nss, mcs) (FIELD_PREP(GENMASK(4, 3), nss) | \
36318e93258fSBjoern A. Zeeb 				    FIELD_PREP(GENMASK(2, 0), mcs))
36328e93258fSBjoern A. Zeeb 
36338e93258fSBjoern A. Zeeb #define RTW89_GET_MAC_C2H_PKTOFLD_ID(c2h) \
36348e93258fSBjoern A. Zeeb 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(7, 0))
36358e93258fSBjoern A. Zeeb #define RTW89_GET_MAC_C2H_PKTOFLD_OP(c2h) \
36368e93258fSBjoern A. Zeeb 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(10, 8))
36378e93258fSBjoern A. Zeeb #define RTW89_GET_MAC_C2H_PKTOFLD_LEN(c2h) \
36388e93258fSBjoern A. Zeeb 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(31, 16))
36398e93258fSBjoern A. Zeeb 
36406d67aabdSBjoern A. Zeeb struct rtw89_c2h_scanofld {
36416d67aabdSBjoern A. Zeeb 	__le32 w0;
36426d67aabdSBjoern A. Zeeb 	__le32 w1;
36436d67aabdSBjoern A. Zeeb 	__le32 w2;
36446d67aabdSBjoern A. Zeeb 	__le32 w3;
36456d67aabdSBjoern A. Zeeb 	__le32 w4;
36466d67aabdSBjoern A. Zeeb 	__le32 w5;
36476d67aabdSBjoern A. Zeeb 	__le32 w6;
36486d67aabdSBjoern A. Zeeb 	__le32 w7;
3649*df279a26SBjoern A. Zeeb 	__le32 w8;
36506d67aabdSBjoern A. Zeeb } __packed;
36516d67aabdSBjoern A. Zeeb 
36526d67aabdSBjoern A. Zeeb #define RTW89_C2H_SCANOFLD_W2_PRI_CH GENMASK(7, 0)
36536d67aabdSBjoern A. Zeeb #define RTW89_C2H_SCANOFLD_W2_RSN GENMASK(19, 16)
36546d67aabdSBjoern A. Zeeb #define RTW89_C2H_SCANOFLD_W2_STATUS GENMASK(23, 20)
36556d67aabdSBjoern A. Zeeb #define RTW89_C2H_SCANOFLD_W2_PERIOD GENMASK(31, 24)
36566d67aabdSBjoern A. Zeeb #define RTW89_C2H_SCANOFLD_W5_TX_FAIL GENMASK(3, 0)
36576d67aabdSBjoern A. Zeeb #define RTW89_C2H_SCANOFLD_W5_AIR_DENSITY GENMASK(7, 4)
36586d67aabdSBjoern A. Zeeb #define RTW89_C2H_SCANOFLD_W5_BAND GENMASK(25, 24)
36596d67aabdSBjoern A. Zeeb #define RTW89_C2H_SCANOFLD_W5_MAC_IDX BIT(26)
36606d67aabdSBjoern A. Zeeb #define RTW89_C2H_SCANOFLD_W6_SW_DEF GENMASK(7, 0)
36616d67aabdSBjoern A. Zeeb #define RTW89_C2H_SCANOFLD_W6_EXPECT_PERIOD GENMASK(15, 8)
36626d67aabdSBjoern A. Zeeb #define RTW89_C2H_SCANOFLD_W6_FW_DEF GENMASK(23, 16)
36636d67aabdSBjoern A. Zeeb #define RTW89_C2H_SCANOFLD_W7_REPORT_TSF GENMASK(31, 0)
3664*df279a26SBjoern A. Zeeb #define RTW89_C2H_SCANOFLD_W8_PERIOD_V1 GENMASK(15, 0)
3665*df279a26SBjoern A. Zeeb #define RTW89_C2H_SCANOFLD_W8_EXPECT_PERIOD_V1 GENMASK(31, 16)
36668e93258fSBjoern A. Zeeb 
3667e2340276SBjoern A. Zeeb #define RTW89_GET_MAC_C2H_MCC_RCV_ACK_GROUP(c2h) \
3668e2340276SBjoern A. Zeeb 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(1, 0))
3669e2340276SBjoern A. Zeeb #define RTW89_GET_MAC_C2H_MCC_RCV_ACK_H2C_FUNC(c2h) \
3670e2340276SBjoern A. Zeeb 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(15, 8))
3671e2340276SBjoern A. Zeeb 
3672e2340276SBjoern A. Zeeb #define RTW89_GET_MAC_C2H_MCC_REQ_ACK_GROUP(c2h) \
3673e2340276SBjoern A. Zeeb 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(1, 0))
3674e2340276SBjoern A. Zeeb #define RTW89_GET_MAC_C2H_MCC_REQ_ACK_H2C_RETURN(c2h) \
3675e2340276SBjoern A. Zeeb 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(7, 2))
3676e2340276SBjoern A. Zeeb #define RTW89_GET_MAC_C2H_MCC_REQ_ACK_H2C_FUNC(c2h) \
3677e2340276SBjoern A. Zeeb 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(15, 8))
3678e2340276SBjoern A. Zeeb 
3679e2340276SBjoern A. Zeeb struct rtw89_mac_mcc_tsf_rpt {
3680e2340276SBjoern A. Zeeb 	u32 macid_x;
3681e2340276SBjoern A. Zeeb 	u32 macid_y;
3682e2340276SBjoern A. Zeeb 	u32 tsf_x_low;
3683e2340276SBjoern A. Zeeb 	u32 tsf_x_high;
3684e2340276SBjoern A. Zeeb 	u32 tsf_y_low;
3685e2340276SBjoern A. Zeeb 	u32 tsf_y_high;
3686e2340276SBjoern A. Zeeb };
3687e2340276SBjoern A. Zeeb 
3688e2340276SBjoern A. Zeeb #if defined(__linux__)
3689e2340276SBjoern A. Zeeb static_assert(sizeof(struct rtw89_mac_mcc_tsf_rpt) <= RTW89_COMPLETION_BUF_SIZE);
3690e2340276SBjoern A. Zeeb #elif defined(__FreeBSD__)
3691e2340276SBjoern A. Zeeb rtw89_static_assert(sizeof(struct rtw89_mac_mcc_tsf_rpt) <= RTW89_COMPLETION_BUF_SIZE);
3692e2340276SBjoern A. Zeeb #endif
3693e2340276SBjoern A. Zeeb 
3694e2340276SBjoern A. Zeeb #define RTW89_GET_MAC_C2H_MCC_TSF_RPT_MACID_X(c2h) \
3695e2340276SBjoern A. Zeeb 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(7, 0))
3696e2340276SBjoern A. Zeeb #define RTW89_GET_MAC_C2H_MCC_TSF_RPT_MACID_Y(c2h) \
3697e2340276SBjoern A. Zeeb 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(15, 8))
3698e2340276SBjoern A. Zeeb #define RTW89_GET_MAC_C2H_MCC_TSF_RPT_GROUP(c2h) \
3699e2340276SBjoern A. Zeeb 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(17, 16))
3700e2340276SBjoern A. Zeeb #define RTW89_GET_MAC_C2H_MCC_TSF_RPT_TSF_LOW_X(c2h) \
3701e2340276SBjoern A. Zeeb 	le32_get_bits(*((const __le32 *)(c2h) + 3), GENMASK(31, 0))
3702e2340276SBjoern A. Zeeb #define RTW89_GET_MAC_C2H_MCC_TSF_RPT_TSF_HIGH_X(c2h) \
3703e2340276SBjoern A. Zeeb 	le32_get_bits(*((const __le32 *)(c2h) + 4), GENMASK(31, 0))
3704e2340276SBjoern A. Zeeb #define RTW89_GET_MAC_C2H_MCC_TSF_RPT_TSF_LOW_Y(c2h) \
3705e2340276SBjoern A. Zeeb 	le32_get_bits(*((const __le32 *)(c2h) + 5), GENMASK(31, 0))
3706e2340276SBjoern A. Zeeb #define RTW89_GET_MAC_C2H_MCC_TSF_RPT_TSF_HIGH_Y(c2h) \
3707e2340276SBjoern A. Zeeb 	le32_get_bits(*((const __le32 *)(c2h) + 6), GENMASK(31, 0))
3708e2340276SBjoern A. Zeeb 
3709e2340276SBjoern A. Zeeb #define RTW89_GET_MAC_C2H_MCC_STATUS_RPT_STATUS(c2h) \
3710e2340276SBjoern A. Zeeb 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(5, 0))
3711e2340276SBjoern A. Zeeb #define RTW89_GET_MAC_C2H_MCC_STATUS_RPT_GROUP(c2h) \
3712e2340276SBjoern A. Zeeb 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(7, 6))
3713e2340276SBjoern A. Zeeb #define RTW89_GET_MAC_C2H_MCC_STATUS_RPT_MACID(c2h) \
3714e2340276SBjoern A. Zeeb 	le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(15, 8))
3715e2340276SBjoern A. Zeeb #define RTW89_GET_MAC_C2H_MCC_STATUS_RPT_TSF_LOW(c2h) \
3716e2340276SBjoern A. Zeeb 	le32_get_bits(*((const __le32 *)(c2h) + 3), GENMASK(31, 0))
3717e2340276SBjoern A. Zeeb #define RTW89_GET_MAC_C2H_MCC_STATUS_RPT_TSF_HIGH(c2h) \
3718e2340276SBjoern A. Zeeb 	le32_get_bits(*((const __le32 *)(c2h) + 4), GENMASK(31, 0))
3719e2340276SBjoern A. Zeeb 
37206d67aabdSBjoern A. Zeeb struct rtw89_mac_mrc_tsf_rpt {
37216d67aabdSBjoern A. Zeeb 	unsigned int num;
37226d67aabdSBjoern A. Zeeb 	u64 tsfs[RTW89_MAC_MRC_MAX_REQ_TSF_NUM];
37236d67aabdSBjoern A. Zeeb };
37246d67aabdSBjoern A. Zeeb 
37256d67aabdSBjoern A. Zeeb static_assert(sizeof(struct rtw89_mac_mrc_tsf_rpt) <= RTW89_COMPLETION_BUF_SIZE);
37266d67aabdSBjoern A. Zeeb 
37276d67aabdSBjoern A. Zeeb struct rtw89_c2h_mrc_tsf_rpt_info {
37286d67aabdSBjoern A. Zeeb 	__le32 tsf_low;
37296d67aabdSBjoern A. Zeeb 	__le32 tsf_high;
37306d67aabdSBjoern A. Zeeb } __packed;
37316d67aabdSBjoern A. Zeeb 
37326d67aabdSBjoern A. Zeeb struct rtw89_c2h_mrc_tsf_rpt {
37336d67aabdSBjoern A. Zeeb 	struct rtw89_c2h_hdr hdr;
37346d67aabdSBjoern A. Zeeb 	__le32 w2;
37356d67aabdSBjoern A. Zeeb 	struct rtw89_c2h_mrc_tsf_rpt_info infos[];
37366d67aabdSBjoern A. Zeeb } __packed;
37376d67aabdSBjoern A. Zeeb 
37386d67aabdSBjoern A. Zeeb #define RTW89_C2H_MRC_TSF_RPT_W2_REQ_TSF_NUM GENMASK(7, 0)
37396d67aabdSBjoern A. Zeeb 
37406d67aabdSBjoern A. Zeeb struct rtw89_c2h_mrc_status_rpt {
37416d67aabdSBjoern A. Zeeb 	struct rtw89_c2h_hdr hdr;
37426d67aabdSBjoern A. Zeeb 	__le32 w2;
37436d67aabdSBjoern A. Zeeb 	__le32 tsf_low;
37446d67aabdSBjoern A. Zeeb 	__le32 tsf_high;
37456d67aabdSBjoern A. Zeeb } __packed;
37466d67aabdSBjoern A. Zeeb 
37476d67aabdSBjoern A. Zeeb #define RTW89_C2H_MRC_STATUS_RPT_W2_STATUS GENMASK(5, 0)
37486d67aabdSBjoern A. Zeeb #define RTW89_C2H_MRC_STATUS_RPT_W2_SCH_IDX GENMASK(7, 6)
37496d67aabdSBjoern A. Zeeb 
3750e2340276SBjoern A. Zeeb struct rtw89_c2h_pkt_ofld_rsp {
3751e2340276SBjoern A. Zeeb 	__le32 w0;
3752e2340276SBjoern A. Zeeb 	__le32 w1;
3753e2340276SBjoern A. Zeeb 	__le32 w2;
3754e2340276SBjoern A. Zeeb } __packed;
3755e2340276SBjoern A. Zeeb 
3756e2340276SBjoern A. Zeeb #define RTW89_C2H_PKT_OFLD_RSP_W2_PTK_ID GENMASK(7, 0)
3757e2340276SBjoern A. Zeeb #define RTW89_C2H_PKT_OFLD_RSP_W2_PTK_OP GENMASK(10, 8)
3758e2340276SBjoern A. Zeeb #define RTW89_C2H_PKT_OFLD_RSP_W2_PTK_LEN GENMASK(31, 16)
3759e2340276SBjoern A. Zeeb 
3760*df279a26SBjoern A. Zeeb struct rtw89_c2h_tx_duty_rpt {
3761*df279a26SBjoern A. Zeeb 	struct rtw89_c2h_hdr c2h_hdr;
3762*df279a26SBjoern A. Zeeb 	__le32 w2;
3763*df279a26SBjoern A. Zeeb } __packed;
3764*df279a26SBjoern A. Zeeb 
3765*df279a26SBjoern A. Zeeb #define RTW89_C2H_TX_DUTY_RPT_W2_TIMER_ERR GENMASK(2, 0)
3766*df279a26SBjoern A. Zeeb 
37676d67aabdSBjoern A. Zeeb struct rtw89_c2h_wow_aoac_report {
37686d67aabdSBjoern A. Zeeb 	struct rtw89_c2h_hdr c2h_hdr;
37696d67aabdSBjoern A. Zeeb 	u8 rpt_ver;
37706d67aabdSBjoern A. Zeeb 	u8 sec_type;
37716d67aabdSBjoern A. Zeeb 	u8 key_idx;
37726d67aabdSBjoern A. Zeeb 	u8 pattern_idx;
37736d67aabdSBjoern A. Zeeb 	u8 rekey_ok;
37746d67aabdSBjoern A. Zeeb 	u8 rsvd1[3];
37756d67aabdSBjoern A. Zeeb 	u8 ptk_tx_iv[8];
37766d67aabdSBjoern A. Zeeb 	u8 eapol_key_replay_count[8];
37776d67aabdSBjoern A. Zeeb 	u8 gtk[32];
37786d67aabdSBjoern A. Zeeb 	u8 ptk_rx_iv[8];
37796d67aabdSBjoern A. Zeeb 	u8 gtk_rx_iv[4][8];
37806d67aabdSBjoern A. Zeeb 	__le64 igtk_key_id;
37816d67aabdSBjoern A. Zeeb 	__le64 igtk_ipn;
37826d67aabdSBjoern A. Zeeb 	u8 igtk[32];
37836d67aabdSBjoern A. Zeeb 	u8 csa_pri_ch;
37846d67aabdSBjoern A. Zeeb 	u8 csa_bw_ch_offset;
37856d67aabdSBjoern A. Zeeb 	u8 csa_ch_band_chsw_failed;
37866d67aabdSBjoern A. Zeeb 	u8 csa_rsvd1;
37876d67aabdSBjoern A. Zeeb } __packed;
37886d67aabdSBjoern A. Zeeb 
37896d67aabdSBjoern A. Zeeb #define RTW89_C2H_WOW_AOAC_RPT_REKEY_IDX BIT(0)
37906d67aabdSBjoern A. Zeeb 
3791*df279a26SBjoern A. Zeeb struct rtw89_c2h_pwr_int_notify {
3792*df279a26SBjoern A. Zeeb 	struct rtw89_c2h_hdr hdr;
3793*df279a26SBjoern A. Zeeb 	__le32 w2;
3794*df279a26SBjoern A. Zeeb } __packed;
3795*df279a26SBjoern A. Zeeb 
3796*df279a26SBjoern A. Zeeb #define RTW89_C2H_PWR_INT_NOTIFY_W2_MACID GENMASK(15, 0)
3797*df279a26SBjoern A. Zeeb #define RTW89_C2H_PWR_INT_NOTIFY_W2_PWR_STATUS BIT(16)
3798*df279a26SBjoern A. Zeeb 
3799*df279a26SBjoern A. Zeeb struct rtw89_h2c_tx_duty {
3800*df279a26SBjoern A. Zeeb 	__le32 w0;
3801*df279a26SBjoern A. Zeeb 	__le32 w1;
3802*df279a26SBjoern A. Zeeb } __packed;
3803*df279a26SBjoern A. Zeeb 
3804*df279a26SBjoern A. Zeeb #define RTW89_H2C_TX_DUTY_W0_PAUSE_INTVL_MASK GENMASK(15, 0)
3805*df279a26SBjoern A. Zeeb #define RTW89_H2C_TX_DUTY_W0_TX_INTVL_MASK GENMASK(31, 16)
3806*df279a26SBjoern A. Zeeb #define RTW89_H2C_TX_DUTY_W1_STOP BIT(0)
3807*df279a26SBjoern A. Zeeb 
3808e2340276SBjoern A. Zeeb struct rtw89_h2c_bcnfltr {
3809e2340276SBjoern A. Zeeb 	__le32 w0;
3810e2340276SBjoern A. Zeeb } __packed;
3811e2340276SBjoern A. Zeeb 
3812e2340276SBjoern A. Zeeb #define RTW89_H2C_BCNFLTR_W0_MON_RSSI BIT(0)
3813e2340276SBjoern A. Zeeb #define RTW89_H2C_BCNFLTR_W0_MON_BCN BIT(1)
3814e2340276SBjoern A. Zeeb #define RTW89_H2C_BCNFLTR_W0_MON_EN BIT(2)
3815e2340276SBjoern A. Zeeb #define RTW89_H2C_BCNFLTR_W0_MODE GENMASK(4, 3)
3816e2340276SBjoern A. Zeeb #define RTW89_H2C_BCNFLTR_W0_BCN_LOSS_CNT GENMASK(11, 8)
3817e2340276SBjoern A. Zeeb #define RTW89_H2C_BCNFLTR_W0_RSSI_HYST GENMASK(15, 12)
3818e2340276SBjoern A. Zeeb #define RTW89_H2C_BCNFLTR_W0_RSSI_THRESHOLD GENMASK(23, 16)
3819e2340276SBjoern A. Zeeb #define RTW89_H2C_BCNFLTR_W0_MAC_ID GENMASK(31, 24)
3820e2340276SBjoern A. Zeeb 
3821e2340276SBjoern A. Zeeb struct rtw89_h2c_ofld_rssi {
3822e2340276SBjoern A. Zeeb 	__le32 w0;
3823e2340276SBjoern A. Zeeb 	__le32 w1;
3824e2340276SBjoern A. Zeeb } __packed;
3825e2340276SBjoern A. Zeeb 
3826e2340276SBjoern A. Zeeb #define RTW89_H2C_OFLD_RSSI_W0_MACID GENMASK(7, 0)
3827e2340276SBjoern A. Zeeb #define RTW89_H2C_OFLD_RSSI_W0_NUM GENMASK(15, 8)
3828e2340276SBjoern A. Zeeb #define RTW89_H2C_OFLD_RSSI_W1_VAL GENMASK(7, 0)
3829e2340276SBjoern A. Zeeb 
3830e2340276SBjoern A. Zeeb struct rtw89_h2c_ofld {
3831e2340276SBjoern A. Zeeb 	__le32 w0;
3832e2340276SBjoern A. Zeeb } __packed;
3833e2340276SBjoern A. Zeeb 
3834e2340276SBjoern A. Zeeb #define RTW89_H2C_OFLD_W0_MAC_ID GENMASK(7, 0)
3835e2340276SBjoern A. Zeeb #define RTW89_H2C_OFLD_W0_TX_TP GENMASK(17, 8)
3836e2340276SBjoern A. Zeeb #define RTW89_H2C_OFLD_W0_RX_TP GENMASK(27, 18)
38378e93258fSBjoern A. Zeeb 
38388e93258fSBjoern A. Zeeb #define RTW89_MFW_SIG	0xFF
38398e93258fSBjoern A. Zeeb 
38408e93258fSBjoern A. Zeeb struct rtw89_mfw_info {
38418e93258fSBjoern A. Zeeb 	u8 cv;
38428e93258fSBjoern A. Zeeb 	u8 type; /* enum rtw89_fw_type */
38438e93258fSBjoern A. Zeeb 	u8 mp;
38448e93258fSBjoern A. Zeeb 	u8 rsvd;
38458e93258fSBjoern A. Zeeb 	__le32 shift;
38468e93258fSBjoern A. Zeeb 	__le32 size;
38478e93258fSBjoern A. Zeeb 	u8 rsvd2[4];
38488e93258fSBjoern A. Zeeb } __packed;
38498e93258fSBjoern A. Zeeb 
38508e93258fSBjoern A. Zeeb struct rtw89_mfw_hdr {
38518e93258fSBjoern A. Zeeb 	u8 sig;	/* RTW89_MFW_SIG */
38528e93258fSBjoern A. Zeeb 	u8 fw_nr;
38538e93258fSBjoern A. Zeeb 	u8 rsvd0[2];
38548e93258fSBjoern A. Zeeb 	struct {
38558e93258fSBjoern A. Zeeb 		u8 major;
38568e93258fSBjoern A. Zeeb 		u8 minor;
38578e93258fSBjoern A. Zeeb 		u8 sub;
38588e93258fSBjoern A. Zeeb 		u8 idx;
38598e93258fSBjoern A. Zeeb 	} ver;
38608e93258fSBjoern A. Zeeb 	u8 rsvd1[8];
38618e93258fSBjoern A. Zeeb 	struct rtw89_mfw_info info[];
38628e93258fSBjoern A. Zeeb } __packed;
38638e93258fSBjoern A. Zeeb 
3864e2340276SBjoern A. Zeeb struct rtw89_fw_logsuit_hdr {
3865e2340276SBjoern A. Zeeb 	__le32 rsvd;
3866e2340276SBjoern A. Zeeb 	__le32 count;
3867e2340276SBjoern A. Zeeb 	__le32 ids[];
3868e2340276SBjoern A. Zeeb } __packed;
3869e2340276SBjoern A. Zeeb 
3870e2340276SBjoern A. Zeeb #define RTW89_FW_ELEMENT_ALIGN 16
3871e2340276SBjoern A. Zeeb 
3872e2340276SBjoern A. Zeeb enum rtw89_fw_element_id {
3873e2340276SBjoern A. Zeeb 	RTW89_FW_ELEMENT_ID_BBMCU0 = 0,
3874e2340276SBjoern A. Zeeb 	RTW89_FW_ELEMENT_ID_BBMCU1 = 1,
3875e2340276SBjoern A. Zeeb 	RTW89_FW_ELEMENT_ID_BB_REG = 2,
3876e2340276SBjoern A. Zeeb 	RTW89_FW_ELEMENT_ID_BB_GAIN = 3,
3877e2340276SBjoern A. Zeeb 	RTW89_FW_ELEMENT_ID_RADIO_A = 4,
3878e2340276SBjoern A. Zeeb 	RTW89_FW_ELEMENT_ID_RADIO_B = 5,
3879e2340276SBjoern A. Zeeb 	RTW89_FW_ELEMENT_ID_RADIO_C = 6,
3880e2340276SBjoern A. Zeeb 	RTW89_FW_ELEMENT_ID_RADIO_D = 7,
3881e2340276SBjoern A. Zeeb 	RTW89_FW_ELEMENT_ID_RF_NCTL = 8,
38826d67aabdSBjoern A. Zeeb 	RTW89_FW_ELEMENT_ID_TXPWR_BYRATE = 9,
38836d67aabdSBjoern A. Zeeb 	RTW89_FW_ELEMENT_ID_TXPWR_LMT_2GHZ = 10,
38846d67aabdSBjoern A. Zeeb 	RTW89_FW_ELEMENT_ID_TXPWR_LMT_5GHZ = 11,
38856d67aabdSBjoern A. Zeeb 	RTW89_FW_ELEMENT_ID_TXPWR_LMT_6GHZ = 12,
38866d67aabdSBjoern A. Zeeb 	RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_2GHZ = 13,
38876d67aabdSBjoern A. Zeeb 	RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_5GHZ = 14,
38886d67aabdSBjoern A. Zeeb 	RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_6GHZ = 15,
38896d67aabdSBjoern A. Zeeb 	RTW89_FW_ELEMENT_ID_TX_SHAPE_LMT = 16,
38906d67aabdSBjoern A. Zeeb 	RTW89_FW_ELEMENT_ID_TX_SHAPE_LMT_RU = 17,
38916d67aabdSBjoern A. Zeeb 	RTW89_FW_ELEMENT_ID_TXPWR_TRK = 18,
38926d67aabdSBjoern A. Zeeb 	RTW89_FW_ELEMENT_ID_RFKLOG_FMT = 19,
3893e2340276SBjoern A. Zeeb 
3894e2340276SBjoern A. Zeeb 	RTW89_FW_ELEMENT_ID_NUM,
3895e2340276SBjoern A. Zeeb };
3896e2340276SBjoern A. Zeeb 
3897*df279a26SBjoern A. Zeeb #define BITS_OF_RTW89_TXPWR_FW_ELEMENTS_NO_6GHZ \
38986d67aabdSBjoern A. Zeeb 	(BIT(RTW89_FW_ELEMENT_ID_TXPWR_BYRATE) | \
38996d67aabdSBjoern A. Zeeb 	 BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_2GHZ) | \
39006d67aabdSBjoern A. Zeeb 	 BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_5GHZ) | \
39016d67aabdSBjoern A. Zeeb 	 BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_2GHZ) | \
39026d67aabdSBjoern A. Zeeb 	 BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_5GHZ) | \
39036d67aabdSBjoern A. Zeeb 	 BIT(RTW89_FW_ELEMENT_ID_TX_SHAPE_LMT) | \
39046d67aabdSBjoern A. Zeeb 	 BIT(RTW89_FW_ELEMENT_ID_TX_SHAPE_LMT_RU))
39056d67aabdSBjoern A. Zeeb 
3906*df279a26SBjoern A. Zeeb #define BITS_OF_RTW89_TXPWR_FW_ELEMENTS \
3907*df279a26SBjoern A. Zeeb 	(BITS_OF_RTW89_TXPWR_FW_ELEMENTS_NO_6GHZ | \
3908*df279a26SBjoern A. Zeeb 	 BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_6GHZ) | \
3909*df279a26SBjoern A. Zeeb 	 BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_6GHZ))
3910*df279a26SBjoern A. Zeeb 
3911*df279a26SBjoern A. Zeeb #define RTW89_AX_GEN_DEF_NEEDED_FW_ELEMENTS_NO_6GHZ \
3912*df279a26SBjoern A. Zeeb 	(BIT(RTW89_FW_ELEMENT_ID_BB_REG) | \
3913*df279a26SBjoern A. Zeeb 	 BIT(RTW89_FW_ELEMENT_ID_RADIO_A) | \
3914*df279a26SBjoern A. Zeeb 	 BIT(RTW89_FW_ELEMENT_ID_RADIO_B) | \
3915*df279a26SBjoern A. Zeeb 	 BIT(RTW89_FW_ELEMENT_ID_RF_NCTL) | \
3916*df279a26SBjoern A. Zeeb 	 BIT(RTW89_FW_ELEMENT_ID_TXPWR_TRK) | \
3917*df279a26SBjoern A. Zeeb 	 BITS_OF_RTW89_TXPWR_FW_ELEMENTS_NO_6GHZ)
3918*df279a26SBjoern A. Zeeb 
39196d67aabdSBjoern A. Zeeb #define RTW89_BE_GEN_DEF_NEEDED_FW_ELEMENTS (BIT(RTW89_FW_ELEMENT_ID_BBMCU0) | \
39206d67aabdSBjoern A. Zeeb 					     BIT(RTW89_FW_ELEMENT_ID_BB_REG) | \
39216d67aabdSBjoern A. Zeeb 					     BIT(RTW89_FW_ELEMENT_ID_RADIO_A) | \
39226d67aabdSBjoern A. Zeeb 					     BIT(RTW89_FW_ELEMENT_ID_RADIO_B) | \
39236d67aabdSBjoern A. Zeeb 					     BIT(RTW89_FW_ELEMENT_ID_RF_NCTL) | \
39246d67aabdSBjoern A. Zeeb 					     BIT(RTW89_FW_ELEMENT_ID_TXPWR_TRK) | \
39256d67aabdSBjoern A. Zeeb 					     BITS_OF_RTW89_TXPWR_FW_ELEMENTS)
39266d67aabdSBjoern A. Zeeb 
39276d67aabdSBjoern A. Zeeb struct __rtw89_fw_txpwr_element {
39286d67aabdSBjoern A. Zeeb 	u8 rsvd0;
39296d67aabdSBjoern A. Zeeb 	u8 rsvd1;
39306d67aabdSBjoern A. Zeeb 	u8 rfe_type;
39316d67aabdSBjoern A. Zeeb 	u8 ent_sz;
39326d67aabdSBjoern A. Zeeb 	__le32 num_ents;
39336d67aabdSBjoern A. Zeeb 	u8 content[];
39346d67aabdSBjoern A. Zeeb } __packed;
39356d67aabdSBjoern A. Zeeb 
39366d67aabdSBjoern A. Zeeb enum rtw89_fw_txpwr_trk_type {
39376d67aabdSBjoern A. Zeeb 	__RTW89_FW_TXPWR_TRK_TYPE_6GHZ_START = 0,
39386d67aabdSBjoern A. Zeeb 	RTW89_FW_TXPWR_TRK_TYPE_6GB_N = 0,
39396d67aabdSBjoern A. Zeeb 	RTW89_FW_TXPWR_TRK_TYPE_6GB_P = 1,
39406d67aabdSBjoern A. Zeeb 	RTW89_FW_TXPWR_TRK_TYPE_6GA_N = 2,
39416d67aabdSBjoern A. Zeeb 	RTW89_FW_TXPWR_TRK_TYPE_6GA_P = 3,
39426d67aabdSBjoern A. Zeeb 	__RTW89_FW_TXPWR_TRK_TYPE_6GHZ_MAX = 3,
39436d67aabdSBjoern A. Zeeb 
39446d67aabdSBjoern A. Zeeb 	__RTW89_FW_TXPWR_TRK_TYPE_5GHZ_START = 4,
39456d67aabdSBjoern A. Zeeb 	RTW89_FW_TXPWR_TRK_TYPE_5GB_N = 4,
39466d67aabdSBjoern A. Zeeb 	RTW89_FW_TXPWR_TRK_TYPE_5GB_P = 5,
39476d67aabdSBjoern A. Zeeb 	RTW89_FW_TXPWR_TRK_TYPE_5GA_N = 6,
39486d67aabdSBjoern A. Zeeb 	RTW89_FW_TXPWR_TRK_TYPE_5GA_P = 7,
39496d67aabdSBjoern A. Zeeb 	__RTW89_FW_TXPWR_TRK_TYPE_5GHZ_MAX = 7,
39506d67aabdSBjoern A. Zeeb 
39516d67aabdSBjoern A. Zeeb 	__RTW89_FW_TXPWR_TRK_TYPE_2GHZ_START = 8,
39526d67aabdSBjoern A. Zeeb 	RTW89_FW_TXPWR_TRK_TYPE_2GB_N = 8,
39536d67aabdSBjoern A. Zeeb 	RTW89_FW_TXPWR_TRK_TYPE_2GB_P = 9,
39546d67aabdSBjoern A. Zeeb 	RTW89_FW_TXPWR_TRK_TYPE_2GA_N = 10,
39556d67aabdSBjoern A. Zeeb 	RTW89_FW_TXPWR_TRK_TYPE_2GA_P = 11,
39566d67aabdSBjoern A. Zeeb 	RTW89_FW_TXPWR_TRK_TYPE_2G_CCK_B_N = 12,
39576d67aabdSBjoern A. Zeeb 	RTW89_FW_TXPWR_TRK_TYPE_2G_CCK_B_P = 13,
39586d67aabdSBjoern A. Zeeb 	RTW89_FW_TXPWR_TRK_TYPE_2G_CCK_A_N = 14,
39596d67aabdSBjoern A. Zeeb 	RTW89_FW_TXPWR_TRK_TYPE_2G_CCK_A_P = 15,
39606d67aabdSBjoern A. Zeeb 	__RTW89_FW_TXPWR_TRK_TYPE_2GHZ_MAX = 15,
39616d67aabdSBjoern A. Zeeb 
39626d67aabdSBjoern A. Zeeb 	RTW89_FW_TXPWR_TRK_TYPE_NR,
39636d67aabdSBjoern A. Zeeb };
39646d67aabdSBjoern A. Zeeb 
39656d67aabdSBjoern A. Zeeb struct rtw89_fw_txpwr_track_cfg {
39666d67aabdSBjoern A. Zeeb 	const s8 (*delta[RTW89_FW_TXPWR_TRK_TYPE_NR])[DELTA_SWINGIDX_SIZE];
39676d67aabdSBjoern A. Zeeb };
39686d67aabdSBjoern A. Zeeb 
39696d67aabdSBjoern A. Zeeb #define RTW89_DEFAULT_NEEDED_FW_TXPWR_TRK_6GHZ \
39706d67aabdSBjoern A. Zeeb 	(BIT(RTW89_FW_TXPWR_TRK_TYPE_6GB_N) | \
39716d67aabdSBjoern A. Zeeb 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_6GB_P) | \
39726d67aabdSBjoern A. Zeeb 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_6GA_N) | \
39736d67aabdSBjoern A. Zeeb 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_6GA_P))
39746d67aabdSBjoern A. Zeeb #define RTW89_DEFAULT_NEEDED_FW_TXPWR_TRK_5GHZ \
39756d67aabdSBjoern A. Zeeb 	(BIT(RTW89_FW_TXPWR_TRK_TYPE_5GB_N) | \
39766d67aabdSBjoern A. Zeeb 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_5GB_P) | \
39776d67aabdSBjoern A. Zeeb 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_5GA_N) | \
39786d67aabdSBjoern A. Zeeb 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_5GA_P))
39796d67aabdSBjoern A. Zeeb #define RTW89_DEFAULT_NEEDED_FW_TXPWR_TRK_2GHZ \
39806d67aabdSBjoern A. Zeeb 	(BIT(RTW89_FW_TXPWR_TRK_TYPE_2GB_N) | \
39816d67aabdSBjoern A. Zeeb 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_2GB_P) | \
39826d67aabdSBjoern A. Zeeb 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_2GA_N) | \
39836d67aabdSBjoern A. Zeeb 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_2GA_P) | \
39846d67aabdSBjoern A. Zeeb 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_2G_CCK_B_N) | \
39856d67aabdSBjoern A. Zeeb 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_2G_CCK_B_P) | \
39866d67aabdSBjoern A. Zeeb 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_2G_CCK_A_N) | \
39876d67aabdSBjoern A. Zeeb 	 BIT(RTW89_FW_TXPWR_TRK_TYPE_2G_CCK_A_P))
39886d67aabdSBjoern A. Zeeb 
3989e2340276SBjoern A. Zeeb struct rtw89_fw_element_hdr {
3990e2340276SBjoern A. Zeeb 	__le32 id; /* enum rtw89_fw_element_id */
3991e2340276SBjoern A. Zeeb 	__le32 size; /* exclude header size */
3992e2340276SBjoern A. Zeeb 	u8 ver[4];
3993e2340276SBjoern A. Zeeb 	__le32 rsvd0;
3994e2340276SBjoern A. Zeeb 	__le32 rsvd1;
3995e2340276SBjoern A. Zeeb 	__le32 rsvd2;
3996e2340276SBjoern A. Zeeb 	union {
3997e2340276SBjoern A. Zeeb 		struct {
3998e2340276SBjoern A. Zeeb 			u8 priv[8];
3999e2340276SBjoern A. Zeeb 			u8 contents[];
4000e2340276SBjoern A. Zeeb 		} __packed common;
4001e2340276SBjoern A. Zeeb 		struct {
4002e2340276SBjoern A. Zeeb 			u8 idx;
4003e2340276SBjoern A. Zeeb 			u8 rsvd[7];
4004e2340276SBjoern A. Zeeb 			struct {
4005e2340276SBjoern A. Zeeb 				__le32 addr;
4006e2340276SBjoern A. Zeeb 				__le32 data;
4007e2340276SBjoern A. Zeeb 			} __packed regs[];
4008e2340276SBjoern A. Zeeb 		} __packed reg2;
40096d67aabdSBjoern A. Zeeb 		struct {
40106d67aabdSBjoern A. Zeeb 			u8 cv;
40116d67aabdSBjoern A. Zeeb 			u8 priv[7];
40126d67aabdSBjoern A. Zeeb 			u8 contents[];
40136d67aabdSBjoern A. Zeeb 		} __packed bbmcu;
40146d67aabdSBjoern A. Zeeb 		struct {
40156d67aabdSBjoern A. Zeeb 			__le32 bitmap; /* bitmap of enum rtw89_fw_txpwr_trk_type */
40166d67aabdSBjoern A. Zeeb 			__le32 rsvd;
40176d67aabdSBjoern A. Zeeb 			s8 contents[][DELTA_SWINGIDX_SIZE];
40186d67aabdSBjoern A. Zeeb 		} __packed txpwr_trk;
40196d67aabdSBjoern A. Zeeb 		struct {
40206d67aabdSBjoern A. Zeeb 			u8 nr;
40216d67aabdSBjoern A. Zeeb 			u8 rsvd[3];
40226d67aabdSBjoern A. Zeeb 			u8 rfk_id; /* enum rtw89_phy_c2h_rfk_log_func */
40236d67aabdSBjoern A. Zeeb 			u8 rsvd1[3];
40246d67aabdSBjoern A. Zeeb 			__le16 offset[];
40256d67aabdSBjoern A. Zeeb 		} __packed rfk_log_fmt;
40266d67aabdSBjoern A. Zeeb 		struct __rtw89_fw_txpwr_element txpwr;
4027e2340276SBjoern A. Zeeb 	} __packed u;
4028e2340276SBjoern A. Zeeb } __packed;
4029e2340276SBjoern A. Zeeb 
40308e93258fSBjoern A. Zeeb struct fwcmd_hdr {
40318e93258fSBjoern A. Zeeb 	__le32 hdr0;
40328e93258fSBjoern A. Zeeb 	__le32 hdr1;
40338e93258fSBjoern A. Zeeb };
40348e93258fSBjoern A. Zeeb 
4035e2340276SBjoern A. Zeeb union rtw89_compat_fw_hdr {
4036e2340276SBjoern A. Zeeb 	struct rtw89_mfw_hdr mfw_hdr;
4037e2340276SBjoern A. Zeeb 	struct rtw89_fw_hdr fw_hdr;
4038e2340276SBjoern A. Zeeb };
4039e2340276SBjoern A. Zeeb 
4040e2340276SBjoern A. Zeeb static inline u32 rtw89_compat_fw_hdr_ver_code(const void *fw_buf)
4041e2340276SBjoern A. Zeeb {
4042e2340276SBjoern A. Zeeb 	const union rtw89_compat_fw_hdr *compat = (typeof(compat))fw_buf;
4043e2340276SBjoern A. Zeeb 
4044e2340276SBjoern A. Zeeb 	if (compat->mfw_hdr.sig == RTW89_MFW_SIG)
4045e2340276SBjoern A. Zeeb 		return RTW89_MFW_HDR_VER_CODE(&compat->mfw_hdr);
4046e2340276SBjoern A. Zeeb 	else
4047e2340276SBjoern A. Zeeb 		return RTW89_FW_HDR_VER_CODE(&compat->fw_hdr);
4048e2340276SBjoern A. Zeeb }
4049e2340276SBjoern A. Zeeb 
4050e2340276SBjoern A. Zeeb static inline void rtw89_fw_get_filename(char *buf, size_t size,
4051e2340276SBjoern A. Zeeb 					 const char *fw_basename, int fw_format)
4052e2340276SBjoern A. Zeeb {
4053e2340276SBjoern A. Zeeb 	if (fw_format <= 0)
4054e2340276SBjoern A. Zeeb 		snprintf(buf, size, "%s.bin", fw_basename);
4055e2340276SBjoern A. Zeeb 	else
4056e2340276SBjoern A. Zeeb 		snprintf(buf, size, "%s-%d.bin", fw_basename, fw_format);
4057e2340276SBjoern A. Zeeb }
4058e2340276SBjoern A. Zeeb 
40598e93258fSBjoern A. Zeeb #define RTW89_H2C_RF_PAGE_SIZE 500
40608e93258fSBjoern A. Zeeb #define RTW89_H2C_RF_PAGE_NUM 3
40618e93258fSBjoern A. Zeeb struct rtw89_fw_h2c_rf_reg_info {
40628e93258fSBjoern A. Zeeb 	enum rtw89_rf_path rf_path;
40638e93258fSBjoern A. Zeeb 	__le32 rtw89_phy_config_rf_h2c[RTW89_H2C_RF_PAGE_NUM][RTW89_H2C_RF_PAGE_SIZE];
40648e93258fSBjoern A. Zeeb 	u16 curr_idx;
40658e93258fSBjoern A. Zeeb };
40668e93258fSBjoern A. Zeeb 
40678e93258fSBjoern A. Zeeb #define H2C_SEC_CAM_LEN			24
40688e93258fSBjoern A. Zeeb 
40698e93258fSBjoern A. Zeeb #define H2C_HEADER_LEN			8
40708e93258fSBjoern A. Zeeb #define H2C_HDR_CAT			GENMASK(1, 0)
40718e93258fSBjoern A. Zeeb #define H2C_HDR_CLASS			GENMASK(7, 2)
40728e93258fSBjoern A. Zeeb #define H2C_HDR_FUNC			GENMASK(15, 8)
40738e93258fSBjoern A. Zeeb #define H2C_HDR_DEL_TYPE		GENMASK(19, 16)
40748e93258fSBjoern A. Zeeb #define H2C_HDR_H2C_SEQ			GENMASK(31, 24)
40758e93258fSBjoern A. Zeeb #define H2C_HDR_TOTAL_LEN		GENMASK(13, 0)
40768e93258fSBjoern A. Zeeb #define H2C_HDR_REC_ACK			BIT(14)
40778e93258fSBjoern A. Zeeb #define H2C_HDR_DONE_ACK		BIT(15)
40788e93258fSBjoern A. Zeeb 
40798e93258fSBjoern A. Zeeb #define FWCMD_TYPE_H2C			0
40808e93258fSBjoern A. Zeeb 
40818e93258fSBjoern A. Zeeb #define H2C_CAT_TEST		0x0
40828e93258fSBjoern A. Zeeb 
40838e93258fSBjoern A. Zeeb /* CLASS 5 - FW STATUS TEST */
40848e93258fSBjoern A. Zeeb #define H2C_CL_FW_STATUS_TEST		0x5
40858e93258fSBjoern A. Zeeb #define H2C_FUNC_CPU_EXCEPTION		0x1
40868e93258fSBjoern A. Zeeb 
40878e93258fSBjoern A. Zeeb #define H2C_CAT_MAC		0x1
40888e93258fSBjoern A. Zeeb 
40898e93258fSBjoern A. Zeeb /* CLASS 0 - FW INFO */
40908e93258fSBjoern A. Zeeb #define H2C_CL_FW_INFO			0x0
40918e93258fSBjoern A. Zeeb #define H2C_FUNC_LOG_CFG		0x0
40928e93258fSBjoern A. Zeeb #define H2C_FUNC_MAC_GENERAL_PKT	0x1
40938e93258fSBjoern A. Zeeb 
4094e2340276SBjoern A. Zeeb /* CLASS 1 - WOW */
4095e2340276SBjoern A. Zeeb #define H2C_CL_MAC_WOW			0x1
40966d67aabdSBjoern A. Zeeb enum rtw89_wow_h2c_func {
40976d67aabdSBjoern A. Zeeb 	H2C_FUNC_KEEP_ALIVE		= 0x0,
40986d67aabdSBjoern A. Zeeb 	H2C_FUNC_DISCONNECT_DETECT	= 0x1,
40996d67aabdSBjoern A. Zeeb 	H2C_FUNC_WOW_GLOBAL		= 0x2,
41006d67aabdSBjoern A. Zeeb 	H2C_FUNC_GTK_OFLD		= 0x3,
41016d67aabdSBjoern A. Zeeb 	H2C_FUNC_ARP_OFLD		= 0x4,
4102*df279a26SBjoern A. Zeeb 	H2C_FUNC_NLO			= 0x7,
41036d67aabdSBjoern A. Zeeb 	H2C_FUNC_WAKEUP_CTRL		= 0x8,
41046d67aabdSBjoern A. Zeeb 	H2C_FUNC_WOW_CAM_UPD		= 0xC,
41056d67aabdSBjoern A. Zeeb 	H2C_FUNC_AOAC_REPORT_REQ	= 0xD,
41066d67aabdSBjoern A. Zeeb 
41076d67aabdSBjoern A. Zeeb 	NUM_OF_RTW89_WOW_H2C_FUNC,
41086d67aabdSBjoern A. Zeeb };
41096d67aabdSBjoern A. Zeeb 
4110*df279a26SBjoern A. Zeeb #define RTW89_WOW_WAIT_COND(tag, func) \
4111*df279a26SBjoern A. Zeeb 	((tag) * NUM_OF_RTW89_WOW_H2C_FUNC + (func))
4112*df279a26SBjoern A. Zeeb 
4113*df279a26SBjoern A. Zeeb #define RTW89_WOW_WAIT_COND_AOAC \
4114*df279a26SBjoern A. Zeeb 	RTW89_WOW_WAIT_COND(0 /* don't care */, H2C_FUNC_AOAC_REPORT_REQ)
4115e2340276SBjoern A. Zeeb 
41168e93258fSBjoern A. Zeeb /* CLASS 2 - PS */
41178e93258fSBjoern A. Zeeb #define H2C_CL_MAC_PS			0x2
4118*df279a26SBjoern A. Zeeb enum rtw89_ps_h2c_func {
4119*df279a26SBjoern A. Zeeb 	H2C_FUNC_MAC_LPS_PARM		= 0x0,
4120*df279a26SBjoern A. Zeeb 	H2C_FUNC_P2P_ACT		= 0x1,
4121*df279a26SBjoern A. Zeeb 	H2C_FUNC_IPS_CFG		= 0x3,
4122*df279a26SBjoern A. Zeeb 
4123*df279a26SBjoern A. Zeeb 	NUM_OF_RTW89_PS_H2C_FUNC,
4124*df279a26SBjoern A. Zeeb };
4125*df279a26SBjoern A. Zeeb 
4126*df279a26SBjoern A. Zeeb #define RTW89_PS_WAIT_COND(tag, func) \
4127*df279a26SBjoern A. Zeeb 	((tag) * NUM_OF_RTW89_PS_H2C_FUNC + (func))
4128*df279a26SBjoern A. Zeeb 
4129*df279a26SBjoern A. Zeeb #define RTW89_PS_WAIT_COND_IPS_CFG \
4130*df279a26SBjoern A. Zeeb 	RTW89_PS_WAIT_COND(0 /* don't care */, H2C_FUNC_IPS_CFG)
41318e93258fSBjoern A. Zeeb 
41328e93258fSBjoern A. Zeeb /* CLASS 3 - FW download */
41338e93258fSBjoern A. Zeeb #define H2C_CL_MAC_FWDL		0x3
41348e93258fSBjoern A. Zeeb #define H2C_FUNC_MAC_FWHDR_DL		0x0
41358e93258fSBjoern A. Zeeb 
41368e93258fSBjoern A. Zeeb /* CLASS 5 - Frame Exchange */
41378e93258fSBjoern A. Zeeb #define H2C_CL_MAC_FR_EXCHG		0x5
41388e93258fSBjoern A. Zeeb #define H2C_FUNC_MAC_CCTLINFO_UD	0x2
41398e93258fSBjoern A. Zeeb #define H2C_FUNC_MAC_BCN_UPD		0x5
41408e93258fSBjoern A. Zeeb #define H2C_FUNC_MAC_DCTLINFO_UD_V1	0x9
41418e93258fSBjoern A. Zeeb #define H2C_FUNC_MAC_CCTLINFO_UD_V1	0xa
41426d67aabdSBjoern A. Zeeb #define H2C_FUNC_MAC_DCTLINFO_UD_V2	0xc
41436d67aabdSBjoern A. Zeeb #define H2C_FUNC_MAC_BCN_UPD_BE		0xd
41446d67aabdSBjoern A. Zeeb #define H2C_FUNC_MAC_CCTLINFO_UD_G7	0x11
41458e93258fSBjoern A. Zeeb 
41468e93258fSBjoern A. Zeeb /* CLASS 6 - Address CAM */
41478e93258fSBjoern A. Zeeb #define H2C_CL_MAC_ADDR_CAM_UPDATE	0x6
41488e93258fSBjoern A. Zeeb #define H2C_FUNC_MAC_ADDR_CAM_UPD	0x0
41498e93258fSBjoern A. Zeeb 
41508e93258fSBjoern A. Zeeb /* CLASS 8 - Media Status Report */
41518e93258fSBjoern A. Zeeb #define H2C_CL_MAC_MEDIA_RPT		0x8
41528e93258fSBjoern A. Zeeb #define H2C_FUNC_MAC_JOININFO		0x0
41538e93258fSBjoern A. Zeeb #define H2C_FUNC_MAC_FWROLE_MAINTAIN	0x4
41546d67aabdSBjoern A. Zeeb #define H2C_FUNC_NOTIFY_DBCC		0x5
41558e93258fSBjoern A. Zeeb 
41568e93258fSBjoern A. Zeeb /* CLASS 9 - FW offload */
41578e93258fSBjoern A. Zeeb #define H2C_CL_MAC_FW_OFLD		0x9
4158e2340276SBjoern A. Zeeb enum rtw89_fw_ofld_h2c_func {
4159e2340276SBjoern A. Zeeb 	H2C_FUNC_PACKET_OFLD		= 0x1,
4160e2340276SBjoern A. Zeeb 	H2C_FUNC_MAC_MACID_PAUSE	= 0x8,
4161e2340276SBjoern A. Zeeb 	H2C_FUNC_USR_EDCA		= 0xF,
4162e2340276SBjoern A. Zeeb 	H2C_FUNC_TSF32_TOGL		= 0x10,
4163e2340276SBjoern A. Zeeb 	H2C_FUNC_OFLD_CFG		= 0x14,
4164e2340276SBjoern A. Zeeb 	H2C_FUNC_ADD_SCANOFLD_CH	= 0x16,
4165e2340276SBjoern A. Zeeb 	H2C_FUNC_SCANOFLD		= 0x17,
4166*df279a26SBjoern A. Zeeb 	H2C_FUNC_TX_DUTY		= 0x18,
4167e2340276SBjoern A. Zeeb 	H2C_FUNC_PKT_DROP		= 0x1b,
4168e2340276SBjoern A. Zeeb 	H2C_FUNC_CFG_BCNFLTR		= 0x1e,
4169e2340276SBjoern A. Zeeb 	H2C_FUNC_OFLD_RSSI		= 0x1f,
4170e2340276SBjoern A. Zeeb 	H2C_FUNC_OFLD_TP		= 0x20,
41716d67aabdSBjoern A. Zeeb 	H2C_FUNC_MAC_MACID_PAUSE_SLEEP	= 0x28,
41726d67aabdSBjoern A. Zeeb 	H2C_FUNC_SCANOFLD_BE		= 0x2c,
4173e2340276SBjoern A. Zeeb 
4174e2340276SBjoern A. Zeeb 	NUM_OF_RTW89_FW_OFLD_H2C_FUNC,
4175e2340276SBjoern A. Zeeb };
4176e2340276SBjoern A. Zeeb 
4177e2340276SBjoern A. Zeeb #define RTW89_FW_OFLD_WAIT_COND(tag, func) \
4178e2340276SBjoern A. Zeeb 	((tag) * NUM_OF_RTW89_FW_OFLD_H2C_FUNC + (func))
4179e2340276SBjoern A. Zeeb 
4180e2340276SBjoern A. Zeeb #define RTW89_FW_OFLD_WAIT_COND_PKT_OFLD(pkt_id, pkt_op) \
4181e2340276SBjoern A. Zeeb 	RTW89_FW_OFLD_WAIT_COND(RTW89_PKT_OFLD_WAIT_TAG(pkt_id, pkt_op), \
4182e2340276SBjoern A. Zeeb 				H2C_FUNC_PACKET_OFLD)
41838e93258fSBjoern A. Zeeb 
41846d67aabdSBjoern A. Zeeb #define RTW89_SCANOFLD_WAIT_COND_ADD_CH RTW89_FW_OFLD_WAIT_COND(0, H2C_FUNC_ADD_SCANOFLD_CH)
41856d67aabdSBjoern A. Zeeb 
41866d67aabdSBjoern A. Zeeb #define RTW89_SCANOFLD_WAIT_COND_START RTW89_FW_OFLD_WAIT_COND(0, H2C_FUNC_SCANOFLD)
41876d67aabdSBjoern A. Zeeb #define RTW89_SCANOFLD_WAIT_COND_STOP RTW89_FW_OFLD_WAIT_COND(1, H2C_FUNC_SCANOFLD)
41886d67aabdSBjoern A. Zeeb #define RTW89_SCANOFLD_BE_WAIT_COND_START RTW89_FW_OFLD_WAIT_COND(0, H2C_FUNC_SCANOFLD_BE)
41896d67aabdSBjoern A. Zeeb #define RTW89_SCANOFLD_BE_WAIT_COND_STOP RTW89_FW_OFLD_WAIT_COND(1, H2C_FUNC_SCANOFLD_BE)
41906d67aabdSBjoern A. Zeeb 
41916d67aabdSBjoern A. Zeeb 
41928e93258fSBjoern A. Zeeb /* CLASS 10 - Security CAM */
41938e93258fSBjoern A. Zeeb #define H2C_CL_MAC_SEC_CAM		0xa
41948e93258fSBjoern A. Zeeb #define H2C_FUNC_MAC_SEC_UPD		0x1
41958e93258fSBjoern A. Zeeb 
41968e93258fSBjoern A. Zeeb /* CLASS 12 - BA CAM */
41978e93258fSBjoern A. Zeeb #define H2C_CL_BA_CAM			0xc
41988e93258fSBjoern A. Zeeb #define H2C_FUNC_MAC_BA_CAM		0x0
41996d67aabdSBjoern A. Zeeb #define H2C_FUNC_MAC_BA_CAM_V1		0x1
42006d67aabdSBjoern A. Zeeb #define H2C_FUNC_MAC_BA_CAM_INIT	0x2
42018e93258fSBjoern A. Zeeb 
4202e2340276SBjoern A. Zeeb /* CLASS 14 - MCC */
4203e2340276SBjoern A. Zeeb #define H2C_CL_MCC			0xe
4204e2340276SBjoern A. Zeeb enum rtw89_mcc_h2c_func {
4205e2340276SBjoern A. Zeeb 	H2C_FUNC_ADD_MCC		= 0x0,
4206e2340276SBjoern A. Zeeb 	H2C_FUNC_START_MCC		= 0x1,
4207e2340276SBjoern A. Zeeb 	H2C_FUNC_STOP_MCC		= 0x2,
4208e2340276SBjoern A. Zeeb 	H2C_FUNC_DEL_MCC_GROUP		= 0x3,
4209e2340276SBjoern A. Zeeb 	H2C_FUNC_RESET_MCC_GROUP	= 0x4,
4210e2340276SBjoern A. Zeeb 	H2C_FUNC_MCC_REQ_TSF		= 0x5,
4211e2340276SBjoern A. Zeeb 	H2C_FUNC_MCC_MACID_BITMAP	= 0x6,
4212e2340276SBjoern A. Zeeb 	H2C_FUNC_MCC_SYNC		= 0x7,
4213e2340276SBjoern A. Zeeb 	H2C_FUNC_MCC_SET_DURATION	= 0x8,
4214e2340276SBjoern A. Zeeb 
4215e2340276SBjoern A. Zeeb 	NUM_OF_RTW89_MCC_H2C_FUNC,
4216e2340276SBjoern A. Zeeb };
4217e2340276SBjoern A. Zeeb 
4218e2340276SBjoern A. Zeeb #define RTW89_MCC_WAIT_COND(group, func) \
4219e2340276SBjoern A. Zeeb 	((group) * NUM_OF_RTW89_MCC_H2C_FUNC + (func))
4220e2340276SBjoern A. Zeeb 
42216d67aabdSBjoern A. Zeeb /* CLASS 24 - MRC */
42226d67aabdSBjoern A. Zeeb #define H2C_CL_MRC			0x18
42236d67aabdSBjoern A. Zeeb enum rtw89_mrc_h2c_func {
42246d67aabdSBjoern A. Zeeb 	H2C_FUNC_MRC_REQ_TSF		= 0x0,
42256d67aabdSBjoern A. Zeeb 	H2C_FUNC_ADD_MRC		= 0x1,
42266d67aabdSBjoern A. Zeeb 	H2C_FUNC_START_MRC		= 0x2,
42276d67aabdSBjoern A. Zeeb 	H2C_FUNC_DEL_MRC		= 0x3,
42286d67aabdSBjoern A. Zeeb 	H2C_FUNC_MRC_SYNC		= 0x4,
42296d67aabdSBjoern A. Zeeb 	H2C_FUNC_MRC_UPD_DURATION	= 0x5,
42306d67aabdSBjoern A. Zeeb 	H2C_FUNC_MRC_UPD_BITMAP		= 0x6,
42316d67aabdSBjoern A. Zeeb 
42326d67aabdSBjoern A. Zeeb 	NUM_OF_RTW89_MRC_H2C_FUNC,
42336d67aabdSBjoern A. Zeeb };
42346d67aabdSBjoern A. Zeeb 
42356d67aabdSBjoern A. Zeeb /* can consider MRC's sch_idx as MCC's group */
42366d67aabdSBjoern A. Zeeb #define RTW89_MRC_WAIT_COND(sch_idx, func) \
42376d67aabdSBjoern A. Zeeb 	((sch_idx) * NUM_OF_RTW89_MRC_H2C_FUNC + (func))
42386d67aabdSBjoern A. Zeeb 
42396d67aabdSBjoern A. Zeeb #define RTW89_MRC_WAIT_COND_REQ_TSF \
42406d67aabdSBjoern A. Zeeb 	RTW89_MRC_WAIT_COND(0 /* don't care */, H2C_FUNC_MRC_REQ_TSF)
42416d67aabdSBjoern A. Zeeb 
4242*df279a26SBjoern A. Zeeb /* CLASS 36 - AP */
4243*df279a26SBjoern A. Zeeb #define H2C_CL_AP			0x24
4244*df279a26SBjoern A. Zeeb #define H2C_FUNC_AP_INFO 0x0
4245*df279a26SBjoern A. Zeeb 
42468e93258fSBjoern A. Zeeb #define H2C_CAT_OUTSRC			0x2
42478e93258fSBjoern A. Zeeb 
42488e93258fSBjoern A. Zeeb #define H2C_CL_OUTSRC_RA		0x1
42498e93258fSBjoern A. Zeeb #define H2C_FUNC_OUTSRC_RA_MACIDCFG	0x0
42508e93258fSBjoern A. Zeeb 
42516d67aabdSBjoern A. Zeeb #define H2C_CL_OUTSRC_DM		0x2
42526d67aabdSBjoern A. Zeeb #define H2C_FUNC_FW_LPS_CH_INFO		0xb
4253*df279a26SBjoern A. Zeeb #define H2C_FUNC_FW_LPS_ML_CMN_INFO	0xe
42546d67aabdSBjoern A. Zeeb 
42558e93258fSBjoern A. Zeeb #define H2C_CL_OUTSRC_RF_REG_A		0x8
42568e93258fSBjoern A. Zeeb #define H2C_CL_OUTSRC_RF_REG_B		0x9
42578e93258fSBjoern A. Zeeb #define H2C_CL_OUTSRC_RF_FW_NOTIFY	0xa
42588e93258fSBjoern A. Zeeb #define H2C_FUNC_OUTSRC_RF_GET_MCCCH	0x2
42596d67aabdSBjoern A. Zeeb #define H2C_CL_OUTSRC_RF_FW_RFK		0xb
42606d67aabdSBjoern A. Zeeb 
42616d67aabdSBjoern A. Zeeb enum rtw89_rfk_offload_h2c_func {
42626d67aabdSBjoern A. Zeeb 	H2C_FUNC_RFK_TSSI_OFFLOAD = 0x0,
42636d67aabdSBjoern A. Zeeb 	H2C_FUNC_RFK_IQK_OFFLOAD = 0x1,
42646d67aabdSBjoern A. Zeeb 	H2C_FUNC_RFK_DPK_OFFLOAD = 0x3,
42656d67aabdSBjoern A. Zeeb 	H2C_FUNC_RFK_TXGAPK_OFFLOAD = 0x4,
42666d67aabdSBjoern A. Zeeb 	H2C_FUNC_RFK_DACK_OFFLOAD = 0x5,
42676d67aabdSBjoern A. Zeeb 	H2C_FUNC_RFK_RXDCK_OFFLOAD = 0x6,
42686d67aabdSBjoern A. Zeeb 	H2C_FUNC_RFK_PRE_NOTIFY = 0x8,
42696d67aabdSBjoern A. Zeeb };
42708e93258fSBjoern A. Zeeb 
42718e93258fSBjoern A. Zeeb struct rtw89_fw_h2c_rf_get_mccch {
42728e93258fSBjoern A. Zeeb 	__le32 ch_0;
42738e93258fSBjoern A. Zeeb 	__le32 ch_1;
42748e93258fSBjoern A. Zeeb 	__le32 band_0;
42758e93258fSBjoern A. Zeeb 	__le32 band_1;
42768e93258fSBjoern A. Zeeb 	__le32 current_channel;
42778e93258fSBjoern A. Zeeb 	__le32 current_band_type;
42788e93258fSBjoern A. Zeeb } __packed;
42798e93258fSBjoern A. Zeeb 
42806d67aabdSBjoern A. Zeeb #define NUM_OF_RTW89_FW_RFK_PATH 2
42816d67aabdSBjoern A. Zeeb #define NUM_OF_RTW89_FW_RFK_TBL 3
42828e93258fSBjoern A. Zeeb 
4283*df279a26SBjoern A. Zeeb struct rtw89_fw_h2c_rfk_pre_info_common {
42846d67aabdSBjoern A. Zeeb 	struct {
42856d67aabdSBjoern A. Zeeb 		__le32 ch[NUM_OF_RTW89_FW_RFK_PATH][NUM_OF_RTW89_FW_RFK_TBL];
42866d67aabdSBjoern A. Zeeb 		__le32 band[NUM_OF_RTW89_FW_RFK_PATH][NUM_OF_RTW89_FW_RFK_TBL];
42876d67aabdSBjoern A. Zeeb 	} __packed dbcc;
42886d67aabdSBjoern A. Zeeb 
42896d67aabdSBjoern A. Zeeb 	__le32 mlo_mode;
42906d67aabdSBjoern A. Zeeb 	struct {
42916d67aabdSBjoern A. Zeeb 		__le32 cur_ch[NUM_OF_RTW89_FW_RFK_PATH];
42926d67aabdSBjoern A. Zeeb 		__le32 cur_band[NUM_OF_RTW89_FW_RFK_PATH];
42936d67aabdSBjoern A. Zeeb 	} __packed tbl;
42946d67aabdSBjoern A. Zeeb 
42956d67aabdSBjoern A. Zeeb 	__le32 phy_idx;
4296*df279a26SBjoern A. Zeeb } __packed;
4297*df279a26SBjoern A. Zeeb 
4298*df279a26SBjoern A. Zeeb struct rtw89_fw_h2c_rfk_pre_info_v0 {
4299*df279a26SBjoern A. Zeeb 	struct rtw89_fw_h2c_rfk_pre_info_common common;
4300*df279a26SBjoern A. Zeeb 
43016d67aabdSBjoern A. Zeeb 	__le32 cur_band;
43026d67aabdSBjoern A. Zeeb 	__le32 cur_bw;
43036d67aabdSBjoern A. Zeeb 	__le32 cur_center_ch;
43046d67aabdSBjoern A. Zeeb 
43056d67aabdSBjoern A. Zeeb 	__le32 ktbl_sel0;
43066d67aabdSBjoern A. Zeeb 	__le32 ktbl_sel1;
43076d67aabdSBjoern A. Zeeb 	__le32 rfmod0;
43086d67aabdSBjoern A. Zeeb 	__le32 rfmod1;
43096d67aabdSBjoern A. Zeeb 
43106d67aabdSBjoern A. Zeeb 	__le32 mlo_1_1;
43116d67aabdSBjoern A. Zeeb 	__le32 rfe_type;
43126d67aabdSBjoern A. Zeeb 	__le32 drv_mode;
43136d67aabdSBjoern A. Zeeb 
43146d67aabdSBjoern A. Zeeb 	struct {
43156d67aabdSBjoern A. Zeeb 		__le32 ch[NUM_OF_RTW89_FW_RFK_PATH];
43166d67aabdSBjoern A. Zeeb 		__le32 band[NUM_OF_RTW89_FW_RFK_PATH];
43176d67aabdSBjoern A. Zeeb 	} __packed mlo;
43186d67aabdSBjoern A. Zeeb } __packed;
43196d67aabdSBjoern A. Zeeb 
4320*df279a26SBjoern A. Zeeb struct rtw89_fw_h2c_rfk_pre_info_v1 {
4321*df279a26SBjoern A. Zeeb 	struct rtw89_fw_h2c_rfk_pre_info_common common;
4322*df279a26SBjoern A. Zeeb 	__le32 mlo_1_1;
4323*df279a26SBjoern A. Zeeb } __packed;
4324*df279a26SBjoern A. Zeeb 
4325*df279a26SBjoern A. Zeeb struct rtw89_fw_h2c_rfk_pre_info {
4326*df279a26SBjoern A. Zeeb 	struct rtw89_fw_h2c_rfk_pre_info_v1 base_v1;
4327*df279a26SBjoern A. Zeeb 	__le32 cur_bandwidth[NUM_OF_RTW89_FW_RFK_PATH];
4328*df279a26SBjoern A. Zeeb } __packed;
4329*df279a26SBjoern A. Zeeb 
43306d67aabdSBjoern A. Zeeb struct rtw89_h2c_rf_tssi {
43316d67aabdSBjoern A. Zeeb 	__le16 len;
43326d67aabdSBjoern A. Zeeb 	u8 phy;
43336d67aabdSBjoern A. Zeeb 	u8 ch;
43346d67aabdSBjoern A. Zeeb 	u8 bw;
43356d67aabdSBjoern A. Zeeb 	u8 band;
43366d67aabdSBjoern A. Zeeb 	u8 hwtx_en;
43376d67aabdSBjoern A. Zeeb 	u8 cv;
43386d67aabdSBjoern A. Zeeb 	s8 curr_tssi_cck_de[2];
43396d67aabdSBjoern A. Zeeb 	s8 curr_tssi_cck_de_20m[2];
43406d67aabdSBjoern A. Zeeb 	s8 curr_tssi_cck_de_40m[2];
43416d67aabdSBjoern A. Zeeb 	s8 curr_tssi_efuse_cck_de[2];
43426d67aabdSBjoern A. Zeeb 	s8 curr_tssi_ofdm_de[2];
43436d67aabdSBjoern A. Zeeb 	s8 curr_tssi_ofdm_de_20m[2];
43446d67aabdSBjoern A. Zeeb 	s8 curr_tssi_ofdm_de_40m[2];
43456d67aabdSBjoern A. Zeeb 	s8 curr_tssi_ofdm_de_80m[2];
43466d67aabdSBjoern A. Zeeb 	s8 curr_tssi_ofdm_de_160m[2];
43476d67aabdSBjoern A. Zeeb 	s8 curr_tssi_ofdm_de_320m[2];
43486d67aabdSBjoern A. Zeeb 	s8 curr_tssi_efuse_ofdm_de[2];
43496d67aabdSBjoern A. Zeeb 	s8 curr_tssi_ofdm_de_diff_20m[2];
43506d67aabdSBjoern A. Zeeb 	s8 curr_tssi_ofdm_de_diff_80m[2];
43516d67aabdSBjoern A. Zeeb 	s8 curr_tssi_ofdm_de_diff_160m[2];
43526d67aabdSBjoern A. Zeeb 	s8 curr_tssi_ofdm_de_diff_320m[2];
43536d67aabdSBjoern A. Zeeb 	s8 curr_tssi_trim_de[2];
43546d67aabdSBjoern A. Zeeb 	u8 pg_thermal[2];
43556d67aabdSBjoern A. Zeeb 	u8 ftable[2][128];
43566d67aabdSBjoern A. Zeeb 	u8 tssi_mode;
43576d67aabdSBjoern A. Zeeb } __packed;
43586d67aabdSBjoern A. Zeeb 
43596d67aabdSBjoern A. Zeeb struct rtw89_h2c_rf_iqk {
43606d67aabdSBjoern A. Zeeb 	__le32 phy_idx;
43616d67aabdSBjoern A. Zeeb 	__le32 dbcc;
43626d67aabdSBjoern A. Zeeb } __packed;
43636d67aabdSBjoern A. Zeeb 
43646d67aabdSBjoern A. Zeeb struct rtw89_h2c_rf_dpk {
43656d67aabdSBjoern A. Zeeb 	u8 len;
43666d67aabdSBjoern A. Zeeb 	u8 phy;
43676d67aabdSBjoern A. Zeeb 	u8 dpk_enable;
43686d67aabdSBjoern A. Zeeb 	u8 kpath;
43696d67aabdSBjoern A. Zeeb 	u8 cur_band;
43706d67aabdSBjoern A. Zeeb 	u8 cur_bw;
43716d67aabdSBjoern A. Zeeb 	u8 cur_ch;
43726d67aabdSBjoern A. Zeeb 	u8 dpk_dbg_en;
43736d67aabdSBjoern A. Zeeb } __packed;
43746d67aabdSBjoern A. Zeeb 
43756d67aabdSBjoern A. Zeeb struct rtw89_h2c_rf_txgapk {
43766d67aabdSBjoern A. Zeeb 	u8 len;
43776d67aabdSBjoern A. Zeeb 	u8 ktype;
43786d67aabdSBjoern A. Zeeb 	u8 phy;
43796d67aabdSBjoern A. Zeeb 	u8 kpath;
43806d67aabdSBjoern A. Zeeb 	u8 band;
43816d67aabdSBjoern A. Zeeb 	u8 bw;
43826d67aabdSBjoern A. Zeeb 	u8 ch;
43836d67aabdSBjoern A. Zeeb 	u8 cv;
43846d67aabdSBjoern A. Zeeb } __packed;
43856d67aabdSBjoern A. Zeeb 
43866d67aabdSBjoern A. Zeeb struct rtw89_h2c_rf_dack {
43876d67aabdSBjoern A. Zeeb 	__le32 len;
43886d67aabdSBjoern A. Zeeb 	__le32 phy;
43896d67aabdSBjoern A. Zeeb 	__le32 type;
43906d67aabdSBjoern A. Zeeb } __packed;
43916d67aabdSBjoern A. Zeeb 
4392*df279a26SBjoern A. Zeeb struct rtw89_h2c_rf_rxdck_v0 {
43936d67aabdSBjoern A. Zeeb 	u8 len;
43946d67aabdSBjoern A. Zeeb 	u8 phy;
43956d67aabdSBjoern A. Zeeb 	u8 is_afe;
43966d67aabdSBjoern A. Zeeb 	u8 kpath;
43976d67aabdSBjoern A. Zeeb 	u8 cur_band;
43986d67aabdSBjoern A. Zeeb 	u8 cur_bw;
43996d67aabdSBjoern A. Zeeb 	u8 cur_ch;
44006d67aabdSBjoern A. Zeeb 	u8 rxdck_dbg_en;
44016d67aabdSBjoern A. Zeeb } __packed;
44026d67aabdSBjoern A. Zeeb 
4403*df279a26SBjoern A. Zeeb struct rtw89_h2c_rf_rxdck {
4404*df279a26SBjoern A. Zeeb 	struct rtw89_h2c_rf_rxdck_v0 v0;
4405*df279a26SBjoern A. Zeeb 	u8 is_chl_k;
4406*df279a26SBjoern A. Zeeb } __packed;
4407*df279a26SBjoern A. Zeeb 
44086d67aabdSBjoern A. Zeeb enum rtw89_rf_log_type {
44096d67aabdSBjoern A. Zeeb 	RTW89_RF_RUN_LOG = 0,
44106d67aabdSBjoern A. Zeeb 	RTW89_RF_RPT_LOG = 1,
44116d67aabdSBjoern A. Zeeb };
44126d67aabdSBjoern A. Zeeb 
44136d67aabdSBjoern A. Zeeb struct rtw89_c2h_rf_log_hdr {
44146d67aabdSBjoern A. Zeeb 	u8 type; /* enum rtw89_rf_log_type */
44156d67aabdSBjoern A. Zeeb 	__le16 len;
44166d67aabdSBjoern A. Zeeb 	u8 content[];
44176d67aabdSBjoern A. Zeeb } __packed;
44186d67aabdSBjoern A. Zeeb 
44196d67aabdSBjoern A. Zeeb struct rtw89_c2h_rf_run_log {
44206d67aabdSBjoern A. Zeeb 	__le32 fmt_idx;
44216d67aabdSBjoern A. Zeeb 	__le32 arg[4];
44226d67aabdSBjoern A. Zeeb } __packed;
44236d67aabdSBjoern A. Zeeb 
4424*df279a26SBjoern A. Zeeb struct rtw89_c2h_rf_iqk_rpt_log {
4425*df279a26SBjoern A. Zeeb 	bool iqk_tx_fail[2];
4426*df279a26SBjoern A. Zeeb 	bool iqk_rx_fail[2];
4427*df279a26SBjoern A. Zeeb 	bool is_iqk_init;
4428*df279a26SBjoern A. Zeeb 	bool is_reload;
4429*df279a26SBjoern A. Zeeb 	bool is_wb_txiqk[2];
4430*df279a26SBjoern A. Zeeb 	bool is_wb_rxiqk[2];
4431*df279a26SBjoern A. Zeeb 	bool is_nbiqk;
4432*df279a26SBjoern A. Zeeb 	bool txiqk_en;
4433*df279a26SBjoern A. Zeeb 	bool rxiqk_en;
4434*df279a26SBjoern A. Zeeb 	bool lok_en;
4435*df279a26SBjoern A. Zeeb 	bool iqk_xym_en;
4436*df279a26SBjoern A. Zeeb 	bool iqk_sram_en;
4437*df279a26SBjoern A. Zeeb 	bool iqk_fft_en;
4438*df279a26SBjoern A. Zeeb 	bool is_fw_iqk;
4439*df279a26SBjoern A. Zeeb 	bool is_iqk_enable;
4440*df279a26SBjoern A. Zeeb 	bool iqk_cfir_en;
4441*df279a26SBjoern A. Zeeb 	bool thermal_rek_en;
4442*df279a26SBjoern A. Zeeb 	u8 iqk_band[2];
4443*df279a26SBjoern A. Zeeb 	u8 iqk_ch[2];
4444*df279a26SBjoern A. Zeeb 	u8 iqk_bw[2];
4445*df279a26SBjoern A. Zeeb 	u8 iqk_times;
4446*df279a26SBjoern A. Zeeb 	u8 version;
4447*df279a26SBjoern A. Zeeb 	u8 phy;
4448*df279a26SBjoern A. Zeeb 	u8 fwk_status;
4449*df279a26SBjoern A. Zeeb 	u8 rsvd;
4450*df279a26SBjoern A. Zeeb 	__le32 reload_cnt;
4451*df279a26SBjoern A. Zeeb 	__le32 iqk_fail_cnt;
4452*df279a26SBjoern A. Zeeb 	__le32 lok_idac[2];
4453*df279a26SBjoern A. Zeeb 	__le32 lok_vbuf[2];
4454*df279a26SBjoern A. Zeeb 	__le32 rftxgain[2][4];
4455*df279a26SBjoern A. Zeeb 	__le32 rfrxgain[2][4];
4456*df279a26SBjoern A. Zeeb 	__le32 tx_xym[2][4];
4457*df279a26SBjoern A. Zeeb 	__le32 rx_xym[2][4];
4458*df279a26SBjoern A. Zeeb } __packed;
4459*df279a26SBjoern A. Zeeb 
44606d67aabdSBjoern A. Zeeb struct rtw89_c2h_rf_dpk_rpt_log {
44616d67aabdSBjoern A. Zeeb 	u8 ver;
44626d67aabdSBjoern A. Zeeb 	u8 idx[2];
44636d67aabdSBjoern A. Zeeb 	u8 band[2];
44646d67aabdSBjoern A. Zeeb 	u8 bw[2];
44656d67aabdSBjoern A. Zeeb 	u8 ch[2];
44666d67aabdSBjoern A. Zeeb 	u8 path_ok[2];
44676d67aabdSBjoern A. Zeeb 	u8 txagc[2];
44686d67aabdSBjoern A. Zeeb 	u8 ther[2];
44696d67aabdSBjoern A. Zeeb 	u8 gs[2];
44706d67aabdSBjoern A. Zeeb 	u8 dc_i[4];
44716d67aabdSBjoern A. Zeeb 	u8 dc_q[4];
44726d67aabdSBjoern A. Zeeb 	u8 corr_val[2];
44736d67aabdSBjoern A. Zeeb 	u8 corr_idx[2];
44746d67aabdSBjoern A. Zeeb 	u8 is_timeout[2];
44756d67aabdSBjoern A. Zeeb 	u8 rxbb_ov[2];
44766d67aabdSBjoern A. Zeeb 	u8 rsvd;
44776d67aabdSBjoern A. Zeeb } __packed;
44786d67aabdSBjoern A. Zeeb 
44796d67aabdSBjoern A. Zeeb struct rtw89_c2h_rf_dack_rpt_log {
44806d67aabdSBjoern A. Zeeb 	u8 fwdack_ver;
4481*df279a26SBjoern A. Zeeb 	u8 fwdack_info_ver;
44826d67aabdSBjoern A. Zeeb 	u8 msbk_d[2][2][16];
44836d67aabdSBjoern A. Zeeb 	u8 dadck_d[2][2];
44846d67aabdSBjoern A. Zeeb 	u8 cdack_d[2][2][2];
4485*df279a26SBjoern A. Zeeb 	u8 addck2_hd[2][2][2];
4486*df279a26SBjoern A. Zeeb 	u8 addck2_ld[2][2][2];
44876d67aabdSBjoern A. Zeeb 	u8 adgaink_d[2][2];
4488*df279a26SBjoern A. Zeeb 	u8 biask_hd[2][2];
4489*df279a26SBjoern A. Zeeb 	u8 biask_ld[2][2];
44906d67aabdSBjoern A. Zeeb 	u8 addck_timeout;
44916d67aabdSBjoern A. Zeeb 	u8 cdack_timeout;
44926d67aabdSBjoern A. Zeeb 	u8 dadck_timeout;
44936d67aabdSBjoern A. Zeeb 	u8 msbk_timeout;
44946d67aabdSBjoern A. Zeeb 	u8 adgaink_timeout;
4495*df279a26SBjoern A. Zeeb 	u8 wbadcdck_timeout;
4496*df279a26SBjoern A. Zeeb 	u8 drck_timeout;
44976d67aabdSBjoern A. Zeeb 	u8 dack_fail;
4498*df279a26SBjoern A. Zeeb 	u8 wbdck_d[2];
4499*df279a26SBjoern A. Zeeb 	u8 rck_d;
45006d67aabdSBjoern A. Zeeb } __packed;
45016d67aabdSBjoern A. Zeeb 
45026d67aabdSBjoern A. Zeeb struct rtw89_c2h_rf_rxdck_rpt_log {
45036d67aabdSBjoern A. Zeeb 	u8 ver;
45046d67aabdSBjoern A. Zeeb 	u8 band[2];
45056d67aabdSBjoern A. Zeeb 	u8 bw[2];
45066d67aabdSBjoern A. Zeeb 	u8 ch[2];
45076d67aabdSBjoern A. Zeeb 	u8 timeout[2];
45086d67aabdSBjoern A. Zeeb } __packed;
45096d67aabdSBjoern A. Zeeb 
4510*df279a26SBjoern A. Zeeb struct rtw89_c2h_rf_tssi_rpt_log {
4511*df279a26SBjoern A. Zeeb 	s8 alignment_power[2][2][4];
4512*df279a26SBjoern A. Zeeb 	u8 alignment_power_cw_h[2][2][4];
4513*df279a26SBjoern A. Zeeb 	u8 alignment_power_cw_l[2][2][4];
4514*df279a26SBjoern A. Zeeb 	u8 tssi_alimk_state[2][2];
4515*df279a26SBjoern A. Zeeb 	u8 default_txagc_offset[2][2];
4516*df279a26SBjoern A. Zeeb } __packed;
4517*df279a26SBjoern A. Zeeb 
45186d67aabdSBjoern A. Zeeb struct rtw89_c2h_rf_txgapk_rpt_log {
45196d67aabdSBjoern A. Zeeb 	__le32 r0x8010[2];
45206d67aabdSBjoern A. Zeeb 	__le32 chk_cnt;
45216d67aabdSBjoern A. Zeeb 	u8 track_d[2][17];
45226d67aabdSBjoern A. Zeeb 	u8 power_d[2][17];
45236d67aabdSBjoern A. Zeeb 	u8 is_txgapk_ok;
45246d67aabdSBjoern A. Zeeb 	u8 chk_id;
45256d67aabdSBjoern A. Zeeb 	u8 ver;
45266d67aabdSBjoern A. Zeeb 	u8 rsv1;
45276d67aabdSBjoern A. Zeeb } __packed;
45286d67aabdSBjoern A. Zeeb 
45296d67aabdSBjoern A. Zeeb struct rtw89_c2h_rfk_report {
45306d67aabdSBjoern A. Zeeb 	struct rtw89_c2h_hdr hdr;
45316d67aabdSBjoern A. Zeeb 	u8 state; /* enum rtw89_rfk_report_state */
45326d67aabdSBjoern A. Zeeb 	u8 version;
45336d67aabdSBjoern A. Zeeb } __packed;
45346d67aabdSBjoern A. Zeeb 
45356d67aabdSBjoern A. Zeeb #define RTW89_FW_RSVD_PLE_SIZE 0x800
45368e93258fSBjoern A. Zeeb 
45378e93258fSBjoern A. Zeeb #define RTW89_FW_BACKTRACE_INFO_SIZE 8
45388e93258fSBjoern A. Zeeb #define RTW89_VALID_FW_BACKTRACE_SIZE(_size) \
45398e93258fSBjoern A. Zeeb 	((_size) % RTW89_FW_BACKTRACE_INFO_SIZE == 0)
45408e93258fSBjoern A. Zeeb 
45418e93258fSBjoern A. Zeeb #define RTW89_FW_BACKTRACE_MAX_SIZE 512 /* 8 * 64 (entries) */
45428e93258fSBjoern A. Zeeb #define RTW89_FW_BACKTRACE_KEY 0xBACEBACE
45438e93258fSBjoern A. Zeeb 
45446d67aabdSBjoern A. Zeeb #define FWDL_WAIT_CNT 400000
45456d67aabdSBjoern A. Zeeb 
45466d67aabdSBjoern A. Zeeb int rtw89_fw_check_rdy(struct rtw89_dev *rtwdev, enum rtw89_fwdl_check_type type);
45478e93258fSBjoern A. Zeeb int rtw89_fw_recognize(struct rtw89_dev *rtwdev);
4548e2340276SBjoern A. Zeeb int rtw89_fw_recognize_elements(struct rtw89_dev *rtwdev);
4549e2340276SBjoern A. Zeeb const struct firmware *
4550e2340276SBjoern A. Zeeb rtw89_early_fw_feature_recognize(struct device *device,
45518e93258fSBjoern A. Zeeb 				 const struct rtw89_chip_info *chip,
4552e2340276SBjoern A. Zeeb 				 struct rtw89_fw_info *early_fw,
4553e2340276SBjoern A. Zeeb 				 int *used_fw_format);
45546d67aabdSBjoern A. Zeeb int rtw89_fw_download(struct rtw89_dev *rtwdev, enum rtw89_fw_type type,
45556d67aabdSBjoern A. Zeeb 		      bool include_bb);
4556e2340276SBjoern A. Zeeb void rtw89_load_firmware_work(struct work_struct *work);
45578e93258fSBjoern A. Zeeb void rtw89_unload_firmware(struct rtw89_dev *rtwdev);
45588e93258fSBjoern A. Zeeb int rtw89_wait_firmware_completion(struct rtw89_dev *rtwdev);
4559e2340276SBjoern A. Zeeb int rtw89_fw_log_prepare(struct rtw89_dev *rtwdev);
4560e2340276SBjoern A. Zeeb void rtw89_fw_log_dump(struct rtw89_dev *rtwdev, u8 *buf, u32 len);
45618e93258fSBjoern A. Zeeb void rtw89_h2c_pkt_set_hdr(struct rtw89_dev *rtwdev, struct sk_buff *skb,
45628e93258fSBjoern A. Zeeb 			   u8 type, u8 cat, u8 class, u8 func,
45638e93258fSBjoern A. Zeeb 			   bool rack, bool dack, u32 len);
45648e93258fSBjoern A. Zeeb int rtw89_fw_h2c_default_cmac_tbl(struct rtw89_dev *rtwdev,
4565*df279a26SBjoern A. Zeeb 				  struct rtw89_vif_link *rtwvif_link,
4566*df279a26SBjoern A. Zeeb 				  struct rtw89_sta_link *rtwsta_link);
45676d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_default_cmac_tbl_g7(struct rtw89_dev *rtwdev,
4568*df279a26SBjoern A. Zeeb 				     struct rtw89_vif_link *rtwvif_link,
4569*df279a26SBjoern A. Zeeb 				     struct rtw89_sta_link *rtwsta_link);
45706d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_default_dmac_tbl_v2(struct rtw89_dev *rtwdev,
4571*df279a26SBjoern A. Zeeb 				     struct rtw89_vif_link *rtwvif_link,
4572*df279a26SBjoern A. Zeeb 				     struct rtw89_sta_link *rtwsta_link);
45738e93258fSBjoern A. Zeeb int rtw89_fw_h2c_assoc_cmac_tbl(struct rtw89_dev *rtwdev,
4574*df279a26SBjoern A. Zeeb 				struct rtw89_vif_link *rtwvif_link,
4575*df279a26SBjoern A. Zeeb 				struct rtw89_sta_link *rtwsta_link);
45766d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_assoc_cmac_tbl_g7(struct rtw89_dev *rtwdev,
4577*df279a26SBjoern A. Zeeb 				   struct rtw89_vif_link *rtwvif_link,
4578*df279a26SBjoern A. Zeeb 				   struct rtw89_sta_link *rtwsta_link);
45796d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_ampdu_cmac_tbl_g7(struct rtw89_dev *rtwdev,
4580*df279a26SBjoern A. Zeeb 				   struct rtw89_vif_link *rtwvif_link,
4581*df279a26SBjoern A. Zeeb 				   struct rtw89_sta_link *rtwsta_link);
45828e93258fSBjoern A. Zeeb int rtw89_fw_h2c_txtime_cmac_tbl(struct rtw89_dev *rtwdev,
4583*df279a26SBjoern A. Zeeb 				 struct rtw89_sta_link *rtwsta_link);
4584e2340276SBjoern A. Zeeb int rtw89_fw_h2c_txpath_cmac_tbl(struct rtw89_dev *rtwdev,
4585*df279a26SBjoern A. Zeeb 				 struct rtw89_sta_link *rtwsta_link);
45868e93258fSBjoern A. Zeeb int rtw89_fw_h2c_update_beacon(struct rtw89_dev *rtwdev,
4587*df279a26SBjoern A. Zeeb 			       struct rtw89_vif_link *rtwvif_link);
45886d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_update_beacon_be(struct rtw89_dev *rtwdev,
4589*df279a26SBjoern A. Zeeb 				  struct rtw89_vif_link *rtwvif_link);
4590*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_cam(struct rtw89_dev *rtwdev, struct rtw89_vif_link *vif,
4591*df279a26SBjoern A. Zeeb 		     struct rtw89_sta_link *rtwsta_link, const u8 *scan_mac_addr);
45928e93258fSBjoern A. Zeeb int rtw89_fw_h2c_dctl_sec_cam_v1(struct rtw89_dev *rtwdev,
4593*df279a26SBjoern A. Zeeb 				 struct rtw89_vif_link *rtwvif_link,
4594*df279a26SBjoern A. Zeeb 				 struct rtw89_sta_link *rtwsta_link);
45956d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_dctl_sec_cam_v2(struct rtw89_dev *rtwdev,
4596*df279a26SBjoern A. Zeeb 				 struct rtw89_vif_link *rtwvif_link,
4597*df279a26SBjoern A. Zeeb 				 struct rtw89_sta_link *rtwsta_link);
45988e93258fSBjoern A. Zeeb void rtw89_fw_c2h_irqsafe(struct rtw89_dev *rtwdev, struct sk_buff *c2h);
45998e93258fSBjoern A. Zeeb void rtw89_fw_c2h_work(struct work_struct *work);
46008e93258fSBjoern A. Zeeb int rtw89_fw_h2c_role_maintain(struct rtw89_dev *rtwdev,
4601*df279a26SBjoern A. Zeeb 			       struct rtw89_vif_link *rtwvif_link,
4602*df279a26SBjoern A. Zeeb 			       struct rtw89_sta_link *rtwsta_link,
46038e93258fSBjoern A. Zeeb 			       enum rtw89_upd_mode upd_mode);
4604*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_join_info(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
4605*df279a26SBjoern A. Zeeb 			   struct rtw89_sta_link *rtwsta_link, bool dis_conn);
46066d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_notify_dbcc(struct rtw89_dev *rtwdev, bool en);
46078e93258fSBjoern A. Zeeb int rtw89_fw_h2c_macid_pause(struct rtw89_dev *rtwdev, u8 sh, u8 grp,
46088e93258fSBjoern A. Zeeb 			     bool pause);
4609*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_set_edca(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
46108e93258fSBjoern A. Zeeb 			  u8 ac, u32 val);
46118e93258fSBjoern A. Zeeb int rtw89_fw_h2c_set_ofld_cfg(struct rtw89_dev *rtwdev);
4612*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_tx_duty(struct rtw89_dev *rtwdev, u8 lv);
4613e2340276SBjoern A. Zeeb int rtw89_fw_h2c_set_bcn_fltr_cfg(struct rtw89_dev *rtwdev,
4614*df279a26SBjoern A. Zeeb 				  struct rtw89_vif_link *rtwvif_link,
4615e2340276SBjoern A. Zeeb 				  bool connect);
4616e2340276SBjoern A. Zeeb int rtw89_fw_h2c_rssi_offload(struct rtw89_dev *rtwdev,
4617e2340276SBjoern A. Zeeb 			      struct rtw89_rx_phy_ppdu *phy_ppdu);
4618*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_tp_offload(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link);
46198e93258fSBjoern A. Zeeb int rtw89_fw_h2c_ra(struct rtw89_dev *rtwdev, struct rtw89_ra_info *ra, bool csi);
46206d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_cxdrv_init(struct rtw89_dev *rtwdev, u8 type);
46216d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_cxdrv_init_v7(struct rtw89_dev *rtwdev, u8 type);
46226d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_cxdrv_role(struct rtw89_dev *rtwdev, u8 type);
46236d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_cxdrv_role_v1(struct rtw89_dev *rtwdev, u8 type);
46246d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_cxdrv_role_v2(struct rtw89_dev *rtwdev, u8 type);
4625*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_cxdrv_role_v7(struct rtw89_dev *rtwdev, u8 type);
46266d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_cxdrv_role_v8(struct rtw89_dev *rtwdev, u8 type);
46276d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_cxdrv_ctrl(struct rtw89_dev *rtwdev, u8 type);
46286d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_cxdrv_ctrl_v7(struct rtw89_dev *rtwdev, u8 type);
46296d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_cxdrv_trx(struct rtw89_dev *rtwdev, u8 type);
46306d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_cxdrv_rfk(struct rtw89_dev *rtwdev, u8 type);
46318e93258fSBjoern A. Zeeb int rtw89_fw_h2c_del_pkt_offload(struct rtw89_dev *rtwdev, u8 id);
46328e93258fSBjoern A. Zeeb int rtw89_fw_h2c_add_pkt_offload(struct rtw89_dev *rtwdev, u8 *id,
46338e93258fSBjoern A. Zeeb 				 struct sk_buff *skb_ofld);
4634*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_scan_offload_ax(struct rtw89_dev *rtwdev,
46358e93258fSBjoern A. Zeeb 				 struct rtw89_scan_option *opt,
4636*df279a26SBjoern A. Zeeb 				 struct rtw89_vif_link *vif,
4637*df279a26SBjoern A. Zeeb 				 bool wowlan);
46386d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_scan_offload_be(struct rtw89_dev *rtwdev,
46396d67aabdSBjoern A. Zeeb 				 struct rtw89_scan_option *opt,
4640*df279a26SBjoern A. Zeeb 				 struct rtw89_vif_link *vif,
4641*df279a26SBjoern A. Zeeb 				 bool wowlan);
46428e93258fSBjoern A. Zeeb int rtw89_fw_h2c_rf_reg(struct rtw89_dev *rtwdev,
46438e93258fSBjoern A. Zeeb 			struct rtw89_fw_h2c_rf_reg_info *info,
46448e93258fSBjoern A. Zeeb 			u16 len, u8 page);
46458e93258fSBjoern A. Zeeb int rtw89_fw_h2c_rf_ntfy_mcc(struct rtw89_dev *rtwdev);
46466d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_rf_pre_ntfy(struct rtw89_dev *rtwdev,
46476d67aabdSBjoern A. Zeeb 			     enum rtw89_phy_idx phy_idx);
46486d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_rf_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
4649*df279a26SBjoern A. Zeeb 			 const struct rtw89_chan *chan, enum rtw89_tssi_mode tssi_mode);
4650*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_rf_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
4651*df279a26SBjoern A. Zeeb 			const struct rtw89_chan *chan);
4652*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_rf_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
4653*df279a26SBjoern A. Zeeb 			const struct rtw89_chan *chan);
4654*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_rf_txgapk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
4655*df279a26SBjoern A. Zeeb 			   const struct rtw89_chan *chan);
4656*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_rf_dack(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
4657*df279a26SBjoern A. Zeeb 			 const struct rtw89_chan *chan);
4658*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_rf_rxdck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,
4659*df279a26SBjoern A. Zeeb 			  const struct rtw89_chan *chan, bool is_chl_k);
46608e93258fSBjoern A. Zeeb int rtw89_fw_h2c_raw_with_hdr(struct rtw89_dev *rtwdev,
46618e93258fSBjoern A. Zeeb 			      u8 h2c_class, u8 h2c_func, u8 *buf, u16 len,
46628e93258fSBjoern A. Zeeb 			      bool rack, bool dack);
46638e93258fSBjoern A. Zeeb int rtw89_fw_h2c_raw(struct rtw89_dev *rtwdev, const u8 *buf, u16 len);
46648e93258fSBjoern A. Zeeb void rtw89_fw_send_all_early_h2c(struct rtw89_dev *rtwdev);
46658e93258fSBjoern A. Zeeb void rtw89_fw_free_all_early_h2c(struct rtw89_dev *rtwdev);
4666*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_general_pkt(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
4667e2340276SBjoern A. Zeeb 			     u8 macid);
4668e2340276SBjoern A. Zeeb void rtw89_fw_release_general_pkt_list_vif(struct rtw89_dev *rtwdev,
4669*df279a26SBjoern A. Zeeb 					   struct rtw89_vif_link *rtwvif_link,
4670*df279a26SBjoern A. Zeeb 					   bool notify_fw);
4671e2340276SBjoern A. Zeeb void rtw89_fw_release_general_pkt_list(struct rtw89_dev *rtwdev, bool notify_fw);
4672*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_ba_cam(struct rtw89_dev *rtwdev,
4673*df279a26SBjoern A. Zeeb 			struct rtw89_vif_link *rtwvif_link,
4674*df279a26SBjoern A. Zeeb 			struct rtw89_sta_link *rtwsta_link,
46758e93258fSBjoern A. Zeeb 			bool valid, struct ieee80211_ampdu_params *params);
4676*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_ba_cam_v1(struct rtw89_dev *rtwdev,
4677*df279a26SBjoern A. Zeeb 			   struct rtw89_vif_link *rtwvif_link,
4678*df279a26SBjoern A. Zeeb 			   struct rtw89_sta_link *rtwsta_link,
46796d67aabdSBjoern A. Zeeb 			   bool valid, struct ieee80211_ampdu_params *params);
4680e2340276SBjoern A. Zeeb void rtw89_fw_h2c_init_dynamic_ba_cam_v0_ext(struct rtw89_dev *rtwdev);
46816d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_init_ba_cam_users(struct rtw89_dev *rtwdev, u8 users,
46826d67aabdSBjoern A. Zeeb 				   u8 offset, u8 mac_idx);
46838e93258fSBjoern A. Zeeb 
46848e93258fSBjoern A. Zeeb int rtw89_fw_h2c_lps_parm(struct rtw89_dev *rtwdev,
46858e93258fSBjoern A. Zeeb 			  struct rtw89_lps_parm *lps_param);
4686*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_lps_ch_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif);
4687*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_lps_ml_cmn_info(struct rtw89_dev *rtwdev,
46886d67aabdSBjoern A. Zeeb 				 struct rtw89_vif *rtwvif);
4689*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_fwips(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
4690*df279a26SBjoern A. Zeeb 		       bool enable);
46918e93258fSBjoern A. Zeeb struct sk_buff *rtw89_fw_h2c_alloc_skb_with_hdr(struct rtw89_dev *rtwdev, u32 len);
46928e93258fSBjoern A. Zeeb struct sk_buff *rtw89_fw_h2c_alloc_skb_no_hdr(struct rtw89_dev *rtwdev, u32 len);
46938e93258fSBjoern A. Zeeb int rtw89_fw_msg_reg(struct rtw89_dev *rtwdev,
46948e93258fSBjoern A. Zeeb 		     struct rtw89_mac_h2c_info *h2c_info,
46958e93258fSBjoern A. Zeeb 		     struct rtw89_mac_c2h_info *c2h_info);
46968e93258fSBjoern A. Zeeb int rtw89_fw_h2c_fw_log(struct rtw89_dev *rtwdev, bool enable);
46978e93258fSBjoern A. Zeeb void rtw89_fw_st_dbg_dump(struct rtw89_dev *rtwdev);
4698*df279a26SBjoern A. Zeeb void rtw89_hw_scan_start(struct rtw89_dev *rtwdev,
4699*df279a26SBjoern A. Zeeb 			 struct rtw89_vif_link *rtwvif_link,
4700*df279a26SBjoern A. Zeeb 			 struct ieee80211_scan_request *scan_req);
4701*df279a26SBjoern A. Zeeb void rtw89_hw_scan_complete(struct rtw89_dev *rtwdev,
4702*df279a26SBjoern A. Zeeb 			    struct rtw89_vif_link *rtwvif_link,
47038e93258fSBjoern A. Zeeb 			    bool aborted);
4704*df279a26SBjoern A. Zeeb int rtw89_hw_scan_offload(struct rtw89_dev *rtwdev,
4705*df279a26SBjoern A. Zeeb 			  struct rtw89_vif_link *rtwvif_link,
47068e93258fSBjoern A. Zeeb 			  bool enable);
4707*df279a26SBjoern A. Zeeb void rtw89_hw_scan_abort(struct rtw89_dev *rtwdev,
4708*df279a26SBjoern A. Zeeb 			 struct rtw89_vif_link *rtwvif_link);
4709*df279a26SBjoern A. Zeeb int rtw89_hw_scan_add_chan_list_ax(struct rtw89_dev *rtwdev,
4710*df279a26SBjoern A. Zeeb 				   struct rtw89_vif_link *rtwvif_link, bool connected);
4711*df279a26SBjoern A. Zeeb int rtw89_pno_scan_add_chan_list_ax(struct rtw89_dev *rtwdev,
4712*df279a26SBjoern A. Zeeb 				    struct rtw89_vif_link *rtwvif_link);
47136d67aabdSBjoern A. Zeeb int rtw89_hw_scan_add_chan_list_be(struct rtw89_dev *rtwdev,
4714*df279a26SBjoern A. Zeeb 				   struct rtw89_vif_link *rtwvif_link, bool connected);
4715*df279a26SBjoern A. Zeeb int rtw89_pno_scan_add_chan_list_be(struct rtw89_dev *rtwdev,
4716*df279a26SBjoern A. Zeeb 				    struct rtw89_vif_link *rtwvif_link);
47178e93258fSBjoern A. Zeeb int rtw89_fw_h2c_trigger_cpu_exception(struct rtw89_dev *rtwdev);
4718e2340276SBjoern A. Zeeb int rtw89_fw_h2c_pkt_drop(struct rtw89_dev *rtwdev,
4719e2340276SBjoern A. Zeeb 			  const struct rtw89_pkt_drop_params *params);
4720*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_p2p_act(struct rtw89_dev *rtwdev,
4721*df279a26SBjoern A. Zeeb 			 struct rtw89_vif_link *rtwvif_link,
4722*df279a26SBjoern A. Zeeb 			 struct ieee80211_bss_conf *bss_conf,
4723e2340276SBjoern A. Zeeb 			 struct ieee80211_p2p_noa_desc *desc,
4724e2340276SBjoern A. Zeeb 			 u8 act, u8 noa_id);
4725*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_tsf32_toggle(struct rtw89_dev *rtwdev,
4726*df279a26SBjoern A. Zeeb 			      struct rtw89_vif_link *rtwvif_link,
4727e2340276SBjoern A. Zeeb 			      bool en);
4728*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_wow_global(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
4729e2340276SBjoern A. Zeeb 			    bool enable);
4730e2340276SBjoern A. Zeeb int rtw89_fw_h2c_wow_wakeup_ctrl(struct rtw89_dev *rtwdev,
4731*df279a26SBjoern A. Zeeb 				 struct rtw89_vif_link *rtwvif_link, bool enable);
4732*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_cfg_pno(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
4733*df279a26SBjoern A. Zeeb 			 bool enable);
4734*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_keep_alive(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
4735e2340276SBjoern A. Zeeb 			    bool enable);
47366d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_arp_offload(struct rtw89_dev *rtwdev,
4737*df279a26SBjoern A. Zeeb 			     struct rtw89_vif_link *rtwvif_link, bool enable);
4738e2340276SBjoern A. Zeeb int rtw89_fw_h2c_disconnect_detect(struct rtw89_dev *rtwdev,
4739*df279a26SBjoern A. Zeeb 				   struct rtw89_vif_link *rtwvif_link, bool enable);
4740*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_wow_global(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link,
4741e2340276SBjoern A. Zeeb 			    bool enable);
4742e2340276SBjoern A. Zeeb int rtw89_fw_h2c_wow_wakeup_ctrl(struct rtw89_dev *rtwdev,
4743*df279a26SBjoern A. Zeeb 				 struct rtw89_vif_link *rtwvif_link, bool enable);
4744e2340276SBjoern A. Zeeb int rtw89_fw_wow_cam_update(struct rtw89_dev *rtwdev,
4745e2340276SBjoern A. Zeeb 			    struct rtw89_wow_cam_info *cam_info);
47466d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_wow_gtk_ofld(struct rtw89_dev *rtwdev,
4747*df279a26SBjoern A. Zeeb 			      struct rtw89_vif_link *rtwvif_link,
47486d67aabdSBjoern A. Zeeb 			      bool enable);
47496d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_wow_request_aoac(struct rtw89_dev *rtwdev);
4750e2340276SBjoern A. Zeeb int rtw89_fw_h2c_add_mcc(struct rtw89_dev *rtwdev,
4751e2340276SBjoern A. Zeeb 			 const struct rtw89_fw_mcc_add_req *p);
4752e2340276SBjoern A. Zeeb int rtw89_fw_h2c_start_mcc(struct rtw89_dev *rtwdev,
4753e2340276SBjoern A. Zeeb 			   const struct rtw89_fw_mcc_start_req *p);
4754e2340276SBjoern A. Zeeb int rtw89_fw_h2c_stop_mcc(struct rtw89_dev *rtwdev, u8 group, u8 macid,
4755e2340276SBjoern A. Zeeb 			  bool prev_groups);
4756e2340276SBjoern A. Zeeb int rtw89_fw_h2c_del_mcc_group(struct rtw89_dev *rtwdev, u8 group,
4757e2340276SBjoern A. Zeeb 			       bool prev_groups);
4758e2340276SBjoern A. Zeeb int rtw89_fw_h2c_reset_mcc_group(struct rtw89_dev *rtwdev, u8 group);
4759e2340276SBjoern A. Zeeb int rtw89_fw_h2c_mcc_req_tsf(struct rtw89_dev *rtwdev,
4760e2340276SBjoern A. Zeeb 			     const struct rtw89_fw_mcc_tsf_req *req,
4761e2340276SBjoern A. Zeeb 			     struct rtw89_mac_mcc_tsf_rpt *rpt);
47626d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_mcc_macid_bitmap(struct rtw89_dev *rtwdev, u8 group, u8 macid,
4763e2340276SBjoern A. Zeeb 				  u8 *bitmap);
4764e2340276SBjoern A. Zeeb int rtw89_fw_h2c_mcc_sync(struct rtw89_dev *rtwdev, u8 group, u8 source,
4765e2340276SBjoern A. Zeeb 			  u8 target, u8 offset);
4766e2340276SBjoern A. Zeeb int rtw89_fw_h2c_mcc_set_duration(struct rtw89_dev *rtwdev,
4767e2340276SBjoern A. Zeeb 				  const struct rtw89_fw_mcc_duration *p);
47686d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_mrc_add(struct rtw89_dev *rtwdev,
47696d67aabdSBjoern A. Zeeb 			 const struct rtw89_fw_mrc_add_arg *arg);
47706d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_mrc_start(struct rtw89_dev *rtwdev,
47716d67aabdSBjoern A. Zeeb 			   const struct rtw89_fw_mrc_start_arg *arg);
4772*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_mrc_del(struct rtw89_dev *rtwdev, u8 sch_idx, u8 slot_idx);
47736d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_mrc_req_tsf(struct rtw89_dev *rtwdev,
47746d67aabdSBjoern A. Zeeb 			     const struct rtw89_fw_mrc_req_tsf_arg *arg,
47756d67aabdSBjoern A. Zeeb 			     struct rtw89_mac_mrc_tsf_rpt *rpt);
47766d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_mrc_upd_bitmap(struct rtw89_dev *rtwdev,
47776d67aabdSBjoern A. Zeeb 				const struct rtw89_fw_mrc_upd_bitmap_arg *arg);
47786d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_mrc_sync(struct rtw89_dev *rtwdev,
47796d67aabdSBjoern A. Zeeb 			  const struct rtw89_fw_mrc_sync_arg *arg);
47806d67aabdSBjoern A. Zeeb int rtw89_fw_h2c_mrc_upd_duration(struct rtw89_dev *rtwdev,
47816d67aabdSBjoern A. Zeeb 				  const struct rtw89_fw_mrc_upd_duration_arg *arg);
4782*df279a26SBjoern A. Zeeb int rtw89_fw_h2c_ap_info_refcount(struct rtw89_dev *rtwdev, bool en);
47838e93258fSBjoern A. Zeeb 
47848e93258fSBjoern A. Zeeb static inline void rtw89_fw_h2c_init_ba_cam(struct rtw89_dev *rtwdev)
47858e93258fSBjoern A. Zeeb {
47868e93258fSBjoern A. Zeeb 	const struct rtw89_chip_info *chip = rtwdev->chip;
47878e93258fSBjoern A. Zeeb 
4788e2340276SBjoern A. Zeeb 	if (chip->bacam_ver == RTW89_BACAM_V0_EXT)
4789e2340276SBjoern A. Zeeb 		rtw89_fw_h2c_init_dynamic_ba_cam_v0_ext(rtwdev);
47908e93258fSBjoern A. Zeeb }
47918e93258fSBjoern A. Zeeb 
47926d67aabdSBjoern A. Zeeb static inline int rtw89_chip_h2c_default_cmac_tbl(struct rtw89_dev *rtwdev,
4793*df279a26SBjoern A. Zeeb 						  struct rtw89_vif_link *rtwvif_link,
4794*df279a26SBjoern A. Zeeb 						  struct rtw89_sta_link *rtwsta_link)
47956d67aabdSBjoern A. Zeeb {
47966d67aabdSBjoern A. Zeeb 	const struct rtw89_chip_info *chip = rtwdev->chip;
47976d67aabdSBjoern A. Zeeb 
4798*df279a26SBjoern A. Zeeb 	return chip->ops->h2c_default_cmac_tbl(rtwdev, rtwvif_link, rtwsta_link);
47996d67aabdSBjoern A. Zeeb }
48006d67aabdSBjoern A. Zeeb 
48016d67aabdSBjoern A. Zeeb static inline int rtw89_chip_h2c_default_dmac_tbl(struct rtw89_dev *rtwdev,
4802*df279a26SBjoern A. Zeeb 						  struct rtw89_vif_link *rtwvif_link,
4803*df279a26SBjoern A. Zeeb 						  struct rtw89_sta_link *rtwsta_link)
48046d67aabdSBjoern A. Zeeb {
48056d67aabdSBjoern A. Zeeb 	const struct rtw89_chip_info *chip = rtwdev->chip;
48066d67aabdSBjoern A. Zeeb 
48076d67aabdSBjoern A. Zeeb 	if (chip->ops->h2c_default_dmac_tbl)
4808*df279a26SBjoern A. Zeeb 		return chip->ops->h2c_default_dmac_tbl(rtwdev, rtwvif_link, rtwsta_link);
48096d67aabdSBjoern A. Zeeb 
48106d67aabdSBjoern A. Zeeb 	return 0;
48116d67aabdSBjoern A. Zeeb }
48126d67aabdSBjoern A. Zeeb 
48136d67aabdSBjoern A. Zeeb static inline int rtw89_chip_h2c_update_beacon(struct rtw89_dev *rtwdev,
4814*df279a26SBjoern A. Zeeb 					       struct rtw89_vif_link *rtwvif_link)
48156d67aabdSBjoern A. Zeeb {
48166d67aabdSBjoern A. Zeeb 	const struct rtw89_chip_info *chip = rtwdev->chip;
48176d67aabdSBjoern A. Zeeb 
4818*df279a26SBjoern A. Zeeb 	return chip->ops->h2c_update_beacon(rtwdev, rtwvif_link);
48196d67aabdSBjoern A. Zeeb }
48206d67aabdSBjoern A. Zeeb 
48216d67aabdSBjoern A. Zeeb static inline int rtw89_chip_h2c_assoc_cmac_tbl(struct rtw89_dev *rtwdev,
4822*df279a26SBjoern A. Zeeb 						struct rtw89_vif_link *rtwvif_link,
4823*df279a26SBjoern A. Zeeb 						struct rtw89_sta_link *rtwsta_link)
48246d67aabdSBjoern A. Zeeb {
48256d67aabdSBjoern A. Zeeb 	const struct rtw89_chip_info *chip = rtwdev->chip;
48266d67aabdSBjoern A. Zeeb 
4827*df279a26SBjoern A. Zeeb 	return chip->ops->h2c_assoc_cmac_tbl(rtwdev, rtwvif_link, rtwsta_link);
48286d67aabdSBjoern A. Zeeb }
48296d67aabdSBjoern A. Zeeb 
4830*df279a26SBjoern A. Zeeb static inline
4831*df279a26SBjoern A. Zeeb int rtw89_chip_h2c_ampdu_link_cmac_tbl(struct rtw89_dev *rtwdev,
4832*df279a26SBjoern A. Zeeb 				       struct rtw89_vif_link *rtwvif_link,
4833*df279a26SBjoern A. Zeeb 				       struct rtw89_sta_link *rtwsta_link)
48346d67aabdSBjoern A. Zeeb {
48356d67aabdSBjoern A. Zeeb 	const struct rtw89_chip_info *chip = rtwdev->chip;
48366d67aabdSBjoern A. Zeeb 
48376d67aabdSBjoern A. Zeeb 	if (chip->ops->h2c_ampdu_cmac_tbl)
4838*df279a26SBjoern A. Zeeb 		return chip->ops->h2c_ampdu_cmac_tbl(rtwdev, rtwvif_link,
4839*df279a26SBjoern A. Zeeb 						     rtwsta_link);
4840*df279a26SBjoern A. Zeeb 
4841*df279a26SBjoern A. Zeeb 	return 0;
4842*df279a26SBjoern A. Zeeb }
4843*df279a26SBjoern A. Zeeb 
4844*df279a26SBjoern A. Zeeb static inline int rtw89_chip_h2c_ampdu_cmac_tbl(struct rtw89_dev *rtwdev,
4845*df279a26SBjoern A. Zeeb 						struct rtw89_vif *rtwvif,
4846*df279a26SBjoern A. Zeeb 						struct rtw89_sta *rtwsta)
4847*df279a26SBjoern A. Zeeb {
4848*df279a26SBjoern A. Zeeb 	struct rtw89_vif_link *rtwvif_link;
4849*df279a26SBjoern A. Zeeb 	struct rtw89_sta_link *rtwsta_link;
4850*df279a26SBjoern A. Zeeb 	unsigned int link_id;
4851*df279a26SBjoern A. Zeeb 	int ret;
4852*df279a26SBjoern A. Zeeb 
4853*df279a26SBjoern A. Zeeb 	rtw89_sta_for_each_link(rtwsta, rtwsta_link, link_id) {
4854*df279a26SBjoern A. Zeeb 		rtwvif_link = rtwsta_link->rtwvif_link;
4855*df279a26SBjoern A. Zeeb 		ret = rtw89_chip_h2c_ampdu_link_cmac_tbl(rtwdev, rtwvif_link,
4856*df279a26SBjoern A. Zeeb 							 rtwsta_link);
4857*df279a26SBjoern A. Zeeb 		if (ret)
4858*df279a26SBjoern A. Zeeb 			return ret;
4859*df279a26SBjoern A. Zeeb 	}
48606d67aabdSBjoern A. Zeeb 
48616d67aabdSBjoern A. Zeeb 	return 0;
48626d67aabdSBjoern A. Zeeb }
48636d67aabdSBjoern A. Zeeb 
48646d67aabdSBjoern A. Zeeb static inline
48656d67aabdSBjoern A. Zeeb int rtw89_chip_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta,
48666d67aabdSBjoern A. Zeeb 			  bool valid, struct ieee80211_ampdu_params *params)
48676d67aabdSBjoern A. Zeeb {
48686d67aabdSBjoern A. Zeeb 	const struct rtw89_chip_info *chip = rtwdev->chip;
4869*df279a26SBjoern A. Zeeb 	struct rtw89_vif_link *rtwvif_link;
4870*df279a26SBjoern A. Zeeb 	struct rtw89_sta_link *rtwsta_link;
4871*df279a26SBjoern A. Zeeb 	unsigned int link_id;
4872*df279a26SBjoern A. Zeeb 	int ret;
48736d67aabdSBjoern A. Zeeb 
4874*df279a26SBjoern A. Zeeb 	rtw89_sta_for_each_link(rtwsta, rtwsta_link, link_id) {
4875*df279a26SBjoern A. Zeeb 		rtwvif_link = rtwsta_link->rtwvif_link;
4876*df279a26SBjoern A. Zeeb 		ret = chip->ops->h2c_ba_cam(rtwdev, rtwvif_link, rtwsta_link,
4877*df279a26SBjoern A. Zeeb 					    valid, params);
4878*df279a26SBjoern A. Zeeb 		if (ret)
4879*df279a26SBjoern A. Zeeb 			return ret;
4880*df279a26SBjoern A. Zeeb 	}
4881*df279a26SBjoern A. Zeeb 
4882*df279a26SBjoern A. Zeeb 	return 0;
48836d67aabdSBjoern A. Zeeb }
48846d67aabdSBjoern A. Zeeb 
48856d67aabdSBjoern A. Zeeb /* must consider compatibility; don't insert new in the mid */
48866d67aabdSBjoern A. Zeeb struct rtw89_fw_txpwr_byrate_entry {
48876d67aabdSBjoern A. Zeeb 	u8 band;
48886d67aabdSBjoern A. Zeeb 	u8 nss;
48896d67aabdSBjoern A. Zeeb 	u8 rs;
48906d67aabdSBjoern A. Zeeb 	u8 shf;
48916d67aabdSBjoern A. Zeeb 	u8 len;
48926d67aabdSBjoern A. Zeeb 	__le32 data;
48936d67aabdSBjoern A. Zeeb 	u8 bw;
48946d67aabdSBjoern A. Zeeb 	u8 ofdma;
48956d67aabdSBjoern A. Zeeb } __packed;
48966d67aabdSBjoern A. Zeeb 
48976d67aabdSBjoern A. Zeeb /* must consider compatibility; don't insert new in the mid */
48986d67aabdSBjoern A. Zeeb struct rtw89_fw_txpwr_lmt_2ghz_entry {
48996d67aabdSBjoern A. Zeeb 	u8 bw;
49006d67aabdSBjoern A. Zeeb 	u8 nt;
49016d67aabdSBjoern A. Zeeb 	u8 rs;
49026d67aabdSBjoern A. Zeeb 	u8 bf;
49036d67aabdSBjoern A. Zeeb 	u8 regd;
49046d67aabdSBjoern A. Zeeb 	u8 ch_idx;
49056d67aabdSBjoern A. Zeeb 	s8 v;
49066d67aabdSBjoern A. Zeeb } __packed;
49076d67aabdSBjoern A. Zeeb 
49086d67aabdSBjoern A. Zeeb /* must consider compatibility; don't insert new in the mid */
49096d67aabdSBjoern A. Zeeb struct rtw89_fw_txpwr_lmt_5ghz_entry {
49106d67aabdSBjoern A. Zeeb 	u8 bw;
49116d67aabdSBjoern A. Zeeb 	u8 nt;
49126d67aabdSBjoern A. Zeeb 	u8 rs;
49136d67aabdSBjoern A. Zeeb 	u8 bf;
49146d67aabdSBjoern A. Zeeb 	u8 regd;
49156d67aabdSBjoern A. Zeeb 	u8 ch_idx;
49166d67aabdSBjoern A. Zeeb 	s8 v;
49176d67aabdSBjoern A. Zeeb } __packed;
49186d67aabdSBjoern A. Zeeb 
49196d67aabdSBjoern A. Zeeb /* must consider compatibility; don't insert new in the mid */
49206d67aabdSBjoern A. Zeeb struct rtw89_fw_txpwr_lmt_6ghz_entry {
49216d67aabdSBjoern A. Zeeb 	u8 bw;
49226d67aabdSBjoern A. Zeeb 	u8 nt;
49236d67aabdSBjoern A. Zeeb 	u8 rs;
49246d67aabdSBjoern A. Zeeb 	u8 bf;
49256d67aabdSBjoern A. Zeeb 	u8 regd;
49266d67aabdSBjoern A. Zeeb 	u8 reg_6ghz_power;
49276d67aabdSBjoern A. Zeeb 	u8 ch_idx;
49286d67aabdSBjoern A. Zeeb 	s8 v;
49296d67aabdSBjoern A. Zeeb } __packed;
49306d67aabdSBjoern A. Zeeb 
49316d67aabdSBjoern A. Zeeb /* must consider compatibility; don't insert new in the mid */
49326d67aabdSBjoern A. Zeeb struct rtw89_fw_txpwr_lmt_ru_2ghz_entry {
49336d67aabdSBjoern A. Zeeb 	u8 ru;
49346d67aabdSBjoern A. Zeeb 	u8 nt;
49356d67aabdSBjoern A. Zeeb 	u8 regd;
49366d67aabdSBjoern A. Zeeb 	u8 ch_idx;
49376d67aabdSBjoern A. Zeeb 	s8 v;
49386d67aabdSBjoern A. Zeeb } __packed;
49396d67aabdSBjoern A. Zeeb 
49406d67aabdSBjoern A. Zeeb /* must consider compatibility; don't insert new in the mid */
49416d67aabdSBjoern A. Zeeb struct rtw89_fw_txpwr_lmt_ru_5ghz_entry {
49426d67aabdSBjoern A. Zeeb 	u8 ru;
49436d67aabdSBjoern A. Zeeb 	u8 nt;
49446d67aabdSBjoern A. Zeeb 	u8 regd;
49456d67aabdSBjoern A. Zeeb 	u8 ch_idx;
49466d67aabdSBjoern A. Zeeb 	s8 v;
49476d67aabdSBjoern A. Zeeb } __packed;
49486d67aabdSBjoern A. Zeeb 
49496d67aabdSBjoern A. Zeeb /* must consider compatibility; don't insert new in the mid */
49506d67aabdSBjoern A. Zeeb struct rtw89_fw_txpwr_lmt_ru_6ghz_entry {
49516d67aabdSBjoern A. Zeeb 	u8 ru;
49526d67aabdSBjoern A. Zeeb 	u8 nt;
49536d67aabdSBjoern A. Zeeb 	u8 regd;
49546d67aabdSBjoern A. Zeeb 	u8 reg_6ghz_power;
49556d67aabdSBjoern A. Zeeb 	u8 ch_idx;
49566d67aabdSBjoern A. Zeeb 	s8 v;
49576d67aabdSBjoern A. Zeeb } __packed;
49586d67aabdSBjoern A. Zeeb 
49596d67aabdSBjoern A. Zeeb /* must consider compatibility; don't insert new in the mid */
49606d67aabdSBjoern A. Zeeb struct rtw89_fw_tx_shape_lmt_entry {
49616d67aabdSBjoern A. Zeeb 	u8 band;
49626d67aabdSBjoern A. Zeeb 	u8 tx_shape_rs;
49636d67aabdSBjoern A. Zeeb 	u8 regd;
49646d67aabdSBjoern A. Zeeb 	u8 v;
49656d67aabdSBjoern A. Zeeb } __packed;
49666d67aabdSBjoern A. Zeeb 
49676d67aabdSBjoern A. Zeeb /* must consider compatibility; don't insert new in the mid */
49686d67aabdSBjoern A. Zeeb struct rtw89_fw_tx_shape_lmt_ru_entry {
49696d67aabdSBjoern A. Zeeb 	u8 band;
49706d67aabdSBjoern A. Zeeb 	u8 regd;
49716d67aabdSBjoern A. Zeeb 	u8 v;
49726d67aabdSBjoern A. Zeeb } __packed;
49736d67aabdSBjoern A. Zeeb 
49746d67aabdSBjoern A. Zeeb const struct rtw89_rfe_parms *
49756d67aabdSBjoern A. Zeeb rtw89_load_rfe_data_from_fw(struct rtw89_dev *rtwdev,
49766d67aabdSBjoern A. Zeeb 			    const struct rtw89_rfe_parms *init);
49776d67aabdSBjoern A. Zeeb 
49786d67aabdSBjoern A. Zeeb enum rtw89_wow_wakeup_ver {
49796d67aabdSBjoern A. Zeeb 	RTW89_WOW_REASON_V0,
49806d67aabdSBjoern A. Zeeb 	RTW89_WOW_REASON_V1,
49816d67aabdSBjoern A. Zeeb 	RTW89_WOW_REASON_NUM,
49826d67aabdSBjoern A. Zeeb };
49836d67aabdSBjoern A. Zeeb 
49848e93258fSBjoern A. Zeeb #endif
4985