1 /* SPDX-License-Identifier: ISC */ 2 /* 3 * Copyright (C) 2022 MediaTek Inc. 4 */ 5 6 #ifndef __MT7996_MCU_H 7 #define __MT7996_MCU_H 8 9 #include "../mt76_connac_mcu.h" 10 11 struct mt7996_mcu_rxd { 12 __le32 rxd[8]; 13 14 __le16 len; 15 __le16 pkt_type_id; 16 17 u8 eid; 18 u8 seq; 19 u8 option; 20 u8 __rsv; 21 22 u8 ext_eid; 23 u8 __rsv1[2]; 24 u8 s2d_index; 25 }; 26 27 struct mt7996_mcu_uni_event { 28 u8 cid; 29 u8 __rsv[3]; 30 __le32 status; /* 0: success, others: fail */ 31 } __packed; 32 33 struct mt7996_mcu_csa_notify { 34 struct mt7996_mcu_rxd rxd; 35 36 u8 omac_idx; 37 u8 csa_count; 38 u8 band_idx; 39 u8 rsv; 40 } __packed; 41 42 struct mt7996_mcu_rdd_report { 43 struct mt7996_mcu_rxd rxd; 44 45 u8 __rsv1[4]; 46 47 __le16 tag; 48 __le16 len; 49 50 u8 band_idx; 51 u8 long_detected; 52 u8 constant_prf_detected; 53 u8 staggered_prf_detected; 54 u8 radar_type_idx; 55 u8 periodic_pulse_num; 56 u8 long_pulse_num; 57 u8 hw_pulse_num; 58 59 u8 out_lpn; 60 u8 out_spn; 61 u8 out_crpn; 62 u8 out_crpw; 63 u8 out_crbn; 64 u8 out_stgpn; 65 u8 out_stgpw; 66 67 u8 __rsv2; 68 69 __le32 out_pri_const; 70 __le32 out_pri_stg[3]; 71 __le32 out_pri_stg_dmin; 72 73 struct { 74 __le32 start; 75 __le16 pulse_width; 76 __le16 pulse_power; 77 u8 mdrdy_flag; 78 u8 rsv[3]; 79 } long_pulse[32]; 80 81 struct { 82 __le32 start; 83 __le16 pulse_width; 84 __le16 pulse_power; 85 u8 mdrdy_flag; 86 u8 rsv[3]; 87 } periodic_pulse[32]; 88 89 struct { 90 __le32 start; 91 __le16 pulse_width; 92 __le16 pulse_power; 93 u8 sc_pass; 94 u8 sw_reset; 95 u8 mdrdy_flag; 96 u8 tx_active; 97 } hw_pulse[32]; 98 } __packed; 99 100 struct mt7996_mcu_background_chain_ctrl { 101 u8 _rsv[4]; 102 103 __le16 tag; 104 __le16 len; 105 106 u8 chan; /* primary channel */ 107 u8 central_chan; /* central channel */ 108 u8 bw; 109 u8 tx_stream; 110 u8 rx_stream; 111 112 u8 monitor_chan; /* monitor channel */ 113 u8 monitor_central_chan;/* monitor central channel */ 114 u8 monitor_bw; 115 u8 monitor_tx_stream; 116 u8 monitor_rx_stream; 117 118 u8 scan_mode; /* 0: ScanStop 119 * 1: ScanStart 120 * 2: ScanRunning 121 */ 122 u8 band_idx; /* DBDC */ 123 u8 monitor_scan_type; 124 u8 band; /* 0: 2.4GHz, 1: 5GHz */ 125 u8 rsv[2]; 126 } __packed; 127 128 struct mt7996_mcu_eeprom { 129 u8 _rsv[4]; 130 131 __le16 tag; 132 __le16 len; 133 u8 buffer_mode; 134 u8 format; 135 __le16 buf_len; 136 } __packed; 137 138 struct mt7996_mcu_phy_rx_info { 139 u8 category; 140 u8 rate; 141 u8 mode; 142 u8 nsts; 143 u8 gi; 144 u8 coding; 145 u8 stbc; 146 u8 bw; 147 }; 148 149 struct mt7996_mcu_mib { 150 __le16 tag; 151 __le16 len; 152 __le32 offs; 153 __le64 data; 154 } __packed; 155 156 enum mt7996_chan_mib_offs { 157 UNI_MIB_OBSS_AIRTIME = 26, 158 UNI_MIB_NON_WIFI_TIME = 27, 159 UNI_MIB_TX_TIME = 28, 160 UNI_MIB_RX_TIME = 29 161 }; 162 163 struct edca { 164 __le16 tag; 165 __le16 len; 166 167 u8 queue; 168 u8 set; 169 u8 cw_min; 170 u8 cw_max; 171 __le16 txop; 172 u8 aifs; 173 u8 __rsv; 174 }; 175 176 #define MCU_PQ_ID(p, q) (((p) << 15) | ((q) << 10)) 177 #define MCU_PKT_ID 0xa0 178 179 enum { 180 MCU_FW_LOG_WM, 181 MCU_FW_LOG_WA, 182 MCU_FW_LOG_TO_HOST, 183 MCU_FW_LOG_RELAY = 16 184 }; 185 186 enum { 187 MCU_TWT_AGRT_ADD, 188 MCU_TWT_AGRT_MODIFY, 189 MCU_TWT_AGRT_DELETE, 190 MCU_TWT_AGRT_TEARDOWN, 191 MCU_TWT_AGRT_GET_TSF, 192 }; 193 194 enum { 195 MCU_WA_PARAM_CMD_QUERY, 196 MCU_WA_PARAM_CMD_SET, 197 MCU_WA_PARAM_CMD_CAPABILITY, 198 MCU_WA_PARAM_CMD_DEBUG, 199 }; 200 201 enum { 202 MCU_WA_PARAM_PDMA_RX = 0x04, 203 MCU_WA_PARAM_CPU_UTIL = 0x0b, 204 MCU_WA_PARAM_RED = 0x0e, 205 MCU_WA_PARAM_HW_PATH_HIF_VER = 0x2f, 206 }; 207 208 enum mcu_mmps_mode { 209 MCU_MMPS_STATIC, 210 MCU_MMPS_DYNAMIC, 211 MCU_MMPS_RSV, 212 MCU_MMPS_DISABLE, 213 }; 214 215 struct bss_rate_tlv { 216 __le16 tag; 217 __le16 len; 218 u8 __rsv1[4]; 219 __le16 bc_trans; 220 __le16 mc_trans; 221 u8 short_preamble; 222 u8 bc_fixed_rate; 223 u8 mc_fixed_rate; 224 u8 __rsv2[1]; 225 } __packed; 226 227 struct bss_ra_tlv { 228 __le16 tag; 229 __le16 len; 230 u8 short_preamble; 231 u8 force_sgi; 232 u8 force_gf; 233 u8 ht_mode; 234 u8 se_off; 235 u8 antenna_idx; 236 __le16 max_phyrate; 237 u8 force_tx_streams; 238 u8 __rsv[3]; 239 } __packed; 240 241 struct bss_rlm_tlv { 242 __le16 tag; 243 __le16 len; 244 u8 control_channel; 245 u8 center_chan; 246 u8 center_chan2; 247 u8 bw; 248 u8 tx_streams; 249 u8 rx_streams; 250 u8 ht_op_info; 251 u8 sco; 252 u8 band; 253 u8 __rsv[3]; 254 } __packed; 255 256 struct bss_color_tlv { 257 __le16 tag; 258 __le16 len; 259 u8 enable; 260 u8 color; 261 u8 rsv[2]; 262 } __packed; 263 264 struct bss_inband_discovery_tlv { 265 __le16 tag; 266 __le16 len; 267 u8 tx_type; 268 u8 tx_mode; 269 u8 tx_interval; 270 u8 enable; 271 __le16 wcid; 272 __le16 prob_rsp_len; 273 #define MAX_INBAND_FRAME_SIZE 512 274 u8 pkt[MAX_INBAND_FRAME_SIZE]; 275 } __packed; 276 277 struct bss_bcn_content_tlv { 278 __le16 tag; 279 __le16 len; 280 __le16 tim_ie_pos; 281 __le16 csa_ie_pos; 282 __le16 bcc_ie_pos; 283 u8 enable; 284 u8 type; 285 __le16 pkt_len; 286 #define MAX_BEACON_SIZE 512 287 u8 pkt[MAX_BEACON_SIZE]; 288 } __packed; 289 290 struct bss_bcn_cntdwn_tlv { 291 __le16 tag; 292 __le16 len; 293 u8 cnt; 294 u8 rsv[3]; 295 } __packed; 296 297 struct bss_bcn_mbss_tlv { 298 __le16 tag; 299 __le16 len; 300 __le32 bitmap; 301 #define MAX_BEACON_NUM 32 302 __le16 offset[MAX_BEACON_NUM]; 303 } __packed __aligned(4); 304 305 struct bss_txcmd_tlv { 306 __le16 tag; 307 __le16 len; 308 u8 txcmd_mode; 309 u8 __rsv[3]; 310 } __packed; 311 312 struct bss_sec_tlv { 313 __le16 tag; 314 __le16 len; 315 u8 __rsv1[2]; 316 u8 cipher; 317 u8 __rsv2[1]; 318 } __packed; 319 320 struct bss_ifs_time_tlv { 321 __le16 tag; 322 __le16 len; 323 u8 slot_valid; 324 u8 sifs_valid; 325 u8 rifs_valid; 326 u8 eifs_valid; 327 __le16 slot_time; 328 __le16 sifs_time; 329 __le16 rifs_time; 330 __le16 eifs_time; 331 u8 eifs_cck_valid; 332 u8 rsv; 333 __le16 eifs_cck_time; 334 } __packed; 335 336 struct bss_power_save { 337 __le16 tag; 338 __le16 len; 339 u8 profile; 340 u8 _rsv[3]; 341 } __packed; 342 343 struct bss_mld_tlv { 344 __le16 tag; 345 __le16 len; 346 u8 group_mld_id; 347 u8 own_mld_id; 348 u8 mac_addr[ETH_ALEN]; 349 u8 remap_idx; 350 u8 __rsv[3]; 351 } __packed; 352 353 struct sta_rec_ba_uni { 354 __le16 tag; 355 __le16 len; 356 u8 tid; 357 u8 ba_type; 358 u8 amsdu; 359 u8 ba_en; 360 __le16 ssn; 361 __le16 winsize; 362 u8 ba_rdd_rro; 363 u8 __rsv[3]; 364 } __packed; 365 366 struct sta_rec_eht { 367 __le16 tag; 368 __le16 len; 369 u8 tid_bitmap; 370 u8 _rsv; 371 __le16 mac_cap; 372 __le64 phy_cap; 373 __le64 phy_cap_ext; 374 u8 mcs_map_bw20[4]; 375 u8 mcs_map_bw80[3]; 376 u8 mcs_map_bw160[3]; 377 u8 mcs_map_bw320[3]; 378 u8 _rsv2[3]; 379 } __packed; 380 381 struct sec_key_uni { 382 __le16 wlan_idx; 383 u8 mgmt_prot; 384 u8 cipher_id; 385 u8 cipher_len; 386 u8 key_id; 387 u8 key_len; 388 u8 need_resp; 389 u8 key[32]; 390 } __packed; 391 392 struct sta_rec_sec_uni { 393 __le16 tag; 394 __le16 len; 395 u8 add; 396 u8 n_cipher; 397 u8 rsv[2]; 398 399 struct sec_key_uni key[2]; 400 } __packed; 401 402 struct sta_rec_hdrt { 403 __le16 tag; 404 __le16 len; 405 u8 hdrt_mode; 406 u8 rsv[3]; 407 } __packed; 408 409 struct sta_rec_hdr_trans { 410 __le16 tag; 411 __le16 len; 412 u8 from_ds; 413 u8 to_ds; 414 u8 dis_rx_hdr_tran; 415 u8 mesh; 416 } __packed; 417 418 struct hdr_trans_en { 419 __le16 tag; 420 __le16 len; 421 u8 enable; 422 u8 check_bssid; 423 u8 mode; 424 u8 __rsv; 425 } __packed; 426 427 struct hdr_trans_vlan { 428 __le16 tag; 429 __le16 len; 430 u8 insert_vlan; 431 u8 remove_vlan; 432 u8 tid; 433 u8 __rsv; 434 } __packed; 435 436 struct hdr_trans_blacklist { 437 __le16 tag; 438 __le16 len; 439 u8 idx; 440 u8 enable; 441 __le16 type; 442 } __packed; 443 444 struct uni_header { 445 u8 __rsv[4]; 446 } __packed; 447 448 struct vow_rx_airtime { 449 __le16 tag; 450 __le16 len; 451 452 u8 enable; 453 u8 band; 454 u8 __rsv[2]; 455 } __packed; 456 457 struct bf_sounding_on { 458 __le16 tag; 459 __le16 len; 460 461 u8 snd_mode; 462 u8 sta_num; 463 u8 __rsv[2]; 464 __le16 wlan_id[4]; 465 __le32 snd_period; 466 } __packed; 467 468 struct bf_hw_en_status_update { 469 __le16 tag; 470 __le16 len; 471 472 bool ebf; 473 bool ibf; 474 u8 __rsv[2]; 475 } __packed; 476 477 struct bf_mod_en_ctrl { 478 __le16 tag; 479 __le16 len; 480 481 u8 bf_num; 482 u8 bf_bitmap; 483 u8 bf_sel[8]; 484 u8 __rsv[2]; 485 } __packed; 486 487 union bf_tag_tlv { 488 struct bf_sounding_on bf_snd; 489 struct bf_hw_en_status_update bf_hw_en; 490 struct bf_mod_en_ctrl bf_mod_en; 491 }; 492 493 struct ra_rate { 494 __le16 wlan_idx; 495 u8 mode; 496 u8 stbc; 497 __le16 gi; 498 u8 bw; 499 u8 ldpc; 500 u8 mcs; 501 u8 nss; 502 __le16 ltf; 503 u8 spe; 504 u8 preamble; 505 u8 __rsv[2]; 506 } __packed; 507 508 struct ra_fixed_rate { 509 __le16 tag; 510 __le16 len; 511 512 __le16 version; 513 struct ra_rate rate; 514 } __packed; 515 516 enum { 517 UNI_RA_FIXED_RATE = 0xf, 518 }; 519 520 #define MT7996_HDR_TRANS_MAX_SIZE (sizeof(struct hdr_trans_en) + \ 521 sizeof(struct hdr_trans_vlan) + \ 522 sizeof(struct hdr_trans_blacklist)) 523 524 enum { 525 UNI_HDR_TRANS_EN, 526 UNI_HDR_TRANS_VLAN, 527 UNI_HDR_TRANS_BLACKLIST, 528 }; 529 530 enum { 531 RATE_PARAM_FIXED = 3, 532 RATE_PARAM_MMPS_UPDATE = 5, 533 RATE_PARAM_FIXED_HE_LTF = 7, 534 RATE_PARAM_FIXED_MCS, 535 RATE_PARAM_FIXED_GI = 11, 536 RATE_PARAM_AUTO = 20, 537 }; 538 539 enum { 540 BF_SOUNDING_ON = 1, 541 BF_HW_EN_UPDATE = 17, 542 BF_MOD_EN_CTRL = 20, 543 }; 544 545 enum { 546 CMD_BAND_NONE, 547 CMD_BAND_24G, 548 CMD_BAND_5G, 549 CMD_BAND_6G, 550 }; 551 552 struct bss_req_hdr { 553 u8 bss_idx; 554 u8 __rsv[3]; 555 } __packed; 556 557 enum { 558 UNI_CHANNEL_SWITCH, 559 UNI_CHANNEL_RX_PATH, 560 }; 561 562 #define MT7996_BSS_UPDATE_MAX_SIZE (sizeof(struct bss_req_hdr) + \ 563 sizeof(struct mt76_connac_bss_basic_tlv) + \ 564 sizeof(struct bss_rlm_tlv) + \ 565 sizeof(struct bss_ra_tlv) + \ 566 sizeof(struct bss_info_uni_he) + \ 567 sizeof(struct bss_rate_tlv) + \ 568 sizeof(struct bss_txcmd_tlv) + \ 569 sizeof(struct bss_power_save) + \ 570 sizeof(struct bss_sec_tlv) + \ 571 sizeof(struct bss_ifs_time_tlv) + \ 572 sizeof(struct bss_mld_tlv)) 573 574 #define MT7996_STA_UPDATE_MAX_SIZE (sizeof(struct sta_req_hdr) + \ 575 sizeof(struct sta_rec_basic) + \ 576 sizeof(struct sta_rec_bf) + \ 577 sizeof(struct sta_rec_ht) + \ 578 sizeof(struct sta_rec_he_v2) + \ 579 sizeof(struct sta_rec_ba_uni) + \ 580 sizeof(struct sta_rec_vht) + \ 581 sizeof(struct sta_rec_uapsd) + \ 582 sizeof(struct sta_rec_amsdu) + \ 583 sizeof(struct sta_rec_bfee) + \ 584 sizeof(struct sta_rec_phy) + \ 585 sizeof(struct sta_rec_ra) + \ 586 sizeof(struct sta_rec_sec) + \ 587 sizeof(struct sta_rec_ra_fixed) + \ 588 sizeof(struct sta_rec_he_6g_capa) + \ 589 sizeof(struct sta_rec_eht) + \ 590 sizeof(struct sta_rec_hdrt) + \ 591 sizeof(struct sta_rec_hdr_trans) + \ 592 sizeof(struct tlv)) 593 594 #define MT7996_BEACON_UPDATE_SIZE (sizeof(struct bss_req_hdr) + \ 595 sizeof(struct bss_bcn_content_tlv) + \ 596 sizeof(struct bss_bcn_cntdwn_tlv) + \ 597 sizeof(struct bss_bcn_mbss_tlv)) 598 599 #define MT7996_INBAND_FRAME_SIZE (sizeof(struct bss_req_hdr) + \ 600 sizeof(struct bss_inband_discovery_tlv)) 601 602 enum { 603 UNI_BAND_CONFIG_RADIO_ENABLE, 604 UNI_BAND_CONFIG_RTS_THRESHOLD = 0x08, 605 }; 606 607 enum { 608 UNI_WSYS_CONFIG_FW_LOG_CTRL, 609 UNI_WSYS_CONFIG_FW_DBG_CTRL, 610 }; 611 612 enum { 613 UNI_RDD_CTRL_PARM, 614 UNI_RDD_CTRL_SET_TH = 0x3, 615 }; 616 617 enum { 618 UNI_EFUSE_ACCESS = 1, 619 UNI_EFUSE_BUFFER_MODE, 620 UNI_EFUSE_FREE_BLOCK, 621 UNI_EFUSE_BUFFER_RD, 622 }; 623 624 enum { 625 UNI_VOW_DRR_CTRL, 626 UNI_VOW_RX_AT_AIRTIME_EN = 0x0b, 627 UNI_VOW_RX_AT_AIRTIME_CLR_EN = 0x0e, 628 }; 629 630 enum { 631 UNI_CMD_MIB_DATA, 632 }; 633 634 enum { 635 UNI_POWER_OFF, 636 }; 637 638 enum { 639 UNI_CMD_TWT_ARGT_UPDATE = 0x0, 640 UNI_CMD_TWT_MGMT_OFFLOAD, 641 }; 642 643 enum { 644 UNI_RRO_DEL_ENTRY = 0x1, 645 UNI_RRO_SET_PLATFORM_TYPE, 646 UNI_RRO_GET_BA_SESSION_TABLE, 647 UNI_RRO_SET_BYPASS_MODE, 648 UNI_RRO_SET_TXFREE_PATH, 649 }; 650 651 enum{ 652 UNI_CMD_SR_ENABLE = 0x1, 653 UNI_CMD_SR_ENABLE_SD, 654 UNI_CMD_SR_ENABLE_MODE, 655 UNI_CMD_SR_ENABLE_DPD = 0x12, 656 UNI_CMD_SR_ENABLE_TX, 657 UNI_CMD_SR_SET_SRG_BITMAP = 0x80, 658 UNI_CMD_SR_SET_PARAM = 0xc1, 659 UNI_CMD_SR_SET_SIGA = 0xd0, 660 }; 661 662 enum { 663 UNI_CMD_ACCESS_REG_BASIC = 0x0, 664 UNI_CMD_ACCESS_RF_REG_BASIC, 665 }; 666 667 enum { 668 UNI_CMD_SER_QUERY, 669 /* recovery */ 670 UNI_CMD_SER_SET_RECOVER_L1, 671 UNI_CMD_SER_SET_RECOVER_L2, 672 UNI_CMD_SER_SET_RECOVER_L3_RX_ABORT, 673 UNI_CMD_SER_SET_RECOVER_L3_TX_ABORT, 674 UNI_CMD_SER_SET_RECOVER_L3_TX_DISABLE, 675 UNI_CMD_SER_SET_RECOVER_L3_BF, 676 UNI_CMD_SER_SET_RECOVER_L4_MDP, 677 UNI_CMD_SER_SET_RECOVER_FULL, 678 UNI_CMD_SER_SET_SYSTEM_ASSERT, 679 /* action */ 680 UNI_CMD_SER_ENABLE = 1, 681 UNI_CMD_SER_SET, 682 UNI_CMD_SER_TRIGGER 683 }; 684 685 enum { 686 MT7996_SEC_MODE_PLAIN, 687 MT7996_SEC_MODE_AES, 688 MT7996_SEC_MODE_SCRAMBLE, 689 MT7996_SEC_MODE_MAX, 690 }; 691 692 #define MT7996_PATCH_SEC GENMASK(31, 24) 693 #define MT7996_PATCH_SCRAMBLE_KEY GENMASK(15, 8) 694 #define MT7996_PATCH_AES_KEY GENMASK(7, 0) 695 696 #define MT7996_SEC_ENCRYPT BIT(0) 697 #define MT7996_SEC_KEY_IDX GENMASK(2, 1) 698 #define MT7996_SEC_IV BIT(3) 699 700 #endif 701