GNU Linux-libre 6.8.9-gnu
[releases.git] / drivers / net / ethernet / fungible / funcore / fun_hci.h
1 /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
2
3 #ifndef __FUN_HCI_H
4 #define __FUN_HCI_H
5
6 enum {
7         FUN_HCI_ID_INVALID = 0xffffffff,
8 };
9
10 enum fun_admin_op {
11         FUN_ADMIN_OP_BIND = 0x1,
12         FUN_ADMIN_OP_EPCQ = 0x11,
13         FUN_ADMIN_OP_EPSQ = 0x12,
14         FUN_ADMIN_OP_PORT = 0x13,
15         FUN_ADMIN_OP_ETH = 0x14,
16         FUN_ADMIN_OP_VI = 0x15,
17         FUN_ADMIN_OP_SWUPGRADE = 0x1f,
18         FUN_ADMIN_OP_RSS = 0x21,
19         FUN_ADMIN_OP_ADI = 0x25,
20         FUN_ADMIN_OP_KTLS = 0x26,
21 };
22
23 enum {
24         FUN_REQ_COMMON_FLAG_RSP = 0x1,
25         FUN_REQ_COMMON_FLAG_HEAD_WB = 0x2,
26         FUN_REQ_COMMON_FLAG_INT = 0x4,
27         FUN_REQ_COMMON_FLAG_CQE_IN_RQBUF = 0x8,
28 };
29
30 struct fun_admin_req_common {
31         __u8 op;
32         __u8 len8;
33         __be16 flags;
34         __u8 suboff8;
35         __u8 rsvd0;
36         __be16 cid;
37 };
38
39 #define FUN_ADMIN_REQ_COMMON_INIT(_op, _len8, _flags, _suboff8, _cid)       \
40         (struct fun_admin_req_common) {                                     \
41                 .op = (_op), .len8 = (_len8), .flags = cpu_to_be16(_flags), \
42                 .suboff8 = (_suboff8), .cid = cpu_to_be16(_cid),            \
43         }
44
45 #define FUN_ADMIN_REQ_COMMON_INIT2(_op, _len)    \
46         (struct fun_admin_req_common) {          \
47                 .op = (_op), .len8 = (_len) / 8, \
48         }
49
50 struct fun_admin_rsp_common {
51         __u8 op;
52         __u8 len8;
53         __be16 flags;
54         __u8 suboff8;
55         __u8 ret;
56         __be16 cid;
57 };
58
59 struct fun_admin_write48_req {
60         __be64 key_to_data;
61 };
62
63 #define FUN_ADMIN_WRITE48_REQ_KEY_S 56U
64 #define FUN_ADMIN_WRITE48_REQ_KEY_M 0xff
65 #define FUN_ADMIN_WRITE48_REQ_KEY_P_NOSWAP(x) \
66         (((__u64)x) << FUN_ADMIN_WRITE48_REQ_KEY_S)
67
68 #define FUN_ADMIN_WRITE48_REQ_DATA_S 0U
69 #define FUN_ADMIN_WRITE48_REQ_DATA_M 0xffffffffffff
70 #define FUN_ADMIN_WRITE48_REQ_DATA_P_NOSWAP(x) \
71         (((__u64)x) << FUN_ADMIN_WRITE48_REQ_DATA_S)
72
73 #define FUN_ADMIN_WRITE48_REQ_INIT(key, data)                       \
74         (struct fun_admin_write48_req) {                            \
75                 .key_to_data = cpu_to_be64(                         \
76                         FUN_ADMIN_WRITE48_REQ_KEY_P_NOSWAP(key) |   \
77                         FUN_ADMIN_WRITE48_REQ_DATA_P_NOSWAP(data)), \
78         }
79
80 struct fun_admin_write48_rsp {
81         __be64 key_to_data;
82 };
83
84 struct fun_admin_read48_req {
85         __be64 key_pack;
86 };
87
88 #define FUN_ADMIN_READ48_REQ_KEY_S 56U
89 #define FUN_ADMIN_READ48_REQ_KEY_M 0xff
90 #define FUN_ADMIN_READ48_REQ_KEY_P_NOSWAP(x) \
91         (((__u64)x) << FUN_ADMIN_READ48_REQ_KEY_S)
92
93 #define FUN_ADMIN_READ48_REQ_INIT(key)                                       \
94         (struct fun_admin_read48_req) {                                      \
95                 .key_pack =                                                  \
96                         cpu_to_be64(FUN_ADMIN_READ48_REQ_KEY_P_NOSWAP(key)), \
97         }
98
99 struct fun_admin_read48_rsp {
100         __be64 key_to_data;
101 };
102
103 #define FUN_ADMIN_READ48_RSP_KEY_S 56U
104 #define FUN_ADMIN_READ48_RSP_KEY_M 0xff
105 #define FUN_ADMIN_READ48_RSP_KEY_G(x)                     \
106         ((be64_to_cpu(x) >> FUN_ADMIN_READ48_RSP_KEY_S) & \
107          FUN_ADMIN_READ48_RSP_KEY_M)
108
109 #define FUN_ADMIN_READ48_RSP_RET_S 48U
110 #define FUN_ADMIN_READ48_RSP_RET_M 0xff
111 #define FUN_ADMIN_READ48_RSP_RET_G(x)                     \
112         ((be64_to_cpu(x) >> FUN_ADMIN_READ48_RSP_RET_S) & \
113          FUN_ADMIN_READ48_RSP_RET_M)
114
115 #define FUN_ADMIN_READ48_RSP_DATA_S 0U
116 #define FUN_ADMIN_READ48_RSP_DATA_M 0xffffffffffff
117 #define FUN_ADMIN_READ48_RSP_DATA_G(x)                     \
118         ((be64_to_cpu(x) >> FUN_ADMIN_READ48_RSP_DATA_S) & \
119          FUN_ADMIN_READ48_RSP_DATA_M)
120
121 enum fun_admin_bind_type {
122         FUN_ADMIN_BIND_TYPE_EPCQ = 0x1,
123         FUN_ADMIN_BIND_TYPE_EPSQ = 0x2,
124         FUN_ADMIN_BIND_TYPE_PORT = 0x3,
125         FUN_ADMIN_BIND_TYPE_RSS = 0x4,
126         FUN_ADMIN_BIND_TYPE_VI = 0x5,
127         FUN_ADMIN_BIND_TYPE_ETH = 0x6,
128 };
129
130 struct fun_admin_bind_entry {
131         __u8 type;
132         __u8 rsvd0[3];
133         __be32 id;
134 };
135
136 #define FUN_ADMIN_BIND_ENTRY_INIT(_type, _id)            \
137         (struct fun_admin_bind_entry) {                  \
138                 .type = (_type), .id = cpu_to_be32(_id), \
139         }
140
141 struct fun_admin_bind_req {
142         struct fun_admin_req_common common;
143         struct fun_admin_bind_entry entry[];
144 };
145
146 struct fun_admin_bind_rsp {
147         struct fun_admin_rsp_common bind_rsp_common;
148 };
149
150 struct fun_admin_simple_subop {
151         __u8 subop;
152         __u8 rsvd0;
153         __be16 flags;
154         __be32 data;
155 };
156
157 #define FUN_ADMIN_SIMPLE_SUBOP_INIT(_subop, _flags, _data)       \
158         (struct fun_admin_simple_subop) {                        \
159                 .subop = (_subop), .flags = cpu_to_be16(_flags), \
160                 .data = cpu_to_be32(_data),                      \
161         }
162
163 enum fun_admin_subop {
164         FUN_ADMIN_SUBOP_CREATE = 0x10,
165         FUN_ADMIN_SUBOP_DESTROY = 0x11,
166         FUN_ADMIN_SUBOP_MODIFY = 0x12,
167         FUN_ADMIN_SUBOP_RES_COUNT = 0x14,
168         FUN_ADMIN_SUBOP_READ = 0x15,
169         FUN_ADMIN_SUBOP_WRITE = 0x16,
170         FUN_ADMIN_SUBOP_NOTIFY = 0x17,
171 };
172
173 enum {
174         FUN_ADMIN_RES_CREATE_FLAG_ALLOCATOR = 0x1,
175 };
176
177 struct fun_admin_generic_destroy_req {
178         struct fun_admin_req_common common;
179         struct fun_admin_simple_subop destroy;
180 };
181
182 struct fun_admin_generic_create_rsp {
183         struct fun_admin_rsp_common common;
184
185         __u8 subop;
186         __u8 rsvd0;
187         __be16 flags;
188         __be32 id;
189 };
190
191 struct fun_admin_res_count_req {
192         struct fun_admin_req_common common;
193         struct fun_admin_simple_subop count;
194 };
195
196 struct fun_admin_res_count_rsp {
197         struct fun_admin_rsp_common common;
198         struct fun_admin_simple_subop count;
199 };
200
201 enum {
202         FUN_ADMIN_EPCQ_CREATE_FLAG_INT_EPCQ = 0x2,
203         FUN_ADMIN_EPCQ_CREATE_FLAG_ENTRY_WR_TPH = 0x4,
204         FUN_ADMIN_EPCQ_CREATE_FLAG_SL_WR_TPH = 0x8,
205         FUN_ADMIN_EPCQ_CREATE_FLAG_RQ = 0x80,
206         FUN_ADMIN_EPCQ_CREATE_FLAG_INT_IQ = 0x100,
207         FUN_ADMIN_EPCQ_CREATE_FLAG_INT_NOARM = 0x200,
208         FUN_ADMIN_EPCQ_CREATE_FLAG_DROP_ON_OVERFLOW = 0x400,
209 };
210
211 struct fun_admin_epcq_req {
212         struct fun_admin_req_common common;
213         union epcq_req_subop {
214                 struct fun_admin_epcq_create_req {
215                         __u8 subop;
216                         __u8 rsvd0;
217                         __be16 flags;
218                         __be32 id;
219
220                         __be32 epsqid;
221                         __u8 rsvd1;
222                         __u8 entry_size_log2;
223                         __be16 nentries;
224
225                         __be64 address;
226
227                         __be16 tailroom; /* per packet tailroom in bytes */
228                         __u8 headroom; /* per packet headroom in 2B units */
229                         __u8 intcoal_kbytes;
230                         __u8 intcoal_holdoff_nentries;
231                         __u8 intcoal_holdoff_usecs;
232                         __be16 intid;
233
234                         __be32 scan_start_id;
235                         __be32 scan_end_id;
236
237                         __be16 tph_cpuid;
238                         __u8 rsvd3[6];
239                 } create;
240
241                 struct fun_admin_epcq_modify_req {
242                         __u8 subop;
243                         __u8 rsvd0;
244                         __be16 flags;
245                         __be32 id;
246
247                         __be16 headroom; /* headroom in bytes */
248                         __u8 rsvd1[6];
249                 } modify;
250         } u;
251 };
252
253 #define FUN_ADMIN_EPCQ_CREATE_REQ_INIT(                                      \
254         _subop, _flags, _id, _epsqid, _entry_size_log2, _nentries, _address, \
255         _tailroom, _headroom, _intcoal_kbytes, _intcoal_holdoff_nentries,    \
256         _intcoal_holdoff_usecs, _intid, _scan_start_id, _scan_end_id,        \
257         _tph_cpuid)                                                          \
258         (struct fun_admin_epcq_create_req) {                                 \
259                 .subop = (_subop), .flags = cpu_to_be16(_flags),             \
260                 .id = cpu_to_be32(_id), .epsqid = cpu_to_be32(_epsqid),      \
261                 .entry_size_log2 = _entry_size_log2,                         \
262                 .nentries = cpu_to_be16(_nentries),                          \
263                 .address = cpu_to_be64(_address),                            \
264                 .tailroom = cpu_to_be16(_tailroom), .headroom = _headroom,   \
265                 .intcoal_kbytes = _intcoal_kbytes,                           \
266                 .intcoal_holdoff_nentries = _intcoal_holdoff_nentries,       \
267                 .intcoal_holdoff_usecs = _intcoal_holdoff_usecs,             \
268                 .intid = cpu_to_be16(_intid),                                \
269                 .scan_start_id = cpu_to_be32(_scan_start_id),                \
270                 .scan_end_id = cpu_to_be32(_scan_end_id),                    \
271                 .tph_cpuid = cpu_to_be16(_tph_cpuid),                        \
272         }
273
274 #define FUN_ADMIN_EPCQ_MODIFY_REQ_INIT(_subop, _flags, _id, _headroom)      \
275         (struct fun_admin_epcq_modify_req) {                                \
276                 .subop = (_subop), .flags = cpu_to_be16(_flags),            \
277                 .id = cpu_to_be32(_id), .headroom = cpu_to_be16(_headroom), \
278         }
279
280 enum {
281         FUN_ADMIN_EPSQ_CREATE_FLAG_INT_EPSQ = 0x2,
282         FUN_ADMIN_EPSQ_CREATE_FLAG_ENTRY_RD_TPH = 0x4,
283         FUN_ADMIN_EPSQ_CREATE_FLAG_GL_RD_TPH = 0x8,
284         FUN_ADMIN_EPSQ_CREATE_FLAG_HEAD_WB_ADDRESS = 0x10,
285         FUN_ADMIN_EPSQ_CREATE_FLAG_HEAD_WB_ADDRESS_TPH = 0x20,
286         FUN_ADMIN_EPSQ_CREATE_FLAG_HEAD_WB_EPCQ = 0x40,
287         FUN_ADMIN_EPSQ_CREATE_FLAG_RQ = 0x80,
288         FUN_ADMIN_EPSQ_CREATE_FLAG_INT_IQ = 0x100,
289         FUN_ADMIN_EPSQ_CREATE_FLAG_NO_CMPL = 0x200,
290 };
291
292 struct fun_admin_epsq_req {
293         struct fun_admin_req_common common;
294
295         union epsq_req_subop {
296                 struct fun_admin_epsq_create_req {
297                         __u8 subop;
298                         __u8 rsvd0;
299                         __be16 flags;
300                         __be32 id;
301
302                         __be32 epcqid;
303                         __u8 rsvd1;
304                         __u8 entry_size_log2;
305                         __be16 nentries;
306
307                         __be64 address; /* DMA address of epsq */
308
309                         __u8 rsvd2[3];
310                         __u8 intcoal_kbytes;
311                         __u8 intcoal_holdoff_nentries;
312                         __u8 intcoal_holdoff_usecs;
313                         __be16 intid;
314
315                         __be32 scan_start_id;
316                         __be32 scan_end_id;
317
318                         __u8 rsvd3[4];
319                         __be16 tph_cpuid;
320                         __u8 buf_size_log2; /* log2 of RQ buffer size */
321                         __u8 head_wb_size_log2; /* log2 of head write back size */
322
323                         __be64 head_wb_address; /* DMA address for head writeback */
324                 } create;
325         } u;
326 };
327
328 #define FUN_ADMIN_EPSQ_CREATE_REQ_INIT(                                      \
329         _subop, _flags, _id, _epcqid, _entry_size_log2, _nentries, _address, \
330         _intcoal_kbytes, _intcoal_holdoff_nentries, _intcoal_holdoff_usecs,  \
331         _intid, _scan_start_id, _scan_end_id, _tph_cpuid, _buf_size_log2,    \
332         _head_wb_size_log2, _head_wb_address)                                \
333         (struct fun_admin_epsq_create_req) {                                 \
334                 .subop = (_subop), .flags = cpu_to_be16(_flags),             \
335                 .id = cpu_to_be32(_id), .epcqid = cpu_to_be32(_epcqid),      \
336                 .entry_size_log2 = _entry_size_log2,                         \
337                 .nentries = cpu_to_be16(_nentries),                          \
338                 .address = cpu_to_be64(_address),                            \
339                 .intcoal_kbytes = _intcoal_kbytes,                           \
340                 .intcoal_holdoff_nentries = _intcoal_holdoff_nentries,       \
341                 .intcoal_holdoff_usecs = _intcoal_holdoff_usecs,             \
342                 .intid = cpu_to_be16(_intid),                                \
343                 .scan_start_id = cpu_to_be32(_scan_start_id),                \
344                 .scan_end_id = cpu_to_be32(_scan_end_id),                    \
345                 .tph_cpuid = cpu_to_be16(_tph_cpuid),                        \
346                 .buf_size_log2 = _buf_size_log2,                             \
347                 .head_wb_size_log2 = _head_wb_size_log2,                     \
348                 .head_wb_address = cpu_to_be64(_head_wb_address),            \
349         }
350
351 enum {
352         FUN_PORT_CAP_OFFLOADS = 0x1,
353         FUN_PORT_CAP_STATS = 0x2,
354         FUN_PORT_CAP_LOOPBACK = 0x4,
355         FUN_PORT_CAP_VPORT = 0x8,
356         FUN_PORT_CAP_TX_PAUSE = 0x10,
357         FUN_PORT_CAP_RX_PAUSE = 0x20,
358         FUN_PORT_CAP_AUTONEG = 0x40,
359         FUN_PORT_CAP_RSS = 0x80,
360         FUN_PORT_CAP_VLAN_OFFLOADS = 0x100,
361         FUN_PORT_CAP_ENCAP_OFFLOADS = 0x200,
362         FUN_PORT_CAP_1000_X = 0x1000,
363         FUN_PORT_CAP_10G_R = 0x2000,
364         FUN_PORT_CAP_40G_R4 = 0x4000,
365         FUN_PORT_CAP_25G_R = 0x8000,
366         FUN_PORT_CAP_50G_R2 = 0x10000,
367         FUN_PORT_CAP_50G_R = 0x20000,
368         FUN_PORT_CAP_100G_R4 = 0x40000,
369         FUN_PORT_CAP_100G_R2 = 0x80000,
370         FUN_PORT_CAP_200G_R4 = 0x100000,
371         FUN_PORT_CAP_FEC_NONE = 0x10000000,
372         FUN_PORT_CAP_FEC_FC = 0x20000000,
373         FUN_PORT_CAP_FEC_RS = 0x40000000,
374 };
375
376 enum fun_port_brkout_mode {
377         FUN_PORT_BRKMODE_NA = 0x0,
378         FUN_PORT_BRKMODE_NONE = 0x1,
379         FUN_PORT_BRKMODE_2X = 0x2,
380         FUN_PORT_BRKMODE_4X = 0x3,
381 };
382
383 enum {
384         FUN_PORT_SPEED_AUTO = 0x0,
385         FUN_PORT_SPEED_10M = 0x1,
386         FUN_PORT_SPEED_100M = 0x2,
387         FUN_PORT_SPEED_1G = 0x4,
388         FUN_PORT_SPEED_10G = 0x8,
389         FUN_PORT_SPEED_25G = 0x10,
390         FUN_PORT_SPEED_40G = 0x20,
391         FUN_PORT_SPEED_50G = 0x40,
392         FUN_PORT_SPEED_100G = 0x80,
393         FUN_PORT_SPEED_200G = 0x100,
394 };
395
396 enum fun_port_duplex_mode {
397         FUN_PORT_FULL_DUPLEX = 0x0,
398         FUN_PORT_HALF_DUPLEX = 0x1,
399 };
400
401 enum {
402         FUN_PORT_FEC_NA = 0x0,
403         FUN_PORT_FEC_OFF = 0x1,
404         FUN_PORT_FEC_RS = 0x2,
405         FUN_PORT_FEC_FC = 0x4,
406         FUN_PORT_FEC_AUTO = 0x8,
407 };
408
409 enum fun_port_link_status {
410         FUN_PORT_LINK_UP = 0x0,
411         FUN_PORT_LINK_UP_WITH_ERR = 0x1,
412         FUN_PORT_LINK_DOWN = 0x2,
413 };
414
415 enum fun_port_led_type {
416         FUN_PORT_LED_OFF = 0x0,
417         FUN_PORT_LED_AMBER = 0x1,
418         FUN_PORT_LED_GREEN = 0x2,
419         FUN_PORT_LED_BEACON_ON = 0x3,
420         FUN_PORT_LED_BEACON_OFF = 0x4,
421 };
422
423 enum {
424         FUN_PORT_FLAG_MAC_DOWN = 0x1,
425         FUN_PORT_FLAG_MAC_UP = 0x2,
426         FUN_PORT_FLAG_NH_DOWN = 0x4,
427         FUN_PORT_FLAG_NH_UP = 0x8,
428 };
429
430 enum {
431         FUN_PORT_FLAG_ENABLE_NOTIFY = 0x1,
432 };
433
434 enum fun_port_lane_attr {
435         FUN_PORT_LANE_1 = 0x1,
436         FUN_PORT_LANE_2 = 0x2,
437         FUN_PORT_LANE_4 = 0x4,
438         FUN_PORT_LANE_SPEED_10G = 0x100,
439         FUN_PORT_LANE_SPEED_25G = 0x200,
440         FUN_PORT_LANE_SPEED_50G = 0x400,
441         FUN_PORT_LANE_SPLIT = 0x8000,
442 };
443
444 enum fun_admin_port_subop {
445         FUN_ADMIN_PORT_SUBOP_XCVR_READ = 0x23,
446         FUN_ADMIN_PORT_SUBOP_INETADDR_EVENT = 0x24,
447 };
448
449 enum fun_admin_port_key {
450         FUN_ADMIN_PORT_KEY_ILLEGAL = 0x0,
451         FUN_ADMIN_PORT_KEY_MTU = 0x1,
452         FUN_ADMIN_PORT_KEY_FEC = 0x2,
453         FUN_ADMIN_PORT_KEY_SPEED = 0x3,
454         FUN_ADMIN_PORT_KEY_DEBOUNCE = 0x4,
455         FUN_ADMIN_PORT_KEY_DUPLEX = 0x5,
456         FUN_ADMIN_PORT_KEY_MACADDR = 0x6,
457         FUN_ADMIN_PORT_KEY_LINKMODE = 0x7,
458         FUN_ADMIN_PORT_KEY_BREAKOUT = 0x8,
459         FUN_ADMIN_PORT_KEY_ENABLE = 0x9,
460         FUN_ADMIN_PORT_KEY_DISABLE = 0xa,
461         FUN_ADMIN_PORT_KEY_ERR_DISABLE = 0xb,
462         FUN_ADMIN_PORT_KEY_CAPABILITIES = 0xc,
463         FUN_ADMIN_PORT_KEY_LP_CAPABILITIES = 0xd,
464         FUN_ADMIN_PORT_KEY_STATS_DMA_LOW = 0xe,
465         FUN_ADMIN_PORT_KEY_STATS_DMA_HIGH = 0xf,
466         FUN_ADMIN_PORT_KEY_LANE_ATTRS = 0x10,
467         FUN_ADMIN_PORT_KEY_LED = 0x11,
468         FUN_ADMIN_PORT_KEY_ADVERT = 0x12,
469 };
470
471 struct fun_subop_imm {
472         __u8 subop; /* see fun_data_subop enum */
473         __u8 flags;
474         __u8 nsgl;
475         __u8 rsvd0;
476         __be32 len;
477
478         __u8 data[];
479 };
480
481 enum fun_subop_sgl_flags {
482         FUN_SUBOP_SGL_USE_OFF8 = 0x1,
483         FUN_SUBOP_FLAG_FREE_BUF = 0x2,
484         FUN_SUBOP_FLAG_IS_REFBUF = 0x4,
485         FUN_SUBOP_SGL_FLAG_LOCAL = 0x8,
486 };
487
488 enum fun_data_op {
489         FUN_DATAOP_INVALID = 0x0,
490         FUN_DATAOP_SL = 0x1, /* scatter */
491         FUN_DATAOP_GL = 0x2, /* gather */
492         FUN_DATAOP_SGL = 0x3, /* scatter-gather */
493         FUN_DATAOP_IMM = 0x4, /* immediate data */
494         FUN_DATAOP_RQBUF = 0x8, /* rq buffer */
495 };
496
497 struct fun_dataop_gl {
498         __u8 subop;
499         __u8 flags;
500         __be16 sgl_off;
501         __be32 sgl_len;
502
503         __be64 sgl_data;
504 };
505
506 static inline void fun_dataop_gl_init(struct fun_dataop_gl *s, u8 flags,
507                                       u16 sgl_off, u32 sgl_len, u64 sgl_data)
508 {
509         s->subop = FUN_DATAOP_GL;
510         s->flags = flags;
511         s->sgl_off = cpu_to_be16(sgl_off);
512         s->sgl_len = cpu_to_be32(sgl_len);
513         s->sgl_data = cpu_to_be64(sgl_data);
514 }
515
516 struct fun_dataop_imm {
517         __u8 subop;
518         __u8 flags;
519         __be16 rsvd0;
520         __be32 sgl_len;
521 };
522
523 struct fun_subop_sgl {
524         __u8 subop;
525         __u8 flags;
526         __u8 nsgl;
527         __u8 rsvd0;
528         __be32 sgl_len;
529
530         __be64 sgl_data;
531 };
532
533 #define FUN_SUBOP_SGL_INIT(_subop, _flags, _nsgl, _sgl_len, _sgl_data) \
534         (struct fun_subop_sgl) {                                       \
535                 .subop = (_subop), .flags = (_flags), .nsgl = (_nsgl), \
536                 .sgl_len = cpu_to_be32(_sgl_len),                      \
537                 .sgl_data = cpu_to_be64(_sgl_data),                    \
538         }
539
540 struct fun_dataop_rqbuf {
541         __u8 subop;
542         __u8 rsvd0;
543         __be16 cid;
544         __be32 bufoff;
545 };
546
547 struct fun_dataop_hdr {
548         __u8 nsgl;
549         __u8 flags;
550         __u8 ngather;
551         __u8 nscatter;
552         __be32 total_len;
553
554         struct fun_dataop_imm imm[];
555 };
556
557 #define FUN_DATAOP_HDR_INIT(_nsgl, _flags, _ngather, _nscatter, _total_len)  \
558         (struct fun_dataop_hdr) {                                            \
559                 .nsgl = _nsgl, .flags = _flags, .ngather = _ngather,         \
560                 .nscatter = _nscatter, .total_len = cpu_to_be32(_total_len), \
561         }
562
563 enum fun_port_inetaddr_event_type {
564         FUN_PORT_INETADDR_ADD = 0x1,
565         FUN_PORT_INETADDR_DEL = 0x2,
566 };
567
568 enum fun_port_inetaddr_addr_family {
569         FUN_PORT_INETADDR_IPV4 = 0x1,
570         FUN_PORT_INETADDR_IPV6 = 0x2,
571 };
572
573 struct fun_admin_port_req {
574         struct fun_admin_req_common common;
575
576         union port_req_subop {
577                 struct fun_admin_port_create_req {
578                         __u8 subop;
579                         __u8 rsvd0;
580                         __be16 flags;
581                         __be32 id;
582                 } create;
583                 struct fun_admin_port_write_req {
584                         __u8 subop;
585                         __u8 rsvd0;
586                         __be16 flags;
587                         __be32 id; /* portid */
588
589                         struct fun_admin_write48_req write48[];
590                 } write;
591                 struct fun_admin_port_read_req {
592                         __u8 subop;
593                         __u8 rsvd0;
594                         __be16 flags;
595                         __be32 id; /* portid */
596
597                         struct fun_admin_read48_req read48[];
598                 } read;
599                 struct fun_admin_port_xcvr_read_req {
600                         u8 subop;
601                         u8 rsvd0;
602                         __be16 flags;
603                         __be32 id;
604
605                         u8 bank;
606                         u8 page;
607                         u8 offset;
608                         u8 length;
609                         u8 dev_addr;
610                         u8 rsvd1[3];
611                 } xcvr_read;
612                 struct fun_admin_port_inetaddr_event_req {
613                         __u8 subop;
614                         __u8 rsvd0;
615                         __u8 event_type;
616                         __u8 addr_family;
617                         __be32 id;
618
619                         __u8 addr[];
620                 } inetaddr_event;
621         } u;
622 };
623
624 #define FUN_ADMIN_PORT_CREATE_REQ_INIT(_subop, _flags, _id)      \
625         (struct fun_admin_port_create_req) {                     \
626                 .subop = (_subop), .flags = cpu_to_be16(_flags), \
627                 .id = cpu_to_be32(_id),                          \
628         }
629
630 #define FUN_ADMIN_PORT_WRITE_REQ_INIT(_subop, _flags, _id)       \
631         (struct fun_admin_port_write_req) {                      \
632                 .subop = (_subop), .flags = cpu_to_be16(_flags), \
633                 .id = cpu_to_be32(_id),                          \
634         }
635
636 #define FUN_ADMIN_PORT_READ_REQ_INIT(_subop, _flags, _id)        \
637         (struct fun_admin_port_read_req) {                       \
638                 .subop = (_subop), .flags = cpu_to_be16(_flags), \
639                 .id = cpu_to_be32(_id),                          \
640         }
641
642 #define FUN_ADMIN_PORT_XCVR_READ_REQ_INIT(_flags, _id, _bank, _page,   \
643                                           _offset, _length, _dev_addr) \
644         ((struct fun_admin_port_xcvr_read_req) {                       \
645                 .subop = FUN_ADMIN_PORT_SUBOP_XCVR_READ,               \
646                 .flags = cpu_to_be16(_flags), .id = cpu_to_be32(_id),  \
647                 .bank = (_bank), .page = (_page), .offset = (_offset), \
648                 .length = (_length), .dev_addr = (_dev_addr),          \
649         })
650
651 struct fun_admin_port_rsp {
652         struct fun_admin_rsp_common common;
653
654         union port_rsp_subop {
655                 struct fun_admin_port_create_rsp {
656                         __u8 subop;
657                         __u8 rsvd0[3];
658                         __be32 id;
659
660                         __be16 lport;
661                         __u8 rsvd1[6];
662                 } create;
663                 struct fun_admin_port_write_rsp {
664                         __u8 subop;
665                         __u8 rsvd0[3];
666                         __be32 id; /* portid */
667
668                         struct fun_admin_write48_rsp write48[];
669                 } write;
670                 struct fun_admin_port_read_rsp {
671                         __u8 subop;
672                         __u8 rsvd0[3];
673                         __be32 id; /* portid */
674
675                         struct fun_admin_read48_rsp read48[];
676                 } read;
677                 struct fun_admin_port_inetaddr_event_rsp {
678                         __u8 subop;
679                         __u8 rsvd0[3];
680                         __be32 id; /* portid */
681                 } inetaddr_event;
682         } u;
683 };
684
685 struct fun_admin_port_xcvr_read_rsp {
686         struct fun_admin_rsp_common common;
687
688         u8 subop;
689         u8 rsvd0[3];
690         __be32 id;
691
692         u8 bank;
693         u8 page;
694         u8 offset;
695         u8 length;
696         u8 dev_addr;
697         u8 rsvd1[3];
698
699         u8 data[128];
700 };
701
702 enum fun_xcvr_type {
703         FUN_XCVR_BASET = 0x0,
704         FUN_XCVR_CU = 0x1,
705         FUN_XCVR_SMF = 0x2,
706         FUN_XCVR_MMF = 0x3,
707         FUN_XCVR_AOC = 0x4,
708         FUN_XCVR_SFPP = 0x10, /* SFP+ or later */
709         FUN_XCVR_QSFPP = 0x11, /* QSFP+ or later */
710         FUN_XCVR_QSFPDD = 0x12, /* QSFP-DD */
711 };
712
713 struct fun_admin_port_notif {
714         struct fun_admin_rsp_common common;
715
716         __u8 subop;
717         __u8 rsvd0;
718         __be16 id;
719         __be32 speed; /* in 10 Mbps units */
720
721         __u8 link_state;
722         __u8 missed_events;
723         __u8 link_down_reason;
724         __u8 xcvr_type;
725         __u8 flow_ctrl;
726         __u8 fec;
727         __u8 active_lanes;
728         __u8 rsvd1;
729
730         __be64 advertising;
731
732         __be64 lp_advertising;
733 };
734
735 enum fun_eth_rss_const {
736         FUN_ETH_RSS_MAX_KEY_SIZE = 0x28,
737         FUN_ETH_RSS_MAX_INDIR_ENT = 0x40,
738 };
739
740 enum fun_eth_hash_alg {
741         FUN_ETH_RSS_ALG_INVALID = 0x0,
742         FUN_ETH_RSS_ALG_TOEPLITZ = 0x1,
743         FUN_ETH_RSS_ALG_CRC32 = 0x2,
744 };
745
746 struct fun_admin_rss_req {
747         struct fun_admin_req_common common;
748
749         union rss_req_subop {
750                 struct fun_admin_rss_create_req {
751                         __u8 subop;
752                         __u8 rsvd0;
753                         __be16 flags;
754                         __be32 id;
755
756                         __be32 rsvd1;
757                         __be32 viid; /* VI flow id */
758
759                         __be64 metadata[1];
760
761                         __u8 alg;
762                         __u8 keylen;
763                         __u8 indir_nent;
764                         __u8 rsvd2;
765                         __be16 key_off;
766                         __be16 indir_off;
767
768                         struct fun_dataop_hdr dataop;
769                 } create;
770         } u;
771 };
772
773 #define FUN_ADMIN_RSS_CREATE_REQ_INIT(_subop, _flags, _id, _viid, _alg,    \
774                                       _keylen, _indir_nent, _key_off,      \
775                                       _indir_off)                          \
776         (struct fun_admin_rss_create_req) {                                \
777                 .subop = (_subop), .flags = cpu_to_be16(_flags),           \
778                 .id = cpu_to_be32(_id), .viid = cpu_to_be32(_viid),        \
779                 .alg = _alg, .keylen = _keylen, .indir_nent = _indir_nent, \
780                 .key_off = cpu_to_be16(_key_off),                          \
781                 .indir_off = cpu_to_be16(_indir_off),                      \
782         }
783
784 struct fun_admin_vi_req {
785         struct fun_admin_req_common common;
786
787         union vi_req_subop {
788                 struct fun_admin_vi_create_req {
789                         __u8 subop;
790                         __u8 rsvd0;
791                         __be16 flags;
792                         __be32 id;
793
794                         __be32 rsvd1;
795                         __be32 portid; /* port flow id */
796                 } create;
797         } u;
798 };
799
800 #define FUN_ADMIN_VI_CREATE_REQ_INIT(_subop, _flags, _id, _portid)      \
801         (struct fun_admin_vi_create_req) {                              \
802                 .subop = (_subop), .flags = cpu_to_be16(_flags),        \
803                 .id = cpu_to_be32(_id), .portid = cpu_to_be32(_portid), \
804         }
805
806 struct fun_admin_eth_req {
807         struct fun_admin_req_common common;
808
809         union eth_req_subop {
810                 struct fun_admin_eth_create_req {
811                         __u8 subop;
812                         __u8 rsvd0;
813                         __be16 flags;
814                         __be32 id;
815
816                         __be32 rsvd1;
817                         __be32 portid; /* port flow id */
818                 } create;
819         } u;
820 };
821
822 #define FUN_ADMIN_ETH_CREATE_REQ_INIT(_subop, _flags, _id, _portid)     \
823         (struct fun_admin_eth_create_req) {                             \
824                 .subop = (_subop), .flags = cpu_to_be16(_flags),        \
825                 .id = cpu_to_be32(_id), .portid = cpu_to_be32(_portid), \
826         }
827
828 enum {
829         FUN_ADMIN_SWU_UPGRADE_FLAG_INIT = 0x10,
830         FUN_ADMIN_SWU_UPGRADE_FLAG_COMPLETE = 0x20,
831         FUN_ADMIN_SWU_UPGRADE_FLAG_DOWNGRADE = 0x40,
832         FUN_ADMIN_SWU_UPGRADE_FLAG_ACTIVE_IMAGE = 0x80,
833         FUN_ADMIN_SWU_UPGRADE_FLAG_ASYNC = 0x1,
834 };
835
836 enum fun_admin_swu_subop {
837         FUN_ADMIN_SWU_SUBOP_GET_VERSION = 0x20,
838         FUN_ADMIN_SWU_SUBOP_UPGRADE = 0x21,
839         FUN_ADMIN_SWU_SUBOP_UPGRADE_DATA = 0x22,
840         FUN_ADMIN_SWU_SUBOP_GET_ALL_VERSIONS = 0x23,
841 };
842
843 struct fun_admin_swu_req {
844         struct fun_admin_req_common common;
845
846         union swu_req_subop {
847                 struct fun_admin_swu_create_req {
848                         __u8 subop;
849                         __u8 rsvd0;
850                         __be16 flags;
851                         __be32 id;
852                 } create;
853                 struct fun_admin_swu_upgrade_req {
854                         __u8 subop;
855                         __u8 rsvd0;
856                         __be16 flags;
857                         __be32 id;
858
859                         __be32 fourcc;
860                         __be32 rsvd1;
861
862                         __be64 image_size; /* upgrade image length */
863                 } upgrade;
864                 struct fun_admin_swu_upgrade_data_req {
865                         __u8 subop;
866                         __u8 rsvd0;
867                         __be16 flags;
868                         __be32 id;
869
870                         __be32 offset; /* offset of data in this command */
871                         __be32 size; /* total size of data in this command */
872                 } upgrade_data;
873         } u;
874
875         struct fun_subop_sgl sgl[]; /* in, out buffers through sgl */
876 };
877
878 #define FUN_ADMIN_SWU_CREATE_REQ_INIT(_subop, _flags, _id)       \
879         (struct fun_admin_swu_create_req) {                      \
880                 .subop = (_subop), .flags = cpu_to_be16(_flags), \
881                 .id = cpu_to_be32(_id),                          \
882         }
883
884 #define FUN_ADMIN_SWU_UPGRADE_REQ_INIT(_subop, _flags, _id, _fourcc,    \
885                                        _image_size)                     \
886         (struct fun_admin_swu_upgrade_req) {                            \
887                 .subop = (_subop), .flags = cpu_to_be16(_flags),        \
888                 .id = cpu_to_be32(_id), .fourcc = cpu_to_be32(_fourcc), \
889                 .image_size = cpu_to_be64(_image_size),                 \
890         }
891
892 #define FUN_ADMIN_SWU_UPGRADE_DATA_REQ_INIT(_subop, _flags, _id, _offset, \
893                                             _size)                        \
894         (struct fun_admin_swu_upgrade_data_req) {                         \
895                 .subop = (_subop), .flags = cpu_to_be16(_flags),          \
896                 .id = cpu_to_be32(_id), .offset = cpu_to_be32(_offset),   \
897                 .size = cpu_to_be32(_size),                               \
898         }
899
900 struct fun_admin_swu_rsp {
901         struct fun_admin_rsp_common common;
902
903         union swu_rsp_subop {
904                 struct fun_admin_swu_create_rsp {
905                         __u8 subop;
906                         __u8 rsvd0;
907                         __be16 flags;
908                         __be32 id;
909                 } create;
910                 struct fun_admin_swu_upgrade_rsp {
911                         __u8 subop;
912                         __u8 rsvd0[3];
913                         __be32 id;
914
915                         __be32 fourcc;
916                         __be32 status;
917
918                         __be32 progress;
919                         __be32 unused;
920                 } upgrade;
921                 struct fun_admin_swu_upgrade_data_rsp {
922                         __u8 subop;
923                         __u8 rsvd0;
924                         __be16 flags;
925                         __be32 id;
926
927                         __be32 offset;
928                         __be32 size;
929                 } upgrade_data;
930         } u;
931 };
932
933 enum fun_ktls_version {
934         FUN_KTLS_TLSV2 = 0x20,
935         FUN_KTLS_TLSV3 = 0x30,
936 };
937
938 enum fun_ktls_cipher {
939         FUN_KTLS_CIPHER_AES_GCM_128 = 0x33,
940         FUN_KTLS_CIPHER_AES_GCM_256 = 0x34,
941         FUN_KTLS_CIPHER_AES_CCM_128 = 0x35,
942         FUN_KTLS_CIPHER_CHACHA20_POLY1305 = 0x36,
943 };
944
945 enum fun_ktls_modify_flags {
946         FUN_KTLS_MODIFY_REMOVE = 0x1,
947 };
948
949 struct fun_admin_ktls_create_req {
950         struct fun_admin_req_common common;
951
952         __u8 subop;
953         __u8 rsvd0;
954         __be16 flags;
955         __be32 id;
956 };
957
958 #define FUN_ADMIN_KTLS_CREATE_REQ_INIT(_subop, _flags, _id)      \
959         (struct fun_admin_ktls_create_req) {                     \
960                 .subop = (_subop), .flags = cpu_to_be16(_flags), \
961                 .id = cpu_to_be32(_id),                          \
962         }
963
964 struct fun_admin_ktls_create_rsp {
965         struct fun_admin_rsp_common common;
966
967         __u8 subop;
968         __u8 rsvd0[3];
969         __be32 id;
970 };
971
972 struct fun_admin_ktls_modify_req {
973         struct fun_admin_req_common common;
974
975         __u8 subop;
976         __u8 rsvd0;
977         __be16 flags;
978         __be32 id;
979
980         __be64 tlsid;
981
982         __be32 tcp_seq;
983         __u8 version;
984         __u8 cipher;
985         __u8 rsvd1[2];
986
987         __u8 record_seq[8];
988
989         __u8 key[32];
990
991         __u8 iv[16];
992
993         __u8 salt[8];
994 };
995
996 #define FUN_ADMIN_KTLS_MODIFY_REQ_INIT(_subop, _flags, _id, _tlsid, _tcp_seq, \
997                                        _version, _cipher)                     \
998         (struct fun_admin_ktls_modify_req) {                                  \
999                 .subop = (_subop), .flags = cpu_to_be16(_flags),              \
1000                 .id = cpu_to_be32(_id), .tlsid = cpu_to_be64(_tlsid),         \
1001                 .tcp_seq = cpu_to_be32(_tcp_seq), .version = _version,        \
1002                 .cipher = _cipher,                                            \
1003         }
1004
1005 struct fun_admin_ktls_modify_rsp {
1006         struct fun_admin_rsp_common common;
1007
1008         __u8 subop;
1009         __u8 rsvd0[3];
1010         __be32 id;
1011
1012         __be64 tlsid;
1013 };
1014
1015 struct fun_req_common {
1016         __u8 op;
1017         __u8 len8;
1018         __be16 flags;
1019         __u8 suboff8;
1020         __u8 rsvd0;
1021         __be16 cid;
1022 };
1023
1024 struct fun_rsp_common {
1025         __u8 op;
1026         __u8 len8;
1027         __be16 flags;
1028         __u8 suboff8;
1029         __u8 ret;
1030         __be16 cid;
1031 };
1032
1033 struct fun_cqe_info {
1034         __be16 sqhd;
1035         __be16 sqid;
1036         __be16 cid;
1037         __be16 sf_p;
1038 };
1039
1040 enum fun_eprq_def {
1041         FUN_EPRQ_PKT_ALIGN = 0x80,
1042 };
1043
1044 struct fun_eprq_rqbuf {
1045         __be64 bufaddr;
1046 };
1047
1048 #define FUN_EPRQ_RQBUF_INIT(_bufaddr)             \
1049         (struct fun_eprq_rqbuf) {                 \
1050                 .bufaddr = cpu_to_be64(_bufaddr), \
1051         }
1052
1053 enum fun_eth_op {
1054         FUN_ETH_OP_TX = 0x1,
1055         FUN_ETH_OP_RX = 0x2,
1056 };
1057
1058 enum {
1059         FUN_ETH_OFFLOAD_EN = 0x8000,
1060         FUN_ETH_OUTER_EN = 0x4000,
1061         FUN_ETH_INNER_LSO = 0x2000,
1062         FUN_ETH_INNER_TSO = 0x1000,
1063         FUN_ETH_OUTER_IPV6 = 0x800,
1064         FUN_ETH_OUTER_UDP = 0x400,
1065         FUN_ETH_INNER_IPV6 = 0x200,
1066         FUN_ETH_INNER_UDP = 0x100,
1067         FUN_ETH_UPDATE_OUTER_L3_LEN = 0x80,
1068         FUN_ETH_UPDATE_OUTER_L3_CKSUM = 0x40,
1069         FUN_ETH_UPDATE_OUTER_L4_LEN = 0x20,
1070         FUN_ETH_UPDATE_OUTER_L4_CKSUM = 0x10,
1071         FUN_ETH_UPDATE_INNER_L3_LEN = 0x8,
1072         FUN_ETH_UPDATE_INNER_L3_CKSUM = 0x4,
1073         FUN_ETH_UPDATE_INNER_L4_LEN = 0x2,
1074         FUN_ETH_UPDATE_INNER_L4_CKSUM = 0x1,
1075 };
1076
1077 struct fun_eth_offload {
1078         __be16 flags; /* combination of above flags */
1079         __be16 mss; /* TSO max seg size */
1080         __be16 tcp_doff_flags; /* TCP data offset + flags 16b word */
1081         __be16 vlan;
1082
1083         __be16 inner_l3_off; /* Inner L3 header offset */
1084         __be16 inner_l4_off; /* Inner L4 header offset */
1085         __be16 outer_l3_off; /* Outer L3 header offset */
1086         __be16 outer_l4_off; /* Outer L4 header offset */
1087 };
1088
1089 static inline void fun_eth_offload_init(struct fun_eth_offload *s, u16 flags,
1090                                         u16 mss, __be16 tcp_doff_flags,
1091                                         __be16 vlan, u16 inner_l3_off,
1092                                         u16 inner_l4_off, u16 outer_l3_off,
1093                                         u16 outer_l4_off)
1094 {
1095         s->flags = cpu_to_be16(flags);
1096         s->mss = cpu_to_be16(mss);
1097         s->tcp_doff_flags = tcp_doff_flags;
1098         s->vlan = vlan;
1099         s->inner_l3_off = cpu_to_be16(inner_l3_off);
1100         s->inner_l4_off = cpu_to_be16(inner_l4_off);
1101         s->outer_l3_off = cpu_to_be16(outer_l3_off);
1102         s->outer_l4_off = cpu_to_be16(outer_l4_off);
1103 }
1104
1105 struct fun_eth_tls {
1106         __be64 tlsid;
1107 };
1108
1109 enum {
1110         FUN_ETH_TX_TLS = 0x8000,
1111 };
1112
1113 struct fun_eth_tx_req {
1114         __u8 op;
1115         __u8 len8;
1116         __be16 flags;
1117         __u8 suboff8;
1118         __u8 repr_idn;
1119         __be16 encap_proto;
1120
1121         struct fun_eth_offload offload;
1122
1123         struct fun_dataop_hdr dataop;
1124 };
1125
1126 struct fun_eth_rx_cv {
1127         __be16 il4_prot_to_l2_type;
1128 };
1129
1130 #define FUN_ETH_RX_CV_IL4_PROT_S 13U
1131 #define FUN_ETH_RX_CV_IL4_PROT_M 0x3
1132
1133 #define FUN_ETH_RX_CV_IL3_PROT_S 11U
1134 #define FUN_ETH_RX_CV_IL3_PROT_M 0x3
1135
1136 #define FUN_ETH_RX_CV_OL4_PROT_S 8U
1137 #define FUN_ETH_RX_CV_OL4_PROT_M 0x7
1138
1139 #define FUN_ETH_RX_CV_ENCAP_TYPE_S 6U
1140 #define FUN_ETH_RX_CV_ENCAP_TYPE_M 0x3
1141
1142 #define FUN_ETH_RX_CV_OL3_PROT_S 4U
1143 #define FUN_ETH_RX_CV_OL3_PROT_M 0x3
1144
1145 #define FUN_ETH_RX_CV_VLAN_TYPE_S 3U
1146 #define FUN_ETH_RX_CV_VLAN_TYPE_M 0x1
1147
1148 #define FUN_ETH_RX_CV_L2_TYPE_S 2U
1149 #define FUN_ETH_RX_CV_L2_TYPE_M 0x1
1150
1151 enum fun_rx_cv {
1152         FUN_RX_CV_NONE = 0x0,
1153         FUN_RX_CV_IP = 0x2,
1154         FUN_RX_CV_IP6 = 0x3,
1155         FUN_RX_CV_TCP = 0x2,
1156         FUN_RX_CV_UDP = 0x3,
1157         FUN_RX_CV_VXLAN = 0x2,
1158         FUN_RX_CV_MPLS = 0x3,
1159 };
1160
1161 struct fun_eth_cqe {
1162         __u8 op;
1163         __u8 len8;
1164         __u8 nsgl;
1165         __u8 repr_idn;
1166         __be32 pkt_len;
1167
1168         __be64 timestamp;
1169
1170         __be16 pkt_cv;
1171         __be16 rsvd0;
1172         __be32 hash;
1173
1174         __be16 encap_proto;
1175         __be16 vlan;
1176         __be32 rsvd1;
1177
1178         __be32 buf_offset;
1179         __be16 headroom;
1180         __be16 csum;
1181 };
1182
1183 enum fun_admin_adi_attr {
1184         FUN_ADMIN_ADI_ATTR_MACADDR = 0x1,
1185         FUN_ADMIN_ADI_ATTR_VLAN = 0x2,
1186         FUN_ADMIN_ADI_ATTR_RATE = 0x3,
1187 };
1188
1189 struct fun_adi_param {
1190         union adi_param {
1191                 struct fun_adi_mac {
1192                         __be64 addr;
1193                 } mac;
1194                 struct fun_adi_vlan {
1195                         __be32 rsvd;
1196                         __be16 eth_type;
1197                         __be16 tci;
1198                 } vlan;
1199                 struct fun_adi_rate {
1200                         __be32 rsvd;
1201                         __be32 tx_mbps;
1202                 } rate;
1203         } u;
1204 };
1205
1206 #define FUN_ADI_MAC_INIT(_addr)             \
1207         (struct fun_adi_mac) {              \
1208                 .addr = cpu_to_be64(_addr), \
1209         }
1210
1211 #define FUN_ADI_VLAN_INIT(_eth_type, _tci)                                    \
1212         (struct fun_adi_vlan) {                                               \
1213                 .eth_type = cpu_to_be16(_eth_type), .tci = cpu_to_be16(_tci), \
1214         }
1215
1216 #define FUN_ADI_RATE_INIT(_tx_mbps)               \
1217         (struct fun_adi_rate) {                   \
1218                 .tx_mbps = cpu_to_be32(_tx_mbps), \
1219         }
1220
1221 struct fun_admin_adi_req {
1222         struct fun_admin_req_common common;
1223
1224         union adi_req_subop {
1225                 struct fun_admin_adi_write_req {
1226                         __u8 subop;
1227                         __u8 attribute;
1228                         __be16 rsvd;
1229                         __be32 id;
1230
1231                         struct fun_adi_param param;
1232                 } write;
1233         } u;
1234 };
1235
1236 #define FUN_ADMIN_ADI_WRITE_REQ_INIT(_subop, _attribute, _id) \
1237         (struct fun_admin_adi_write_req) {                    \
1238                 .subop = (_subop), .attribute = (_attribute), \
1239                 .id = cpu_to_be32(_id),                       \
1240         }
1241
1242 #endif /* __FUN_HCI_H */