Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/drivers/net/wireless/realtek/rtw89/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 182 kB image not shown  

Quelle  core.h   Sprache: C

 
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
/* Copyright(c) 2019-2020  Realtek Corporation
 */


#ifndef __RTW89_CORE_H__
#define __RTW89_CORE_H__

#include <linux/average.h>
#include <linux/bitfield.h>
#include <linux/dmi.h>
#include <linux/firmware.h>
#include <linux/iopoll.h>
#include <linux/workqueue.h>
#include <net/mac80211.h>

struct rtw89_dev;
struct rtw89_pci_info;
struct rtw89_mac_gen_def;
struct rtw89_phy_gen_def;
struct rtw89_fw_blacklist;
struct rtw89_efuse_block_cfg;
struct rtw89_h2c_rf_tssi;
struct rtw89_fw_txpwr_track_cfg;
struct rtw89_phy_rfk_log_fmt;
struct rtw89_debugfs;
struct rtw89_regd_data;

extern const struct ieee80211_ops rtw89_ops;

#define MASKBYTE0 0xff
#define MASKBYTE1 0xff00
#define MASKBYTE2 0xff0000
#define MASKBYTE3 0xff000000
#define MASKBYTE4 0xff00000000ULL
#define MASKHWORD 0xffff0000
#define MASKLWORD 0x0000ffff
#define MASKDWORD 0xffffffff
#define RFREG_MASK 0xfffff
#define INV_RF_DATA 0xffffffff
#define BYPASS_CR_DATA 0xbabecafe

#define RTW89_TRACK_WORK_PERIOD round_jiffies_relative(HZ * 2)
#define RTW89_TRACK_PS_WORK_PERIOD msecs_to_jiffies(100)
#define RTW89_FORBID_BA_TIMER round_jiffies_relative(HZ * 4)
#define CFO_TRACK_MAX_USER 64
#define MAX_RSSI 110
#define RSSI_FACTOR 1
#define RTW89_RSSI_RAW_TO_DBM(rssi) ((s8)((rssi) >> RSSI_FACTOR) - MAX_RSSI)
#define RTW89_TX_DIV_RSSI_RAW_TH (2 << RSSI_FACTOR)
#define DELTA_SWINGIDX_SIZE 30

#define RTW89_RADIOTAP_ROOM_HE sizeof(struct ieee80211_radiotap_he)
#define RTW89_RADIOTAP_ROOM_EHT \
 (sizeof(struct ieee80211_radiotap_tlv) + \
  ALIGN(struct_size((struct ieee80211_radiotap_eht *)0, user_info, 1), 4) + \
  sizeof(struct ieee80211_radiotap_tlv) + \
  ALIGN(sizeof(struct ieee80211_radiotap_eht_usig), 4))
#define RTW89_RADIOTAP_ROOM \
 ALIGN(max(RTW89_RADIOTAP_ROOM_HE, RTW89_RADIOTAP_ROOM_EHT), 64)

#define RTW89_HTC_MASK_VARIANT GENMASK(1, 0)
#define RTW89_HTC_VARIANT_HE 3
#define RTW89_HTC_MASK_CTL_ID GENMASK(5, 2)
#define RTW89_HTC_VARIANT_HE_CID_OM 1
#define RTW89_HTC_VARIANT_HE_CID_CAS 6
#define RTW89_HTC_MASK_CTL_INFO GENMASK(31, 6)

#define RTW89_HTC_MASK_HTC_OM_RX_NSS GENMASK(8, 6)
enum htc_om_channel_width {
 HTC_OM_CHANNEL_WIDTH_20 = 0,
 HTC_OM_CHANNEL_WIDTH_40 = 1,
 HTC_OM_CHANNEL_WIDTH_80 = 2,
 HTC_OM_CHANNEL_WIDTH_160_OR_80_80 = 3,
};
#define RTW89_HTC_MASK_HTC_OM_CH_WIDTH GENMASK(10, 9)
#define RTW89_HTC_MASK_HTC_OM_UL_MU_DIS BIT(11)
#define RTW89_HTC_MASK_HTC_OM_TX_NSTS GENMASK(14, 12)
#define RTW89_HTC_MASK_HTC_OM_ER_SU_DIS BIT(15)
#define RTW89_HTC_MASK_HTC_OM_DL_MU_MIMO_RR BIT(16)
#define RTW89_HTC_MASK_HTC_OM_UL_MU_DATA_DIS BIT(17)

#define RTW89_TF_PAD GENMASK(11, 0)
#define RTW89_TF_BASIC_USER_INFO_SZ 6

#define RTW89_GET_TF_USER_INFO_AID12(data) \
 le32_get_bits(*((const __le32 *)(data)), GENMASK(11, 0))
#define RTW89_GET_TF_USER_INFO_RUA(data) \
 le32_get_bits(*((const __le32 *)(data)), GENMASK(19, 12))
#define RTW89_GET_TF_USER_INFO_UL_MCS(data) \
 le32_get_bits(*((const __le32 *)(data)), GENMASK(24, 21))

enum rtw89_subband {
 RTW89_CH_2G = 0,
 RTW89_CH_5G_BAND_1 = 1,
 /* RTW89_CH_5G_BAND_2 = 2, unused */
 RTW89_CH_5G_BAND_3 = 3,
 RTW89_CH_5G_BAND_4 = 4,

 RTW89_CH_6G_BAND_IDX0, /* Low */
 RTW89_CH_6G_BAND_IDX1, /* Low */
 RTW89_CH_6G_BAND_IDX2, /* Mid */
 RTW89_CH_6G_BAND_IDX3, /* Mid */
 RTW89_CH_6G_BAND_IDX4, /* High */
 RTW89_CH_6G_BAND_IDX5, /* High */
 RTW89_CH_6G_BAND_IDX6, /* Ultra-high */
 RTW89_CH_6G_BAND_IDX7, /* Ultra-high */

 RTW89_SUBBAND_NR,
 RTW89_SUBBAND_2GHZ_5GHZ_NR = RTW89_CH_5G_BAND_4 + 1,
};

enum rtw89_gain_offset {
 RTW89_GAIN_OFFSET_2G_CCK,
 RTW89_GAIN_OFFSET_2G_OFDM,
 RTW89_GAIN_OFFSET_5G_LOW,
 RTW89_GAIN_OFFSET_5G_MID,
 RTW89_GAIN_OFFSET_5G_HIGH,
 RTW89_GAIN_OFFSET_6G_L0,
 RTW89_GAIN_OFFSET_6G_L1,
 RTW89_GAIN_OFFSET_6G_M0,
 RTW89_GAIN_OFFSET_6G_M1,
 RTW89_GAIN_OFFSET_6G_H0,
 RTW89_GAIN_OFFSET_6G_H1,
 RTW89_GAIN_OFFSET_6G_UH0,
 RTW89_GAIN_OFFSET_6G_UH1,

 RTW89_GAIN_OFFSET_NR,
};

enum rtw89_hci_type {
 RTW89_HCI_TYPE_PCIE,
 RTW89_HCI_TYPE_USB,
 RTW89_HCI_TYPE_SDIO,

 RTW89_HCI_TYPE_NUM,
};

enum rtw89_hci_dle_type {
 RTW89_HCI_DLE_TYPE_PCIE,
 RTW89_HCI_DLE_TYPE_USB2,
 RTW89_HCI_DLE_TYPE_USB3,
 RTW89_HCI_DLE_TYPE_SDIO,

 RTW89_HCI_DLE_TYPE_NUM,
};

enum rtw89_core_chip_id {
 RTL8852A,
 RTL8852B,
 RTL8852BT,
 RTL8852C,
 RTL8851B,
 RTL8922A,
};

enum rtw89_chip_gen {
 RTW89_CHIP_AX,
 RTW89_CHIP_BE,

 RTW89_CHIP_GEN_NUM,
};

enum rtw89_cv {
 CHIP_CAV,
 CHIP_CBV,
 CHIP_CCV,
 CHIP_CDV,
 CHIP_CEV,
 CHIP_CFV,
 CHIP_CV_MAX,
 CHIP_CV_INVALID = CHIP_CV_MAX,
};

enum rtw89_bacam_ver {
 RTW89_BACAM_V0,
 RTW89_BACAM_V1,

 RTW89_BACAM_V0_EXT = 99,
};

enum rtw89_core_tx_type {
 RTW89_CORE_TX_TYPE_DATA,
 RTW89_CORE_TX_TYPE_MGMT,
 RTW89_CORE_TX_TYPE_FWCMD,
};

enum rtw89_core_rx_type {
 RTW89_CORE_RX_TYPE_WIFI  = 0,
 RTW89_CORE_RX_TYPE_PPDU_STAT = 1,
 RTW89_CORE_RX_TYPE_CHAN_INFO = 2,
 RTW89_CORE_RX_TYPE_BB_SCOPE = 3,
 RTW89_CORE_RX_TYPE_F2P_TXCMD = 4,
 RTW89_CORE_RX_TYPE_SS2FW = 5,
 RTW89_CORE_RX_TYPE_TX_REPORT = 6,
 RTW89_CORE_RX_TYPE_TX_REL_HOST = 7,
 RTW89_CORE_RX_TYPE_DFS_REPORT = 8,
 RTW89_CORE_RX_TYPE_TX_REL_CPU = 9,
 RTW89_CORE_RX_TYPE_C2H  = 10,
 RTW89_CORE_RX_TYPE_CSI  = 11,
 RTW89_CORE_RX_TYPE_CQI  = 12,
 RTW89_CORE_RX_TYPE_H2C  = 13,
 RTW89_CORE_RX_TYPE_FWDL  = 14,
};

enum rtw89_txq_flags {
 RTW89_TXQ_F_AMPDU  = 0,
 RTW89_TXQ_F_BLOCK_BA  = 1,
 RTW89_TXQ_F_FORBID_BA  = 2,
};

enum rtw89_net_type {
 RTW89_NET_TYPE_NO_LINK  = 0,
 RTW89_NET_TYPE_AD_HOC  = 1,
 RTW89_NET_TYPE_INFRA  = 2,
 RTW89_NET_TYPE_AP_MODE  = 3,
};

enum rtw89_wifi_role {
 RTW89_WIFI_ROLE_NONE,
 RTW89_WIFI_ROLE_STATION,
 RTW89_WIFI_ROLE_AP,
 RTW89_WIFI_ROLE_AP_VLAN,
 RTW89_WIFI_ROLE_ADHOC,
 RTW89_WIFI_ROLE_ADHOC_MASTER,
 RTW89_WIFI_ROLE_MESH_POINT,
 RTW89_WIFI_ROLE_MONITOR,
 RTW89_WIFI_ROLE_P2P_DEVICE,
 RTW89_WIFI_ROLE_P2P_CLIENT,
 RTW89_WIFI_ROLE_P2P_GO,
 RTW89_WIFI_ROLE_NAN,
 RTW89_WIFI_ROLE_MLME_MAX
};

enum rtw89_upd_mode {
 RTW89_ROLE_CREATE,
 RTW89_ROLE_REMOVE,
 RTW89_ROLE_TYPE_CHANGE,
 RTW89_ROLE_INFO_CHANGE,
 RTW89_ROLE_CON_DISCONN,
 RTW89_ROLE_BAND_SW,
 RTW89_ROLE_FW_RESTORE,
};

enum rtw89_self_role {
 RTW89_SELF_ROLE_CLIENT,
 RTW89_SELF_ROLE_AP,
 RTW89_SELF_ROLE_AP_CLIENT
};

enum rtw89_msk_sO_el {
 RTW89_NO_MSK,
 RTW89_SMA,
 RTW89_TMA,
 RTW89_BSSID
};

enum rtw89_sch_tx_sel {
 RTW89_SCH_TX_SEL_ALL,
 RTW89_SCH_TX_SEL_HIQ,
 RTW89_SCH_TX_SEL_MG0,
 RTW89_SCH_TX_SEL_MACID,
};

/* RTW89_ADDR_CAM_SEC_NONE : not enabled
 * RTW89_ADDR_CAM_SEC_ALL_UNI : 0 - 6 unicast
 * RTW89_ADDR_CAM_SEC_NORMAL : 0 - 1 unicast, 2 - 4 group, 5 - 6 BIP
 * RTW89_ADDR_CAM_SEC_4GROUP : 0 - 1 unicast, 2 - 5 group, 6 BIP
 */

enum rtw89_add_cam_sec_mode {
 RTW89_ADDR_CAM_SEC_NONE  = 0,
 RTW89_ADDR_CAM_SEC_ALL_UNI = 1,
 RTW89_ADDR_CAM_SEC_NORMAL = 2,
 RTW89_ADDR_CAM_SEC_4GROUP = 3,
};

enum rtw89_sec_key_type {
 RTW89_SEC_KEY_TYPE_NONE  = 0,
 RTW89_SEC_KEY_TYPE_WEP40 = 1,
 RTW89_SEC_KEY_TYPE_WEP104 = 2,
 RTW89_SEC_KEY_TYPE_TKIP  = 3,
 RTW89_SEC_KEY_TYPE_WAPI  = 4,
 RTW89_SEC_KEY_TYPE_GCMSMS4 = 5,
 RTW89_SEC_KEY_TYPE_CCMP128 = 6,
 RTW89_SEC_KEY_TYPE_CCMP256 = 7,
 RTW89_SEC_KEY_TYPE_GCMP128 = 8,
 RTW89_SEC_KEY_TYPE_GCMP256 = 9,
 RTW89_SEC_KEY_TYPE_BIP_CCMP128 = 10,
};

enum rtw89_port {
 RTW89_PORT_0 = 0,
 RTW89_PORT_1 = 1,
 RTW89_PORT_2 = 2,
 RTW89_PORT_3 = 3,
 RTW89_PORT_4 = 4,
 RTW89_PORT_NUM
};

enum rtw89_band {
 RTW89_BAND_2G = 0,
 RTW89_BAND_5G = 1,
 RTW89_BAND_6G = 2,
 RTW89_BAND_NUM,
};

