/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
/* Copyright(c) 2019-2020 Realtek Corporation
*/
#ifndef __RTW89_FW_H__
#define __RTW89_FW_H__
#include "core.h"
enum rtw89_fw_dl_status {
RTW89_FWDL_INITIAL_STATE = 0,
RTW89_FWDL_FWDL_ONGOING = 1,
RTW89_FWDL_CHECKSUM_FAIL = 2,
RTW89_FWDL_SECURITY_FAIL = 3,
RTW89_FWDL_CV_NOT_MATCH = 4,
RTW89_FWDL_RSVD0 = 5,
RTW89_FWDL_WCPU_FWDL_RDY = 6,
RTW89_FWDL_WCPU_FW_INIT_RDY = 7
};
struct rtw89_c2hreg_hdr {
u32 w0;
};
#define RTW89_C2HREG_HDR_FUNC_MASK GENMASK(6, 0)
#define RTW89_C2HREG_HDR_ACK BIT(7)
#define RTW89_C2HREG_HDR_LEN_MASK GENMASK(11, 8)
#define RTW89_C2HREG_HDR_SEQ_MASK GENMASK(15, 12)
struct rtw89_c2hreg_phycap {
u32 w0;
u32 w1;
u32 w2;
u32 w3;
} __packed;
#define RTW89_C2HREG_PHYCAP_W0_FUNC GENMASK(6, 0)
#define RTW89_C2HREG_PHYCAP_W0_ACK BIT(7)
#define RTW89_C2HREG_PHYCAP_W0_LEN GENMASK(11, 8)
#define RTW89_C2HREG_PHYCAP_W0_SEQ GENMASK(15, 12)
#define RTW89_C2HREG_PHYCAP_W0_RX_NSS GENMASK(23, 16)
#define RTW89_C2HREG_PHYCAP_W0_BW GENMASK(31, 24)
#define RTW89_C2HREG_PHYCAP_W1_TX_NSS GENMASK(7, 0)
#define RTW89_C2HREG_PHYCAP_W1_PROT GENMASK(15, 8)
#define RTW89_C2HREG_PHYCAP_W1_NIC GENMASK(23, 16)
#define RTW89_C2HREG_PHYCAP_W1_WL_FUNC GENMASK(31, 24)
#define RTW89_C2HREG_PHYCAP_W2_HW_TYPE GENMASK(7, 0)
#define RTW89_C2HREG_PHYCAP_W3_ANT_TX_NUM GENMASK(15, 8)
#define RTW89_C2HREG_PHYCAP_W3_ANT_RX_NUM GENMASK(23, 16)
#define RTW89_C2HREG_PHYCAP_W3_BAND_SEL GENMASK(31, 24)
#define RTW89_C2HREG_PHYCAP_P1_W0_B1_RX_NSS GENMASK(23, 16)
#define RTW89_C2HREG_PHYCAP_P1_W0_B1_BW GENMASK(31, 24)
#define RTW89_C2HREG_PHYCAP_P1_W1_B1_TX_NSS GENMASK(7, 0)
#define RTW89_C2HREG_PHYCAP_P1_W1_B1_ANT_TX_NUM GENMASK(15, 8)
#define RTW89_C2HREG_PHYCAP_P1_W1_B1_ANT_RX_NUM GENMASK(23, 16)
#define RTW89_C2HREG_PHYCAP_P1_W1_B1_BAND_SEL GENMASK(31, 24)
#define RTW89_C2HREG_PHYCAP_P1_W2_QAM GENMASK(7, 0)
#define RTW89_C2HREG_PHYCAP_P1_W2_QAM_256 0x1
#define RTW89_C2HREG_PHYCAP_P1_W2_QAM_1024 0x2
#define RTW89_C2HREG_PHYCAP_P1_W2_QAM_4096 0x3
#define RTW89_C2HREG_PHYCAP_P1_W2_B1_QAM GENMASK(15, 8)
#define RTW89_C2HREG_AOAC_RPT_1_W0_KEY_IDX GENMASK(23, 16)
#define RTW89_C2HREG_AOAC_RPT_1_W1_IV_0 GENMASK(7, 0)
#define RTW89_C2HREG_AOAC_RPT_1_W1_IV_1 GENMASK(15, 8)
#define RTW89_C2HREG_AOAC_RPT_1_W1_IV_2 GENMASK(23, 16)
#define RTW89_C2HREG_AOAC_RPT_1_W1_IV_3 GENMASK(31, 24)
#define RTW89_C2HREG_AOAC_RPT_1_W2_IV_4 GENMASK(7, 0)
#define RTW89_C2HREG_AOAC_RPT_1_W2_IV_5 GENMASK(15, 8)
#define RTW89_C2HREG_AOAC_RPT_1_W2_IV_6 GENMASK(23, 16)
#define RTW89_C2HREG_AOAC_RPT_1_W2_IV_7 GENMASK(31, 24)
#define RTW89_C2HREG_AOAC_RPT_1_W3_PTK_IV_0 GENMASK(7, 0)
#define RTW89_C2HREG_AOAC_RPT_1_W3_PTK_IV_1 GENMASK(15, 8)
#define RTW89_C2HREG_AOAC_RPT_1_W3_PTK_IV_2 GENMASK(23, 16)
#define RTW89_C2HREG_AOAC_RPT_1_W3_PTK_IV_3 GENMASK(31, 24)
#define RTW89_C2HREG_AOAC_RPT_2_W0_PTK_IV_4 GENMASK(23, 16)
#define RTW89_C2HREG_AOAC_RPT_2_W0_PTK_IV_5 GENMASK(31, 24)
#define RTW89_C2HREG_AOAC_RPT_2_W1_PTK_IV_6 GENMASK(7, 0)
#define RTW89_C2HREG_AOAC_RPT_2_W1_PTK_IV_7 GENMASK(15, 8)
#define RTW89_C2HREG_AOAC_RPT_2_W1_IGTK_IPN_IV_0 GENMASK(23, 16)
#define RTW89_C2HREG_AOAC_RPT_2_W1_IGTK_IPN_IV_1 GENMASK(31, 24)
#define RTW89_C2HREG_AOAC_RPT_2_W2_IGTK_IPN_IV_2 GENMASK(7, 0)
#define RTW89_C2HREG_AOAC_RPT_2_W2_IGTK_IPN_IV_3 GENMASK(15, 8)
#define RTW89_C2HREG_AOAC_RPT_2_W2_IGTK_IPN_IV_4 GENMASK(23, 16)
#define RTW89_C2HREG_AOAC_RPT_2_W2_IGTK_IPN_IV_5 GENMASK(31, 24)
#define RTW89_C2HREG_AOAC_RPT_2_W3_IGTK_IPN_IV_6 GENMASK(7, 0)
#define RTW89_C2HREG_AOAC_RPT_2_W3_IGTK_IPN_IV_7 GENMASK(15, 8)
#define RTW89_C2HREG_PS_LEAVE_ACK_RET GENMASK(7, 0)
#define RTW89_C2HREG_PS_LEAVE_ACK_MACID GENMASK(31, 16)
struct rtw89_h2creg_hdr {
u32 w0;
};
#define RTW89_H2CREG_HDR_FUNC_MASK GENMASK(6, 0)
#define RTW89_H2CREG_HDR_LEN_MASK GENMASK(11, 8)
struct rtw89_h2creg_sch_tx_en {
u32 w0;
u32 w1;
} __packed;
#define RTW89_H2CREG_SCH_TX_EN_W0_EN GENMASK(31, 16)
#define RTW89_H2CREG_SCH_TX_EN_W1_MASK GENMASK(15, 0)
#define RTW89_H2CREG_SCH_TX_EN_W1_BAND BIT(16)
#define RTW89_H2CREG_WOW_CPUIO_RX_CTRL_EN GENMASK(23, 16)
#define RTW89_H2CREG_GET_FEATURE_PART_NUM GENMASK(23, 16)
#define RTW89_H2CREG_MAX 4
#define RTW89_C2HREG_MAX 4
#define RTW89_C2HREG_HDR_LEN 2
#define RTW89_H2CREG_HDR_LEN 2
#define RTW89_C2H_TIMEOUT 1000000
#define RTW89_C2H_TIMEOUT_USB 4000
struct rtw89_mac_c2h_info {
u8 id;
u8 content_len;
union {
u32 c2hreg[RTW89_C2HREG_MAX];
struct rtw89_c2hreg_hdr hdr;
struct rtw89_c2hreg_phycap phycap;
} u;
};
struct rtw89_mac_h2c_info {
u8 id;
u8 content_len;
union {
u32 h2creg[RTW89_H2CREG_MAX];
struct rtw89_h2creg_hdr hdr;
struct rtw89_h2creg_sch_tx_en sch_tx_en;
} u;
};
enum rtw89_mac_h2c_type {
RTW89_FWCMD_H2CREG_FUNC_H2CREG_LB = 0,
RTW89_FWCMD_H2CREG_FUNC_CNSL_CMD,
RTW89_FWCMD_H2CREG_FUNC_FWERR,
RTW89_FWCMD_H2CREG_FUNC_GET_FEATURE,
RTW89_FWCMD_H2CREG_FUNC_GETPKT_INFORM,
RTW89_FWCMD_H2CREG_FUNC_SCH_TX_EN,
RTW89_FWCMD_H2CREG_FUNC_WOW_TRX_STOP,
RTW89_FWCMD_H2CREG_FUNC_AOAC_RPT_1,
RTW89_FWCMD_H2CREG_FUNC_AOAC_RPT_2,
RTW89_FWCMD_H2CREG_FUNC_AOAC_RPT_3_REQ,
RTW89_FWCMD_H2CREG_FUNC_WOW_CPUIO_RX_CTRL,
};
enum rtw89_mac_c2h_type {
RTW89_FWCMD_C2HREG_FUNC_C2HREG_LB = 0,
RTW89_FWCMD_C2HREG_FUNC_ERR_RPT,
RTW89_FWCMD_C2HREG_FUNC_ERR_MSG,
RTW89_FWCMD_C2HREG_FUNC_PHY_CAP,
RTW89_FWCMD_C2HREG_FUNC_TX_PAUSE_RPT,
RTW89_FWCMD_C2HREG_FUNC_WOW_CPUIO_RX_ACK = 0xA,
RTW89_FWCMD_C2HREG_FUNC_PHY_CAP_PART1 = 0xC,
RTW89_FWCMD_C2HREG_FUNC_PS_LEAVE_ACK = 0xD,
RTW89_FWCMD_C2HREG_FUNC_NULL = 0xFF,
};
enum rtw89_fw_c2h_category {
RTW89_C2H_CAT_TEST,
RTW89_C2H_CAT_MAC,
RTW89_C2H_CAT_OUTSRC,
};
enum rtw89_fw_log_level {
RTW89_FW_LOG_LEVEL_OFF,
RTW89_FW_LOG_LEVEL_CRT,
RTW89_FW_LOG_LEVEL_SER,
RTW89_FW_LOG_LEVEL_WARN,
RTW89_FW_LOG_LEVEL_LOUD,
RTW89_FW_LOG_LEVEL_TR,
};
enum rtw89_fw_log_path {
RTW89_FW_LOG_LEVEL_UART,
RTW89_FW_LOG_LEVEL_C2H,
RTW89_FW_LOG_LEVEL_SNI,
};
enum rtw89_fw_log_comp {
RTW89_FW_LOG_COMP_VER,
RTW89_FW_LOG_COMP_INIT,
RTW89_FW_LOG_COMP_TASK,
RTW89_FW_LOG_COMP_CNS,
RTW89_FW_LOG_COMP_H2C,
RTW89_FW_LOG_COMP_C2H,
RTW89_FW_LOG_COMP_TX,
RTW89_FW_LOG_COMP_RX,
RTW89_FW_LOG_COMP_IPSEC,
RTW89_FW_LOG_COMP_TIMER,
RTW89_FW_LOG_COMP_DBGPKT,
RTW89_FW_LOG_COMP_PS,
RTW89_FW_LOG_COMP_ERROR,
RTW89_FW_LOG_COMP_WOWLAN,
RTW89_FW_LOG_COMP_SECURE_BOOT,
RTW89_FW_LOG_COMP_BTC,
RTW89_FW_LOG_COMP_BB,
RTW89_FW_LOG_COMP_TWT,
RTW89_FW_LOG_COMP_RF,
RTW89_FW_LOG_COMP_MCC = 20,
RTW89_FW_LOG_COMP_MLO = 26,
RTW89_FW_LOG_COMP_SCAN = 28,
};
enum rtw89_pkt_offload_op {
RTW89_PKT_OFLD_OP_ADD,
RTW89_PKT_OFLD_OP_DEL,
RTW89_PKT_OFLD_OP_READ,
NUM_OF_RTW89_PKT_OFFLOAD_OP,
};
#define RTW89_PKT_OFLD_WAIT_TAG(pkt_id, pkt_op) \
((pkt_id) * NUM_OF_RTW89_PKT_OFFLOAD_OP + (pkt_op))
enum rtw89_scanofld_notify_reason {
RTW89_SCAN_DWELL_NOTIFY,
RTW89_SCAN_PRE_TX_NOTIFY,
RTW89_SCAN_POST_TX_NOTIFY,
RTW89_SCAN_ENTER_CH_NOTIFY,
RTW89_SCAN_LEAVE_CH_NOTIFY,
RTW89_SCAN_END_SCAN_NOTIFY,
RTW89_SCAN_REPORT_NOTIFY,
RTW89_SCAN_CHKPT_NOTIFY,
RTW89_SCAN_ENTER_OP_NOTIFY,
RTW89_SCAN_LEAVE_OP_NOTIFY,
};
enum rtw89_scanofld_status {
RTW89_SCAN_STATUS_NOTIFY,
RTW89_SCAN_STATUS_SUCCESS,
RTW89_SCAN_STATUS_FAIL,
};
enum rtw89_chan_type {
RTW89_CHAN_OPERATE = 0,
RTW89_CHAN_ACTIVE,
RTW89_CHAN_DFS,
RTW89_CHAN_EXTRA_OP,
};
enum rtw89_p2pps_action {
RTW89_P2P_ACT_INIT = 0,
RTW89_P2P_ACT_UPDATE = 1,
RTW89_P2P_ACT_REMOVE = 2,
RTW89_P2P_ACT_TERMINATE = 3,
};
#define RTW89_DEFAULT_CQM_HYST 4
#define RTW89_DEFAULT_CQM_THOLD -70
enum rtw89_bcn_fltr_offload_mode {
RTW89_BCN_FLTR_OFFLOAD_MODE_0 = 0,
RTW89_BCN_FLTR_OFFLOAD_MODE_1,
RTW89_BCN_FLTR_OFFLOAD_MODE_2,
RTW89_BCN_FLTR_OFFLOAD_MODE_3,
RTW89_BCN_FLTR_OFFLOAD_MODE_DEFAULT = RTW89_BCN_FLTR_OFFLOAD_MODE_0,
};
enum rtw89_bcn_fltr_type {
RTW89_BCN_FLTR_BEACON_LOSS,
RTW89_BCN_FLTR_RSSI,
RTW89_BCN_FLTR_NOTIFY,
};
enum rtw89_bcn_fltr_rssi_event {
RTW89_BCN_FLTR_RSSI_NOT_CHANGED,
RTW89_BCN_FLTR_RSSI_HIGH,
RTW89_BCN_FLTR_RSSI_LOW,
};
#define FWDL_SECTION_MAX_NUM 10
#define FWDL_SECTION_CHKSUM_LEN 8
#define FWDL_SECTION_PER_PKT_LEN 2020
struct rtw89_fw_hdr_section_info {
u8 redl;
const u8 *addr;
u32 len;
u32 len_override;
u32 dladdr;
u32 mssc;
u8 type;
bool ignore;
const u8 *key_addr;
u32 key_len;
u32 key_idx;
};
struct rtw89_fw_bin_info {
u8 section_num;
u32 hdr_len;
bool dynamic_hdr_en;
u32 dynamic_hdr_len;
u8 idmem_share_mode;
bool dsp_checksum;
bool secure_section_exist;
struct rtw89_fw_hdr_section_info section_info[FWDL_SECTION_MAX_NUM];
};
struct rtw89_fw_macid_pause_grp {
__le32 pause_grp[4];
__le32 mask_grp[4];
} __packed;
struct rtw89_fw_macid_pause_sleep_grp {
struct {
__le32 pause_grp[4];
__le32 pause_mask_grp[4];
__le32 sleep_grp[4];
__le32 sleep_mask_grp[4];
} __packed n[4];
} __packed;
#define RTW89_H2C_MAX_SIZE 2048
#define RTW89_CHANNEL_TIME 45
#define RTW89_CHANNEL_TIME_6G 20
#define RTW89_CHANNEL_TIME_EXTRA_OP 30
#define RTW89_DFS_CHAN_TIME 105
#define RTW89_OFF_CHAN_TIME 100
#define RTW89_P2P_CHAN_TIME 105
#define RTW89_DWELL_TIME 20
#define RTW89_DWELL_TIME_6G 10
#define RTW89_SCAN_WIDTH 0
#define RTW89_SCANOFLD_MAX_SSID 8
#define RTW89_SCANOFLD_MAX_IE_LEN 512
#define RTW89_SCANOFLD_PKT_NONE 0xFF
#define RTW89_SCANOFLD_DEBUG_MASK 0x1F
#define RTW89_CHAN_INVALID 0xFF
#define RTW89_MAC_CHINFO_SIZE 28
#define RTW89_MAC_CHINFO_SIZE_BE 32
#define RTW89_SCAN_LIST_GUARD 4
#define RTW89_SCAN_LIST_LIMIT(size) \
((RTW89_H2C_MAX_SIZE / (size)) - RTW89_SCAN_LIST_GUARD)
#define RTW89_SCAN_LIST_LIMIT_AX RTW89_SCAN_LIST_LIMIT(RTW89_MAC_CHINFO_SIZE)
#define RTW89_SCAN_LIST_LIMIT_BE RTW89_SCAN_LIST_LIMIT(RTW89_MAC_CHINFO_SIZE_BE)
#define RTW89_BCN_LOSS_CNT 60
struct rtw89_mac_chinfo_ax {
u8 period;
u8 dwell_time;
u8 central_ch;
u8 pri_ch;
u8 bw:3;
u8 notify_action:5;
u8 num_pkt:4;
u8 tx_pkt:1;
u8 pause_data:1;
u8 ch_band:2;
u8 probe_id;
u8 dfs_ch:1;
u8 tx_null:1;
u8 rand_seq_num:1;
u8 cfg_tx_pwr:1;
u8 macid_tx: 1;
u8 rsvd0: 3;
u8 pkt_id[RTW89_SCANOFLD_MAX_SSID];
u16 tx_pwr_idx;
u8 rsvd1;
struct list_head list;
bool is_psc;
};
struct rtw89_mac_chinfo_be {
u8 period;
u8 dwell_time;
u8 central_ch;
u8 pri_ch;
u8 bw:3;
u8 ch_band:2;
u8 dfs_ch:1;
u8 pause_data:1;
u8 tx_null:1;
u8 rand_seq_num:1;
u8 notify_action:5;
u8 probe_id;
u8 leave_crit;
u8 chkpt_timer;
u8 leave_time;
u8 leave_th;
u16 tx_pkt_ctrl;
u8 pkt_id[RTW89_SCANOFLD_MAX_SSID];
u8 sw_def;
u16 fw_probe0_ssids;
u16 fw_probe0_shortssids;
u16 fw_probe0_bssids;
struct list_head list;
bool is_psc;
};
struct rtw89_pktofld_info {
struct list_head list;
u8 id;
bool wildcard_6ghz;
/* Below fields are for WiFi 6 chips 6 GHz RNR use only */
u8 ssid[IEEE80211_MAX_SSID_LEN];
u8 ssid_len;
u8 bssid[ETH_ALEN];
u16 channel_6ghz;
bool cancel;
};
struct rtw89_h2c_ra {
__le32 w0;
__le32 w1;
__le32 w2;
__le32 w3;
} __packed;
#define RTW89_H2C_RA_W0_IS_DIS BIT(0)
#define RTW89_H2C_RA_W0_MODE GENMASK(5, 1)
#define RTW89_H2C_RA_W0_BW_CAP GENMASK(7, 6)
#define RTW89_H2C_RA_W0_MACID GENMASK(15, 8)
#define RTW89_H2C_RA_W0_DCM BIT(16)
#define RTW89_H2C_RA_W0_ER BIT(17)
#define RTW89_H2C_RA_W0_INIT_RATE_LV GENMASK(19, 18)
#define RTW89_H2C_RA_W0_UPD_ALL BIT(20)
#define RTW89_H2C_RA_W0_SGI BIT(21)
#define RTW89_H2C_RA_W0_LDPC BIT(22)
#define RTW89_H2C_RA_W0_STBC BIT(23)
#define RTW89_H2C_RA_W0_SS_NUM GENMASK(26, 24)
#define RTW89_H2C_RA_W0_GILTF GENMASK(29, 27)
#define RTW89_H2C_RA_W0_UPD_BW_NSS_MASK BIT(30)
#define RTW89_H2C_RA_W0_UPD_MASK BIT(31)
#define RTW89_H2C_RA_W1_RAMASK_LO32 GENMASK(31, 0)
#define RTW89_H2C_RA_W2_RAMASK_HI32 GENMASK(30, 0)
#define RTW89_H2C_RA_W2_BFEE_CSI_CTL BIT(31)
#define RTW89_H2C_RA_W3_BAND_NUM GENMASK(7, 0)
#define RTW89_H2C_RA_W3_RA_CSI_RATE_EN BIT(8)
#define RTW89_H2C_RA_W3_FIXED_CSI_RATE_EN BIT(9)
#define RTW89_H2C_RA_W3_CR_TBL_SEL BIT(10)
#define RTW89_H2C_RA_W3_FIX_GILTF_EN BIT(11)
#define RTW89_H2C_RA_W3_FIX_GILTF GENMASK(14, 12)
#define RTW89_H2C_RA_W3_FIXED_CSI_MCS_SS_IDX GENMASK(23, 16)
#define RTW89_H2C_RA_W3_FIXED_CSI_MODE GENMASK(25, 24)
#define RTW89_H2C_RA_W3_FIXED_CSI_GI_LTF GENMASK(28, 26)
#define RTW89_H2C_RA_W3_FIXED_CSI_BW GENMASK(31, 29)
struct rtw89_h2c_ra_v1 {
struct rtw89_h2c_ra v0;
__le32 w4;
__le32 w5;
} __packed;
#define RTW89_H2C_RA_V1_W4_MODE_EHT GENMASK(6, 0)
#define RTW89_H2C_RA_V1_W4_BW_EHT GENMASK(10, 8)
#define RTW89_H2C_RA_V1_W4_RAMASK_UHL16 GENMASK(31, 16)
#define RTW89_H2C_RA_V1_W5_RAMASK_UHH16 GENMASK(15, 0)
static inline void RTW89_SET_FWCMD_SEC_IDX(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)(cmd) + 0x00, val, GENMASK(7, 0));
}
static inline void RTW89_SET_FWCMD_SEC_OFFSET(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)(cmd) + 0x00, val, GENMASK(15, 8));
}
static inline void RTW89_SET_FWCMD_SEC_LEN(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)(cmd) + 0x00, val, GENMASK(23, 16));
}
static inline void RTW89_SET_FWCMD_SEC_TYPE(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)(cmd) + 0x01, val, GENMASK(3, 0));
}
static inline void RTW89_SET_FWCMD_SEC_EXT_KEY(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)(cmd) + 0x01, val, BIT(4));
}
static inline void RTW89_SET_FWCMD_SEC_SPP_MODE(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)(cmd) + 0x01, val, BIT(5));
}
static inline void RTW89_SET_FWCMD_SEC_KEY0(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)(cmd) + 0x02, val, GENMASK(31, 0));
}
static inline void RTW89_SET_FWCMD_SEC_KEY1(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)(cmd) + 0x03, val, GENMASK(31, 0));
}
static inline void RTW89_SET_FWCMD_SEC_KEY2(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)(cmd) + 0x04, val, GENMASK(31, 0));
}
static inline void RTW89_SET_FWCMD_SEC_KEY3(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)(cmd) + 0x05, val, GENMASK(31, 0));
}
static inline void RTW89_SET_EDCA_SEL(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)(cmd) + 0x00, val, GENMASK(1, 0));
}
static inline void RTW89_SET_EDCA_BAND(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)(cmd) + 0x00, val, BIT(3));
}
static inline void RTW89_SET_EDCA_WMM(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)(cmd) + 0x00, val, BIT(4));
}
static inline void RTW89_SET_EDCA_AC(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)(cmd) + 0x00, val, GENMASK(6, 5));
}
static inline void RTW89_SET_EDCA_PARAM(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)(cmd) + 0x01, val, GENMASK(31, 0));
}
#define FW_EDCA_PARAM_TXOPLMT_MSK GENMASK(26, 16)
#define FW_EDCA_PARAM_CWMAX_MSK GENMASK(15, 12)
#define FW_EDCA_PARAM_CWMIN_MSK GENMASK(11, 8)
#define FW_EDCA_PARAM_AIFS_MSK GENMASK(7, 0)
#define FWDL_SECURITY_SECTION_TYPE 9
#define FWDL_SECURITY_SIGLEN 512
#define FWDL_SECURITY_CHKSUM_LEN 8
struct rtw89_fw_dynhdr_sec {
__le32 w0;
u8 content[];
} __packed;
struct rtw89_fw_dynhdr_hdr {
__le32 hdr_len;
__le32 setcion_count;
/* struct rtw89_fw_dynhdr_sec (nested flexible structures) */
} __packed;
struct rtw89_fw_hdr_section {
__le32 w0;
__le32 w1;
__le32 w2;
__le32 w3;
} __packed;
#define FWSECTION_HDR_W0_DL_ADDR GENMASK(31, 0)
#define FWSECTION_HDR_W1_METADATA GENMASK(31, 24)
#define FWSECTION_HDR_W1_SECTIONTYPE GENMASK(27, 24)
#define FWSECTION_HDR_W1_SEC_SIZE GENMASK(23, 0)
#define FWSECTION_HDR_W1_CHECKSUM BIT(28)
#define FWSECTION_HDR_W1_REDL BIT(29)
#define FWSECTION_HDR_W2_MSSC GENMASK(31, 0)
struct rtw89_fw_hdr {
__le32 w0;
__le32 w1;
__le32 w2;
__le32 w3;
__le32 w4;
__le32 w5;
__le32 w6;
__le32 w7;
struct rtw89_fw_hdr_section sections[];
/* struct rtw89_fw_dynhdr_hdr (optional) */
} __packed;
#define FW_HDR_W1_MAJOR_VERSION GENMASK(7, 0)
#define FW_HDR_W1_MINOR_VERSION GENMASK(15, 8)
#define FW_HDR_W1_SUBVERSION GENMASK(23, 16)
#define FW_HDR_W1_SUBINDEX GENMASK(31, 24)
#define FW_HDR_W2_COMMITID GENMASK(31, 0)
#define FW_HDR_W3_LEN GENMASK(23, 16)
#define FW_HDR_W3_HDR_VER GENMASK(31, 24)
#define FW_HDR_W4_MONTH GENMASK(7, 0)
#define FW_HDR_W4_DATE GENMASK(15, 8)
#define FW_HDR_W4_HOUR GENMASK(23, 16)
#define FW_HDR_W4_MIN GENMASK(31, 24)
#define FW_HDR_W5_YEAR GENMASK(31, 0)
#define FW_HDR_W6_SEC_NUM GENMASK(15, 8)
#define FW_HDR_W7_PART_SIZE GENMASK(15, 0)
#define FW_HDR_W7_DYN_HDR BIT(16)
#define FW_HDR_W7_IDMEM_SHARE_MODE GENMASK(21, 18)
#define FW_HDR_W7_CMD_VERSERION GENMASK(31, 24)
struct rtw89_fw_hdr_section_v1 {
__le32 w0;
__le32 w1;
__le32 w2;
__le32 w3;
} __packed;
#define FWSECTION_HDR_V1_W0_DL_ADDR GENMASK(31, 0)
#define FWSECTION_HDR_V1_W1_METADATA GENMASK(31, 24)
#define FWSECTION_HDR_V1_W1_SECTIONTYPE GENMASK(27, 24)
#define FWSECTION_HDR_V1_W1_SEC_SIZE GENMASK(23, 0)
#define FWSECTION_HDR_V1_W1_CHECKSUM BIT(28)
#define FWSECTION_HDR_V1_W1_REDL BIT(29)
#define FWSECTION_HDR_V1_W2_MSSC GENMASK(7, 0)
#define FORMATTED_MSSC 0xFF
#define FORMATTED_MSSC_MASK GENMASK(7, 0)
#define FWSECTION_HDR_V1_W2_BBMCU_IDX GENMASK(27, 24)
struct rtw89_fw_hdr_v1 {
__le32 w0;
__le32 w1;
__le32 w2;
__le32 w3;
__le32 w4;
__le32 w5;
__le32 w6;
__le32 w7;
__le32 w8;
__le32 w9;
__le32 w10;
__le32 w11;
struct rtw89_fw_hdr_section_v1 sections[];
} __packed;
#define FW_HDR_V1_W1_MAJOR_VERSION GENMASK(7, 0)
#define FW_HDR_V1_W1_MINOR_VERSION GENMASK(15, 8)
#define FW_HDR_V1_W1_SUBVERSION GENMASK(23, 16)
#define FW_HDR_V1_W1_SUBINDEX GENMASK(31, 24)
#define FW_HDR_V1_W2_COMMITID GENMASK(31, 0)
#define FW_HDR_V1_W3_CMD_VERSERION GENMASK(23, 16)
#define FW_HDR_V1_W3_HDR_VER GENMASK(31, 24)
#define FW_HDR_V1_W4_MONTH GENMASK(7, 0)
#define FW_HDR_V1_W4_DATE GENMASK(15, 8)
#define FW_HDR_V1_W4_HOUR GENMASK(23, 16)
#define FW_HDR_V1_W4_MIN GENMASK(31, 24)
#define FW_HDR_V1_W5_YEAR GENMASK(15, 0)
#define FW_HDR_V1_W5_HDR_SIZE GENMASK(31, 16)
#define FW_HDR_V1_W6_SEC_NUM GENMASK(15, 8)
#define FW_HDR_V1_W6_DSP_CHKSUM BIT(24)
#define FW_HDR_V1_W7_PART_SIZE GENMASK(15, 0)
#define FW_HDR_V1_W7_DYN_HDR BIT(16)
#define FW_HDR_V1_W7_IDMEM_SHARE_MODE GENMASK(21, 18)
enum rtw89_fw_mss_pool_rmp_tbl_type {
MSS_POOL_RMP_TBL_BITMASK = 0x0,
MSS_POOL_RMP_TBL_RECORD = 0x1,
};
#define FWDL_MSS_POOL_DEFKEYSETS_SIZE 8
struct rtw89_fw_mss_pool_hdr {
u8 signature[8]; /* equal to mss_signature[] */
__le32 rmp_tbl_offset;
__le32 key_raw_offset;
u8 defen;
u8 rsvd[3];
u8 rmpfmt; /* enum rtw89_fw_mss_pool_rmp_tbl_type */
u8 mssdev_max;
__le16 keypair_num;
__le16 msscust_max;
__le16 msskey_num_max;
__le32 rsvd3;
u8 rmp_tbl[];
} __packed;
union rtw89_fw_section_mssc_content {
struct {
u8 pad[0x20];
u8 bit_in_chip_list;
u8 ver;
} __packed blacklist;
struct {
u8 pad[58];
__le32 v;
} __packed sb_sel_ver;
struct {
u8 pad[60];
__le16 v;
} __packed key_sign_len;
} __packed;
struct rtw89_fw_blacklist {
u8 ver;
u8 list[32];
};
extern const struct rtw89_fw_blacklist rtw89_fw_blacklist_default;
static inline void SET_CTRL_INFO_MACID(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 0, val, GENMASK(6, 0));
}
static inline void SET_CTRL_INFO_OPERATION(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 0, val, BIT(7));
}
#define SET_CMC_TBL_MASK_DATARATE GENMASK(8, 0)
static inline void SET_CMC_TBL_DATARATE(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 1, val, GENMASK(8, 0));
le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_DATARATE,
GENMASK(8, 0));
}
#define SET_CMC_TBL_MASK_FORCE_TXOP BIT(0)
static inline void SET_CMC_TBL_FORCE_TXOP(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 1, val, BIT(9));
le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_FORCE_TXOP,
BIT(9));
}
#define SET_CMC_TBL_MASK_DATA_BW GENMASK(1, 0)
static inline void SET_CMC_TBL_DATA_BW(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 1, val, GENMASK(11, 10));
le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_DATA_BW,
GENMASK(11, 10));
}
#define SET_CMC_TBL_MASK_DATA_GI_LTF GENMASK(2, 0)
static inline void SET_CMC_TBL_DATA_GI_LTF(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 1, val, GENMASK(14, 12));
le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_DATA_GI_LTF,
GENMASK(14, 12));
}
#define SET_CMC_TBL_MASK_DARF_TC_INDEX BIT(0)
static inline void SET_CMC_TBL_DARF_TC_INDEX(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 1, val, BIT(15));
le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_DARF_TC_INDEX,
BIT(15));
}
#define SET_CMC_TBL_MASK_ARFR_CTRL GENMASK(3, 0)
static inline void SET_CMC_TBL_ARFR_CTRL(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 1, val, GENMASK(19, 16));
le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_ARFR_CTRL,
GENMASK(19, 16));
}
#define SET_CMC_TBL_MASK_ACQ_RPT_EN BIT(0)
static inline void SET_CMC_TBL_ACQ_RPT_EN(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 1, val, BIT(20));
le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_ACQ_RPT_EN,
BIT(20));
}
#define SET_CMC_TBL_MASK_MGQ_RPT_EN BIT(0)
static inline void SET_CMC_TBL_MGQ_RPT_EN(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 1, val, BIT(21));
le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_MGQ_RPT_EN,
BIT(21));
}
#define SET_CMC_TBL_MASK_ULQ_RPT_EN BIT(0)
static inline void SET_CMC_TBL_ULQ_RPT_EN(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 1, val, BIT(22));
le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_ULQ_RPT_EN,
BIT(22));
}
#define SET_CMC_TBL_MASK_TWTQ_RPT_EN BIT(0)
static inline void SET_CMC_TBL_TWTQ_RPT_EN(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 1, val, BIT(23));
le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_TWTQ_RPT_EN,
BIT(23));
}
#define SET_CMC_TBL_MASK_DISRTSFB BIT(0)
static inline void SET_CMC_TBL_DISRTSFB(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 1, val, BIT(25));
le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_DISRTSFB,
BIT(25));
}
#define SET_CMC_TBL_MASK_DISDATAFB BIT(0)
static inline void SET_CMC_TBL_DISDATAFB(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 1, val, BIT(26));
le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_DISDATAFB,
BIT(26));
}
#define SET_CMC_TBL_MASK_TRYRATE BIT(0)
static inline void SET_CMC_TBL_TRYRATE(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 1, val, BIT(27));
le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_TRYRATE,
BIT(27));
}
#define SET_CMC_TBL_MASK_AMPDU_DENSITY GENMASK(3, 0)
static inline void SET_CMC_TBL_AMPDU_DENSITY(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 1, val, GENMASK(31, 28));
le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_AMPDU_DENSITY,
GENMASK(31, 28));
}
#define SET_CMC_TBL_MASK_DATA_RTY_LOWEST_RATE GENMASK(8, 0)
static inline void SET_CMC_TBL_DATA_RTY_LOWEST_RATE(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 2, val, GENMASK(8, 0));
le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_DATA_RTY_LOWEST_RATE,
GENMASK(8, 0));
}
#define SET_CMC_TBL_MASK_AMPDU_TIME_SEL BIT(0)
static inline void SET_CMC_TBL_AMPDU_TIME_SEL(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 2, val, BIT(9));
le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_AMPDU_TIME_SEL,
BIT(9));
}
#define SET_CMC_TBL_MASK_AMPDU_LEN_SEL BIT(0)
static inline void SET_CMC_TBL_AMPDU_LEN_SEL(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 2, val, BIT(10));
le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_AMPDU_LEN_SEL,
BIT(10));
}
#define SET_CMC_TBL_MASK_RTS_TXCNT_LMT_SEL BIT(0)
static inline void SET_CMC_TBL_RTS_TXCNT_LMT_SEL(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 2, val, BIT(11));
le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_RTS_TXCNT_LMT_SEL,
BIT(11));
}
#define SET_CMC_TBL_MASK_RTS_TXCNT_LMT GENMASK(3, 0)
static inline void SET_CMC_TBL_RTS_TXCNT_LMT(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 2, val, GENMASK(15, 12));
le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_RTS_TXCNT_LMT,
GENMASK(15, 12));
}
#define SET_CMC_TBL_MASK_RTSRATE GENMASK(8, 0)
static inline void SET_CMC_TBL_RTSRATE(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 2, val, GENMASK(24, 16));
le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_RTSRATE,
GENMASK(24, 16));
}
#define SET_CMC_TBL_MASK_VCS_STBC BIT(0)
static inline void SET_CMC_TBL_VCS_STBC(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 2, val, BIT(27));
le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_VCS_STBC,
BIT(27));
}
#define SET_CMC_TBL_MASK_RTS_RTY_LOWEST_RATE GENMASK(3, 0)
static inline void SET_CMC_TBL_RTS_RTY_LOWEST_RATE(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 2, val, GENMASK(31, 28));
le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_RTS_RTY_LOWEST_RATE,
GENMASK(31, 28));
}
#define SET_CMC_TBL_MASK_DATA_TX_CNT_LMT GENMASK(5, 0)
static inline void SET_CMC_TBL_DATA_TX_CNT_LMT(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 3, val, GENMASK(5, 0));
le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_DATA_TX_CNT_LMT,
GENMASK(5, 0));
}
#define SET_CMC_TBL_MASK_DATA_TXCNT_LMT_SEL BIT(0)
static inline void SET_CMC_TBL_DATA_TXCNT_LMT_SEL(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 3, val, BIT(6));
le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_DATA_TXCNT_LMT_SEL,
BIT(6));
}
#define SET_CMC_TBL_MASK_MAX_AGG_NUM_SEL BIT(0)
static inline void SET_CMC_TBL_MAX_AGG_NUM_SEL(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 3, val, BIT(7));
le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_MAX_AGG_NUM_SEL,
BIT(7));
}
#define SET_CMC_TBL_MASK_RTS_EN BIT(0)
static inline void SET_CMC_TBL_RTS_EN(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 3, val, BIT(8));
le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_RTS_EN,
BIT(8));
}
#define SET_CMC_TBL_MASK_CTS2SELF_EN BIT(0)
static inline void SET_CMC_TBL_CTS2SELF_EN(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 3, val, BIT(9));
le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_CTS2SELF_EN,
BIT(9));
}
#define SET_CMC_TBL_MASK_CCA_RTS GENMASK(1, 0)
static inline void SET_CMC_TBL_CCA_RTS(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 3, val, GENMASK(11, 10));
le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_CCA_RTS,
GENMASK(11, 10));
}
#define SET_CMC_TBL_MASK_HW_RTS_EN BIT(0)
static inline void SET_CMC_TBL_HW_RTS_EN(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 3, val, BIT(12));
le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_HW_RTS_EN,
BIT(12));
}
#define SET_CMC_TBL_MASK_RTS_DROP_DATA_MODE GENMASK(1, 0)
static inline void SET_CMC_TBL_RTS_DROP_DATA_MODE(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 3, val, GENMASK(14, 13));
le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_RTS_DROP_DATA_MODE,
GENMASK(14, 13));
}
#define SET_CMC_TBL_MASK_AMPDU_MAX_LEN GENMASK(10, 0)
static inline void SET_CMC_TBL_AMPDU_MAX_LEN(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 3, val, GENMASK(26, 16));
le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_AMPDU_MAX_LEN,
GENMASK(26, 16));
}
#define SET_CMC_TBL_MASK_UL_MU_DIS BIT(0)
static inline void SET_CMC_TBL_UL_MU_DIS(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 3, val, BIT(27));
le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_UL_MU_DIS,
BIT(27));
}
#define SET_CMC_TBL_MASK_AMPDU_MAX_TIME GENMASK(3, 0)
static inline void SET_CMC_TBL_AMPDU_MAX_TIME(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 3, val, GENMASK(31, 28));
le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_AMPDU_MAX_TIME,
GENMASK(31, 28));
}
#define SET_CMC_TBL_MASK_MAX_AGG_NUM GENMASK(7, 0)
static inline void SET_CMC_TBL_MAX_AGG_NUM(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(7, 0));
le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_MAX_AGG_NUM,
GENMASK(7, 0));
}
#define SET_CMC_TBL_MASK_BA_BMAP GENMASK(1, 0)
static inline void SET_CMC_TBL_BA_BMAP(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(9, 8));
le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_BA_BMAP,
GENMASK(9, 8));
}
#define SET_CMC_TBL_MASK_VO_LFTIME_SEL GENMASK(2, 0)
static inline void SET_CMC_TBL_VO_LFTIME_SEL(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(18, 16));
le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_VO_LFTIME_SEL,
GENMASK(18, 16));
}
#define SET_CMC_TBL_MASK_VI_LFTIME_SEL GENMASK(2, 0)
static inline void SET_CMC_TBL_VI_LFTIME_SEL(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(21, 19));
le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_VI_LFTIME_SEL,
GENMASK(21, 19));
}
#define SET_CMC_TBL_MASK_BE_LFTIME_SEL GENMASK(2, 0)
static inline void SET_CMC_TBL_BE_LFTIME_SEL(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(24, 22));
le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_BE_LFTIME_SEL,
GENMASK(24, 22));
}
#define SET_CMC_TBL_MASK_BK_LFTIME_SEL GENMASK(2, 0)
static inline void SET_CMC_TBL_BK_LFTIME_SEL(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(27, 25));
le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_BK_LFTIME_SEL,
GENMASK(27, 25));
}
#define SET_CMC_TBL_MASK_SECTYPE GENMASK(3, 0)
static inline void SET_CMC_TBL_SECTYPE(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(31, 28));
le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_SECTYPE,
GENMASK(31, 28));
}
#define SET_CMC_TBL_MASK_MULTI_PORT_ID GENMASK(2, 0)
static inline void SET_CMC_TBL_MULTI_PORT_ID(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 5, val, GENMASK(2, 0));
le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_MULTI_PORT_ID,
GENMASK(2, 0));
}
#define SET_CMC_TBL_MASK_BMC BIT(0)
static inline void SET_CMC_TBL_BMC(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 5, val, BIT(3));
le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_BMC,
BIT(3));
}
#define SET_CMC_TBL_MASK_MBSSID GENMASK(3, 0)
static inline void SET_CMC_TBL_MBSSID(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 5, val, GENMASK(7, 4));
le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_MBSSID,
GENMASK(7, 4));
}
#define SET_CMC_TBL_MASK_NAVUSEHDR BIT(0)
static inline void SET_CMC_TBL_NAVUSEHDR(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 5, val, BIT(8));
le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_NAVUSEHDR,
BIT(8));
}
#define SET_CMC_TBL_MASK_TXPWR_MODE GENMASK(2, 0)
static inline void SET_CMC_TBL_TXPWR_MODE(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 5, val, GENMASK(11, 9));
le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_TXPWR_MODE,
GENMASK(11, 9));
}
#define SET_CMC_TBL_MASK_DATA_DCM BIT(0)
static inline void SET_CMC_TBL_DATA_DCM(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 5, val, BIT(12));
le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_DATA_DCM,
BIT(12));
}
#define SET_CMC_TBL_MASK_DATA_ER BIT(0)
static inline void SET_CMC_TBL_DATA_ER(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 5, val, BIT(13));
le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_DATA_ER,
BIT(13));
}
#define SET_CMC_TBL_MASK_DATA_LDPC BIT(0)
static inline void SET_CMC_TBL_DATA_LDPC(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 5, val, BIT(14));
le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_DATA_LDPC,
BIT(14));
}
#define SET_CMC_TBL_MASK_DATA_STBC BIT(0)
static inline void SET_CMC_TBL_DATA_STBC(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 5, val, BIT(15));
le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_DATA_STBC,
BIT(15));
}
#define SET_CMC_TBL_MASK_A_CTRL_BQR BIT(0)
static inline void SET_CMC_TBL_A_CTRL_BQR(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 5, val, BIT(16));
le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_A_CTRL_BQR,
BIT(16));
}
#define SET_CMC_TBL_MASK_A_CTRL_UPH BIT(0)
static inline void SET_CMC_TBL_A_CTRL_UPH(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 5, val, BIT(17));
le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_A_CTRL_UPH,
BIT(17));
}
#define SET_CMC_TBL_MASK_A_CTRL_BSR BIT(0)
static inline void SET_CMC_TBL_A_CTRL_BSR(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 5, val, BIT(18));
le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_A_CTRL_BSR,
BIT(18));
}
#define SET_CMC_TBL_MASK_A_CTRL_CAS BIT(0)
static inline void SET_CMC_TBL_A_CTRL_CAS(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 5, val, BIT(19));
le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_A_CTRL_CAS,
BIT(19));
}
#define SET_CMC_TBL_MASK_DATA_BW_ER BIT(0)
static inline void SET_CMC_TBL_DATA_BW_ER(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 5, val, BIT(20));
le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_DATA_BW_ER,
BIT(20));
}
#define SET_CMC_TBL_MASK_LSIG_TXOP_EN BIT(0)
static inline void SET_CMC_TBL_LSIG_TXOP_EN(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 5, val, BIT(21));
le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_LSIG_TXOP_EN,
BIT(21));
}
#define SET_CMC_TBL_MASK_CTRL_CNT_VLD BIT(0)
static inline void SET_CMC_TBL_CTRL_CNT_VLD(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 5, val, BIT(27));
le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_CTRL_CNT_VLD,
BIT(27));
}
#define SET_CMC_TBL_MASK_CTRL_CNT GENMASK(3, 0)
static inline void SET_CMC_TBL_CTRL_CNT(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 5, val, GENMASK(31, 28));
le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_CTRL_CNT,
GENMASK(31, 28));
}
#define SET_CMC_TBL_MASK_RESP_REF_RATE GENMASK(8, 0)
static inline void SET_CMC_TBL_RESP_REF_RATE(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 6, val, GENMASK(8, 0));
le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_RESP_REF_RATE,
GENMASK(8, 0));
}
#define SET_CMC_TBL_MASK_ALL_ACK_SUPPORT BIT(0)
static inline void SET_CMC_TBL_ALL_ACK_SUPPORT(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 6, val, BIT(12));
le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_ALL_ACK_SUPPORT,
BIT(12));
}
#define SET_CMC_TBL_MASK_BSR_QUEUE_SIZE_FORMAT BIT(0)
static inline void SET_CMC_TBL_BSR_QUEUE_SIZE_FORMAT(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 6, val, BIT(13));
le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_BSR_QUEUE_SIZE_FORMAT,
BIT(13));
}
#define SET_CMC_TBL_MASK_NTX_PATH_EN GENMASK(3, 0)
static inline void SET_CMC_TBL_NTX_PATH_EN(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 6, val, GENMASK(19, 16));
le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_NTX_PATH_EN,
GENMASK(19, 16));
}
#define SET_CMC_TBL_MASK_PATH_MAP_A GENMASK(1, 0)
static inline void SET_CMC_TBL_PATH_MAP_A(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 6, val, GENMASK(21, 20));
le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_PATH_MAP_A,
GENMASK(21, 20));
}
#define SET_CMC_TBL_MASK_PATH_MAP_B GENMASK(1, 0)
static inline void SET_CMC_TBL_PATH_MAP_B(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 6, val, GENMASK(23, 22));
le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_PATH_MAP_B,
GENMASK(23, 22));
}
#define SET_CMC_TBL_MASK_PATH_MAP_C GENMASK(1, 0)
static inline void SET_CMC_TBL_PATH_MAP_C(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 6, val, GENMASK(25, 24));
le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_PATH_MAP_C,
GENMASK(25, 24));
}
#define SET_CMC_TBL_MASK_PATH_MAP_D GENMASK(1, 0)
static inline void SET_CMC_TBL_PATH_MAP_D(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 6, val, GENMASK(27, 26));
le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_PATH_MAP_D,
GENMASK(27, 26));
}
#define SET_CMC_TBL_MASK_ANTSEL_A BIT(0)
static inline void SET_CMC_TBL_ANTSEL_A(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 6, val, BIT(28));
le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_ANTSEL_A,
BIT(28));
}
#define SET_CMC_TBL_MASK_ANTSEL_B BIT(0)
static inline void SET_CMC_TBL_ANTSEL_B(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 6, val, BIT(29));
le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_ANTSEL_B,
BIT(29));
}
#define SET_CMC_TBL_MASK_ANTSEL_C BIT(0)
static inline void SET_CMC_TBL_ANTSEL_C(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 6, val, BIT(30));
le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_ANTSEL_C,
BIT(30));
}
#define SET_CMC_TBL_MASK_ANTSEL_D BIT(0)
static inline void SET_CMC_TBL_ANTSEL_D(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 6, val, BIT(31));
le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_ANTSEL_D,
BIT(31));
}
#define SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING GENMASK(1, 0)
static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING_V1(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(1, 0));
le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING,
GENMASK(1, 0));
}
static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING40_V1(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(3, 2));
le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING,
GENMASK(3, 2));
}
static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING80_V1(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(5, 4));
le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING,
GENMASK(5, 4));
}
static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING160_V1(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(7, 6));
le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING,
GENMASK(7, 6));
}
#define SET_CMC_TBL_MASK_ADDR_CAM_INDEX GENMASK(7, 0)
static inline void SET_CMC_TBL_ADDR_CAM_INDEX(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(7, 0));
le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_ADDR_CAM_INDEX,
GENMASK(7, 0));
}
#define SET_CMC_TBL_MASK_PAID GENMASK(8, 0)
static inline void SET_CMC_TBL_PAID(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(16, 8));
le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_PAID,
GENMASK(16, 8));
}
#define SET_CMC_TBL_MASK_ULDL BIT(0)
static inline void SET_CMC_TBL_ULDL(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 7, val, BIT(17));
le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_ULDL,
BIT(17));
}
#define SET_CMC_TBL_MASK_DOPPLER_CTRL GENMASK(1, 0)
static inline void SET_CMC_TBL_DOPPLER_CTRL(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(19, 18));
le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_DOPPLER_CTRL,
GENMASK(19, 18));
}
static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(21, 20));
le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING,
GENMASK(21, 20));
}
static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING40(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(23, 22));
le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING,
GENMASK(23, 22));
}
#define SET_CMC_TBL_MASK_TXPWR_TOLERENCE GENMASK(3, 0)
static inline void SET_CMC_TBL_TXPWR_TOLERENCE(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(27, 24));
le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_TXPWR_TOLERENCE,
GENMASK(27, 24));
}
static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING80(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(31, 30));
le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING,
GENMASK(31, 30));
}
#define SET_CMC_TBL_MASK_NC GENMASK(2, 0)
static inline void SET_CMC_TBL_NC(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(2, 0));
le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_NC,
GENMASK(2, 0));
}
#define SET_CMC_TBL_MASK_NR GENMASK(2, 0)
static inline void SET_CMC_TBL_NR(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(5, 3));
le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_NR,
GENMASK(5, 3));
}
#define SET_CMC_TBL_MASK_NG GENMASK(1, 0)
static inline void SET_CMC_TBL_NG(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(7, 6));
le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_NG,
GENMASK(7, 6));
}
#define SET_CMC_TBL_MASK_CB GENMASK(1, 0)
static inline void SET_CMC_TBL_CB(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(9, 8));
le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CB,
GENMASK(9, 8));
}
#define SET_CMC_TBL_MASK_CS GENMASK(1, 0)
static inline void SET_CMC_TBL_CS(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(11, 10));
le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CS,
GENMASK(11, 10));
}
#define SET_CMC_TBL_MASK_CSI_TXBF_EN BIT(0)
static inline void SET_CMC_TBL_CSI_TXBF_EN(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 8, val, BIT(12));
le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_TXBF_EN,
BIT(12));
}
#define SET_CMC_TBL_MASK_CSI_STBC_EN BIT(0)
static inline void SET_CMC_TBL_CSI_STBC_EN(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 8, val, BIT(13));
le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_STBC_EN,
BIT(13));
}
#define SET_CMC_TBL_MASK_CSI_LDPC_EN BIT(0)
static inline void SET_CMC_TBL_CSI_LDPC_EN(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 8, val, BIT(14));
le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_LDPC_EN,
BIT(14));
}
#define SET_CMC_TBL_MASK_CSI_PARA_EN BIT(0)
static inline void SET_CMC_TBL_CSI_PARA_EN(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 8, val, BIT(15));
le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_PARA_EN,
BIT(15));
}
#define SET_CMC_TBL_MASK_CSI_FIX_RATE GENMASK(8, 0)
static inline void SET_CMC_TBL_CSI_FIX_RATE(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(24, 16));
le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_FIX_RATE,
GENMASK(24, 16));
}
#define SET_CMC_TBL_MASK_CSI_GI_LTF GENMASK(2, 0)
static inline void SET_CMC_TBL_CSI_GI_LTF(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(27, 25));
le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_GI_LTF,
GENMASK(27, 25));
}
static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING160(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(29, 28));
le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING,
GENMASK(29, 28));
}
#define SET_CMC_TBL_MASK_CSI_BW GENMASK(1, 0)
static inline void SET_CMC_TBL_CSI_BW(void *table, u32 val)
{
le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(31, 30));
le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_BW,
GENMASK(31, 30));
}
struct rtw89_h2c_cctlinfo_ud_g7 {
__le32 c0;
__le32 w0;
__le32 w1;
__le32 w2;
__le32 w3;
__le32 w4;
__le32 w5;
__le32 w6;
__le32 w7;
__le32 w8;
__le32 w9;
__le32 w10;
__le32 w11;
__le32 w12;
__le32 w13;
__le32 w14;
__le32 w15;
__le32 m0;
__le32 m1;
__le32 m2;
__le32 m3;
__le32 m4;
__le32 m5;
__le32 m6;
__le32 m7;
__le32 m8;
__le32 m9;
__le32 m10;
__le32 m11;
__le32 m12;
__le32 m13;
__le32 m14;
__le32 m15;
} __packed;
#define CCTLINFO_G7_C0_MACID GENMASK(6, 0)
#define CCTLINFO_G7_C0_OP BIT(7)
#define CCTLINFO_G7_W0_DATARATE GENMASK(11, 0)
#define CCTLINFO_G7_W0_DATA_GI_LTF GENMASK(14, 12)
#define CCTLINFO_G7_W0_TRYRATE BIT(15)
#define CCTLINFO_G7_W0_ARFR_CTRL GENMASK(17, 16)
#define CCTLINFO_G7_W0_DIS_HE1SS_STBC BIT(18)
#define CCTLINFO_G7_W0_ACQ_RPT_EN BIT(20)
#define CCTLINFO_G7_W0_MGQ_RPT_EN BIT(21)
#define CCTLINFO_G7_W0_ULQ_RPT_EN BIT(22)
#define CCTLINFO_G7_W0_TWTQ_RPT_EN BIT(23)
#define CCTLINFO_G7_W0_FORCE_TXOP BIT(24)
#define CCTLINFO_G7_W0_DISRTSFB BIT(25)
#define CCTLINFO_G7_W0_DISDATAFB BIT(26)
#define CCTLINFO_G7_W0_NSTR_EN BIT(27)
#define CCTLINFO_G7_W0_AMPDU_DENSITY GENMASK(31, 28)
#define CCTLINFO_G7_W0_ALL (GENMASK(31, 20) | GENMASK(18, 0))
#define CCTLINFO_G7_W1_DATA_RTY_LOWEST_RATE GENMASK(11, 0)
#define CCTLINFO_G7_W1_RTS_TXCNT_LMT GENMASK(15, 12)
#define CCTLINFO_G7_W1_RTSRATE GENMASK(27, 16)
#define CCTLINFO_G7_W1_RTS_RTY_LOWEST_RATE GENMASK(31, 28)
#define CCTLINFO_G7_W1_ALL GENMASK(31, 0)
#define CCTLINFO_G7_W2_DATA_TX_CNT_LMT GENMASK(5, 0)
#define CCTLINFO_G7_W2_DATA_TXCNT_LMT_SEL BIT(6)
#define CCTLINFO_G7_W2_MAX_AGG_NUM_SEL BIT(7)
#define CCTLINFO_G7_W2_RTS_EN BIT(8)
#define CCTLINFO_G7_W2_CTS2SELF_EN BIT(9)
#define CCTLINFO_G7_W2_CCA_RTS GENMASK(11, 10)
#define CCTLINFO_G7_W2_HW_RTS_EN BIT(12)
#define CCTLINFO_G7_W2_RTS_DROP_DATA_MODE GENMASK(14, 13)
#define CCTLINFO_G7_W2_PRELD_EN BIT(15)
#define CCTLINFO_G7_W2_AMPDU_MAX_LEN GENMASK(26, 16)
#define CCTLINFO_G7_W2_UL_MU_DIS BIT(27)
#define CCTLINFO_G7_W2_AMPDU_MAX_TIME GENMASK(31, 28)
#define CCTLINFO_G7_W2_ALL GENMASK(31, 0)
#define CCTLINFO_G7_W3_MAX_AGG_NUM GENMASK(7, 0)
#define CCTLINFO_G7_W3_DATA_BW GENMASK(10, 8)
#define CCTLINFO_G7_W3_DATA_BW_ER BIT(11)
#define CCTLINFO_G7_W3_BA_BMAP GENMASK(14, 12)
#define CCTLINFO_G7_W3_VCS_STBC BIT(15)
#define CCTLINFO_G7_W3_VO_LFTIME_SEL GENMASK(18, 16)
#define CCTLINFO_G7_W3_VI_LFTIME_SEL GENMASK(21, 19)
#define CCTLINFO_G7_W3_BE_LFTIME_SEL GENMASK(24, 22)
#define CCTLINFO_G7_W3_BK_LFTIME_SEL GENMASK(27, 25)
#define CCTLINFO_G7_W3_AMPDU_TIME_SEL BIT(28)
#define CCTLINFO_G7_W3_AMPDU_LEN_SEL BIT(29)
#define CCTLINFO_G7_W3_RTS_TXCNT_LMT_SEL BIT(30)
#define CCTLINFO_G7_W3_LSIG_TXOP_EN BIT(31)
#define CCTLINFO_G7_W3_ALL GENMASK(31, 0)
#define CCTLINFO_G7_W4_MULTI_PORT_ID GENMASK(2, 0)
#define CCTLINFO_G7_W4_BYPASS_PUNC BIT(3)
#define CCTLINFO_G7_W4_MBSSID GENMASK(7, 4)
#define CCTLINFO_G7_W4_DATA_DCM BIT(8)
#define CCTLINFO_G7_W4_DATA_ER BIT(9)
#define CCTLINFO_G7_W4_DATA_LDPC BIT(10)
#define CCTLINFO_G7_W4_DATA_STBC BIT(11)
#define CCTLINFO_G7_W4_A_CTRL_BQR BIT(12)
#define CCTLINFO_G7_W4_A_CTRL_BSR BIT(14)
#define CCTLINFO_G7_W4_A_CTRL_CAS BIT(15)
#define CCTLINFO_G7_W4_ACT_SUBCH_CBW GENMASK(31, 16)
#define CCTLINFO_G7_W4_ALL (GENMASK(31, 14) | GENMASK(12, 0))
#define CCTLINFO_G7_W5_NOMINAL_PKT_PADDING0 GENMASK(1, 0)
#define CCTLINFO_G7_W5_NOMINAL_PKT_PADDING1 GENMASK(3, 2)
#define CCTLINFO_G7_W5_NOMINAL_PKT_PADDING2 GENMASK(5, 4)
#define CCTLINFO_G7_W5_NOMINAL_PKT_PADDING3 GENMASK(7, 6)
#define CCTLINFO_G7_W5_NOMINAL_PKT_PADDING4 GENMASK(9, 8)
#define CCTLINFO_G7_W5_SR_RATE GENMASK(14, 10)
#define CCTLINFO_G7_W5_TID_DISABLE GENMASK(23, 16)
#define CCTLINFO_G7_W5_ADDR_CAM_INDEX GENMASK(31, 24)
#define CCTLINFO_G7_W5_ALL (GENMASK(31, 16) | GENMASK(14, 0))
#define CCTLINFO_G7_W6_AID12_PAID GENMASK(11, 0)
#define CCTLINFO_G7_W6_RESP_REF_RATE GENMASK(23, 12)
#define CCTLINFO_G7_W6_ULDL BIT(31)
#define CCTLINFO_G7_W6_ALL (BIT(31) | GENMASK(23, 0))
#define CCTLINFO_G7_W7_NC GENMASK(2, 0)
#define CCTLINFO_G7_W7_NR GENMASK(5, 3)
#define CCTLINFO_G7_W7_NG GENMASK(7, 6)
#define CCTLINFO_G7_W7_CB GENMASK(9, 8)
#define CCTLINFO_G7_W7_CS GENMASK(11, 10)
#define CCTLINFO_G7_W7_CSI_STBC_EN BIT(13)
#define CCTLINFO_G7_W7_CSI_LDPC_EN BIT(14)
#define CCTLINFO_G7_W7_CSI_PARA_EN BIT(15)
#define CCTLINFO_G7_W7_CSI_FIX_RATE GENMASK(27, 16)
#define CCTLINFO_G7_W7_CSI_BW GENMASK(31, 29)
#define CCTLINFO_G7_W7_ALL (GENMASK(31, 29) | GENMASK(27, 13) | GENMASK(11, 0))
#define CCTLINFO_G7_W8_ALL_ACK_SUPPORT BIT(0)
#define CCTLINFO_G7_W8_BSR_QUEUE_SIZE_FORMAT BIT(1)
#define CCTLINFO_G7_W8_BSR_OM_UPD_EN BIT(2)
#define CCTLINFO_G7_W8_MACID_FWD_IDC BIT(3)
#define CCTLINFO_G7_W8_AZ_SEC_EN BIT(4)
#define CCTLINFO_G7_W8_CSI_SEC_EN BIT(5)
#define CCTLINFO_G7_W8_FIX_UL_ADDRCAM_IDX BIT(6)
#define CCTLINFO_G7_W8_CTRL_CNT_VLD BIT(7)
#define CCTLINFO_G7_W8_CTRL_CNT GENMASK(11, 8)
#define CCTLINFO_G7_W8_RESP_SEC_TYPE GENMASK(15, 12)
#define CCTLINFO_G7_W8_ALL GENMASK(15, 0)
/* W9~13 are reserved */
#define CCTLINFO_G7_W14_VO_CURR_RATE GENMASK(11, 0)
#define CCTLINFO_G7_W14_VI_CURR_RATE GENMASK(23, 12)
#define CCTLINFO_G7_W14_BE_CURR_RATE_L GENMASK(31, 24)
#define CCTLINFO_G7_W14_ALL GENMASK(31, 0)
#define CCTLINFO_G7_W15_BE_CURR_RATE_H GENMASK(3, 0)
#define CCTLINFO_G7_W15_BK_CURR_RATE GENMASK(15, 4)
#define CCTLINFO_G7_W15_MGNT_CURR_RATE GENMASK(27, 16)
#define CCTLINFO_G7_W15_ALL GENMASK(27, 0)
struct rtw89_h2c_bcn_upd {
__le32 w0;
__le32 w1;
__le32 w2;
} __packed;
#define RTW89_H2C_BCN_UPD_W0_PORT GENMASK(7, 0)
#define RTW89_H2C_BCN_UPD_W0_MBSSID GENMASK(15, 8)
#define RTW89_H2C_BCN_UPD_W0_BAND GENMASK(23, 16)
#define RTW89_H2C_BCN_UPD_W0_GRP_IE_OFST GENMASK(31, 24)
#define RTW89_H2C_BCN_UPD_W1_MACID GENMASK(7, 0)
#define RTW89_H2C_BCN_UPD_W1_SSN_SEL GENMASK(9, 8)
#define RTW89_H2C_BCN_UPD_W1_SSN_MODE GENMASK(11, 10)
#define RTW89_H2C_BCN_UPD_W1_RATE GENMASK(20, 12)
#define RTW89_H2C_BCN_UPD_W1_TXPWR GENMASK(23, 21)
#define RTW89_H2C_BCN_UPD_W2_TXINFO_CTRL_EN BIT(0)
#define RTW89_H2C_BCN_UPD_W2_NTX_PATH_EN GENMASK(4, 1)
#define RTW89_H2C_BCN_UPD_W2_PATH_MAP_A GENMASK(6, 5)
#define RTW89_H2C_BCN_UPD_W2_PATH_MAP_B GENMASK(8, 7)
#define RTW89_H2C_BCN_UPD_W2_PATH_MAP_C GENMASK(10, 9)
#define RTW89_H2C_BCN_UPD_W2_PATH_MAP_D GENMASK(12, 11)
#define RTW89_H2C_BCN_UPD_W2_PATH_ANTSEL_A BIT(13)
#define RTW89_H2C_BCN_UPD_W2_PATH_ANTSEL_B BIT(14)
#define RTW89_H2C_BCN_UPD_W2_PATH_ANTSEL_C BIT(15)
#define RTW89_H2C_BCN_UPD_W2_PATH_ANTSEL_D BIT(16)
#define RTW89_H2C_BCN_UPD_W2_CSA_OFST GENMASK(31, 17)
struct rtw89_h2c_bcn_upd_be {
__le32 w0;
__le32 w1;
__le32 w2;
__le32 w3;
__le32 w4;
__le32 w5;
__le32 w6;
__le32 w7;
__le32 w8;
__le32 w9;
__le32 w10;
__le32 w11;
__le32 w12;
__le32 w13;
__le32 w14;
__le32 w15;
__le32 w16;
__le32 w17;
__le32 w18;
__le32 w19;
__le32 w20;
__le32 w21;
__le32 w22;
__le32 w23;
__le32 w24;
__le32 w25;
__le32 w26;
__le32 w27;
__le32 w28;
__le32 w29;
} __packed;
#define RTW89_H2C_BCN_UPD_BE_W0_PORT GENMASK(7, 0)
#define RTW89_H2C_BCN_UPD_BE_W0_MBSSID GENMASK(15, 8)
#define RTW89_H2C_BCN_UPD_BE_W0_BAND GENMASK(23, 16)
#define RTW89_H2C_BCN_UPD_BE_W0_GRP_IE_OFST GENMASK(31, 24)
#define RTW89_H2C_BCN_UPD_BE_W1_MACID GENMASK(7, 0)
#define RTW89_H2C_BCN_UPD_BE_W1_SSN_SEL GENMASK(9, 8)
#define RTW89_H2C_BCN_UPD_BE_W1_SSN_MODE GENMASK(11, 10)
#define RTW89_H2C_BCN_UPD_BE_W1_RATE GENMASK(20, 12)
#define RTW89_H2C_BCN_UPD_BE_W1_TXPWR GENMASK(23, 21)
#define RTW89_H2C_BCN_UPD_BE_W1_MACID_EXT GENMASK(31, 24)
#define RTW89_H2C_BCN_UPD_BE_W2_TXINFO_CTRL_EN BIT(0)
#define RTW89_H2C_BCN_UPD_BE_W2_NTX_PATH_EN GENMASK(4, 1)
#define RTW89_H2C_BCN_UPD_BE_W2_PATH_MAP_A GENMASK(6, 5)
#define RTW89_H2C_BCN_UPD_BE_W2_PATH_MAP_B GENMASK(8, 7)
#define RTW89_H2C_BCN_UPD_BE_W2_PATH_MAP_C GENMASK(10, 9)
#define RTW89_H2C_BCN_UPD_BE_W2_PATH_MAP_D GENMASK(12, 11)
#define RTW89_H2C_BCN_UPD_BE_W2_ANTSEL_A BIT(13)
#define RTW89_H2C_BCN_UPD_BE_W2_ANTSEL_B BIT(14)
#define RTW89_H2C_BCN_UPD_BE_W2_ANTSEL_C BIT(15)
#define RTW89_H2C_BCN_UPD_BE_W2_ANTSEL_D BIT(16)
#define RTW89_H2C_BCN_UPD_BE_W2_CSA_OFST GENMASK(31, 17)
#define RTW89_H2C_BCN_UPD_BE_W3_MLIE_CSA_OFST GENMASK(15, 0)
#define RTW89_H2C_BCN_UPD_BE_W3_CRITICAL_UPD_FLAG_OFST GENMASK(31, 16)
#define RTW89_H2C_BCN_UPD_BE_W4_VAP1_DTIM_CNT_OFST GENMASK(15, 0)
#define RTW89_H2C_BCN_UPD_BE_W4_VAP2_DTIM_CNT_OFST GENMASK(31, 16)
#define RTW89_H2C_BCN_UPD_BE_W5_VAP3_DTIM_CNT_OFST GENMASK(15, 0)
#define RTW89_H2C_BCN_UPD_BE_W5_VAP4_DTIM_CNT_OFST GENMASK(31, 16)
#define RTW89_H2C_BCN_UPD_BE_W6_VAP5_DTIM_CNT_OFST GENMASK(15, 0)
#define RTW89_H2C_BCN_UPD_BE_W6_VAP6_DTIM_CNT_OFST GENMASK(31, 16)
#define RTW89_H2C_BCN_UPD_BE_W7_VAP7_DTIM_CNT_OFST GENMASK(15, 0)
#define RTW89_H2C_BCN_UPD_BE_W7_ECSA_OFST GENMASK(30, 16)
#define RTW89_H2C_BCN_UPD_BE_W7_PROTECTION_KEY_ID BIT(31)
struct rtw89_h2c_role_maintain {
__le32 w0;
};
#define RTW89_H2C_ROLE_MAINTAIN_W0_MACID GENMASK(7, 0)
#define RTW89_H2C_ROLE_MAINTAIN_W0_SELF_ROLE GENMASK(9, 8)
#define RTW89_H2C_ROLE_MAINTAIN_W0_UPD_MODE GENMASK(12, 10)
#define RTW89_H2C_ROLE_MAINTAIN_W0_WIFI_ROLE GENMASK(16, 13)
#define RTW89_H2C_ROLE_MAINTAIN_W0_BAND GENMASK(18, 17)
#define RTW89_H2C_ROLE_MAINTAIN_W0_PORT GENMASK(21, 19)
#define RTW89_H2C_ROLE_MAINTAIN_W0_MACID_EXT GENMASK(31, 24)
enum rtw89_fw_sta_type { /* value of RTW89_H2C_JOININFO_W1_STA_TYPE */
RTW89_FW_N_AC_STA = 0,
RTW89_FW_AX_STA = 1,
RTW89_FW_BE_STA = 2,
};
struct rtw89_h2c_join {
__le32 w0;
} __packed;
struct rtw89_h2c_join_v1 {
__le32 w0;
__le32 w1;
__le32 w2;
} __packed;
#define RTW89_H2C_JOININFO_W0_MACID GENMASK(7, 0)
#define RTW89_H2C_JOININFO_W0_OP BIT(8)
#define RTW89_H2C_JOININFO_W0_BAND BIT(9)
#define RTW89_H2C_JOININFO_W0_WMM GENMASK(11, 10)
#define RTW89_H2C_JOININFO_W0_TGR BIT(12)
#define RTW89_H2C_JOININFO_W0_ISHESTA BIT(13)
#define RTW89_H2C_JOININFO_W0_DLBW GENMASK(15, 14)
#define RTW89_H2C_JOININFO_W0_TF_MAC_PAD GENMASK(17, 16)
#define RTW89_H2C_JOININFO_W0_DL_T_PE GENMASK(20, 18)
#define RTW89_H2C_JOININFO_W0_PORT_ID GENMASK(23, 21)
#define RTW89_H2C_JOININFO_W0_NET_TYPE GENMASK(25, 24)
#define RTW89_H2C_JOININFO_W0_WIFI_ROLE GENMASK(29, 26)
#define RTW89_H2C_JOININFO_W0_SELF_ROLE GENMASK(31, 30)
#define RTW89_H2C_JOININFO_W1_STA_TYPE GENMASK(2, 0)
#define RTW89_H2C_JOININFO_W1_IS_MLD BIT(3)
#define RTW89_H2C_JOININFO_W1_MAIN_MACID GENMASK(11, 4)
#define RTW89_H2C_JOININFO_W1_MLO_MODE BIT(12)
#define RTW89_H2C_JOININFO_MLO_MODE_MLMR 0
#define RTW89_H2C_JOININFO_MLO_MODE_MLSR 1
#define RTW89_H2C_JOININFO_W1_EMLSR_CAB BIT(13)
#define RTW89_H2C_JOININFO_W1_NSTR_EN BIT(14)
#define RTW89_H2C_JOININFO_W1_INIT_PWR_STATE BIT(15)
#define RTW89_H2C_JOININFO_W1_EMLSR_PADDING GENMASK(18, 16)
#define RTW89_H2C_JOININFO_W1_EMLSR_TRANS_DELAY GENMASK(21, 19)
#define RTW89_H2C_JOININFO_W2_MACID_EXT GENMASK(7, 0)
#define RTW89_H2C_JOININFO_W2_MAIN_MACID_EXT GENMASK(15, 8)
struct rtw89_h2c_notify_dbcc {
__le32 w0;
} __packed;
#define RTW89_H2C_NOTIFY_DBCC_EN BIT(0)
static inline void SET_GENERAL_PKT_MACID(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, GENMASK(7, 0));
}
static inline void SET_GENERAL_PKT_PROBRSP_ID(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, GENMASK(15, 8));
}
static inline void SET_GENERAL_PKT_PSPOLL_ID(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, GENMASK(23, 16));
}
static inline void SET_GENERAL_PKT_NULL_ID(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, GENMASK(31, 24));
}
static inline void SET_GENERAL_PKT_QOS_NULL_ID(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(7, 0));
}
static inline void SET_GENERAL_PKT_CTS2SELF_ID(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(15, 8));
}
static inline void SET_LOG_CFG_LEVEL(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, GENMASK(7, 0));
}
static inline void SET_LOG_CFG_PATH(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, GENMASK(15, 8));
}
static inline void SET_LOG_CFG_COMP(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(31, 0));
}
static inline void SET_LOG_CFG_COMP_EXT(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)(h2c) + 2, val, GENMASK(31, 0));
}
struct rtw89_h2c_ba_cam {
__le32 w0;
__le32 w1;
} __packed;
#define RTW89_H2C_BA_CAM_W0_VALID BIT(0)
#define RTW89_H2C_BA_CAM_W0_INIT_REQ BIT(1)
#define RTW89_H2C_BA_CAM_W0_ENTRY_IDX GENMASK(3, 2)
#define RTW89_H2C_BA_CAM_W0_TID GENMASK(7, 4)
#define RTW89_H2C_BA_CAM_W0_MACID GENMASK(15, 8)
#define RTW89_H2C_BA_CAM_W0_BMAP_SIZE GENMASK(19, 16)
#define RTW89_H2C_BA_CAM_W0_SSN GENMASK(31, 20)
#define RTW89_H2C_BA_CAM_W1_UID GENMASK(7, 0)
#define RTW89_H2C_BA_CAM_W1_STD_EN BIT(8)
#define RTW89_H2C_BA_CAM_W1_BAND BIT(9)
#define RTW89_H2C_BA_CAM_W1_ENTRY_IDX_V1 GENMASK(31, 28)
struct rtw89_h2c_ba_cam_v1 {
__le32 w0;
__le32 w1;
} __packed;
#define RTW89_H2C_BA_CAM_V1_W0_VALID BIT(0)
#define RTW89_H2C_BA_CAM_V1_W0_INIT_REQ BIT(1)
#define RTW89_H2C_BA_CAM_V1_W0_TID_MASK GENMASK(7, 4)
#define RTW89_H2C_BA_CAM_V1_W0_MACID_MASK GENMASK(15, 8)
#define RTW89_H2C_BA_CAM_V1_W0_BMAP_SIZE_MASK GENMASK(19, 16)
#define RTW89_H2C_BA_CAM_V1_W0_SSN_MASK GENMASK(31, 20)
#define RTW89_H2C_BA_CAM_V1_W1_UID_VALUE_MASK GENMASK(7, 0)
#define RTW89_H2C_BA_CAM_V1_W1_STD_ENTRY_EN BIT(8)
#define RTW89_H2C_BA_CAM_V1_W1_BAND_SEL BIT(9)
#define RTW89_H2C_BA_CAM_V1_W1_MLD_EN BIT(10)
#define RTW89_H2C_BA_CAM_V1_W1_ENTRY_IDX_MASK GENMASK(31, 24)
struct rtw89_h2c_ba_cam_init {
__le32 w0;
} __packed;
#define RTW89_H2C_BA_CAM_INIT_USERS_MASK GENMASK(7, 0)
#define RTW89_H2C_BA_CAM_INIT_OFFSET_MASK GENMASK(19, 12)
#define RTW89_H2C_BA_CAM_INIT_BAND_SEL BIT(24)
static inline void SET_LPS_PARM_MACID(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, GENMASK(7, 0));
}
static inline void SET_LPS_PARM_PSMODE(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, GENMASK(15, 8));
}
static inline void SET_LPS_PARM_RLBM(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, GENMASK(19, 16));
}
static inline void SET_LPS_PARM_SMARTPS(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, GENMASK(23, 20));
}
static inline void SET_LPS_PARM_AWAKEINTERVAL(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, GENMASK(31, 24));
}
static inline void SET_LPS_PARM_VOUAPSD(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)(h2c) + 1, val, BIT(0));
}
static inline void SET_LPS_PARM_VIUAPSD(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)(h2c) + 1, val, BIT(1));
}
static inline void SET_LPS_PARM_BEUAPSD(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)(h2c) + 1, val, BIT(2));
}
static inline void SET_LPS_PARM_BKUAPSD(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)(h2c) + 1, val, BIT(3));
}
static inline void SET_LPS_PARM_LASTRPWM(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(15, 8));
}
struct rtw89_h2c_lps_ch_info {
struct {
u8 pri_ch;
u8 central_ch;
u8 bw;
u8 band;
} __packed info[2];
__le32 mlo_dbcc_mode_lps;
} __packed;
struct rtw89_h2c_lps_ml_cmn_info {
u8 fmt_id;
u8 rfe_type;
u8 rsvd0[2];
__le32 mlo_dbcc_mode;
u8 central_ch[RTW89_PHY_NUM];
u8 pri_ch[RTW89_PHY_NUM];
u8 bw[RTW89_PHY_NUM];
u8 band[RTW89_PHY_NUM];
u8 bcn_rate_type[RTW89_PHY_NUM];
u8 rsvd1[2];
__le16 tia_gain[RTW89_PHY_NUM][TIA_GAIN_NUM];
u8 lna_gain[RTW89_PHY_NUM][LNA_GAIN_NUM];
u8 rsvd2[2];
u8 tia_lna_op1db[RTW89_PHY_NUM][LNA_GAIN_NUM + 1];
u8 lna_op1db[RTW89_PHY_NUM][LNA_GAIN_NUM];
u8 dup_bcn_ofst[RTW89_PHY_NUM];
} __packed;
struct rtw89_h2c_trig_cpu_except {
__le32 w0;
} __packed;
#define RTW89_H2C_CPU_EXCEPTION_TYPE GENMASK(31, 0)
static inline void RTW89_SET_FWCMD_PKT_DROP_SEL(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)cmd, val, GENMASK(7, 0));
}
static inline void RTW89_SET_FWCMD_PKT_DROP_MACID(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 8));
}
static inline void RTW89_SET_FWCMD_PKT_DROP_BAND(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)cmd, val, GENMASK(23, 16));
}
static inline void RTW89_SET_FWCMD_PKT_DROP_PORT(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 24));
}
static inline void RTW89_SET_FWCMD_PKT_DROP_MBSSID(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(7, 0));
}
static inline void RTW89_SET_FWCMD_PKT_DROP_ROLE_A_INFO_TF_TRS(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(15, 8));
}
static inline void RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_0(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)cmd + 2, val, GENMASK(31, 0));
}
static inline void RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_1(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)cmd + 3, val, GENMASK(31, 0));
}
static inline void RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_2(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)cmd + 4, val, GENMASK(31, 0));
}
static inline void RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_3(void *cmd, u32 val)
{
le32p_replace_bits((__le32 *)cmd + 5, val, GENMASK(31, 0));
}
static inline void RTW89_SET_KEEP_ALIVE_ENABLE(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, GENMASK(1, 0));
}
static inline void RTW89_SET_KEEP_ALIVE_PKT_NULL_ID(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, GENMASK(15, 8));
}
static inline void RTW89_SET_KEEP_ALIVE_PERIOD(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, GENMASK(24, 16));
}
static inline void RTW89_SET_KEEP_ALIVE_MACID(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, GENMASK(31, 24));
}
static inline void RTW89_SET_DISCONNECT_DETECT_ENABLE(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, BIT(0));
}
static inline void RTW89_SET_DISCONNECT_DETECT_TRYOK_BCNFAIL_COUNT_EN(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, BIT(1));
}
static inline void RTW89_SET_DISCONNECT_DETECT_DISCONNECT(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, BIT(2));
}
static inline void RTW89_SET_DISCONNECT_DETECT_MAC_ID(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, GENMASK(15, 8));
}
static inline void RTW89_SET_DISCONNECT_DETECT_CHECK_PERIOD(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, GENMASK(23, 16));
}
static inline void RTW89_SET_DISCONNECT_DETECT_TRY_PKT_COUNT(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, GENMASK(31, 24));
}
static inline void RTW89_SET_DISCONNECT_DETECT_TRYOK_BCNFAIL_COUNT_LIMIT(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(7, 0));
}
struct rtw89_h2c_wow_global {
__le32 w0;
struct rtw89_wow_key_info key_info;
} __packed;
#define RTW89_H2C_WOW_GLOBAL_W0_ENABLE BIT(0)
#define RTW89_H2C_WOW_GLOBAL_W0_DROP_ALL_PKT BIT(1)
#define RTW89_H2C_WOW_GLOBAL_W0_RX_PARSE_AFTER_WAKE BIT(2)
#define RTW89_H2C_WOW_GLOBAL_W0_WAKE_BAR_PULLED BIT(3)
#define RTW89_H2C_WOW_GLOBAL_W0_MAC_ID GENMASK(15, 8)
#define RTW89_H2C_WOW_GLOBAL_W0_PAIRWISE_SEC_ALGO GENMASK(23, 16)
#define RTW89_H2C_WOW_GLOBAL_W0_GROUP_SEC_ALGO GENMASK(31, 24)
#define RTW89_MAX_SUPPORT_NL_NUM 16
struct rtw89_h2c_cfg_nlo {
__le32 w0;
u8 nlo_cnt;
u8 rsvd[3];
__le32 patterncheck;
__le32 rsvd1;
__le32 rsvd2;
u8 ssid_len[RTW89_MAX_SUPPORT_NL_NUM];
u8 chiper[RTW89_MAX_SUPPORT_NL_NUM];
u8 rsvd3[24];
u8 ssid[RTW89_MAX_SUPPORT_NL_NUM][IEEE80211_MAX_SSID_LEN];
} __packed;
#define RTW89_H2C_NLO_W0_ENABLE BIT(0)
#define RTW89_H2C_NLO_W0_IGNORE_CIPHER BIT(2)
#define RTW89_H2C_NLO_W0_MACID GENMASK(31, 24)
static inline void RTW89_SET_WOW_WAKEUP_CTRL_PATTERN_MATCH_ENABLE(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, BIT(0));
}
static inline void RTW89_SET_WOW_WAKEUP_CTRL_MAGIC_ENABLE(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, BIT(1));
}
static inline void RTW89_SET_WOW_WAKEUP_CTRL_HW_UNICAST_ENABLE(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, BIT(2));
}
static inline void RTW89_SET_WOW_WAKEUP_CTRL_FW_UNICAST_ENABLE(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, BIT(3));
}
static inline void RTW89_SET_WOW_WAKEUP_CTRL_DEAUTH_ENABLE(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, BIT(4));
}
static inline void RTW89_SET_WOW_WAKEUP_CTRL_REKEYP_ENABLE(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, BIT(5));
}
static inline void RTW89_SET_WOW_WAKEUP_CTRL_EAP_ENABLE(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, BIT(6));
}
static inline void RTW89_SET_WOW_WAKEUP_CTRL_ALL_DATA_ENABLE(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, BIT(7));
}
static inline void RTW89_SET_WOW_WAKEUP_CTRL_MAC_ID(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, GENMASK(31, 24));
}
static inline void RTW89_SET_WOW_CAM_UPD_R_W(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, BIT(0));
}
static inline void RTW89_SET_WOW_CAM_UPD_IDX(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, GENMASK(7, 1));
}
static inline void RTW89_SET_WOW_CAM_UPD_WKFM1(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c + 1, val, GENMASK(31, 0));
}
static inline void RTW89_SET_WOW_CAM_UPD_WKFM2(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c + 2, val, GENMASK(31, 0));
}
static inline void RTW89_SET_WOW_CAM_UPD_WKFM3(void *h2c, u32 val)
{
--> --------------------
--> maximum size reached
--> --------------------
Messung V0.5 C=97 H=94 G=95
¤ Dauer der Verarbeitung: 0.40 Sekunden
(vorverarbeitet)
¤
*© Formatika GbR, Deutschland