mt76: mt7615: add support for applying tx DPD calibration from EEPROM
[linux-2.6-microblaze.git] / drivers / net / wireless / mediatek / mt76 / mt7615 / mcu.h
1 /* SPDX-License-Identifier: ISC */
2 /* Copyright (C) 2019 MediaTek Inc. */
3
4 #ifndef __MT7615_MCU_H
5 #define __MT7615_MCU_H
6
7 struct mt7615_mcu_txd {
8         __le32 txd[8];
9
10         __le16 len;
11         __le16 pq_id;
12
13         u8 cid;
14         u8 pkt_type;
15         u8 set_query; /* FW don't care */
16         u8 seq;
17
18         u8 uc_d2b0_rev;
19         u8 ext_cid;
20         u8 s2d_index;
21         u8 ext_cid_ack;
22
23         u32 reserved[5];
24 } __packed __aligned(4);
25
26 /**
27  * struct mt7615_uni_txd - mcu command descriptor for firmware v3
28  * @txd: hardware descriptor
29  * @len: total length not including txd
30  * @cid: command identifier
31  * @pkt_type: must be 0xa0 (cmd packet by long format)
32  * @frag_n: fragment number
33  * @seq: sequence number
34  * @checksum: 0 mean there is no checksum
35  * @s2d_index: index for command source and destination
36  *  Definition              | value | note
37  *  CMD_S2D_IDX_H2N         | 0x00  | command from HOST to WM
38  *  CMD_S2D_IDX_C2N         | 0x01  | command from WA to WM
39  *  CMD_S2D_IDX_H2C         | 0x02  | command from HOST to WA
40  *  CMD_S2D_IDX_H2N_AND_H2C | 0x03  | command from HOST to WA and WM
41  *
42  * @option: command option
43  *  BIT[0]: UNI_CMD_OPT_BIT_ACK
44  *          set to 1 to request a fw reply
45  *          if UNI_CMD_OPT_BIT_0_ACK is set and UNI_CMD_OPT_BIT_2_SET_QUERY
46  *          is set, mcu firmware will send response event EID = 0x01
47  *          (UNI_EVENT_ID_CMD_RESULT) to the host.
48  *  BIT[1]: UNI_CMD_OPT_BIT_UNI_CMD
49  *          0: original command
50  *          1: unified command
51  *  BIT[2]: UNI_CMD_OPT_BIT_SET_QUERY
52  *          0: QUERY command
53  *          1: SET command
54  */
55 struct mt7615_uni_txd {
56         __le32 txd[8];
57
58         /* DW1 */
59         __le16 len;
60         __le16 cid;
61
62         /* DW2 */
63         u8 reserved;
64         u8 pkt_type;
65         u8 frag_n;
66         u8 seq;
67
68         /* DW3 */
69         __le16 checksum;
70         u8 s2d_index;
71         u8 option;
72
73         /* DW4 */
74         u8 reserved2[4];
75 } __packed __aligned(4);
76
77 /* event table */
78 enum {
79         MCU_EVENT_TARGET_ADDRESS_LEN = 0x01,
80         MCU_EVENT_FW_START = 0x01,
81         MCU_EVENT_GENERIC = 0x01,
82         MCU_EVENT_ACCESS_REG = 0x02,
83         MCU_EVENT_MT_PATCH_SEM = 0x04,
84         MCU_EVENT_SCAN_DONE = 0x0d,
85         MCU_EVENT_BSS_ABSENCE  = 0x11,
86         MCU_EVENT_CH_PRIVILEGE = 0x18,
87         MCU_EVENT_SCHED_SCAN_DONE = 0x23,
88         MCU_EVENT_EXT = 0xed,
89         MCU_EVENT_RESTART_DL = 0xef,
90 };
91
92 /* ext event table */
93 enum {
94         MCU_EXT_EVENT_PS_SYNC = 0x5,
95         MCU_EXT_EVENT_FW_LOG_2_HOST = 0x13,
96         MCU_EXT_EVENT_THERMAL_PROTECT = 0x22,
97         MCU_EXT_EVENT_ASSERT_DUMP = 0x23,
98         MCU_EXT_EVENT_RDD_REPORT = 0x3a,
99         MCU_EXT_EVENT_CSA_NOTIFY = 0x4f,
100 };
101
102 enum {
103     MT_SKU_CCK_1_2 = 0,
104     MT_SKU_CCK_55_11,
105     MT_SKU_OFDM_6_9,
106     MT_SKU_OFDM_12_18,
107     MT_SKU_OFDM_24_36,
108     MT_SKU_OFDM_48,
109     MT_SKU_OFDM_54,
110     MT_SKU_HT20_0_8,
111     MT_SKU_HT20_32,
112     MT_SKU_HT20_1_2_9_10,
113     MT_SKU_HT20_3_4_11_12,
114     MT_SKU_HT20_5_13,
115     MT_SKU_HT20_6_14,
116     MT_SKU_HT20_7_15,
117     MT_SKU_HT40_0_8,
118     MT_SKU_HT40_32,
119     MT_SKU_HT40_1_2_9_10,
120     MT_SKU_HT40_3_4_11_12,
121     MT_SKU_HT40_5_13,
122     MT_SKU_HT40_6_14,
123     MT_SKU_HT40_7_15,
124     MT_SKU_VHT20_0,
125     MT_SKU_VHT20_1_2,
126     MT_SKU_VHT20_3_4,
127     MT_SKU_VHT20_5_6,
128     MT_SKU_VHT20_7,
129     MT_SKU_VHT20_8,
130     MT_SKU_VHT20_9,
131     MT_SKU_VHT40_0,
132     MT_SKU_VHT40_1_2,
133     MT_SKU_VHT40_3_4,
134     MT_SKU_VHT40_5_6,
135     MT_SKU_VHT40_7,
136     MT_SKU_VHT40_8,
137     MT_SKU_VHT40_9,
138     MT_SKU_VHT80_0,
139     MT_SKU_VHT80_1_2,
140     MT_SKU_VHT80_3_4,
141     MT_SKU_VHT80_5_6,
142     MT_SKU_VHT80_7,
143     MT_SKU_VHT80_8,
144     MT_SKU_VHT80_9,
145     MT_SKU_VHT160_0,
146     MT_SKU_VHT160_1_2,
147     MT_SKU_VHT160_3_4,
148     MT_SKU_VHT160_5_6,
149     MT_SKU_VHT160_7,
150     MT_SKU_VHT160_8,
151     MT_SKU_VHT160_9,
152     MT_SKU_1SS_DELTA,
153     MT_SKU_2SS_DELTA,
154     MT_SKU_3SS_DELTA,
155     MT_SKU_4SS_DELTA,
156 };
157
158 struct mt7615_mcu_rxd {
159         __le32 rxd[4];
160
161         __le16 len;
162         __le16 pkt_type_id;
163
164         u8 eid;
165         u8 seq;
166         __le16 __rsv;
167
168         u8 ext_eid;
169         u8 __rsv1[2];
170         u8 s2d_index;
171 };
172
173 struct mt7615_mcu_rdd_report {
174         struct mt7615_mcu_rxd rxd;
175
176         u8 idx;
177         u8 long_detected;
178         u8 constant_prf_detected;
179         u8 staggered_prf_detected;
180         u8 radar_type_idx;
181         u8 periodic_pulse_num;
182         u8 long_pulse_num;
183         u8 hw_pulse_num;
184
185         u8 out_lpn;
186         u8 out_spn;
187         u8 out_crpn;
188         u8 out_crpw;
189         u8 out_crbn;
190         u8 out_stgpn;
191         u8 out_stgpw;
192
193         u8 _rsv[2];
194
195         __le32 out_pri_const;
196         __le32 out_pri_stg[3];
197
198         struct {
199                 __le32 start;
200                 __le16 pulse_width;
201                 __le16 pulse_power;
202         } long_pulse[32];
203
204         struct {
205                 __le32 start;
206                 __le16 pulse_width;
207                 __le16 pulse_power;
208         } periodic_pulse[32];
209
210         struct {
211                 __le32 start;
212                 __le16 pulse_width;
213                 __le16 pulse_power;
214                 u8 sc_pass;
215                 u8 sw_reset;
216         } hw_pulse[32];
217 };
218
219 #define MCU_PQ_ID(p, q)         (((p) << 15) | ((q) << 10))
220 #define MCU_PKT_ID              0xa0
221
222 enum {
223         MCU_Q_QUERY,
224         MCU_Q_SET,
225         MCU_Q_RESERVED,
226         MCU_Q_NA
227 };
228
229 enum {
230         MCU_S2D_H2N,
231         MCU_S2D_C2N,
232         MCU_S2D_H2C,
233         MCU_S2D_H2CN
234 };
235
236 #define MCU_FW_PREFIX           BIT(31)
237 #define MCU_UNI_PREFIX          BIT(30)
238 #define MCU_CE_PREFIX           BIT(29)
239 #define MCU_CMD_MASK            ~(MCU_FW_PREFIX | MCU_UNI_PREFIX |      \
240                                   MCU_CE_PREFIX)
241
242 enum {
243         MCU_CMD_TARGET_ADDRESS_LEN_REQ = MCU_FW_PREFIX | 0x01,
244         MCU_CMD_FW_START_REQ = MCU_FW_PREFIX | 0x02,
245         MCU_CMD_INIT_ACCESS_REG = 0x3,
246         MCU_CMD_PATCH_START_REQ = 0x05,
247         MCU_CMD_PATCH_FINISH_REQ = MCU_FW_PREFIX | 0x07,
248         MCU_CMD_PATCH_SEM_CONTROL = MCU_FW_PREFIX | 0x10,
249         MCU_CMD_EXT_CID = 0xED,
250         MCU_CMD_FW_SCATTER = MCU_FW_PREFIX | 0xEE,
251         MCU_CMD_RESTART_DL_REQ = MCU_FW_PREFIX | 0xEF,
252 };
253
254 enum {
255         MCU_EXT_CMD_PM_STATE_CTRL = 0x07,
256         MCU_EXT_CMD_CHANNEL_SWITCH = 0x08,
257         MCU_EXT_CMD_SET_TX_POWER_CTRL = 0x11,
258         MCU_EXT_CMD_FW_LOG_2_HOST = 0x13,
259         MCU_EXT_CMD_EFUSE_BUFFER_MODE = 0x21,
260         MCU_EXT_CMD_STA_REC_UPDATE = 0x25,
261         MCU_EXT_CMD_BSS_INFO_UPDATE = 0x26,
262         MCU_EXT_CMD_EDCA_UPDATE = 0x27,
263         MCU_EXT_CMD_DEV_INFO_UPDATE = 0x2A,
264         MCU_EXT_CMD_GET_TEMP = 0x2c,
265         MCU_EXT_CMD_WTBL_UPDATE = 0x32,
266         MCU_EXT_CMD_SET_RDD_CTRL = 0x3a,
267         MCU_EXT_CMD_PROTECT_CTRL = 0x3e,
268         MCU_EXT_CMD_DBDC_CTRL = 0x45,
269         MCU_EXT_CMD_MAC_INIT_CTRL = 0x46,
270         MCU_EXT_CMD_BCN_OFFLOAD = 0x49,
271         MCU_EXT_CMD_SET_RX_PATH = 0x4e,
272         MCU_EXT_CMD_TX_POWER_FEATURE_CTRL = 0x58,
273         MCU_EXT_CMD_RXDCOC_CAL = 0x59,
274         MCU_EXT_CMD_TXDPD_CAL = 0x60,
275         MCU_EXT_CMD_SET_RDD_TH = 0x7c,
276         MCU_EXT_CMD_SET_RDD_PATTERN = 0x7d,
277 };
278
279 enum {
280         MCU_UNI_CMD_DEV_INFO_UPDATE = MCU_UNI_PREFIX | 0x01,
281         MCU_UNI_CMD_BSS_INFO_UPDATE = MCU_UNI_PREFIX | 0x02,
282         MCU_UNI_CMD_STA_REC_UPDATE = MCU_UNI_PREFIX | 0x03,
283 };
284
285 struct mt7615_mcu_scan_ssid {
286         __le32 ssid_len;
287         u8 ssid[IEEE80211_MAX_SSID_LEN];
288 } __packed;
289
290 struct mt7615_mcu_scan_channel {
291         u8 band; /* 1: 2.4GHz
292                   * 2: 5.0GHz
293                   * Others: Reserved
294                   */
295         u8 channel_num;
296 } __packed;
297
298 struct mt7615_mcu_scan_match {
299         __le32 rssi_th;
300         u8 ssid[IEEE80211_MAX_SSID_LEN];
301         u8 ssid_len;
302         u8 rsv[3];
303 } __packed;
304
305 struct mt7615_hw_scan_req {
306         u8 seq_num;
307         u8 bss_idx;
308         u8 scan_type; /* 0: PASSIVE SCAN
309                        * 1: ACTIVE SCAN
310                        */
311         u8 ssid_type; /* BIT(0) wildcard SSID
312                        * BIT(1) P2P wildcard SSID
313                        * BIT(2) specified SSID
314                        */
315         u8 ssids_num;
316         u8 probe_req_num; /* Number of probe request for each SSID */
317         u8 scan_func; /* BIT(0) Enable random MAC scan
318                        * BIT(1) Disable DBDC scan type 1~3.
319                        * BIT(2) Use DBDC scan type 3 (dedicated one RF to scan).
320                        */
321         u8 version; /* 0: Not support fields after ies.
322                      * 1: Support fields after ies.
323                      */
324         struct mt7615_mcu_scan_ssid ssids[4];
325         __le16 probe_delay_time;
326         __le16 channel_dwell_time; /* channel Dwell interval */
327         __le16 timeout_value;
328         u8 channel_type; /* 0: Full channels
329                           * 1: Only 2.4GHz channels
330                           * 2: Only 5GHz channels
331                           * 3: P2P social channel only (channel #1, #6 and #11)
332                           * 4: Specified channels
333                           * Others: Reserved
334                           */
335         u8 channels_num; /* valid when channel_type is 4 */
336         /* valid when channels_num is set */
337         struct mt7615_mcu_scan_channel channels[32];
338         __le16 ies_len;
339         u8 ies[MT7615_SCAN_IE_LEN];
340         /* following fields are valid if version > 0 */
341         u8 ext_channels_num;
342         u8 ext_ssids_num;
343         __le16 channel_min_dwell_time;
344         struct mt7615_mcu_scan_channel ext_channels[32];
345         struct mt7615_mcu_scan_ssid ext_ssids[6];
346         u8 bssid[ETH_ALEN];
347         u8 random_mac[ETH_ALEN]; /* valid when BIT(1) in scan_func is set. */
348         u8 pad[64];
349 } __packed;
350
351 #define SCAN_DONE_EVENT_MAX_CHANNEL_NUM 64
352 struct mt7615_hw_scan_done {
353         u8 seq_num;
354         u8 sparse_channel_num;
355         struct mt7615_mcu_scan_channel sparse_channel;
356         u8 complete_channel_num;
357         u8 current_state;
358         u8 version;
359         u8 pad;
360         __le32 beacon_scan_num;
361         u8 pno_enabled;
362         u8 pad2[3];
363         u8 sparse_channel_valid_num;
364         u8 pad3[3];
365         u8 channel_num[SCAN_DONE_EVENT_MAX_CHANNEL_NUM];
366         /* idle format for channel_idle_time
367          * 0: first bytes: idle time(ms) 2nd byte: dwell time(ms)
368          * 1: first bytes: idle time(8ms) 2nd byte: dwell time(8ms)
369          * 2: dwell time (16us)
370          */
371         __le16 channel_idle_time[SCAN_DONE_EVENT_MAX_CHANNEL_NUM];
372         /* beacon and probe response count */
373         u8 beacon_probe_num[SCAN_DONE_EVENT_MAX_CHANNEL_NUM];
374         u8 mdrdy_count[SCAN_DONE_EVENT_MAX_CHANNEL_NUM];
375         __le32 beacon_2g_num;
376         __le32 beacon_5g_num;
377 } __packed;
378
379 struct mt7615_sched_scan_req {
380         u8 version;
381         u8 seq_num;
382         u8 stop_on_match;
383         u8 ssids_num;
384         u8 match_num;
385         u8 pad;
386         __le16 ie_len;
387         struct mt7615_mcu_scan_ssid ssids[MT7615_MAX_SCHED_SCAN_SSID];
388         struct mt7615_mcu_scan_match match[MT7615_MAX_SCAN_MATCH];
389         u8 channel_type;
390         u8 channels_num;
391         u8 intervals_num;
392         u8 scan_func;
393         struct mt7615_mcu_scan_channel channels[64];
394         __le16 intervals[MT7615_MAX_SCHED_SCAN_INTERVAL];
395         u8 pad2[64];
396 } __packed;
397
398 struct nt7615_sched_scan_done {
399         u8 seq_num;
400         u8 status; /* 0: ssid found */
401         __le16 pad;
402 } __packed;
403
404 struct mt7615_mcu_bss_event {
405         u8 bss_idx;
406         u8 is_absent;
407         u8 free_quota;
408         u8 pad;
409 } __packed;
410
411 /* offload mcu commands */
412 enum {
413         MCU_CMD_START_HW_SCAN = MCU_CE_PREFIX | 0x03,
414         MCU_CMD_SET_CHAN_DOMAIN = MCU_CE_PREFIX | 0x0f,
415         MCU_CMD_CANCEL_HW_SCAN = MCU_CE_PREFIX | 0x1b,
416         MCU_CMD_SCHED_SCAN_ENABLE = MCU_CE_PREFIX | 0x61,
417         MCU_CMD_SCHED_SCAN_REQ = MCU_CE_PREFIX | 0x62,
418 };
419
420 #define MCU_CMD_ACK             BIT(0)
421 #define MCU_CMD_UNI             BIT(1)
422 #define MCU_CMD_QUERY           BIT(2)
423
424 #define MCU_CMD_UNI_EXT_ACK     (MCU_CMD_ACK | MCU_CMD_UNI | MCU_CMD_QUERY)
425
426 enum {
427         UNI_BSS_INFO_BASIC = 0,
428         UNI_BSS_INFO_RLM = 2,
429         UNI_BSS_INFO_BCN_CONTENT = 7,
430 };
431
432 enum {
433         PATCH_SEM_RELEASE = 0x0,
434         PATCH_SEM_GET     = 0x1
435 };
436
437 enum {
438         PATCH_NOT_DL_SEM_FAIL    = 0x0,
439         PATCH_IS_DL              = 0x1,
440         PATCH_NOT_DL_SEM_SUCCESS = 0x2,
441         PATCH_REL_SEM_SUCCESS    = 0x3
442 };
443
444 enum {
445         FW_STATE_INITIAL          = 0,
446         FW_STATE_FW_DOWNLOAD      = 1,
447         FW_STATE_NORMAL_OPERATION = 2,
448         FW_STATE_NORMAL_TRX       = 3,
449         FW_STATE_CR4_RDY          = 7
450 };
451
452 #define STA_TYPE_STA            BIT(0)
453 #define STA_TYPE_AP             BIT(1)
454 #define STA_TYPE_ADHOC          BIT(2)
455 #define STA_TYPE_WDS            BIT(4)
456 #define STA_TYPE_BC             BIT(5)
457
458 #define NETWORK_INFRA           BIT(16)
459 #define NETWORK_P2P             BIT(17)
460 #define NETWORK_IBSS            BIT(18)
461 #define NETWORK_WDS             BIT(21)
462
463 #define CONNECTION_INFRA_STA    (STA_TYPE_STA | NETWORK_INFRA)
464 #define CONNECTION_INFRA_AP     (STA_TYPE_AP | NETWORK_INFRA)
465 #define CONNECTION_P2P_GC       (STA_TYPE_STA | NETWORK_P2P)
466 #define CONNECTION_P2P_GO       (STA_TYPE_AP | NETWORK_P2P)
467 #define CONNECTION_IBSS_ADHOC   (STA_TYPE_ADHOC | NETWORK_IBSS)
468 #define CONNECTION_WDS          (STA_TYPE_WDS | NETWORK_WDS)
469 #define CONNECTION_INFRA_BC     (STA_TYPE_BC | NETWORK_INFRA)
470
471 #define CONN_STATE_DISCONNECT   0
472 #define CONN_STATE_CONNECT      1
473 #define CONN_STATE_PORT_SECURE  2
474
475 enum {
476         DEV_INFO_ACTIVE,
477         DEV_INFO_MAX_NUM
478 };
479
480 enum {
481         DBDC_TYPE_WMM,
482         DBDC_TYPE_MGMT,
483         DBDC_TYPE_BSS,
484         DBDC_TYPE_MBSS,
485         DBDC_TYPE_REPEATER,
486         DBDC_TYPE_MU,
487         DBDC_TYPE_BF,
488         DBDC_TYPE_PTA,
489         __DBDC_TYPE_MAX,
490 };
491
492 struct tlv {
493         __le16 tag;
494         __le16 len;
495 } __packed;
496
497 struct bss_info_omac {
498         __le16 tag;
499         __le16 len;
500         u8 hw_bss_idx;
501         u8 omac_idx;
502         u8 band_idx;
503         u8 rsv0;
504         __le32 conn_type;
505         u32 rsv1;
506 } __packed;
507
508 struct bss_info_basic {
509         __le16 tag;
510         __le16 len;
511         __le32 network_type;
512         u8 active;
513         u8 rsv0;
514         __le16 bcn_interval;
515         u8 bssid[ETH_ALEN];
516         u8 wmm_idx;
517         u8 dtim_period;
518         u8 bmc_tx_wlan_idx;
519         u8 cipher; /* not used */
520         u8 phymode; /* not used */
521         u8 rsv1[5];
522 } __packed;
523
524 struct bss_info_rf_ch {
525         __le16 tag;
526         __le16 len;
527         u8 pri_ch;
528         u8 central_ch0;
529         u8 central_ch1;
530         u8 bw;
531 } __packed;
532
533 struct bss_info_ext_bss {
534         __le16 tag;
535         __le16 len;
536         __le32 mbss_tsf_offset; /* in unit of us */
537         u8 rsv[8];
538 } __packed;
539
540 enum {
541         BSS_INFO_OMAC,
542         BSS_INFO_BASIC,
543         BSS_INFO_RF_CH, /* optional, for BT/LTE coex */
544         BSS_INFO_PM, /* sta only */
545         BSS_INFO_UAPSD, /* sta only */
546         BSS_INFO_ROAM_DETECTION, /* obsoleted */
547         BSS_INFO_LQ_RM, /* obsoleted */
548         BSS_INFO_EXT_BSS,
549         BSS_INFO_BMC_INFO, /* for bmc rate control in CR4 */
550         BSS_INFO_SYNC_MODE, /* obsoleted */
551         BSS_INFO_RA,
552         BSS_INFO_MAX_NUM
553 };
554
555 enum {
556         WTBL_RESET_AND_SET = 1,
557         WTBL_SET,
558         WTBL_QUERY,
559         WTBL_RESET_ALL
560 };
561
562 struct wtbl_req_hdr {
563         u8 wlan_idx;
564         u8 operation;
565         __le16 tlv_num;
566         u8 rsv[4];
567 } __packed;
568
569 struct wtbl_generic {
570         __le16 tag;
571         __le16 len;
572         u8 peer_addr[ETH_ALEN];
573         u8 muar_idx;
574         u8 skip_tx;
575         u8 cf_ack;
576         u8 qos;
577         u8 mesh;
578         u8 adm;
579         __le16 partial_aid;
580         u8 baf_en;
581         u8 aad_om;
582 } __packed;
583
584 struct wtbl_rx {
585         __le16 tag;
586         __le16 len;
587         u8 rcid;
588         u8 rca1;
589         u8 rca2;
590         u8 rv;
591         u8 rsv[4];
592 } __packed;
593
594 struct wtbl_ht {
595         __le16 tag;
596         __le16 len;
597         u8 ht;
598         u8 ldpc;
599         u8 af;
600         u8 mm;
601         u8 rsv[4];
602 } __packed;
603
604 struct wtbl_vht {
605         __le16 tag;
606         __le16 len;
607         u8 ldpc;
608         u8 dyn_bw;
609         u8 vht;
610         u8 txop_ps;
611         u8 rsv[4];
612 } __packed;
613
614 struct wtbl_tx_ps {
615         __le16 tag;
616         __le16 len;
617         u8 txps;
618         u8 rsv[3];
619 } __packed;
620
621 struct wtbl_hdr_trans {
622         __le16 tag;
623         __le16 len;
624         u8 to_ds;
625         u8 from_ds;
626         u8 disable_rx_trans;
627         u8 rsv;
628 } __packed;
629
630 enum {
631         MT_BA_TYPE_INVALID,
632         MT_BA_TYPE_ORIGINATOR,
633         MT_BA_TYPE_RECIPIENT
634 };
635
636 enum {
637         RST_BA_MAC_TID_MATCH,
638         RST_BA_MAC_MATCH,
639         RST_BA_NO_MATCH
640 };
641
642 struct wtbl_ba {
643         __le16 tag;
644         __le16 len;
645         /* common */
646         u8 tid;
647         u8 ba_type;
648         u8 rsv0[2];
649         /* originator only */
650         __le16 sn;
651         u8 ba_en;
652         u8 ba_winsize_idx;
653         __le16 ba_winsize;
654         /* recipient only */
655         u8 peer_addr[ETH_ALEN];
656         u8 rst_ba_tid;
657         u8 rst_ba_sel;
658         u8 rst_ba_sb;
659         u8 band_idx;
660         u8 rsv1[4];
661 } __packed;
662
663 struct wtbl_bf {
664         __le16 tag;
665         __le16 len;
666         u8 ibf;
667         u8 ebf;
668         u8 ibf_vht;
669         u8 ebf_vht;
670         u8 gid;
671         u8 pfmu_idx;
672         u8 rsv[2];
673 } __packed;
674
675 struct wtbl_smps {
676         __le16 tag;
677         __le16 len;
678         u8 smps;
679         u8 rsv[3];
680 } __packed;
681
682 struct wtbl_pn {
683         __le16 tag;
684         __le16 len;
685         u8 pn[6];
686         u8 rsv[2];
687 } __packed;
688
689 struct wtbl_spe {
690         __le16 tag;
691         __le16 len;
692         u8 spe_idx;
693         u8 rsv[3];
694 } __packed;
695
696 struct wtbl_raw {
697         __le16 tag;
698         __le16 len;
699         u8 wtbl_idx;
700         u8 dw;
701         u8 rsv[2];
702         __le32 msk;
703         __le32 val;
704 } __packed;
705
706 #define MT7615_WTBL_UPDATE_MAX_SIZE     (sizeof(struct wtbl_req_hdr) +  \
707                                          sizeof(struct wtbl_generic) +  \
708                                          sizeof(struct wtbl_rx) +       \
709                                          sizeof(struct wtbl_ht) +       \
710                                          sizeof(struct wtbl_vht) +      \
711                                          sizeof(struct wtbl_tx_ps) +    \
712                                          sizeof(struct wtbl_hdr_trans) +\
713                                          sizeof(struct wtbl_ba) +       \
714                                          sizeof(struct wtbl_bf) +       \
715                                          sizeof(struct wtbl_smps) +     \
716                                          sizeof(struct wtbl_pn) +       \
717                                          sizeof(struct wtbl_spe))
718
719 #define MT7615_STA_UPDATE_MAX_SIZE      (sizeof(struct sta_req_hdr) +   \
720                                          sizeof(struct sta_rec_basic) + \
721                                          sizeof(struct sta_rec_ht) +    \
722                                          sizeof(struct sta_rec_vht) +   \
723                                          sizeof(struct tlv) +   \
724                                          MT7615_WTBL_UPDATE_MAX_SIZE)
725
726 #define MT7615_WTBL_UPDATE_BA_SIZE      (sizeof(struct wtbl_req_hdr) +  \
727                                          sizeof(struct wtbl_ba))
728
729 enum {
730         WTBL_GENERIC,
731         WTBL_RX,
732         WTBL_HT,
733         WTBL_VHT,
734         WTBL_PEER_PS, /* not used */
735         WTBL_TX_PS,
736         WTBL_HDR_TRANS,
737         WTBL_SEC_KEY,
738         WTBL_BA,
739         WTBL_RDG, /* obsoleted */
740         WTBL_PROTECT, /* not used */
741         WTBL_CLEAR, /* not used */
742         WTBL_BF,
743         WTBL_SMPS,
744         WTBL_RAW_DATA, /* debug only */
745         WTBL_PN,
746         WTBL_SPE,
747         WTBL_MAX_NUM
748 };
749
750 struct sta_ntlv_hdr {
751         u8 rsv[2];
752         __le16 tlv_num;
753 } __packed;
754
755 struct sta_req_hdr {
756         u8 bss_idx;
757         u8 wlan_idx;
758         __le16 tlv_num;
759         u8 is_tlv_append;
760         u8 muar_idx;
761         u8 rsv[2];
762 } __packed;
763
764 struct sta_rec_state {
765         __le16 tag;
766         __le16 len;
767         u8 state;
768         __le32 flags;
769         u8 vhtop;
770         u8 pad[2];
771 } __packed;
772
773 struct sta_rec_basic {
774         __le16 tag;
775         __le16 len;
776         __le32 conn_type;
777         u8 conn_state;
778         u8 qos;
779         __le16 aid;
780         u8 peer_addr[ETH_ALEN];
781 #define EXTRA_INFO_VER  BIT(0)
782 #define EXTRA_INFO_NEW  BIT(1)
783         __le16 extra_info;
784 } __packed;
785
786 struct sta_rec_ht {
787         __le16 tag;
788         __le16 len;
789         __le16 ht_cap;
790         u16 rsv;
791 } __packed;
792
793 struct sta_rec_vht {
794         __le16 tag;
795         __le16 len;
796         __le32 vht_cap;
797         __le16 vht_rx_mcs_map;
798         __le16 vht_tx_mcs_map;
799 } __packed;
800
801 struct sta_rec_ba {
802         __le16 tag;
803         __le16 len;
804         u8 tid;
805         u8 ba_type;
806         u8 amsdu;
807         u8 ba_en;
808         __le16 ssn;
809         __le16 winsize;
810 } __packed;
811
812 enum {
813         STA_REC_BASIC,
814         STA_REC_RA,
815         STA_REC_RA_CMM_INFO,
816         STA_REC_RA_UPDATE,
817         STA_REC_BF,
818         STA_REC_AMSDU, /* for CR4 */
819         STA_REC_BA,
820         STA_REC_STATE,
821         STA_REC_TX_PROC, /* for hdr trans and CSO in CR4 */
822         STA_REC_HT,
823         STA_REC_VHT,
824         STA_REC_APPS,
825         STA_REC_WTBL = 13,
826         STA_REC_MAX_NUM
827 };
828
829 enum {
830         CMD_CBW_20MHZ,
831         CMD_CBW_40MHZ,
832         CMD_CBW_80MHZ,
833         CMD_CBW_160MHZ,
834         CMD_CBW_10MHZ,
835         CMD_CBW_5MHZ,
836         CMD_CBW_8080MHZ
837 };
838
839 enum {
840         CH_SWITCH_NORMAL = 0,
841         CH_SWITCH_SCAN = 3,
842         CH_SWITCH_MCC = 4,
843         CH_SWITCH_DFS = 5,
844         CH_SWITCH_BACKGROUND_SCAN_START = 6,
845         CH_SWITCH_BACKGROUND_SCAN_RUNNING = 7,
846         CH_SWITCH_BACKGROUND_SCAN_STOP = 8,
847         CH_SWITCH_SCAN_BYPASS_DPD = 9
848 };
849
850 #endif