enum rtw89_hw_rate {
 RTW89_HW_RATE_CCK1 = 0x0,
 RTW89_HW_RATE_CCK2 = 0x1,
 RTW89_HW_RATE_CCK5_5 = 0x2,
 RTW89_HW_RATE_CCK11 = 0x3,
 RTW89_HW_RATE_OFDM6 = 0x4,
 RTW89_HW_RATE_OFDM9 = 0x5,
 RTW89_HW_RATE_OFDM12 = 0x6,
 RTW89_HW_RATE_OFDM18 = 0x7,
 RTW89_HW_RATE_OFDM24 = 0x8,
 RTW89_HW_RATE_OFDM36 = 0x9,
 RTW89_HW_RATE_OFDM48 = 0xA,
 RTW89_HW_RATE_OFDM54 = 0xB,
 RTW89_HW_RATE_MCS0 = 0x80,
 RTW89_HW_RATE_MCS1 = 0x81,
 RTW89_HW_RATE_MCS2 = 0x82,
 RTW89_HW_RATE_MCS3 = 0x83,
 RTW89_HW_RATE_MCS4 = 0x84,
 RTW89_HW_RATE_MCS5 = 0x85,
 RTW89_HW_RATE_MCS6 = 0x86,
 RTW89_HW_RATE_MCS7 = 0x87,
 RTW89_HW_RATE_MCS8 = 0x88,
 RTW89_HW_RATE_MCS9 = 0x89,
 RTW89_HW_RATE_MCS10 = 0x8A,
 RTW89_HW_RATE_MCS11 = 0x8B,
 RTW89_HW_RATE_MCS12 = 0x8C,
 RTW89_HW_RATE_MCS13 = 0x8D,
 RTW89_HW_RATE_MCS14 = 0x8E,
 RTW89_HW_RATE_MCS15 = 0x8F,
 RTW89_HW_RATE_MCS16 = 0x90,
 RTW89_HW_RATE_MCS17 = 0x91,
 RTW89_HW_RATE_MCS18 = 0x92,
 RTW89_HW_RATE_MCS19 = 0x93,
 RTW89_HW_RATE_MCS20 = 0x94,
 RTW89_HW_RATE_MCS21 = 0x95,
 RTW89_HW_RATE_MCS22 = 0x96,
 RTW89_HW_RATE_MCS23 = 0x97,
 RTW89_HW_RATE_MCS24 = 0x98,
 RTW89_HW_RATE_MCS25 = 0x99,
 RTW89_HW_RATE_MCS26 = 0x9A,
 RTW89_HW_RATE_MCS27 = 0x9B,
 RTW89_HW_RATE_MCS28 = 0x9C,
 RTW89_HW_RATE_MCS29 = 0x9D,
 RTW89_HW_RATE_MCS30 = 0x9E,
 RTW89_HW_RATE_MCS31 = 0x9F,
 RTW89_HW_RATE_VHT_NSS1_MCS0 = 0x100,
 RTW89_HW_RATE_VHT_NSS1_MCS1 = 0x101,
 RTW89_HW_RATE_VHT_NSS1_MCS2 = 0x102,
 RTW89_HW_RATE_VHT_NSS1_MCS3 = 0x103,
 RTW89_HW_RATE_VHT_NSS1_MCS4 = 0x104,
 RTW89_HW_RATE_VHT_NSS1_MCS5 = 0x105,
 RTW89_HW_RATE_VHT_NSS1_MCS6 = 0x106,
 RTW89_HW_RATE_VHT_NSS1_MCS7 = 0x107,
 RTW89_HW_RATE_VHT_NSS1_MCS8 = 0x108,
 RTW89_HW_RATE_VHT_NSS1_MCS9 = 0x109,
 RTW89_HW_RATE_VHT_NSS2_MCS0 = 0x110,
 RTW89_HW_RATE_VHT_NSS2_MCS1 = 0x111,
 RTW89_HW_RATE_VHT_NSS2_MCS2 = 0x112,
 RTW89_HW_RATE_VHT_NSS2_MCS3 = 0x113,
 RTW89_HW_RATE_VHT_NSS2_MCS4 = 0x114,
 RTW89_HW_RATE_VHT_NSS2_MCS5 = 0x115,
 RTW89_HW_RATE_VHT_NSS2_MCS6 = 0x116,
 RTW89_HW_RATE_VHT_NSS2_MCS7 = 0x117,
 RTW89_HW_RATE_VHT_NSS2_MCS8 = 0x118,
 RTW89_HW_RATE_VHT_NSS2_MCS9 = 0x119,
 RTW89_HW_RATE_VHT_NSS3_MCS0 = 0x120,
 RTW89_HW_RATE_VHT_NSS3_MCS1 = 0x121,
 RTW89_HW_RATE_VHT_NSS3_MCS2 = 0x122,
 RTW89_HW_RATE_VHT_NSS3_MCS3 = 0x123,
 RTW89_HW_RATE_VHT_NSS3_MCS4 = 0x124,
 RTW89_HW_RATE_VHT_NSS3_MCS5 = 0x125,
 RTW89_HW_RATE_VHT_NSS3_MCS6 = 0x126,
 RTW89_HW_RATE_VHT_NSS3_MCS7 = 0x127,
 RTW89_HW_RATE_VHT_NSS3_MCS8 = 0x128,
 RTW89_HW_RATE_VHT_NSS3_MCS9 = 0x129,
 RTW89_HW_RATE_VHT_NSS4_MCS0 = 0x130,
 RTW89_HW_RATE_VHT_NSS4_MCS1 = 0x131,
 RTW89_HW_RATE_VHT_NSS4_MCS2 = 0x132,
 RTW89_HW_RATE_VHT_NSS4_MCS3 = 0x133,
 RTW89_HW_RATE_VHT_NSS4_MCS4 = 0x134,
 RTW89_HW_RATE_VHT_NSS4_MCS5 = 0x135,
 RTW89_HW_RATE_VHT_NSS4_MCS6 = 0x136,
 RTW89_HW_RATE_VHT_NSS4_MCS7 = 0x137,
 RTW89_HW_RATE_VHT_NSS4_MCS8 = 0x138,
 RTW89_HW_RATE_VHT_NSS4_MCS9 = 0x139,
 RTW89_HW_RATE_HE_NSS1_MCS0 = 0x180,
 RTW89_HW_RATE_HE_NSS1_MCS1 = 0x181,
 RTW89_HW_RATE_HE_NSS1_MCS2 = 0x182,
 RTW89_HW_RATE_HE_NSS1_MCS3 = 0x183,
 RTW89_HW_RATE_HE_NSS1_MCS4 = 0x184,
 RTW89_HW_RATE_HE_NSS1_MCS5 = 0x185,
 RTW89_HW_RATE_HE_NSS1_MCS6 = 0x186,
 RTW89_HW_RATE_HE_NSS1_MCS7 = 0x187,
 RTW89_HW_RATE_HE_NSS1_MCS8 = 0x188,
 RTW89_HW_RATE_HE_NSS1_MCS9 = 0x189,
 RTW89_HW_RATE_HE_NSS1_MCS10 = 0x18A,
 RTW89_HW_RATE_HE_NSS1_MCS11 = 0x18B,
 RTW89_HW_RATE_HE_NSS2_MCS0 = 0x190,
 RTW89_HW_RATE_HE_NSS2_MCS1 = 0x191,
 RTW89_HW_RATE_HE_NSS2_MCS2 = 0x192,
 RTW89_HW_RATE_HE_NSS2_MCS3 = 0x193,
 RTW89_HW_RATE_HE_NSS2_MCS4 = 0x194,
 RTW89_HW_RATE_HE_NSS2_MCS5 = 0x195,
 RTW89_HW_RATE_HE_NSS2_MCS6 = 0x196,
 RTW89_HW_RATE_HE_NSS2_MCS7 = 0x197,
 RTW89_HW_RATE_HE_NSS2_MCS8 = 0x198,
 RTW89_HW_RATE_HE_NSS2_MCS9 = 0x199,
 RTW89_HW_RATE_HE_NSS2_MCS10 = 0x19A,
 RTW89_HW_RATE_HE_NSS2_MCS11 = 0x19B,
 RTW89_HW_RATE_HE_NSS3_MCS0 = 0x1A0,
 RTW89_HW_RATE_HE_NSS3_MCS1 = 0x1A1,
 RTW89_HW_RATE_HE_NSS3_MCS2 = 0x1A2,
 RTW89_HW_RATE_HE_NSS3_MCS3 = 0x1A3,
 RTW89_HW_RATE_HE_NSS3_MCS4 = 0x1A4,
 RTW89_HW_RATE_HE_NSS3_MCS5 = 0x1A5,
 RTW89_HW_RATE_HE_NSS3_MCS6 = 0x1A6,
 RTW89_HW_RATE_HE_NSS3_MCS7 = 0x1A7,
 RTW89_HW_RATE_HE_NSS3_MCS8 = 0x1A8,
 RTW89_HW_RATE_HE_NSS3_MCS9 = 0x1A9,
 RTW89_HW_RATE_HE_NSS3_MCS10 = 0x1AA,
 RTW89_HW_RATE_HE_NSS3_MCS11 = 0x1AB,
 RTW89_HW_RATE_HE_NSS4_MCS0 = 0x1B0,
 RTW89_HW_RATE_HE_NSS4_MCS1 = 0x1B1,
 RTW89_HW_RATE_HE_NSS4_MCS2 = 0x1B2,
 RTW89_HW_RATE_HE_NSS4_MCS3 = 0x1B3,
 RTW89_HW_RATE_HE_NSS4_MCS4 = 0x1B4,
 RTW89_HW_RATE_HE_NSS4_MCS5 = 0x1B5,
 RTW89_HW_RATE_HE_NSS4_MCS6 = 0x1B6,
 RTW89_HW_RATE_HE_NSS4_MCS7 = 0x1B7,
 RTW89_HW_RATE_HE_NSS4_MCS8 = 0x1B8,
 RTW89_HW_RATE_HE_NSS4_MCS9 = 0x1B9,
 RTW89_HW_RATE_HE_NSS4_MCS10 = 0x1BA,
 RTW89_HW_RATE_HE_NSS4_MCS11 = 0x1BB,

