1e57b7901SRyder Lee /* SPDX-License-Identifier: ISC */ 2e57b7901SRyder Lee /* Copyright (C) 2020 MediaTek Inc. */ 3e57b7901SRyder Lee 4e57b7901SRyder Lee #ifndef __MT7915_MCU_H 5e57b7901SRyder Lee #define __MT7915_MCU_H 6e57b7901SRyder Lee 7e57b7901SRyder Lee struct mt7915_mcu_txd { 8e57b7901SRyder Lee __le32 txd[8]; 9e57b7901SRyder Lee 10e57b7901SRyder Lee __le16 len; 11e57b7901SRyder Lee __le16 pq_id; 12e57b7901SRyder Lee 13e57b7901SRyder Lee u8 cid; 14e57b7901SRyder Lee u8 pkt_type; 15e57b7901SRyder Lee u8 set_query; /* FW don't care */ 16e57b7901SRyder Lee u8 seq; 17e57b7901SRyder Lee 18e57b7901SRyder Lee u8 uc_d2b0_rev; 19e57b7901SRyder Lee u8 ext_cid; 20e57b7901SRyder Lee u8 s2d_index; 21e57b7901SRyder Lee u8 ext_cid_ack; 22e57b7901SRyder Lee 23e57b7901SRyder Lee u32 reserved[5]; 24e57b7901SRyder Lee } __packed __aligned(4); 25e57b7901SRyder Lee 26e57b7901SRyder Lee /* event table */ 27e57b7901SRyder Lee enum { 28e57b7901SRyder Lee MCU_EVENT_TARGET_ADDRESS_LEN = 0x01, 29e57b7901SRyder Lee MCU_EVENT_FW_START = 0x01, 30e57b7901SRyder Lee MCU_EVENT_GENERIC = 0x01, 31e57b7901SRyder Lee MCU_EVENT_ACCESS_REG = 0x02, 32e57b7901SRyder Lee MCU_EVENT_MT_PATCH_SEM = 0x04, 33e57b7901SRyder Lee MCU_EVENT_CH_PRIVILEGE = 0x18, 34e57b7901SRyder Lee MCU_EVENT_EXT = 0xed, 35e57b7901SRyder Lee MCU_EVENT_RESTART_DL = 0xef, 36e57b7901SRyder Lee }; 37e57b7901SRyder Lee 38e57b7901SRyder Lee /* ext event table */ 39e57b7901SRyder Lee enum { 40e57b7901SRyder Lee MCU_EXT_EVENT_PS_SYNC = 0x5, 415517f78bSRyder Lee MCU_EXT_EVENT_FW_LOG_2_HOST = 0x13, 42e57b7901SRyder Lee MCU_EXT_EVENT_THERMAL_PROTECT = 0x22, 43e57b7901SRyder Lee MCU_EXT_EVENT_ASSERT_DUMP = 0x23, 44e57b7901SRyder Lee MCU_EXT_EVENT_RDD_REPORT = 0x3a, 45e57b7901SRyder Lee MCU_EXT_EVENT_CSA_NOTIFY = 0x4f, 46e57b7901SRyder Lee MCU_EXT_EVENT_RATE_REPORT = 0x87, 47e57b7901SRyder Lee }; 48e57b7901SRyder Lee 49e57b7901SRyder Lee struct mt7915_mcu_rxd { 50e57b7901SRyder Lee __le32 rxd[6]; 51e57b7901SRyder Lee 52e57b7901SRyder Lee __le16 len; 53e57b7901SRyder Lee __le16 pkt_type_id; 54e57b7901SRyder Lee 55e57b7901SRyder Lee u8 eid; 56e57b7901SRyder Lee u8 seq; 57e57b7901SRyder Lee __le16 __rsv; 58e57b7901SRyder Lee 59e57b7901SRyder Lee u8 ext_eid; 60e57b7901SRyder Lee u8 __rsv1[2]; 61e57b7901SRyder Lee u8 s2d_index; 62e57b7901SRyder Lee }; 63e57b7901SRyder Lee 64e57b7901SRyder Lee struct mt7915_mcu_rdd_report { 65e57b7901SRyder Lee struct mt7915_mcu_rxd rxd; 66e57b7901SRyder Lee 67e57b7901SRyder Lee u8 idx; 68e57b7901SRyder Lee u8 long_detected; 69e57b7901SRyder Lee u8 constant_prf_detected; 70e57b7901SRyder Lee u8 staggered_prf_detected; 71e57b7901SRyder Lee u8 radar_type_idx; 72e57b7901SRyder Lee u8 periodic_pulse_num; 73e57b7901SRyder Lee u8 long_pulse_num; 74e57b7901SRyder Lee u8 hw_pulse_num; 75e57b7901SRyder Lee 76e57b7901SRyder Lee u8 out_lpn; 77e57b7901SRyder Lee u8 out_spn; 78e57b7901SRyder Lee u8 out_crpn; 79e57b7901SRyder Lee u8 out_crpw; 80e57b7901SRyder Lee u8 out_crbn; 81e57b7901SRyder Lee u8 out_stgpn; 82e57b7901SRyder Lee u8 out_stgpw; 83e57b7901SRyder Lee 84e57b7901SRyder Lee u8 rsv; 85e57b7901SRyder Lee 86e57b7901SRyder Lee __le32 out_pri_const; 87e57b7901SRyder Lee __le32 out_pri_stg[3]; 88e57b7901SRyder Lee 89e57b7901SRyder Lee struct { 90e57b7901SRyder Lee __le32 start; 91e57b7901SRyder Lee __le16 pulse_width; 92e57b7901SRyder Lee __le16 pulse_power; 93e57b7901SRyder Lee u8 mdrdy_flag; 94e57b7901SRyder Lee u8 rsv[3]; 95e57b7901SRyder Lee } long_pulse[32]; 96e57b7901SRyder Lee 97e57b7901SRyder Lee struct { 98e57b7901SRyder Lee __le32 start; 99e57b7901SRyder Lee __le16 pulse_width; 100e57b7901SRyder Lee __le16 pulse_power; 101e57b7901SRyder Lee u8 mdrdy_flag; 102e57b7901SRyder Lee u8 rsv[3]; 103e57b7901SRyder Lee } periodic_pulse[32]; 104e57b7901SRyder Lee 105e57b7901SRyder Lee struct { 106e57b7901SRyder Lee __le32 start; 107e57b7901SRyder Lee __le16 pulse_width; 108e57b7901SRyder Lee __le16 pulse_power; 109e57b7901SRyder Lee u8 sc_pass; 110e57b7901SRyder Lee u8 sw_reset; 111e57b7901SRyder Lee u8 mdrdy_flag; 112e57b7901SRyder Lee u8 tx_active; 113e57b7901SRyder Lee } hw_pulse[32]; 114e57b7901SRyder Lee } __packed; 115e57b7901SRyder Lee 116e57b7901SRyder Lee struct mt7915_mcu_eeprom_info { 117e57b7901SRyder Lee __le32 addr; 118e57b7901SRyder Lee __le32 valid; 119e57b7901SRyder Lee u8 data[16]; 120e57b7901SRyder Lee } __packed; 121e57b7901SRyder Lee 122e57b7901SRyder Lee struct mt7915_mcu_ra_info { 123e57b7901SRyder Lee struct mt7915_mcu_rxd rxd; 124e57b7901SRyder Lee 125e57b7901SRyder Lee __le32 event_id; 126e57b7901SRyder Lee __le16 wlan_idx; 127e57b7901SRyder Lee __le16 ru_idx; 128e57b7901SRyder Lee __le16 direction; 129e57b7901SRyder Lee __le16 dump_group; 130e57b7901SRyder Lee 131e57b7901SRyder Lee __le32 suggest_rate; 132e57b7901SRyder Lee __le32 min_rate; /* for dynamic sounding */ 133e57b7901SRyder Lee __le32 max_rate; /* for dynamic sounding */ 134e57b7901SRyder Lee __le32 init_rate_down_rate; 135e57b7901SRyder Lee 136e57b7901SRyder Lee __le16 curr_rate; 137e57b7901SRyder Lee __le16 init_rate_down_total; 138e57b7901SRyder Lee __le16 init_rate_down_succ; 139e57b7901SRyder Lee __le16 success; 140e57b7901SRyder Lee __le16 attempts; 141e57b7901SRyder Lee 142e57b7901SRyder Lee __le16 prev_rate; 143e57b7901SRyder Lee __le16 prob_up_rate; 144e57b7901SRyder Lee u8 no_rate_up_cnt; 145e57b7901SRyder Lee u8 ppdu_cnt; 146e57b7901SRyder Lee u8 gi; 147e57b7901SRyder Lee 148e57b7901SRyder Lee u8 try_up_fail; 149e57b7901SRyder Lee u8 try_up_total; 150e57b7901SRyder Lee u8 suggest_wf; 151e57b7901SRyder Lee u8 try_up_check; 152e57b7901SRyder Lee u8 prob_up_period; 153e57b7901SRyder Lee u8 prob_down_pending; 154e57b7901SRyder Lee } __packed; 155e57b7901SRyder Lee 156*11553d88SFelix Fietkau 157*11553d88SFelix Fietkau struct mt7915_mcu_phy_rx_info { 158*11553d88SFelix Fietkau u8 category; 159*11553d88SFelix Fietkau u8 rate; 160*11553d88SFelix Fietkau u8 mode; 161*11553d88SFelix Fietkau u8 nsts; 162*11553d88SFelix Fietkau u8 gi; 163*11553d88SFelix Fietkau u8 coding; 164*11553d88SFelix Fietkau u8 stbc; 165*11553d88SFelix Fietkau u8 bw; 166*11553d88SFelix Fietkau }; 167*11553d88SFelix Fietkau 168e57b7901SRyder Lee #define MT_RA_RATE_NSS GENMASK(8, 6) 169e57b7901SRyder Lee #define MT_RA_RATE_MCS GENMASK(3, 0) 170e57b7901SRyder Lee #define MT_RA_RATE_TX_MODE GENMASK(12, 9) 171e57b7901SRyder Lee #define MT_RA_RATE_DCM_EN BIT(4) 172e57b7901SRyder Lee #define MT_RA_RATE_BW GENMASK(14, 13) 173e57b7901SRyder Lee 174e57b7901SRyder Lee #define MCU_PQ_ID(p, q) (((p) << 15) | ((q) << 10)) 175e57b7901SRyder Lee #define MCU_PKT_ID 0xa0 176e57b7901SRyder Lee 177e57b7901SRyder Lee enum { 178e57b7901SRyder Lee MCU_Q_QUERY, 179e57b7901SRyder Lee MCU_Q_SET, 180e57b7901SRyder Lee MCU_Q_RESERVED, 181e57b7901SRyder Lee MCU_Q_NA 182e57b7901SRyder Lee }; 183e57b7901SRyder Lee 184e57b7901SRyder Lee enum { 185e57b7901SRyder Lee MCU_S2D_H2N, 186e57b7901SRyder Lee MCU_S2D_C2N, 187e57b7901SRyder Lee MCU_S2D_H2C, 188e57b7901SRyder Lee MCU_S2D_H2CN 189e57b7901SRyder Lee }; 190e57b7901SRyder Lee 191e57b7901SRyder Lee enum { 192e57b7901SRyder Lee MCU_CMD_TARGET_ADDRESS_LEN_REQ = 0x01, 193e57b7901SRyder Lee MCU_CMD_FW_START_REQ = 0x02, 194e57b7901SRyder Lee MCU_CMD_INIT_ACCESS_REG = 0x3, 195e57b7901SRyder Lee MCU_CMD_NIC_POWER_CTRL = 0x4, 196e57b7901SRyder Lee MCU_CMD_PATCH_START_REQ = 0x05, 197e57b7901SRyder Lee MCU_CMD_PATCH_FINISH_REQ = 0x07, 198e57b7901SRyder Lee MCU_CMD_PATCH_SEM_CONTROL = 0x10, 199e57b7901SRyder Lee MCU_CMD_EXT_CID = 0xED, 200e57b7901SRyder Lee MCU_CMD_FW_SCATTER = 0xEE, 201e57b7901SRyder Lee MCU_CMD_RESTART_DL_REQ = 0xEF, 202e57b7901SRyder Lee }; 203e57b7901SRyder Lee 204e57b7901SRyder Lee enum { 205e57b7901SRyder Lee MCU_EXT_CMD_EFUSE_ACCESS = 0x01, 206e57b7901SRyder Lee MCU_EXT_CMD_PM_STATE_CTRL = 0x07, 207e57b7901SRyder Lee MCU_EXT_CMD_CHANNEL_SWITCH = 0x08, 2085517f78bSRyder Lee MCU_EXT_CMD_FW_LOG_2_HOST = 0x13, 20989029a85SRyder Lee MCU_EXT_CMD_TXBF_ACTION = 0x1e, 210e57b7901SRyder Lee MCU_EXT_CMD_EFUSE_BUFFER_MODE = 0x21, 211e57b7901SRyder Lee MCU_EXT_CMD_STA_REC_UPDATE = 0x25, 212e57b7901SRyder Lee MCU_EXT_CMD_BSS_INFO_UPDATE = 0x26, 213e57b7901SRyder Lee MCU_EXT_CMD_EDCA_UPDATE = 0x27, 214e57b7901SRyder Lee MCU_EXT_CMD_DEV_INFO_UPDATE = 0x2A, 215e57b7901SRyder Lee MCU_EXT_CMD_THERMAL_CTRL = 0x2c, 216e151d71eSFelix Fietkau MCU_EXT_CMD_WTBL_UPDATE = 0x32, 217f68e6a1fSRyder Lee MCU_EXT_CMD_SET_DRR_CTRL = 0x36, 218e57b7901SRyder Lee MCU_EXT_CMD_SET_RDD_CTRL = 0x3a, 219e57b7901SRyder Lee MCU_EXT_CMD_PROTECT_CTRL = 0x3e, 220e57b7901SRyder Lee MCU_EXT_CMD_MAC_INIT_CTRL = 0x46, 221e57b7901SRyder Lee MCU_EXT_CMD_RX_HDR_TRANS = 0x47, 2228aa2c6f4SFelix Fietkau MCU_EXT_CMD_MUAR_UPDATE = 0x48, 223e57b7901SRyder Lee MCU_EXT_CMD_SET_RX_PATH = 0x4e, 224f1d96236SRyder Lee MCU_EXT_CMD_TX_POWER_FEATURE_CTRL = 0x58, 225e151d71eSFelix Fietkau MCU_EXT_CMD_MWDS_SUPPORT = 0x80, 226e57b7901SRyder Lee MCU_EXT_CMD_SET_SER_TRIGGER = 0x81, 227e57b7901SRyder Lee MCU_EXT_CMD_SCS_CTRL = 0x82, 228e57b7901SRyder Lee MCU_EXT_CMD_RATE_CTRL = 0x87, 2295517f78bSRyder Lee MCU_EXT_CMD_FW_DBG_CTRL = 0x95, 230e57b7901SRyder Lee MCU_EXT_CMD_SET_RDD_TH = 0x9d, 23106acdd38SRyder Lee MCU_EXT_CMD_SET_SPR = 0xa8, 232*11553d88SFelix Fietkau MCU_EXT_CMD_PHY_STAT_INFO = 0xad, 233e57b7901SRyder Lee }; 234e57b7901SRyder Lee 235e57b7901SRyder Lee enum { 236e57b7901SRyder Lee PATCH_SEM_RELEASE, 237e57b7901SRyder Lee PATCH_SEM_GET 238e57b7901SRyder Lee }; 239e57b7901SRyder Lee 240e57b7901SRyder Lee enum { 241e57b7901SRyder Lee PATCH_NOT_DL_SEM_FAIL, 242e57b7901SRyder Lee PATCH_IS_DL, 243e57b7901SRyder Lee PATCH_NOT_DL_SEM_SUCCESS, 244e57b7901SRyder Lee PATCH_REL_SEM_SUCCESS 245e57b7901SRyder Lee }; 246e57b7901SRyder Lee 247e57b7901SRyder Lee enum { 248e57b7901SRyder Lee FW_STATE_INITIAL, 249e57b7901SRyder Lee FW_STATE_FW_DOWNLOAD, 250e57b7901SRyder Lee FW_STATE_NORMAL_OPERATION, 251e57b7901SRyder Lee FW_STATE_NORMAL_TRX, 252e57b7901SRyder Lee FW_STATE_WACPU_RDY = 7 253e57b7901SRyder Lee }; 254e57b7901SRyder Lee 255e57b7901SRyder Lee enum { 256e57b7901SRyder Lee EE_MODE_EFUSE, 257e57b7901SRyder Lee EE_MODE_BUFFER, 258e57b7901SRyder Lee }; 259e57b7901SRyder Lee 260e57b7901SRyder Lee enum { 261e57b7901SRyder Lee EE_FORMAT_BIN, 262e57b7901SRyder Lee EE_FORMAT_WHOLE, 263e57b7901SRyder Lee EE_FORMAT_MULTIPLE, 264e57b7901SRyder Lee }; 265e57b7901SRyder Lee 266*11553d88SFelix Fietkau enum { 267*11553d88SFelix Fietkau MCU_PHY_STATE_TX_RATE, 268*11553d88SFelix Fietkau MCU_PHY_STATE_RX_RATE, 269*11553d88SFelix Fietkau MCU_PHY_STATE_RSSI, 270*11553d88SFelix Fietkau MCU_PHY_STATE_CONTENTION_RX_RATE, 271*11553d88SFelix Fietkau MCU_PHY_STATE_OFDMLQ_CNINFO, 272*11553d88SFelix Fietkau }; 273*11553d88SFelix Fietkau 274e57b7901SRyder Lee #define STA_TYPE_STA BIT(0) 275e57b7901SRyder Lee #define STA_TYPE_AP BIT(1) 276e57b7901SRyder Lee #define STA_TYPE_ADHOC BIT(2) 277e57b7901SRyder Lee #define STA_TYPE_WDS BIT(4) 278e57b7901SRyder Lee #define STA_TYPE_BC BIT(5) 279e57b7901SRyder Lee 280e57b7901SRyder Lee #define NETWORK_INFRA BIT(16) 281e57b7901SRyder Lee #define NETWORK_P2P BIT(17) 282e57b7901SRyder Lee #define NETWORK_IBSS BIT(18) 283e57b7901SRyder Lee #define NETWORK_WDS BIT(21) 284e57b7901SRyder Lee 285e57b7901SRyder Lee #define CONNECTION_INFRA_STA (STA_TYPE_STA | NETWORK_INFRA) 286e57b7901SRyder Lee #define CONNECTION_INFRA_AP (STA_TYPE_AP | NETWORK_INFRA) 287e57b7901SRyder Lee #define CONNECTION_P2P_GC (STA_TYPE_STA | NETWORK_P2P) 288e57b7901SRyder Lee #define CONNECTION_P2P_GO (STA_TYPE_AP | NETWORK_P2P) 289e57b7901SRyder Lee #define CONNECTION_IBSS_ADHOC (STA_TYPE_ADHOC | NETWORK_IBSS) 290e57b7901SRyder Lee #define CONNECTION_WDS (STA_TYPE_WDS | NETWORK_WDS) 291e57b7901SRyder Lee #define CONNECTION_INFRA_BC (STA_TYPE_BC | NETWORK_INFRA) 292e57b7901SRyder Lee 293e57b7901SRyder Lee #define CONN_STATE_DISCONNECT 0 294e57b7901SRyder Lee #define CONN_STATE_CONNECT 1 295e57b7901SRyder Lee #define CONN_STATE_PORT_SECURE 2 296e57b7901SRyder Lee 297e57b7901SRyder Lee enum { 298e57b7901SRyder Lee DEV_INFO_ACTIVE, 299e57b7901SRyder Lee DEV_INFO_MAX_NUM 300e57b7901SRyder Lee }; 301e57b7901SRyder Lee 302e57b7901SRyder Lee enum { 303e57b7901SRyder Lee SCS_SEND_DATA, 304e57b7901SRyder Lee SCS_SET_MANUAL_PD_TH, 305e57b7901SRyder Lee SCS_CONFIG, 306e57b7901SRyder Lee SCS_ENABLE, 307e57b7901SRyder Lee SCS_SHOW_INFO, 308e57b7901SRyder Lee SCS_GET_GLO_ADDR, 309e57b7901SRyder Lee SCS_GET_GLO_ADDR_EVENT, 310e57b7901SRyder Lee }; 311e57b7901SRyder Lee 312e57b7901SRyder Lee enum { 313e57b7901SRyder Lee CMD_CBW_20MHZ = IEEE80211_STA_RX_BW_20, 314e57b7901SRyder Lee CMD_CBW_40MHZ = IEEE80211_STA_RX_BW_40, 315e57b7901SRyder Lee CMD_CBW_80MHZ = IEEE80211_STA_RX_BW_80, 316e57b7901SRyder Lee CMD_CBW_160MHZ = IEEE80211_STA_RX_BW_160, 317e57b7901SRyder Lee CMD_CBW_10MHZ, 318e57b7901SRyder Lee CMD_CBW_5MHZ, 319e57b7901SRyder Lee CMD_CBW_8080MHZ, 320e57b7901SRyder Lee 321e57b7901SRyder Lee CMD_HE_MCS_BW80 = 0, 322e57b7901SRyder Lee CMD_HE_MCS_BW160, 323e57b7901SRyder Lee CMD_HE_MCS_BW8080, 324e57b7901SRyder Lee CMD_HE_MCS_BW_NUM 325e57b7901SRyder Lee }; 326e57b7901SRyder Lee 327e57b7901SRyder Lee struct tlv { 328e57b7901SRyder Lee __le16 tag; 329e57b7901SRyder Lee __le16 len; 330e57b7901SRyder Lee } __packed; 331e57b7901SRyder Lee 332e57b7901SRyder Lee struct bss_info_omac { 333e57b7901SRyder Lee __le16 tag; 334e57b7901SRyder Lee __le16 len; 335e57b7901SRyder Lee u8 hw_bss_idx; 336e57b7901SRyder Lee u8 omac_idx; 337e57b7901SRyder Lee u8 band_idx; 338e57b7901SRyder Lee u8 rsv0; 339e57b7901SRyder Lee __le32 conn_type; 340e57b7901SRyder Lee u32 rsv1; 341e57b7901SRyder Lee } __packed; 342e57b7901SRyder Lee 343e57b7901SRyder Lee struct bss_info_basic { 344e57b7901SRyder Lee __le16 tag; 345e57b7901SRyder Lee __le16 len; 346e57b7901SRyder Lee __le32 network_type; 347e57b7901SRyder Lee u8 active; 348e57b7901SRyder Lee u8 rsv0; 349e57b7901SRyder Lee __le16 bcn_interval; 350e57b7901SRyder Lee u8 bssid[ETH_ALEN]; 351e57b7901SRyder Lee u8 wmm_idx; 352e57b7901SRyder Lee u8 dtim_period; 353e57b7901SRyder Lee u8 bmc_wcid_lo; 354e57b7901SRyder Lee u8 cipher; 355e57b7901SRyder Lee u8 phy_mode; 356e57b7901SRyder Lee u8 max_bssid; /* max BSSID. range: 1 ~ 8, 0: MBSSID disabled */ 357e57b7901SRyder Lee u8 non_tx_bssid;/* non-transmitted BSSID, 0: transmitted BSSID */ 358e57b7901SRyder Lee u8 bmc_wcid_hi; /* high Byte and version */ 359e57b7901SRyder Lee u8 rsv[2]; 360e57b7901SRyder Lee } __packed; 361e57b7901SRyder Lee 362e57b7901SRyder Lee struct bss_info_rf_ch { 363e57b7901SRyder Lee __le16 tag; 364e57b7901SRyder Lee __le16 len; 365e57b7901SRyder Lee u8 pri_ch; 366e57b7901SRyder Lee u8 center_ch0; 367e57b7901SRyder Lee u8 center_ch1; 368e57b7901SRyder Lee u8 bw; 369e57b7901SRyder Lee u8 he_ru26_block; /* 1: don't send HETB in RU26, 0: allow */ 370e57b7901SRyder Lee u8 he_all_disable; /* 1: disallow all HETB, 0: allow */ 371e57b7901SRyder Lee u8 rsv[2]; 372e57b7901SRyder Lee } __packed; 373e57b7901SRyder Lee 374e57b7901SRyder Lee struct bss_info_ext_bss { 375e57b7901SRyder Lee __le16 tag; 376e57b7901SRyder Lee __le16 len; 377e57b7901SRyder Lee __le32 mbss_tsf_offset; /* in unit of us */ 378e57b7901SRyder Lee u8 rsv[8]; 379e57b7901SRyder Lee } __packed; 380e57b7901SRyder Lee 381e57b7901SRyder Lee struct bss_info_sync_mode { 382e57b7901SRyder Lee __le16 tag; 383e57b7901SRyder Lee __le16 len; 384e57b7901SRyder Lee __le16 bcn_interval; 385e57b7901SRyder Lee u8 enable; 386e57b7901SRyder Lee u8 dtim_period; 387e57b7901SRyder Lee u8 rsv[8]; 388e57b7901SRyder Lee } __packed; 389e57b7901SRyder Lee 390e57b7901SRyder Lee struct bss_info_bmc_rate { 391e57b7901SRyder Lee __le16 tag; 392e57b7901SRyder Lee __le16 len; 393e57b7901SRyder Lee __le16 bc_trans; 394e57b7901SRyder Lee __le16 mc_trans; 395e57b7901SRyder Lee u8 short_preamble; 396e57b7901SRyder Lee u8 rsv[7]; 397e57b7901SRyder Lee } __packed; 398e57b7901SRyder Lee 399e57b7901SRyder Lee struct bss_info_ra { 400e57b7901SRyder Lee __le16 tag; 401e57b7901SRyder Lee __le16 len; 402e57b7901SRyder Lee u8 op_mode; 403e57b7901SRyder Lee u8 adhoc_en; 404e57b7901SRyder Lee u8 short_preamble; 405e57b7901SRyder Lee u8 tx_streams; 406e57b7901SRyder Lee u8 rx_streams; 407e57b7901SRyder Lee u8 algo; 408e57b7901SRyder Lee u8 force_sgi; 409e57b7901SRyder Lee u8 force_gf; 410e57b7901SRyder Lee u8 ht_mode; 411e57b7901SRyder Lee u8 has_20_sta; /* Check if any sta support GF. */ 412e57b7901SRyder Lee u8 bss_width_trigger_events; 413e57b7901SRyder Lee u8 vht_nss_cap; 414e57b7901SRyder Lee u8 vht_bw_signal; /* not use */ 415e57b7901SRyder Lee u8 vht_force_sgi; /* not use */ 416e57b7901SRyder Lee u8 se_off; 417e57b7901SRyder Lee u8 antenna_idx; 418e57b7901SRyder Lee u8 train_up_rule; 419e57b7901SRyder Lee u8 rsv[3]; 420e57b7901SRyder Lee unsigned short train_up_high_thres; 421e57b7901SRyder Lee short train_up_rule_rssi; 422e57b7901SRyder Lee unsigned short low_traffic_thres; 423e57b7901SRyder Lee __le16 max_phyrate; 424e57b7901SRyder Lee __le32 phy_cap; 425e57b7901SRyder Lee __le32 interval; 426e57b7901SRyder Lee __le32 fast_interval; 427e57b7901SRyder Lee } __packed; 428e57b7901SRyder Lee 429b443e55fSRyder Lee struct bss_info_hw_amsdu { 430b443e55fSRyder Lee __le16 tag; 431b443e55fSRyder Lee __le16 len; 432b443e55fSRyder Lee __le32 cmp_bitmap_0; 433b443e55fSRyder Lee __le32 cmp_bitmap_1; 434b443e55fSRyder Lee __le16 trig_thres; 435b443e55fSRyder Lee u8 enable; 436b443e55fSRyder Lee u8 rsv; 437b443e55fSRyder Lee } __packed; 438b443e55fSRyder Lee 4396094f86fSRyder Lee struct bss_info_he { 4406094f86fSRyder Lee __le16 tag; 4416094f86fSRyder Lee __le16 len; 4426094f86fSRyder Lee u8 he_pe_duration; 4436094f86fSRyder Lee u8 vht_op_info_present; 4446094f86fSRyder Lee __le16 he_rts_thres; 4456094f86fSRyder Lee __le16 max_nss_mcs[CMD_HE_MCS_BW_NUM]; 4466094f86fSRyder Lee u8 rsv[6]; 4476094f86fSRyder Lee } __packed; 4486094f86fSRyder Lee 449e57b7901SRyder Lee struct bss_info_bcn { 450e57b7901SRyder Lee __le16 tag; 451e57b7901SRyder Lee __le16 len; 452e57b7901SRyder Lee u8 ver; 453e57b7901SRyder Lee u8 enable; 454e57b7901SRyder Lee __le16 sub_ntlv; 455e57b7901SRyder Lee } __packed __aligned(4); 456e57b7901SRyder Lee 457e57b7901SRyder Lee struct bss_info_bcn_csa { 458e57b7901SRyder Lee __le16 tag; 459e57b7901SRyder Lee __le16 len; 460e57b7901SRyder Lee u8 cnt; 461e57b7901SRyder Lee u8 rsv[3]; 462e57b7901SRyder Lee } __packed __aligned(4); 463e57b7901SRyder Lee 464e57b7901SRyder Lee struct bss_info_bcn_bcc { 465e57b7901SRyder Lee __le16 tag; 466e57b7901SRyder Lee __le16 len; 467e57b7901SRyder Lee u8 cnt; 468e57b7901SRyder Lee u8 rsv[3]; 469e57b7901SRyder Lee } __packed __aligned(4); 470e57b7901SRyder Lee 471e57b7901SRyder Lee struct bss_info_bcn_mbss { 472e57b7901SRyder Lee #define MAX_BEACON_NUM 32 473e57b7901SRyder Lee __le16 tag; 474e57b7901SRyder Lee __le16 len; 475e57b7901SRyder Lee __le32 bitmap; 476e57b7901SRyder Lee __le16 offset[MAX_BEACON_NUM]; 477e57b7901SRyder Lee u8 rsv[8]; 478e57b7901SRyder Lee } __packed __aligned(4); 479e57b7901SRyder Lee 480e57b7901SRyder Lee struct bss_info_bcn_cont { 481e57b7901SRyder Lee __le16 tag; 482e57b7901SRyder Lee __le16 len; 483e57b7901SRyder Lee __le16 tim_ofs; 484e57b7901SRyder Lee __le16 csa_ofs; 485e57b7901SRyder Lee __le16 bcc_ofs; 486e57b7901SRyder Lee __le16 pkt_len; 487e57b7901SRyder Lee } __packed __aligned(4); 488e57b7901SRyder Lee 489e57b7901SRyder Lee enum { 490e57b7901SRyder Lee BSS_INFO_BCN_CSA, 491e57b7901SRyder Lee BSS_INFO_BCN_BCC, 492e57b7901SRyder Lee BSS_INFO_BCN_MBSSID, 493e57b7901SRyder Lee BSS_INFO_BCN_CONTENT, 494e57b7901SRyder Lee BSS_INFO_BCN_MAX 495e57b7901SRyder Lee }; 496e57b7901SRyder Lee 497e57b7901SRyder Lee enum { 498e57b7901SRyder Lee BSS_INFO_OMAC, 499e57b7901SRyder Lee BSS_INFO_BASIC, 500e57b7901SRyder Lee BSS_INFO_RF_CH, /* optional, for BT/LTE coex */ 501e57b7901SRyder Lee BSS_INFO_PM, /* sta only */ 502e57b7901SRyder Lee BSS_INFO_UAPSD, /* sta only */ 503e57b7901SRyder Lee BSS_INFO_ROAM_DETECT, /* obsoleted */ 504e57b7901SRyder Lee BSS_INFO_LQ_RM, /* obsoleted */ 505e57b7901SRyder Lee BSS_INFO_EXT_BSS, 506e57b7901SRyder Lee BSS_INFO_BMC_RATE, /* for bmc rate control in CR4 */ 507e57b7901SRyder Lee BSS_INFO_SYNC_MODE, 508e57b7901SRyder Lee BSS_INFO_RA, 509e57b7901SRyder Lee BSS_INFO_HW_AMSDU, 510e57b7901SRyder Lee BSS_INFO_BSS_COLOR, 511e57b7901SRyder Lee BSS_INFO_HE_BASIC, 512e57b7901SRyder Lee BSS_INFO_PROTECT_INFO, 513e57b7901SRyder Lee BSS_INFO_OFFLOAD, 514e57b7901SRyder Lee BSS_INFO_11V_MBSSID, 515e57b7901SRyder Lee BSS_INFO_MAX_NUM 516e57b7901SRyder Lee }; 517e57b7901SRyder Lee 518e57b7901SRyder Lee enum { 519e57b7901SRyder Lee WTBL_RESET_AND_SET = 1, 520e57b7901SRyder Lee WTBL_SET, 521e57b7901SRyder Lee WTBL_QUERY, 522e57b7901SRyder Lee WTBL_RESET_ALL 523e57b7901SRyder Lee }; 524e57b7901SRyder Lee 525e57b7901SRyder Lee struct wtbl_req_hdr { 526e57b7901SRyder Lee u8 wlan_idx_lo; 527e57b7901SRyder Lee u8 operation; 528e57b7901SRyder Lee __le16 tlv_num; 529e57b7901SRyder Lee u8 wlan_idx_hi; 530e57b7901SRyder Lee u8 rsv[3]; 531e57b7901SRyder Lee } __packed; 532e57b7901SRyder Lee 533e57b7901SRyder Lee struct wtbl_generic { 534e57b7901SRyder Lee __le16 tag; 535e57b7901SRyder Lee __le16 len; 536e57b7901SRyder Lee u8 peer_addr[ETH_ALEN]; 537e57b7901SRyder Lee u8 muar_idx; 538e57b7901SRyder Lee u8 skip_tx; 539e57b7901SRyder Lee u8 cf_ack; 540e57b7901SRyder Lee u8 qos; 541e57b7901SRyder Lee u8 mesh; 542e57b7901SRyder Lee u8 adm; 543e57b7901SRyder Lee __le16 partial_aid; 544e57b7901SRyder Lee u8 baf_en; 545e57b7901SRyder Lee u8 aad_om; 546e57b7901SRyder Lee } __packed; 547e57b7901SRyder Lee 548e57b7901SRyder Lee struct wtbl_rx { 549e57b7901SRyder Lee __le16 tag; 550e57b7901SRyder Lee __le16 len; 551e57b7901SRyder Lee u8 rcid; 552e57b7901SRyder Lee u8 rca1; 553e57b7901SRyder Lee u8 rca2; 554e57b7901SRyder Lee u8 rv; 555e57b7901SRyder Lee u8 rsv[4]; 556e57b7901SRyder Lee } __packed; 557e57b7901SRyder Lee 558e57b7901SRyder Lee struct wtbl_ht { 559e57b7901SRyder Lee __le16 tag; 560e57b7901SRyder Lee __le16 len; 561e57b7901SRyder Lee u8 ht; 562e57b7901SRyder Lee u8 ldpc; 563e57b7901SRyder Lee u8 af; 564e57b7901SRyder Lee u8 mm; 565e57b7901SRyder Lee u8 rsv[4]; 566e57b7901SRyder Lee } __packed; 567e57b7901SRyder Lee 568e57b7901SRyder Lee struct wtbl_vht { 569e57b7901SRyder Lee __le16 tag; 570e57b7901SRyder Lee __le16 len; 571e57b7901SRyder Lee u8 ldpc; 572e57b7901SRyder Lee u8 dyn_bw; 573e57b7901SRyder Lee u8 vht; 574e57b7901SRyder Lee u8 txop_ps; 575e57b7901SRyder Lee u8 rsv[4]; 576e57b7901SRyder Lee } __packed; 577e57b7901SRyder Lee 57855f7c9b0SFelix Fietkau struct wtbl_hdr_trans { 57955f7c9b0SFelix Fietkau __le16 tag; 58055f7c9b0SFelix Fietkau __le16 len; 58155f7c9b0SFelix Fietkau u8 to_ds; 58255f7c9b0SFelix Fietkau u8 from_ds; 58355f7c9b0SFelix Fietkau u8 no_rx_trans; 58455f7c9b0SFelix Fietkau u8 _rsv; 58555f7c9b0SFelix Fietkau }; 58655f7c9b0SFelix Fietkau 587e57b7901SRyder Lee enum { 588e57b7901SRyder Lee MT_BA_TYPE_INVALID, 589e57b7901SRyder Lee MT_BA_TYPE_ORIGINATOR, 590e57b7901SRyder Lee MT_BA_TYPE_RECIPIENT 591e57b7901SRyder Lee }; 592e57b7901SRyder Lee 593e57b7901SRyder Lee enum { 594e57b7901SRyder Lee RST_BA_MAC_TID_MATCH, 595e57b7901SRyder Lee RST_BA_MAC_MATCH, 596e57b7901SRyder Lee RST_BA_NO_MATCH 597e57b7901SRyder Lee }; 598e57b7901SRyder Lee 599e57b7901SRyder Lee struct wtbl_ba { 600e57b7901SRyder Lee __le16 tag; 601e57b7901SRyder Lee __le16 len; 602e57b7901SRyder Lee /* common */ 603e57b7901SRyder Lee u8 tid; 604e57b7901SRyder Lee u8 ba_type; 605e57b7901SRyder Lee u8 rsv0[2]; 606e57b7901SRyder Lee /* originator only */ 607e57b7901SRyder Lee __le16 sn; 608e57b7901SRyder Lee u8 ba_en; 609e57b7901SRyder Lee u8 ba_winsize_idx; 610e57b7901SRyder Lee __le16 ba_winsize; 611e57b7901SRyder Lee /* recipient only */ 612e57b7901SRyder Lee u8 peer_addr[ETH_ALEN]; 613e57b7901SRyder Lee u8 rst_ba_tid; 614e57b7901SRyder Lee u8 rst_ba_sel; 615e57b7901SRyder Lee u8 rst_ba_sb; 616e57b7901SRyder Lee u8 band_idx; 617e57b7901SRyder Lee u8 rsv1[4]; 618e57b7901SRyder Lee } __packed; 619e57b7901SRyder Lee 620e57b7901SRyder Lee struct wtbl_smps { 621e57b7901SRyder Lee __le16 tag; 622e57b7901SRyder Lee __le16 len; 623e57b7901SRyder Lee u8 smps; 624e57b7901SRyder Lee u8 rsv[3]; 625e57b7901SRyder Lee } __packed; 626e57b7901SRyder Lee 627e57b7901SRyder Lee enum { 628e57b7901SRyder Lee WTBL_GENERIC, 629e57b7901SRyder Lee WTBL_RX, 630e57b7901SRyder Lee WTBL_HT, 631e57b7901SRyder Lee WTBL_VHT, 632e57b7901SRyder Lee WTBL_PEER_PS, /* not used */ 633e57b7901SRyder Lee WTBL_TX_PS, 634e57b7901SRyder Lee WTBL_HDR_TRANS, 635e57b7901SRyder Lee WTBL_SEC_KEY, 636e57b7901SRyder Lee WTBL_BA, 637e57b7901SRyder Lee WTBL_RDG, /* obsoleted */ 638e57b7901SRyder Lee WTBL_PROTECT, /* not used */ 639e57b7901SRyder Lee WTBL_CLEAR, /* not used */ 640e57b7901SRyder Lee WTBL_BF, 641e57b7901SRyder Lee WTBL_SMPS, 642e57b7901SRyder Lee WTBL_RAW_DATA, /* debug only */ 643e57b7901SRyder Lee WTBL_PN, 644e57b7901SRyder Lee WTBL_SPE, 645e57b7901SRyder Lee WTBL_MAX_NUM 646e57b7901SRyder Lee }; 647e57b7901SRyder Lee 648e57b7901SRyder Lee struct sta_ntlv_hdr { 649e57b7901SRyder Lee u8 rsv[2]; 650e57b7901SRyder Lee __le16 tlv_num; 651e57b7901SRyder Lee } __packed; 652e57b7901SRyder Lee 653e57b7901SRyder Lee struct sta_req_hdr { 654e57b7901SRyder Lee u8 bss_idx; 655e57b7901SRyder Lee u8 wlan_idx_lo; 656e57b7901SRyder Lee __le16 tlv_num; 657e57b7901SRyder Lee u8 is_tlv_append; 658e57b7901SRyder Lee u8 muar_idx; 659e57b7901SRyder Lee u8 wlan_idx_hi; 660e57b7901SRyder Lee u8 rsv; 661e57b7901SRyder Lee } __packed; 662e57b7901SRyder Lee 663e57b7901SRyder Lee struct sta_rec_basic { 664e57b7901SRyder Lee __le16 tag; 665e57b7901SRyder Lee __le16 len; 666e57b7901SRyder Lee __le32 conn_type; 667e57b7901SRyder Lee u8 conn_state; 668e57b7901SRyder Lee u8 qos; 669e57b7901SRyder Lee __le16 aid; 670e57b7901SRyder Lee u8 peer_addr[ETH_ALEN]; 671e57b7901SRyder Lee __le16 extra_info; 672e57b7901SRyder Lee } __packed; 673e57b7901SRyder Lee 674e57b7901SRyder Lee struct sta_rec_ht { 675e57b7901SRyder Lee __le16 tag; 676e57b7901SRyder Lee __le16 len; 677e57b7901SRyder Lee __le16 ht_cap; 678e57b7901SRyder Lee u16 rsv; 679e57b7901SRyder Lee } __packed; 680e57b7901SRyder Lee 681e57b7901SRyder Lee struct sta_rec_vht { 682e57b7901SRyder Lee __le16 tag; 683e57b7901SRyder Lee __le16 len; 684e57b7901SRyder Lee __le32 vht_cap; 685e57b7901SRyder Lee __le16 vht_rx_mcs_map; 686e57b7901SRyder Lee __le16 vht_tx_mcs_map; 687e57b7901SRyder Lee u8 rts_bw_sig; 688e57b7901SRyder Lee u8 rsv[3]; 689e57b7901SRyder Lee } __packed; 690e57b7901SRyder Lee 6914bf04d33SRyder Lee struct sta_rec_uapsd { 6924bf04d33SRyder Lee __le16 tag; 6934bf04d33SRyder Lee __le16 len; 6944bf04d33SRyder Lee u8 dac_map; 6954bf04d33SRyder Lee u8 tac_map; 6964bf04d33SRyder Lee u8 max_sp; 6974bf04d33SRyder Lee u8 rsv0; 6984bf04d33SRyder Lee __le16 listen_interval; 6994bf04d33SRyder Lee u8 rsv1[2]; 7004bf04d33SRyder Lee } __packed; 7014bf04d33SRyder Lee 702c336318fSRyder Lee struct sta_rec_muru { 703c336318fSRyder Lee __le16 tag; 704c336318fSRyder Lee __le16 len; 705c336318fSRyder Lee 706c336318fSRyder Lee struct { 707c336318fSRyder Lee bool ofdma_dl_en; 708c336318fSRyder Lee bool ofdma_ul_en; 709c336318fSRyder Lee bool mimo_dl_en; 710c336318fSRyder Lee bool mimo_ul_en; 711f68e6a1fSRyder Lee u8 rsv[4]; 712c336318fSRyder Lee } cfg; 713c336318fSRyder Lee 714c336318fSRyder Lee struct { 715c336318fSRyder Lee u8 punc_pream_rx; 716c336318fSRyder Lee bool he_20m_in_40m_2g; 717c336318fSRyder Lee bool he_20m_in_160m; 718c336318fSRyder Lee bool he_80m_in_160m; 719c336318fSRyder Lee bool lt16_sigb; 720c336318fSRyder Lee bool rx_su_comp_sigb; 721c336318fSRyder Lee bool rx_su_non_comp_sigb; 722f68e6a1fSRyder Lee u8 rsv; 723c336318fSRyder Lee } ofdma_dl; 724c336318fSRyder Lee 725c336318fSRyder Lee struct { 726c336318fSRyder Lee u8 t_frame_dur; 727c336318fSRyder Lee u8 mu_cascading; 728c336318fSRyder Lee u8 uo_ra; 729c336318fSRyder Lee u8 he_2x996_tone; 730c336318fSRyder Lee u8 rx_t_frame_11ac; 731c336318fSRyder Lee u8 rsv[3]; 732c336318fSRyder Lee } ofdma_ul; 733c336318fSRyder Lee 734c336318fSRyder Lee struct { 735c336318fSRyder Lee bool vht_mu_bfee; 736c336318fSRyder Lee bool partial_bw_dl_mimo; 737c336318fSRyder Lee u8 rsv[2]; 738c336318fSRyder Lee } mimo_dl; 739c336318fSRyder Lee 740c336318fSRyder Lee struct { 741c336318fSRyder Lee bool full_ul_mimo; 742c336318fSRyder Lee bool partial_ul_mimo; 743c336318fSRyder Lee u8 rsv[2]; 744c336318fSRyder Lee } mimo_ul; 745c336318fSRyder Lee } __packed; 746c336318fSRyder Lee 747c336318fSRyder Lee struct sta_rec_he { 748c336318fSRyder Lee __le16 tag; 749c336318fSRyder Lee __le16 len; 750c336318fSRyder Lee 751c336318fSRyder Lee __le32 he_cap; 752c336318fSRyder Lee 753c336318fSRyder Lee u8 t_frame_dur; 754c336318fSRyder Lee u8 max_ampdu_exp; 755c336318fSRyder Lee u8 bw_set; 756c336318fSRyder Lee u8 device_class; 757c336318fSRyder Lee u8 dcm_tx_mode; 758c336318fSRyder Lee u8 dcm_tx_max_nss; 759c336318fSRyder Lee u8 dcm_rx_mode; 760c336318fSRyder Lee u8 dcm_rx_max_nss; 761c336318fSRyder Lee u8 dcm_max_ru; 762c336318fSRyder Lee u8 punc_pream_rx; 763c336318fSRyder Lee u8 pkt_ext; 764c336318fSRyder Lee u8 rsv1; 765c336318fSRyder Lee 766c336318fSRyder Lee __le16 max_nss_mcs[CMD_HE_MCS_BW_NUM]; 767c336318fSRyder Lee 768c336318fSRyder Lee u8 rsv2[2]; 769c336318fSRyder Lee } __packed; 770c336318fSRyder Lee 771e57b7901SRyder Lee struct sta_rec_ba { 772e57b7901SRyder Lee __le16 tag; 773e57b7901SRyder Lee __le16 len; 774e57b7901SRyder Lee u8 tid; 775e57b7901SRyder Lee u8 ba_type; 776e57b7901SRyder Lee u8 amsdu; 777e57b7901SRyder Lee u8 ba_en; 778e57b7901SRyder Lee __le16 ssn; 779e57b7901SRyder Lee __le16 winsize; 780e57b7901SRyder Lee } __packed; 781e57b7901SRyder Lee 782b443e55fSRyder Lee struct sta_rec_amsdu { 783b443e55fSRyder Lee __le16 tag; 784b443e55fSRyder Lee __le16 len; 785b443e55fSRyder Lee u8 max_amsdu_num; 786b443e55fSRyder Lee u8 max_mpdu_size; 787b443e55fSRyder Lee u8 amsdu_en; 788b443e55fSRyder Lee u8 rsv; 789b443e55fSRyder Lee } __packed; 790b443e55fSRyder Lee 791e57b7901SRyder Lee struct sec_key { 792e57b7901SRyder Lee u8 cipher_id; 793e57b7901SRyder Lee u8 cipher_len; 794e57b7901SRyder Lee u8 key_id; 795e57b7901SRyder Lee u8 key_len; 796e57b7901SRyder Lee u8 key[32]; 797e57b7901SRyder Lee } __packed; 798e57b7901SRyder Lee 799e57b7901SRyder Lee struct sta_rec_sec { 800e57b7901SRyder Lee __le16 tag; 801e57b7901SRyder Lee __le16 len; 802e57b7901SRyder Lee u8 add; 803e57b7901SRyder Lee u8 n_cipher; 804e57b7901SRyder Lee u8 rsv[2]; 805e57b7901SRyder Lee 806e57b7901SRyder Lee struct sec_key key[2]; 807e57b7901SRyder Lee } __packed; 808e57b7901SRyder Lee 809e57b7901SRyder Lee struct ra_phy { 810e57b7901SRyder Lee u8 type; 811e57b7901SRyder Lee u8 flag; 812e57b7901SRyder Lee u8 stbc; 813e57b7901SRyder Lee u8 sgi; 814e57b7901SRyder Lee u8 bw; 815e57b7901SRyder Lee u8 ldpc; 816e57b7901SRyder Lee u8 mcs; 817e57b7901SRyder Lee u8 nss; 818e57b7901SRyder Lee u8 he_ltf; 819e57b7901SRyder Lee }; 820e57b7901SRyder Lee 821e57b7901SRyder Lee struct sta_rec_ra { 822e57b7901SRyder Lee __le16 tag; 823e57b7901SRyder Lee __le16 len; 824e57b7901SRyder Lee 825e57b7901SRyder Lee u8 valid; 826e57b7901SRyder Lee u8 auto_rate; 827e57b7901SRyder Lee u8 phy_mode; 828e57b7901SRyder Lee u8 channel; 829e57b7901SRyder Lee u8 bw; 830e57b7901SRyder Lee u8 disable_cck; 831e57b7901SRyder Lee u8 ht_mcs32; 832e57b7901SRyder Lee u8 ht_gf; 833e57b7901SRyder Lee u8 ht_mcs[4]; 834e57b7901SRyder Lee u8 mmps_mode; 835e57b7901SRyder Lee u8 gband_256; 836e57b7901SRyder Lee u8 af; 837e57b7901SRyder Lee u8 auth_wapi_mode; 838e57b7901SRyder Lee u8 rate_len; 839e57b7901SRyder Lee 840e57b7901SRyder Lee u8 supp_mode; 841e57b7901SRyder Lee u8 supp_cck_rate; 842e57b7901SRyder Lee u8 supp_ofdm_rate; 843e57b7901SRyder Lee __le32 supp_ht_mcs; 844e57b7901SRyder Lee __le16 supp_vht_mcs[4]; 845e57b7901SRyder Lee 846e57b7901SRyder Lee u8 op_mode; 847e57b7901SRyder Lee u8 op_vht_chan_width; 848e57b7901SRyder Lee u8 op_vht_rx_nss; 849e57b7901SRyder Lee u8 op_vht_rx_nss_type; 850e57b7901SRyder Lee 851e57b7901SRyder Lee __le32 sta_status; 852e57b7901SRyder Lee 853e57b7901SRyder Lee struct ra_phy phy; 854e57b7901SRyder Lee } __packed; 855e57b7901SRyder Lee 8569fac3c81SRyder Lee struct sta_rec_ra_fixed { 8579fac3c81SRyder Lee __le16 tag; 8589fac3c81SRyder Lee __le16 len; 8599fac3c81SRyder Lee 8609fac3c81SRyder Lee __le32 field; 8619fac3c81SRyder Lee u8 op_mode; 8629fac3c81SRyder Lee u8 op_vht_chan_width; 8639fac3c81SRyder Lee u8 op_vht_rx_nss; 8649fac3c81SRyder Lee u8 op_vht_rx_nss_type; 8659fac3c81SRyder Lee 8669fac3c81SRyder Lee struct ra_phy phy; 8679fac3c81SRyder Lee 8689fac3c81SRyder Lee u8 spe_en; 8699fac3c81SRyder Lee u8 short_preamble; 8709fac3c81SRyder Lee u8 is_5g; 8719fac3c81SRyder Lee u8 mmps_mode; 8729fac3c81SRyder Lee } __packed; 8739fac3c81SRyder Lee 8749fac3c81SRyder Lee #define RATE_PARAM_FIXED 3 8759fac3c81SRyder Lee #define RATE_PARAM_AUTO 20 8769fac3c81SRyder Lee #define RATE_CFG_MCS GENMASK(3, 0) 8779fac3c81SRyder Lee #define RATE_CFG_NSS GENMASK(7, 4) 8789fac3c81SRyder Lee #define RATE_CFG_GI GENMASK(11, 8) 8799fac3c81SRyder Lee #define RATE_CFG_BW GENMASK(15, 12) 8809fac3c81SRyder Lee #define RATE_CFG_STBC GENMASK(19, 16) 8819fac3c81SRyder Lee #define RATE_CFG_LDPC GENMASK(23, 20) 8829fac3c81SRyder Lee #define RATE_CFG_PHY_TYPE GENMASK(27, 24) 8839fac3c81SRyder Lee 88489029a85SRyder Lee struct sta_rec_bf { 88589029a85SRyder Lee __le16 tag; 88689029a85SRyder Lee __le16 len; 88789029a85SRyder Lee 88889029a85SRyder Lee __le16 pfmu; /* 0xffff: no access right for PFMU */ 88989029a85SRyder Lee bool su_mu; /* 0: SU, 1: MU */ 89089029a85SRyder Lee u8 bf_cap; /* 0: iBF, 1: eBF */ 89189029a85SRyder Lee u8 sounding_phy; /* 0: legacy, 1: OFDM, 2: HT, 4: VHT */ 89289029a85SRyder Lee u8 ndpa_rate; 89389029a85SRyder Lee u8 ndp_rate; 89489029a85SRyder Lee u8 rept_poll_rate; 89589029a85SRyder Lee u8 tx_mode; /* 0: legacy, 1: OFDM, 2: HT, 4: VHT ... */ 89689029a85SRyder Lee u8 nc; 89789029a85SRyder Lee u8 nr; 89889029a85SRyder Lee u8 bw; /* 0: 20M, 1: 40M, 2: 80M, 3: 160M */ 89989029a85SRyder Lee 90089029a85SRyder Lee u8 mem_total; 90189029a85SRyder Lee u8 mem_20m; 90289029a85SRyder Lee struct { 90389029a85SRyder Lee u8 row; 90489029a85SRyder Lee u8 col: 6, row_msb: 2; 90589029a85SRyder Lee } mem[4]; 90689029a85SRyder Lee 90789029a85SRyder Lee __le16 smart_ant; 90889029a85SRyder Lee u8 se_idx; 90989029a85SRyder Lee u8 auto_sounding; /* b7: low traffic indicator 91089029a85SRyder Lee * b6: Stop sounding for this entry 91189029a85SRyder Lee * b5 ~ b0: postpone sounding 91289029a85SRyder Lee */ 91389029a85SRyder Lee u8 ibf_timeout; 91489029a85SRyder Lee u8 ibf_dbw; 91589029a85SRyder Lee u8 ibf_ncol; 91689029a85SRyder Lee u8 ibf_nrow; 91789029a85SRyder Lee u8 nr_bw160; 91889029a85SRyder Lee u8 nc_bw160; 91989029a85SRyder Lee u8 ru_start_idx; 92089029a85SRyder Lee u8 ru_end_idx; 92189029a85SRyder Lee 92289029a85SRyder Lee bool trigger_su; 92389029a85SRyder Lee bool trigger_mu; 92489029a85SRyder Lee bool ng16_su; 92589029a85SRyder Lee bool ng16_mu; 92689029a85SRyder Lee bool codebook42_su; 92789029a85SRyder Lee bool codebook75_mu; 92889029a85SRyder Lee 92989029a85SRyder Lee u8 he_ltf; 93089029a85SRyder Lee u8 rsv[2]; 93189029a85SRyder Lee } __packed; 93289029a85SRyder Lee 9332af34fa3SRyder Lee struct sta_rec_bfee { 9342af34fa3SRyder Lee __le16 tag; 9352af34fa3SRyder Lee __le16 len; 9362af34fa3SRyder Lee bool fb_identity_matrix; /* 1: feedback identity matrix */ 9372af34fa3SRyder Lee bool ignore_feedback; /* 1: ignore */ 9382af34fa3SRyder Lee u8 rsv[2]; 9392af34fa3SRyder Lee } __packed; 9402af34fa3SRyder Lee 941e57b7901SRyder Lee enum { 942e57b7901SRyder Lee STA_REC_BASIC, 943e57b7901SRyder Lee STA_REC_RA, 944e57b7901SRyder Lee STA_REC_RA_CMM_INFO, 945e57b7901SRyder Lee STA_REC_RA_UPDATE, 946e57b7901SRyder Lee STA_REC_BF, 947e57b7901SRyder Lee STA_REC_AMSDU, 948e57b7901SRyder Lee STA_REC_BA, 949e57b7901SRyder Lee STA_REC_RED, /* not used */ 950e57b7901SRyder Lee STA_REC_TX_PROC, /* for hdr trans and CSO in CR4 */ 951e57b7901SRyder Lee STA_REC_HT, 952e57b7901SRyder Lee STA_REC_VHT, 953e57b7901SRyder Lee STA_REC_APPS, 954e57b7901SRyder Lee STA_REC_KEY, 955e57b7901SRyder Lee STA_REC_WTBL, 956e57b7901SRyder Lee STA_REC_HE, 957e57b7901SRyder Lee STA_REC_HW_AMSDU, 958e57b7901SRyder Lee STA_REC_WTBL_AADOM, 959e57b7901SRyder Lee STA_REC_KEY_V2, 960e57b7901SRyder Lee STA_REC_MURU, 961e57b7901SRyder Lee STA_REC_MUEDCA, 9622af34fa3SRyder Lee STA_REC_BFEE, 963e57b7901SRyder Lee STA_REC_MAX_NUM 964e57b7901SRyder Lee }; 965e57b7901SRyder Lee 966e57b7901SRyder Lee enum mt7915_cipher_type { 967e57b7901SRyder Lee MT_CIPHER_NONE, 968e57b7901SRyder Lee MT_CIPHER_WEP40, 969e57b7901SRyder Lee MT_CIPHER_WEP104, 970e57b7901SRyder Lee MT_CIPHER_WEP128, 971e57b7901SRyder Lee MT_CIPHER_TKIP, 972e57b7901SRyder Lee MT_CIPHER_AES_CCMP, 973e57b7901SRyder Lee MT_CIPHER_CCMP_256, 974e57b7901SRyder Lee MT_CIPHER_GCMP, 975e57b7901SRyder Lee MT_CIPHER_GCMP_256, 976e57b7901SRyder Lee MT_CIPHER_WAPI, 977e57b7901SRyder Lee MT_CIPHER_BIP_CMAC_128, 978e57b7901SRyder Lee }; 979e57b7901SRyder Lee 980e57b7901SRyder Lee enum { 981e57b7901SRyder Lee CH_SWITCH_NORMAL = 0, 982e57b7901SRyder Lee CH_SWITCH_SCAN = 3, 983e57b7901SRyder Lee CH_SWITCH_MCC = 4, 984e57b7901SRyder Lee CH_SWITCH_DFS = 5, 985e57b7901SRyder Lee CH_SWITCH_BACKGROUND_SCAN_START = 6, 986e57b7901SRyder Lee CH_SWITCH_BACKGROUND_SCAN_RUNNING = 7, 987e57b7901SRyder Lee CH_SWITCH_BACKGROUND_SCAN_STOP = 8, 988e57b7901SRyder Lee CH_SWITCH_SCAN_BYPASS_DPD = 9 989e57b7901SRyder Lee }; 990e57b7901SRyder Lee 991e57b7901SRyder Lee enum { 992e57b7901SRyder Lee THERMAL_SENSOR_TEMP_QUERY, 993e57b7901SRyder Lee THERMAL_SENSOR_MANUAL_CTRL, 994e57b7901SRyder Lee THERMAL_SENSOR_INFO_QUERY, 995e57b7901SRyder Lee THERMAL_SENSOR_TASK_CTRL, 996e57b7901SRyder Lee }; 997e57b7901SRyder Lee 99889029a85SRyder Lee enum { 99989029a85SRyder Lee MT_EBF = BIT(0), /* explicit beamforming */ 100089029a85SRyder Lee MT_IBF = BIT(1) /* implicit beamforming */ 100189029a85SRyder Lee }; 100289029a85SRyder Lee 1003e57b7901SRyder Lee #define MT7915_WTBL_UPDATE_MAX_SIZE (sizeof(struct wtbl_req_hdr) + \ 1004e57b7901SRyder Lee sizeof(struct wtbl_generic) + \ 1005e57b7901SRyder Lee sizeof(struct wtbl_rx) + \ 1006e57b7901SRyder Lee sizeof(struct wtbl_ht) + \ 1007e57b7901SRyder Lee sizeof(struct wtbl_vht) + \ 100855f7c9b0SFelix Fietkau sizeof(struct wtbl_hdr_trans) +\ 1009e57b7901SRyder Lee sizeof(struct wtbl_ba) + \ 101089029a85SRyder Lee sizeof(struct wtbl_smps)) 1011e57b7901SRyder Lee 1012e57b7901SRyder Lee #define MT7915_STA_UPDATE_MAX_SIZE (sizeof(struct sta_req_hdr) + \ 1013e57b7901SRyder Lee sizeof(struct sta_rec_basic) + \ 1014e57b7901SRyder Lee sizeof(struct sta_rec_ht) + \ 1015c336318fSRyder Lee sizeof(struct sta_rec_he) + \ 1016e57b7901SRyder Lee sizeof(struct sta_rec_ba) + \ 1017e57b7901SRyder Lee sizeof(struct sta_rec_vht) + \ 10184bf04d33SRyder Lee sizeof(struct sta_rec_uapsd) + \ 1019b443e55fSRyder Lee sizeof(struct sta_rec_amsdu) + \ 1020e57b7901SRyder Lee sizeof(struct tlv) + \ 1021e57b7901SRyder Lee MT7915_WTBL_UPDATE_MAX_SIZE) 1022e57b7901SRyder Lee 1023e57b7901SRyder Lee #define MT7915_WTBL_UPDATE_BA_SIZE (sizeof(struct wtbl_req_hdr) + \ 1024e57b7901SRyder Lee sizeof(struct wtbl_ba)) 1025e57b7901SRyder Lee 10263e68af62SRyder Lee #define MT7915_BSS_UPDATE_MAX_SIZE (sizeof(struct sta_req_hdr) + \ 10273e68af62SRyder Lee sizeof(struct bss_info_omac) + \ 10283e68af62SRyder Lee sizeof(struct bss_info_basic) +\ 10293e68af62SRyder Lee sizeof(struct bss_info_rf_ch) +\ 10303e68af62SRyder Lee sizeof(struct bss_info_ra) + \ 1031b443e55fSRyder Lee sizeof(struct bss_info_hw_amsdu) +\ 10323e68af62SRyder Lee sizeof(struct bss_info_he) + \ 10333e68af62SRyder Lee sizeof(struct bss_info_bmc_rate) +\ 10343e68af62SRyder Lee sizeof(struct bss_info_ext_bss) +\ 10353e68af62SRyder Lee sizeof(struct bss_info_sync_mode)) 10363e68af62SRyder Lee 1037e57b7901SRyder Lee #define MT7915_BEACON_UPDATE_SIZE (sizeof(struct sta_req_hdr) + \ 1038e57b7901SRyder Lee sizeof(struct bss_info_bcn_csa) + \ 1039e57b7901SRyder Lee sizeof(struct bss_info_bcn_bcc) + \ 1040e57b7901SRyder Lee sizeof(struct bss_info_bcn_mbss) + \ 1041e57b7901SRyder Lee sizeof(struct bss_info_bcn_cont)) 1042e57b7901SRyder Lee 1043e57b7901SRyder Lee #define PHY_MODE_A BIT(0) 1044e57b7901SRyder Lee #define PHY_MODE_B BIT(1) 1045e57b7901SRyder Lee #define PHY_MODE_G BIT(2) 1046e57b7901SRyder Lee #define PHY_MODE_GN BIT(3) 1047e57b7901SRyder Lee #define PHY_MODE_AN BIT(4) 1048e57b7901SRyder Lee #define PHY_MODE_AC BIT(5) 104937f4ca90SRyder Lee #define PHY_MODE_AX_24G BIT(6) 105037f4ca90SRyder Lee #define PHY_MODE_AX_5G BIT(7) 105137f4ca90SRyder Lee #define PHY_MODE_AX_6G BIT(8) 1052e57b7901SRyder Lee 1053e57b7901SRyder Lee #define MODE_CCK BIT(0) 1054e57b7901SRyder Lee #define MODE_OFDM BIT(1) 1055e57b7901SRyder Lee #define MODE_HT BIT(2) 1056e57b7901SRyder Lee #define MODE_VHT BIT(3) 1057c336318fSRyder Lee #define MODE_HE BIT(4) 1058e57b7901SRyder Lee 1059e57b7901SRyder Lee #define STA_CAP_WMM BIT(0) 1060e57b7901SRyder Lee #define STA_CAP_SGI_20 BIT(4) 1061e57b7901SRyder Lee #define STA_CAP_SGI_40 BIT(5) 1062e57b7901SRyder Lee #define STA_CAP_TX_STBC BIT(6) 1063e57b7901SRyder Lee #define STA_CAP_RX_STBC BIT(7) 1064e57b7901SRyder Lee #define STA_CAP_VHT_SGI_80 BIT(16) 1065e57b7901SRyder Lee #define STA_CAP_VHT_SGI_160 BIT(17) 1066e57b7901SRyder Lee #define STA_CAP_VHT_TX_STBC BIT(18) 1067e57b7901SRyder Lee #define STA_CAP_VHT_RX_STBC BIT(19) 1068e57b7901SRyder Lee #define STA_CAP_VHT_LDPC BIT(23) 1069e57b7901SRyder Lee #define STA_CAP_LDPC BIT(24) 1070e57b7901SRyder Lee #define STA_CAP_HT BIT(26) 1071e57b7901SRyder Lee #define STA_CAP_VHT BIT(27) 1072c336318fSRyder Lee #define STA_CAP_HE BIT(28) 1073c336318fSRyder Lee 1074c336318fSRyder Lee /* HE MAC */ 1075c336318fSRyder Lee #define STA_REC_HE_CAP_HTC BIT(0) 1076c336318fSRyder Lee #define STA_REC_HE_CAP_BQR BIT(1) 1077c336318fSRyder Lee #define STA_REC_HE_CAP_BSR BIT(2) 1078c336318fSRyder Lee #define STA_REC_HE_CAP_OM BIT(3) 1079c336318fSRyder Lee #define STA_REC_HE_CAP_AMSDU_IN_AMPDU BIT(4) 1080c336318fSRyder Lee /* HE PHY */ 1081c336318fSRyder Lee #define STA_REC_HE_CAP_DUAL_BAND BIT(5) 1082c336318fSRyder Lee #define STA_REC_HE_CAP_LDPC BIT(6) 1083c336318fSRyder Lee #define STA_REC_HE_CAP_TRIG_CQI_FK BIT(7) 1084c336318fSRyder Lee #define STA_REC_HE_CAP_PARTIAL_BW_EXT_RANGE BIT(8) 1085c336318fSRyder Lee /* STBC */ 1086c336318fSRyder Lee #define STA_REC_HE_CAP_LE_EQ_80M_TX_STBC BIT(9) 1087c336318fSRyder Lee #define STA_REC_HE_CAP_LE_EQ_80M_RX_STBC BIT(10) 1088c336318fSRyder Lee #define STA_REC_HE_CAP_GT_80M_TX_STBC BIT(11) 1089c336318fSRyder Lee #define STA_REC_HE_CAP_GT_80M_RX_STBC BIT(12) 1090c336318fSRyder Lee /* GI */ 1091c336318fSRyder Lee #define STA_REC_HE_CAP_SU_PPDU_1LTF_8US_GI BIT(13) 1092c336318fSRyder Lee #define STA_REC_HE_CAP_SU_MU_PPDU_4LTF_8US_GI BIT(14) 1093c336318fSRyder Lee #define STA_REC_HE_CAP_ER_SU_PPDU_1LTF_8US_GI BIT(15) 1094c336318fSRyder Lee #define STA_REC_HE_CAP_ER_SU_PPDU_4LTF_8US_GI BIT(16) 1095c336318fSRyder Lee #define STA_REC_HE_CAP_NDP_4LTF_3DOT2MS_GI BIT(17) 1096c336318fSRyder Lee /* 242 TONE */ 1097c336318fSRyder Lee #define STA_REC_HE_CAP_BW20_RU242_SUPPORT BIT(18) 1098c336318fSRyder Lee #define STA_REC_HE_CAP_TX_1024QAM_UNDER_RU242 BIT(19) 1099c336318fSRyder Lee #define STA_REC_HE_CAP_RX_1024QAM_UNDER_RU242 BIT(20) 1100e57b7901SRyder Lee 1101e57b7901SRyder Lee #endif 1102