xref: /freebsd/sys/contrib/dev/mediatek/mt76/mt7615/mcu.h (revision cbb3ec25236ba72f91cbdf23f8b78b9d1af0cedf)
1*6c92544dSBjoern A. Zeeb /* SPDX-License-Identifier: ISC */
2*6c92544dSBjoern A. Zeeb /* Copyright (C) 2019 MediaTek Inc. */
3*6c92544dSBjoern A. Zeeb 
4*6c92544dSBjoern A. Zeeb #ifndef __MT7615_MCU_H
5*6c92544dSBjoern A. Zeeb #define __MT7615_MCU_H
6*6c92544dSBjoern A. Zeeb 
7*6c92544dSBjoern A. Zeeb #include "../mt76_connac_mcu.h"
8*6c92544dSBjoern A. Zeeb 
9*6c92544dSBjoern A. Zeeb struct mt7615_mcu_txd {
10*6c92544dSBjoern A. Zeeb 	__le32 txd[8];
11*6c92544dSBjoern A. Zeeb 
12*6c92544dSBjoern A. Zeeb 	__le16 len;
13*6c92544dSBjoern A. Zeeb 	__le16 pq_id;
14*6c92544dSBjoern A. Zeeb 
15*6c92544dSBjoern A. Zeeb 	u8 cid;
16*6c92544dSBjoern A. Zeeb 	u8 pkt_type;
17*6c92544dSBjoern A. Zeeb 	u8 set_query; /* FW don't care */
18*6c92544dSBjoern A. Zeeb 	u8 seq;
19*6c92544dSBjoern A. Zeeb 
20*6c92544dSBjoern A. Zeeb 	u8 uc_d2b0_rev;
21*6c92544dSBjoern A. Zeeb 	u8 ext_cid;
22*6c92544dSBjoern A. Zeeb 	u8 s2d_index;
23*6c92544dSBjoern A. Zeeb 	u8 ext_cid_ack;
24*6c92544dSBjoern A. Zeeb 
25*6c92544dSBjoern A. Zeeb 	u32 reserved[5];
26*6c92544dSBjoern A. Zeeb } __packed __aligned(4);
27*6c92544dSBjoern A. Zeeb 
28*6c92544dSBjoern A. Zeeb /**
29*6c92544dSBjoern A. Zeeb  * struct mt7615_uni_txd - mcu command descriptor for firmware v3
30*6c92544dSBjoern A. Zeeb  * @txd: hardware descriptor
31*6c92544dSBjoern A. Zeeb  * @len: total length not including txd
32*6c92544dSBjoern A. Zeeb  * @cid: command identifier
33*6c92544dSBjoern A. Zeeb  * @pkt_type: must be 0xa0 (cmd packet by long format)
34*6c92544dSBjoern A. Zeeb  * @frag_n: fragment number
35*6c92544dSBjoern A. Zeeb  * @seq: sequence number
36*6c92544dSBjoern A. Zeeb  * @checksum: 0 mean there is no checksum
37*6c92544dSBjoern A. Zeeb  * @s2d_index: index for command source and destination
38*6c92544dSBjoern A. Zeeb  *  Definition              | value | note
39*6c92544dSBjoern A. Zeeb  *  CMD_S2D_IDX_H2N         | 0x00  | command from HOST to WM
40*6c92544dSBjoern A. Zeeb  *  CMD_S2D_IDX_C2N         | 0x01  | command from WA to WM
41*6c92544dSBjoern A. Zeeb  *  CMD_S2D_IDX_H2C         | 0x02  | command from HOST to WA
42*6c92544dSBjoern A. Zeeb  *  CMD_S2D_IDX_H2N_AND_H2C | 0x03  | command from HOST to WA and WM
43*6c92544dSBjoern A. Zeeb  *
44*6c92544dSBjoern A. Zeeb  * @option: command option
45*6c92544dSBjoern A. Zeeb  *  BIT[0]: UNI_CMD_OPT_BIT_ACK
46*6c92544dSBjoern A. Zeeb  *          set to 1 to request a fw reply
47*6c92544dSBjoern A. Zeeb  *          if UNI_CMD_OPT_BIT_0_ACK is set and UNI_CMD_OPT_BIT_2_SET_QUERY
48*6c92544dSBjoern A. Zeeb  *          is set, mcu firmware will send response event EID = 0x01
49*6c92544dSBjoern A. Zeeb  *          (UNI_EVENT_ID_CMD_RESULT) to the host.
50*6c92544dSBjoern A. Zeeb  *  BIT[1]: UNI_CMD_OPT_BIT_UNI_CMD
51*6c92544dSBjoern A. Zeeb  *          0: original command
52*6c92544dSBjoern A. Zeeb  *          1: unified command
53*6c92544dSBjoern A. Zeeb  *  BIT[2]: UNI_CMD_OPT_BIT_SET_QUERY
54*6c92544dSBjoern A. Zeeb  *          0: QUERY command
55*6c92544dSBjoern A. Zeeb  *          1: SET command
56*6c92544dSBjoern A. Zeeb  */
57*6c92544dSBjoern A. Zeeb struct mt7615_uni_txd {
58*6c92544dSBjoern A. Zeeb 	__le32 txd[8];
59*6c92544dSBjoern A. Zeeb 
60*6c92544dSBjoern A. Zeeb 	/* DW1 */
61*6c92544dSBjoern A. Zeeb 	__le16 len;
62*6c92544dSBjoern A. Zeeb 	__le16 cid;
63*6c92544dSBjoern A. Zeeb 
64*6c92544dSBjoern A. Zeeb 	/* DW2 */
65*6c92544dSBjoern A. Zeeb 	u8 reserved;
66*6c92544dSBjoern A. Zeeb 	u8 pkt_type;
67*6c92544dSBjoern A. Zeeb 	u8 frag_n;
68*6c92544dSBjoern A. Zeeb 	u8 seq;
69*6c92544dSBjoern A. Zeeb 
70*6c92544dSBjoern A. Zeeb 	/* DW3 */
71*6c92544dSBjoern A. Zeeb 	__le16 checksum;
72*6c92544dSBjoern A. Zeeb 	u8 s2d_index;
73*6c92544dSBjoern A. Zeeb 	u8 option;
74*6c92544dSBjoern A. Zeeb 
75*6c92544dSBjoern A. Zeeb 	/* DW4 */
76*6c92544dSBjoern A. Zeeb 	u8 reserved2[4];
77*6c92544dSBjoern A. Zeeb } __packed __aligned(4);
78*6c92544dSBjoern A. Zeeb 
79*6c92544dSBjoern A. Zeeb enum {
80*6c92544dSBjoern A. Zeeb     MT_SKU_CCK_1_2 = 0,
81*6c92544dSBjoern A. Zeeb     MT_SKU_CCK_55_11,
82*6c92544dSBjoern A. Zeeb     MT_SKU_OFDM_6_9,
83*6c92544dSBjoern A. Zeeb     MT_SKU_OFDM_12_18,
84*6c92544dSBjoern A. Zeeb     MT_SKU_OFDM_24_36,
85*6c92544dSBjoern A. Zeeb     MT_SKU_OFDM_48,
86*6c92544dSBjoern A. Zeeb     MT_SKU_OFDM_54,
87*6c92544dSBjoern A. Zeeb     MT_SKU_HT20_0_8,
88*6c92544dSBjoern A. Zeeb     MT_SKU_HT20_32,
89*6c92544dSBjoern A. Zeeb     MT_SKU_HT20_1_2_9_10,
90*6c92544dSBjoern A. Zeeb     MT_SKU_HT20_3_4_11_12,
91*6c92544dSBjoern A. Zeeb     MT_SKU_HT20_5_13,
92*6c92544dSBjoern A. Zeeb     MT_SKU_HT20_6_14,
93*6c92544dSBjoern A. Zeeb     MT_SKU_HT20_7_15,
94*6c92544dSBjoern A. Zeeb     MT_SKU_HT40_0_8,
95*6c92544dSBjoern A. Zeeb     MT_SKU_HT40_32,
96*6c92544dSBjoern A. Zeeb     MT_SKU_HT40_1_2_9_10,
97*6c92544dSBjoern A. Zeeb     MT_SKU_HT40_3_4_11_12,
98*6c92544dSBjoern A. Zeeb     MT_SKU_HT40_5_13,
99*6c92544dSBjoern A. Zeeb     MT_SKU_HT40_6_14,
100*6c92544dSBjoern A. Zeeb     MT_SKU_HT40_7_15,
101*6c92544dSBjoern A. Zeeb     MT_SKU_VHT20_0,
102*6c92544dSBjoern A. Zeeb     MT_SKU_VHT20_1_2,
103*6c92544dSBjoern A. Zeeb     MT_SKU_VHT20_3_4,
104*6c92544dSBjoern A. Zeeb     MT_SKU_VHT20_5_6,
105*6c92544dSBjoern A. Zeeb     MT_SKU_VHT20_7,
106*6c92544dSBjoern A. Zeeb     MT_SKU_VHT20_8,
107*6c92544dSBjoern A. Zeeb     MT_SKU_VHT20_9,
108*6c92544dSBjoern A. Zeeb     MT_SKU_VHT40_0,
109*6c92544dSBjoern A. Zeeb     MT_SKU_VHT40_1_2,
110*6c92544dSBjoern A. Zeeb     MT_SKU_VHT40_3_4,
111*6c92544dSBjoern A. Zeeb     MT_SKU_VHT40_5_6,
112*6c92544dSBjoern A. Zeeb     MT_SKU_VHT40_7,
113*6c92544dSBjoern A. Zeeb     MT_SKU_VHT40_8,
114*6c92544dSBjoern A. Zeeb     MT_SKU_VHT40_9,
115*6c92544dSBjoern A. Zeeb     MT_SKU_VHT80_0,
116*6c92544dSBjoern A. Zeeb     MT_SKU_VHT80_1_2,
117*6c92544dSBjoern A. Zeeb     MT_SKU_VHT80_3_4,
118*6c92544dSBjoern A. Zeeb     MT_SKU_VHT80_5_6,
119*6c92544dSBjoern A. Zeeb     MT_SKU_VHT80_7,
120*6c92544dSBjoern A. Zeeb     MT_SKU_VHT80_8,
121*6c92544dSBjoern A. Zeeb     MT_SKU_VHT80_9,
122*6c92544dSBjoern A. Zeeb     MT_SKU_VHT160_0,
123*6c92544dSBjoern A. Zeeb     MT_SKU_VHT160_1_2,
124*6c92544dSBjoern A. Zeeb     MT_SKU_VHT160_3_4,
125*6c92544dSBjoern A. Zeeb     MT_SKU_VHT160_5_6,
126*6c92544dSBjoern A. Zeeb     MT_SKU_VHT160_7,
127*6c92544dSBjoern A. Zeeb     MT_SKU_VHT160_8,
128*6c92544dSBjoern A. Zeeb     MT_SKU_VHT160_9,
129*6c92544dSBjoern A. Zeeb     MT_SKU_1SS_DELTA,
130*6c92544dSBjoern A. Zeeb     MT_SKU_2SS_DELTA,
131*6c92544dSBjoern A. Zeeb     MT_SKU_3SS_DELTA,
132*6c92544dSBjoern A. Zeeb     MT_SKU_4SS_DELTA,
133*6c92544dSBjoern A. Zeeb };
134*6c92544dSBjoern A. Zeeb 
135*6c92544dSBjoern A. Zeeb struct mt7615_mcu_rxd {
136*6c92544dSBjoern A. Zeeb 	__le32 rxd[4];
137*6c92544dSBjoern A. Zeeb 
138*6c92544dSBjoern A. Zeeb 	__le16 len;
139*6c92544dSBjoern A. Zeeb 	__le16 pkt_type_id;
140*6c92544dSBjoern A. Zeeb 
141*6c92544dSBjoern A. Zeeb 	u8 eid;
142*6c92544dSBjoern A. Zeeb 	u8 seq;
143*6c92544dSBjoern A. Zeeb 	__le16 __rsv;
144*6c92544dSBjoern A. Zeeb 
145*6c92544dSBjoern A. Zeeb 	u8 ext_eid;
146*6c92544dSBjoern A. Zeeb 	u8 __rsv1[2];
147*6c92544dSBjoern A. Zeeb 	u8 s2d_index;
148*6c92544dSBjoern A. Zeeb };
149*6c92544dSBjoern A. Zeeb 
150*6c92544dSBjoern A. Zeeb struct mt7615_mcu_csa_notify {
151*6c92544dSBjoern A. Zeeb 	struct mt7615_mcu_rxd rxd;
152*6c92544dSBjoern A. Zeeb 
153*6c92544dSBjoern A. Zeeb 	u8 omac_idx;
154*6c92544dSBjoern A. Zeeb 	u8 csa_count;
155*6c92544dSBjoern A. Zeeb 	u8 rsv[2];
156*6c92544dSBjoern A. Zeeb } __packed;
157*6c92544dSBjoern A. Zeeb 
158*6c92544dSBjoern A. Zeeb struct mt7615_mcu_rdd_report {
159*6c92544dSBjoern A. Zeeb 	struct mt7615_mcu_rxd rxd;
160*6c92544dSBjoern A. Zeeb 
161*6c92544dSBjoern A. Zeeb 	u8 band_idx;
162*6c92544dSBjoern A. Zeeb 	u8 long_detected;
163*6c92544dSBjoern A. Zeeb 	u8 constant_prf_detected;
164*6c92544dSBjoern A. Zeeb 	u8 staggered_prf_detected;
165*6c92544dSBjoern A. Zeeb 	u8 radar_type_idx;
166*6c92544dSBjoern A. Zeeb 	u8 periodic_pulse_num;
167*6c92544dSBjoern A. Zeeb 	u8 long_pulse_num;
168*6c92544dSBjoern A. Zeeb 	u8 hw_pulse_num;
169*6c92544dSBjoern A. Zeeb 
170*6c92544dSBjoern A. Zeeb 	u8 out_lpn;
171*6c92544dSBjoern A. Zeeb 	u8 out_spn;
172*6c92544dSBjoern A. Zeeb 	u8 out_crpn;
173*6c92544dSBjoern A. Zeeb 	u8 out_crpw;
174*6c92544dSBjoern A. Zeeb 	u8 out_crbn;
175*6c92544dSBjoern A. Zeeb 	u8 out_stgpn;
176*6c92544dSBjoern A. Zeeb 	u8 out_stgpw;
177*6c92544dSBjoern A. Zeeb 
178*6c92544dSBjoern A. Zeeb 	u8 _rsv[2];
179*6c92544dSBjoern A. Zeeb 
180*6c92544dSBjoern A. Zeeb 	__le32 out_pri_const;
181*6c92544dSBjoern A. Zeeb 	__le32 out_pri_stg[3];
182*6c92544dSBjoern A. Zeeb 
183*6c92544dSBjoern A. Zeeb 	struct {
184*6c92544dSBjoern A. Zeeb 		__le32 start;
185*6c92544dSBjoern A. Zeeb 		__le16 pulse_width;
186*6c92544dSBjoern A. Zeeb 		__le16 pulse_power;
187*6c92544dSBjoern A. Zeeb 	} long_pulse[32];
188*6c92544dSBjoern A. Zeeb 
189*6c92544dSBjoern A. Zeeb 	struct {
190*6c92544dSBjoern A. Zeeb 		__le32 start;
191*6c92544dSBjoern A. Zeeb 		__le16 pulse_width;
192*6c92544dSBjoern A. Zeeb 		__le16 pulse_power;
193*6c92544dSBjoern A. Zeeb 	} periodic_pulse[32];
194*6c92544dSBjoern A. Zeeb 
195*6c92544dSBjoern A. Zeeb 	struct {
196*6c92544dSBjoern A. Zeeb 		__le32 start;
197*6c92544dSBjoern A. Zeeb 		__le16 pulse_width;
198*6c92544dSBjoern A. Zeeb 		__le16 pulse_power;
199*6c92544dSBjoern A. Zeeb 		u8 sc_pass;
200*6c92544dSBjoern A. Zeeb 		u8 sw_reset;
201*6c92544dSBjoern A. Zeeb 	} hw_pulse[32];
202*6c92544dSBjoern A. Zeeb };
203*6c92544dSBjoern A. Zeeb 
204*6c92544dSBjoern A. Zeeb enum {
205*6c92544dSBjoern A. Zeeb 	MCU_ATE_SET_FREQ_OFFSET = 0xa,
206*6c92544dSBjoern A. Zeeb 	MCU_ATE_SET_TX_POWER_CONTROL = 0x15,
207*6c92544dSBjoern A. Zeeb };
208*6c92544dSBjoern A. Zeeb 
209*6c92544dSBjoern A. Zeeb struct mt7615_roc_tlv {
210*6c92544dSBjoern A. Zeeb 	u8 bss_idx;
211*6c92544dSBjoern A. Zeeb 	u8 token;
212*6c92544dSBjoern A. Zeeb 	u8 active;
213*6c92544dSBjoern A. Zeeb 	u8 primary_chan;
214*6c92544dSBjoern A. Zeeb 	u8 sco;
215*6c92544dSBjoern A. Zeeb 	u8 band;
216*6c92544dSBjoern A. Zeeb 	u8 width;	/* To support 80/160MHz bandwidth */
217*6c92544dSBjoern A. Zeeb 	u8 freq_seg1;	/* To support 80/160MHz bandwidth */
218*6c92544dSBjoern A. Zeeb 	u8 freq_seg2;	/* To support 80/160MHz bandwidth */
219*6c92544dSBjoern A. Zeeb 	u8 req_type;
220*6c92544dSBjoern A. Zeeb 	u8 dbdc_band;
221*6c92544dSBjoern A. Zeeb 	u8 rsv0;
222*6c92544dSBjoern A. Zeeb 	__le32 max_interval;	/* ms */
223*6c92544dSBjoern A. Zeeb 	u8 rsv1[8];
224*6c92544dSBjoern A. Zeeb } __packed;
225*6c92544dSBjoern A. Zeeb 
226*6c92544dSBjoern A. Zeeb enum {
227*6c92544dSBjoern A. Zeeb 	FW_STATE_PWR_ON = 1,
228*6c92544dSBjoern A. Zeeb 	FW_STATE_N9_RDY = 2,
229*6c92544dSBjoern A. Zeeb };
230*6c92544dSBjoern A. Zeeb 
231*6c92544dSBjoern A. Zeeb enum {
232*6c92544dSBjoern A. Zeeb 	DBDC_TYPE_WMM,
233*6c92544dSBjoern A. Zeeb 	DBDC_TYPE_MGMT,
234*6c92544dSBjoern A. Zeeb 	DBDC_TYPE_BSS,
235*6c92544dSBjoern A. Zeeb 	DBDC_TYPE_MBSS,
236*6c92544dSBjoern A. Zeeb 	DBDC_TYPE_REPEATER,
237*6c92544dSBjoern A. Zeeb 	DBDC_TYPE_MU,
238*6c92544dSBjoern A. Zeeb 	DBDC_TYPE_BF,
239*6c92544dSBjoern A. Zeeb 	DBDC_TYPE_PTA,
240*6c92544dSBjoern A. Zeeb 	__DBDC_TYPE_MAX,
241*6c92544dSBjoern A. Zeeb };
242*6c92544dSBjoern A. Zeeb 
243*6c92544dSBjoern A. Zeeb #endif
244