 RTW89_HW_RATE_V1_MCS0  = 0x100,
 RTW89_HW_RATE_V1_MCS1  = 0x101,
 RTW89_HW_RATE_V1_MCS2  = 0x102,
 RTW89_HW_RATE_V1_MCS3  = 0x103,
 RTW89_HW_RATE_V1_MCS4  = 0x104,
 RTW89_HW_RATE_V1_MCS5  = 0x105,
 RTW89_HW_RATE_V1_MCS6  = 0x106,
 RTW89_HW_RATE_V1_MCS7  = 0x107,
 RTW89_HW_RATE_V1_MCS8  = 0x108,
 RTW89_HW_RATE_V1_MCS9  = 0x109,
 RTW89_HW_RATE_V1_MCS10  = 0x10A,
 RTW89_HW_RATE_V1_MCS11  = 0x10B,
 RTW89_HW_RATE_V1_MCS12  = 0x10C,
 RTW89_HW_RATE_V1_MCS13  = 0x10D,
 RTW89_HW_RATE_V1_MCS14  = 0x10E,
 RTW89_HW_RATE_V1_MCS15  = 0x10F,
 RTW89_HW_RATE_V1_MCS16  = 0x110,
 RTW89_HW_RATE_V1_MCS17  = 0x111,
 RTW89_HW_RATE_V1_MCS18  = 0x112,
 RTW89_HW_RATE_V1_MCS19  = 0x113,
 RTW89_HW_RATE_V1_MCS20  = 0x114,
 RTW89_HW_RATE_V1_MCS21  = 0x115,
 RTW89_HW_RATE_V1_MCS22  = 0x116,
 RTW89_HW_RATE_V1_MCS23  = 0x117,
 RTW89_HW_RATE_V1_MCS24  = 0x118,
 RTW89_HW_RATE_V1_MCS25  = 0x119,
 RTW89_HW_RATE_V1_MCS26  = 0x11A,
 RTW89_HW_RATE_V1_MCS27  = 0x11B,
 RTW89_HW_RATE_V1_MCS28  = 0x11C,
 RTW89_HW_RATE_V1_MCS29  = 0x11D,
 RTW89_HW_RATE_V1_MCS30  = 0x11E,
 RTW89_HW_RATE_V1_MCS31  = 0x11F,
 RTW89_HW_RATE_V1_VHT_NSS1_MCS0 = 0x200,
 RTW89_HW_RATE_V1_VHT_NSS1_MCS1 = 0x201,
 RTW89_HW_RATE_V1_VHT_NSS1_MCS2 = 0x202,
 RTW89_HW_RATE_V1_VHT_NSS1_MCS3 = 0x203,
 RTW89_HW_RATE_V1_VHT_NSS1_MCS4 = 0x204,
 RTW89_HW_RATE_V1_VHT_NSS1_MCS5 = 0x205,
 RTW89_HW_RATE_V1_VHT_NSS1_MCS6 = 0x206,
 RTW89_HW_RATE_V1_VHT_NSS1_MCS7 = 0x207,
 RTW89_HW_RATE_V1_VHT_NSS1_MCS8 = 0x208,
 RTW89_HW_RATE_V1_VHT_NSS1_MCS9 = 0x209,
 RTW89_HW_RATE_V1_VHT_NSS1_MCS10 = 0x20A,
 RTW89_HW_RATE_V1_VHT_NSS1_MCS11 = 0x20B,
 RTW89_HW_RATE_V1_VHT_NSS2_MCS0 = 0x220,
 RTW89_HW_RATE_V1_VHT_NSS2_MCS1 = 0x221,
 RTW89_HW_RATE_V1_VHT_NSS2_MCS2 = 0x222,
 RTW89_HW_RATE_V1_VHT_NSS2_MCS3 = 0x223,
 RTW89_HW_RATE_V1_VHT_NSS2_MCS4 = 0x224,
 RTW89_HW_RATE_V1_VHT_NSS2_MCS5 = 0x225,
 RTW89_HW_RATE_V1_VHT_NSS2_MCS6 = 0x226,
 RTW89_HW_RATE_V1_VHT_NSS2_MCS7 = 0x227,
 RTW89_HW_RATE_V1_VHT_NSS2_MCS8 = 0x228,
 RTW89_HW_RATE_V1_VHT_NSS2_MCS9 = 0x229,
 RTW89_HW_RATE_V1_VHT_NSS2_MCS10 = 0x22A,
 RTW89_HW_RATE_V1_VHT_NSS2_MCS11 = 0x22B,
 RTW89_HW_RATE_V1_VHT_NSS3_MCS0 = 0x240,
 RTW89_HW_RATE_V1_VHT_NSS3_MCS1 = 0x241,
 RTW89_HW_RATE_V1_VHT_NSS3_MCS2 = 0x242,
 RTW89_HW_RATE_V1_VHT_NSS3_MCS3 = 0x243,
 RTW89_HW_RATE_V1_VHT_NSS3_MCS4 = 0x244,
 RTW89_HW_RATE_V1_VHT_NSS3_MCS5 = 0x245,
 RTW89_HW_RATE_V1_VHT_NSS3_MCS6 = 0x246,
 RTW89_HW_RATE_V1_VHT_NSS3_MCS7 = 0x247,
 RTW89_HW_RATE_V1_VHT_NSS3_MCS8 = 0x248,
 RTW89_HW_RATE_V1_VHT_NSS3_MCS9 = 0x249,
 RTW89_HW_RATE_V1_VHT_NSS3_MCS10 = 0x24A,
 RTW89_HW_RATE_V1_VHT_NSS3_MCS11 = 0x24B,
 RTW89_HW_RATE_V1_VHT_NSS4_MCS0 = 0x260,
 RTW89_HW_RATE_V1_VHT_NSS4_MCS1 = 0x261,
 RTW89_HW_RATE_V1_VHT_NSS4_MCS2 = 0x262,
 RTW89_HW_RATE_V1_VHT_NSS4_MCS3 = 0x263,
 RTW89_HW_RATE_V1_VHT_NSS4_MCS4 = 0x264,
 RTW89_HW_RATE_V1_VHT_NSS4_MCS5 = 0x265,
 RTW89_HW_RATE_V1_VHT_NSS4_MCS6 = 0x266,
 RTW89_HW_RATE_V1_VHT_NSS4_MCS7 = 0x267,
 RTW89_HW_RATE_V1_VHT_NSS4_MCS8 = 0x268,
 RTW89_HW_RATE_V1_VHT_NSS4_MCS9 = 0x269,
 RTW89_HW_RATE_V1_VHT_NSS4_MCS10 = 0x26A,
 RTW89_HW_RATE_V1_VHT_NSS4_MCS11 = 0x26B,
 RTW89_HW_RATE_V1_HE_NSS1_MCS0 = 0x300,
 RTW89_HW_RATE_V1_HE_NSS1_MCS1 = 0x301,
 RTW89_HW_RATE_V1_HE_NSS1_MCS2 = 0x302,
 RTW89_HW_RATE_V1_HE_NSS1_MCS3 = 0x303,
 RTW89_HW_RATE_V1_HE_NSS1_MCS4 = 0x304,
 RTW89_HW_RATE_V1_HE_NSS1_MCS5 = 0x305,
 RTW89_HW_RATE_V1_HE_NSS1_MCS6 = 0x306,
 RTW89_HW_RATE_V1_HE_NSS1_MCS7 = 0x307,
 RTW89_HW_RATE_V1_HE_NSS1_MCS8 = 0x308,
 RTW89_HW_RATE_V1_HE_NSS1_MCS9 = 0x309,
 RTW89_HW_RATE_V1_HE_NSS1_MCS10 = 0x30A,
 RTW89_HW_RATE_V1_HE_NSS1_MCS11 = 0x30B,
 RTW89_HW_RATE_V1_HE_NSS2_MCS0 = 0x320,
 RTW89_HW_RATE_V1_HE_NSS2_MCS1 = 0x321,
 RTW89_HW_RATE_V1_HE_NSS2_MCS2 = 0x322,
 RTW89_HW_RATE_V1_HE_NSS2_MCS3 = 0x323,
 RTW89_HW_RATE_V1_HE_NSS2_MCS4 = 0x324,
 RTW89_HW_RATE_V1_HE_NSS2_MCS5 = 0x325,
 RTW89_HW_RATE_V1_HE_NSS2_MCS6 = 0x326,
 RTW89_HW_RATE_V1_HE_NSS2_MCS7 = 0x327,
 RTW89_HW_RATE_V1_HE_NSS2_MCS8 = 0x328,
 RTW89_HW_RATE_V1_HE_NSS2_MCS9 = 0x329,
 RTW89_HW_RATE_V1_HE_NSS2_MCS10 = 0x32A,
 RTW89_HW_RATE_V1_HE_NSS2_MCS11 = 0x32B,
 RTW89_HW_RATE_V1_HE_NSS3_MCS0 = 0x340,
 RTW89_HW_RATE_V1_HE_NSS3_MCS1 = 0x341,
 RTW89_HW_RATE_V1_HE_NSS3_MCS2 = 0x342,
 RTW89_HW_RATE_V1_HE_NSS3_MCS3 = 0x343,
 RTW89_HW_RATE_V1_HE_NSS3_MCS4 = 0x344,
 RTW89_HW_RATE_V1_HE_NSS3_MCS5 = 0x345,
 RTW89_HW_RATE_V1_HE_NSS3_MCS6 = 0x346,
 RTW89_HW_RATE_V1_HE_NSS3_MCS7 = 0x347,
 RTW89_HW_RATE_V1_HE_NSS3_MCS8 = 0x348,
 RTW89_HW_RATE_V1_HE_NSS3_MCS9 = 0x349,
 RTW89_HW_RATE_V1_HE_NSS3_MCS10 = 0x34A,
 RTW89_HW_RATE_V1_HE_NSS3_MCS11 = 0x34B,
 RTW89_HW_RATE_V1_HE_NSS4_MCS0 = 0x360,
 RTW89_HW_RATE_V1_HE_NSS4_MCS1 = 0x361,
 RTW89_HW_RATE_V1_HE_NSS4_MCS2 = 0x362,
 RTW89_HW_RATE_V1_HE_NSS4_MCS3 = 0x363,
 RTW89_HW_RATE_V1_HE_NSS4_MCS4 = 0x364,
 RTW89_HW_RATE_V1_HE_NSS4_MCS5 = 0x365,
 RTW89_HW_RATE_V1_HE_NSS4_MCS6 = 0x366,
 RTW89_HW_RATE_V1_HE_NSS4_MCS7 = 0x367,
 RTW89_HW_RATE_V1_HE_NSS4_MCS8 = 0x368,
 RTW89_HW_RATE_V1_HE_NSS4_MCS9 = 0x369,
 RTW89_HW_RATE_V1_HE_NSS4_MCS10 = 0x36A,
 RTW89_HW_RATE_V1_HE_NSS4_MCS11 = 0x36B,
 RTW89_HW_RATE_V1_EHT_NSS1_MCS0 = 0x400,
 RTW89_HW_RATE_V1_EHT_NSS1_MCS1 = 0x401,
 RTW89_HW_RATE_V1_EHT_NSS1_MCS2 = 0x402,
 RTW89_HW_RATE_V1_EHT_NSS1_MCS3 = 0x403,
 RTW89_HW_RATE_V1_EHT_NSS1_MCS4 = 0x404,
 RTW89_HW_RATE_V1_EHT_NSS1_MCS5 = 0x405,
 RTW89_HW_RATE_V1_EHT_NSS1_MCS6 = 0x406,
 RTW89_HW_RATE_V1_EHT_NSS1_MCS7 = 0x407,
 RTW89_HW_RATE_V1_EHT_NSS1_MCS8 = 0x408,
 RTW89_HW_RATE_V1_EHT_NSS1_MCS9 = 0x409,
 RTW89_HW_RATE_V1_EHT_NSS1_MCS10 = 0x40A,
 RTW89_HW_RATE_V1_EHT_NSS1_MCS11 = 0x40B,
 RTW89_HW_RATE_V1_EHT_NSS1_MCS12 = 0x40C,
 RTW89_HW_RATE_V1_EHT_NSS1_MCS13 = 0x40D,
 RTW89_HW_RATE_V1_EHT_NSS1_MCS14 = 0x40E,
 RTW89_HW_RATE_V1_EHT_NSS1_MCS15 = 0x40F,
 RTW89_HW_RATE_V1_EHT_NSS2_MCS0 = 0x420,
 RTW89_HW_RATE_V1_EHT_NSS2_MCS1 = 0x421,
 RTW89_HW_RATE_V1_EHT_NSS2_MCS2 = 0x422,
 RTW89_HW_RATE_V1_EHT_NSS2_MCS3 = 0x423,
 RTW89_HW_RATE_V1_EHT_NSS2_MCS4 = 0x424,
 RTW89_HW_RATE_V1_EHT_NSS2_MCS5 = 0x425,
 RTW89_HW_RATE_V1_EHT_NSS2_MCS6 = 0x426,
 RTW89_HW_RATE_V1_EHT_NSS2_MCS7 = 0x427,
 RTW89_HW_RATE_V1_EHT_NSS2_MCS8 = 0x428,
 RTW89_HW_RATE_V1_EHT_NSS2_MCS9 = 0x429,
 RTW89_HW_RATE_V1_EHT_NSS2_MCS10 = 0x42A,
 RTW89_HW_RATE_V1_EHT_NSS2_MCS11 = 0x42B,
 RTW89_HW_RATE_V1_EHT_NSS2_MCS12 = 0x42C,
 RTW89_HW_RATE_V1_EHT_NSS2_MCS13 = 0x42D,
 RTW89_HW_RATE_V1_EHT_NSS3_MCS0 = 0x440,
 RTW89_HW_RATE_V1_EHT_NSS3_MCS1 = 0x441,
 RTW89_HW_RATE_V1_EHT_NSS3_MCS2 = 0x442,
 RTW89_HW_RATE_V1_EHT_NSS3_MCS3 = 0x443,
 RTW89_HW_RATE_V1_EHT_NSS3_MCS4 = 0x444,
 RTW89_HW_RATE_V1_EHT_NSS3_MCS5 = 0x445,
 RTW89_HW_RATE_V1_EHT_NSS3_MCS6 = 0x446,
 RTW89_HW_RATE_V1_EHT_NSS3_MCS7 = 0x447,
 RTW89_HW_RATE_V1_EHT_NSS3_MCS8 = 0x448,
 RTW89_HW_RATE_V1_EHT_NSS3_MCS9 = 0x449,
 RTW89_HW_RATE_V1_EHT_NSS3_MCS10 = 0x44A,
 RTW89_HW_RATE_V1_EHT_NSS3_MCS11 = 0x44B,
 RTW89_HW_RATE_V1_EHT_NSS3_MCS12 = 0x44C,
 RTW89_HW_RATE_V1_EHT_NSS3_MCS13 = 0x44D,
 RTW89_HW_RATE_V1_EHT_NSS4_MCS0 = 0x460,
 RTW89_HW_RATE_V1_EHT_NSS4_MCS1 = 0x461,
 RTW89_HW_RATE_V1_EHT_NSS4_MCS2 = 0x462,
 RTW89_HW_RATE_V1_EHT_NSS4_MCS3 = 0x463,
 RTW89_HW_RATE_V1_EHT_NSS4_MCS4 = 0x464,
 RTW89_HW_RATE_V1_EHT_NSS4_MCS5 = 0x465,
 RTW89_HW_RATE_V1_EHT_NSS4_MCS6 = 0x466,
 RTW89_HW_RATE_V1_EHT_NSS4_MCS7 = 0x467,
 RTW89_HW_RATE_V1_EHT_NSS4_MCS8 = 0x468,
 RTW89_HW_RATE_V1_EHT_NSS4_MCS9 = 0x469,
 RTW89_HW_RATE_V1_EHT_NSS4_MCS10 = 0x46A,
 RTW89_HW_RATE_V1_EHT_NSS4_MCS11 = 0x46B,
 RTW89_HW_RATE_V1_EHT_NSS4_MCS12 = 0x46C,
 RTW89_HW_RATE_V1_EHT_NSS4_MCS13 = 0x46D,

 RTW89_HW_RATE_NR,
 RTW89_HW_RATE_INVAL,

 RTW89_HW_RATE_MASK_MOD = GENMASK(8, 7),
 RTW89_HW_RATE_MASK_VAL = GENMASK(6, 0),
 RTW89_HW_RATE_V1_MASK_MOD = GENMASK(10, 8),
 RTW89_HW_RATE_V1_MASK_VAL = GENMASK(7, 0),
};

/* 2G channels,
 * 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
 */

#define RTW89_2G_CH_NUM 14

/* 5G channels,
 * 36, 38, 40, 42, 44, 46, 48, 50,
 * 52, 54, 56, 58, 60, 62, 64,
 * 100, 102, 104, 106, 108, 110, 112, 114,
 * 116, 118, 120, 122, 124, 126, 128, 130,
 * 132, 134, 136, 138, 140, 142, 144,
 * 149, 151, 153, 155, 157, 159, 161, 163,
 * 165, 167, 169, 171, 173, 175, 177
 */

#define RTW89_5G_CH_NUM 53

/* 6G channels,
 * 1, 3, 5, 7, 9, 11, 13, 15,
 * 17, 19, 21, 23, 25, 27, 29, 33,
 * 35, 37, 39, 41, 43, 45, 47, 49,
 * 51, 53, 55, 57, 59, 61, 65, 67,
 * 69, 71, 73, 75, 77, 79, 81, 83,
 * 85, 87, 89, 91, 93, 97, 99, 101,
 * 103, 105, 107, 109, 111, 113, 115, 117,
 * 119, 121, 123, 125, 129, 131, 133, 135,
 * 137, 139, 141, 143, 145, 147, 149, 151,
 * 153, 155, 157, 161, 163, 165, 167, 169,
 * 171, 173, 175, 177, 179, 181, 183, 185,
 * 187, 189, 193, 195, 197, 199, 201, 203,
 * 205, 207, 209, 211, 213, 215, 217, 219,
 * 221, 225, 227, 229, 231, 233, 235, 237,
 * 239, 241, 243, 245, 247, 249, 251, 253,
 */

#define RTW89_6G_CH_NUM 120

enum rtw89_rate_section {
 RTW89_RS_CCK,
 RTW89_RS_OFDM,
 RTW89_RS_MCS, /* for HT/VHT/HE */
 RTW89_RS_HEDCM,
 RTW89_RS_OFFSET,
 RTW89_RS_NUM,
 RTW89_RS_LMT_NUM = RTW89_RS_MCS + 1,
 RTW89_RS_TX_SHAPE_NUM = RTW89_RS_OFDM + 1,
};

enum rtw89_rate_offset_indexes {
 RTW89_RATE_OFFSET_HE,
 RTW89_RATE_OFFSET_VHT,
 RTW89_RATE_OFFSET_HT,
 RTW89_RATE_OFFSET_OFDM,
 RTW89_RATE_OFFSET_CCK,
 RTW89_RATE_OFFSET_DLRU_EHT,
 RTW89_RATE_OFFSET_DLRU_HE,
 RTW89_RATE_OFFSET_EHT,
 __RTW89_RATE_OFFSET_NUM,

 RTW89_RATE_OFFSET_NUM_AX = RTW89_RATE_OFFSET_CCK + 1,
 RTW89_RATE_OFFSET_NUM_BE = RTW89_RATE_OFFSET_EHT + 1,
};

enum rtw89_rate_num {
 RTW89_RATE_CCK_NUM = 4,
 RTW89_RATE_OFDM_NUM = 8,
 RTW89_RATE_HEDCM_NUM = 4, /* for HEDCM MCS0/1/3/4 */

 RTW89_RATE_MCS_NUM_AX = 12,
 RTW89_RATE_MCS_NUM_BE = 16,
 __RTW89_RATE_MCS_NUM = 16,
};

enum rtw89_nss {
 RTW89_NSS_1  = 0,
 RTW89_NSS_2  = 1,
 /* HE DCM only support 1ss and 2ss */
 RTW89_NSS_HEDCM_NUM = RTW89_NSS_2 + 1,
 RTW89_NSS_3  = 2,
 RTW89_NSS_4  = 3,
 RTW89_NSS_NUM,
};

enum rtw89_ntx {
 RTW89_1TX = 0,
 RTW89_2TX = 1,
 RTW89_NTX_NUM,
};

enum rtw89_beamforming_type {
 RTW89_NONBF = 0,
 RTW89_BF = 1,
 RTW89_BF_NUM,
};

enum rtw89_ofdma_type {
 RTW89_NON_OFDMA = 0,
 RTW89_OFDMA = 1,
 RTW89_OFDMA_NUM,
};

