linux/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: ISC */
   2/* Copyright (C) 2020 MediaTek Inc. */
   3
   4#ifndef __MT76_CONNAC_MCU_H
   5#define __MT76_CONNAC_MCU_H
   6
   7#include "mt76_connac.h"
   8
   9struct tlv {
  10        __le16 tag;
  11        __le16 len;
  12} __packed;
  13
  14/* sta_rec */
  15
  16struct sta_ntlv_hdr {
  17        u8 rsv[2];
  18        __le16 tlv_num;
  19} __packed;
  20
  21struct sta_req_hdr {
  22        u8 bss_idx;
  23        u8 wlan_idx_lo;
  24        __le16 tlv_num;
  25        u8 is_tlv_append;
  26        u8 muar_idx;
  27        u8 wlan_idx_hi;
  28        u8 rsv;
  29} __packed;
  30
  31struct sta_rec_basic {
  32        __le16 tag;
  33        __le16 len;
  34        __le32 conn_type;
  35        u8 conn_state;
  36        u8 qos;
  37        __le16 aid;
  38        u8 peer_addr[ETH_ALEN];
  39#define EXTRA_INFO_VER  BIT(0)
  40#define EXTRA_INFO_NEW  BIT(1)
  41        __le16 extra_info;
  42} __packed;
  43
  44struct sta_rec_ht {
  45        __le16 tag;
  46        __le16 len;
  47        __le16 ht_cap;
  48        u16 rsv;
  49} __packed;
  50
  51struct sta_rec_vht {
  52        __le16 tag;
  53        __le16 len;
  54        __le32 vht_cap;
  55        __le16 vht_rx_mcs_map;
  56        __le16 vht_tx_mcs_map;
  57        /* mt7921 */
  58        u8 rts_bw_sig;
  59        u8 rsv[3];
  60} __packed;
  61
  62struct sta_rec_uapsd {
  63        __le16 tag;
  64        __le16 len;
  65        u8 dac_map;
  66        u8 tac_map;
  67        u8 max_sp;
  68        u8 rsv0;
  69        __le16 listen_interval;
  70        u8 rsv1[2];
  71} __packed;
  72
  73struct sta_rec_ba {
  74        __le16 tag;
  75        __le16 len;
  76        u8 tid;
  77        u8 ba_type;
  78        u8 amsdu;
  79        u8 ba_en;
  80        __le16 ssn;
  81        __le16 winsize;
  82} __packed;
  83
  84struct sta_rec_he {
  85        __le16 tag;
  86        __le16 len;
  87
  88        __le32 he_cap;
  89
  90        u8 t_frame_dur;
  91        u8 max_ampdu_exp;
  92        u8 bw_set;
  93        u8 device_class;
  94        u8 dcm_tx_mode;
  95        u8 dcm_tx_max_nss;
  96        u8 dcm_rx_mode;
  97        u8 dcm_rx_max_nss;
  98        u8 dcm_max_ru;
  99        u8 punc_pream_rx;
 100        u8 pkt_ext;
 101        u8 rsv1;
 102
 103        __le16 max_nss_mcs[CMD_HE_MCS_BW_NUM];
 104
 105        u8 rsv2[2];
 106} __packed;
 107
 108struct sta_rec_amsdu {
 109        __le16 tag;
 110        __le16 len;
 111        u8 max_amsdu_num;
 112        u8 max_mpdu_size;
 113        u8 amsdu_en;
 114        u8 rsv;
 115} __packed;
 116
 117struct sta_rec_state {
 118        __le16 tag;
 119        __le16 len;
 120        __le32 flags;
 121        u8 state;
 122        u8 vht_opmode;
 123        u8 action;
 124        u8 rsv[1];
 125} __packed;
 126
 127#define HT_MCS_MASK_NUM 10
 128struct sta_rec_ra_info {
 129        __le16 tag;
 130        __le16 len;
 131        __le16 legacy;
 132        u8 rx_mcs_bitmask[HT_MCS_MASK_NUM];
 133} __packed;
 134
 135struct sta_rec_phy {
 136        __le16 tag;
 137        __le16 len;
 138        __le16 basic_rate;
 139        u8 phy_type;
 140        u8 ampdu;
 141        u8 rts_policy;
 142        u8 rcpi;
 143        u8 rsv[2];
 144} __packed;
 145
 146/* wtbl_rec */
 147
 148struct wtbl_req_hdr {
 149        u8 wlan_idx_lo;
 150        u8 operation;
 151        __le16 tlv_num;
 152        u8 wlan_idx_hi;
 153        u8 rsv[3];
 154} __packed;
 155
 156struct wtbl_generic {
 157        __le16 tag;
 158        __le16 len;
 159        u8 peer_addr[ETH_ALEN];
 160        u8 muar_idx;
 161        u8 skip_tx;
 162        u8 cf_ack;
 163        u8 qos;
 164        u8 mesh;
 165        u8 adm;
 166        __le16 partial_aid;
 167        u8 baf_en;
 168        u8 aad_om;
 169} __packed;
 170
 171struct wtbl_rx {
 172        __le16 tag;
 173        __le16 len;
 174        u8 rcid;
 175        u8 rca1;
 176        u8 rca2;
 177        u8 rv;
 178        u8 rsv[4];
 179} __packed;
 180
 181struct wtbl_ht {
 182        __le16 tag;
 183        __le16 len;
 184        u8 ht;
 185        u8 ldpc;
 186        u8 af;
 187        u8 mm;
 188        u8 rsv[4];
 189} __packed;
 190
 191struct wtbl_vht {
 192        __le16 tag;
 193        __le16 len;
 194        u8 ldpc;
 195        u8 dyn_bw;
 196        u8 vht;
 197        u8 txop_ps;
 198        u8 rsv[4];
 199} __packed;
 200
 201struct wtbl_tx_ps {
 202        __le16 tag;
 203        __le16 len;
 204        u8 txps;
 205        u8 rsv[3];
 206} __packed;
 207
 208struct wtbl_hdr_trans {
 209        __le16 tag;
 210        __le16 len;
 211        u8 to_ds;
 212        u8 from_ds;
 213        u8 no_rx_trans;
 214        u8 rsv;
 215} __packed;
 216
 217struct wtbl_ba {
 218        __le16 tag;
 219        __le16 len;
 220        /* common */
 221        u8 tid;
 222        u8 ba_type;
 223        u8 rsv0[2];
 224        /* originator only */
 225        __le16 sn;
 226        u8 ba_en;
 227        u8 ba_winsize_idx;
 228        __le16 ba_winsize;
 229        /* recipient only */
 230        u8 peer_addr[ETH_ALEN];
 231        u8 rst_ba_tid;
 232        u8 rst_ba_sel;
 233        u8 rst_ba_sb;
 234        u8 band_idx;
 235        u8 rsv1[4];
 236} __packed;
 237
 238struct wtbl_smps {
 239        __le16 tag;
 240        __le16 len;
 241        u8 smps;
 242        u8 rsv[3];
 243} __packed;
 244
 245/* mt7615 only */
 246
 247struct wtbl_bf {
 248        __le16 tag;
 249        __le16 len;
 250        u8 ibf;
 251        u8 ebf;
 252        u8 ibf_vht;
 253        u8 ebf_vht;
 254        u8 gid;
 255        u8 pfmu_idx;
 256        u8 rsv[2];
 257} __packed;
 258
 259struct wtbl_pn {
 260        __le16 tag;
 261        __le16 len;
 262        u8 pn[6];
 263        u8 rsv[2];
 264} __packed;
 265
 266struct wtbl_spe {
 267        __le16 tag;
 268        __le16 len;
 269        u8 spe_idx;
 270        u8 rsv[3];
 271} __packed;
 272
 273struct wtbl_raw {
 274        __le16 tag;
 275        __le16 len;
 276        u8 wtbl_idx;
 277        u8 dw;
 278        u8 rsv[2];
 279        __le32 msk;
 280        __le32 val;
 281} __packed;
 282
 283#define MT76_CONNAC_WTBL_UPDATE_MAX_SIZE (sizeof(struct wtbl_req_hdr) + \
 284                                          sizeof(struct wtbl_generic) + \
 285                                          sizeof(struct wtbl_rx) +      \
 286                                          sizeof(struct wtbl_ht) +      \
 287                                          sizeof(struct wtbl_vht) +     \
 288                                          sizeof(struct wtbl_tx_ps) +   \
 289                                          sizeof(struct wtbl_hdr_trans) +\
 290                                          sizeof(struct wtbl_ba) +      \
 291                                          sizeof(struct wtbl_bf) +      \
 292                                          sizeof(struct wtbl_smps) +    \
 293                                          sizeof(struct wtbl_pn) +      \
 294                                          sizeof(struct wtbl_spe))
 295
 296#define MT76_CONNAC_STA_UPDATE_MAX_SIZE (sizeof(struct sta_req_hdr) +   \
 297                                         sizeof(struct sta_rec_basic) + \
 298                                         sizeof(struct sta_rec_ht) +    \
 299                                         sizeof(struct sta_rec_he) +    \
 300                                         sizeof(struct sta_rec_ba) +    \
 301                                         sizeof(struct sta_rec_vht) +   \
 302                                         sizeof(struct sta_rec_uapsd) + \
 303                                         sizeof(struct sta_rec_amsdu) + \
 304                                         sizeof(struct tlv) +           \
 305                                         MT76_CONNAC_WTBL_UPDATE_MAX_SIZE)
 306
 307enum {
 308        STA_REC_BASIC,
 309        STA_REC_RA,
 310        STA_REC_RA_CMM_INFO,
 311        STA_REC_RA_UPDATE,
 312        STA_REC_BF,
 313        STA_REC_AMSDU,
 314        STA_REC_BA,
 315        STA_REC_STATE,
 316        STA_REC_TX_PROC,        /* for hdr trans and CSO in CR4 */
 317        STA_REC_HT,
 318        STA_REC_VHT,
 319        STA_REC_APPS,
 320        STA_REC_KEY,
 321        STA_REC_WTBL,
 322        STA_REC_HE,
 323        STA_REC_HW_AMSDU,
 324        STA_REC_WTBL_AADOM,
 325        STA_REC_KEY_V2,
 326        STA_REC_MURU,
 327        STA_REC_MUEDCA,
 328        STA_REC_BFEE,
 329        STA_REC_PHY = 0x15,
 330        STA_REC_MAX_NUM
 331};
 332
 333enum {
 334        WTBL_GENERIC,
 335        WTBL_RX,
 336        WTBL_HT,
 337        WTBL_VHT,
 338        WTBL_PEER_PS,           /* not used */
 339        WTBL_TX_PS,
 340        WTBL_HDR_TRANS,
 341        WTBL_SEC_KEY,
 342        WTBL_BA,
 343        WTBL_RDG,               /* obsoleted */
 344        WTBL_PROTECT,           /* not used */
 345        WTBL_CLEAR,             /* not used */
 346        WTBL_BF,
 347        WTBL_SMPS,
 348        WTBL_RAW_DATA,          /* debug only */
 349        WTBL_PN,
 350        WTBL_SPE,
 351        WTBL_MAX_NUM
 352};
 353
 354#define STA_TYPE_STA                    BIT(0)
 355#define STA_TYPE_AP                     BIT(1)
 356#define STA_TYPE_ADHOC                  BIT(2)
 357#define STA_TYPE_WDS                    BIT(4)
 358#define STA_TYPE_BC                     BIT(5)
 359
 360#define NETWORK_INFRA                   BIT(16)
 361#define NETWORK_P2P                     BIT(17)
 362#define NETWORK_IBSS                    BIT(18)
 363#define NETWORK_WDS                     BIT(21)
 364
 365#define SCAN_FUNC_RANDOM_MAC            BIT(0)
 366#define SCAN_FUNC_SPLIT_SCAN            BIT(5)
 367
 368#define CONNECTION_INFRA_STA            (STA_TYPE_STA | NETWORK_INFRA)
 369#define CONNECTION_INFRA_AP             (STA_TYPE_AP | NETWORK_INFRA)
 370#define CONNECTION_P2P_GC               (STA_TYPE_STA | NETWORK_P2P)
 371#define CONNECTION_P2P_GO               (STA_TYPE_AP | NETWORK_P2P)
 372#define CONNECTION_IBSS_ADHOC           (STA_TYPE_ADHOC | NETWORK_IBSS)
 373#define CONNECTION_WDS                  (STA_TYPE_WDS | NETWORK_WDS)
 374#define CONNECTION_INFRA_BC             (STA_TYPE_BC | NETWORK_INFRA)
 375
 376#define CONN_STATE_DISCONNECT           0
 377#define CONN_STATE_CONNECT              1
 378#define CONN_STATE_PORT_SECURE          2
 379
 380/* HE MAC */
 381#define STA_REC_HE_CAP_HTC                      BIT(0)
 382#define STA_REC_HE_CAP_BQR                      BIT(1)
 383#define STA_REC_HE_CAP_BSR                      BIT(2)
 384#define STA_REC_HE_CAP_OM                       BIT(3)
 385#define STA_REC_HE_CAP_AMSDU_IN_AMPDU           BIT(4)
 386/* HE PHY */
 387#define STA_REC_HE_CAP_DUAL_BAND                BIT(5)
 388#define STA_REC_HE_CAP_LDPC                     BIT(6)
 389#define STA_REC_HE_CAP_TRIG_CQI_FK              BIT(7)
 390#define STA_REC_HE_CAP_PARTIAL_BW_EXT_RANGE     BIT(8)
 391/* STBC */
 392#define STA_REC_HE_CAP_LE_EQ_80M_TX_STBC        BIT(9)
 393#define STA_REC_HE_CAP_LE_EQ_80M_RX_STBC        BIT(10)
 394#define STA_REC_HE_CAP_GT_80M_TX_STBC           BIT(11)
 395#define STA_REC_HE_CAP_GT_80M_RX_STBC           BIT(12)
 396/* GI */
 397#define STA_REC_HE_CAP_SU_PPDU_1LTF_8US_GI      BIT(13)
 398#define STA_REC_HE_CAP_SU_MU_PPDU_4LTF_8US_GI   BIT(14)
 399#define STA_REC_HE_CAP_ER_SU_PPDU_1LTF_8US_GI   BIT(15)
 400#define STA_REC_HE_CAP_ER_SU_PPDU_4LTF_8US_GI   BIT(16)
 401#define STA_REC_HE_CAP_NDP_4LTF_3DOT2MS_GI      BIT(17)
 402/* 242 TONE */
 403#define STA_REC_HE_CAP_BW20_RU242_SUPPORT       BIT(18)
 404#define STA_REC_HE_CAP_TX_1024QAM_UNDER_RU242   BIT(19)
 405#define STA_REC_HE_CAP_RX_1024QAM_UNDER_RU242   BIT(20)
 406
 407#define PHY_MODE_A                              BIT(0)
 408#define PHY_MODE_B                              BIT(1)
 409#define PHY_MODE_G                              BIT(2)
 410#define PHY_MODE_GN                             BIT(3)
 411#define PHY_MODE_AN                             BIT(4)
 412#define PHY_MODE_AC                             BIT(5)
 413#define PHY_MODE_AX_24G                         BIT(6)
 414#define PHY_MODE_AX_5G                          BIT(7)
 415#define PHY_MODE_AX_6G                          BIT(8)
 416
 417#define MODE_CCK                                BIT(0)
 418#define MODE_OFDM                               BIT(1)
 419#define MODE_HT                                 BIT(2)
 420#define MODE_VHT                                BIT(3)
 421#define MODE_HE                                 BIT(4)
 422
 423enum {
 424        PHY_TYPE_HR_DSSS_INDEX = 0,
 425        PHY_TYPE_ERP_INDEX,
 426        PHY_TYPE_ERP_P2P_INDEX,
 427        PHY_TYPE_OFDM_INDEX,
 428        PHY_TYPE_HT_INDEX,
 429        PHY_TYPE_VHT_INDEX,
 430        PHY_TYPE_HE_INDEX,
 431        PHY_TYPE_INDEX_NUM
 432};
 433
 434#define PHY_TYPE_BIT_HR_DSSS                    BIT(PHY_TYPE_HR_DSSS_INDEX)
 435#define PHY_TYPE_BIT_ERP                        BIT(PHY_TYPE_ERP_INDEX)
 436#define PHY_TYPE_BIT_OFDM                       BIT(PHY_TYPE_OFDM_INDEX)
 437#define PHY_TYPE_BIT_HT                         BIT(PHY_TYPE_HT_INDEX)
 438#define PHY_TYPE_BIT_VHT                        BIT(PHY_TYPE_VHT_INDEX)
 439#define PHY_TYPE_BIT_HE                         BIT(PHY_TYPE_HE_INDEX)
 440
 441#define MT_WTBL_RATE_TX_MODE                    GENMASK(9, 6)
 442#define MT_WTBL_RATE_MCS                        GENMASK(5, 0)
 443#define MT_WTBL_RATE_NSS                        GENMASK(12, 10)
 444#define MT_WTBL_RATE_HE_GI                      GENMASK(7, 4)
 445#define MT_WTBL_RATE_GI                         GENMASK(3, 0)
 446
 447#define MT_WTBL_W5_CHANGE_BW_RATE               GENMASK(7, 5)
 448#define MT_WTBL_W5_SHORT_GI_20                  BIT(8)
 449#define MT_WTBL_W5_SHORT_GI_40                  BIT(9)
 450#define MT_WTBL_W5_SHORT_GI_80                  BIT(10)
 451#define MT_WTBL_W5_SHORT_GI_160                 BIT(11)
 452#define MT_WTBL_W5_BW_CAP                       GENMASK(13, 12)
 453#define MT_WTBL_W5_MPDU_FAIL_COUNT              GENMASK(25, 23)
 454#define MT_WTBL_W5_MPDU_OK_COUNT                GENMASK(28, 26)
 455#define MT_WTBL_W5_RATE_IDX                     GENMASK(31, 29)
 456
 457enum {
 458        WTBL_RESET_AND_SET = 1,
 459        WTBL_SET,
 460        WTBL_QUERY,
 461        WTBL_RESET_ALL
 462};
 463
 464enum {
 465        MT_BA_TYPE_INVALID,
 466        MT_BA_TYPE_ORIGINATOR,
 467        MT_BA_TYPE_RECIPIENT
 468};
 469
 470enum {
 471        RST_BA_MAC_TID_MATCH,
 472        RST_BA_MAC_MATCH,
 473        RST_BA_NO_MATCH
 474};
 475
 476enum {
 477        DEV_INFO_ACTIVE,
 478        DEV_INFO_MAX_NUM
 479};
 480
 481#define MCU_CMD_ACK                             BIT(0)
 482#define MCU_CMD_UNI                             BIT(1)
 483#define MCU_CMD_QUERY                           BIT(2)
 484
 485#define MCU_CMD_UNI_EXT_ACK                     (MCU_CMD_ACK | MCU_CMD_UNI | \
 486                                                 MCU_CMD_QUERY)
 487
 488#define MCU_FW_PREFIX                           BIT(31)
 489#define MCU_UNI_PREFIX                          BIT(30)
 490#define MCU_CE_PREFIX                           BIT(29)
 491#define MCU_QUERY_PREFIX                        BIT(28)
 492#define MCU_CMD_MASK                            ~(MCU_FW_PREFIX | MCU_UNI_PREFIX |      \
 493                                                  MCU_CE_PREFIX | MCU_QUERY_PREFIX)
 494
 495#define MCU_QUERY_MASK                          BIT(16)
 496
 497enum {
 498        MCU_EXT_CMD_EFUSE_ACCESS = 0x01,
 499        MCU_EXT_CMD_RF_REG_ACCESS = 0x02,
 500        MCU_EXT_CMD_PM_STATE_CTRL = 0x07,
 501        MCU_EXT_CMD_CHANNEL_SWITCH = 0x08,
 502        MCU_EXT_CMD_SET_TX_POWER_CTRL = 0x11,
 503        MCU_EXT_CMD_FW_LOG_2_HOST = 0x13,
 504        MCU_EXT_CMD_EFUSE_BUFFER_MODE = 0x21,
 505        MCU_EXT_CMD_STA_REC_UPDATE = 0x25,
 506        MCU_EXT_CMD_BSS_INFO_UPDATE = 0x26,
 507        MCU_EXT_CMD_EDCA_UPDATE = 0x27,
 508        MCU_EXT_CMD_DEV_INFO_UPDATE = 0x2A,
 509        MCU_EXT_CMD_GET_TEMP = 0x2c,
 510        MCU_EXT_CMD_WTBL_UPDATE = 0x32,
 511        MCU_EXT_CMD_SET_RDD_CTRL = 0x3a,
 512        MCU_EXT_CMD_ATE_CTRL = 0x3d,
 513        MCU_EXT_CMD_PROTECT_CTRL = 0x3e,
 514        MCU_EXT_CMD_DBDC_CTRL = 0x45,
 515        MCU_EXT_CMD_MAC_INIT_CTRL = 0x46,
 516        MCU_EXT_CMD_RX_HDR_TRANS = 0x47,
 517        MCU_EXT_CMD_MUAR_UPDATE = 0x48,
 518        MCU_EXT_CMD_BCN_OFFLOAD = 0x49,
 519        MCU_EXT_CMD_SET_RX_PATH = 0x4e,
 520        MCU_EXT_CMD_TX_POWER_FEATURE_CTRL = 0x58,
 521        MCU_EXT_CMD_RXDCOC_CAL = 0x59,
 522        MCU_EXT_CMD_TXDPD_CAL = 0x60,
 523        MCU_EXT_CMD_SET_RDD_TH = 0x7c,
 524        MCU_EXT_CMD_SET_RDD_PATTERN = 0x7d,
 525};
 526
 527enum {
 528        MCU_UNI_CMD_DEV_INFO_UPDATE = MCU_UNI_PREFIX | 0x01,
 529        MCU_UNI_CMD_BSS_INFO_UPDATE = MCU_UNI_PREFIX | 0x02,
 530        MCU_UNI_CMD_STA_REC_UPDATE = MCU_UNI_PREFIX | 0x03,
 531        MCU_UNI_CMD_SUSPEND = MCU_UNI_PREFIX | 0x05,
 532        MCU_UNI_CMD_OFFLOAD = MCU_UNI_PREFIX | 0x06,
 533        MCU_UNI_CMD_HIF_CTRL = MCU_UNI_PREFIX | 0x07,
 534};
 535
 536enum {
 537        MCU_CMD_TARGET_ADDRESS_LEN_REQ = MCU_FW_PREFIX | 0x01,
 538        MCU_CMD_FW_START_REQ = MCU_FW_PREFIX | 0x02,
 539        MCU_CMD_INIT_ACCESS_REG = 0x3,
 540        MCU_CMD_NIC_POWER_CTRL = MCU_FW_PREFIX | 0x4,
 541        MCU_CMD_PATCH_START_REQ = MCU_FW_PREFIX | 0x05,
 542        MCU_CMD_PATCH_FINISH_REQ = MCU_FW_PREFIX | 0x07,
 543        MCU_CMD_PATCH_SEM_CONTROL = MCU_FW_PREFIX | 0x10,
 544        MCU_CMD_EXT_CID = 0xed,
 545        MCU_CMD_FW_SCATTER = MCU_FW_PREFIX | 0xee,
 546        MCU_CMD_RESTART_DL_REQ = MCU_FW_PREFIX | 0xef,
 547};
 548
 549/* offload mcu commands */
 550enum {
 551        MCU_CMD_START_HW_SCAN = MCU_CE_PREFIX | 0x03,
 552        MCU_CMD_SET_PS_PROFILE = MCU_CE_PREFIX | 0x05,
 553        MCU_CMD_SET_CHAN_DOMAIN = MCU_CE_PREFIX | 0x0f,
 554        MCU_CMD_SET_BSS_CONNECTED = MCU_CE_PREFIX | 0x16,
 555        MCU_CMD_SET_BSS_ABORT = MCU_CE_PREFIX | 0x17,
 556        MCU_CMD_CANCEL_HW_SCAN = MCU_CE_PREFIX | 0x1b,
 557        MCU_CMD_SET_ROC = MCU_CE_PREFIX | 0x1d,
 558        MCU_CMD_SET_P2P_OPPPS = MCU_CE_PREFIX | 0x33,
 559        MCU_CMD_SET_RATE_TX_POWER = MCU_CE_PREFIX | 0x5d,
 560        MCU_CMD_SCHED_SCAN_ENABLE = MCU_CE_PREFIX | 0x61,
 561        MCU_CMD_SCHED_SCAN_REQ = MCU_CE_PREFIX | 0x62,
 562        MCU_CMD_GET_NIC_CAPAB = MCU_CE_PREFIX | 0x8a,
 563        MCU_CMD_REG_WRITE = MCU_CE_PREFIX | 0xc0,
 564        MCU_CMD_REG_READ = MCU_CE_PREFIX | MCU_QUERY_MASK | 0xc0,
 565        MCU_CMD_CHIP_CONFIG = MCU_CE_PREFIX | 0xca,
 566        MCU_CMD_FWLOG_2_HOST = MCU_CE_PREFIX | 0xc5,
 567        MCU_CMD_GET_WTBL = MCU_CE_PREFIX | 0xcd,
 568        MCU_CMD_GET_TXPWR = MCU_CE_PREFIX | 0xd0,
 569};
 570
 571enum {
 572        PATCH_SEM_RELEASE,
 573        PATCH_SEM_GET
 574};
 575
 576enum {
 577        UNI_BSS_INFO_BASIC = 0,
 578        UNI_BSS_INFO_RLM = 2,
 579        UNI_BSS_INFO_BSS_COLOR = 4,
 580        UNI_BSS_INFO_HE_BASIC = 5,
 581        UNI_BSS_INFO_BCN_CONTENT = 7,
 582        UNI_BSS_INFO_QBSS = 15,
 583        UNI_BSS_INFO_UAPSD = 19,
 584        UNI_BSS_INFO_PS = 21,
 585        UNI_BSS_INFO_BCNFT = 22,
 586};
 587
 588enum {
 589        UNI_OFFLOAD_OFFLOAD_ARP,
 590        UNI_OFFLOAD_OFFLOAD_ND,
 591        UNI_OFFLOAD_OFFLOAD_GTK_REKEY,
 592        UNI_OFFLOAD_OFFLOAD_BMC_RPY_DETECT,
 593};
 594
 595enum {
 596        MT_NIC_CAP_TX_RESOURCE,
 597        MT_NIC_CAP_TX_EFUSE_ADDR,
 598        MT_NIC_CAP_COEX,
 599        MT_NIC_CAP_SINGLE_SKU,
 600        MT_NIC_CAP_CSUM_OFFLOAD,
 601        MT_NIC_CAP_HW_VER,
 602        MT_NIC_CAP_SW_VER,
 603        MT_NIC_CAP_MAC_ADDR,
 604        MT_NIC_CAP_PHY,
 605        MT_NIC_CAP_MAC,
 606        MT_NIC_CAP_FRAME_BUF,
 607        MT_NIC_CAP_BEAM_FORM,
 608        MT_NIC_CAP_LOCATION,
 609        MT_NIC_CAP_MUMIMO,
 610        MT_NIC_CAP_BUFFER_MODE_INFO,
 611        MT_NIC_CAP_HW_ADIE_VERSION = 0x14,
 612        MT_NIC_CAP_ANTSWP = 0x16,
 613        MT_NIC_CAP_WFDMA_REALLOC,
 614        MT_NIC_CAP_6G,
 615};
 616
 617#define UNI_WOW_DETECT_TYPE_MAGIC               BIT(0)
 618#define UNI_WOW_DETECT_TYPE_ANY                 BIT(1)
 619#define UNI_WOW_DETECT_TYPE_DISCONNECT          BIT(2)
 620#define UNI_WOW_DETECT_TYPE_GTK_REKEY_FAIL      BIT(3)
 621#define UNI_WOW_DETECT_TYPE_BCN_LOST            BIT(4)
 622#define UNI_WOW_DETECT_TYPE_SCH_SCAN_HIT        BIT(5)
 623#define UNI_WOW_DETECT_TYPE_BITMAP              BIT(6)
 624
 625enum {
 626        UNI_SUSPEND_MODE_SETTING,
 627        UNI_SUSPEND_WOW_CTRL,
 628        UNI_SUSPEND_WOW_GPIO_PARAM,
 629        UNI_SUSPEND_WOW_WAKEUP_PORT,
 630        UNI_SUSPEND_WOW_PATTERN,
 631};
 632
 633enum {
 634        WOW_USB = 1,
 635        WOW_PCIE = 2,
 636        WOW_GPIO = 3,
 637};
 638
 639struct mt76_connac_bss_basic_tlv {
 640        __le16 tag;
 641        __le16 len;
 642        u8 active;
 643        u8 omac_idx;
 644        u8 hw_bss_idx;
 645        u8 band_idx;
 646        __le32 conn_type;
 647        u8 conn_state;
 648        u8 wmm_idx;
 649        u8 bssid[ETH_ALEN];
 650        __le16 bmc_tx_wlan_idx;
 651        __le16 bcn_interval;
 652        u8 dtim_period;
 653        u8 phymode; /* bit(0): A
 654                     * bit(1): B
 655                     * bit(2): G
 656                     * bit(3): GN
 657                     * bit(4): AN
 658                     * bit(5): AC
 659                     */
 660        __le16 sta_idx;
 661        u8 nonht_basic_phy;
 662        u8 pad[3];
 663} __packed;
 664
 665struct mt76_connac_bss_qos_tlv {
 666        __le16 tag;
 667        __le16 len;
 668        u8 qos;
 669        u8 pad[3];
 670} __packed;
 671
 672struct mt76_connac_beacon_loss_event {
 673        u8 bss_idx;
 674        u8 reason;
 675        u8 pad[2];
 676} __packed;
 677
 678struct mt76_connac_mcu_bss_event {
 679        u8 bss_idx;
 680        u8 is_absent;
 681        u8 free_quota;
 682        u8 pad;
 683} __packed;
 684
 685struct mt76_connac_mcu_scan_ssid {
 686        __le32 ssid_len;
 687        u8 ssid[IEEE80211_MAX_SSID_LEN];
 688} __packed;
 689
 690struct mt76_connac_mcu_scan_channel {
 691        u8 band; /* 1: 2.4GHz
 692                  * 2: 5.0GHz
 693                  * Others: Reserved
 694                  */
 695        u8 channel_num;
 696} __packed;
 697
 698struct mt76_connac_mcu_scan_match {
 699        __le32 rssi_th;
 700        u8 ssid[IEEE80211_MAX_SSID_LEN];
 701        u8 ssid_len;
 702        u8 rsv[3];
 703} __packed;
 704
 705struct mt76_connac_hw_scan_req {
 706        u8 seq_num;
 707        u8 bss_idx;
 708        u8 scan_type; /* 0: PASSIVE SCAN
 709                       * 1: ACTIVE SCAN
 710                       */
 711        u8 ssid_type; /* BIT(0) wildcard SSID
 712                       * BIT(1) P2P wildcard SSID
 713                       * BIT(2) specified SSID + wildcard SSID
 714                       * BIT(2) + ssid_type_ext BIT(0) specified SSID only
 715                       */
 716        u8 ssids_num;
 717        u8 probe_req_num; /* Number of probe request for each SSID */
 718        u8 scan_func; /* BIT(0) Enable random MAC scan
 719                       * BIT(1) Disable DBDC scan type 1~3.
 720                       * BIT(2) Use DBDC scan type 3 (dedicated one RF to scan).
 721                       */
 722        u8 version; /* 0: Not support fields after ies.
 723                     * 1: Support fields after ies.
 724                     */
 725        struct mt76_connac_mcu_scan_ssid ssids[4];
 726        __le16 probe_delay_time;
 727        __le16 channel_dwell_time; /* channel Dwell interval */
 728        __le16 timeout_value;
 729        u8 channel_type; /* 0: Full channels
 730                          * 1: Only 2.4GHz channels
 731                          * 2: Only 5GHz channels
 732                          * 3: P2P social channel only (channel #1, #6 and #11)
 733                          * 4: Specified channels
 734                          * Others: Reserved
 735                          */
 736        u8 channels_num; /* valid when channel_type is 4 */
 737        /* valid when channels_num is set */
 738        struct mt76_connac_mcu_scan_channel channels[32];
 739        __le16 ies_len;
 740        u8 ies[MT76_CONNAC_SCAN_IE_LEN];
 741        /* following fields are valid if version > 0 */
 742        u8 ext_channels_num;
 743        u8 ext_ssids_num;
 744        __le16 channel_min_dwell_time;
 745        struct mt76_connac_mcu_scan_channel ext_channels[32];
 746        struct mt76_connac_mcu_scan_ssid ext_ssids[6];
 747        u8 bssid[ETH_ALEN];
 748        u8 random_mac[ETH_ALEN]; /* valid when BIT(1) in scan_func is set. */
 749        u8 pad[63];
 750        u8 ssid_type_ext;
 751} __packed;
 752
 753#define MT76_CONNAC_SCAN_DONE_EVENT_MAX_CHANNEL_NUM             64
 754
 755struct mt76_connac_hw_scan_done {
 756        u8 seq_num;
 757        u8 sparse_channel_num;
 758        struct mt76_connac_mcu_scan_channel sparse_channel;
 759        u8 complete_channel_num;
 760        u8 current_state;
 761        u8 version;
 762        u8 pad;
 763        __le32 beacon_scan_num;
 764        u8 pno_enabled;
 765        u8 pad2[3];
 766        u8 sparse_channel_valid_num;
 767        u8 pad3[3];
 768        u8 channel_num[MT76_CONNAC_SCAN_DONE_EVENT_MAX_CHANNEL_NUM];
 769        /* idle format for channel_idle_time
 770         * 0: first bytes: idle time(ms) 2nd byte: dwell time(ms)
 771         * 1: first bytes: idle time(8ms) 2nd byte: dwell time(8ms)
 772         * 2: dwell time (16us)
 773         */
 774        __le16 channel_idle_time[MT76_CONNAC_SCAN_DONE_EVENT_MAX_CHANNEL_NUM];
 775        /* beacon and probe response count */
 776        u8 beacon_probe_num[MT76_CONNAC_SCAN_DONE_EVENT_MAX_CHANNEL_NUM];
 777        u8 mdrdy_count[MT76_CONNAC_SCAN_DONE_EVENT_MAX_CHANNEL_NUM];
 778        __le32 beacon_2g_num;
 779        __le32 beacon_5g_num;
 780} __packed;
 781
 782struct mt76_connac_sched_scan_req {
 783        u8 version;
 784        u8 seq_num;
 785        u8 stop_on_match;
 786        u8 ssids_num;
 787        u8 match_num;
 788        u8 pad;
 789        __le16 ie_len;
 790        struct mt76_connac_mcu_scan_ssid ssids[MT76_CONNAC_MAX_SCHED_SCAN_SSID];
 791        struct mt76_connac_mcu_scan_match match[MT76_CONNAC_MAX_SCAN_MATCH];
 792        u8 channel_type;
 793        u8 channels_num;
 794        u8 intervals_num;
 795        u8 scan_func; /* MT7663: BIT(0) eable random mac address */
 796        struct mt76_connac_mcu_scan_channel channels[64];
 797        __le16 intervals[MT76_CONNAC_MAX_NUM_SCHED_SCAN_INTERVAL];
 798        union {
 799                struct {
 800                        u8 random_mac[ETH_ALEN];
 801                        u8 pad2[58];
 802                } mt7663;
 803                struct {
 804                        u8 bss_idx;
 805                        u8 pad2[19];
 806                        u8 random_mac[ETH_ALEN];
 807                        u8 pad3[38];
 808                } mt7921;
 809        };
 810} __packed;
 811
 812struct mt76_connac_sched_scan_done {
 813        u8 seq_num;
 814        u8 status; /* 0: ssid found */
 815        __le16 pad;
 816} __packed;
 817
 818struct bss_info_uni_bss_color {
 819        __le16 tag;
 820        __le16 len;
 821        u8 enable;
 822        u8 bss_color;
 823        u8 rsv[2];
 824} __packed;
 825
 826struct bss_info_uni_he {
 827        __le16 tag;
 828        __le16 len;
 829        __le16 he_rts_thres;
 830        u8 he_pe_duration;
 831        u8 su_disable;
 832        __le16 max_nss_mcs[CMD_HE_MCS_BW_NUM];
 833        u8 rsv[2];
 834} __packed;
 835
 836struct mt76_connac_gtk_rekey_tlv {
 837        __le16 tag;
 838        __le16 len;
 839        u8 kek[NL80211_KEK_LEN];
 840        u8 kck[NL80211_KCK_LEN];
 841        u8 replay_ctr[NL80211_REPLAY_CTR_LEN];
 842        u8 rekey_mode; /* 0: rekey offload enable
 843                        * 1: rekey offload disable
 844                        * 2: rekey update
 845                        */
 846        u8 keyid;
 847        u8 pad[2];
 848        __le32 proto; /* WPA-RSN-WAPI-OPSN */
 849        __le32 pairwise_cipher;
 850        __le32 group_cipher;
 851        __le32 key_mgmt; /* NONE-PSK-IEEE802.1X */
 852        __le32 mgmt_group_cipher;
 853        u8 option; /* 1: rekey data update without enabling offload */
 854        u8 reserverd[3];
 855} __packed;
 856
 857#define MT76_CONNAC_WOW_MASK_MAX_LEN                    16
 858#define MT76_CONNAC_WOW_PATTEN_MAX_LEN                  128
 859
 860struct mt76_connac_wow_pattern_tlv {
 861        __le16 tag;
 862        __le16 len;
 863        u8 index; /* pattern index */
 864        u8 enable; /* 0: disable
 865                    * 1: enable
 866                    */
 867        u8 data_len; /* pattern length */
 868        u8 pad;
 869        u8 mask[MT76_CONNAC_WOW_MASK_MAX_LEN];
 870        u8 pattern[MT76_CONNAC_WOW_PATTEN_MAX_LEN];
 871        u8 rsv[4];
 872} __packed;
 873
 874struct mt76_connac_wow_ctrl_tlv {
 875        __le16 tag;
 876        __le16 len;
 877        u8 cmd; /* 0x1: PM_WOWLAN_REQ_START
 878                 * 0x2: PM_WOWLAN_REQ_STOP
 879                 * 0x3: PM_WOWLAN_PARAM_CLEAR
 880                 */
 881        u8 trigger; /* 0: NONE
 882                     * BIT(0): NL80211_WOWLAN_TRIG_MAGIC_PKT
 883                     * BIT(1): NL80211_WOWLAN_TRIG_ANY
 884                     * BIT(2): NL80211_WOWLAN_TRIG_DISCONNECT
 885                     * BIT(3): NL80211_WOWLAN_TRIG_GTK_REKEY_FAILURE
 886                     * BIT(4): BEACON_LOST
 887                     * BIT(5): NL80211_WOWLAN_TRIG_NET_DETECT
 888                     */
 889        u8 wakeup_hif; /* 0x0: HIF_SDIO
 890                        * 0x1: HIF_USB
 891                        * 0x2: HIF_PCIE
 892                        * 0x3: HIF_GPIO
 893                        */
 894        u8 pad;
 895        u8 rsv[4];
 896} __packed;
 897
 898struct mt76_connac_wow_gpio_param_tlv {
 899        __le16 tag;
 900        __le16 len;
 901        u8 gpio_pin;
 902        u8 trigger_lvl;
 903        u8 pad[2];
 904        __le32 gpio_interval;
 905        u8 rsv[4];
 906} __packed;
 907
 908struct mt76_connac_arpns_tlv {
 909        __le16 tag;
 910        __le16 len;
 911        u8 mode;
 912        u8 ips_num;
 913        u8 option;
 914        u8 pad[1];
 915} __packed;
 916
 917struct mt76_connac_suspend_tlv {
 918        __le16 tag;
 919        __le16 len;
 920        u8 enable; /* 0: suspend mode disabled
 921                    * 1: suspend mode enabled
 922                    */
 923        u8 mdtim; /* LP parameter */
 924        u8 wow_suspend; /* 0: update by origin policy
 925                         * 1: update by wow dtim
 926                         */
 927        u8 pad[5];
 928} __packed;
 929
 930enum mt76_sta_info_state {
 931        MT76_STA_INFO_STATE_NONE,
 932        MT76_STA_INFO_STATE_AUTH,
 933        MT76_STA_INFO_STATE_ASSOC
 934};
 935
 936struct mt76_sta_cmd_info {
 937        struct ieee80211_sta *sta;
 938        struct mt76_wcid *wcid;
 939
 940        struct ieee80211_vif *vif;
 941
 942        bool offload_fw;
 943        bool enable;
 944        bool newly;
 945        int cmd;
 946        u8 rcpi;
 947        u8 state;
 948};
 949
 950#define MT_SKU_POWER_LIMIT      161
 951
 952struct mt76_connac_sku_tlv {
 953        u8 channel;
 954        s8 pwr_limit[MT_SKU_POWER_LIMIT];
 955} __packed;
 956
 957struct mt76_connac_tx_power_limit_tlv {
 958        /* DW0 - common info*/
 959        u8 ver;
 960        u8 pad0;
 961        __le16 len;
 962        /* DW1 - cmd hint */
 963        u8 n_chan; /* # channel */
 964        u8 band; /* 2.4GHz - 5GHz */
 965        u8 last_msg;
 966        u8 pad1;
 967        /* DW3 */
 968        u8 alpha2[4]; /* regulatory_request.alpha2 */
 969        u8 pad2[32];
 970} __packed;
 971
 972struct mt76_connac_config {
 973        __le16 id;
 974        u8 type;
 975        u8 resp_type;
 976        __le16 data_size;
 977        __le16 resv;
 978        u8 data[320];
 979} __packed;
 980
 981#define to_wcid_lo(id)          FIELD_GET(GENMASK(7, 0), (u16)id)
 982#define to_wcid_hi(id)          FIELD_GET(GENMASK(9, 8), (u16)id)
 983
 984static inline void
 985mt76_connac_mcu_get_wlan_idx(struct mt76_dev *dev, struct mt76_wcid *wcid,
 986                             u8 *wlan_idx_lo, u8 *wlan_idx_hi)
 987{
 988        *wlan_idx_hi = 0;
 989
 990        if (is_mt7921(dev)) {
 991                *wlan_idx_lo = wcid ? to_wcid_lo(wcid->idx) : 0;
 992                *wlan_idx_hi = wcid ? to_wcid_hi(wcid->idx) : 0;
 993        } else {
 994                *wlan_idx_lo = wcid ? wcid->idx : 0;
 995        }
 996}
 997
 998struct sk_buff *
 999mt76_connac_mcu_alloc_sta_req(struct mt76_dev *dev, struct mt76_vif *mvif,
1000                              struct mt76_wcid *wcid);
1001struct wtbl_req_hdr *
1002mt76_connac_mcu_alloc_wtbl_req(struct mt76_dev *dev, struct mt76_wcid *wcid,
1003                               int cmd, void *sta_wtbl, struct sk_buff **skb);
1004struct tlv *mt76_connac_mcu_add_nested_tlv(struct sk_buff *skb, int tag,
1005                                           int len, void *sta_ntlv,
1006                                           void *sta_wtbl);
1007static inline struct tlv *
1008mt76_connac_mcu_add_tlv(struct sk_buff *skb, int tag, int len)
1009{
1010        return mt76_connac_mcu_add_nested_tlv(skb, tag, len, skb->data, NULL);
1011}
1012
1013int mt76_connac_mcu_set_channel_domain(struct mt76_phy *phy);
1014int mt76_connac_mcu_set_vif_ps(struct mt76_dev *dev, struct ieee80211_vif *vif);
1015void mt76_connac_mcu_sta_basic_tlv(struct sk_buff *skb,
1016                                   struct ieee80211_vif *vif,
1017                                   struct ieee80211_sta *sta, bool enable,
1018                                   bool newly);
1019void mt76_connac_mcu_wtbl_generic_tlv(struct mt76_dev *dev, struct sk_buff *skb,
1020                                      struct ieee80211_vif *vif,
1021                                      struct ieee80211_sta *sta, void *sta_wtbl,
1022                                      void *wtbl_tlv);
1023void mt76_connac_mcu_wtbl_hdr_trans_tlv(struct sk_buff *skb,
1024                                        struct ieee80211_vif *vif,
1025                                        struct mt76_wcid *wcid,
1026                                        void *sta_wtbl, void *wtbl_tlv);
1027int mt76_connac_mcu_sta_update_hdr_trans(struct mt76_dev *dev,
1028                                         struct ieee80211_vif *vif,
1029                                         struct mt76_wcid *wcid, int cmd);
1030void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb,
1031                             struct ieee80211_sta *sta,
1032                             struct ieee80211_vif *vif,
1033                             u8 rcpi, u8 state);
1034void mt76_connac_mcu_wtbl_ht_tlv(struct mt76_dev *dev, struct sk_buff *skb,
1035                                 struct ieee80211_sta *sta, void *sta_wtbl,
1036                                 void *wtbl_tlv);
1037void mt76_connac_mcu_wtbl_ba_tlv(struct mt76_dev *dev, struct sk_buff *skb,
1038                                 struct ieee80211_ampdu_params *params,
1039                                 bool enable, bool tx, void *sta_wtbl,
1040                                 void *wtbl_tlv);
1041void mt76_connac_mcu_sta_ba_tlv(struct sk_buff *skb,
1042                                struct ieee80211_ampdu_params *params,
1043                                bool enable, bool tx);
1044int mt76_connac_mcu_uni_add_dev(struct mt76_phy *phy,
1045                                struct ieee80211_vif *vif,
1046                                struct mt76_wcid *wcid,
1047                                bool enable);
1048int mt76_connac_mcu_sta_ba(struct mt76_dev *dev, struct mt76_vif *mvif,
1049                           struct ieee80211_ampdu_params *params,
1050                           bool enable, bool tx);
1051int mt76_connac_mcu_uni_add_bss(struct mt76_phy *phy,
1052                                struct ieee80211_vif *vif,
1053                                struct mt76_wcid *wcid,
1054                                bool enable);
1055int mt76_connac_mcu_sta_cmd(struct mt76_phy *phy,
1056                            struct mt76_sta_cmd_info *info);
1057void mt76_connac_mcu_beacon_loss_iter(void *priv, u8 *mac,
1058                                      struct ieee80211_vif *vif);
1059int mt76_connac_mcu_set_rts_thresh(struct mt76_dev *dev, u32 val, u8 band);
1060int mt76_connac_mcu_set_mac_enable(struct mt76_dev *dev, int band, bool enable,
1061                                   bool hdr_trans);
1062int mt76_connac_mcu_init_download(struct mt76_dev *dev, u32 addr, u32 len,
1063                                  u32 mode);
1064int mt76_connac_mcu_start_patch(struct mt76_dev *dev);
1065int mt76_connac_mcu_patch_sem_ctrl(struct mt76_dev *dev, bool get);
1066int mt76_connac_mcu_start_firmware(struct mt76_dev *dev, u32 addr, u32 option);
1067int mt76_connac_mcu_get_nic_capability(struct mt76_phy *phy);
1068
1069int mt76_connac_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif,
1070                            struct ieee80211_scan_request *scan_req);
1071int mt76_connac_mcu_cancel_hw_scan(struct mt76_phy *phy,
1072                                   struct ieee80211_vif *vif);
1073int mt76_connac_mcu_sched_scan_req(struct mt76_phy *phy,
1074                                   struct ieee80211_vif *vif,
1075                                   struct cfg80211_sched_scan_request *sreq);
1076int mt76_connac_mcu_sched_scan_enable(struct mt76_phy *phy,
1077                                      struct ieee80211_vif *vif,
1078                                      bool enable);
1079int mt76_connac_mcu_update_arp_filter(struct mt76_dev *dev,
1080                                      struct mt76_vif *vif,
1081                                      struct ieee80211_bss_conf *info);
1082int mt76_connac_mcu_update_gtk_rekey(struct ieee80211_hw *hw,
1083                                     struct ieee80211_vif *vif,
1084                                     struct cfg80211_gtk_rekey_data *key);
1085int mt76_connac_mcu_set_hif_suspend(struct mt76_dev *dev, bool suspend);
1086void mt76_connac_mcu_set_suspend_iter(void *priv, u8 *mac,
1087                                      struct ieee80211_vif *vif);
1088int mt76_connac_sta_state_dp(struct mt76_dev *dev,
1089                             enum ieee80211_sta_state old_state,
1090                             enum ieee80211_sta_state new_state);
1091int mt76_connac_mcu_chip_config(struct mt76_dev *dev);
1092int mt76_connac_mcu_set_deep_sleep(struct mt76_dev *dev, bool enable);
1093void mt76_connac_mcu_coredump_event(struct mt76_dev *dev, struct sk_buff *skb,
1094                                    struct mt76_connac_coredump *coredump);
1095int mt76_connac_mcu_set_rate_txpower(struct mt76_phy *phy);
1096#endif /* __MT76_CONNAC_MCU_H */
1097