1 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
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_evt {
108 __le32 param0;
109 __le32 param1;
110 } __packed;
111
112 enum {
113 UNI_CHANNEL_SWITCH,
114 UNI_CHANNEL_RX_PATH,
115 };
116
117 enum {
118 UNI_CHIP_CONFIG_CHIP_CFG = 0x2,
119 UNI_CHIP_CONFIG_NIC_CAPA = 0x3,
120 };
121
122 enum {
123 UNI_BAND_CONFIG_RADIO_ENABLE,
124 UNI_BAND_CONFIG_RTS_THRESHOLD = 0x08,
125 UNI_BAND_CONFIG_SET_MAC80211_RX_FILTER = 0x0C,
126 };
127
128 enum {
129 UNI_WSYS_CONFIG_FW_LOG_CTRL,
130 UNI_WSYS_CONFIG_FW_DBG_CTRL,
131 };
132
133 enum {
134 UNI_EFUSE_ACCESS = 1,
135 UNI_EFUSE_BUFFER_MODE,
136 UNI_EFUSE_FREE_BLOCK,
137 UNI_EFUSE_BUFFER_RD,
138 };
139
140 enum {
141 UNI_CMD_ACCESS_REG_BASIC = 0x0,
142 UNI_CMD_ACCESS_RF_REG_BASIC,
143 };
144
145 enum {
146 UNI_MBMC_SETTING,
147 };
148
149 enum {
150 UNI_EVENT_SCAN_DONE_BASIC = 0,
151 UNI_EVENT_SCAN_DONE_CHNLINFO = 2,
152 UNI_EVENT_SCAN_DONE_NLO = 3,
153 };
154
155 enum {
156 UNI_CMD_RSSI_MONITOR_SET = 0,
157 };
158
159 enum {
160 UNI_EVENT_RSSI_MONITOR_INFO = 0,
161 };
162
163 enum connac3_mcu_cipher_type {
164 CONNAC3_CIPHER_NONE = 0,
165 CONNAC3_CIPHER_WEP40 = 1,
166 CONNAC3_CIPHER_TKIP = 2,
167 CONNAC3_CIPHER_AES_CCMP = 4,
168 CONNAC3_CIPHER_WEP104 = 5,
169 CONNAC3_CIPHER_BIP_CMAC_128 = 6,
170 CONNAC3_CIPHER_WEP128 = 7,
171 CONNAC3_CIPHER_WAPI = 8,
172 CONNAC3_CIPHER_CCMP_256 = 10,
173 CONNAC3_CIPHER_GCMP = 11,
174 CONNAC3_CIPHER_GCMP_256 = 12,
175 };
176
177 struct mt7925_mcu_scan_chinfo_event {
178 u8 nr_chan;
179 u8 alpha2[3];
180 } __packed;
181
182 enum {
183 UNI_SCAN_REQ = 1,
184 UNI_SCAN_CANCEL = 2,
185 UNI_SCAN_SCHED_REQ = 3,
186 UNI_SCAN_SCHED_ENABLE = 4,
187 UNI_SCAN_SSID = 10,
188 UNI_SCAN_BSSID,
189 UNI_SCAN_CHANNEL,
190 UNI_SCAN_IE,
191 UNI_SCAN_MISC,
192 UNI_SCAN_SSID_MATCH_SETS,
193 };
194
195 enum {
196 UNI_SNIFFER_ENABLE,
197 UNI_SNIFFER_CONFIG,
198 };
199
200 #define MT7925_RNR_SCAN_MAX_BSSIDS 10
201 struct scan_hdr_tlv {
202 /* fixed field */
203 u8 seq_num;
204 u8 bss_idx;
205 u8 pad[2];
206 /* tlv */
207 u8 data[];
208 } __packed;
209
210 struct scan_req_tlv {
211 __le16 tag;
212 __le16 len;
213
214 u8 scan_type; /* 0: PASSIVE SCAN
215 * 1: ACTIVE SCAN
216 */
217 u8 probe_req_num; /* Number of probe request for each SSID */
218 u8 scan_func; /* BIT(0) Enable random MAC scan
219 * BIT(1) Disable DBDC scan type 1~3.
220 * BIT(2) Use DBDC scan type 3 (dedicated one RF to scan).
221 */
222 u8 src_mask;
223 __le16 channel_min_dwell_time;
224 __le16 channel_dwell_time; /* channel Dwell interval */
225 __le16 timeout_value;
226 __le16 probe_delay_time;
227 __le32 func_mask_ext;
228 } __packed;
229
230 struct scan_ssid_tlv {
231 __le16 tag;
232 __le16 len;
233
234 u8 ssid_type; /* BIT(0) wildcard SSID
235 * BIT(1) P2P wildcard SSID
236 * BIT(2) specified SSID + wildcard SSID
237 * BIT(2) + ssid_type_ext BIT(0) specified SSID only
238 */
239 u8 ssids_num;
240 u8 is_short_ssid;
241 u8 pad;
242 struct mt76_connac_mcu_scan_ssid ssids[MT7925_RNR_SCAN_MAX_BSSIDS];
243 } __packed;
244
245 struct scan_bssid_tlv {
246 __le16 tag;
247 __le16 len;
248
249 u8 bssid[ETH_ALEN];
250 u8 match_ch;
251 u8 match_ssid_ind;
252 u8 rcpi;
253 u8 match_short_ssid_ind;
254 u8 pad[2];
255 } __packed;
256
257 struct scan_chan_info_tlv {
258 __le16 tag;
259 __le16 len;
260
261 u8 channel_type; /* 0: Full channels
262 * 1: Only 2.4GHz channels
263 * 2: Only 5GHz channels
264 * 3: P2P social channel only (channel #1, #6 and #11)
265 * 4: Specified channels
266 * Others: Reserved
267 */
268 u8 channels_num; /* valid when channel_type is 4 */
269 u8 pad[2];
270 struct mt76_connac_mcu_scan_channel channels[64];
271 } __packed;
272
273 struct scan_ie_tlv {
274 __le16 tag;
275 __le16 len;
276
277 __le16 ies_len;
278 u8 band;
279 u8 pad;
280 u8 ies[];
281 };
282
283 struct scan_misc_tlv {
284 __le16 tag;
285 __le16 len;
286
287 u8 random_mac[ETH_ALEN];
288 u8 rsv[2];
289 };
290
291 struct scan_sched_req {
292 __le16 tag;
293 __le16 len;
294
295 u8 version;
296 u8 stop_on_match;
297 u8 intervals_num;
298 u8 scan_func;
299 __le16 intervals[MT76_CONNAC_MAX_NUM_SCHED_SCAN_INTERVAL];
300 };
301
302 struct scan_sched_ssid_match_sets {
303 __le16 tag;
304 __le16 len;
305
306 u8 match_num;
307 u8 rsv[3];
308
309 struct mt76_connac_mcu_scan_match match[MT76_CONNAC_MAX_SCAN_MATCH];
310 };
311
312 struct scan_sched_enable {
313 __le16 tag;
314 __le16 len;
315
316 u8 active;
317 u8 rsv[3];
318 };
319
320 struct mbmc_set_req {
321 u8 pad[4];
322 u8 data[];
323 } __packed;
324
325 struct mbmc_conf_tlv {
326 __le16 tag;
327 __le16 len;
328
329 u8 mbmc_en;
330 u8 band;
331 u8 pad[2];
332 } __packed;
333
334 struct edca {
335 __le16 tag;
336 __le16 len;
337
338 u8 queue;
339 u8 set;
340 u8 cw_min;
341 u8 cw_max;
342 __le16 txop;
343 u8 aifs;
344 u8 __rsv;
345 };
346
347 struct bss_req_hdr {
348 u8 bss_idx;
349 u8 __rsv[3];
350 } __packed;
351
352 struct bss_rate_tlv {
353 __le16 tag;
354 __le16 len;
355 u8 __rsv1[2];
356 __le16 basic_rate;
357 __le16 bc_trans;
358 __le16 mc_trans;
359 u8 short_preamble;
360 u8 bc_fixed_rate;
361 u8 mc_fixed_rate;
362 u8 __rsv2;
363 } __packed;
364
365 struct bss_mld_tlv {
366 __le16 tag;
367 __le16 len;
368 u8 group_mld_id;
369 u8 own_mld_id;
370 u8 mac_addr[ETH_ALEN];
371 u8 remap_idx;
372 u8 link_id;
373 u8 eml_enable;
374 u8 max_link_num;
375 u8 hybrid_mode;
376 u8 __rsv[3];
377 } __packed;
378
379 struct bss_eht_tlv {
380 __le16 tag;
381 __le16 len;
382 u8 is_eht_op_present;
383 u8 is_eth_dscb_present;
384 u8 eht_ctrl;
385 u8 eht_ccfs0;
386 u8 eht_ccfs1;
387 u8 pad1;
388 __le16 eht_dis_sub_chan_bitmap;
389 u8 pad2[4];
390 } __packed;
391
392 struct sta_rec_ba_uni {
393 __le16 tag;
394 __le16 len;
395 u8 tid;
396 u8 ba_type;
397 u8 amsdu;
398 u8 ba_en;
399 __le16 ssn;
400 __le16 winsize;
401 u8 ba_rdd_rro;
402 u8 __rsv[3];
403 } __packed;
404
405 struct sta_rec_eht {
406 __le16 tag;
407 __le16 len;
408 u8 tid_bitmap;
409 u8 _rsv;
410 __le16 mac_cap;
411 __le64 phy_cap;
412 __le64 phy_cap_ext;
413 u8 mcs_map_bw20[4];
414 u8 mcs_map_bw80[3];
415 u8 mcs_map_bw160[3];
416 u8 mcs_map_bw320[3];
417 u8 _rsv2[3];
418 } __packed;
419
420 struct sta_rec_sec_uni {
421 __le16 tag;
422 __le16 len;
423 u8 add;
424 u8 tx_key;
425 u8 key_type;
426 u8 is_authenticator;
427 u8 peer_addr[6];
428 u8 bss_idx;
429 u8 cipher_id;
430 u8 key_id;
431 u8 key_len;
432 u8 wlan_idx;
433 u8 mgmt_prot;
434 u8 key[32];
435 u8 key_rsc[16];
436 } __packed;
437
438 struct sta_rec_hdr_trans {
439 __le16 tag;
440 __le16 len;
441 u8 from_ds;
442 u8 to_ds;
443 u8 dis_rx_hdr_tran;
444 u8 rsv;
445 } __packed;
446
447 struct sta_rec_mld {
448 __le16 tag;
449 __le16 len;
450 u8 mac_addr[ETH_ALEN];
451 __le16 primary_id;
452 __le16 secondary_id;
453 __le16 wlan_id;
454 u8 link_num;
455 u8 rsv[3];
456 struct {
457 __le16 wlan_id;
458 u8 bss_idx;
459 u8 rsv;
460 } __packed link[2];
461 } __packed;
462
463 struct sta_rec_eht_mld {
464 __le16 tag;
465 __le16 len;
466 u8 nsep;
467 u8 mld_type;
468 u8 __rsv1[1];
469 u8 str_cap[3];
470 u8 eml_cap[3];
471 u8 __rsv2[3];
472 } __packed;
473
474 struct bss_ifs_time_tlv {
475 __le16 tag;
476 __le16 len;
477 u8 slot_valid;
478 u8 sifs_valid;
479 u8 rifs_valid;
480 u8 eifs_valid;
481 __le16 slot_time;
482 __le16 sifs_time;
483 __le16 rifs_time;
484 __le16 eifs_time;
485 u8 eifs_cck_valid;
486 u8 rsv;
487 __le16 eifs_cck_time;
488 } __packed;
489
490 struct bss_rlm_tlv {
491 __le16 tag;
492 __le16 len;
493 u8 control_channel;
494 u8 center_chan;
495 u8 center_chan2;
496 u8 bw;
497 u8 tx_streams;
498 u8 rx_streams;
499 u8 ht_op_info;
500 u8 sco;
501 u8 band;
502 u8 pad[3];
503 } __packed;
504
505 #define MT7925_STA_UPDATE_MAX_SIZE (sizeof(struct sta_req_hdr) + \
506 sizeof(struct sta_rec_basic) + \
507 sizeof(struct sta_rec_bf) + \
508 sizeof(struct sta_rec_ht) + \
509 sizeof(struct sta_rec_he_v2) + \
510 sizeof(struct sta_rec_ba_uni) + \
511 sizeof(struct sta_rec_vht) + \
512 sizeof(struct sta_rec_uapsd) + \
513 sizeof(struct sta_rec_amsdu) + \
514 sizeof(struct sta_rec_bfee) + \
515 sizeof(struct sta_rec_phy) + \
516 sizeof(struct sta_rec_ra) + \
517 sizeof(struct sta_rec_sec_uni) + \
518 sizeof(struct sta_rec_ra_fixed) + \
519 sizeof(struct sta_rec_he_6g_capa) + \
520 sizeof(struct sta_rec_eht) + \
521 sizeof(struct sta_rec_hdr_trans) + \
522 sizeof(struct sta_rec_mld) + \
523 sizeof(struct tlv) * 2 + \
524 sizeof(struct sta_rec_remove))
525
526 #define MT7925_BSS_UPDATE_MAX_SIZE (sizeof(struct bss_req_hdr) + \
527 sizeof(struct mt76_connac_bss_basic_tlv) + \
528 sizeof(struct mt76_connac_bss_qos_tlv) + \
529 sizeof(struct bss_rate_tlv) + \
530 sizeof(struct bss_mld_tlv) + \
531 sizeof(struct bss_info_uni_he) + \
532 sizeof(struct bss_info_uni_bss_color) + \
533 sizeof(struct bss_ifs_time_tlv) + \
534 sizeof(struct bss_rlm_tlv) + \
535 sizeof(struct tlv))
536
537 #define MT_CONNAC3_SKU_POWER_LIMIT 449
538 struct mt7925_sku_tlv {
539 u8 channel;
540 s8 pwr_limit[MT_CONNAC3_SKU_POWER_LIMIT];
541 } __packed;
542
543 struct mt7925_tx_power_limit_tlv {
544 u8 rsv[4];
545
546 __le16 tag;
547 __le16 len;
548
549 /* DW0 - common info*/
550 u8 ver;
551 u8 pad0;
552 __le16 rsv1;
553 /* DW1 - cmd hint */
554 u8 n_chan; /* # channel */
555 u8 band; /* 2.4GHz - 5GHz - 6GHz */
556 u8 last_msg;
557 u8 limit_type;
558 /* DW3 */
559 u8 alpha2[4]; /* regulatory_request.alpha2 */
560 u8 pad2[32];
561
562 u8 data[];
563 } __packed;
564
565 struct mt7925_arpns_tlv {
566 __le16 tag;
567 __le16 len;
568
569 u8 enable;
570 u8 ips_num;
571 u8 rsv[2];
572 } __packed;
573
574 struct mt7925_wow_pattern_tlv {
575 __le16 tag;
576 __le16 len;
577 u8 bss_idx;
578 u8 index; /* pattern index */
579 u8 enable; /* 0: disable
580 * 1: enable
581 */
582 u8 data_len; /* pattern length */
583 u8 offset;
584 u8 mask[MT76_CONNAC_WOW_MASK_MAX_LEN];
585 u8 pattern[MT76_CONNAC_WOW_PATTEN_MAX_LEN];
586 u8 rsv[4];
587 };
588
589 struct roc_acquire_tlv {
590 __le16 tag;
591 __le16 len;
592 u8 bss_idx;
593 u8 tokenid;
594 u8 control_channel;
595 u8 sco;
596 u8 band;
597 u8 bw;
598 u8 center_chan;
599 u8 center_chan2;
600 u8 bw_from_ap;
601 u8 center_chan_from_ap;
602 u8 center_chan2_from_ap;
603 u8 reqtype;
604 __le32 maxinterval;
605 u8 dbdcband;
606 u8 rsv[3];
607 } __packed;
608
609 enum ENUM_CMD_TEST_CTRL_ACT {
610 CMD_TEST_CTRL_ACT_SWITCH_MODE = 0,
611 CMD_TEST_CTRL_ACT_SET_AT = 1,
612 CMD_TEST_CTRL_ACT_GET_AT = 2,
613 CMD_TEST_CTRL_ACT_SET_AT_ENG = 3,
614 CMD_TEST_CTRL_ACT_GET_AT_ENG = 4,
615 CMD_TEST_CTRL_ACT_NUM
616 };
617
618 enum ENUM_CMD_TEST_CTRL_ACT_SWITCH_MODE_OP {
619 CMD_TEST_CTRL_ACT_SWITCH_MODE_NORMAL = 0,
620 CMD_TEST_CTRL_ACT_SWITCH_MODE_RF_TEST = 1,
621 CMD_TEST_CTRL_ACT_SWITCH_MODE_ICAP = 2,
622 CMD_TEST_CTRL_ACT_SWITCH_MODE_NUM
623 };
624
625 union testmode_data {
626 __le32 op_mode;
627 __le32 channel_freq;
628 u8 rf_at_info[84];
629 };
630
631 union testmode_evt {
632 __le32 op_mode;
633 __le32 channel_freq;
634 u8 rf_at_info[1024];
635 };
636
637 struct uni_cmd_testmode_ctrl {
638 u16 tag;
639 u16 length;
640 u8 action;
641 u8 reserved[3];
642 union testmode_data data;
643 } __packed;
644
645 struct mt7925_rftest_cmd {
646 u8 padding[4];
647 struct uni_cmd_testmode_ctrl ctrl;
648 } __packed;
649
650 static inline enum connac3_mcu_cipher_type
mt7925_mcu_get_cipher(int cipher)651 mt7925_mcu_get_cipher(int cipher)
652 {
653 switch (cipher) {
654 case WLAN_CIPHER_SUITE_WEP40:
655 return CONNAC3_CIPHER_WEP40;
656 case WLAN_CIPHER_SUITE_WEP104:
657 return CONNAC3_CIPHER_WEP104;
658 case WLAN_CIPHER_SUITE_TKIP:
659 return CONNAC3_CIPHER_TKIP;
660 case WLAN_CIPHER_SUITE_AES_CMAC:
661 return CONNAC3_CIPHER_BIP_CMAC_128;
662 case WLAN_CIPHER_SUITE_CCMP:
663 return CONNAC3_CIPHER_AES_CCMP;
664 case WLAN_CIPHER_SUITE_CCMP_256:
665 return CONNAC3_CIPHER_CCMP_256;
666 case WLAN_CIPHER_SUITE_GCMP:
667 return CONNAC3_CIPHER_GCMP;
668 case WLAN_CIPHER_SUITE_GCMP_256:
669 return CONNAC3_CIPHER_GCMP_256;
670 case WLAN_CIPHER_SUITE_SMS4:
671 return CONNAC3_CIPHER_WAPI;
672 default:
673 return CONNAC3_CIPHER_NONE;
674 }
675 }
676
677 int mt7925_mcu_set_dbdc(struct mt76_phy *phy, bool enable);
678 int mt7925_mcu_hw_scan(struct mt76_phy *phy, struct ieee80211_vif *vif,
679 struct ieee80211_scan_request *scan_req);
680 int mt7925_mcu_cancel_hw_scan(struct mt76_phy *phy,
681 struct ieee80211_vif *vif);
682 int mt7925_mcu_sched_scan_req(struct mt76_phy *phy,
683 struct ieee80211_vif *vif,
684 struct cfg80211_sched_scan_request *sreq,
685 struct ieee80211_scan_ies *ies);
686 int mt7925_mcu_sched_scan_enable(struct mt76_phy *phy,
687 struct ieee80211_vif *vif,
688 bool enable);
689 void mt7925_mcu_del_dev(struct mt76_dev *mdev,
690 struct ieee80211_vif *vif);
691 int mt7925_mcu_add_bss_info(struct mt792x_phy *phy,
692 struct ieee80211_chanctx_conf *ctx,
693 struct ieee80211_bss_conf *link_conf,
694 struct ieee80211_link_sta *link_sta,
695 int enable);
696 int mt7925_mcu_set_timing(struct mt792x_phy *phy,
697 struct ieee80211_bss_conf *link_conf);
698 int mt7925_mcu_set_deep_sleep(struct mt792x_dev *dev, bool enable);
699 int mt7925_mcu_set_thermal_protect(struct mt792x_dev *dev);
700 int mt7925_mcu_set_channel_domain(struct mt76_phy *phy);
701 int mt7925_mcu_set_radio_en(struct mt792x_phy *phy, bool enable);
702 int mt7925_mcu_set_chctx(struct mt76_phy *phy, struct mt76_vif_link *mvif,
703 struct ieee80211_bss_conf *link_conf,
704 struct ieee80211_chanctx_conf *ctx);
705 int mt7925_mcu_set_eht_pp(struct mt76_phy *phy, struct mt76_vif_link *mvif,
706 struct ieee80211_bss_conf *link_conf,
707 struct ieee80211_chanctx_conf *ctx);
708 int mt7925_mcu_set_rate_txpower(struct mt76_phy *phy);
709 int mt7925_mcu_update_arp_filter(struct mt76_dev *dev,
710 struct ieee80211_bss_conf *link_conf);
711 int
712 mt7925_mcu_uni_bss_bcnft(struct mt792x_dev *dev,
713 struct ieee80211_bss_conf *link_conf, bool enable);
714 #endif
715