/* neither insert new in the middle, nor change any given definition */
enum rtw89_regulation_type {
 RTW89_WW = 0,
 RTW89_ETSI = 1,
 RTW89_FCC = 2,
 RTW89_MKK = 3,
 RTW89_NA = 4,
 RTW89_IC = 5,
 RTW89_KCC = 6,
 RTW89_ACMA = 7,
 RTW89_NCC = 8,
 RTW89_MEXICO = 9,
 RTW89_CHILE = 10,
 RTW89_UKRAINE = 11,
 RTW89_CN = 12,
 RTW89_QATAR = 13,
 RTW89_UK = 14,
 RTW89_THAILAND = 15,
 RTW89_REGD_NUM,
};

enum rtw89_reg_6ghz_power {
 RTW89_REG_6GHZ_POWER_VLP = 0,
 RTW89_REG_6GHZ_POWER_LPI = 1,
 RTW89_REG_6GHZ_POWER_STD = 2,

 NUM_OF_RTW89_REG_6GHZ_POWER,
 RTW89_REG_6GHZ_POWER_DFLT = RTW89_REG_6GHZ_POWER_VLP,
};

#define RTW89_MIN_VALID_POWER_CONSTRAINT (-10) /* unit: dBm */

/* calculate based on ieee80211 Transmit Power Envelope */
struct rtw89_reg_6ghz_tpe {
 bool valid;
 s8 constraint; /* unit: dBm */
};

enum rtw89_fw_pkt_ofld_type {
 RTW89_PKT_OFLD_TYPE_PROBE_RSP = 0,
 RTW89_PKT_OFLD_TYPE_PS_POLL = 1,
 RTW89_PKT_OFLD_TYPE_NULL_DATA = 2,
 RTW89_PKT_OFLD_TYPE_QOS_NULL = 3,
 RTW89_PKT_OFLD_TYPE_CTS2SELF = 4,
 RTW89_PKT_OFLD_TYPE_ARP_RSP = 5,
 RTW89_PKT_OFLD_TYPE_NDP = 6,
 RTW89_PKT_OFLD_TYPE_EAPOL_KEY = 7,
 RTW89_PKT_OFLD_TYPE_SA_QUERY = 8,
 RTW89_PKT_OFLD_TYPE_PROBE_REQ = 12,
 RTW89_PKT_OFLD_TYPE_NUM,
};

struct rtw89_txpwr_byrate {
 s8 cck[RTW89_RATE_CCK_NUM];
 s8 ofdm[RTW89_RATE_OFDM_NUM];
 s8 mcs[RTW89_OFDMA_NUM][RTW89_NSS_NUM][__RTW89_RATE_MCS_NUM];
 s8 hedcm[RTW89_OFDMA_NUM][RTW89_NSS_HEDCM_NUM][RTW89_RATE_HEDCM_NUM];
 s8 offset[__RTW89_RATE_OFFSET_NUM];
 s8 trap;
};

struct rtw89_rate_desc {
 enum rtw89_nss nss;
 enum rtw89_rate_section rs;
 enum rtw89_ofdma_type ofdma;
 u8 idx;
};

#define PHY_STS_HDR_LEN 8
#define RF_PATH_MAX 4
#define RTW89_MAX_PPDU_CNT 8
struct rtw89_rx_phy_ppdu {
 void *buf;
 u32 len;
 u8 rssi_avg;
 u8 rssi[RF_PATH_MAX];
 u8 mac_id;
 u8 chan_idx;
 u8 phy_idx;
 u8 ie;
 u16 rate;
 u8 rpl_avg;
 u8 rpl_path[RF_PATH_MAX];
 u8 rpl_fd[RF_PATH_MAX];
 u8 bw_idx;
 u8 rx_path_en;
 struct {
  bool has;
  u8 avg_snr;
  u8 evm_max;
  u8 evm_min;
 } ofdm;
 bool has_data;
 bool has_bcn;
 bool ldpc;
 bool stbc;
 bool to_self;
 bool valid;
 bool hdr_2_en;
};

enum rtw89_mac_idx {
 RTW89_MAC_0 = 0,
 RTW89_MAC_1 = 1,
 RTW89_MAC_NUM,
};

enum rtw89_phy_idx {
 RTW89_PHY_0 = 0,
 RTW89_PHY_1 = 1,
 RTW89_PHY_NUM,
};

#define __RTW89_MLD_MAX_LINK_NUM 2
#define RTW89_MLD_NON_STA_LINK_NUM 1

enum rtw89_chanctx_idx {
 RTW89_CHANCTX_0 = 0,
 RTW89_CHANCTX_1 = 1,

 NUM_OF_RTW89_CHANCTX,
 RTW89_CHANCTX_IDLE = NUM_OF_RTW89_CHANCTX,
};

enum rtw89_rf_path {
 RF_PATH_A = 0,
 RF_PATH_B = 1,
 RF_PATH_C = 2,
 RF_PATH_D = 3,
 RF_PATH_AB,
 RF_PATH_AC,
 RF_PATH_AD,
 RF_PATH_BC,
 RF_PATH_BD,
 RF_PATH_CD,
 RF_PATH_ABC,
 RF_PATH_ABD,
 RF_PATH_ACD,
 RF_PATH_BCD,
 RF_PATH_ABCD,
};

enum rtw89_rf_path_bit {
 RF_A = BIT(0),
 RF_B = BIT(1),
 RF_C = BIT(2),
 RF_D = BIT(3),

 RF_AB = (RF_A | RF_B),
 RF_AC = (RF_A | RF_C),
 RF_AD = (RF_A | RF_D),
 RF_BC = (RF_B | RF_C),
 RF_BD = (RF_B | RF_D),
 RF_CD = (RF_C | RF_D),

 RF_ABC = (RF_A | RF_B | RF_C),
 RF_ABD = (RF_A | RF_B | RF_D),
 RF_ACD = (RF_A | RF_C | RF_D),
 RF_BCD = (RF_B | RF_C | RF_D),

 RF_ABCD = (RF_A | RF_B | RF_C | RF_D),
};

enum rtw89_bandwidth {
 RTW89_CHANNEL_WIDTH_20 = 0,
 RTW89_CHANNEL_WIDTH_40 = 1,
 RTW89_CHANNEL_WIDTH_80 = 2,
 RTW89_CHANNEL_WIDTH_160 = 3,
 RTW89_CHANNEL_WIDTH_320 = 4,

 /* keep index order above */
 RTW89_CHANNEL_WIDTH_ORDINARY_NUM = 5,

 RTW89_CHANNEL_WIDTH_80_80 = 5,
 RTW89_CHANNEL_WIDTH_5 = 6,
 RTW89_CHANNEL_WIDTH_10 = 7,
};

enum rtw89_ps_mode {
 RTW89_PS_MODE_NONE = 0,
 RTW89_PS_MODE_RFOFF = 1,
 RTW89_PS_MODE_CLK_GATED = 2,
 RTW89_PS_MODE_PWR_GATED = 3,
};

#define RTW89_2G_BW_NUM (RTW89_CHANNEL_WIDTH_40 + 1)
#define RTW89_5G_BW_NUM (RTW89_CHANNEL_WIDTH_160 + 1)
#define RTW89_6G_BW_NUM (RTW89_CHANNEL_WIDTH_320 + 1)
#define RTW89_BYR_BW_NUM (RTW89_CHANNEL_WIDTH_320 + 1)
#define RTW89_PPE_BW_NUM (RTW89_CHANNEL_WIDTH_320 + 1)

enum rtw89_pe_duration {
 RTW89_PE_DURATION_0 = 0,
 RTW89_PE_DURATION_8 = 1,
 RTW89_PE_DURATION_16 = 2,
 RTW89_PE_DURATION_16_20 = 3,
};

enum rtw89_ru_bandwidth {
 RTW89_RU26 = 0,
 RTW89_RU52 = 1,
 RTW89_RU106 = 2,
 RTW89_RU52_26 = 3,
 RTW89_RU106_26 = 4,
 RTW89_RU_NUM,
};

enum rtw89_sc_offset {
 RTW89_SC_DONT_CARE = 0,
 RTW89_SC_20_UPPER = 1,
 RTW89_SC_20_LOWER = 2,
 RTW89_SC_20_UPMOST = 3,
 RTW89_SC_20_LOWEST = 4,
 RTW89_SC_20_UP2X = 5,
 RTW89_SC_20_LOW2X = 6,
 RTW89_SC_20_UP3X = 7,
 RTW89_SC_20_LOW3X = 8,
 RTW89_SC_40_UPPER = 9,
 RTW89_SC_40_LOWER = 10,
};

/* only mgd features can be added to the enum */
enum rtw89_wow_flags {
 RTW89_WOW_FLAG_EN_MAGIC_PKT,
 RTW89_WOW_FLAG_EN_REKEY_PKT,
 RTW89_WOW_FLAG_EN_DISCONNECT,
 RTW89_WOW_FLAG_EN_PATTERN,
 RTW89_WOW_FLAG_NUM,
};

struct rtw89_chan {
 u8 channel;
 u8 primary_channel;
 enum rtw89_band band_type;
 enum rtw89_bandwidth band_width;

 /* The follow-up are derived from the above. We must ensure that it
 * is assigned correctly in rtw89_chan_create() if new one is added.
 */

 u32 freq;
 enum rtw89_subband subband_type;
 enum rtw89_sc_offset pri_ch_idx;
 u8 pri_sb_idx;
};

struct rtw89_chan_rcd {
 u8 prev_primary_channel;
 enum rtw89_band prev_band_type;
 bool band_changed;
};

struct rtw89_channel_help_params {
 u32 tx_en;
};

struct rtw89_port_reg {
 u32 port_cfg;
 u32 tbtt_prohib;
 u32 bcn_area;
 u32 bcn_early;
 u32 tbtt_early;
 u32 tbtt_agg;
 u32 bcn_space;
 u32 bcn_forcetx;
 u32 bcn_err_cnt;
 u32 bcn_err_flag;
 u32 dtim_ctrl;
 u32 tbtt_shift;
 u32 bcn_cnt_tmr;
 u32 tsftr_l;
 u32 tsftr_h;
 u32 md_tsft;
 u32 bss_color;
 u32 mbssid;
 u32 mbssid_drop;
 u32 tsf_sync;
 u32 ptcl_dbg;
 u32 ptcl_dbg_info;
 u32 bcn_drop_all;
 u32 hiq_win[RTW89_PORT_NUM];
};

struct rtw89_txwd_body {
 __le32 dword0;
 __le32 dword1;
 __le32 dword2;
 __le32 dword3;
 __le32 dword4;
 __le32 dword5;
} __packed;

struct rtw89_txwd_body_v1 {
 __le32 dword0;
 __le32 dword1;
 __le32 dword2;
 __le32 dword3;
 __le32 dword4;
 __le32 dword5;
 __le32 dword6;
 __le32 dword7;
} __packed;

struct rtw89_txwd_body_v2 {
 __le32 dword0;
 __le32 dword1;
 __le32 dword2;
 __le32 dword3;
 __le32 dword4;
 __le32 dword5;
 __le32 dword6;
 __le32 dword7;
} __packed;

struct rtw89_txwd_info {
 __le32 dword0;
 __le32 dword1;
 __le32 dword2;
 __le32 dword3;
 __le32 dword4;
 __le32 dword5;
} __packed;

struct rtw89_txwd_info_v2 {
 __le32 dword0;
 __le32 dword1;
 __le32 dword2;
 __le32 dword3;
 __le32 dword4;
 __le32 dword5;
 __le32 dword6;
 __le32 dword7;
} __packed;

struct rtw89_rx_desc_info {
 u16 pkt_size;
 u8 pkt_type;
 u8 drv_info_size;
 u8 phy_rpt_size;
 u8 hdr_cnv_size;
 u8 shift;
 u8 wl_hd_iv_len;
 bool long_rxdesc;
 bool bb_sel;
 bool mac_info_valid;
 u16 data_rate;
 u8 gi_ltf;
 u8 bw;
 u32 free_run_cnt;
 u8 user_id;
 bool sr_en;
 u8 ppdu_cnt;
 u8 ppdu_type;
 bool icv_err;
 bool crc32_err;
 bool hw_dec;
 bool sw_dec;
 bool addr1_match;
 u8 frag;
 u16 seq;
 u8 frame_type;
 u8 rx_pl_id;
 bool addr_cam_valid;
 u8 addr_cam_id;
 u8 sec_cam_id;
 u8 mac_id;
 u16 offset;
 u16 rxd_len;
 bool ready;
 u16 rssi;
};

struct rtw89_rxdesc_short {
 __le32 dword0;
 __le32 dword1;
 __le32 dword2;
 __le32 dword3;
} __packed;

struct rtw89_rxdesc_short_v2 {
 __le32 dword0;
 __le32 dword1;
 __le32 dword2;
 __le32 dword3;
 __le32 dword4;
 __le32 dword5;
} __packed;

struct rtw89_rxdesc_long {
 __le32 dword0;
 __le32 dword1;
 __le32 dword2;
 __le32 dword3;
 __le32 dword4;
 __le32 dword5;
 __le32 dword6;
 __le32 dword7;
} __packed;

struct rtw89_rxdesc_long_v2 {
 __le32 dword0;
 __le32 dword1;
 __le32 dword2;
 __le32 dword3;
 __le32 dword4;
 __le32 dword5;
 __le32 dword6;
 __le32 dword7;
 __le32 dword8;
 __le32 dword9;
} __packed;

struct rtw89_rxdesc_phy_rpt_v2 {
 __le32 dword0;
 __le32 dword1;
} __packed;

struct rtw89_tx_desc_info {
 u16 pkt_size;
 u8 wp_offset;
 u8 mac_id;
 u8 qsel;
 u8 ch_dma;
 u8 hdr_llc_len;
 bool is_bmc;
 bool en_wd_info;
 bool wd_page;
 bool use_rate;
 bool dis_data_fb;
 bool tid_indicate;
 bool agg_en;
 bool bk;
 u8 ampdu_density;
 u8 ampdu_num;
 bool sec_en;
 u8 addr_info_nr;
 u8 sec_keyid;
 u8 sec_type;
 u8 sec_cam_idx;
 u8 sec_seq[6];
 u16 data_rate;
 u16 data_retry_lowest_rate;
 bool fw_dl;
 u16 seq;
 bool a_ctrl_bsr;
 u8 hw_ssn_sel;
#define RTW89_MGMT_HW_SSN_SEL 1
 u8 hw_seq_mode;
#define RTW89_MGMT_HW_SEQ_MODE 1
 bool hiq;
 u8 port;
 bool er_cap;
 bool stbc;
 bool ldpc;
 bool upd_wlan_hdr;
 bool mlo;
 bool sw_mld;
};

struct rtw89_core_tx_request {
 enum rtw89_core_tx_type tx_type;

 struct sk_buff *skb;
 struct ieee80211_vif *vif;
 struct ieee80211_sta *sta;
 struct rtw89_vif_link *rtwvif_link;
 struct rtw89_sta_link *rtwsta_link;
 struct rtw89_tx_desc_info desc_info;
};

struct rtw89_txq {
 struct list_head list;
 unsigned long flags;
 int wait_cnt;
};

