GNU Linux-libre 5.19-rc6-gnu
[releases.git] / drivers / net / wireless / mediatek / mt76 / mt7915 / mcu.h
1 /* SPDX-License-Identifier: ISC */
2 /* Copyright (C) 2020 MediaTek Inc. */
3
4 #ifndef __MT7915_MCU_H
5 #define __MT7915_MCU_H
6
7 #include "../mt76_connac_mcu.h"
8
9 struct mt7915_mcu_txd {
10         __le32 txd[8];
11
12         __le16 len;
13         __le16 pq_id;
14
15         u8 cid;
16         u8 pkt_type;
17         u8 set_query; /* FW don't care */
18         u8 seq;
19
20         u8 uc_d2b0_rev;
21         u8 ext_cid;
22         u8 s2d_index;
23         u8 ext_cid_ack;
24
25         u32 reserved[5];
26 } __packed __aligned(4);
27
28 enum {
29         MCU_ATE_SET_TRX = 0x1,
30         MCU_ATE_SET_FREQ_OFFSET = 0xa,
31         MCU_ATE_SET_SLOT_TIME = 0x13,
32         MCU_ATE_CLEAN_TXQUEUE = 0x1c,
33 };
34
35 struct mt7915_mcu_rxd {
36         __le32 rxd[6];
37
38         __le16 len;
39         __le16 pkt_type_id;
40
41         u8 eid;
42         u8 seq;
43         __le16 __rsv;
44
45         u8 ext_eid;
46         u8 __rsv1[2];
47         u8 s2d_index;
48 };
49
50 struct mt7915_mcu_thermal_ctrl {
51         u8 ctrl_id;
52         u8 band_idx;
53         union {
54                 struct {
55                         u8 protect_type; /* 1: duty admit, 2: radio off */
56                         u8 trigger_type; /* 0: low, 1: high */
57                 } __packed type;
58                 struct {
59                         u8 duty_level;  /* level 0~3 */
60                         u8 duty_cycle;
61                 } __packed duty;
62         };
63 } __packed;
64
65 struct mt7915_mcu_thermal_notify {
66         struct mt7915_mcu_rxd rxd;
67
68         struct mt7915_mcu_thermal_ctrl ctrl;
69         __le32 temperature;
70         u8 rsv[8];
71 } __packed;
72
73 struct mt7915_mcu_csa_notify {
74         struct mt7915_mcu_rxd rxd;
75
76         u8 omac_idx;
77         u8 csa_count;
78         u8 band_idx;
79         u8 rsv;
80 } __packed;
81
82 struct mt7915_mcu_bcc_notify {
83         struct mt7915_mcu_rxd rxd;
84
85         u8 band_idx;
86         u8 omac_idx;
87         u8 cca_count;
88         u8 rsv;
89 } __packed;
90
91 struct mt7915_mcu_rdd_report {
92         struct mt7915_mcu_rxd rxd;
93
94         u8 band_idx;
95         u8 long_detected;
96         u8 constant_prf_detected;
97         u8 staggered_prf_detected;
98         u8 radar_type_idx;
99         u8 periodic_pulse_num;
100         u8 long_pulse_num;
101         u8 hw_pulse_num;
102
103         u8 out_lpn;
104         u8 out_spn;
105         u8 out_crpn;
106         u8 out_crpw;
107         u8 out_crbn;
108         u8 out_stgpn;
109         u8 out_stgpw;
110
111         u8 rsv;
112
113         __le32 out_pri_const;
114         __le32 out_pri_stg[3];
115
116         struct {
117                 __le32 start;
118                 __le16 pulse_width;
119                 __le16 pulse_power;
120                 u8 mdrdy_flag;
121                 u8 rsv[3];
122         } long_pulse[32];
123
124         struct {
125                 __le32 start;
126                 __le16 pulse_width;
127                 __le16 pulse_power;
128                 u8 mdrdy_flag;
129                 u8 rsv[3];
130         } periodic_pulse[32];
131
132         struct {
133                 __le32 start;
134                 __le16 pulse_width;
135                 __le16 pulse_power;
136                 u8 sc_pass;
137                 u8 sw_reset;
138                 u8 mdrdy_flag;
139                 u8 tx_active;
140         } hw_pulse[32];
141 } __packed;
142
143 struct mt7915_mcu_background_chain_ctrl {
144         u8 chan;                /* primary channel */
145         u8 central_chan;        /* central channel */
146         u8 bw;
147         u8 tx_stream;
148         u8 rx_stream;
149
150         u8 monitor_chan;        /* monitor channel */
151         u8 monitor_central_chan;/* monitor central channel */
152         u8 monitor_bw;
153         u8 monitor_tx_stream;
154         u8 monitor_rx_stream;
155
156         u8 scan_mode;           /* 0: ScanStop
157                                  * 1: ScanStart
158                                  * 2: ScanRunning
159                                  */
160         u8 band_idx;            /* DBDC */
161         u8 monitor_scan_type;
162         u8 band;                /* 0: 2.4GHz, 1: 5GHz */
163         u8 rsv[2];
164 } __packed;
165
166 struct mt7915_mcu_eeprom {
167         u8 buffer_mode;
168         u8 format;
169         __le16 len;
170 } __packed;
171
172 struct mt7915_mcu_eeprom_info {
173         __le32 addr;
174         __le32 valid;
175         u8 data[16];
176 } __packed;
177
178 struct mt7915_mcu_phy_rx_info {
179         u8 category;
180         u8 rate;
181         u8 mode;
182         u8 nsts;
183         u8 gi;
184         u8 coding;
185         u8 stbc;
186         u8 bw;
187 };
188
189 struct mt7915_mcu_mib {
190         __le32 band;
191         __le32 offs;
192         __le64 data;
193 } __packed;
194
195 enum mt7915_chan_mib_offs {
196         /* mt7915 */
197         MIB_BUSY_TIME = 14,
198         MIB_TX_TIME = 81,
199         MIB_RX_TIME,
200         MIB_OBSS_AIRTIME = 86,
201         /* mt7916 */
202         MIB_BUSY_TIME_V2 = 0,
203         MIB_TX_TIME_V2 = 6,
204         MIB_RX_TIME_V2 = 8,
205         MIB_OBSS_AIRTIME_V2 = 490
206 };
207
208 struct edca {
209         u8 queue;
210         u8 set;
211         u8 aifs;
212         u8 cw_min;
213         __le16 cw_max;
214         __le16 txop;
215 };
216
217 struct mt7915_mcu_tx {
218         u8 total;
219         u8 action;
220         u8 valid;
221         u8 mode;
222
223         struct edca edca[IEEE80211_NUM_ACS];
224 } __packed;
225
226 struct mt7915_mcu_muru_stats {
227         __le32 event_id;
228         struct {
229                 __le32 cck_cnt;
230                 __le32 ofdm_cnt;
231                 __le32 htmix_cnt;
232                 __le32 htgf_cnt;
233                 __le32 vht_su_cnt;
234                 __le32 vht_2mu_cnt;
235                 __le32 vht_3mu_cnt;
236                 __le32 vht_4mu_cnt;
237                 __le32 he_su_cnt;
238                 __le32 he_ext_su_cnt;
239                 __le32 he_2ru_cnt;
240                 __le32 he_2mu_cnt;
241                 __le32 he_3ru_cnt;
242                 __le32 he_3mu_cnt;
243                 __le32 he_4ru_cnt;
244                 __le32 he_4mu_cnt;
245                 __le32 he_5to8ru_cnt;
246                 __le32 he_9to16ru_cnt;
247                 __le32 he_gtr16ru_cnt;
248         } dl;
249
250         struct {
251                 __le32 hetrig_su_cnt;
252                 __le32 hetrig_2ru_cnt;
253                 __le32 hetrig_3ru_cnt;
254                 __le32 hetrig_4ru_cnt;
255                 __le32 hetrig_5to8ru_cnt;
256                 __le32 hetrig_9to16ru_cnt;
257                 __le32 hetrig_gtr16ru_cnt;
258                 __le32 hetrig_2mu_cnt;
259                 __le32 hetrig_3mu_cnt;
260                 __le32 hetrig_4mu_cnt;
261         } ul;
262 };
263
264 #define WMM_AIFS_SET            BIT(0)
265 #define WMM_CW_MIN_SET          BIT(1)
266 #define WMM_CW_MAX_SET          BIT(2)
267 #define WMM_TXOP_SET            BIT(3)
268 #define WMM_PARAM_SET           GENMASK(3, 0)
269
270 #define MCU_PQ_ID(p, q)                 (((p) << 15) | ((q) << 10))
271 #define MCU_PKT_ID                      0xa0
272
273 enum {
274         MCU_FW_LOG_WM,
275         MCU_FW_LOG_WA,
276         MCU_FW_LOG_TO_HOST,
277 };
278
279 enum {
280         MCU_TWT_AGRT_ADD,
281         MCU_TWT_AGRT_MODIFY,
282         MCU_TWT_AGRT_DELETE,
283         MCU_TWT_AGRT_TEARDOWN,
284         MCU_TWT_AGRT_GET_TSF,
285 };
286
287 enum {
288         MCU_WA_PARAM_CMD_QUERY,
289         MCU_WA_PARAM_CMD_SET,
290         MCU_WA_PARAM_CMD_CAPABILITY,
291         MCU_WA_PARAM_CMD_DEBUG,
292 };
293
294 enum {
295         MCU_WA_PARAM_PDMA_RX = 0x04,
296         MCU_WA_PARAM_CPU_UTIL = 0x0b,
297         MCU_WA_PARAM_RED = 0x0e,
298 };
299
300 enum mcu_mmps_mode {
301         MCU_MMPS_STATIC,
302         MCU_MMPS_DYNAMIC,
303         MCU_MMPS_RSV,
304         MCU_MMPS_DISABLE,
305 };
306
307 struct bss_info_bmc_rate {
308         __le16 tag;
309         __le16 len;
310         __le16 bc_trans;
311         __le16 mc_trans;
312         u8 short_preamble;
313         u8 rsv[7];
314 } __packed;
315
316 struct bss_info_ra {
317         __le16 tag;
318         __le16 len;
319         u8 op_mode;
320         u8 adhoc_en;
321         u8 short_preamble;
322         u8 tx_streams;
323         u8 rx_streams;
324         u8 algo;
325         u8 force_sgi;
326         u8 force_gf;
327         u8 ht_mode;
328         u8 has_20_sta;          /* Check if any sta support GF. */
329         u8 bss_width_trigger_events;
330         u8 vht_nss_cap;
331         u8 vht_bw_signal;       /* not use */
332         u8 vht_force_sgi;       /* not use */
333         u8 se_off;
334         u8 antenna_idx;
335         u8 train_up_rule;
336         u8 rsv[3];
337         unsigned short train_up_high_thres;
338         short train_up_rule_rssi;
339         unsigned short low_traffic_thres;
340         __le16 max_phyrate;
341         __le32 phy_cap;
342         __le32 interval;
343         __le32 fast_interval;
344 } __packed;
345
346 struct bss_info_hw_amsdu {
347         __le16 tag;
348         __le16 len;
349         __le32 cmp_bitmap_0;
350         __le32 cmp_bitmap_1;
351         __le16 trig_thres;
352         u8 enable;
353         u8 rsv;
354 } __packed;
355
356 struct bss_info_color {
357         __le16 tag;
358         __le16 len;
359         u8 disable;
360         u8 color;
361         u8 rsv[2];
362 } __packed;
363
364 struct bss_info_he {
365         __le16 tag;
366         __le16 len;
367         u8 he_pe_duration;
368         u8 vht_op_info_present;
369         __le16 he_rts_thres;
370         __le16 max_nss_mcs[CMD_HE_MCS_BW_NUM];
371         u8 rsv[6];
372 } __packed;
373
374 struct bss_info_bcn {
375         __le16 tag;
376         __le16 len;
377         u8 ver;
378         u8 enable;
379         __le16 sub_ntlv;
380 } __packed __aligned(4);
381
382 struct bss_info_bcn_cntdwn {
383         __le16 tag;
384         __le16 len;
385         u8 cnt;
386         u8 rsv[3];
387 } __packed __aligned(4);
388
389 struct bss_info_bcn_mbss {
390 #define MAX_BEACON_NUM  32
391         __le16 tag;
392         __le16 len;
393         __le32 bitmap;
394         __le16 offset[MAX_BEACON_NUM];
395         u8 rsv[8];
396 } __packed __aligned(4);
397
398 struct bss_info_bcn_cont {
399         __le16 tag;
400         __le16 len;
401         __le16 tim_ofs;
402         __le16 csa_ofs;
403         __le16 bcc_ofs;
404         __le16 pkt_len;
405 } __packed __aligned(4);
406
407 struct bss_info_inband_discovery {
408         __le16 tag;
409         __le16 len;
410         u8 tx_type;
411         u8 tx_mode;
412         u8 tx_interval;
413         u8 enable;
414         __le16 rsv;
415         __le16 prob_rsp_len;
416 } __packed __aligned(4);
417
418 enum {
419         BSS_INFO_BCN_CSA,
420         BSS_INFO_BCN_BCC,
421         BSS_INFO_BCN_MBSSID,
422         BSS_INFO_BCN_CONTENT,
423         BSS_INFO_BCN_DISCOV,
424         BSS_INFO_BCN_MAX
425 };
426
427 enum {
428         RATE_PARAM_FIXED = 3,
429         RATE_PARAM_MMPS_UPDATE = 5,
430         RATE_PARAM_FIXED_HE_LTF = 7,
431         RATE_PARAM_FIXED_MCS,
432         RATE_PARAM_FIXED_GI = 11,
433         RATE_PARAM_AUTO = 20,
434 };
435
436 #define RATE_CFG_MCS                    GENMASK(3, 0)
437 #define RATE_CFG_NSS                    GENMASK(7, 4)
438 #define RATE_CFG_GI                     GENMASK(11, 8)
439 #define RATE_CFG_BW                     GENMASK(15, 12)
440 #define RATE_CFG_STBC                   GENMASK(19, 16)
441 #define RATE_CFG_LDPC                   GENMASK(23, 20)
442 #define RATE_CFG_PHY_TYPE               GENMASK(27, 24)
443 #define RATE_CFG_HE_LTF                 GENMASK(31, 28)
444
445 enum {
446         THERMAL_PROTECT_PARAMETER_CTRL,
447         THERMAL_PROTECT_BASIC_INFO,
448         THERMAL_PROTECT_ENABLE,
449         THERMAL_PROTECT_DISABLE,
450         THERMAL_PROTECT_DUTY_CONFIG,
451         THERMAL_PROTECT_MECH_INFO,
452         THERMAL_PROTECT_DUTY_INFO,
453         THERMAL_PROTECT_STATE_ACT,
454 };
455
456 enum {
457         MT_BF_SOUNDING_ON = 1,
458         MT_BF_TYPE_UPDATE = 20,
459         MT_BF_MODULE_UPDATE = 25
460 };
461
462 enum {
463         MURU_SET_ARB_OP_MODE = 14,
464         MURU_SET_PLATFORM_TYPE = 25,
465 };
466
467 enum {
468         MURU_PLATFORM_TYPE_PERF_LEVEL_1 = 1,
469         MURU_PLATFORM_TYPE_PERF_LEVEL_2,
470 };
471
472 /* tx cmd tx statistics */
473 enum {
474         MURU_SET_TXC_TX_STATS_EN = 150,
475         MURU_GET_TXC_TX_STATS = 151,
476 };
477
478 enum {
479         SER_QUERY,
480         /* recovery */
481         SER_SET_RECOVER_L1,
482         SER_SET_RECOVER_L2,
483         SER_SET_RECOVER_L3_RX_ABORT,
484         SER_SET_RECOVER_L3_TX_ABORT,
485         SER_SET_RECOVER_L3_TX_DISABLE,
486         SER_SET_RECOVER_L3_BF,
487         /* action */
488         SER_ENABLE = 2,
489         SER_RECOVER
490 };
491
492 #define MT7915_BSS_UPDATE_MAX_SIZE      (sizeof(struct sta_req_hdr) +   \
493                                          sizeof(struct bss_info_omac) + \
494                                          sizeof(struct bss_info_basic) +\
495                                          sizeof(struct bss_info_rf_ch) +\
496                                          sizeof(struct bss_info_ra) +   \
497                                          sizeof(struct bss_info_hw_amsdu) +\
498                                          sizeof(struct bss_info_he) +   \
499                                          sizeof(struct bss_info_bmc_rate) +\
500                                          sizeof(struct bss_info_ext_bss))
501
502 #define MT7915_BEACON_UPDATE_SIZE       (sizeof(struct sta_req_hdr) +   \
503                                          sizeof(struct bss_info_bcn_cntdwn) + \
504                                          sizeof(struct bss_info_bcn_mbss) + \
505                                          sizeof(struct bss_info_bcn_cont) + \
506                                          sizeof(struct bss_info_inband_discovery))
507
508 #endif