1 /* SPDX-License-Identifier: ISC */ 2 /* Copyright (C) 2023 MediaTek Inc. */ 3 4 #ifndef __MT7925_MCU_H 5 #define __MT7925_MCU_H 6 7 #include "../mt76_connac_mcu.h" 8 9 /* ext event table */ 10 enum { 11 MCU_EXT_EVENT_RATE_REPORT = 0x87, 12 }; 13 14 struct mt7925_mcu_eeprom_info { 15 __le32 addr; 16 __le32 valid; 17 u8 data[MT7925_EEPROM_BLOCK_SIZE]; 18 } __packed; 19 20 #define MT_RA_RATE_NSS GENMASK(8, 6) 21 #define MT_RA_RATE_MCS GENMASK(3, 0) 22 #define MT_RA_RATE_TX_MODE GENMASK(12, 9) 23 #define MT_RA_RATE_DCM_EN BIT(4) 24 #define MT_RA_RATE_BW GENMASK(14, 13) 25 26 struct mt7925_mcu_rxd { 27 __le32 rxd[8]; 28 29 __le16 len; 30 __le16 pkt_type_id; 31 32 u8 eid; 33 u8 seq; 34 u8 option; 35 u8 __rsv; 36 37 u8 ext_eid; 38 u8 __rsv1[2]; 39 u8 s2d_index; 40 41 u8 tlv[]; 42 }; 43 44 struct mt7925_mcu_uni_event { 45 u8 cid; 46 u8 pad[3]; 47 __le32 status; /* 0: success, others: fail */ 48 } __packed; 49 50 enum { 51 MT_EBF = BIT(0), /* explicit beamforming */ 52 MT_IBF = BIT(1) /* implicit beamforming */ 53 }; 54 55 struct mt7925_mcu_reg_event { 56 __le32 reg; 57 __le32 val; 58 } __packed; 59 60 struct mt7925_mcu_ant_id_config { 61 u8 ant_id[4]; 62 } __packed; 63 64 struct mt7925_txpwr_req { 65 u8 _rsv[4]; 66 __le16 tag; 67 __le16 len; 68 69 u8 format_id; 70 u8 catg; 71 u8 band_idx; 72 u8 _rsv1; 73 } __packed; 74 75 struct mt7925_txpwr_event { 76 u8 rsv[4]; 77 __le16 tag; 78 __le16 len; 79 80 u8 catg; 81 u8 band_idx; 82 u8 ch_band; 83 u8 format; /* 0:Legacy, 1:HE */ 84 85 /* Rate power info */ 86 struct mt7925_txpwr txpwr; 87 88 s8 pwr_max; 89 s8 pwr_min; 90 u8 rsv1; 91 } __packed; 92 93 enum { 94 TM_SWITCH_MODE, 95 TM_SET_AT_CMD, 96 TM_QUERY_AT_CMD, 97 }; 98 99 enum { 100 MT7925_TM_NORMAL, 101 MT7925_TM_TESTMODE, 102 MT7925_TM_ICAP, 103 MT7925_TM_ICAP_OVERLAP, 104 MT7925_TM_WIFISPECTRUM, 105 }; 106 107 struct mt7925_rftest_cmd { 108 u8 action; 109 u8 rsv[3]; 110 __le32 param0; 111 __le32 param1; 112 } __packed; 113 114 struct mt7925_rftest_evt { 115 __le32 param0; 116 __le32 param1; 117 } __packed; 118 119 enum { 120 UNI_CHANNEL_SWITCH, 121 UNI_CHANNEL_RX_PATH, 122 }; 123 124 enum { 125 UNI_CHIP_CONFIG_CHIP_CFG = 0x2, 126 UNI_CHIP_CONFIG_NIC_CAPA = 0x3, 127 }; 128 129 enum { 130 UNI_BAND_CONFIG_RADIO_ENABLE, 131 UNI_BAND_CONFIG_RTS_THRESHOLD = 0x08, 132 UNI_BAND_CONFIG_SET_MAC80211_RX_FILTER = 0x0C, 133 }; 134 135 enum { 136 UNI_WSYS_CONFIG_FW_LOG_CTRL, 137 UNI_WSYS_CONFIG_FW_DBG_CTRL, 138 }; 139 140 enum { 141 UNI_EFUSE_ACCESS = 1, 142 UNI_EFUSE_BUFFER_MODE, 143 UNI_EFUSE_FREE_BLOCK, 144 UNI_EFUSE_BUFFER_RD, 145 }; 146 147 enum { 148 UNI_CMD_ACCESS_REG_BASIC = 0x0, 149 UNI_CMD_ACCESS_RF_REG_BASIC, 150 }; 151 152 enum { 153 UNI_MBMC_SETTING, 154 }; 155 156 enum { 157 UNI_EVENT_SCAN_DONE_BASIC = 0, 158 UNI_EVENT_SCAN_DONE_CHNLINFO = 2, 159 UNI_EVENT_SCAN_DONE_NLO = 3, 160 }; 161 162 enum connac3_mcu_cipher_type { 163 CONNAC3_CIPHER_NONE = 0, 164 CONNAC3_CIPHER_WEP40 = 1, 165 CONNAC3_CIPHER_TKIP = 2, 166 CONNAC3_CIPHER_AES_CCMP = 4, 167 CONNAC3_CIPHER_WEP104 = 5, 168 CONNAC3_CIPHER_BIP_CMAC_128 = 6, 169 CONNAC3_CIPHER_WEP128 = 7, 170 CONNAC3_CIPHER_WAPI = 8, 171 CONNAC3_CIPHER_CCMP_256 = 10, 172 CONNAC3_CIPHER_GCMP = 11, 173 CONNAC3_CIPHER_GCMP_256 = 12, 174 }; 175 176 struct mt7925_mcu_scan_chinfo_event { 177 u8 nr_chan; 178 u8 alpha2[3]; 179 } __packed; 180 181 enum { 182 UNI_SCAN_REQ = 1, 183 UNI_SCAN_CANCEL = 2, 184 UNI_SCAN_SCHED_REQ = 3, 185 UNI_SCAN_SCHED_ENABLE = 4, 186 UNI_SCAN_SSID = 10, 187 UNI_SCAN_BSSID, 188 UNI_SCAN_CHANNEL, 189 UNI_SCAN_IE, 190 UNI_SCAN_MISC, 191 UNI_SCAN_SSID_MATCH_SETS, 192 }; 193 194 enum { 195 UNI_SNIFFER_ENABLE, 196 UNI_SNIFFER_CONFIG, 197 }; 198 199 struct scan_hdr_tlv { 200 /* fixed field */ 201 u8 seq_num; 202 u8 bss_idx; 203 u8 pad[2]; 204 /* tlv */ 205 u8 data[]; 206 } __packed; 207 208 struct scan_req_tlv { 209 __le16 tag; 210 __le16 len; 211 212 u8 scan_type; /* 0: PASSIVE SCAN 213 * 1: ACTIVE SCAN 214 */ 215 u8 probe_req_num; /* Number of probe request for each SSID */ 216 u8 scan_func; /* BIT(0) Enable random MAC scan 217 * BIT(1) Disable DBDC scan type 1~3. 218 * BIT(2) Use DBDC scan type 3 (dedicated one RF to scan). 219 */ 220 u8 src_mask; 221 __le16 channel_min_dwell_time; 222 __le16 channel_dwell_time; /* channel Dwell interval */ 223 __le16 timeout_value; 224 __le16 probe_delay_time; 225 __le32 func_mask_ext; 226 }; 227 228 struct scan_ssid_tlv { 229 __le16 tag; 230 __le16 len; 231 232 u8 ssid_type; /* BIT(0) wildcard SSID 233 * BIT(1) P2P wildcard SSID 234 * BIT(2) specified SSID + wildcard SSID 235 * BIT(2) + ssid_type_ext BIT(0) specified SSID only 236 */ 237 u8 ssids_num; 238 u8 pad[2]; 239 struct mt76_connac_mcu_scan_ssid ssids[4]; 240 }; 241 242 struct scan_bssid_tlv { 243 __le16 tag; 244 __le16 len; 245 246 u8 bssid[ETH_ALEN]; 247 u8 match_ch; 248 u8 match_ssid_ind; 249 u8 rcpi; 250 u8 pad[3]; 251 }; 252 253 struct scan_chan_info_tlv { 254 __le16 tag; 255 __le16 len; 256 257 u8 channel_type; /* 0: Full channels 258 * 1: Only 2.4GHz channels 259 * 2: Only 5GHz channels 260 * 3: P2P social channel only (channel #1, #6 and #11) 261 * 4: Specified channels 262 * Others: Reserved 263 */ 264 u8 channels_num; /* valid when channel_type is 4 */ 265 u8 pad[2]; 266 struct mt76_connac_mcu_scan_channel channels[64]; 267 }; 268 269 struct scan_ie_tlv { 270 __le16 tag; 271 __le16 len; 272 273 __le16 ies_len; 274 u8 band; 275 u8 pad; 276 u8 ies[MT76_CONNAC_SCAN_IE_LEN]; 277 }; 278 279 struct scan_misc_tlv { 280 __le16 tag; 281 __le16 len; 282 283 u8 random_mac[ETH_ALEN]; 284 u8 rsv[2]; 285 }; 286 287 struct scan_sched_req { 288 __le16 tag; 289 __le16 len; 290 291 u8 version; 292 u8 stop_on_match; 293 u8 intervals_num; 294 u8 scan_func; 295 __le16 intervals[MT76_CONNAC_MAX_NUM_SCHED_SCAN_INTERVAL]; 296 }; 297 298 struct scan_sched_ssid_match_sets { 299 __le16 tag; 300 __le16 len; 301 302 u8 match_num; 303 u8 rsv[3]; 304 305 struct mt76_connac_mcu_scan_match match[MT76_CONNAC_MAX_SCAN_MATCH]; 306 }; 307 308 struct scan_sched_enable { 309 __le16 tag; 310 __le16 len; 311 312 u8 active; 313 u8 rsv[3]; 314 }; 315 316 struct mbmc_set_req { 317 u8 pad[4]; 318 u8 data[]; 319 } __packed; 320 321 struct mbmc_conf_tlv { 322 __le16 tag; 323 __le16 len; 324 325 u8 mbmc_en; 326 u8 band; 327 u8 pad[2]; 328 } __packed; 329 330 struct edca { 331 __le16 tag; 332 __le16 len; 333 334 u8 queue; 335 u8 set; 336 u8 cw_min; 337 u8 cw_max; 338 __le16 txop; 339 u8 aifs; 340 u8 __rsv; 341 }; 342 343 struct bss_req_hdr { 344 u8 bss_idx; 345 u8 __rsv[3]; 346 } __packed; 347 348 struct bss_rate_tlv { 349 __le16 tag; 350 __le16 len; 351 u8 __rsv1[2]; 352 __le16 basic_rate; 353 __le16 bc_trans; 354 __le16 mc_trans; 355 u8 short_preamble; 356 u8 bc_fixed_rate; 357 u8 mc_fixed_rate; 358 u8 __rsv2; 359 } __packed; 360 361 struct bss_mld_tlv { 362 __le16 tag; 363 __le16 len; 364 u8 group_mld_id; 365 u8 own_mld_id; 366 u8 mac_addr[ETH_ALEN]; 367 u8 remap_idx; 368 u8 link_id; 369 u8 eml_enable; 370 u8 max_link_num; 371 u8 hybrid_mode; 372 u8 __rsv[3]; 373 } __packed; 374 375 struct sta_rec_ba_uni { 376 __le16 tag; 377 __le16 len; 378 u8 tid; 379 u8 ba_type; 380 u8 amsdu; 381 u8 ba_en; 382 __le16 ssn; 383 __le16 winsize; 384 u8 ba_rdd_rro; 385 u8 __rsv[3]; 386 } __packed; 387 388 struct sta_rec_eht { 389 __le16 tag; 390 __le16 len; 391 u8 tid_bitmap; 392 u8 _rsv; 393 __le16 mac_cap; 394 __le64 phy_cap; 395 __le64 phy_cap_ext; 396 u8 mcs_map_bw20[4]; 397 u8 mcs_map_bw80[3]; 398 u8 mcs_map_bw160[3]; 399 u8 mcs_map_bw320[3]; 400 u8 _rsv2[3]; 401 } __packed; 402 403 struct sta_rec_sec_uni { 404 __le16 tag; 405 __le16 len; 406 u8 add; 407 u8 tx_key; 408 u8 key_type; 409 u8 is_authenticator; 410 u8 peer_addr[6]; 411 u8 bss_idx; 412 u8 cipher_id; 413 u8 key_id; 414 u8 key_len; 415 u8 wlan_idx; 416 u8 mgmt_prot; 417 u8 key[32]; 418 u8 key_rsc[16]; 419 } __packed; 420 421 struct sta_rec_hdr_trans { 422 __le16 tag; 423 __le16 len; 424 u8 from_ds; 425 u8 to_ds; 426 u8 dis_rx_hdr_tran; 427 u8 rsv; 428 } __packed; 429 430 struct sta_rec_mld { 431 __le16 tag; 432 __le16 len; 433 u8 mac_addr[ETH_ALEN]; 434 __le16 primary_id; 435 __le16 secondary_id; 436 __le16 wlan_id; 437 u8 link_num; 438 u8 rsv[3]; 439 struct { 440 __le16 wlan_id; 441 u8 bss_idx; 442 u8 rsv; 443 } __packed link[2]; 444 } __packed; 445 446 struct sta_rec_eht_mld { 447 __le16 tag; 448 __le16 len; 449 u8 nsep; 450 u8 mld_type; 451 u8 __rsv1[1]; 452 u8 str_cap[3]; 453 u8 eml_cap[3]; 454 u8 __rsv2[3]; 455 } __packed; 456 457 struct bss_ifs_time_tlv { 458 __le16 tag; 459 __le16 len; 460 u8 slot_valid; 461 u8 sifs_valid; 462 u8 rifs_valid; 463 u8 eifs_valid; 464 __le16 slot_time; 465 __le16 sifs_time; 466 __le16 rifs_time; 467 __le16 eifs_time; 468 u8 eifs_cck_valid; 469 u8 rsv; 470 __le16 eifs_cck_time; 471 } __packed; 472 473 struct bss_rlm_tlv { 474 __le16 tag; 475 __le16 len; 476 u8 control_channel; 477 u8 center_chan; 478 u8 center_chan2; 479 u8 bw; 480 u8 tx_streams; 481 u8 rx_streams; 482 u8 ht_op_info; 483 u8 sco; 484 u8 band; 485 u8 pad[3]; 486 } __packed; 487 488 #define MT7925_STA_UPDATE_MAX_SIZE (sizeof(struct sta_req_hdr) + \ 489 sizeof(struct sta_rec_basic) + \ 490 sizeof(struct sta_rec_bf) + \ 491 sizeof(struct sta_rec_ht) + \ 492 sizeof(struct sta_rec_he_v2) + \ 493 sizeof(struct sta_rec_ba_uni) + \ 494 sizeof(struct sta_rec_vht) + \ 495 sizeof(struct sta_rec_uapsd) + \ 496 sizeof(struct sta_rec_amsdu) + \ 497 sizeof(struct sta_rec_bfee) + \ 498 sizeof(struct sta_rec_phy) + \ 499 sizeof(struct sta_rec_ra) + \ 500 sizeof(struct sta_rec_sec_uni) + \ 501 sizeof(struct sta_rec_ra_fixed) + \ 502 sizeof(struct sta_rec_he_6g_capa) + \ 503 sizeof(struct sta_rec_eht) + \ 504 sizeof(struct sta_rec_hdr_trans) + \ 505 sizeof(struct sta_rec_mld) + \ 506 sizeof(struct tlv) * 2 + \ 507 sizeof(struct sta_rec_remove)) 508 509 #define MT7925_BSS_UPDATE_MAX_SIZE (sizeof(struct bss_req_hdr) + \ 510 sizeof(struct mt76_connac_bss_basic_tlv) + \ 511 sizeof(struct mt76_connac_bss_qos_tlv) + \ 512 sizeof(struct bss_rate_tlv) + \ 513 sizeof(struct bss_mld_tlv) + \ 514 sizeof(struct bss_info_uni_he) + \ 515 sizeof(struct bss_info_uni_bss_color) + \ 516 sizeof(struct bss_ifs_time_tlv) + \ 517 sizeof(struct bss_rlm_tlv) + \ 518 sizeof(struct tlv)) 519 520 #define MT_CONNAC3_SKU_POWER_LIMIT 449 521 struct mt7925_sku_tlv { 522 u8 channel; 523 s8 pwr_limit[MT_CONNAC3_SKU_POWER_LIMIT]; 524 } __packed; 525 526 struct mt7925_tx_power_limit_tlv { 527 u8 rsv[4]; 528 529 __le16 tag; 530 __le16 len; 531 532 /* DW0 - common info*/ 533 u8 ver; 534 u8 pad0; 535 __le16 rsv1; 536 /* DW1 - cmd hint */ 537 u8 n_chan; /* # channel */ 538 u8 band; /* 2.4GHz - 5GHz - 6GHz */ 539 u8 last_msg; 540 u8 limit_type; 541 /* DW3 */ 542 u8 alpha2[4]; /* regulatory_request.alpha2 */ 543 u8 pad2[32]; 544 545 u8 data[]; 546 } __packed; 547 548 struct mt7925_arpns_tlv { 549 __le16 tag; 550 __le16 len; 551 552 u8 enable; 553 u8 ips_num; 554 u8 rsv[2]; 555 } __packed; 556 557 struct mt7925_wow_pattern_tlv { 558 __le16 tag; 559 __le16 len; 560 u8 bss_idx; 561 u8 index; /* pattern index */ 562 u8 enable; /* 0: disable 563 * 1: enable 564 */ 565 u8 data_len; /* pattern length */ 566 u8 offset; 567 u8 mask[MT76_CONNAC_WOW_MASK_MAX_LEN]; 568 u8 pattern[MT76_CONNAC_WOW_PATTEN_MAX_LEN]; 569 u8 rsv[7]; 570 } __packed; 571 572 struct roc_acquire_tlv { 573 __le16 tag; 574 __le16 len; 575 u8 bss_idx; 576 u8 tokenid; 577 u8 control_channel; 578 u8 sco; 579 u8 band; 580 u8 bw; 581 u8 center_chan; 582 u8 center_chan2; 583 u8 bw_from_ap; 584 u8 center_chan_from_ap; 585 u8 center_chan2_from_ap; 586 u8 reqtype; 587 __le32 maxinterval; 588 u8 dbdcband; 589 u8 rsv[3]; 590 } __packed; 591 592 static inline enum connac3_mcu_cipher_type 593 mt7925_mcu_get_cipher(int cipher) 594 { 595 switch (cipher) { 596 case WLAN_CIPHER_SUITE_WEP40: 597 return CONNAC3_CIPHER_WEP40; 598 case WLAN_CIPHER_SUITE_WEP104: 599 return CONNAC3_CIPHER_WEP104; 600 case WLAN_CIPHER_SUITE_TKIP: 601 return CONNAC3_CIPHER_TKIP; 602 case WLAN_CIPHER_SUITE_AES_CMAC: 603 return CONNAC3_CIPHER_BIP_CMAC_128; 604 case WLAN_CIPHER_SUITE_CCMP: 605 return CONNAC3_CIPHER_AES_CCMP; 606 case WLAN_CIPHER_SUITE_CCMP_256: 607 return CONNAC3_CIPHER_CCMP_256; 608 case WLAN_CIPHER_SUITE_GCMP: 609 return CONNAC3_CIPHER_GCMP; 610 case WLAN_CIPHER_SUITE_GCMP_256: 611 return CONNAC3_CIPHER_GCMP_256; 612 case WLAN_CIPHER_SUITE_SMS4: 613 return CONNAC3_CIPHER_WAPI; 614 default: 615 return CONNAC3_CIPHER_NONE; 616 } 617 } 618 619 int mt7925_mcu_set_dbdc(struct mt76_phy *phy); 620 int mt7925_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif, 621 struct ieee80211_scan_request *scan_req); 622 int mt7925_mcu_cancel_hw_scan(struct mt76_phy *phy, 623 struct ieee80211_vif *vif); 624 int mt7925_mcu_sched_scan_req(struct mt76_phy *phy, 625 struct ieee80211_vif *vif, 626 struct cfg80211_sched_scan_request *sreq); 627 int mt7925_mcu_sched_scan_enable(struct mt76_phy *phy, 628 struct ieee80211_vif *vif, 629 bool enable); 630 int mt7925_mcu_add_bss_info(struct mt792x_phy *phy, 631 struct ieee80211_chanctx_conf *ctx, 632 struct ieee80211_bss_conf *link_conf, 633 struct ieee80211_link_sta *link_sta, 634 int enable); 635 int mt7925_mcu_set_timing(struct mt792x_phy *phy, 636 struct ieee80211_bss_conf *link_conf); 637 int mt7925_mcu_set_deep_sleep(struct mt792x_dev *dev, bool enable); 638 int mt7925_mcu_set_channel_domain(struct mt76_phy *phy); 639 int mt7925_mcu_set_radio_en(struct mt792x_phy *phy, bool enable); 640 int mt7925_mcu_set_chctx(struct mt76_phy *phy, struct mt76_vif *mvif, 641 struct ieee80211_bss_conf *link_conf, 642 struct ieee80211_chanctx_conf *ctx); 643 int mt7925_mcu_set_rate_txpower(struct mt76_phy *phy); 644 int mt7925_mcu_update_arp_filter(struct mt76_dev *dev, 645 struct ieee80211_bss_conf *link_conf); 646 #endif 647