struct rtw89_mac_ax_gnt {
 u8 gnt_bt_sw_en;
 u8 gnt_bt;
 u8 gnt_wl_sw_en;
 u8 gnt_wl;
} __packed;

struct rtw89_mac_ax_wl_act {
 u8 wlan_act_en;
 u8 wlan_act;
} __packed;

#define RTW89_MAC_AX_COEX_GNT_NR 2
struct rtw89_mac_ax_coex_gnt {
 struct rtw89_mac_ax_gnt band[RTW89_MAC_AX_COEX_GNT_NR];
 struct rtw89_mac_ax_wl_act bt[RTW89_MAC_AX_COEX_GNT_NR];
};

enum rtw89_btc_ncnt {
 BTC_NCNT_POWER_ON = 0x0,
 BTC_NCNT_POWER_OFF,
 BTC_NCNT_INIT_COEX,
 BTC_NCNT_SCAN_START,
 BTC_NCNT_SCAN_FINISH,
 BTC_NCNT_SPECIAL_PACKET,
 BTC_NCNT_SWITCH_BAND,
 BTC_NCNT_RFK_TIMEOUT,
 BTC_NCNT_SHOW_COEX_INFO,
 BTC_NCNT_ROLE_INFO,
 BTC_NCNT_CONTROL,
 BTC_NCNT_RADIO_STATE,
 BTC_NCNT_CUSTOMERIZE,
 BTC_NCNT_WL_RFK,
 BTC_NCNT_WL_STA,
 BTC_NCNT_WL_STA_LAST,
 BTC_NCNT_FWINFO,
 BTC_NCNT_TIMER,
 BTC_NCNT_SWITCH_CHBW,
 BTC_NCNT_RESUME_DL_FW,
 BTC_NCNT_COUNTRYCODE,
 BTC_NCNT_NUM,
};

enum rtw89_btc_btinfo {
 BTC_BTINFO_L0 = 0,
 BTC_BTINFO_L1,
 BTC_BTINFO_L2,
 BTC_BTINFO_L3,
 BTC_BTINFO_H0,
 BTC_BTINFO_H1,
 BTC_BTINFO_H2,
 BTC_BTINFO_H3,
 BTC_BTINFO_MAX
};

enum rtw89_btc_dcnt {
 BTC_DCNT_RUN = 0x0,
 BTC_DCNT_CX_RUNINFO,
 BTC_DCNT_RPT,
 BTC_DCNT_RPT_HANG,
 BTC_DCNT_CYCLE,
 BTC_DCNT_CYCLE_HANG,
 BTC_DCNT_W1,
 BTC_DCNT_W1_HANG,
 BTC_DCNT_B1,
 BTC_DCNT_B1_HANG,
 BTC_DCNT_TDMA_NONSYNC,
 BTC_DCNT_SLOT_NONSYNC,
 BTC_DCNT_BTCNT_HANG,
 BTC_DCNT_BTTX_HANG,
 BTC_DCNT_WL_SLOT_DRIFT,
 BTC_DCNT_WL_STA_LAST,
 BTC_DCNT_BT_SLOT_DRIFT,
 BTC_DCNT_BT_SLOT_FLOOD,
 BTC_DCNT_FDDT_TRIG,
 BTC_DCNT_E2G,
 BTC_DCNT_E2G_HANG,
 BTC_DCNT_WL_FW_VER_MATCH,
 BTC_DCNT_NULL_TX_FAIL,
 BTC_DCNT_WL_STA_NTFY,
 BTC_DCNT_NUM,
};

enum rtw89_btc_wl_state_cnt {
 BTC_WCNT_SCANAP = 0x0,
 BTC_WCNT_DHCP,
 BTC_WCNT_EAPOL,
 BTC_WCNT_ARP,
 BTC_WCNT_SCBDUPDATE,
 BTC_WCNT_RFK_REQ,
 BTC_WCNT_RFK_GO,
 BTC_WCNT_RFK_REJECT,
 BTC_WCNT_RFK_TIMEOUT,
 BTC_WCNT_CH_UPDATE,
 BTC_WCNT_DBCC_ALL_2G,
 BTC_WCNT_DBCC_CHG,
 BTC_WCNT_RX_OK_LAST,
 BTC_WCNT_RX_OK_LAST2S,
 BTC_WCNT_RX_ERR_LAST,
 BTC_WCNT_RX_ERR_LAST2S,
 BTC_WCNT_RX_LAST,
 BTC_WCNT_NUM
};

enum rtw89_btc_bt_state_cnt {
 BTC_BCNT_RETRY = 0x0,
 BTC_BCNT_REINIT,
 BTC_BCNT_REENABLE,
 BTC_BCNT_SCBDREAD,
 BTC_BCNT_RELINK,
 BTC_BCNT_IGNOWL,
 BTC_BCNT_INQPAG,
 BTC_BCNT_INQ,
 BTC_BCNT_PAGE,
 BTC_BCNT_ROLESW,
 BTC_BCNT_AFH,
 BTC_BCNT_INFOUPDATE,
 BTC_BCNT_INFOSAME,
 BTC_BCNT_SCBDUPDATE,
 BTC_BCNT_HIPRI_TX,
 BTC_BCNT_HIPRI_RX,
 BTC_BCNT_LOPRI_TX,
 BTC_BCNT_LOPRI_RX,
 BTC_BCNT_POLUT,
 BTC_BCNT_POLUT_NOW,
 BTC_BCNT_POLUT_DIFF,
 BTC_BCNT_RATECHG,
 BTC_BCNT_BTTXPWR_UPDATE,
 BTC_BCNT_NUM,
};

enum rtw89_btc_bt_profile {
 BTC_BT_NOPROFILE = 0,
 BTC_BT_HFP = BIT(0),
 BTC_BT_HID = BIT(1),
 BTC_BT_A2DP = BIT(2),
 BTC_BT_PAN = BIT(3),
 BTC_PROFILE_MAX = 4,
};

struct rtw89_btc_ant_info {
 u8 type;  /* shared, dedicated */
 u8 num;
 u8 isolation;

 u8 single_pos: 1;/* Single antenna at S0 or S1 */
 u8 diversity: 1;
 u8 btg_pos: 2;
 u8 stream_cnt: 4;
};

struct rtw89_btc_ant_info_v7 {
 u8 type;  /* shared, dedicated(non-shared) */
 u8 num;   /* antenna count  */
 u8 isolation;
 u8 single_pos;/* wifi 1ss-1ant at 0:S0 or 1:S1 */

 u8 diversity; /* only for wifi use 1-antenna */
 u8 btg_pos; /* btg-circuit at 0:S0/1:S1/others:all */
 u8 stream_cnt;  /* spatial_stream count */
 u8 rsvd;
} __packed;

enum rtw89_tfc_dir {
 RTW89_TFC_UL,
 RTW89_TFC_DL,
};

struct rtw89_btc_wl_smap {
 u32 busy: 1;
 u32 scan: 1;
 u32 connecting: 1;
 u32 roaming: 1;
 u32 dbccing: 1;
 u32 _4way: 1;
 u32 rf_off: 1;
 u32 lps: 2;
 u32 ips: 1;
 u32 init_ok: 1;
 u32 traffic_dir : 2;
 u32 rf_off_pre: 1;
 u32 lps_pre: 2;
 u32 lps_exiting: 1;
 u32 emlsr: 1;
};

enum rtw89_tfc_interval {
 RTW89_TFC_INTERVAL_100MS,
 RTW89_TFC_INTERVAL_2SEC,
};

enum rtw89_tfc_lv {
 RTW89_TFC_IDLE,
 RTW89_TFC_ULTRA_LOW,
 RTW89_TFC_LOW,
 RTW89_TFC_MID,
 RTW89_TFC_HIGH,
};

DECLARE_EWMA(tp, 10, 2);

struct rtw89_traffic_stats {
 /* units in bytes */
 u64 tx_unicast;
 u64 rx_unicast;
 u32 tx_avg_len;
 u32 rx_avg_len;

 /* count for packets */
 u64 tx_cnt;
 u64 rx_cnt;

 /* units in Mbps */
 u32 tx_throughput;
 u32 rx_throughput;
 u32 tx_throughput_raw;
 u32 rx_throughput_raw;

 u32 rx_tf_acc;
 u32 rx_tf_periodic;

 enum rtw89_tfc_lv tx_tfc_lv;
 enum rtw89_tfc_lv rx_tfc_lv;
 struct ewma_tp tx_ewma_tp;
 struct ewma_tp rx_ewma_tp;

 u16 tx_rate;
 u16 rx_rate;
};

struct rtw89_btc_chdef {
 u8 center_ch;
 u8 band;
 u8 chan;
 enum rtw89_sc_offset offset;
 enum rtw89_bandwidth bw;
};

struct rtw89_btc_statistic {
 u8 rssi; /* 0%~110% (dBm = rssi -110) */
 struct rtw89_traffic_stats traffic;
};

#define BTC_WL_RSSI_THMAX 4

struct rtw89_btc_wl_link_info {
 struct rtw89_btc_chdef chdef;
 struct rtw89_btc_statistic stat;
 enum rtw89_tfc_dir dir;
 u8 rssi_state[BTC_WL_RSSI_THMAX];
 u8 mac_addr[ETH_ALEN];
 u8 busy;
 u8 ch;
 u8 bw;
 u8 band;
 u8 role;
 u8 pid;
 u8 phy;
 u8 dtim_period;
 u8 mode;
 u8 tx_1ss_limit;

 u8 mac_id;
 u8 tx_retry;

 u32 bcn_period;
 u32 busy_t;
 u32 tx_time;
 u32 client_cnt;
 u32 rx_rate_drop_cnt;
 u32 noa_duration;

 u32 active: 1;
 u32 noa: 1;
 u32 client_ps: 1;
 u32 connected: 2;
};

union rtw89_btc_wl_state_map {
 u32 val;
 struct rtw89_btc_wl_smap map;
};

struct rtw89_btc_bt_hfp_desc {
 u32 exist: 1;
 u32 type: 2;
 u32 rsvd: 29;
};

struct rtw89_btc_bt_hid_desc {
 u32 exist: 1;
 u32 slot_info: 2;
 u32 pair_cnt: 2;
 u32 type: 8;
 u32 rsvd: 19;
};

struct rtw89_btc_bt_a2dp_desc {
 u8 exist: 1;
 u8 exist_last: 1;
 u8 play_latency: 1;
 u8 type: 3;
 u8 active: 1;
 u8 sink: 1;
 u32 handle_update: 1;
 u32 devinfo_query: 1;
 u32 no_empty_streak_2s: 8;
 u32 no_empty_streak_max: 8;
 u32 rsvd: 6;

 u8 bitpool;
 u16 vendor_id;
 u32 device_name;
 u32 flush_time;
};

struct rtw89_btc_bt_pan_desc {
 u32 exist: 1;
 u32 type: 1;
 u32 active: 1;
 u32 rsvd: 29;
};

struct rtw89_btc_bt_rfk_info {
 u32 run: 1;
 u32 req: 1;
 u32 timeout: 1;
 u32 rsvd: 29;
};

union rtw89_btc_bt_rfk_info_map {
 u32 val;
 struct rtw89_btc_bt_rfk_info map;
};

struct rtw89_btc_bt_ver_info {
 u32 fw_coex; /* match with which coex_ver */
 u32 fw;
};

struct rtw89_btc_bool_sta_chg {
 u32 now: 1;
 u32 last: 1;
 u32 remain: 1;
 u32 srvd: 29;
};

struct rtw89_btc_u8_sta_chg {
 u8 now;
 u8 last;
 u8 remain;
 u8 rsvd;
};

struct rtw89_btc_wl_scan_info {
 u8 band[RTW89_PHY_NUM];
 u8 phy_map;
 u8 rsvd;
};

struct rtw89_btc_wl_dbcc_info {
 u8 op_band[RTW89_PHY_NUM]; /* op band in each phy */
 u8 scan_band[RTW89_PHY_NUM]; /* scan band in  each phy */
 u8 real_band[RTW89_PHY_NUM];
 u8 role[RTW89_PHY_NUM]; /* role in each phy */
};

struct rtw89_btc_wl_mlo_info {
 u8 wmode[RTW89_PHY_NUM]; /* enum phl_mr_wmode */
 u8 ch_type[RTW89_PHY_NUM]; /* enum phl_mr_ch_type */
 u8 hwb_rf_band[RTW89_PHY_NUM]; /* enum band_type, RF-band for HW-band */
 u8 path_rf_band[RTW89_PHY_NUM]; /* enum band_type, RF-band for PHY0/1 */

 u8 wtype; /* enum phl_mr_wtype */
 u8 mrcx_mode;
 u8 mrcx_act_hwb_map;
 u8 mrcx_bt_slot_rsp;

 u8 rf_combination; /* enum btc_mlo_rf_combin 0:2+0, 1:0+2, 2:1+1,3:2+2 */
 u8 mlo_en; /* MLO enable */
 u8 mlo_adie; /* a-die count */
 u8 dual_hw_band_en; /* both 2 HW-band link exist */

 u32 link_status; /* enum mlo_dbcc_mode_type */
};

struct rtw89_btc_wl_active_role {
 u8 connected: 1;
 u8 pid: 3;
 u8 phy: 1;
 u8 noa: 1;
 u8 band: 2;

 u8 client_ps: 1;
 u8 bw: 7;

 u8 role;
 u8 ch;

 u16 tx_lvl;
 u16 rx_lvl;
 u16 tx_rate;
 u16 rx_rate;
};

struct rtw89_btc_wl_active_role_v1 {
 u8 connected: 1;
 u8 pid: 3;
 u8 phy: 1;
 u8 noa: 1;
 u8 band: 2;

 u8 client_ps: 1;
 u8 bw: 7;

 u8 role;
 u8 ch;

 u16 tx_lvl;
 u16 rx_lvl;
 u16 tx_rate;
 u16 rx_rate;

 u32 noa_duration; /* ms */
};

struct rtw89_btc_wl_active_role_v2 {
 u8 connected: 1;
 u8 pid: 3;
 u8 phy: 1;
 u8 noa: 1;
 u8 band: 2;

 u8 client_ps: 1;
 u8 bw: 7;

 u8 role;
 u8 ch;

 u32 noa_duration; /* ms */
};

struct rtw89_btc_wl_active_role_v7 {
 u8 connected;
 u8 pid;
 u8 phy;
 u8 noa;

 u8 band;
 u8 client_ps;
 u8 bw;
 u8 role;

 u8 ch;
 u8 noa_dur;
 u8 client_cnt;
 u8 rsvd2;
} __packed;

struct rtw89_btc_wl_role_info_bpos {
 u16 none: 1;
 u16 station: 1;
 u16 ap: 1;
 u16 vap: 1;
 u16 adhoc: 1;
 u16 adhoc_master: 1;
 u16 mesh: 1;
 u16 moniter: 1;
 u16 p2p_device: 1;
 u16 p2p_gc: 1;
 u16 p2p_go: 1;
 u16 nan: 1;
};

struct rtw89_btc_wl_scc_ctrl {
 u8 null_role1;
 u8 null_role2;
 u8 ebt_null; /* if tx null at EBT slot */
};

union rtw89_btc_wl_role_info_map {
 u16 val;
 struct rtw89_btc_wl_role_info_bpos role;
};

struct rtw89_btc_wl_role_info { /* struct size must be n*4 bytes */
 u8 connect_cnt;
 u8 link_mode;
 union rtw89_btc_wl_role_info_map role_map;
 struct rtw89_btc_wl_active_role active_role[RTW89_PORT_NUM];
};

struct rtw89_btc_wl_role_info_v1 { /* struct size must be n*4 bytes */
 u8 connect_cnt;
 u8 link_mode;
 union rtw89_btc_wl_role_info_map role_map;
 struct rtw89_btc_wl_active_role_v1 active_role_v1[RTW89_PORT_NUM];
 u32 mrole_type; /* btc_wl_mrole_type */
 u32 mrole_noa_duration; /* ms */

 u32 dbcc_en: 1;
 u32 dbcc_chg: 1;
 u32 dbcc_2g_phy: 2; /* which phy operate in 2G, HW_PHY_0 or HW_PHY_1 */
 u32 link_mode_chg: 1;
 u32 rsvd: 27;
};

struct rtw89_btc_wl_role_info_v2 { /* struct size must be n*4 bytes */
 u8 connect_cnt;
 u8 link_mode;
 union rtw89_btc_wl_role_info_map role_map;
 struct rtw89_btc_wl_active_role_v2 active_role_v2[RTW89_PORT_NUM];
 u32 mrole_type; /* btc_wl_mrole_type */
 u32 mrole_noa_duration; /* ms */

 u32 dbcc_en: 1;
 u32 dbcc_chg: 1;
 u32 dbcc_2g_phy: 2; /* which phy operate in 2G, HW_PHY_0 or HW_PHY_1 */
 u32 link_mode_chg: 1;
 u32 rsvd: 27;
};

struct rtw89_btc_wl_rlink { /* H2C info, struct size must be n*4 bytes */
 u8 connected;
 u8 pid;
 u8 phy;
 u8 noa;

 u8 rf_band; /* enum band_type RF band: 2.4G/5G/6G */
 u8 active; /* 0:rlink is under doze */
 u8 bw; /* enum channel_width */
 u8 role; /*enum role_type */

 u8 ch;
 u8 noa_dur; /* ms */
 u8 client_cnt; /* for Role = P2P-Go/AP */
 u8 mode; /* wifi protocol */
} __packed;

#define RTW89_BE_BTC_WL_MAX_ROLE_NUMBER 6
struct rtw89_btc_wl_role_info_v7 { /* struct size must be n*4 bytes */
 u8 connect_cnt;
 u8 link_mode;
 u8 link_mode_chg;
 u8 p2p_2g;

 struct rtw89_btc_wl_active_role_v7 active_role[RTW89_BE_BTC_WL_MAX_ROLE_NUMBER];

 u32 role_map;
 u32 mrole_type; /* btc_wl_mrole_type */
 u32 mrole_noa_duration; /* ms */
 u32 dbcc_en;
 u32 dbcc_chg;
 u32 dbcc_2g_phy; /* which phy operate in 2G, HW_PHY_0 or HW_PHY_1 */
} __packed;

struct rtw89_btc_wl_role_info_v8 { /* H2C info, struct size must be n*4 bytes */
 u8 connect_cnt;
 u8 link_mode;
 u8 link_mode_chg;
 u8 p2p_2g;

 u8 pta_req_band;
 u8 dbcc_en; /* 1+1 and 2.4G-included */
 u8 dbcc_chg;
 u8 dbcc_2g_phy; /* which phy operate in 2G, HW_PHY_0 or HW_PHY_1 */

 struct rtw89_btc_wl_rlink rlink[RTW89_BE_BTC_WL_MAX_ROLE_NUMBER][RTW89_MAC_NUM];

 u32 role_map;
 u32 mrole_type; /* btc_wl_mrole_type */
 u32 mrole_noa_duration; /* ms */
} __packed;

struct rtw89_btc_wl_ver_info {
 u32 fw_coex; /* match with which coex_ver */
 u32 fw;
 u32 mac;
 u32 bb;
 u32 rf;
};

struct rtw89_btc_wl_afh_info {
 u8 en;
 u8 ch;
 u8 bw;
 u8 rsvd;
} __packed;

struct rtw89_btc_wl_rfk_info {
 u32 state: 2;
 u32 path_map: 4;
 u32 phy_map: 2;
 u32 band: 2;
 u32 type: 8;
 u32 con_rfk: 1;
 u32 rsvd: 13;

 u32 start_time;
 u32 proc_time;
};

struct rtw89_btc_bt_smap {
 u32 connect: 1;
 u32 ble_connect: 1;
 u32 acl_busy: 1;
 u32 sco_busy: 1;
 u32 mesh_busy: 1;
 u32 inq_pag: 1;
};

union rtw89_btc_bt_state_map {
 u32 val;
 struct rtw89_btc_bt_smap map;
};

#define BTC_BT_RSSI_THMAX 4
#define BTC_BT_AFH_GROUP 12
#define BTC_BT_AFH_LE_GROUP 5

struct rtw89_btc_bt_txpwr_desc {
 s8 br_dbm;
 s8 le_dbm;
 u8 br_gain_index;
 u8 le_gain_index;
};

struct rtw89_btc_bt_link_info {
 struct rtw89_btc_u8_sta_chg profile_cnt;
 struct rtw89_btc_bool_sta_chg multi_link;
 struct rtw89_btc_bool_sta_chg relink;
 struct rtw89_btc_bt_hfp_desc hfp_desc;
 struct rtw89_btc_bt_hid_desc hid_desc;
 struct rtw89_btc_bt_a2dp_desc a2dp_desc;
 struct rtw89_btc_bt_pan_desc pan_desc;
 union rtw89_btc_bt_state_map status;
 struct rtw89_btc_bt_txpwr_desc bt_txpwr_desc;

 u8 sut_pwr_level[BTC_PROFILE_MAX];
 u8 golden_rx_shift[BTC_PROFILE_MAX];
 u8 rssi_state[BTC_BT_RSSI_THMAX];
 u8 afh_map[BTC_BT_AFH_GROUP];
 u8 afh_map_le[BTC_BT_AFH_LE_GROUP];

 u32 role_sw: 1;
 u32 slave_role: 1;
 u32 afh_update: 1;
 u32 cqddr: 1;
 u32 rssi: 8;
 u32 tx_3m: 1;
 u32 rsvd: 19;
};

struct rtw89_btc_3rdcx_info {
 u8 type;   /* 0: none, 1:zigbee, 2:LTE  */
 u8 hw_coex;
 u16 rsvd;
};

struct rtw89_btc_dm_emap {
 u32 init: 1;
 u32 pta_owner: 1;
 u32 wl_rfk_timeout: 1;
 u32 bt_rfk_timeout: 1;
 u32 wl_fw_hang: 1;
 u32 cycle_hang: 1;
 u32 w1_hang: 1;
 u32 b1_hang: 1;
 u32 tdma_no_sync: 1;
 u32 slot_no_sync: 1;
 u32 wl_slot_drift: 1;
 u32 bt_slot_drift: 1;
 u32 role_num_mismatch: 1;
 u32 null1_tx_late: 1;
 u32 bt_afh_conflict: 1;
 u32 bt_leafh_conflict: 1;
 u32 bt_slot_flood: 1;
 u32 wl_e2g_hang: 1;
 u32 wl_ver_mismatch: 1;
 u32 bt_ver_mismatch: 1;
 u32 rfe_type0: 1;
 u32 h2c_buffer_over: 1;
 u32 bt_tx_hang: 1; /* for SNR too low bug, BT has no Tx req*/
 u32 wl_no_sta_ntfy: 1;

 u32 h2c_bmap_mismatch: 1;
 u32 c2h_bmap_mismatch: 1;
 u32 h2c_struct_invalid: 1;
 u32 c2h_struct_invalid: 1;
 u32 h2c_c2h_buffer_mismatch: 1;
};

union rtw89_btc_dm_error_map {
 u32 val;
 struct rtw89_btc_dm_emap map;
};

struct rtw89_btc_rf_para {
 u32 tx_pwr_freerun;
 u32 rx_gain_freerun;
 u32 tx_pwr_perpkt;
 u32 rx_gain_perpkt;
};

struct rtw89_btc_wl_nhm {
 u8 instant_wl_nhm_dbm;
 u8 instant_wl_nhm_per_mhz;
 u16 valid_record_times;
 s8 record_pwr[16];
 u8 record_ratio[16];
 s8 pwr; /* dbm_per_MHz  */
 u8 ratio;
 u8 current_status;
 u8 refresh;
 bool start_flag;
 s8 pwr_max;
 s8 pwr_min;
};

struct rtw89_btc_wl_info {
 struct rtw89_btc_wl_link_info link_info[RTW89_PORT_NUM];
 struct rtw89_btc_wl_link_info rlink_info[RTW89_BE_BTC_WL_MAX_ROLE_NUMBER][RTW89_MAC_NUM];
 struct rtw89_btc_wl_rfk_info rfk_info;
 struct rtw89_btc_wl_ver_info  ver_info;
 struct rtw89_btc_wl_afh_info afh_info;
 struct rtw89_btc_wl_role_info role_info;
 struct rtw89_btc_wl_role_info_v1 role_info_v1;
 struct rtw89_btc_wl_role_info_v2 role_info_v2;
 struct rtw89_btc_wl_role_info_v7 role_info_v7;
 struct rtw89_btc_wl_role_info_v8 role_info_v8;
 struct rtw89_btc_wl_scan_info scan_info;
 struct rtw89_btc_wl_dbcc_info dbcc_info;
 struct rtw89_btc_wl_mlo_info mlo_info;
 struct rtw89_btc_rf_para rf_para;
 struct rtw89_btc_wl_nhm nhm;
 union rtw89_btc_wl_state_map status;

 u8 port_id[RTW89_WIFI_ROLE_MLME_MAX];
 u8 rssi_level;
 u8 cn_report;
 u8 coex_mode;
 u8 pta_req_mac;
 u8 bt_polut_type[RTW89_PHY_NUM]; /* BT polluted WL-Tx type for phy0/1  */

 bool is_5g_hi_channel;
 bool go_client_exist;
 bool noa_exist;
 bool pta_reg_mac_chg;
 bool bg_mode;
 bool he_mode;
 bool scbd_change;
 bool fw_ver_mismatch;
 bool client_cnt_inc_2g;
 bool link_mode_chg;
 bool dbcc_chg;
 u32 scbd;
};

struct rtw89_btc_module {
 struct rtw89_btc_ant_info ant;
 u8 rfe_type;
 u8 cv;

 u8 bt_solo: 1;
 u8 bt_pos: 1;
 u8 switch_type: 1;
 u8 wa_type: 3;

 u8 kt_ver_adie;
};

struct rtw89_btc_module_v7 {
 u8 rfe_type;
 u8 kt_ver;
 u8 bt_solo;
 u8 bt_pos; /* wl-end view: get from efuse, must compare bt.btg_type*/

 u8 switch_type; /* WL/BT switch type: 0: internal, 1: external */
 u8 wa_type; /* WA type: 0:none, 1: 51B 5G_Hi-Ch_Rx */
 u8 kt_ver_adie;
 u8 rsvd;

 struct rtw89_btc_ant_info_v7 ant;
} __packed;

union rtw89_btc_module_info {
 struct rtw89_btc_module md;
 struct rtw89_btc_module_v7 md_v7;
};

#define RTW89_BTC_DM_MAXSTEP 30
#define RTW89_BTC_DM_CNT_MAX (RTW89_BTC_DM_MAXSTEP * 8)

struct rtw89_btc_dm_step {
 u16 step[RTW89_BTC_DM_MAXSTEP];
 u8 step_pos;
 bool step_ov;
};

struct rtw89_btc_init_info {
 struct rtw89_btc_module module;
 u8 wl_guard_ch;

 u8 wl_only: 1;
 u8 wl_init_ok: 1;
 u8 dbcc_en: 1;
 u8 cx_other: 1;
 u8 bt_only: 1;

 u16 rsvd;
};

struct rtw89_btc_init_info_v7 {
 u8 wl_guard_ch;
 u8 wl_only;
 u8 wl_init_ok;
 u8 rsvd3;

 u8 cx_other;
 u8 bt_only;
 u8 pta_mode;
 u8 pta_direction;

 struct rtw89_btc_module_v7 module;
} __packed;

union rtw89_btc_init_info_u {
 struct rtw89_btc_init_info init;
 struct rtw89_btc_init_info_v7 init_v7;
};

struct rtw89_btc_wl_tx_limit_para {
 u16 enable;
 u32 tx_time; /* unit: us */
 u16 tx_retry;
};

enum rtw89_btc_bt_scan_type {
 BTC_SCAN_INQ = 0,
 BTC_SCAN_PAGE,
 BTC_SCAN_BLE,
 BTC_SCAN_INIT,
 BTC_SCAN_TV,
 BTC_SCAN_ADV,
 BTC_SCAN_MAX1,
};

enum rtw89_btc_ble_scan_type {
 CXSCAN_BG = 0,
 CXSCAN_INIT,
 CXSCAN_LE,
 CXSCAN_MAX
};

#define RTW89_BTC_BTC_SCAN_V1_FLAG_ENABLE BIT(0)
#define RTW89_BTC_BTC_SCAN_V1_FLAG_INTERLACE BIT(1)

struct rtw89_btc_bt_scan_info_v1 {
 __le16 win;
 __le16 intvl;
 __le32 flags;
} __packed;

struct rtw89_btc_bt_scan_info_v2 {
 __le16 win;
 __le16 intvl;
} __packed;

struct rtw89_btc_fbtc_btscan_v1 {
 u8 fver; /* btc_ver::fcxbtscan */
 u8 rsvd;
 __le16 rsvd2;
 struct rtw89_btc_bt_scan_info_v1 scan[BTC_SCAN_MAX1];
} __packed;

struct rtw89_btc_fbtc_btscan_v2 {
 u8 fver; /* btc_ver::fcxbtscan */
 u8 type;
 __le16 rsvd2;
 struct rtw89_btc_bt_scan_info_v2 para[CXSCAN_MAX];
} __packed;

struct rtw89_btc_fbtc_btscan_v7 {
 u8 fver; /* btc_ver::fcxbtscan */
 u8 type;
 u8 rsvd0;
 u8 rsvd1;
 struct rtw89_btc_bt_scan_info_v2 para[CXSCAN_MAX];
} __packed;

union rtw89_btc_fbtc_btscan {
 struct rtw89_btc_fbtc_btscan_v1 v1;
 struct rtw89_btc_fbtc_btscan_v2 v2;
 struct rtw89_btc_fbtc_btscan_v7 v7;
};

struct rtw89_btc_bt_info {
 struct rtw89_btc_bt_link_info link_info;
 struct rtw89_btc_bt_scan_info_v1 scan_info_v1[BTC_SCAN_MAX1];
 struct rtw89_btc_bt_scan_info_v2 scan_info_v2[CXSCAN_MAX];
 struct rtw89_btc_bt_ver_info ver_info;
 struct rtw89_btc_bool_sta_chg enable;
 struct rtw89_btc_bool_sta_chg inq_pag;
 struct rtw89_btc_rf_para rf_para;
 union rtw89_btc_bt_rfk_info_map rfk_info;

 u8 raw_info[BTC_BTINFO_MAX]; /* raw bt info from mailbox */
 u8 txpwr_info[BTC_BTINFO_MAX];
 u8 rssi_level;

 u32 scbd;
 u32 feature;

 u32 mbx_avl: 1;
 u32 whql_test: 1;
 u32 igno_wl: 1;
 u32 reinit: 1;
 u32 ble_scan_en: 1;
 u32 btg_type: 1;
 u32 inq: 1;
 u32 pag: 1;
 u32 run_patch_code: 1;
 u32 hi_lna_rx: 1;
 u32 scan_rx_low_pri: 1;
 u32 scan_info_update: 1;
 u32 lna_constrain: 3;
 u32 rsvd: 17;
};

struct rtw89_btc_cx {
 struct rtw89_btc_wl_info wl;
 struct rtw89_btc_bt_info bt;
 struct rtw89_btc_3rdcx_info other;
 u32 state_map;
 u32 cnt_bt[BTC_BCNT_NUM];
 u32 cnt_wl[BTC_WCNT_NUM];
};

struct rtw89_btc_fbtc_tdma {
 u8 type; /* btc_ver::fcxtdma */
 u8 rxflctrl;
 u8 txpause;
 u8 wtgle_n;
 u8 leak_n;
 u8 ext_ctrl;
 u8 rxflctrl_role;
 u8 option_ctrl;
} __packed;

struct rtw89_btc_fbtc_tdma_v3 {
 u8 fver; /* btc_ver::fcxtdma */
 u8 rsvd;
 __le16 rsvd1;
 struct rtw89_btc_fbtc_tdma tdma;
} __packed;

union rtw89_btc_fbtc_tdma_le32 {
 struct rtw89_btc_fbtc_tdma v1;
 struct rtw89_btc_fbtc_tdma_v3 v3;
};

#define CXMREG_MAX 30
#define CXMREG_MAX_V2 20
#define FCXMAX_STEP 255 /*STEP trace record cnt, Max:65535, default:255*/
#define BTC_CYCLE_SLOT_MAX 48 /* must be even number, non-zero */

enum rtw89_btc_bt_sta_counter {
 BTC_BCNT_RFK_REQ = 0,
 BTC_BCNT_RFK_GO = 1,
 BTC_BCNT_RFK_REJECT = 2,
 BTC_BCNT_RFK_FAIL = 3,
 BTC_BCNT_RFK_TIMEOUT = 4,
 BTC_BCNT_HI_TX = 5,
 BTC_BCNT_HI_RX = 6,
 BTC_BCNT_LO_TX = 7,
 BTC_BCNT_LO_RX = 8,
 BTC_BCNT_POLLUTED = 9,
 BTC_BCNT_STA_MAX
};

enum rtw89_btc_bt_sta_counter_v105 {
 BTC_BCNT_RFK_REQ_V105 = 0,
 BTC_BCNT_HI_TX_V105 = 1,
 BTC_BCNT_HI_RX_V105 = 2,
 BTC_BCNT_LO_TX_V105 = 3,
 BTC_BCNT_LO_RX_V105 = 4,
 BTC_BCNT_POLLUTED_V105 = 5,
 BTC_BCNT_STA_MAX_V105
};

struct rtw89_btc_fbtc_rpt_ctrl_v1 {
 u16 fver; /* btc_ver::fcxbtcrpt */
 u16 rpt_cnt; /* tmr counters */
 u32 wl_fw_coex_ver; /* match which driver's coex version */
 u32 wl_fw_cx_offload;
 u32 wl_fw_ver;
 u32 rpt_enable;
 u32 rpt_para; /* ms */
 u32 mb_send_fail_cnt; /* fw send mailbox fail counter */
 u32 mb_send_ok_cnt; /* fw send mailbox ok counter */
 u32 mb_recv_cnt; /* fw recv mailbox counter */
 u32 mb_a2dp_empty_cnt; /* a2dp empty count */
 u32 mb_a2dp_flct_cnt; /* a2dp empty flow control counter */
 u32 mb_a2dp_full_cnt; /* a2dp empty full counter */
 u32 bt_rfk_cnt[BTC_BCNT_HI_TX];
 u32 c2h_cnt; /* fw send c2h counter  */
 u32 h2c_cnt; /* fw recv h2c counter */
} __packed;

struct rtw89_btc_fbtc_rpt_ctrl_info {
 __le32 cnt; /* fw report counter */
 __le32 en; /* report map */
 __le32 para; /* not used */

 __le32 cnt_c2h; /* fw send c2h counter  */
 __le32 cnt_h2c; /* fw recv h2c counter */
 __le32 len_c2h; /* The total length of the last C2H  */

 __le32 cnt_aoac_rf_on;  /* rf-on counter for aoac switch notify */
 __le32 cnt_aoac_rf_off; /* rf-off counter for aoac switch notify */
} __packed;

struct rtw89_btc_fbtc_rpt_ctrl_info_v5 {
 __le32 cx_ver; /* match which driver's coex version */
 __le32 fw_ver;
 __le32 en; /* report map */

 __le16 cnt; /* fw report counter */
 __le16 cnt_c2h; /* fw send c2h counter  */
 __le16 cnt_h2c; /* fw recv h2c counter */
 __le16 len_c2h; /* The total length of the last C2H  */

 __le16 cnt_aoac_rf_on;  /* rf-on counter for aoac switch notify */
 __le16 cnt_aoac_rf_off; /* rf-off counter for aoac switch notify */
} __packed;

struct rtw89_btc_fbtc_rpt_ctrl_info_v8 {
 __le16 cnt; /* fw report counter */
 __le16 cnt_c2h; /* fw send c2h counter  */
 __le16 cnt_h2c; /* fw recv h2c counter */
 __le16 len_c2h; /* The total length of the last C2H  */

 __le16 cnt_aoac_rf_on;  /* rf-on counter for aoac switch notify */
 __le16 cnt_aoac_rf_off; /* rf-off counter for aoac switch notify */

 __le32 cx_ver; /* match which driver's coex version */
 __le32 fw_ver;
 __le32 en; /* report map */
} __packed;

struct rtw89_btc_fbtc_rpt_ctrl_wl_fw_info {
 __le32 cx_ver; /* match which driver's coex version */
 __le32 cx_offload;
 __le32 fw_ver;
} __packed;

struct rtw89_btc_fbtc_rpt_ctrl_a2dp_empty {
 __le32 cnt_empty; /* a2dp empty count */
 __le32 cnt_flowctrl; /* a2dp empty flow control counter */
 __le32 cnt_tx;
 __le32 cnt_ack;
 __le32 cnt_nack;
} __packed;

struct rtw89_btc_fbtc_rpt_ctrl_bt_mailbox {
 __le32 cnt_send_ok; /* fw send mailbox ok counter */
 __le32 cnt_send_fail; /* fw send mailbox fail counter */
 __le32 cnt_recv; /* fw recv mailbox counter */
 struct rtw89_btc_fbtc_rpt_ctrl_a2dp_empty a2dp;
} __packed;

struct rtw89_btc_fbtc_rpt_ctrl_v4 {
 u8 fver;
 u8 rsvd;
 __le16 rsvd1;
 struct rtw89_btc_fbtc_rpt_ctrl_info rpt_info;
 struct rtw89_btc_fbtc_rpt_ctrl_wl_fw_info wl_fw_info;
 struct rtw89_btc_fbtc_rpt_ctrl_bt_mailbox bt_mbx_info;
 __le32 bt_cnt[BTC_BCNT_STA_MAX];
 struct rtw89_mac_ax_gnt gnt_val[RTW89_PHY_NUM];
} __packed;

struct rtw89_btc_fbtc_rpt_ctrl_v5 {
 u8 fver;
 u8 rsvd;
 __le16 rsvd1;

 u8 gnt_val[RTW89_PHY_NUM][4];
 __le16 bt_cnt[BTC_BCNT_STA_MAX];

 struct rtw89_btc_fbtc_rpt_ctrl_info_v5 rpt_info;
 struct rtw89_btc_fbtc_rpt_ctrl_bt_mailbox bt_mbx_info;
} __packed;

struct rtw89_btc_fbtc_rpt_ctrl_v105 {
 u8 fver;
 u8 rsvd;
 __le16 rsvd1;

 u8 gnt_val[RTW89_PHY_NUM][4];
 __le16 bt_cnt[BTC_BCNT_STA_MAX_V105];

 struct rtw89_btc_fbtc_rpt_ctrl_info_v5 rpt_info;
 struct rtw89_btc_fbtc_rpt_ctrl_bt_mailbox bt_mbx_info;
} __packed;

struct rtw89_btc_fbtc_rpt_ctrl_v7 {
 u8 fver;
 u8 rsvd0;
 u8 rsvd1;
 u8 rsvd2;

 u8 gnt_val[RTW89_PHY_NUM][4];
 __le16 bt_cnt[BTC_BCNT_STA_MAX_V105];

 struct rtw89_btc_fbtc_rpt_ctrl_info_v8 rpt_info;
 struct rtw89_btc_fbtc_rpt_ctrl_bt_mailbox bt_mbx_info;
} __packed;

struct rtw89_btc_fbtc_rpt_ctrl_v8 {
 u8 fver;
 u8 rsvd0;
 u8 rpt_len_max_l; /* BTC_RPT_MAX bit0~7 */
 u8 rpt_len_max_h; /* BTC_RPT_MAX bit8~15 */

 u8 gnt_val[RTW89_PHY_NUM][4];
 __le16 bt_cnt[BTC_BCNT_STA_MAX_V105];

 struct rtw89_btc_fbtc_rpt_ctrl_info_v8 rpt_info;
 struct rtw89_btc_fbtc_rpt_ctrl_bt_mailbox bt_mbx_info;
} __packed;

union rtw89_btc_fbtc_rpt_ctrl_ver_info {
 struct rtw89_btc_fbtc_rpt_ctrl_v1 v1;
 struct rtw89_btc_fbtc_rpt_ctrl_v4 v4;
 struct rtw89_btc_fbtc_rpt_ctrl_v5 v5;
 struct rtw89_btc_fbtc_rpt_ctrl_v105 v105;
 struct rtw89_btc_fbtc_rpt_ctrl_v7 v7;
 struct rtw89_btc_fbtc_rpt_ctrl_v8 v8;
};

enum rtw89_fbtc_ext_ctrl_type {
 CXECTL_OFF = 0x0, /* tdma off */
 CXECTL_B2 = 0x1, /* allow B2 (beacon-early) */
 CXECTL_EXT = 0x2,
 CXECTL_MAX
};

union rtw89_btc_fbtc_rxflct {
 u8 val;
 u8 type: 3;
 u8 tgln_n: 5;
};

enum rtw89_btc_cxst_state {
 CXST_OFF = 0x0,
 CXST_B2W = 0x1,
 CXST_W1 = 0x2,
 CXST_W2 = 0x3,
 CXST_W2B = 0x4,
 CXST_B1 = 0x5,
 CXST_B2 = 0x6,
 CXST_B3 = 0x7,
 CXST_B4 = 0x8,
 CXST_LK = 0x9,
 CXST_BLK = 0xa,
 CXST_E2G = 0xb,
 CXST_E5G = 0xc,
 CXST_EBT = 0xd,
 CXST_ENULL = 0xe,
 CXST_WLK = 0xf,
 CXST_W1FDD = 0x10,
 CXST_B1FDD = 0x11,
 CXST_MAX = 0x12,
};

enum rtw89_btc_cxevnt {
 CXEVNT_TDMA_ENTRY = 0x0,
 CXEVNT_WL_TMR,
 CXEVNT_B1_TMR,
 CXEVNT_B2_TMR,
 CXEVNT_B3_TMR,
 CXEVNT_B4_TMR,
 CXEVNT_W2B_TMR,
 CXEVNT_B2W_TMR,
 CXEVNT_BCN_EARLY,
 CXEVNT_A2DP_EMPTY,
 CXEVNT_LK_END,
 CXEVNT_RX_ISR,
 CXEVNT_RX_FC0,
 CXEVNT_RX_FC1,
 CXEVNT_BT_RELINK,
 CXEVNT_BT_RETRY,
 CXEVNT_E2G,
 CXEVNT_E5G,
 CXEVNT_EBT,
 CXEVNT_ENULL,
 CXEVNT_DRV_WLK,
 CXEVNT_BCN_OK,
 CXEVNT_BT_CHANGE,
 CXEVNT_EBT_EXTEND,
 CXEVNT_E2G_NULL1,
 CXEVNT_B1FDD_TMR,
 CXEVNT_MAX
};

enum {
 CXBCN_ALL = 0x0,
 CXBCN_ALL_OK,
 CXBCN_BT_SLOT,
 CXBCN_BT_OK,
 CXBCN_MAX
};

enum btc_slot_type {
 SLOT_MIX = 0x0, /* accept BT Lower-Pri Tx/Rx request 0x778 = 1 */
 SLOT_ISO = 0x1, /* no accept BT Lower-Pri Tx/Rx request 0x778 = d*/
 CXSTYPE_NUM,
};

enum { /* TIME */
 CXT_BT = 0x0,
 CXT_WL = 0x1,
 CXT_MAX
};

enum { /* TIME-A2DP */
 CXT_FLCTRL_OFF = 0x0,
 CXT_FLCTRL_ON = 0x1,
 CXT_FLCTRL_MAX
};

enum { /* STEP TYPE */
 CXSTEP_NONE = 0x0,
 CXSTEP_EVNT = 0x1,
 CXSTEP_SLOT = 0x2,
 CXSTEP_MAX,
};

enum rtw89_btc_afh_map_type { /*AFH MAP TYPE */
 RPT_BT_AFH_SEQ_LEGACY = 0x10,
 RPT_BT_AFH_SEQ_LE = 0x20
};

#define BTC_DBG_MAX1  32
struct rtw89_btc_fbtc_gpio_dbg_v1 {
 u8 fver; /* btc_ver::fcxgpiodbg */
 u8 rsvd;
 __le16 rsvd2;
 __le32 en_map; /* which debug signal (see btc_wl_gpio_debug) is enable */
 __le32 pre_state; /* the debug signal is 1 or 0  */
 u8 gpio_map[BTC_DBG_MAX1]; /*the debug signals to GPIO-Position */
} __packed;

struct rtw89_btc_fbtc_gpio_dbg_v7 {
 u8 fver;
 u8 rsvd0;
 u8 rsvd1;
 u8 rsvd2;

 u8 gpio_map[BTC_DBG_MAX1];

 __le32 en_map;
 __le32 pre_state;
} __packed;

union rtw89_btc_fbtc_gpio_dbg {
 struct rtw89_btc_fbtc_gpio_dbg_v1 v1;
 struct rtw89_btc_fbtc_gpio_dbg_v7 v7;
};

struct rtw89_btc_fbtc_mreg_val_v1 {
 u8 fver; /* btc_ver::fcxmreg */
 u8 reg_num;
 __le16 rsvd;
 __le32 mreg_val[CXMREG_MAX];
} __packed;

struct rtw89_btc_fbtc_mreg_val_v2 {
 u8 fver; /* btc_ver::fcxmreg */
 u8 reg_num;
 __le16 rsvd;
 __le32 mreg_val[CXMREG_MAX_V2];
} __packed;

struct rtw89_btc_fbtc_mreg_val_v7 {
 u8 fver;
 u8 reg_num;
 u8 rsvd0;
 u8 rsvd1;
 __le32 mreg_val[CXMREG_MAX_V2];
} __packed;

union rtw89_btc_fbtc_mreg_val {
 struct rtw89_btc_fbtc_mreg_val_v1 v1;
 struct rtw89_btc_fbtc_mreg_val_v2 v2;
 struct rtw89_btc_fbtc_mreg_val_v7 v7;
};

#define RTW89_DEF_FBTC_MREG(__type, __bytes, __offset) \
 { .type = cpu_to_le16(__type), .bytes = cpu_to_le16(__bytes), \
   .offset = cpu_to_le32(__offset), }

struct rtw89_btc_fbtc_mreg {
 __le16 type;
 __le16 bytes;
 __le32 offset;
} __packed;

struct rtw89_btc_fbtc_slot {
 __le16 dur;
 __le32 cxtbl;
 __le16 cxtype;
} __packed;

struct rtw89_btc_fbtc_slots {
 u8 fver; /* btc_ver::fcxslots */
 u8 tbl_num;
 __le16 rsvd;
 __le32 update_map;
 struct rtw89_btc_fbtc_slot slot[CXST_MAX];
} __packed;

struct rtw89_btc_fbtc_slot_v7 {
 __le16 dur; /* slot duration */
 __le16 cxtype;
 __le32 cxtbl;
} __packed;

struct rtw89_btc_fbtc_slot_u16 {
 __le16 dur; /* slot duration */
 __le16 cxtype;
 __le16 cxtbl_l16; /* coex table [15:0] */
 __le16 cxtbl_h16; /* coex table [31:16] */
} __packed;

struct rtw89_btc_fbtc_1slot_v7 {
 u8 fver;
 u8 sid; /* slot id */
 __le16 rsvd;
 struct rtw89_btc_fbtc_slot_v7 slot;
} __packed;

struct rtw89_btc_fbtc_slots_v7 {
 u8 fver;
 u8 slot_cnt;
 u8 rsvd0;
 u8 rsvd1;
 struct rtw89_btc_fbtc_slot_u16 slot[CXST_MAX];
 __le32 update_map;
} __packed;

union rtw89_btc_fbtc_slots_info {
 struct rtw89_btc_fbtc_slots v1;
 struct rtw89_btc_fbtc_slots_v7 v7;
} __packed;

struct rtw89_btc_fbtc_step {
 u8 type;
 u8 val;
 __le16 difft;
} __packed;

struct rtw89_btc_fbtc_steps_v2 {
 u8 fver; /* btc_ver::fcxstep */
 u8 rsvd;
 __le16 cnt;
 __le16 pos_old;
 __le16 pos_new;
 struct rtw89_btc_fbtc_step step[FCXMAX_STEP];
} __packed;

struct rtw89_btc_fbtc_steps_v3 {
 u8 fver;
 u8 en;
 __le16 rsvd;
 __le32 cnt;
 struct rtw89_btc_fbtc_step step[FCXMAX_STEP];
} __packed;

union rtw89_btc_fbtc_steps_info {
 struct rtw89_btc_fbtc_steps_v2 v2;
 struct rtw89_btc_fbtc_steps_v3 v3;
};

struct rtw89_btc_fbtc_cysta_v2 { /* statistics for cycles */
 u8 fver; /* btc_ver::fcxcysta */
 u8 rsvd;
 __le16 cycles; /* total cycle number */
 __le16 cycles_a2dp[CXT_FLCTRL_MAX];
 __le16 a2dpept; /* a2dp empty cnt */
 __le16 a2dpeptto; /* a2dp empty timeout cnt*/
 __le16 tavg_cycle[CXT_MAX]; /* avg wl/bt cycle time */
 __le16 tmax_cycle[CXT_MAX]; /* max wl/bt cycle time */
 __le16 tmaxdiff_cycle[CXT_MAX]; /* max wl-wl bt-bt cycle diff time */
 __le16 tavg_a2dp[CXT_FLCTRL_MAX]; /* avg a2dp PSTDMA/TDMA time */
 __le16 tmax_a2dp[CXT_FLCTRL_MAX]; /* max a2dp PSTDMA/TDMA time */
 __le16 tavg_a2dpept; /* avg a2dp empty time */
 __le16 tmax_a2dpept; /* max a2dp empty time */
 __le16 tavg_lk; /* avg leak-slot time */
 __le16 tmax_lk; /* max leak-slot time */
 __le32 slot_cnt[CXST_MAX]; /* slot count */
 __le32 bcn_cnt[CXBCN_MAX];
 __le32 leakrx_cnt; /* the rximr occur at leak slot  */
 __le32 collision_cnt; /* counter for event/timer occur at same time */
 __le32 skip_cnt;
 __le32 exception;
 __le32 except_cnt;
 __le16 tslot_cycle[BTC_CYCLE_SLOT_MAX];
} __packed;

struct rtw89_btc_fbtc_fdd_try_info {
 __le16 cycles[CXT_FLCTRL_MAX];
 __le16 tavg[CXT_FLCTRL_MAX]; /* avg try BT-Slot-TDD/BT-slot-FDD time */
 __le16 tmax[CXT_FLCTRL_MAX]; /* max try BT-Slot-TDD/BT-slot-FDD time */
} __packed;

struct rtw89_btc_fbtc_cycle_time_info {
 __le16 tavg[CXT_MAX]; /* avg wl/bt cycle time */
 __le16 tmax[CXT_MAX]; /* max wl/bt cycle time */
 __le16 tmaxdiff[CXT_MAX]; /* max wl-wl bt-bt cycle diff time */
} __packed;

struct rtw89_btc_fbtc_cycle_time_info_v5 {
 __le16 tavg[CXT_MAX]; /* avg wl/bt cycle time */
 __le16 tmax[CXT_MAX]; /* max wl/bt cycle time */
} __packed;

struct rtw89_btc_fbtc_a2dp_trx_stat {
 u8 empty_cnt;
 u8 retry_cnt;
 u8 tx_rate;
 u8 tx_cnt;
 u8 ack_cnt;
 u8 nack_cnt;
 u8 rsvd1;
 u8 rsvd2;
} __packed;

struct rtw89_btc_fbtc_a2dp_trx_stat_v4 {
 u8 empty_cnt;
 u8 retry_cnt;
 u8 tx_rate;
 u8 tx_cnt;
 u8 ack_cnt;
 u8 nack_cnt;
 u8 no_empty_cnt;
 u8 rsvd;
} __packed;

struct rtw89_btc_fbtc_cycle_a2dp_empty_info {
 __le16 cnt; /* a2dp empty cnt */
 __le16 cnt_timeout; /* a2dp empty timeout cnt*/
 __le16 tavg; /* avg a2dp empty time */
 __le16 tmax; /* max a2dp empty time */
} __packed;

struct rtw89_btc_fbtc_cycle_leak_info {
 __le32 cnt_rximr; /* the rximr occur at leak slot  */
 __le16 tavg; /* avg leak-slot time */
 __le16 tmax; /* max leak-slot time */
} __packed;

struct rtw89_btc_fbtc_cycle_leak_info_v7 {
 __le16 tavg;
 __le16 tamx;
 __le32 cnt_rximr;
} __packed;

#define RTW89_BTC_FDDT_PHASE_CYCLE GENMASK(9, 0)
#define RTW89_BTC_FDDT_TRAIN_STEP GENMASK(15, 10)

struct rtw89_btc_fbtc_cycle_fddt_info {
 __le16 train_cycle;
 __le16 tp;

 s8 tx_power; /* absolute Tx power (dBm), 0xff-> no BTC control */
 s8 bt_tx_power; /* decrease Tx power (dB) */
 s8 bt_rx_gain;  /* LNA constrain level */
 u8 no_empty_cnt;

 u8 rssi; /* [7:4] -> bt_rssi_level, [3:0]-> wl_rssi_level */
 u8 cn; /* condition_num */
 u8 train_status; /* [7:4]-> train-state, [3:0]-> train-phase */
 u8 train_result; /* refer to enum btc_fddt_check_map */
} __packed;

#define RTW89_BTC_FDDT_CELL_TRAIN_STATE GENMASK(3, 0)
#define RTW89_BTC_FDDT_CELL_TRAIN_PHASE GENMASK(7, 4)

struct rtw89_btc_fbtc_cycle_fddt_info_v5 {
 __le16 train_cycle;
 __le16 tp;

 s8 tx_power; /* absolute Tx power (dBm), 0xff-> no BTC control */
 s8 bt_tx_power; /* decrease Tx power (dB) */
 s8 bt_rx_gain;  /* LNA constrain level */
 u8 no_empty_cnt;

 u8 rssi; /* [7:4] -> bt_rssi_level, [3:0]-> wl_rssi_level */
 u8 cn; /* condition_num */
 u8 train_status; /* [7:4]-> train-state, [3:0]-> train-phase */
 u8 train_result; /* refer to enum btc_fddt_check_map */
} __packed;

struct rtw89_btc_fbtc_fddt_cell_status {
 s8 wl_tx_pwr;
 s8 bt_tx_pwr;
 s8 bt_rx_gain;
 u8 state_phase; /* [0:3] train state, [4:7] train phase */
} __packed;

struct rtw89_btc_fbtc_cysta_v3 { /* statistics for cycles */
 u8 fver;
 u8 rsvd;
 __le16 cycles; /* total cycle number */
 __le16 slot_step_time[BTC_CYCLE_SLOT_MAX];
 struct rtw89_btc_fbtc_cycle_time_info cycle_time;
 struct rtw89_btc_fbtc_fdd_try_info fdd_try;
 struct rtw89_btc_fbtc_cycle_a2dp_empty_info a2dp_ept;
 struct rtw89_btc_fbtc_a2dp_trx_stat a2dp_trx[BTC_CYCLE_SLOT_MAX];
 struct rtw89_btc_fbtc_cycle_leak_info leak_slot;
 __le32 slot_cnt[CXST_MAX]; /* slot count */
 __le32 bcn_cnt[CXBCN_MAX];
 __le32 collision_cnt; /* counter for event/timer occur at the same time */
 __le32 skip_cnt;
 __le32 except_cnt;
 __le32 except_map;
} __packed;

#define FDD_TRAIN_WL_DIRECTION 2
#define FDD_TRAIN_WL_RSSI_LEVEL 5
#define FDD_TRAIN_BT_RSSI_LEVEL 5

struct rtw89_btc_fbtc_cysta_v4 { /* statistics for cycles */
 u8 fver;
 u8 rsvd;
 u8 collision_cnt; /* counter for event/timer occur at the same time */
 u8 except_cnt;

 __le16 skip_cnt;
 __le16 cycles; /* total cycle number */

 __le16 slot_step_time[BTC_CYCLE_SLOT_MAX]; /* record the wl/bt slot time */
 __le16 slot_cnt[CXST_MAX]; /* slot count */
 __le16 bcn_cnt[CXBCN_MAX];
 struct rtw89_btc_fbtc_cycle_time_info cycle_time;
 struct rtw89_btc_fbtc_cycle_leak_info leak_slot;
 struct rtw89_btc_fbtc_cycle_a2dp_empty_info a2dp_ept;
 struct rtw89_btc_fbtc_a2dp_trx_stat_v4 a2dp_trx[BTC_CYCLE_SLOT_MAX];
 struct rtw89_btc_fbtc_cycle_fddt_info fddt_trx[BTC_CYCLE_SLOT_MAX];
 struct rtw89_btc_fbtc_fddt_cell_status fddt_cells[FDD_TRAIN_WL_DIRECTION]
        [FDD_TRAIN_WL_RSSI_LEVEL]
        [FDD_TRAIN_BT_RSSI_LEVEL];
 __le32 except_map;
} __packed;

struct rtw89_btc_fbtc_cysta_v5 { /* statistics for cycles */
 u8 fver;
 u8 rsvd;
 u8 collision_cnt; /* counter for event/timer occur at the same time */
 u8 except_cnt;
 u8 wl_rx_err_ratio[BTC_CYCLE_SLOT_MAX];

 __le16 skip_cnt;
 __le16 cycles; /* total cycle number */

 __le16 slot_step_time[BTC_CYCLE_SLOT_MAX]; /* record the wl/bt slot time */
 __le16 slot_cnt[CXST_MAX]; /* slot count */
 __le16 bcn_cnt[CXBCN_MAX];
 struct rtw89_btc_fbtc_cycle_time_info_v5 cycle_time;
 struct rtw89_btc_fbtc_cycle_leak_info leak_slot;
 struct rtw89_btc_fbtc_cycle_a2dp_empty_info a2dp_ept;
 struct rtw89_btc_fbtc_a2dp_trx_stat_v4 a2dp_trx[BTC_CYCLE_SLOT_MAX];
 struct rtw89_btc_fbtc_cycle_fddt_info_v5 fddt_trx[BTC_CYCLE_SLOT_MAX];
 struct rtw89_btc_fbtc_fddt_cell_status fddt_cells[FDD_TRAIN_WL_DIRECTION]
        [FDD_TRAIN_WL_RSSI_LEVEL]
        [FDD_TRAIN_BT_RSSI_LEVEL];
 __le32 except_map;
} __packed;

struct rtw89_btc_fbtc_cysta_v7 { /* statistics for cycles */
 u8 fver;
 u8 rsvd;
 u8 collision_cnt; /* counter for event/timer occur at the same time */
 u8 except_cnt;

 u8 wl_rx_err_ratio[BTC_CYCLE_SLOT_MAX];

 struct rtw89_btc_fbtc_a2dp_trx_stat_v4 a2dp_trx[BTC_CYCLE_SLOT_MAX];

 __le16 skip_cnt;
 __le16 cycles; /* total cycle number */

 __le16 slot_step_time[BTC_CYCLE_SLOT_MAX]; /* record the wl/bt slot time */
 __le16 slot_cnt[CXST_MAX]; /* slot count */
 __le16 bcn_cnt[CXBCN_MAX];

--> --------------------

--> maximum size reached

--> --------------------

Messung V0.5
C=95 H=96 G=95

¤ Dauer der Verarbeitung: 0.31 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.