1*2d9fd380Sjfb8856606 /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB OR BSD-3-Clause */
2*2d9fd380Sjfb8856606 /* Copyright (c) 2017-2019 Pensando Systems, Inc. All rights reserved. */
3*2d9fd380Sjfb8856606
4*2d9fd380Sjfb8856606 #ifndef _IONIC_IF_H_
5*2d9fd380Sjfb8856606 #define _IONIC_IF_H_
6*2d9fd380Sjfb8856606
7*2d9fd380Sjfb8856606 #pragma pack(push, 1)
8*2d9fd380Sjfb8856606
9*2d9fd380Sjfb8856606 #define IONIC_DEV_INFO_SIGNATURE 0x44455649 /* 'DEVI' */
10*2d9fd380Sjfb8856606 #define IONIC_DEV_INFO_VERSION 1
11*2d9fd380Sjfb8856606 #define IONIC_IFNAMSIZ 16
12*2d9fd380Sjfb8856606
13*2d9fd380Sjfb8856606 /**
14*2d9fd380Sjfb8856606 * Commands
15*2d9fd380Sjfb8856606 */
16*2d9fd380Sjfb8856606 enum ionic_cmd_opcode {
17*2d9fd380Sjfb8856606 IONIC_CMD_NOP = 0,
18*2d9fd380Sjfb8856606
19*2d9fd380Sjfb8856606 /* Device commands */
20*2d9fd380Sjfb8856606 IONIC_CMD_IDENTIFY = 1,
21*2d9fd380Sjfb8856606 IONIC_CMD_INIT = 2,
22*2d9fd380Sjfb8856606 IONIC_CMD_RESET = 3,
23*2d9fd380Sjfb8856606 IONIC_CMD_GETATTR = 4,
24*2d9fd380Sjfb8856606 IONIC_CMD_SETATTR = 5,
25*2d9fd380Sjfb8856606
26*2d9fd380Sjfb8856606 /* Port commands */
27*2d9fd380Sjfb8856606 IONIC_CMD_PORT_IDENTIFY = 10,
28*2d9fd380Sjfb8856606 IONIC_CMD_PORT_INIT = 11,
29*2d9fd380Sjfb8856606 IONIC_CMD_PORT_RESET = 12,
30*2d9fd380Sjfb8856606 IONIC_CMD_PORT_GETATTR = 13,
31*2d9fd380Sjfb8856606 IONIC_CMD_PORT_SETATTR = 14,
32*2d9fd380Sjfb8856606
33*2d9fd380Sjfb8856606 /* LIF commands */
34*2d9fd380Sjfb8856606 IONIC_CMD_LIF_IDENTIFY = 20,
35*2d9fd380Sjfb8856606 IONIC_CMD_LIF_INIT = 21,
36*2d9fd380Sjfb8856606 IONIC_CMD_LIF_RESET = 22,
37*2d9fd380Sjfb8856606 IONIC_CMD_LIF_GETATTR = 23,
38*2d9fd380Sjfb8856606 IONIC_CMD_LIF_SETATTR = 24,
39*2d9fd380Sjfb8856606
40*2d9fd380Sjfb8856606 IONIC_CMD_RX_MODE_SET = 30,
41*2d9fd380Sjfb8856606 IONIC_CMD_RX_FILTER_ADD = 31,
42*2d9fd380Sjfb8856606 IONIC_CMD_RX_FILTER_DEL = 32,
43*2d9fd380Sjfb8856606
44*2d9fd380Sjfb8856606 /* Queue commands */
45*2d9fd380Sjfb8856606 IONIC_CMD_Q_INIT = 40,
46*2d9fd380Sjfb8856606 IONIC_CMD_Q_CONTROL = 41,
47*2d9fd380Sjfb8856606
48*2d9fd380Sjfb8856606 /* RDMA commands */
49*2d9fd380Sjfb8856606 IONIC_CMD_RDMA_RESET_LIF = 50,
50*2d9fd380Sjfb8856606 IONIC_CMD_RDMA_CREATE_EQ = 51,
51*2d9fd380Sjfb8856606 IONIC_CMD_RDMA_CREATE_CQ = 52,
52*2d9fd380Sjfb8856606 IONIC_CMD_RDMA_CREATE_ADMINQ = 53,
53*2d9fd380Sjfb8856606
54*2d9fd380Sjfb8856606 /* QoS commands */
55*2d9fd380Sjfb8856606 IONIC_CMD_QOS_CLASS_IDENTIFY = 240,
56*2d9fd380Sjfb8856606 IONIC_CMD_QOS_CLASS_INIT = 241,
57*2d9fd380Sjfb8856606 IONIC_CMD_QOS_CLASS_RESET = 242,
58*2d9fd380Sjfb8856606
59*2d9fd380Sjfb8856606 /* Firmware commands */
60*2d9fd380Sjfb8856606 IONIC_CMD_FW_DOWNLOAD = 254,
61*2d9fd380Sjfb8856606 IONIC_CMD_FW_CONTROL = 255,
62*2d9fd380Sjfb8856606 };
63*2d9fd380Sjfb8856606
64*2d9fd380Sjfb8856606 /**
65*2d9fd380Sjfb8856606 * Command Return codes
66*2d9fd380Sjfb8856606 */
67*2d9fd380Sjfb8856606 enum ionic_status_code {
68*2d9fd380Sjfb8856606 IONIC_RC_SUCCESS = 0, /* Success */
69*2d9fd380Sjfb8856606 IONIC_RC_EVERSION = 1, /* Incorrect version for request */
70*2d9fd380Sjfb8856606 IONIC_RC_EOPCODE = 2, /* Invalid cmd opcode */
71*2d9fd380Sjfb8856606 IONIC_RC_EIO = 3, /* I/O error */
72*2d9fd380Sjfb8856606 IONIC_RC_EPERM = 4, /* Permission denied */
73*2d9fd380Sjfb8856606 IONIC_RC_EQID = 5, /* Bad qid */
74*2d9fd380Sjfb8856606 IONIC_RC_EQTYPE = 6, /* Bad qtype */
75*2d9fd380Sjfb8856606 IONIC_RC_ENOENT = 7, /* No such element */
76*2d9fd380Sjfb8856606 IONIC_RC_EINTR = 8, /* operation interrupted */
77*2d9fd380Sjfb8856606 IONIC_RC_EAGAIN = 9, /* Try again */
78*2d9fd380Sjfb8856606 IONIC_RC_ENOMEM = 10, /* Out of memory */
79*2d9fd380Sjfb8856606 IONIC_RC_EFAULT = 11, /* Bad address */
80*2d9fd380Sjfb8856606 IONIC_RC_EBUSY = 12, /* Device or resource busy */
81*2d9fd380Sjfb8856606 IONIC_RC_EEXIST = 13, /* object already exists */
82*2d9fd380Sjfb8856606 IONIC_RC_EINVAL = 14, /* Invalid argument */
83*2d9fd380Sjfb8856606 IONIC_RC_ENOSPC = 15, /* No space left or alloc failure */
84*2d9fd380Sjfb8856606 IONIC_RC_ERANGE = 16, /* Parameter out of range */
85*2d9fd380Sjfb8856606 IONIC_RC_BAD_ADDR = 17, /* Descriptor contains a bad ptr */
86*2d9fd380Sjfb8856606 IONIC_RC_DEV_CMD = 18, /* Device cmd attempted on AdminQ */
87*2d9fd380Sjfb8856606 IONIC_RC_ENOSUPP = 19, /* Operation not supported */
88*2d9fd380Sjfb8856606 IONIC_RC_ERROR = 29, /* Generic error */
89*2d9fd380Sjfb8856606
90*2d9fd380Sjfb8856606 IONIC_RC_ERDMA = 30, /* Generic RDMA error */
91*2d9fd380Sjfb8856606 };
92*2d9fd380Sjfb8856606
93*2d9fd380Sjfb8856606 enum ionic_notifyq_opcode {
94*2d9fd380Sjfb8856606 IONIC_EVENT_LINK_CHANGE = 1,
95*2d9fd380Sjfb8856606 IONIC_EVENT_RESET = 2,
96*2d9fd380Sjfb8856606 IONIC_EVENT_HEARTBEAT = 3,
97*2d9fd380Sjfb8856606 IONIC_EVENT_LOG = 4,
98*2d9fd380Sjfb8856606 };
99*2d9fd380Sjfb8856606
100*2d9fd380Sjfb8856606 /**
101*2d9fd380Sjfb8856606 * struct cmd - General admin command format
102*2d9fd380Sjfb8856606 * @opcode: Opcode for the command
103*2d9fd380Sjfb8856606 * @lif_index: LIF index
104*2d9fd380Sjfb8856606 * @cmd_data: Opcode-specific command bytes
105*2d9fd380Sjfb8856606 */
106*2d9fd380Sjfb8856606 struct ionic_admin_cmd {
107*2d9fd380Sjfb8856606 u8 opcode;
108*2d9fd380Sjfb8856606 u8 rsvd;
109*2d9fd380Sjfb8856606 __le16 lif_index;
110*2d9fd380Sjfb8856606 u8 cmd_data[60];
111*2d9fd380Sjfb8856606 };
112*2d9fd380Sjfb8856606
113*2d9fd380Sjfb8856606 /**
114*2d9fd380Sjfb8856606 * struct ionic_admin_comp - General admin command completion format
115*2d9fd380Sjfb8856606 * @status: The status of the command (enum status_code)
116*2d9fd380Sjfb8856606 * @comp_index: The index in the descriptor ring for which this
117*2d9fd380Sjfb8856606 * is the completion.
118*2d9fd380Sjfb8856606 * @cmd_data: Command-specific bytes.
119*2d9fd380Sjfb8856606 * @color: Color bit. (Always 0 for commands issued to the
120*2d9fd380Sjfb8856606 * Device Cmd Registers.)
121*2d9fd380Sjfb8856606 */
122*2d9fd380Sjfb8856606 struct ionic_admin_comp {
123*2d9fd380Sjfb8856606 u8 status;
124*2d9fd380Sjfb8856606 u8 rsvd;
125*2d9fd380Sjfb8856606 __le16 comp_index;
126*2d9fd380Sjfb8856606 u8 cmd_data[11];
127*2d9fd380Sjfb8856606 u8 color;
128*2d9fd380Sjfb8856606 #define IONIC_COMP_COLOR_MASK 0x80
129*2d9fd380Sjfb8856606 };
130*2d9fd380Sjfb8856606
color_match(u8 color,u8 done_color)131*2d9fd380Sjfb8856606 static inline u8 color_match(u8 color, u8 done_color)
132*2d9fd380Sjfb8856606 {
133*2d9fd380Sjfb8856606 return (!!(color & IONIC_COMP_COLOR_MASK)) == done_color;
134*2d9fd380Sjfb8856606 }
135*2d9fd380Sjfb8856606
136*2d9fd380Sjfb8856606 /**
137*2d9fd380Sjfb8856606 * struct ionic_nop_cmd - NOP command
138*2d9fd380Sjfb8856606 * @opcode: opcode
139*2d9fd380Sjfb8856606 */
140*2d9fd380Sjfb8856606 struct ionic_nop_cmd {
141*2d9fd380Sjfb8856606 u8 opcode;
142*2d9fd380Sjfb8856606 u8 rsvd[63];
143*2d9fd380Sjfb8856606 };
144*2d9fd380Sjfb8856606
145*2d9fd380Sjfb8856606 /**
146*2d9fd380Sjfb8856606 * struct ionic_nop_comp - NOP command completion
147*2d9fd380Sjfb8856606 * @status: The status of the command (enum status_code)
148*2d9fd380Sjfb8856606 */
149*2d9fd380Sjfb8856606 struct ionic_nop_comp {
150*2d9fd380Sjfb8856606 u8 status;
151*2d9fd380Sjfb8856606 u8 rsvd[15];
152*2d9fd380Sjfb8856606 };
153*2d9fd380Sjfb8856606
154*2d9fd380Sjfb8856606 /**
155*2d9fd380Sjfb8856606 * struct ionic_dev_init_cmd - Device init command
156*2d9fd380Sjfb8856606 * @opcode: opcode
157*2d9fd380Sjfb8856606 * @type: device type
158*2d9fd380Sjfb8856606 */
159*2d9fd380Sjfb8856606 struct ionic_dev_init_cmd {
160*2d9fd380Sjfb8856606 u8 opcode;
161*2d9fd380Sjfb8856606 u8 type;
162*2d9fd380Sjfb8856606 u8 rsvd[62];
163*2d9fd380Sjfb8856606 };
164*2d9fd380Sjfb8856606
165*2d9fd380Sjfb8856606 /**
166*2d9fd380Sjfb8856606 * struct init_comp - Device init command completion
167*2d9fd380Sjfb8856606 * @status: The status of the command (enum status_code)
168*2d9fd380Sjfb8856606 */
169*2d9fd380Sjfb8856606 struct ionic_dev_init_comp {
170*2d9fd380Sjfb8856606 u8 status;
171*2d9fd380Sjfb8856606 u8 rsvd[15];
172*2d9fd380Sjfb8856606 };
173*2d9fd380Sjfb8856606
174*2d9fd380Sjfb8856606 /**
175*2d9fd380Sjfb8856606 * struct ionic_dev_reset_cmd - Device reset command
176*2d9fd380Sjfb8856606 * @opcode: opcode
177*2d9fd380Sjfb8856606 */
178*2d9fd380Sjfb8856606 struct ionic_dev_reset_cmd {
179*2d9fd380Sjfb8856606 u8 opcode;
180*2d9fd380Sjfb8856606 u8 rsvd[63];
181*2d9fd380Sjfb8856606 };
182*2d9fd380Sjfb8856606
183*2d9fd380Sjfb8856606 /**
184*2d9fd380Sjfb8856606 * struct reset_comp - Reset command completion
185*2d9fd380Sjfb8856606 * @status: The status of the command (enum status_code)
186*2d9fd380Sjfb8856606 */
187*2d9fd380Sjfb8856606 struct ionic_dev_reset_comp {
188*2d9fd380Sjfb8856606 u8 status;
189*2d9fd380Sjfb8856606 u8 rsvd[15];
190*2d9fd380Sjfb8856606 };
191*2d9fd380Sjfb8856606
192*2d9fd380Sjfb8856606 #define IONIC_IDENTITY_VERSION_1 1
193*2d9fd380Sjfb8856606
194*2d9fd380Sjfb8856606 /**
195*2d9fd380Sjfb8856606 * struct ionic_dev_identify_cmd - Driver/device identify command
196*2d9fd380Sjfb8856606 * @opcode: opcode
197*2d9fd380Sjfb8856606 * @ver: Highest version of identify supported by driver
198*2d9fd380Sjfb8856606 */
199*2d9fd380Sjfb8856606 struct ionic_dev_identify_cmd {
200*2d9fd380Sjfb8856606 u8 opcode;
201*2d9fd380Sjfb8856606 u8 ver;
202*2d9fd380Sjfb8856606 u8 rsvd[62];
203*2d9fd380Sjfb8856606 };
204*2d9fd380Sjfb8856606
205*2d9fd380Sjfb8856606 /**
206*2d9fd380Sjfb8856606 * struct dev_identify_comp - Driver/device identify command completion
207*2d9fd380Sjfb8856606 * @status: The status of the command (enum status_code)
208*2d9fd380Sjfb8856606 * @ver: Version of identify returned by device
209*2d9fd380Sjfb8856606 */
210*2d9fd380Sjfb8856606 struct ionic_dev_identify_comp {
211*2d9fd380Sjfb8856606 u8 status;
212*2d9fd380Sjfb8856606 u8 ver;
213*2d9fd380Sjfb8856606 u8 rsvd[14];
214*2d9fd380Sjfb8856606 };
215*2d9fd380Sjfb8856606
216*2d9fd380Sjfb8856606 enum ionic_os_type {
217*2d9fd380Sjfb8856606 IONIC_OS_TYPE_LINUX = 1,
218*2d9fd380Sjfb8856606 IONIC_OS_TYPE_WIN = 2,
219*2d9fd380Sjfb8856606 IONIC_OS_TYPE_DPDK = 3,
220*2d9fd380Sjfb8856606 IONIC_OS_TYPE_FREEBSD = 4,
221*2d9fd380Sjfb8856606 IONIC_OS_TYPE_IPXE = 5,
222*2d9fd380Sjfb8856606 IONIC_OS_TYPE_ESXI = 6,
223*2d9fd380Sjfb8856606 };
224*2d9fd380Sjfb8856606
225*2d9fd380Sjfb8856606 /**
226*2d9fd380Sjfb8856606 * union drv_identity - driver identity information
227*2d9fd380Sjfb8856606 * @os_type: OS type (see enum os_type)
228*2d9fd380Sjfb8856606 * @os_dist: OS distribution, numeric format
229*2d9fd380Sjfb8856606 * @os_dist_str: OS distribution, string format
230*2d9fd380Sjfb8856606 * @kernel_ver: Kernel version, numeric format
231*2d9fd380Sjfb8856606 * @kernel_ver_str: Kernel version, string format
232*2d9fd380Sjfb8856606 * @driver_ver_str: Driver version, string format
233*2d9fd380Sjfb8856606 */
234*2d9fd380Sjfb8856606 union ionic_drv_identity {
235*2d9fd380Sjfb8856606 struct {
236*2d9fd380Sjfb8856606 __le32 os_type;
237*2d9fd380Sjfb8856606 __le32 os_dist;
238*2d9fd380Sjfb8856606 char os_dist_str[128];
239*2d9fd380Sjfb8856606 __le32 kernel_ver;
240*2d9fd380Sjfb8856606 char kernel_ver_str[32];
241*2d9fd380Sjfb8856606 char driver_ver_str[32];
242*2d9fd380Sjfb8856606 };
243*2d9fd380Sjfb8856606 __le32 words[512];
244*2d9fd380Sjfb8856606 };
245*2d9fd380Sjfb8856606
246*2d9fd380Sjfb8856606 /**
247*2d9fd380Sjfb8856606 * union dev_identity - device identity information
248*2d9fd380Sjfb8856606 * @version: Version of device identify
249*2d9fd380Sjfb8856606 * @type: Identify type (0 for now)
250*2d9fd380Sjfb8856606 * @nports: Number of ports provisioned
251*2d9fd380Sjfb8856606 * @nlifs: Number of LIFs provisioned
252*2d9fd380Sjfb8856606 * @nintrs: Number of interrupts provisioned
253*2d9fd380Sjfb8856606 * @ndbpgs_per_lif: Number of doorbell pages per LIF
254*2d9fd380Sjfb8856606 * @intr_coal_mult: Interrupt coalescing multiplication factor.
255*2d9fd380Sjfb8856606 * Scale user-supplied interrupt coalescing
256*2d9fd380Sjfb8856606 * value in usecs to device units using:
257*2d9fd380Sjfb8856606 * device units = usecs * mult / div
258*2d9fd380Sjfb8856606 * @intr_coal_div: Interrupt coalescing division factor.
259*2d9fd380Sjfb8856606 * Scale user-supplied interrupt coalescing
260*2d9fd380Sjfb8856606 * value in usecs to device units using:
261*2d9fd380Sjfb8856606 * device units = usecs * mult / div
262*2d9fd380Sjfb8856606 *
263*2d9fd380Sjfb8856606 */
264*2d9fd380Sjfb8856606 union ionic_dev_identity {
265*2d9fd380Sjfb8856606 struct {
266*2d9fd380Sjfb8856606 u8 version;
267*2d9fd380Sjfb8856606 u8 type;
268*2d9fd380Sjfb8856606 u8 rsvd[2];
269*2d9fd380Sjfb8856606 u8 nports;
270*2d9fd380Sjfb8856606 u8 rsvd2[3];
271*2d9fd380Sjfb8856606 __le32 nlifs;
272*2d9fd380Sjfb8856606 __le32 nintrs;
273*2d9fd380Sjfb8856606 __le32 ndbpgs_per_lif;
274*2d9fd380Sjfb8856606 __le32 intr_coal_mult;
275*2d9fd380Sjfb8856606 __le32 intr_coal_div;
276*2d9fd380Sjfb8856606 };
277*2d9fd380Sjfb8856606 __le32 words[512];
278*2d9fd380Sjfb8856606 };
279*2d9fd380Sjfb8856606
280*2d9fd380Sjfb8856606 enum ionic_lif_type {
281*2d9fd380Sjfb8856606 IONIC_LIF_TYPE_CLASSIC = 0,
282*2d9fd380Sjfb8856606 IONIC_LIF_TYPE_MACVLAN = 1,
283*2d9fd380Sjfb8856606 IONIC_LIF_TYPE_NETQUEUE = 2,
284*2d9fd380Sjfb8856606 };
285*2d9fd380Sjfb8856606
286*2d9fd380Sjfb8856606 /**
287*2d9fd380Sjfb8856606 * struct ionic_lif_identify_cmd - lif identify command
288*2d9fd380Sjfb8856606 * @opcode: opcode
289*2d9fd380Sjfb8856606 * @type: lif type (enum lif_type)
290*2d9fd380Sjfb8856606 * @ver: version of identify returned by device
291*2d9fd380Sjfb8856606 */
292*2d9fd380Sjfb8856606 struct ionic_lif_identify_cmd {
293*2d9fd380Sjfb8856606 u8 opcode;
294*2d9fd380Sjfb8856606 u8 type;
295*2d9fd380Sjfb8856606 u8 ver;
296*2d9fd380Sjfb8856606 u8 rsvd[61];
297*2d9fd380Sjfb8856606 };
298*2d9fd380Sjfb8856606
299*2d9fd380Sjfb8856606 /**
300*2d9fd380Sjfb8856606 * struct ionic_lif_identify_comp - lif identify command completion
301*2d9fd380Sjfb8856606 * @status: status of the command (enum status_code)
302*2d9fd380Sjfb8856606 * @ver: version of identify returned by device
303*2d9fd380Sjfb8856606 */
304*2d9fd380Sjfb8856606 struct ionic_lif_identify_comp {
305*2d9fd380Sjfb8856606 u8 status;
306*2d9fd380Sjfb8856606 u8 ver;
307*2d9fd380Sjfb8856606 u8 rsvd2[14];
308*2d9fd380Sjfb8856606 };
309*2d9fd380Sjfb8856606
310*2d9fd380Sjfb8856606 enum ionic_lif_capability {
311*2d9fd380Sjfb8856606 IONIC_LIF_CAP_ETH = BIT(0),
312*2d9fd380Sjfb8856606 IONIC_LIF_CAP_RDMA = BIT(1),
313*2d9fd380Sjfb8856606 };
314*2d9fd380Sjfb8856606
315*2d9fd380Sjfb8856606 /**
316*2d9fd380Sjfb8856606 * Logical Queue Types
317*2d9fd380Sjfb8856606 */
318*2d9fd380Sjfb8856606 enum ionic_logical_qtype {
319*2d9fd380Sjfb8856606 IONIC_QTYPE_ADMINQ = 0,
320*2d9fd380Sjfb8856606 IONIC_QTYPE_NOTIFYQ = 1,
321*2d9fd380Sjfb8856606 IONIC_QTYPE_RXQ = 2,
322*2d9fd380Sjfb8856606 IONIC_QTYPE_TXQ = 3,
323*2d9fd380Sjfb8856606 IONIC_QTYPE_EQ = 4,
324*2d9fd380Sjfb8856606 IONIC_QTYPE_MAX = 16,
325*2d9fd380Sjfb8856606 };
326*2d9fd380Sjfb8856606
327*2d9fd380Sjfb8856606 /**
328*2d9fd380Sjfb8856606 * struct ionic_lif_logical_qtype - Descriptor of logical to hardware queue
329*2d9fd380Sjfb8856606 * type.
330*2d9fd380Sjfb8856606 * @qtype: Hardware Queue Type.
331*2d9fd380Sjfb8856606 * @qid_count: Number of Queue IDs of the logical type.
332*2d9fd380Sjfb8856606 * @qid_base: Minimum Queue ID of the logical type.
333*2d9fd380Sjfb8856606 */
334*2d9fd380Sjfb8856606 struct ionic_lif_logical_qtype {
335*2d9fd380Sjfb8856606 u8 qtype;
336*2d9fd380Sjfb8856606 u8 rsvd[3];
337*2d9fd380Sjfb8856606 __le32 qid_count;
338*2d9fd380Sjfb8856606 __le32 qid_base;
339*2d9fd380Sjfb8856606 };
340*2d9fd380Sjfb8856606
341*2d9fd380Sjfb8856606 enum ionic_lif_state {
342*2d9fd380Sjfb8856606 IONIC_LIF_DISABLE = 0,
343*2d9fd380Sjfb8856606 IONIC_LIF_ENABLE = 1,
344*2d9fd380Sjfb8856606 IONIC_LIF_HANG_RESET = 2,
345*2d9fd380Sjfb8856606 };
346*2d9fd380Sjfb8856606
347*2d9fd380Sjfb8856606 /**
348*2d9fd380Sjfb8856606 * LIF configuration
349*2d9fd380Sjfb8856606 * @state: lif state (enum lif_state)
350*2d9fd380Sjfb8856606 * @name: lif name
351*2d9fd380Sjfb8856606 * @mtu: mtu
352*2d9fd380Sjfb8856606 * @mac: station mac address
353*2d9fd380Sjfb8856606 * @features: features (enum ionic_eth_hw_features)
354*2d9fd380Sjfb8856606 * @queue_count: queue counts per queue-type
355*2d9fd380Sjfb8856606 */
356*2d9fd380Sjfb8856606 union ionic_lif_config {
357*2d9fd380Sjfb8856606 struct {
358*2d9fd380Sjfb8856606 u8 state;
359*2d9fd380Sjfb8856606 u8 rsvd[3];
360*2d9fd380Sjfb8856606 char name[IONIC_IFNAMSIZ];
361*2d9fd380Sjfb8856606 __le32 mtu;
362*2d9fd380Sjfb8856606 u8 mac[6];
363*2d9fd380Sjfb8856606 u8 rsvd2[2];
364*2d9fd380Sjfb8856606 __le64 features;
365*2d9fd380Sjfb8856606 __le32 queue_count[IONIC_QTYPE_MAX];
366*2d9fd380Sjfb8856606 };
367*2d9fd380Sjfb8856606 __le32 words[64];
368*2d9fd380Sjfb8856606 };
369*2d9fd380Sjfb8856606
370*2d9fd380Sjfb8856606 /**
371*2d9fd380Sjfb8856606 * struct ionic_lif_identity - lif identity information (type-specific)
372*2d9fd380Sjfb8856606 *
373*2d9fd380Sjfb8856606 * @capabilities LIF capabilities
374*2d9fd380Sjfb8856606 *
375*2d9fd380Sjfb8856606 * Ethernet:
376*2d9fd380Sjfb8856606 * @version: Ethernet identify structure version.
377*2d9fd380Sjfb8856606 * @features: Ethernet features supported on this lif type.
378*2d9fd380Sjfb8856606 * @max_ucast_filters: Number of perfect unicast addresses supported.
379*2d9fd380Sjfb8856606 * @max_mcast_filters: Number of perfect multicast addresses supported.
380*2d9fd380Sjfb8856606 * @min_frame_size: Minimum size of frames to be sent
381*2d9fd380Sjfb8856606 * @max_frame_size: Maximum size of frames to be sent
382*2d9fd380Sjfb8856606 * @config: LIF config struct with features, mtu, mac, q counts
383*2d9fd380Sjfb8856606 *
384*2d9fd380Sjfb8856606 * RDMA:
385*2d9fd380Sjfb8856606 * @version: RDMA version of opcodes and queue descriptors.
386*2d9fd380Sjfb8856606 * @qp_opcodes: Number of rdma queue pair opcodes supported.
387*2d9fd380Sjfb8856606 * @admin_opcodes: Number of rdma admin opcodes supported.
388*2d9fd380Sjfb8856606 * @npts_per_lif: Page table size per lif
389*2d9fd380Sjfb8856606 * @nmrs_per_lif: Number of memory regions per lif
390*2d9fd380Sjfb8856606 * @nahs_per_lif: Number of address handles per lif
391*2d9fd380Sjfb8856606 * @max_stride: Max work request stride.
392*2d9fd380Sjfb8856606 * @cl_stride: Cache line stride.
393*2d9fd380Sjfb8856606 * @pte_stride: Page table entry stride.
394*2d9fd380Sjfb8856606 * @rrq_stride: Remote RQ work request stride.
395*2d9fd380Sjfb8856606 * @rsq_stride: Remote SQ work request stride.
396*2d9fd380Sjfb8856606 * @dcqcn_profiles: Number of DCQCN profiles
397*2d9fd380Sjfb8856606 * @aq_qtype: RDMA Admin Qtype.
398*2d9fd380Sjfb8856606 * @sq_qtype: RDMA Send Qtype.
399*2d9fd380Sjfb8856606 * @rq_qtype: RDMA Receive Qtype.
400*2d9fd380Sjfb8856606 * @cq_qtype: RDMA Completion Qtype.
401*2d9fd380Sjfb8856606 * @eq_qtype: RDMA Event Qtype.
402*2d9fd380Sjfb8856606 */
403*2d9fd380Sjfb8856606 union ionic_lif_identity {
404*2d9fd380Sjfb8856606 struct {
405*2d9fd380Sjfb8856606 __le64 capabilities;
406*2d9fd380Sjfb8856606
407*2d9fd380Sjfb8856606 struct {
408*2d9fd380Sjfb8856606 u8 version;
409*2d9fd380Sjfb8856606 u8 rsvd[3];
410*2d9fd380Sjfb8856606 __le32 max_ucast_filters;
411*2d9fd380Sjfb8856606 __le32 max_mcast_filters;
412*2d9fd380Sjfb8856606 __le16 rss_ind_tbl_sz;
413*2d9fd380Sjfb8856606 __le32 min_frame_size;
414*2d9fd380Sjfb8856606 __le32 max_frame_size;
415*2d9fd380Sjfb8856606 u8 rsvd2[106];
416*2d9fd380Sjfb8856606 union ionic_lif_config config;
417*2d9fd380Sjfb8856606 } eth;
418*2d9fd380Sjfb8856606
419*2d9fd380Sjfb8856606 struct {
420*2d9fd380Sjfb8856606 u8 version;
421*2d9fd380Sjfb8856606 u8 qp_opcodes;
422*2d9fd380Sjfb8856606 u8 admin_opcodes;
423*2d9fd380Sjfb8856606 u8 rsvd;
424*2d9fd380Sjfb8856606 __le32 npts_per_lif;
425*2d9fd380Sjfb8856606 __le32 nmrs_per_lif;
426*2d9fd380Sjfb8856606 __le32 nahs_per_lif;
427*2d9fd380Sjfb8856606 u8 max_stride;
428*2d9fd380Sjfb8856606 u8 cl_stride;
429*2d9fd380Sjfb8856606 u8 pte_stride;
430*2d9fd380Sjfb8856606 u8 rrq_stride;
431*2d9fd380Sjfb8856606 u8 rsq_stride;
432*2d9fd380Sjfb8856606 u8 dcqcn_profiles;
433*2d9fd380Sjfb8856606 u8 rsvd_dimensions[10];
434*2d9fd380Sjfb8856606 struct ionic_lif_logical_qtype aq_qtype;
435*2d9fd380Sjfb8856606 struct ionic_lif_logical_qtype sq_qtype;
436*2d9fd380Sjfb8856606 struct ionic_lif_logical_qtype rq_qtype;
437*2d9fd380Sjfb8856606 struct ionic_lif_logical_qtype cq_qtype;
438*2d9fd380Sjfb8856606 struct ionic_lif_logical_qtype eq_qtype;
439*2d9fd380Sjfb8856606 } rdma;
440*2d9fd380Sjfb8856606 };
441*2d9fd380Sjfb8856606 __le32 words[512];
442*2d9fd380Sjfb8856606 };
443*2d9fd380Sjfb8856606
444*2d9fd380Sjfb8856606 /**
445*2d9fd380Sjfb8856606 * struct ionic_lif_init_cmd - LIF init command
446*2d9fd380Sjfb8856606 * @opcode: opcode
447*2d9fd380Sjfb8856606 * @type: LIF type (enum lif_type)
448*2d9fd380Sjfb8856606 * @index: LIF index
449*2d9fd380Sjfb8856606 * @info_pa: destination address for lif info (struct ionic_lif_info)
450*2d9fd380Sjfb8856606 */
451*2d9fd380Sjfb8856606 struct ionic_lif_init_cmd {
452*2d9fd380Sjfb8856606 u8 opcode;
453*2d9fd380Sjfb8856606 u8 type;
454*2d9fd380Sjfb8856606 __le16 index;
455*2d9fd380Sjfb8856606 __le32 rsvd;
456*2d9fd380Sjfb8856606 __le64 info_pa;
457*2d9fd380Sjfb8856606 u8 rsvd2[48];
458*2d9fd380Sjfb8856606 };
459*2d9fd380Sjfb8856606
460*2d9fd380Sjfb8856606 /**
461*2d9fd380Sjfb8856606 * struct ionic_lif_init_comp - LIF init command completion
462*2d9fd380Sjfb8856606 * @status: The status of the command (enum status_code)
463*2d9fd380Sjfb8856606 */
464*2d9fd380Sjfb8856606 struct ionic_lif_init_comp {
465*2d9fd380Sjfb8856606 u8 status;
466*2d9fd380Sjfb8856606 u8 rsvd;
467*2d9fd380Sjfb8856606 __le16 hw_index;
468*2d9fd380Sjfb8856606 u8 rsvd2[12];
469*2d9fd380Sjfb8856606 };
470*2d9fd380Sjfb8856606
471*2d9fd380Sjfb8856606 /**
472*2d9fd380Sjfb8856606 * struct ionic_q_init_cmd - Queue init command
473*2d9fd380Sjfb8856606 * @opcode: opcode
474*2d9fd380Sjfb8856606 * @type: Logical queue type
475*2d9fd380Sjfb8856606 * @ver: Queue version (defines opcode/descriptor scope)
476*2d9fd380Sjfb8856606 * @lif_index: LIF index
477*2d9fd380Sjfb8856606 * @index: (lif, qtype) relative admin queue index
478*2d9fd380Sjfb8856606 * @intr_index: Interrupt control register index
479*2d9fd380Sjfb8856606 * @pid: Process ID
480*2d9fd380Sjfb8856606 * @flags:
481*2d9fd380Sjfb8856606 * IRQ: Interrupt requested on completion
482*2d9fd380Sjfb8856606 * ENA: Enable the queue. If ENA=0 the queue is initialized
483*2d9fd380Sjfb8856606 * but remains disabled, to be later enabled with the
484*2d9fd380Sjfb8856606 * Queue Enable command. If ENA=1, then queue is
485*2d9fd380Sjfb8856606 * initialized and then enabled.
486*2d9fd380Sjfb8856606 * SG: Enable Scatter-Gather on the queue.
487*2d9fd380Sjfb8856606 * in number of descs. The actual ring size is
488*2d9fd380Sjfb8856606 * (1 << ring_size). For example, to
489*2d9fd380Sjfb8856606 * select a ring size of 64 descriptors write
490*2d9fd380Sjfb8856606 * ring_size = 6. The minimum ring_size value is 2
491*2d9fd380Sjfb8856606 * for a ring size of 4 descriptors. The maximum
492*2d9fd380Sjfb8856606 * ring_size value is 16 for a ring size of 64k
493*2d9fd380Sjfb8856606 * descriptors. Values of ring_size <2 and >16 are
494*2d9fd380Sjfb8856606 * reserved.
495*2d9fd380Sjfb8856606 * EQ: Enable the Event Queue
496*2d9fd380Sjfb8856606 * @cos: Class of service for this queue.
497*2d9fd380Sjfb8856606 * @ring_size: Queue ring size, encoded as a log2(size)
498*2d9fd380Sjfb8856606 * @ring_base: Queue ring base address
499*2d9fd380Sjfb8856606 * @cq_ring_base: Completion queue ring base address
500*2d9fd380Sjfb8856606 * @sg_ring_base: Scatter/Gather ring base address
501*2d9fd380Sjfb8856606 * @eq_index: Event queue index
502*2d9fd380Sjfb8856606 */
503*2d9fd380Sjfb8856606 struct ionic_q_init_cmd {
504*2d9fd380Sjfb8856606 u8 opcode;
505*2d9fd380Sjfb8856606 u8 rsvd;
506*2d9fd380Sjfb8856606 __le16 lif_index;
507*2d9fd380Sjfb8856606 u8 type;
508*2d9fd380Sjfb8856606 u8 ver;
509*2d9fd380Sjfb8856606 u8 rsvd1[2];
510*2d9fd380Sjfb8856606 __le32 index;
511*2d9fd380Sjfb8856606 __le16 pid;
512*2d9fd380Sjfb8856606 __le16 intr_index;
513*2d9fd380Sjfb8856606 __le16 flags;
514*2d9fd380Sjfb8856606 #define IONIC_QINIT_F_IRQ 0x01 /* Request interrupt on completion */
515*2d9fd380Sjfb8856606 #define IONIC_QINIT_F_ENA 0x02 /* Enable the queue */
516*2d9fd380Sjfb8856606 #define IONIC_QINIT_F_SG 0x04 /* Enable scatter/gather on the queue */
517*2d9fd380Sjfb8856606 #define IONIC_QINIT_F_EQ 0x08 /* Enable event queue */
518*2d9fd380Sjfb8856606 #define IONIC_QINIT_F_DEBUG 0x80 /* Enable queue debugging */
519*2d9fd380Sjfb8856606 u8 cos;
520*2d9fd380Sjfb8856606 u8 ring_size;
521*2d9fd380Sjfb8856606 __le64 ring_base;
522*2d9fd380Sjfb8856606 __le64 cq_ring_base;
523*2d9fd380Sjfb8856606 __le64 sg_ring_base;
524*2d9fd380Sjfb8856606 __le32 eq_index;
525*2d9fd380Sjfb8856606 u8 rsvd2[16];
526*2d9fd380Sjfb8856606 };
527*2d9fd380Sjfb8856606
528*2d9fd380Sjfb8856606 /**
529*2d9fd380Sjfb8856606 * struct ionic_q_init_comp - Queue init command completion
530*2d9fd380Sjfb8856606 * @status: The status of the command (enum status_code)
531*2d9fd380Sjfb8856606 * @ver: Queue version (defines opcode/descriptor scope)
532*2d9fd380Sjfb8856606 * @comp_index: The index in the descriptor ring for which this
533*2d9fd380Sjfb8856606 * is the completion.
534*2d9fd380Sjfb8856606 * @hw_index: Hardware Queue ID
535*2d9fd380Sjfb8856606 * @hw_type: Hardware Queue type
536*2d9fd380Sjfb8856606 * @color: Color
537*2d9fd380Sjfb8856606 */
538*2d9fd380Sjfb8856606 struct ionic_q_init_comp {
539*2d9fd380Sjfb8856606 u8 status;
540*2d9fd380Sjfb8856606 u8 ver;
541*2d9fd380Sjfb8856606 __le16 comp_index;
542*2d9fd380Sjfb8856606 __le32 hw_index;
543*2d9fd380Sjfb8856606 u8 hw_type;
544*2d9fd380Sjfb8856606 u8 rsvd2[6];
545*2d9fd380Sjfb8856606 u8 color;
546*2d9fd380Sjfb8856606 };
547*2d9fd380Sjfb8856606
548*2d9fd380Sjfb8856606 /* the device's internal addressing uses up to 52 bits */
549*2d9fd380Sjfb8856606 #define IONIC_ADDR_LEN 52
550*2d9fd380Sjfb8856606 #define IONIC_ADDR_MASK (BIT_ULL(IONIC_ADDR_LEN) - 1)
551*2d9fd380Sjfb8856606
552*2d9fd380Sjfb8856606 enum ionic_txq_desc_opcode {
553*2d9fd380Sjfb8856606 IONIC_TXQ_DESC_OPCODE_CSUM_NONE = 0,
554*2d9fd380Sjfb8856606 IONIC_TXQ_DESC_OPCODE_CSUM_PARTIAL = 1,
555*2d9fd380Sjfb8856606 IONIC_TXQ_DESC_OPCODE_CSUM_HW = 2,
556*2d9fd380Sjfb8856606 IONIC_TXQ_DESC_OPCODE_TSO = 3,
557*2d9fd380Sjfb8856606 };
558*2d9fd380Sjfb8856606
559*2d9fd380Sjfb8856606 /**
560*2d9fd380Sjfb8856606 * struct ionic_txq_desc - Ethernet Tx queue descriptor format
561*2d9fd380Sjfb8856606 * @opcode: Tx operation, see TXQ_DESC_OPCODE_*:
562*2d9fd380Sjfb8856606 *
563*2d9fd380Sjfb8856606 * IONIC_TXQ_DESC_OPCODE_CSUM_NONE:
564*2d9fd380Sjfb8856606 *
565*2d9fd380Sjfb8856606 * Non-offload send. No segmentation,
566*2d9fd380Sjfb8856606 * fragmentation or checksum calc/insertion is
567*2d9fd380Sjfb8856606 * performed by device; packet is prepared
568*2d9fd380Sjfb8856606 * to send by software stack and requires
569*2d9fd380Sjfb8856606 * no further manipulation from device.
570*2d9fd380Sjfb8856606 *
571*2d9fd380Sjfb8856606 * IONIC_TXQ_DESC_OPCODE_CSUM_PARTIAL:
572*2d9fd380Sjfb8856606 *
573*2d9fd380Sjfb8856606 * Offload 16-bit L4 checksum
574*2d9fd380Sjfb8856606 * calculation/insertion. The device will
575*2d9fd380Sjfb8856606 * calculate the L4 checksum value and
576*2d9fd380Sjfb8856606 * insert the result in the packet's L4
577*2d9fd380Sjfb8856606 * header checksum field. The L4 checksum
578*2d9fd380Sjfb8856606 * is calculated starting at @csum_start bytes
579*2d9fd380Sjfb8856606 * into the packet to the end of the packet.
580*2d9fd380Sjfb8856606 * The checksum insertion position is given
581*2d9fd380Sjfb8856606 * in @csum_offset. This feature is only
582*2d9fd380Sjfb8856606 * applicable to protocols such as TCP, UDP
583*2d9fd380Sjfb8856606 * and ICMP where a standard (i.e. the
584*2d9fd380Sjfb8856606 * 'IP-style' checksum) one's complement
585*2d9fd380Sjfb8856606 * 16-bit checksum is used, using an IP
586*2d9fd380Sjfb8856606 * pseudo-header to seed the calculation.
587*2d9fd380Sjfb8856606 * Software will preload the L4 checksum
588*2d9fd380Sjfb8856606 * field with the IP pseudo-header checksum.
589*2d9fd380Sjfb8856606 *
590*2d9fd380Sjfb8856606 * For tunnel encapsulation, @csum_start and
591*2d9fd380Sjfb8856606 * @csum_offset refer to the inner L4
592*2d9fd380Sjfb8856606 * header. Supported tunnels encapsulations
593*2d9fd380Sjfb8856606 * are: IPIP, GRE, and UDP. If the @encap
594*2d9fd380Sjfb8856606 * is clear, no further processing by the
595*2d9fd380Sjfb8856606 * device is required; software will
596*2d9fd380Sjfb8856606 * calculate the outer header checksums. If
597*2d9fd380Sjfb8856606 * the @encap is set, the device will
598*2d9fd380Sjfb8856606 * offload the outer header checksums using
599*2d9fd380Sjfb8856606 * LCO (local checksum offload) (see
600*2d9fd380Sjfb8856606 * Documentation/networking/checksum-
601*2d9fd380Sjfb8856606 * offloads.txt for more info).
602*2d9fd380Sjfb8856606 *
603*2d9fd380Sjfb8856606 * IONIC_TXQ_DESC_OPCODE_CSUM_HW:
604*2d9fd380Sjfb8856606 *
605*2d9fd380Sjfb8856606 * Offload 16-bit checksum computation to hardware.
606*2d9fd380Sjfb8856606 * If @csum_l3 is set then the packet's L3 checksum is
607*2d9fd380Sjfb8856606 * updated. Similarly, if @csum_l4 is set the the L4
608*2d9fd380Sjfb8856606 * checksum is updated. If @encap is set then encap header
609*2d9fd380Sjfb8856606 * checksums are also updated.
610*2d9fd380Sjfb8856606 *
611*2d9fd380Sjfb8856606 * IONIC_TXQ_DESC_OPCODE_TSO:
612*2d9fd380Sjfb8856606 *
613*2d9fd380Sjfb8856606 * Device performs TCP segmentation offload
614*2d9fd380Sjfb8856606 * (TSO). @hdr_len is the number of bytes
615*2d9fd380Sjfb8856606 * to the end of TCP header (the offset to
616*2d9fd380Sjfb8856606 * the TCP payload). @mss is the desired
617*2d9fd380Sjfb8856606 * MSS, the TCP payload length for each
618*2d9fd380Sjfb8856606 * segment. The device will calculate/
619*2d9fd380Sjfb8856606 * insert IP (IPv4 only) and TCP checksums
620*2d9fd380Sjfb8856606 * for each segment. In the first data
621*2d9fd380Sjfb8856606 * buffer containing the header template,
622*2d9fd380Sjfb8856606 * the driver will set IPv4 checksum to 0
623*2d9fd380Sjfb8856606 * and preload TCP checksum with the IP
624*2d9fd380Sjfb8856606 * pseudo header calculated with IP length = 0.
625*2d9fd380Sjfb8856606 *
626*2d9fd380Sjfb8856606 * Supported tunnel encapsulations are IPIP,
627*2d9fd380Sjfb8856606 * layer-3 GRE, and UDP. @hdr_len includes
628*2d9fd380Sjfb8856606 * both outer and inner headers. The driver
629*2d9fd380Sjfb8856606 * will set IPv4 checksum to zero and
630*2d9fd380Sjfb8856606 * preload TCP checksum with IP pseudo
631*2d9fd380Sjfb8856606 * header on the inner header.
632*2d9fd380Sjfb8856606 *
633*2d9fd380Sjfb8856606 * TCP ECN offload is supported. The device
634*2d9fd380Sjfb8856606 * will set CWR flag in the first segment if
635*2d9fd380Sjfb8856606 * CWR is set in the template header, and
636*2d9fd380Sjfb8856606 * clear CWR in remaining segments.
637*2d9fd380Sjfb8856606 * @flags:
638*2d9fd380Sjfb8856606 * vlan:
639*2d9fd380Sjfb8856606 * Insert an L2 VLAN header using @vlan_tci.
640*2d9fd380Sjfb8856606 * encap:
641*2d9fd380Sjfb8856606 * Calculate encap header checksum.
642*2d9fd380Sjfb8856606 * csum_l3:
643*2d9fd380Sjfb8856606 * Compute L3 header checksum.
644*2d9fd380Sjfb8856606 * csum_l4:
645*2d9fd380Sjfb8856606 * Compute L4 header checksum.
646*2d9fd380Sjfb8856606 * tso_sot:
647*2d9fd380Sjfb8856606 * TSO start
648*2d9fd380Sjfb8856606 * tso_eot:
649*2d9fd380Sjfb8856606 * TSO end
650*2d9fd380Sjfb8856606 * @num_sg_elems: Number of scatter-gather elements in SG
651*2d9fd380Sjfb8856606 * descriptor
652*2d9fd380Sjfb8856606 * @addr: First data buffer's DMA address.
653*2d9fd380Sjfb8856606 * (Subsequent data buffers are on txq_sg_desc).
654*2d9fd380Sjfb8856606 * @len: First data buffer's length, in bytes
655*2d9fd380Sjfb8856606 * @vlan_tci: VLAN tag to insert in the packet (if requested
656*2d9fd380Sjfb8856606 * by @V-bit). Includes .1p and .1q tags
657*2d9fd380Sjfb8856606 * @hdr_len: Length of packet headers, including
658*2d9fd380Sjfb8856606 * encapsulating outer header, if applicable.
659*2d9fd380Sjfb8856606 * Valid for opcodes TXQ_DESC_OPCODE_CALC_CSUM and
660*2d9fd380Sjfb8856606 * TXQ_DESC_OPCODE_TSO. Should be set to zero for
661*2d9fd380Sjfb8856606 * all other modes. For
662*2d9fd380Sjfb8856606 * TXQ_DESC_OPCODE_CALC_CSUM, @hdr_len is length
663*2d9fd380Sjfb8856606 * of headers up to inner-most L4 header. For
664*2d9fd380Sjfb8856606 * TXQ_DESC_OPCODE_TSO, @hdr_len is up to
665*2d9fd380Sjfb8856606 * inner-most L4 payload, so inclusive of
666*2d9fd380Sjfb8856606 * inner-most L4 header.
667*2d9fd380Sjfb8856606 * @mss: Desired MSS value for TSO. Only applicable for
668*2d9fd380Sjfb8856606 * TXQ_DESC_OPCODE_TSO.
669*2d9fd380Sjfb8856606 * @csum_start: Offset into inner-most L3 header of checksum
670*2d9fd380Sjfb8856606 * @csum_offset: Offset into inner-most L4 header of checksum
671*2d9fd380Sjfb8856606 */
672*2d9fd380Sjfb8856606
673*2d9fd380Sjfb8856606 #define IONIC_TXQ_DESC_OPCODE_MASK 0xf
674*2d9fd380Sjfb8856606 #define IONIC_TXQ_DESC_OPCODE_SHIFT 4
675*2d9fd380Sjfb8856606 #define IONIC_TXQ_DESC_FLAGS_MASK 0xf
676*2d9fd380Sjfb8856606 #define IONIC_TXQ_DESC_FLAGS_SHIFT 0
677*2d9fd380Sjfb8856606 #define IONIC_TXQ_DESC_NSGE_MASK 0xf
678*2d9fd380Sjfb8856606 #define IONIC_TXQ_DESC_NSGE_SHIFT 8
679*2d9fd380Sjfb8856606 #define IONIC_TXQ_DESC_ADDR_MASK (BIT_ULL(IONIC_ADDR_LEN) - 1)
680*2d9fd380Sjfb8856606 #define IONIC_TXQ_DESC_ADDR_SHIFT 12
681*2d9fd380Sjfb8856606
682*2d9fd380Sjfb8856606 /* common flags */
683*2d9fd380Sjfb8856606 #define IONIC_TXQ_DESC_FLAG_VLAN 0x1
684*2d9fd380Sjfb8856606 #define IONIC_TXQ_DESC_FLAG_ENCAP 0x2
685*2d9fd380Sjfb8856606
686*2d9fd380Sjfb8856606 /* flags for csum_hw opcode */
687*2d9fd380Sjfb8856606 #define IONIC_TXQ_DESC_FLAG_CSUM_L3 0x4
688*2d9fd380Sjfb8856606 #define IONIC_TXQ_DESC_FLAG_CSUM_L4 0x8
689*2d9fd380Sjfb8856606
690*2d9fd380Sjfb8856606 /* flags for tso opcode */
691*2d9fd380Sjfb8856606 #define IONIC_TXQ_DESC_FLAG_TSO_SOT 0x4
692*2d9fd380Sjfb8856606 #define IONIC_TXQ_DESC_FLAG_TSO_EOT 0x8
693*2d9fd380Sjfb8856606
694*2d9fd380Sjfb8856606 struct ionic_txq_desc {
695*2d9fd380Sjfb8856606 __le64 cmd;
696*2d9fd380Sjfb8856606 __le16 len;
697*2d9fd380Sjfb8856606 union {
698*2d9fd380Sjfb8856606 __le16 vlan_tci;
699*2d9fd380Sjfb8856606 __le16 hword0;
700*2d9fd380Sjfb8856606 };
701*2d9fd380Sjfb8856606 union {
702*2d9fd380Sjfb8856606 __le16 csum_start;
703*2d9fd380Sjfb8856606 __le16 hdr_len;
704*2d9fd380Sjfb8856606 __le16 hword1;
705*2d9fd380Sjfb8856606 };
706*2d9fd380Sjfb8856606 union {
707*2d9fd380Sjfb8856606 __le16 csum_offset;
708*2d9fd380Sjfb8856606 __le16 mss;
709*2d9fd380Sjfb8856606 __le16 hword2;
710*2d9fd380Sjfb8856606 };
711*2d9fd380Sjfb8856606 };
712*2d9fd380Sjfb8856606
encode_txq_desc_cmd(u8 opcode,u8 flags,u8 nsge,u64 addr)713*2d9fd380Sjfb8856606 static inline u64 encode_txq_desc_cmd(u8 opcode, u8 flags,
714*2d9fd380Sjfb8856606 u8 nsge, u64 addr)
715*2d9fd380Sjfb8856606 {
716*2d9fd380Sjfb8856606 u64 cmd;
717*2d9fd380Sjfb8856606
718*2d9fd380Sjfb8856606 cmd = (opcode & IONIC_TXQ_DESC_OPCODE_MASK) <<
719*2d9fd380Sjfb8856606 IONIC_TXQ_DESC_OPCODE_SHIFT;
720*2d9fd380Sjfb8856606 cmd |= (flags & IONIC_TXQ_DESC_FLAGS_MASK) <<
721*2d9fd380Sjfb8856606 IONIC_TXQ_DESC_FLAGS_SHIFT;
722*2d9fd380Sjfb8856606 cmd |= (nsge & IONIC_TXQ_DESC_NSGE_MASK) << IONIC_TXQ_DESC_NSGE_SHIFT;
723*2d9fd380Sjfb8856606 cmd |= (addr & IONIC_TXQ_DESC_ADDR_MASK) << IONIC_TXQ_DESC_ADDR_SHIFT;
724*2d9fd380Sjfb8856606
725*2d9fd380Sjfb8856606 return cmd;
726*2d9fd380Sjfb8856606 };
727*2d9fd380Sjfb8856606
decode_txq_desc_cmd(u64 cmd,u8 * opcode,u8 * flags,u8 * nsge,u64 * addr)728*2d9fd380Sjfb8856606 static inline void decode_txq_desc_cmd(u64 cmd, u8 *opcode, u8 *flags,
729*2d9fd380Sjfb8856606 u8 *nsge, u64 *addr)
730*2d9fd380Sjfb8856606 {
731*2d9fd380Sjfb8856606 *opcode = (cmd >> IONIC_TXQ_DESC_OPCODE_SHIFT) &
732*2d9fd380Sjfb8856606 IONIC_TXQ_DESC_OPCODE_MASK;
733*2d9fd380Sjfb8856606 *flags = (cmd >> IONIC_TXQ_DESC_FLAGS_SHIFT) &
734*2d9fd380Sjfb8856606 IONIC_TXQ_DESC_FLAGS_MASK;
735*2d9fd380Sjfb8856606 *nsge = (cmd >> IONIC_TXQ_DESC_NSGE_SHIFT) & IONIC_TXQ_DESC_NSGE_MASK;
736*2d9fd380Sjfb8856606 *addr = (cmd >> IONIC_TXQ_DESC_ADDR_SHIFT) & IONIC_TXQ_DESC_ADDR_MASK;
737*2d9fd380Sjfb8856606 };
738*2d9fd380Sjfb8856606
739*2d9fd380Sjfb8856606 #define IONIC_TX_MAX_SG_ELEMS 8
740*2d9fd380Sjfb8856606 #define IONIC_RX_MAX_SG_ELEMS 8
741*2d9fd380Sjfb8856606
742*2d9fd380Sjfb8856606 /**
743*2d9fd380Sjfb8856606 * struct ionic_txq_sg_desc - Transmit scatter-gather (SG) list
744*2d9fd380Sjfb8856606 * @addr: DMA address of SG element data buffer
745*2d9fd380Sjfb8856606 * @len: Length of SG element data buffer, in bytes
746*2d9fd380Sjfb8856606 */
747*2d9fd380Sjfb8856606 struct ionic_txq_sg_desc {
748*2d9fd380Sjfb8856606 struct ionic_txq_sg_elem {
749*2d9fd380Sjfb8856606 __le64 addr;
750*2d9fd380Sjfb8856606 __le16 len;
751*2d9fd380Sjfb8856606 __le16 rsvd[3];
752*2d9fd380Sjfb8856606 } elems[IONIC_TX_MAX_SG_ELEMS];
753*2d9fd380Sjfb8856606 };
754*2d9fd380Sjfb8856606
755*2d9fd380Sjfb8856606 /**
756*2d9fd380Sjfb8856606 * struct ionic_txq_comp - Ethernet transmit queue completion descriptor
757*2d9fd380Sjfb8856606 * @status: The status of the command (enum status_code)
758*2d9fd380Sjfb8856606 * @comp_index: The index in the descriptor ring for which this
759*2d9fd380Sjfb8856606 * is the completion.
760*2d9fd380Sjfb8856606 * @color: Color bit.
761*2d9fd380Sjfb8856606 */
762*2d9fd380Sjfb8856606 struct ionic_txq_comp {
763*2d9fd380Sjfb8856606 u8 status;
764*2d9fd380Sjfb8856606 u8 rsvd;
765*2d9fd380Sjfb8856606 __le16 comp_index;
766*2d9fd380Sjfb8856606 u8 rsvd2[11];
767*2d9fd380Sjfb8856606 u8 color;
768*2d9fd380Sjfb8856606 };
769*2d9fd380Sjfb8856606
770*2d9fd380Sjfb8856606 enum ionic_rxq_desc_opcode {
771*2d9fd380Sjfb8856606 IONIC_RXQ_DESC_OPCODE_SIMPLE = 0,
772*2d9fd380Sjfb8856606 IONIC_RXQ_DESC_OPCODE_SG = 1,
773*2d9fd380Sjfb8856606 };
774*2d9fd380Sjfb8856606
775*2d9fd380Sjfb8856606 /**
776*2d9fd380Sjfb8856606 * struct ionic_rxq_desc - Ethernet Rx queue descriptor format
777*2d9fd380Sjfb8856606 * @opcode: Rx operation, see RXQ_DESC_OPCODE_*:
778*2d9fd380Sjfb8856606 *
779*2d9fd380Sjfb8856606 * RXQ_DESC_OPCODE_SIMPLE:
780*2d9fd380Sjfb8856606 *
781*2d9fd380Sjfb8856606 * Receive full packet into data buffer
782*2d9fd380Sjfb8856606 * starting at @addr. Results of
783*2d9fd380Sjfb8856606 * receive, including actual bytes received,
784*2d9fd380Sjfb8856606 * are recorded in Rx completion descriptor.
785*2d9fd380Sjfb8856606 *
786*2d9fd380Sjfb8856606 * @len: Data buffer's length, in bytes.
787*2d9fd380Sjfb8856606 * @addr: Data buffer's DMA address
788*2d9fd380Sjfb8856606 */
789*2d9fd380Sjfb8856606 struct ionic_rxq_desc {
790*2d9fd380Sjfb8856606 u8 opcode;
791*2d9fd380Sjfb8856606 u8 rsvd[5];
792*2d9fd380Sjfb8856606 __le16 len;
793*2d9fd380Sjfb8856606 __le64 addr;
794*2d9fd380Sjfb8856606 };
795*2d9fd380Sjfb8856606
796*2d9fd380Sjfb8856606 /**
797*2d9fd380Sjfb8856606 * struct ionic_rxq_sg_desc - Receive scatter-gather (SG) list
798*2d9fd380Sjfb8856606 * @addr: DMA address of SG element data buffer
799*2d9fd380Sjfb8856606 * @len: Length of SG element data buffer, in bytes
800*2d9fd380Sjfb8856606 */
801*2d9fd380Sjfb8856606 struct ionic_rxq_sg_desc {
802*2d9fd380Sjfb8856606 struct ionic_rxq_sg_elem {
803*2d9fd380Sjfb8856606 __le64 addr;
804*2d9fd380Sjfb8856606 __le16 len;
805*2d9fd380Sjfb8856606 __le16 rsvd[3];
806*2d9fd380Sjfb8856606 } elems[IONIC_RX_MAX_SG_ELEMS];
807*2d9fd380Sjfb8856606 };
808*2d9fd380Sjfb8856606
809*2d9fd380Sjfb8856606 /**
810*2d9fd380Sjfb8856606 * struct ionic_rxq_comp - Ethernet receive queue completion descriptor
811*2d9fd380Sjfb8856606 * @status: The status of the command (enum status_code)
812*2d9fd380Sjfb8856606 * @num_sg_elems: Number of SG elements used by this descriptor
813*2d9fd380Sjfb8856606 * @comp_index: The index in the descriptor ring for which this
814*2d9fd380Sjfb8856606 * is the completion.
815*2d9fd380Sjfb8856606 * @rss_hash: 32-bit RSS hash
816*2d9fd380Sjfb8856606 * @csum: 16-bit sum of the packet's L2 payload.
817*2d9fd380Sjfb8856606 * If the packet's L2 payload is odd length, an extra
818*2d9fd380Sjfb8856606 * zero-value byte is included in the @csum calculation but
819*2d9fd380Sjfb8856606 * not included in @len.
820*2d9fd380Sjfb8856606 * @vlan_tci: VLAN tag stripped from the packet. Valid if @VLAN is
821*2d9fd380Sjfb8856606 * set. Includes .1p and .1q tags.
822*2d9fd380Sjfb8856606 * @len: Received packet length, in bytes. Excludes FCS.
823*2d9fd380Sjfb8856606 * @csum_calc L2 payload checksum is computed or not
824*2d9fd380Sjfb8856606 * @csum_tcp_ok: The TCP checksum calculated by the device
825*2d9fd380Sjfb8856606 * matched the checksum in the receive packet's
826*2d9fd380Sjfb8856606 * TCP header
827*2d9fd380Sjfb8856606 * @csum_tcp_bad: The TCP checksum calculated by the device did
828*2d9fd380Sjfb8856606 * not match the checksum in the receive packet's
829*2d9fd380Sjfb8856606 * TCP header.
830*2d9fd380Sjfb8856606 * @csum_udp_ok: The UDP checksum calculated by the device
831*2d9fd380Sjfb8856606 * matched the checksum in the receive packet's
832*2d9fd380Sjfb8856606 * UDP header
833*2d9fd380Sjfb8856606 * @csum_udp_bad: The UDP checksum calculated by the device did
834*2d9fd380Sjfb8856606 * not match the checksum in the receive packet's
835*2d9fd380Sjfb8856606 * UDP header.
836*2d9fd380Sjfb8856606 * @csum_ip_ok: The IPv4 checksum calculated by the device
837*2d9fd380Sjfb8856606 * matched the checksum in the receive packet's
838*2d9fd380Sjfb8856606 * first IPv4 header. If the receive packet
839*2d9fd380Sjfb8856606 * contains both a tunnel IPv4 header and a
840*2d9fd380Sjfb8856606 * transport IPv4 header, the device validates the
841*2d9fd380Sjfb8856606 * checksum for the both IPv4 headers.
842*2d9fd380Sjfb8856606 * @csum_ip_bad: The IPv4 checksum calculated by the device did
843*2d9fd380Sjfb8856606 * not match the checksum in the receive packet's
844*2d9fd380Sjfb8856606 * first IPv4 header. If the receive packet
845*2d9fd380Sjfb8856606 * contains both a tunnel IPv4 header and a
846*2d9fd380Sjfb8856606 * transport IPv4 header, the device validates the
847*2d9fd380Sjfb8856606 * checksum for both IP headers.
848*2d9fd380Sjfb8856606 * @VLAN: VLAN header was stripped and placed in @vlan_tci.
849*2d9fd380Sjfb8856606 * @pkt_type: Packet type
850*2d9fd380Sjfb8856606 * @color: Color bit.
851*2d9fd380Sjfb8856606 */
852*2d9fd380Sjfb8856606 struct ionic_rxq_comp {
853*2d9fd380Sjfb8856606 u8 status;
854*2d9fd380Sjfb8856606 u8 num_sg_elems;
855*2d9fd380Sjfb8856606 __le16 comp_index;
856*2d9fd380Sjfb8856606 __le32 rss_hash;
857*2d9fd380Sjfb8856606 __le16 csum;
858*2d9fd380Sjfb8856606 __le16 vlan_tci;
859*2d9fd380Sjfb8856606 __le16 len;
860*2d9fd380Sjfb8856606 u8 csum_flags;
861*2d9fd380Sjfb8856606 #define IONIC_RXQ_COMP_CSUM_F_TCP_OK 0x01
862*2d9fd380Sjfb8856606 #define IONIC_RXQ_COMP_CSUM_F_TCP_BAD 0x02
863*2d9fd380Sjfb8856606 #define IONIC_RXQ_COMP_CSUM_F_UDP_OK 0x04
864*2d9fd380Sjfb8856606 #define IONIC_RXQ_COMP_CSUM_F_UDP_BAD 0x08
865*2d9fd380Sjfb8856606 #define IONIC_RXQ_COMP_CSUM_F_IP_OK 0x10
866*2d9fd380Sjfb8856606 #define IONIC_RXQ_COMP_CSUM_F_IP_BAD 0x20
867*2d9fd380Sjfb8856606 #define IONIC_RXQ_COMP_CSUM_F_VLAN 0x40
868*2d9fd380Sjfb8856606 #define IONIC_RXQ_COMP_CSUM_F_CALC 0x80
869*2d9fd380Sjfb8856606 u8 pkt_type_color;
870*2d9fd380Sjfb8856606 #define IONIC_RXQ_COMP_PKT_TYPE_MASK 0x7f
871*2d9fd380Sjfb8856606 };
872*2d9fd380Sjfb8856606
873*2d9fd380Sjfb8856606 enum ionic_pkt_type {
874*2d9fd380Sjfb8856606 IONIC_PKT_TYPE_NON_IP = 0x000,
875*2d9fd380Sjfb8856606 IONIC_PKT_TYPE_IPV4 = 0x001,
876*2d9fd380Sjfb8856606 IONIC_PKT_TYPE_IPV4_TCP = 0x003,
877*2d9fd380Sjfb8856606 IONIC_PKT_TYPE_IPV4_UDP = 0x005,
878*2d9fd380Sjfb8856606 IONIC_PKT_TYPE_IPV6 = 0x008,
879*2d9fd380Sjfb8856606 IONIC_PKT_TYPE_IPV6_TCP = 0x018,
880*2d9fd380Sjfb8856606 IONIC_PKT_TYPE_IPV6_UDP = 0x028,
881*2d9fd380Sjfb8856606 };
882*2d9fd380Sjfb8856606
883*2d9fd380Sjfb8856606 enum ionic_eth_hw_features {
884*2d9fd380Sjfb8856606 IONIC_ETH_HW_VLAN_TX_TAG = BIT(0),
885*2d9fd380Sjfb8856606 IONIC_ETH_HW_VLAN_RX_STRIP = BIT(1),
886*2d9fd380Sjfb8856606 IONIC_ETH_HW_VLAN_RX_FILTER = BIT(2),
887*2d9fd380Sjfb8856606 IONIC_ETH_HW_RX_HASH = BIT(3),
888*2d9fd380Sjfb8856606 IONIC_ETH_HW_RX_CSUM = BIT(4),
889*2d9fd380Sjfb8856606 IONIC_ETH_HW_TX_SG = BIT(5),
890*2d9fd380Sjfb8856606 IONIC_ETH_HW_RX_SG = BIT(6),
891*2d9fd380Sjfb8856606 IONIC_ETH_HW_TX_CSUM = BIT(7),
892*2d9fd380Sjfb8856606 IONIC_ETH_HW_TSO = BIT(8),
893*2d9fd380Sjfb8856606 IONIC_ETH_HW_TSO_IPV6 = BIT(9),
894*2d9fd380Sjfb8856606 IONIC_ETH_HW_TSO_ECN = BIT(10),
895*2d9fd380Sjfb8856606 IONIC_ETH_HW_TSO_GRE = BIT(11),
896*2d9fd380Sjfb8856606 IONIC_ETH_HW_TSO_GRE_CSUM = BIT(12),
897*2d9fd380Sjfb8856606 IONIC_ETH_HW_TSO_IPXIP4 = BIT(13),
898*2d9fd380Sjfb8856606 IONIC_ETH_HW_TSO_IPXIP6 = BIT(14),
899*2d9fd380Sjfb8856606 IONIC_ETH_HW_TSO_UDP = BIT(15),
900*2d9fd380Sjfb8856606 IONIC_ETH_HW_TSO_UDP_CSUM = BIT(16),
901*2d9fd380Sjfb8856606 };
902*2d9fd380Sjfb8856606
903*2d9fd380Sjfb8856606 /**
904*2d9fd380Sjfb8856606 * struct ionic_q_control_cmd - Queue control command
905*2d9fd380Sjfb8856606 * @opcode: opcode
906*2d9fd380Sjfb8856606 * @type: Queue type
907*2d9fd380Sjfb8856606 * @lif_index: LIF index
908*2d9fd380Sjfb8856606 * @index: Queue index
909*2d9fd380Sjfb8856606 * @oper: Operation (enum q_control_oper)
910*2d9fd380Sjfb8856606 */
911*2d9fd380Sjfb8856606 struct ionic_q_control_cmd {
912*2d9fd380Sjfb8856606 u8 opcode;
913*2d9fd380Sjfb8856606 u8 type;
914*2d9fd380Sjfb8856606 __le16 lif_index;
915*2d9fd380Sjfb8856606 __le32 index;
916*2d9fd380Sjfb8856606 u8 oper;
917*2d9fd380Sjfb8856606 u8 rsvd[55];
918*2d9fd380Sjfb8856606 };
919*2d9fd380Sjfb8856606
920*2d9fd380Sjfb8856606 typedef struct ionic_admin_comp ionic_q_control_comp;
921*2d9fd380Sjfb8856606
922*2d9fd380Sjfb8856606 enum q_control_oper {
923*2d9fd380Sjfb8856606 IONIC_Q_DISABLE = 0,
924*2d9fd380Sjfb8856606 IONIC_Q_ENABLE = 1,
925*2d9fd380Sjfb8856606 IONIC_Q_HANG_RESET = 2,
926*2d9fd380Sjfb8856606 };
927*2d9fd380Sjfb8856606
928*2d9fd380Sjfb8856606 /**
929*2d9fd380Sjfb8856606 * Physical connection type
930*2d9fd380Sjfb8856606 */
931*2d9fd380Sjfb8856606 enum ionic_phy_type {
932*2d9fd380Sjfb8856606 IONIC_PHY_TYPE_NONE = 0,
933*2d9fd380Sjfb8856606 IONIC_PHY_TYPE_COPPER = 1,
934*2d9fd380Sjfb8856606 IONIC_PHY_TYPE_FIBER = 2,
935*2d9fd380Sjfb8856606 };
936*2d9fd380Sjfb8856606
937*2d9fd380Sjfb8856606 /**
938*2d9fd380Sjfb8856606 * Transceiver status
939*2d9fd380Sjfb8856606 */
940*2d9fd380Sjfb8856606 enum ionic_xcvr_state {
941*2d9fd380Sjfb8856606 IONIC_XCVR_STATE_REMOVED = 0,
942*2d9fd380Sjfb8856606 IONIC_XCVR_STATE_INSERTED = 1,
943*2d9fd380Sjfb8856606 IONIC_XCVR_STATE_PENDING = 2,
944*2d9fd380Sjfb8856606 IONIC_XCVR_STATE_SPROM_READ = 3,
945*2d9fd380Sjfb8856606 IONIC_XCVR_STATE_SPROM_READ_ERR = 4,
946*2d9fd380Sjfb8856606 };
947*2d9fd380Sjfb8856606
948*2d9fd380Sjfb8856606 /**
949*2d9fd380Sjfb8856606 * Supported link modes
950*2d9fd380Sjfb8856606 */
951*2d9fd380Sjfb8856606 enum ionic_xcvr_pid {
952*2d9fd380Sjfb8856606 IONIC_XCVR_PID_UNKNOWN = 0,
953*2d9fd380Sjfb8856606
954*2d9fd380Sjfb8856606 /* CU */
955*2d9fd380Sjfb8856606 IONIC_XCVR_PID_QSFP_100G_CR4 = 1,
956*2d9fd380Sjfb8856606 IONIC_XCVR_PID_QSFP_40GBASE_CR4 = 2,
957*2d9fd380Sjfb8856606 IONIC_XCVR_PID_SFP_25GBASE_CR_S = 3,
958*2d9fd380Sjfb8856606 IONIC_XCVR_PID_SFP_25GBASE_CR_L = 4,
959*2d9fd380Sjfb8856606 IONIC_XCVR_PID_SFP_25GBASE_CR_N = 5,
960*2d9fd380Sjfb8856606
961*2d9fd380Sjfb8856606 /* Fiber */
962*2d9fd380Sjfb8856606 IONIC_XCVR_PID_QSFP_100G_AOC = 50,
963*2d9fd380Sjfb8856606 IONIC_XCVR_PID_QSFP_100G_ACC = 51,
964*2d9fd380Sjfb8856606 IONIC_XCVR_PID_QSFP_100G_SR4 = 52,
965*2d9fd380Sjfb8856606 IONIC_XCVR_PID_QSFP_100G_LR4 = 53,
966*2d9fd380Sjfb8856606 IONIC_XCVR_PID_QSFP_100G_ER4 = 54,
967*2d9fd380Sjfb8856606 IONIC_XCVR_PID_QSFP_40GBASE_ER4 = 55,
968*2d9fd380Sjfb8856606 IONIC_XCVR_PID_QSFP_40GBASE_SR4 = 56,
969*2d9fd380Sjfb8856606 IONIC_XCVR_PID_QSFP_40GBASE_LR4 = 57,
970*2d9fd380Sjfb8856606 IONIC_XCVR_PID_QSFP_40GBASE_AOC = 58,
971*2d9fd380Sjfb8856606 IONIC_XCVR_PID_SFP_25GBASE_SR = 59,
972*2d9fd380Sjfb8856606 IONIC_XCVR_PID_SFP_25GBASE_LR = 60,
973*2d9fd380Sjfb8856606 IONIC_XCVR_PID_SFP_25GBASE_ER = 61,
974*2d9fd380Sjfb8856606 IONIC_XCVR_PID_SFP_25GBASE_AOC = 62,
975*2d9fd380Sjfb8856606 IONIC_XCVR_PID_SFP_10GBASE_SR = 63,
976*2d9fd380Sjfb8856606 IONIC_XCVR_PID_SFP_10GBASE_LR = 64,
977*2d9fd380Sjfb8856606 IONIC_XCVR_PID_SFP_10GBASE_LRM = 65,
978*2d9fd380Sjfb8856606 IONIC_XCVR_PID_SFP_10GBASE_ER = 66,
979*2d9fd380Sjfb8856606 IONIC_XCVR_PID_SFP_10GBASE_AOC = 67,
980*2d9fd380Sjfb8856606 IONIC_XCVR_PID_SFP_10GBASE_CU = 68,
981*2d9fd380Sjfb8856606 IONIC_XCVR_PID_QSFP_100G_CWDM4 = 69,
982*2d9fd380Sjfb8856606 IONIC_XCVR_PID_QSFP_100G_PSM4 = 70,
983*2d9fd380Sjfb8856606 };
984*2d9fd380Sjfb8856606
985*2d9fd380Sjfb8856606 /**
986*2d9fd380Sjfb8856606 * Port types
987*2d9fd380Sjfb8856606 */
988*2d9fd380Sjfb8856606 enum ionic_port_type {
989*2d9fd380Sjfb8856606 IONIC_PORT_TYPE_NONE = 0, /* port type not configured */
990*2d9fd380Sjfb8856606 IONIC_PORT_TYPE_ETH = 1, /* port carries ethernet traffic (inband) */
991*2d9fd380Sjfb8856606 IONIC_PORT_TYPE_MGMT = 2, /* port carries mgmt traffic (out-of-band) */
992*2d9fd380Sjfb8856606 };
993*2d9fd380Sjfb8856606
994*2d9fd380Sjfb8856606 /**
995*2d9fd380Sjfb8856606 * Port config state
996*2d9fd380Sjfb8856606 */
997*2d9fd380Sjfb8856606 enum ionic_port_admin_state {
998*2d9fd380Sjfb8856606 IONIC_PORT_ADMIN_STATE_NONE = 0, /* port admin state not configured */
999*2d9fd380Sjfb8856606 IONIC_PORT_ADMIN_STATE_DOWN = 1, /* port is admin disabled */
1000*2d9fd380Sjfb8856606 IONIC_PORT_ADMIN_STATE_UP = 2, /* port is admin enabled */
1001*2d9fd380Sjfb8856606 };
1002*2d9fd380Sjfb8856606
1003*2d9fd380Sjfb8856606 /**
1004*2d9fd380Sjfb8856606 * Port operational status
1005*2d9fd380Sjfb8856606 */
1006*2d9fd380Sjfb8856606 enum ionic_port_oper_status {
1007*2d9fd380Sjfb8856606 IONIC_PORT_OPER_STATUS_NONE = 0, /* port is disabled */
1008*2d9fd380Sjfb8856606 IONIC_PORT_OPER_STATUS_UP = 1, /* port is linked up */
1009*2d9fd380Sjfb8856606 IONIC_PORT_OPER_STATUS_DOWN = 2, /* port link status is down */
1010*2d9fd380Sjfb8856606 };
1011*2d9fd380Sjfb8856606
1012*2d9fd380Sjfb8856606 /**
1013*2d9fd380Sjfb8856606 * Ethernet Forward error correction (fec) modes
1014*2d9fd380Sjfb8856606 */
1015*2d9fd380Sjfb8856606 enum ionic_port_fec_type {
1016*2d9fd380Sjfb8856606 IONIC_PORT_FEC_TYPE_NONE = 0, /* Disabled */
1017*2d9fd380Sjfb8856606 IONIC_PORT_FEC_TYPE_FC = 1, /* FireCode */
1018*2d9fd380Sjfb8856606 IONIC_PORT_FEC_TYPE_RS = 2, /* ReedSolomon */
1019*2d9fd380Sjfb8856606 };
1020*2d9fd380Sjfb8856606
1021*2d9fd380Sjfb8856606 /**
1022*2d9fd380Sjfb8856606 * Ethernet pause (flow control) modes
1023*2d9fd380Sjfb8856606 */
1024*2d9fd380Sjfb8856606 enum ionic_port_pause_type {
1025*2d9fd380Sjfb8856606 IONIC_PORT_PAUSE_TYPE_NONE = 0, /* Disable Pause */
1026*2d9fd380Sjfb8856606 IONIC_PORT_PAUSE_TYPE_LINK = 1, /* Link level pause */
1027*2d9fd380Sjfb8856606 IONIC_PORT_PAUSE_TYPE_PFC = 2, /* Priority-Flow control */
1028*2d9fd380Sjfb8856606 };
1029*2d9fd380Sjfb8856606
1030*2d9fd380Sjfb8856606 /**
1031*2d9fd380Sjfb8856606 * Loopback modes
1032*2d9fd380Sjfb8856606 */
1033*2d9fd380Sjfb8856606 enum ionic_port_loopback_mode {
1034*2d9fd380Sjfb8856606 IONIC_PORT_LOOPBACK_MODE_NONE = 0, /* Disable loopback */
1035*2d9fd380Sjfb8856606 IONIC_PORT_LOOPBACK_MODE_MAC = 1, /* MAC loopback */
1036*2d9fd380Sjfb8856606 IONIC_PORT_LOOPBACK_MODE_PHY = 2, /* PHY/Serdes loopback */
1037*2d9fd380Sjfb8856606 };
1038*2d9fd380Sjfb8856606
1039*2d9fd380Sjfb8856606 /**
1040*2d9fd380Sjfb8856606 * Transceiver Status information
1041*2d9fd380Sjfb8856606 * @state: Transceiver status (enum ionic_xcvr_state)
1042*2d9fd380Sjfb8856606 * @phy: Physical connection type (enum ionic_phy_type)
1043*2d9fd380Sjfb8856606 * @pid: Transceiver link mode (enum pid)
1044*2d9fd380Sjfb8856606 * @sprom: Transceiver sprom contents
1045*2d9fd380Sjfb8856606 */
1046*2d9fd380Sjfb8856606 struct ionic_xcvr_status {
1047*2d9fd380Sjfb8856606 u8 state;
1048*2d9fd380Sjfb8856606 u8 phy;
1049*2d9fd380Sjfb8856606 __le16 pid;
1050*2d9fd380Sjfb8856606 u8 sprom[256];
1051*2d9fd380Sjfb8856606 };
1052*2d9fd380Sjfb8856606
1053*2d9fd380Sjfb8856606 /**
1054*2d9fd380Sjfb8856606 * Port configuration
1055*2d9fd380Sjfb8856606 * @speed: port speed (in Mbps)
1056*2d9fd380Sjfb8856606 * @mtu: mtu
1057*2d9fd380Sjfb8856606 * @state: port admin state (enum port_admin_state)
1058*2d9fd380Sjfb8856606 * @an_enable: autoneg enable
1059*2d9fd380Sjfb8856606 * @fec_type: fec type (enum ionic_port_fec_type)
1060*2d9fd380Sjfb8856606 * @pause_type: pause type (enum ionic_port_pause_type)
1061*2d9fd380Sjfb8856606 * @loopback_mode: loopback mode (enum ionic_port_loopback_mode)
1062*2d9fd380Sjfb8856606 */
1063*2d9fd380Sjfb8856606 union ionic_port_config {
1064*2d9fd380Sjfb8856606 struct {
1065*2d9fd380Sjfb8856606 #define IONIC_SPEED_100G 100000 /* 100G in Mbps */
1066*2d9fd380Sjfb8856606 #define IONIC_SPEED_50G 50000 /* 50G in Mbps */
1067*2d9fd380Sjfb8856606 #define IONIC_SPEED_40G 40000 /* 40G in Mbps */
1068*2d9fd380Sjfb8856606 #define IONIC_SPEED_25G 25000 /* 25G in Mbps */
1069*2d9fd380Sjfb8856606 #define IONIC_SPEED_10G 10000 /* 10G in Mbps */
1070*2d9fd380Sjfb8856606 #define IONIC_SPEED_1G 1000 /* 1G in Mbps */
1071*2d9fd380Sjfb8856606 __le32 speed;
1072*2d9fd380Sjfb8856606 __le32 mtu;
1073*2d9fd380Sjfb8856606 u8 state;
1074*2d9fd380Sjfb8856606 u8 an_enable;
1075*2d9fd380Sjfb8856606 u8 fec_type;
1076*2d9fd380Sjfb8856606 #define IONIC_PAUSE_TYPE_MASK 0x0f
1077*2d9fd380Sjfb8856606 #define IONIC_PAUSE_FLAGS_MASK 0xf0
1078*2d9fd380Sjfb8856606 #define IONIC_PAUSE_F_TX 0x10
1079*2d9fd380Sjfb8856606 #define IONIC_PAUSE_F_RX 0x20
1080*2d9fd380Sjfb8856606 u8 pause_type;
1081*2d9fd380Sjfb8856606 u8 loopback_mode;
1082*2d9fd380Sjfb8856606 };
1083*2d9fd380Sjfb8856606 __le32 words[64];
1084*2d9fd380Sjfb8856606 };
1085*2d9fd380Sjfb8856606
1086*2d9fd380Sjfb8856606 /**
1087*2d9fd380Sjfb8856606 * Port Status information
1088*2d9fd380Sjfb8856606 * @status: link status (enum ionic_port_oper_status)
1089*2d9fd380Sjfb8856606 * @id: port id
1090*2d9fd380Sjfb8856606 * @speed: link speed (in Mbps)
1091*2d9fd380Sjfb8856606 * @xcvr: transceiver status
1092*2d9fd380Sjfb8856606 */
1093*2d9fd380Sjfb8856606 struct ionic_port_status {
1094*2d9fd380Sjfb8856606 __le32 id;
1095*2d9fd380Sjfb8856606 __le32 speed;
1096*2d9fd380Sjfb8856606 u8 status;
1097*2d9fd380Sjfb8856606 u8 rsvd[51];
1098*2d9fd380Sjfb8856606 struct ionic_xcvr_status xcvr;
1099*2d9fd380Sjfb8856606 };
1100*2d9fd380Sjfb8856606
1101*2d9fd380Sjfb8856606 /**
1102*2d9fd380Sjfb8856606 * struct ionic_port_identify_cmd - Port identify command
1103*2d9fd380Sjfb8856606 * @opcode: opcode
1104*2d9fd380Sjfb8856606 * @index: port index
1105*2d9fd380Sjfb8856606 * @ver: Highest version of identify supported by driver
1106*2d9fd380Sjfb8856606 */
1107*2d9fd380Sjfb8856606 struct ionic_port_identify_cmd {
1108*2d9fd380Sjfb8856606 u8 opcode;
1109*2d9fd380Sjfb8856606 u8 index;
1110*2d9fd380Sjfb8856606 u8 ver;
1111*2d9fd380Sjfb8856606 u8 rsvd[61];
1112*2d9fd380Sjfb8856606 };
1113*2d9fd380Sjfb8856606
1114*2d9fd380Sjfb8856606 /**
1115*2d9fd380Sjfb8856606 * struct ionic_port_identify_comp - Port identify command completion
1116*2d9fd380Sjfb8856606 * @status: The status of the command (enum status_code)
1117*2d9fd380Sjfb8856606 * @ver: Version of identify returned by device
1118*2d9fd380Sjfb8856606 */
1119*2d9fd380Sjfb8856606 struct ionic_port_identify_comp {
1120*2d9fd380Sjfb8856606 u8 status;
1121*2d9fd380Sjfb8856606 u8 ver;
1122*2d9fd380Sjfb8856606 u8 rsvd[14];
1123*2d9fd380Sjfb8856606 };
1124*2d9fd380Sjfb8856606
1125*2d9fd380Sjfb8856606 /**
1126*2d9fd380Sjfb8856606 * struct ionic_port_init_cmd - Port initialization command
1127*2d9fd380Sjfb8856606 * @opcode: opcode
1128*2d9fd380Sjfb8856606 * @index: port index
1129*2d9fd380Sjfb8856606 * @info_pa: destination address for port info (struct ionic_port_info)
1130*2d9fd380Sjfb8856606 */
1131*2d9fd380Sjfb8856606 struct ionic_port_init_cmd {
1132*2d9fd380Sjfb8856606 u8 opcode;
1133*2d9fd380Sjfb8856606 u8 index;
1134*2d9fd380Sjfb8856606 u8 rsvd[6];
1135*2d9fd380Sjfb8856606 __le64 info_pa;
1136*2d9fd380Sjfb8856606 u8 rsvd2[48];
1137*2d9fd380Sjfb8856606 };
1138*2d9fd380Sjfb8856606
1139*2d9fd380Sjfb8856606 /**
1140*2d9fd380Sjfb8856606 * struct ionic_port_init_comp - Port initialization command completion
1141*2d9fd380Sjfb8856606 * @status: The status of the command (enum status_code)
1142*2d9fd380Sjfb8856606 */
1143*2d9fd380Sjfb8856606 struct ionic_port_init_comp {
1144*2d9fd380Sjfb8856606 u8 status;
1145*2d9fd380Sjfb8856606 u8 rsvd[15];
1146*2d9fd380Sjfb8856606 };
1147*2d9fd380Sjfb8856606
1148*2d9fd380Sjfb8856606 /**
1149*2d9fd380Sjfb8856606 * struct ionic_port_reset_cmd - Port reset command
1150*2d9fd380Sjfb8856606 * @opcode: opcode
1151*2d9fd380Sjfb8856606 * @index: port index
1152*2d9fd380Sjfb8856606 */
1153*2d9fd380Sjfb8856606 struct ionic_port_reset_cmd {
1154*2d9fd380Sjfb8856606 u8 opcode;
1155*2d9fd380Sjfb8856606 u8 index;
1156*2d9fd380Sjfb8856606 u8 rsvd[62];
1157*2d9fd380Sjfb8856606 };
1158*2d9fd380Sjfb8856606
1159*2d9fd380Sjfb8856606 /**
1160*2d9fd380Sjfb8856606 * struct ionic_port_reset_comp - Port reset command completion
1161*2d9fd380Sjfb8856606 * @status: The status of the command (enum status_code)
1162*2d9fd380Sjfb8856606 */
1163*2d9fd380Sjfb8856606 struct ionic_port_reset_comp {
1164*2d9fd380Sjfb8856606 u8 status;
1165*2d9fd380Sjfb8856606 u8 rsvd[15];
1166*2d9fd380Sjfb8856606 };
1167*2d9fd380Sjfb8856606
1168*2d9fd380Sjfb8856606 /**
1169*2d9fd380Sjfb8856606 * enum stats_ctl_cmd - List of commands for stats control
1170*2d9fd380Sjfb8856606 */
1171*2d9fd380Sjfb8856606 enum ionic_stats_ctl_cmd {
1172*2d9fd380Sjfb8856606 IONIC_STATS_CTL_RESET = 0,
1173*2d9fd380Sjfb8856606 };
1174*2d9fd380Sjfb8856606
1175*2d9fd380Sjfb8856606
1176*2d9fd380Sjfb8856606 /**
1177*2d9fd380Sjfb8856606 * enum ionic_port_attr - List of device attributes
1178*2d9fd380Sjfb8856606 */
1179*2d9fd380Sjfb8856606 enum ionic_port_attr {
1180*2d9fd380Sjfb8856606 IONIC_PORT_ATTR_STATE = 0,
1181*2d9fd380Sjfb8856606 IONIC_PORT_ATTR_SPEED = 1,
1182*2d9fd380Sjfb8856606 IONIC_PORT_ATTR_MTU = 2,
1183*2d9fd380Sjfb8856606 IONIC_PORT_ATTR_AUTONEG = 3,
1184*2d9fd380Sjfb8856606 IONIC_PORT_ATTR_FEC = 4,
1185*2d9fd380Sjfb8856606 IONIC_PORT_ATTR_PAUSE = 5,
1186*2d9fd380Sjfb8856606 IONIC_PORT_ATTR_LOOPBACK = 6,
1187*2d9fd380Sjfb8856606 IONIC_PORT_ATTR_STATS_CTRL = 7,
1188*2d9fd380Sjfb8856606 };
1189*2d9fd380Sjfb8856606
1190*2d9fd380Sjfb8856606 /**
1191*2d9fd380Sjfb8856606 * struct ionic_port_setattr_cmd - Set port attributes on the NIC
1192*2d9fd380Sjfb8856606 * @opcode: Opcode
1193*2d9fd380Sjfb8856606 * @index: port index
1194*2d9fd380Sjfb8856606 * @attr: Attribute type (enum ionic_port_attr)
1195*2d9fd380Sjfb8856606 */
1196*2d9fd380Sjfb8856606 struct ionic_port_setattr_cmd {
1197*2d9fd380Sjfb8856606 u8 opcode;
1198*2d9fd380Sjfb8856606 u8 index;
1199*2d9fd380Sjfb8856606 u8 attr;
1200*2d9fd380Sjfb8856606 u8 rsvd;
1201*2d9fd380Sjfb8856606 union {
1202*2d9fd380Sjfb8856606 u8 state;
1203*2d9fd380Sjfb8856606 __le32 speed;
1204*2d9fd380Sjfb8856606 __le32 mtu;
1205*2d9fd380Sjfb8856606 u8 an_enable;
1206*2d9fd380Sjfb8856606 u8 fec_type;
1207*2d9fd380Sjfb8856606 u8 pause_type;
1208*2d9fd380Sjfb8856606 u8 loopback_mode;
1209*2d9fd380Sjfb8856606 u8 stats_ctl;
1210*2d9fd380Sjfb8856606 u8 rsvd2[60];
1211*2d9fd380Sjfb8856606 };
1212*2d9fd380Sjfb8856606 };
1213*2d9fd380Sjfb8856606
1214*2d9fd380Sjfb8856606 /**
1215*2d9fd380Sjfb8856606 * struct ionic_port_setattr_comp - Port set attr command completion
1216*2d9fd380Sjfb8856606 * @status: The status of the command (enum status_code)
1217*2d9fd380Sjfb8856606 * @color: Color bit
1218*2d9fd380Sjfb8856606 */
1219*2d9fd380Sjfb8856606 struct ionic_port_setattr_comp {
1220*2d9fd380Sjfb8856606 u8 status;
1221*2d9fd380Sjfb8856606 u8 rsvd[14];
1222*2d9fd380Sjfb8856606 u8 color;
1223*2d9fd380Sjfb8856606 };
1224*2d9fd380Sjfb8856606
1225*2d9fd380Sjfb8856606 /**
1226*2d9fd380Sjfb8856606 * struct ionic_port_getattr_cmd - Get port attributes from the NIC
1227*2d9fd380Sjfb8856606 * @opcode: Opcode
1228*2d9fd380Sjfb8856606 * @index: port index
1229*2d9fd380Sjfb8856606 * @attr: Attribute type (enum ionic_port_attr)
1230*2d9fd380Sjfb8856606 */
1231*2d9fd380Sjfb8856606 struct ionic_port_getattr_cmd {
1232*2d9fd380Sjfb8856606 u8 opcode;
1233*2d9fd380Sjfb8856606 u8 index;
1234*2d9fd380Sjfb8856606 u8 attr;
1235*2d9fd380Sjfb8856606 u8 rsvd[61];
1236*2d9fd380Sjfb8856606 };
1237*2d9fd380Sjfb8856606
1238*2d9fd380Sjfb8856606 /**
1239*2d9fd380Sjfb8856606 * struct ionic_port_getattr_comp - Port get attr command completion
1240*2d9fd380Sjfb8856606 * @status: The status of the command (enum status_code)
1241*2d9fd380Sjfb8856606 * @color: Color bit
1242*2d9fd380Sjfb8856606 */
1243*2d9fd380Sjfb8856606 struct ionic_port_getattr_comp {
1244*2d9fd380Sjfb8856606 u8 status;
1245*2d9fd380Sjfb8856606 u8 rsvd[3];
1246*2d9fd380Sjfb8856606 union {
1247*2d9fd380Sjfb8856606 u8 state;
1248*2d9fd380Sjfb8856606 __le32 speed;
1249*2d9fd380Sjfb8856606 __le32 mtu;
1250*2d9fd380Sjfb8856606 u8 an_enable;
1251*2d9fd380Sjfb8856606 u8 fec_type;
1252*2d9fd380Sjfb8856606 u8 pause_type;
1253*2d9fd380Sjfb8856606 u8 loopback_mode;
1254*2d9fd380Sjfb8856606 u8 rsvd2[11];
1255*2d9fd380Sjfb8856606 };
1256*2d9fd380Sjfb8856606 u8 color;
1257*2d9fd380Sjfb8856606 };
1258*2d9fd380Sjfb8856606
1259*2d9fd380Sjfb8856606 /**
1260*2d9fd380Sjfb8856606 * struct ionic_lif_status - Lif status register
1261*2d9fd380Sjfb8856606 * @eid: most recent NotifyQ event id
1262*2d9fd380Sjfb8856606 * @port_num: port the lif is connected to
1263*2d9fd380Sjfb8856606 * @link_status: port status (enum ionic_port_oper_status)
1264*2d9fd380Sjfb8856606 * @link_speed: speed of link in Mbps
1265*2d9fd380Sjfb8856606 * @link_down_count: number of times link status changes
1266*2d9fd380Sjfb8856606 */
1267*2d9fd380Sjfb8856606 struct ionic_lif_status {
1268*2d9fd380Sjfb8856606 __le64 eid;
1269*2d9fd380Sjfb8856606 u8 port_num;
1270*2d9fd380Sjfb8856606 u8 rsvd;
1271*2d9fd380Sjfb8856606 __le16 link_status;
1272*2d9fd380Sjfb8856606 __le32 link_speed; /* units of 1Mbps: eg 10000 = 10Gbps */
1273*2d9fd380Sjfb8856606 __le16 link_down_count;
1274*2d9fd380Sjfb8856606 u8 rsvd2[46];
1275*2d9fd380Sjfb8856606 };
1276*2d9fd380Sjfb8856606
1277*2d9fd380Sjfb8856606 /**
1278*2d9fd380Sjfb8856606 * struct ionic_lif_reset_cmd - LIF reset command
1279*2d9fd380Sjfb8856606 * @opcode: opcode
1280*2d9fd380Sjfb8856606 * @index: LIF index
1281*2d9fd380Sjfb8856606 */
1282*2d9fd380Sjfb8856606 struct ionic_lif_reset_cmd {
1283*2d9fd380Sjfb8856606 u8 opcode;
1284*2d9fd380Sjfb8856606 u8 rsvd;
1285*2d9fd380Sjfb8856606 __le16 index;
1286*2d9fd380Sjfb8856606 __le32 rsvd2[15];
1287*2d9fd380Sjfb8856606 };
1288*2d9fd380Sjfb8856606
1289*2d9fd380Sjfb8856606 typedef struct ionic_admin_comp ionic_lif_reset_comp;
1290*2d9fd380Sjfb8856606
1291*2d9fd380Sjfb8856606 enum ionic_dev_state {
1292*2d9fd380Sjfb8856606 IONIC_DEV_DISABLE = 0,
1293*2d9fd380Sjfb8856606 IONIC_DEV_ENABLE = 1,
1294*2d9fd380Sjfb8856606 IONIC_DEV_HANG_RESET = 2,
1295*2d9fd380Sjfb8856606 };
1296*2d9fd380Sjfb8856606
1297*2d9fd380Sjfb8856606 /**
1298*2d9fd380Sjfb8856606 * enum ionic_dev_attr - List of device attributes
1299*2d9fd380Sjfb8856606 */
1300*2d9fd380Sjfb8856606 enum ionic_dev_attr {
1301*2d9fd380Sjfb8856606 IONIC_DEV_ATTR_STATE = 0,
1302*2d9fd380Sjfb8856606 IONIC_DEV_ATTR_NAME = 1,
1303*2d9fd380Sjfb8856606 IONIC_DEV_ATTR_FEATURES = 2,
1304*2d9fd380Sjfb8856606 };
1305*2d9fd380Sjfb8856606
1306*2d9fd380Sjfb8856606 /**
1307*2d9fd380Sjfb8856606 * struct ionic_dev_setattr_cmd - Set Device attributes on the NIC
1308*2d9fd380Sjfb8856606 * @opcode: Opcode
1309*2d9fd380Sjfb8856606 * @attr: Attribute type (enum ionic_dev_attr)
1310*2d9fd380Sjfb8856606 * @state: Device state (enum ionic_dev_state)
1311*2d9fd380Sjfb8856606 * @name: The bus info, e.g. PCI slot-device-function, 0 terminated
1312*2d9fd380Sjfb8856606 * @features: Device features
1313*2d9fd380Sjfb8856606 */
1314*2d9fd380Sjfb8856606 struct ionic_dev_setattr_cmd {
1315*2d9fd380Sjfb8856606 u8 opcode;
1316*2d9fd380Sjfb8856606 u8 attr;
1317*2d9fd380Sjfb8856606 __le16 rsvd;
1318*2d9fd380Sjfb8856606 union {
1319*2d9fd380Sjfb8856606 u8 state;
1320*2d9fd380Sjfb8856606 char name[IONIC_IFNAMSIZ];
1321*2d9fd380Sjfb8856606 __le64 features;
1322*2d9fd380Sjfb8856606 u8 rsvd2[60];
1323*2d9fd380Sjfb8856606 };
1324*2d9fd380Sjfb8856606 };
1325*2d9fd380Sjfb8856606
1326*2d9fd380Sjfb8856606 /**
1327*2d9fd380Sjfb8856606 * struct ionic_dev_setattr_comp - Device set attr command completion
1328*2d9fd380Sjfb8856606 * @status: The status of the command (enum status_code)
1329*2d9fd380Sjfb8856606 * @features: Device features
1330*2d9fd380Sjfb8856606 * @color: Color bit
1331*2d9fd380Sjfb8856606 */
1332*2d9fd380Sjfb8856606 struct ionic_dev_setattr_comp {
1333*2d9fd380Sjfb8856606 u8 status;
1334*2d9fd380Sjfb8856606 u8 rsvd[3];
1335*2d9fd380Sjfb8856606 union {
1336*2d9fd380Sjfb8856606 __le64 features;
1337*2d9fd380Sjfb8856606 u8 rsvd2[11];
1338*2d9fd380Sjfb8856606 };
1339*2d9fd380Sjfb8856606 u8 color;
1340*2d9fd380Sjfb8856606 };
1341*2d9fd380Sjfb8856606
1342*2d9fd380Sjfb8856606 /**
1343*2d9fd380Sjfb8856606 * struct ionic_dev_getattr_cmd - Get Device attributes from the NIC
1344*2d9fd380Sjfb8856606 * @opcode: opcode
1345*2d9fd380Sjfb8856606 * @attr: Attribute type (enum ionic_dev_attr)
1346*2d9fd380Sjfb8856606 */
1347*2d9fd380Sjfb8856606 struct ionic_dev_getattr_cmd {
1348*2d9fd380Sjfb8856606 u8 opcode;
1349*2d9fd380Sjfb8856606 u8 attr;
1350*2d9fd380Sjfb8856606 u8 rsvd[62];
1351*2d9fd380Sjfb8856606 };
1352*2d9fd380Sjfb8856606
1353*2d9fd380Sjfb8856606 /**
1354*2d9fd380Sjfb8856606 * struct ionic_dev_setattr_comp - Device set attr command completion
1355*2d9fd380Sjfb8856606 * @status: The status of the command (enum status_code)
1356*2d9fd380Sjfb8856606 * @features: Device features
1357*2d9fd380Sjfb8856606 * @color: Color bit
1358*2d9fd380Sjfb8856606 */
1359*2d9fd380Sjfb8856606 struct ionic_dev_getattr_comp {
1360*2d9fd380Sjfb8856606 u8 status;
1361*2d9fd380Sjfb8856606 u8 rsvd[3];
1362*2d9fd380Sjfb8856606 union {
1363*2d9fd380Sjfb8856606 __le64 features;
1364*2d9fd380Sjfb8856606 u8 rsvd2[11];
1365*2d9fd380Sjfb8856606 };
1366*2d9fd380Sjfb8856606 u8 color;
1367*2d9fd380Sjfb8856606 };
1368*2d9fd380Sjfb8856606
1369*2d9fd380Sjfb8856606 /**
1370*2d9fd380Sjfb8856606 * RSS parameters
1371*2d9fd380Sjfb8856606 */
1372*2d9fd380Sjfb8856606 #define IONIC_RSS_HASH_KEY_SIZE 40
1373*2d9fd380Sjfb8856606
1374*2d9fd380Sjfb8856606 enum ionic_rss_hash_types {
1375*2d9fd380Sjfb8856606 IONIC_RSS_TYPE_IPV4 = BIT(0),
1376*2d9fd380Sjfb8856606 IONIC_RSS_TYPE_IPV4_TCP = BIT(1),
1377*2d9fd380Sjfb8856606 IONIC_RSS_TYPE_IPV4_UDP = BIT(2),
1378*2d9fd380Sjfb8856606 IONIC_RSS_TYPE_IPV6 = BIT(3),
1379*2d9fd380Sjfb8856606 IONIC_RSS_TYPE_IPV6_TCP = BIT(4),
1380*2d9fd380Sjfb8856606 IONIC_RSS_TYPE_IPV6_UDP = BIT(5),
1381*2d9fd380Sjfb8856606 };
1382*2d9fd380Sjfb8856606
1383*2d9fd380Sjfb8856606 /**
1384*2d9fd380Sjfb8856606 * enum ionic_lif_attr - List of LIF attributes
1385*2d9fd380Sjfb8856606 */
1386*2d9fd380Sjfb8856606 enum ionic_lif_attr {
1387*2d9fd380Sjfb8856606 IONIC_LIF_ATTR_STATE = 0,
1388*2d9fd380Sjfb8856606 IONIC_LIF_ATTR_NAME = 1,
1389*2d9fd380Sjfb8856606 IONIC_LIF_ATTR_MTU = 2,
1390*2d9fd380Sjfb8856606 IONIC_LIF_ATTR_MAC = 3,
1391*2d9fd380Sjfb8856606 IONIC_LIF_ATTR_FEATURES = 4,
1392*2d9fd380Sjfb8856606 IONIC_LIF_ATTR_RSS = 5,
1393*2d9fd380Sjfb8856606 IONIC_LIF_ATTR_STATS_CTRL = 6,
1394*2d9fd380Sjfb8856606 };
1395*2d9fd380Sjfb8856606
1396*2d9fd380Sjfb8856606 /**
1397*2d9fd380Sjfb8856606 * struct ionic_lif_setattr_cmd - Set LIF attributes on the NIC
1398*2d9fd380Sjfb8856606 * @opcode: Opcode
1399*2d9fd380Sjfb8856606 * @type: Attribute type (enum ionic_lif_attr)
1400*2d9fd380Sjfb8856606 * @index: LIF index
1401*2d9fd380Sjfb8856606 * @state: lif state (enum lif_state)
1402*2d9fd380Sjfb8856606 * @name: The netdev name string, 0 terminated
1403*2d9fd380Sjfb8856606 * @mtu: Mtu
1404*2d9fd380Sjfb8856606 * @mac: Station mac
1405*2d9fd380Sjfb8856606 * @features: Features (enum ionic_eth_hw_features)
1406*2d9fd380Sjfb8856606 * @rss: RSS properties
1407*2d9fd380Sjfb8856606 * @types: The hash types to enable (see rss_hash_types).
1408*2d9fd380Sjfb8856606 * @key: The hash secret key.
1409*2d9fd380Sjfb8856606 * @addr: Address for the indirection table shared memory.
1410*2d9fd380Sjfb8856606 * @stats_ctl: stats control commands (enum stats_ctl_cmd)
1411*2d9fd380Sjfb8856606 */
1412*2d9fd380Sjfb8856606 struct ionic_lif_setattr_cmd {
1413*2d9fd380Sjfb8856606 u8 opcode;
1414*2d9fd380Sjfb8856606 u8 attr;
1415*2d9fd380Sjfb8856606 __le16 index;
1416*2d9fd380Sjfb8856606 union {
1417*2d9fd380Sjfb8856606 u8 state;
1418*2d9fd380Sjfb8856606 char name[IONIC_IFNAMSIZ];
1419*2d9fd380Sjfb8856606 __le32 mtu;
1420*2d9fd380Sjfb8856606 u8 mac[6];
1421*2d9fd380Sjfb8856606 __le64 features;
1422*2d9fd380Sjfb8856606 struct {
1423*2d9fd380Sjfb8856606 __le16 types;
1424*2d9fd380Sjfb8856606 u8 key[IONIC_RSS_HASH_KEY_SIZE];
1425*2d9fd380Sjfb8856606 u8 rsvd[6];
1426*2d9fd380Sjfb8856606 __le64 addr;
1427*2d9fd380Sjfb8856606 } rss;
1428*2d9fd380Sjfb8856606 u8 stats_ctl;
1429*2d9fd380Sjfb8856606 u8 rsvd[60];
1430*2d9fd380Sjfb8856606 };
1431*2d9fd380Sjfb8856606 };
1432*2d9fd380Sjfb8856606
1433*2d9fd380Sjfb8856606 /**
1434*2d9fd380Sjfb8856606 * struct ionic_lif_setattr_comp - LIF set attr command completion
1435*2d9fd380Sjfb8856606 * @status: The status of the command (enum status_code)
1436*2d9fd380Sjfb8856606 * @comp_index: The index in the descriptor ring for which this
1437*2d9fd380Sjfb8856606 * is the completion.
1438*2d9fd380Sjfb8856606 * @features: features (enum ionic_eth_hw_features)
1439*2d9fd380Sjfb8856606 * @color: Color bit
1440*2d9fd380Sjfb8856606 */
1441*2d9fd380Sjfb8856606 struct ionic_lif_setattr_comp {
1442*2d9fd380Sjfb8856606 u8 status;
1443*2d9fd380Sjfb8856606 u8 rsvd;
1444*2d9fd380Sjfb8856606 __le16 comp_index;
1445*2d9fd380Sjfb8856606 union {
1446*2d9fd380Sjfb8856606 __le64 features;
1447*2d9fd380Sjfb8856606 u8 rsvd2[11];
1448*2d9fd380Sjfb8856606 };
1449*2d9fd380Sjfb8856606 u8 color;
1450*2d9fd380Sjfb8856606 };
1451*2d9fd380Sjfb8856606
1452*2d9fd380Sjfb8856606 /**
1453*2d9fd380Sjfb8856606 * struct ionic_lif_getattr_cmd - Get LIF attributes from the NIC
1454*2d9fd380Sjfb8856606 * @opcode: Opcode
1455*2d9fd380Sjfb8856606 * @attr: Attribute type (enum ionic_lif_attr)
1456*2d9fd380Sjfb8856606 * @index: LIF index
1457*2d9fd380Sjfb8856606 */
1458*2d9fd380Sjfb8856606 struct ionic_lif_getattr_cmd {
1459*2d9fd380Sjfb8856606 u8 opcode;
1460*2d9fd380Sjfb8856606 u8 attr;
1461*2d9fd380Sjfb8856606 __le16 index;
1462*2d9fd380Sjfb8856606 u8 rsvd[60];
1463*2d9fd380Sjfb8856606 };
1464*2d9fd380Sjfb8856606
1465*2d9fd380Sjfb8856606 /**
1466*2d9fd380Sjfb8856606 * struct ionic_lif_getattr_comp - LIF get attr command completion
1467*2d9fd380Sjfb8856606 * @status: The status of the command (enum status_code)
1468*2d9fd380Sjfb8856606 * @comp_index: The index in the descriptor ring for which this
1469*2d9fd380Sjfb8856606 * is the completion.
1470*2d9fd380Sjfb8856606 * @state: lif state (enum lif_state)
1471*2d9fd380Sjfb8856606 * @name: The netdev name string, 0 terminated
1472*2d9fd380Sjfb8856606 * @mtu: Mtu
1473*2d9fd380Sjfb8856606 * @mac: Station mac
1474*2d9fd380Sjfb8856606 * @features: Features (enum ionic_eth_hw_features)
1475*2d9fd380Sjfb8856606 * @color: Color bit
1476*2d9fd380Sjfb8856606 */
1477*2d9fd380Sjfb8856606 struct ionic_lif_getattr_comp {
1478*2d9fd380Sjfb8856606 u8 status;
1479*2d9fd380Sjfb8856606 u8 rsvd;
1480*2d9fd380Sjfb8856606 __le16 comp_index;
1481*2d9fd380Sjfb8856606 union {
1482*2d9fd380Sjfb8856606 u8 state;
1483*2d9fd380Sjfb8856606 __le32 mtu;
1484*2d9fd380Sjfb8856606 u8 mac[6];
1485*2d9fd380Sjfb8856606 __le64 features;
1486*2d9fd380Sjfb8856606 u8 rsvd2[11];
1487*2d9fd380Sjfb8856606 };
1488*2d9fd380Sjfb8856606 u8 color;
1489*2d9fd380Sjfb8856606 };
1490*2d9fd380Sjfb8856606
1491*2d9fd380Sjfb8856606 enum ionic_rx_mode {
1492*2d9fd380Sjfb8856606 IONIC_RX_MODE_F_UNICAST = BIT(0),
1493*2d9fd380Sjfb8856606 IONIC_RX_MODE_F_MULTICAST = BIT(1),
1494*2d9fd380Sjfb8856606 IONIC_RX_MODE_F_BROADCAST = BIT(2),
1495*2d9fd380Sjfb8856606 IONIC_RX_MODE_F_PROMISC = BIT(3),
1496*2d9fd380Sjfb8856606 IONIC_RX_MODE_F_ALLMULTI = BIT(4),
1497*2d9fd380Sjfb8856606 };
1498*2d9fd380Sjfb8856606
1499*2d9fd380Sjfb8856606 /**
1500*2d9fd380Sjfb8856606 * struct ionic_rx_mode_set_cmd - Set LIF's Rx mode command
1501*2d9fd380Sjfb8856606 * @opcode: opcode
1502*2d9fd380Sjfb8856606 * @lif_index: LIF index
1503*2d9fd380Sjfb8856606 * @rx_mode: Rx mode flags:
1504*2d9fd380Sjfb8856606 * IONIC_RX_MODE_F_UNICAST: Accept known unicast packets.
1505*2d9fd380Sjfb8856606 * IONIC_RX_MODE_F_MULTICAST: Accept known multicast packets.
1506*2d9fd380Sjfb8856606 * IONIC_RX_MODE_F_BROADCAST: Accept broadcast packets.
1507*2d9fd380Sjfb8856606 * IONIC_RX_MODE_F_PROMISC: Accept any packets.
1508*2d9fd380Sjfb8856606 * IONIC_RX_MODE_F_ALLMULTI: Accept any multicast packets.
1509*2d9fd380Sjfb8856606 */
1510*2d9fd380Sjfb8856606 struct ionic_rx_mode_set_cmd {
1511*2d9fd380Sjfb8856606 u8 opcode;
1512*2d9fd380Sjfb8856606 u8 rsvd;
1513*2d9fd380Sjfb8856606 __le16 lif_index;
1514*2d9fd380Sjfb8856606 __le16 rx_mode;
1515*2d9fd380Sjfb8856606 __le16 rsvd2[29];
1516*2d9fd380Sjfb8856606 };
1517*2d9fd380Sjfb8856606
1518*2d9fd380Sjfb8856606 typedef struct ionic_admin_comp ionic_rx_mode_set_comp;
1519*2d9fd380Sjfb8856606
1520*2d9fd380Sjfb8856606 enum ionic_rx_filter_match_type {
1521*2d9fd380Sjfb8856606 IONIC_RX_FILTER_MATCH_VLAN = 0,
1522*2d9fd380Sjfb8856606 IONIC_RX_FILTER_MATCH_MAC,
1523*2d9fd380Sjfb8856606 IONIC_RX_FILTER_MATCH_MAC_VLAN,
1524*2d9fd380Sjfb8856606 };
1525*2d9fd380Sjfb8856606
1526*2d9fd380Sjfb8856606 /**
1527*2d9fd380Sjfb8856606 * struct ionic_rx_filter_add_cmd - Add LIF Rx filter command
1528*2d9fd380Sjfb8856606 * @opcode: opcode
1529*2d9fd380Sjfb8856606 * @qtype: Queue type
1530*2d9fd380Sjfb8856606 * @lif_index: LIF index
1531*2d9fd380Sjfb8856606 * @qid: Queue ID
1532*2d9fd380Sjfb8856606 * @match: Rx filter match type. (See IONIC_RX_FILTER_MATCH_xxx)
1533*2d9fd380Sjfb8856606 * @vlan: VLAN ID
1534*2d9fd380Sjfb8856606 * @addr: MAC address (network-byte order)
1535*2d9fd380Sjfb8856606 */
1536*2d9fd380Sjfb8856606 struct ionic_rx_filter_add_cmd {
1537*2d9fd380Sjfb8856606 u8 opcode;
1538*2d9fd380Sjfb8856606 u8 qtype;
1539*2d9fd380Sjfb8856606 __le16 lif_index;
1540*2d9fd380Sjfb8856606 __le32 qid;
1541*2d9fd380Sjfb8856606 __le16 match;
1542*2d9fd380Sjfb8856606 union {
1543*2d9fd380Sjfb8856606 struct {
1544*2d9fd380Sjfb8856606 __le16 vlan;
1545*2d9fd380Sjfb8856606 } vlan;
1546*2d9fd380Sjfb8856606 struct {
1547*2d9fd380Sjfb8856606 u8 addr[6];
1548*2d9fd380Sjfb8856606 } mac;
1549*2d9fd380Sjfb8856606 struct {
1550*2d9fd380Sjfb8856606 __le16 vlan;
1551*2d9fd380Sjfb8856606 u8 addr[6];
1552*2d9fd380Sjfb8856606 } mac_vlan;
1553*2d9fd380Sjfb8856606 u8 rsvd[54];
1554*2d9fd380Sjfb8856606 };
1555*2d9fd380Sjfb8856606 };
1556*2d9fd380Sjfb8856606
1557*2d9fd380Sjfb8856606 /**
1558*2d9fd380Sjfb8856606 * struct ionic_rx_filter_add_comp - Add LIF Rx filter command completion
1559*2d9fd380Sjfb8856606 * @status: The status of the command (enum status_code)
1560*2d9fd380Sjfb8856606 * @comp_index: The index in the descriptor ring for which this
1561*2d9fd380Sjfb8856606 * is the completion.
1562*2d9fd380Sjfb8856606 * @filter_id: Filter ID
1563*2d9fd380Sjfb8856606 * @color: Color bit.
1564*2d9fd380Sjfb8856606 */
1565*2d9fd380Sjfb8856606 struct ionic_rx_filter_add_comp {
1566*2d9fd380Sjfb8856606 u8 status;
1567*2d9fd380Sjfb8856606 u8 rsvd;
1568*2d9fd380Sjfb8856606 __le16 comp_index;
1569*2d9fd380Sjfb8856606 __le32 filter_id;
1570*2d9fd380Sjfb8856606 u8 rsvd2[7];
1571*2d9fd380Sjfb8856606 u8 color;
1572*2d9fd380Sjfb8856606 };
1573*2d9fd380Sjfb8856606
1574*2d9fd380Sjfb8856606 /**
1575*2d9fd380Sjfb8856606 * struct ionic_rx_filter_del_cmd - Delete LIF Rx filter command
1576*2d9fd380Sjfb8856606 * @opcode: opcode
1577*2d9fd380Sjfb8856606 * @lif_index: LIF index
1578*2d9fd380Sjfb8856606 * @filter_id: Filter ID
1579*2d9fd380Sjfb8856606 */
1580*2d9fd380Sjfb8856606 struct ionic_rx_filter_del_cmd {
1581*2d9fd380Sjfb8856606 u8 opcode;
1582*2d9fd380Sjfb8856606 u8 rsvd;
1583*2d9fd380Sjfb8856606 __le16 lif_index;
1584*2d9fd380Sjfb8856606 __le32 filter_id;
1585*2d9fd380Sjfb8856606 u8 rsvd2[56];
1586*2d9fd380Sjfb8856606 };
1587*2d9fd380Sjfb8856606
1588*2d9fd380Sjfb8856606 typedef struct ionic_admin_comp ionic_rx_filter_del_comp;
1589*2d9fd380Sjfb8856606
1590*2d9fd380Sjfb8856606 /**
1591*2d9fd380Sjfb8856606 * struct ionic_qos_identify_cmd - QoS identify command
1592*2d9fd380Sjfb8856606 * @opcode: opcode
1593*2d9fd380Sjfb8856606 * @ver: Highest version of identify supported by driver
1594*2d9fd380Sjfb8856606 *
1595*2d9fd380Sjfb8856606 */
1596*2d9fd380Sjfb8856606 struct ionic_qos_identify_cmd {
1597*2d9fd380Sjfb8856606 u8 opcode;
1598*2d9fd380Sjfb8856606 u8 ver;
1599*2d9fd380Sjfb8856606 u8 rsvd[62];
1600*2d9fd380Sjfb8856606 };
1601*2d9fd380Sjfb8856606
1602*2d9fd380Sjfb8856606 /**
1603*2d9fd380Sjfb8856606 * struct ionic_qos_identify_comp - QoS identify command completion
1604*2d9fd380Sjfb8856606 * @status: The status of the command (enum status_code)
1605*2d9fd380Sjfb8856606 * @ver: Version of identify returned by device
1606*2d9fd380Sjfb8856606 */
1607*2d9fd380Sjfb8856606 struct ionic_qos_identify_comp {
1608*2d9fd380Sjfb8856606 u8 status;
1609*2d9fd380Sjfb8856606 u8 ver;
1610*2d9fd380Sjfb8856606 u8 rsvd[14];
1611*2d9fd380Sjfb8856606 };
1612*2d9fd380Sjfb8856606
1613*2d9fd380Sjfb8856606 #define IONIC_QOS_CLASS_MAX 7
1614*2d9fd380Sjfb8856606 #define IONIC_QOS_CLASS_NAME_SZ 32
1615*2d9fd380Sjfb8856606 #define IONIC_QOS_DSCP_MAX_VALUES 64
1616*2d9fd380Sjfb8856606
1617*2d9fd380Sjfb8856606 /**
1618*2d9fd380Sjfb8856606 * enum ionic_qos_class
1619*2d9fd380Sjfb8856606 */
1620*2d9fd380Sjfb8856606 enum ionic_qos_class {
1621*2d9fd380Sjfb8856606 IONIC_QOS_CLASS_DEFAULT = 0,
1622*2d9fd380Sjfb8856606 IONIC_QOS_CLASS_USER_DEFINED_1 = 1,
1623*2d9fd380Sjfb8856606 IONIC_QOS_CLASS_USER_DEFINED_2 = 2,
1624*2d9fd380Sjfb8856606 IONIC_QOS_CLASS_USER_DEFINED_3 = 3,
1625*2d9fd380Sjfb8856606 IONIC_QOS_CLASS_USER_DEFINED_4 = 4,
1626*2d9fd380Sjfb8856606 IONIC_QOS_CLASS_USER_DEFINED_5 = 5,
1627*2d9fd380Sjfb8856606 IONIC_QOS_CLASS_USER_DEFINED_6 = 6,
1628*2d9fd380Sjfb8856606 };
1629*2d9fd380Sjfb8856606
1630*2d9fd380Sjfb8856606 /**
1631*2d9fd380Sjfb8856606 * enum ionic_qos_class_type - Traffic classification criteria
1632*2d9fd380Sjfb8856606 */
1633*2d9fd380Sjfb8856606 enum ionic_qos_class_type {
1634*2d9fd380Sjfb8856606 IONIC_QOS_CLASS_TYPE_NONE = 0,
1635*2d9fd380Sjfb8856606 IONIC_QOS_CLASS_TYPE_PCP = 1, /* Dot1Q pcp */
1636*2d9fd380Sjfb8856606 IONIC_QOS_CLASS_TYPE_DSCP = 2, /* IP dscp */
1637*2d9fd380Sjfb8856606 };
1638*2d9fd380Sjfb8856606
1639*2d9fd380Sjfb8856606 /**
1640*2d9fd380Sjfb8856606 * enum ionic_qos_sched_type - Qos class scheduling type
1641*2d9fd380Sjfb8856606 */
1642*2d9fd380Sjfb8856606 enum ionic_qos_sched_type {
1643*2d9fd380Sjfb8856606 /* Strict priority */
1644*2d9fd380Sjfb8856606 IONIC_QOS_SCHED_TYPE_STRICT = 0,
1645*2d9fd380Sjfb8856606 /* Deficit weighted round-robin */
1646*2d9fd380Sjfb8856606 IONIC_QOS_SCHED_TYPE_DWRR = 1,
1647*2d9fd380Sjfb8856606 };
1648*2d9fd380Sjfb8856606
1649*2d9fd380Sjfb8856606 /**
1650*2d9fd380Sjfb8856606 * union ionic_qos_config - Qos configuration structure
1651*2d9fd380Sjfb8856606 * @flags: Configuration flags
1652*2d9fd380Sjfb8856606 * IONIC_QOS_CONFIG_F_ENABLE enable
1653*2d9fd380Sjfb8856606 * IONIC_QOS_CONFIG_F_DROP drop/nodrop
1654*2d9fd380Sjfb8856606 * IONIC_QOS_CONFIG_F_RW_DOT1Q_PCP enable dot1q pcp rewrite
1655*2d9fd380Sjfb8856606 * IONIC_QOS_CONFIG_F_RW_IP_DSCP enable ip dscp rewrite
1656*2d9fd380Sjfb8856606 * @sched_type: Qos class scheduling type (enum ionic_qos_sched_type)
1657*2d9fd380Sjfb8856606 * @class_type: Qos class type (enum ionic_qos_class_type)
1658*2d9fd380Sjfb8856606 * @pause_type: Qos pause type (enum qos_pause_type)
1659*2d9fd380Sjfb8856606 * @name: Qos class name
1660*2d9fd380Sjfb8856606 * @mtu: MTU of the class
1661*2d9fd380Sjfb8856606 * @pfc_dot1q_pcp: Pcp value for pause frames (valid iff F_NODROP)
1662*2d9fd380Sjfb8856606 * @dwrr_weight: Qos class scheduling weight
1663*2d9fd380Sjfb8856606 * @strict_rlmt: Rate limit for strict priority scheduling
1664*2d9fd380Sjfb8856606 * @rw_dot1q_pcp: Rewrite dot1q pcp to this value
1665*2d9fd380Sjfb8856606 * (valid iff F_RW_DOT1Q_PCP)
1666*2d9fd380Sjfb8856606 * @rw_ip_dscp: Rewrite ip dscp to this value
1667*2d9fd380Sjfb8856606 * (valid iff F_RW_IP_DSCP)
1668*2d9fd380Sjfb8856606 * @dot1q_pcp: Dot1q pcp value
1669*2d9fd380Sjfb8856606 * @ndscp: Number of valid dscp values in the ip_dscp field
1670*2d9fd380Sjfb8856606 * @ip_dscp: IP dscp values
1671*2d9fd380Sjfb8856606 */
1672*2d9fd380Sjfb8856606 union ionic_qos_config {
1673*2d9fd380Sjfb8856606 struct {
1674*2d9fd380Sjfb8856606 #define IONIC_QOS_CONFIG_F_ENABLE BIT(0)
1675*2d9fd380Sjfb8856606 #define IONIC_QOS_CONFIG_F_DROP BIT(1)
1676*2d9fd380Sjfb8856606 #define IONIC_QOS_CONFIG_F_RW_DOT1Q_PCP BIT(2)
1677*2d9fd380Sjfb8856606 #define IONIC_QOS_CONFIG_F_RW_IP_DSCP BIT(3)
1678*2d9fd380Sjfb8856606 u8 flags;
1679*2d9fd380Sjfb8856606 u8 sched_type;
1680*2d9fd380Sjfb8856606 u8 class_type;
1681*2d9fd380Sjfb8856606 u8 pause_type;
1682*2d9fd380Sjfb8856606 char name[IONIC_QOS_CLASS_NAME_SZ];
1683*2d9fd380Sjfb8856606 __le32 mtu;
1684*2d9fd380Sjfb8856606 /* flow control */
1685*2d9fd380Sjfb8856606 u8 pfc_cos;
1686*2d9fd380Sjfb8856606 /* scheduler */
1687*2d9fd380Sjfb8856606 union {
1688*2d9fd380Sjfb8856606 u8 dwrr_weight;
1689*2d9fd380Sjfb8856606 __le64 strict_rlmt;
1690*2d9fd380Sjfb8856606 };
1691*2d9fd380Sjfb8856606 /* marking */
1692*2d9fd380Sjfb8856606 union {
1693*2d9fd380Sjfb8856606 u8 rw_dot1q_pcp;
1694*2d9fd380Sjfb8856606 u8 rw_ip_dscp;
1695*2d9fd380Sjfb8856606 };
1696*2d9fd380Sjfb8856606 /* classification */
1697*2d9fd380Sjfb8856606 union {
1698*2d9fd380Sjfb8856606 u8 dot1q_pcp;
1699*2d9fd380Sjfb8856606 struct {
1700*2d9fd380Sjfb8856606 u8 ndscp;
1701*2d9fd380Sjfb8856606 u8 ip_dscp[IONIC_QOS_DSCP_MAX_VALUES];
1702*2d9fd380Sjfb8856606 };
1703*2d9fd380Sjfb8856606 };
1704*2d9fd380Sjfb8856606 };
1705*2d9fd380Sjfb8856606 __le32 words[64];
1706*2d9fd380Sjfb8856606 };
1707*2d9fd380Sjfb8856606
1708*2d9fd380Sjfb8856606 /**
1709*2d9fd380Sjfb8856606 * union ionic_qos_identity - QoS identity structure
1710*2d9fd380Sjfb8856606 * @version: Version of the identify structure
1711*2d9fd380Sjfb8856606 * @type: QoS system type
1712*2d9fd380Sjfb8856606 * @nclasses: Number of usable QoS classes
1713*2d9fd380Sjfb8856606 * @config: Current configuration of classes
1714*2d9fd380Sjfb8856606 */
1715*2d9fd380Sjfb8856606 union ionic_qos_identity {
1716*2d9fd380Sjfb8856606 struct {
1717*2d9fd380Sjfb8856606 u8 version;
1718*2d9fd380Sjfb8856606 u8 type;
1719*2d9fd380Sjfb8856606 u8 rsvd[62];
1720*2d9fd380Sjfb8856606 union ionic_qos_config config[IONIC_QOS_CLASS_MAX];
1721*2d9fd380Sjfb8856606 };
1722*2d9fd380Sjfb8856606 __le32 words[512];
1723*2d9fd380Sjfb8856606 };
1724*2d9fd380Sjfb8856606
1725*2d9fd380Sjfb8856606 /**
1726*2d9fd380Sjfb8856606 * struct qos_init_cmd - QoS config init command
1727*2d9fd380Sjfb8856606 * @opcode: Opcode
1728*2d9fd380Sjfb8856606 * @group: Qos class id
1729*2d9fd380Sjfb8856606 * @info_pa: destination address for qos info
1730*2d9fd380Sjfb8856606 */
1731*2d9fd380Sjfb8856606 struct ionic_qos_init_cmd {
1732*2d9fd380Sjfb8856606 u8 opcode;
1733*2d9fd380Sjfb8856606 u8 group;
1734*2d9fd380Sjfb8856606 u8 rsvd[6];
1735*2d9fd380Sjfb8856606 __le64 info_pa;
1736*2d9fd380Sjfb8856606 u8 rsvd1[48];
1737*2d9fd380Sjfb8856606 };
1738*2d9fd380Sjfb8856606
1739*2d9fd380Sjfb8856606 typedef struct ionic_admin_comp ionic_qos_init_comp;
1740*2d9fd380Sjfb8856606
1741*2d9fd380Sjfb8856606 /**
1742*2d9fd380Sjfb8856606 * struct ionic_qos_reset_cmd - Qos config reset command
1743*2d9fd380Sjfb8856606 * @opcode: Opcode
1744*2d9fd380Sjfb8856606 */
1745*2d9fd380Sjfb8856606 struct ionic_qos_reset_cmd {
1746*2d9fd380Sjfb8856606 u8 opcode;
1747*2d9fd380Sjfb8856606 u8 group;
1748*2d9fd380Sjfb8856606 u8 rsvd[62];
1749*2d9fd380Sjfb8856606 };
1750*2d9fd380Sjfb8856606
1751*2d9fd380Sjfb8856606 typedef struct ionic_admin_comp ionic_qos_reset_comp;
1752*2d9fd380Sjfb8856606
1753*2d9fd380Sjfb8856606 /**
1754*2d9fd380Sjfb8856606 * struct ionic_fw_download_cmd - Firmware download command
1755*2d9fd380Sjfb8856606 * @opcode: opcode
1756*2d9fd380Sjfb8856606 * @addr: dma address of the firmware buffer
1757*2d9fd380Sjfb8856606 * @offset: offset of the firmware buffer within the full image
1758*2d9fd380Sjfb8856606 * @length: number of valid bytes in the firmware buffer
1759*2d9fd380Sjfb8856606 */
1760*2d9fd380Sjfb8856606 struct ionic_fw_download_cmd {
1761*2d9fd380Sjfb8856606 u8 opcode;
1762*2d9fd380Sjfb8856606 u8 rsvd[3];
1763*2d9fd380Sjfb8856606 __le32 offset;
1764*2d9fd380Sjfb8856606 __le64 addr;
1765*2d9fd380Sjfb8856606 __le32 length;
1766*2d9fd380Sjfb8856606 };
1767*2d9fd380Sjfb8856606
1768*2d9fd380Sjfb8856606 typedef struct ionic_admin_comp ionic_fw_download_comp;
1769*2d9fd380Sjfb8856606
1770*2d9fd380Sjfb8856606 enum ionic_fw_control_oper {
1771*2d9fd380Sjfb8856606 IONIC_FW_RESET = 0, /* Reset firmware */
1772*2d9fd380Sjfb8856606 IONIC_FW_INSTALL = 1, /* Install firmware */
1773*2d9fd380Sjfb8856606 IONIC_FW_ACTIVATE = 2, /* Activate firmware */
1774*2d9fd380Sjfb8856606 };
1775*2d9fd380Sjfb8856606
1776*2d9fd380Sjfb8856606 /**
1777*2d9fd380Sjfb8856606 * struct ionic_fw_control_cmd - Firmware control command
1778*2d9fd380Sjfb8856606 * @opcode: opcode
1779*2d9fd380Sjfb8856606 * @oper: firmware control operation (enum ionic_fw_control_oper)
1780*2d9fd380Sjfb8856606 * @slot: slot to activate
1781*2d9fd380Sjfb8856606 */
1782*2d9fd380Sjfb8856606 struct ionic_fw_control_cmd {
1783*2d9fd380Sjfb8856606 u8 opcode;
1784*2d9fd380Sjfb8856606 u8 rsvd[3];
1785*2d9fd380Sjfb8856606 u8 oper;
1786*2d9fd380Sjfb8856606 u8 slot;
1787*2d9fd380Sjfb8856606 u8 rsvd1[58];
1788*2d9fd380Sjfb8856606 };
1789*2d9fd380Sjfb8856606
1790*2d9fd380Sjfb8856606 /**
1791*2d9fd380Sjfb8856606 * struct ionic_fw_control_comp - Firmware control copletion
1792*2d9fd380Sjfb8856606 * @opcode: opcode
1793*2d9fd380Sjfb8856606 * @slot: slot where the firmware was installed
1794*2d9fd380Sjfb8856606 */
1795*2d9fd380Sjfb8856606 struct ionic_fw_control_comp {
1796*2d9fd380Sjfb8856606 u8 status;
1797*2d9fd380Sjfb8856606 u8 rsvd;
1798*2d9fd380Sjfb8856606 __le16 comp_index;
1799*2d9fd380Sjfb8856606 u8 slot;
1800*2d9fd380Sjfb8856606 u8 rsvd1[10];
1801*2d9fd380Sjfb8856606 u8 color;
1802*2d9fd380Sjfb8856606 };
1803*2d9fd380Sjfb8856606
1804*2d9fd380Sjfb8856606 /******************************************************************
1805*2d9fd380Sjfb8856606 ******************* RDMA Commands ********************************
1806*2d9fd380Sjfb8856606 ******************************************************************/
1807*2d9fd380Sjfb8856606
1808*2d9fd380Sjfb8856606 /**
1809*2d9fd380Sjfb8856606 * struct ionic_rdma_reset_cmd - Reset RDMA LIF cmd
1810*2d9fd380Sjfb8856606 * @opcode: opcode
1811*2d9fd380Sjfb8856606 * @lif_index: lif index
1812*2d9fd380Sjfb8856606 *
1813*2d9fd380Sjfb8856606 * There is no rdma specific dev command completion struct. Completion uses
1814*2d9fd380Sjfb8856606 * the common struct ionic_admin_comp. Only the status is indicated.
1815*2d9fd380Sjfb8856606 * Nonzero status means the LIF does not support rdma.
1816*2d9fd380Sjfb8856606 **/
1817*2d9fd380Sjfb8856606 struct ionic_rdma_reset_cmd {
1818*2d9fd380Sjfb8856606 u8 opcode;
1819*2d9fd380Sjfb8856606 u8 rsvd;
1820*2d9fd380Sjfb8856606 __le16 lif_index;
1821*2d9fd380Sjfb8856606 u8 rsvd2[60];
1822*2d9fd380Sjfb8856606 };
1823*2d9fd380Sjfb8856606
1824*2d9fd380Sjfb8856606 /**
1825*2d9fd380Sjfb8856606 * struct ionic_rdma_queue_cmd - Create RDMA Queue command
1826*2d9fd380Sjfb8856606 * @opcode: opcode, 52, 53
1827*2d9fd380Sjfb8856606 * @lif_index lif index
1828*2d9fd380Sjfb8856606 * @qid_ver: (qid | (rdma version << 24))
1829*2d9fd380Sjfb8856606 * @cid: intr, eq_id, or cq_id
1830*2d9fd380Sjfb8856606 * @dbid: doorbell page id
1831*2d9fd380Sjfb8856606 * @depth_log2: log base two of queue depth
1832*2d9fd380Sjfb8856606 * @stride_log2: log base two of queue stride
1833*2d9fd380Sjfb8856606 * @dma_addr: address of the queue memory
1834*2d9fd380Sjfb8856606 * @xxx_table_index: temporary, but should not need pgtbl for contig. queues.
1835*2d9fd380Sjfb8856606 *
1836*2d9fd380Sjfb8856606 * The same command struct is used to create an rdma event queue, completion
1837*2d9fd380Sjfb8856606 * queue, or rdma admin queue. The cid is an interrupt number for an event
1838*2d9fd380Sjfb8856606 * queue, an event queue id for a completion queue, or a completion queue id
1839*2d9fd380Sjfb8856606 * for an rdma admin queue.
1840*2d9fd380Sjfb8856606 *
1841*2d9fd380Sjfb8856606 * The queue created via a dev command must be contiguous in dma space.
1842*2d9fd380Sjfb8856606 *
1843*2d9fd380Sjfb8856606 * The dev commands are intended only to be used during driver initialization,
1844*2d9fd380Sjfb8856606 * to create queues supporting the rdma admin queue. Other queues, and other
1845*2d9fd380Sjfb8856606 * types of rdma resources like memory regions, will be created and registered
1846*2d9fd380Sjfb8856606 * via the rdma admin queue, and will support a more complete interface
1847*2d9fd380Sjfb8856606 * providing scatter gather lists for larger, scattered queue buffers and
1848*2d9fd380Sjfb8856606 * memory registration.
1849*2d9fd380Sjfb8856606 *
1850*2d9fd380Sjfb8856606 * There is no rdma specific dev command completion struct. Completion uses
1851*2d9fd380Sjfb8856606 * the common struct ionic_admin_comp. Only the status is indicated.
1852*2d9fd380Sjfb8856606 **/
1853*2d9fd380Sjfb8856606 struct ionic_rdma_queue_cmd {
1854*2d9fd380Sjfb8856606 u8 opcode;
1855*2d9fd380Sjfb8856606 u8 rsvd;
1856*2d9fd380Sjfb8856606 __le16 lif_index;
1857*2d9fd380Sjfb8856606 __le32 qid_ver;
1858*2d9fd380Sjfb8856606 __le32 cid;
1859*2d9fd380Sjfb8856606 __le16 dbid;
1860*2d9fd380Sjfb8856606 u8 depth_log2;
1861*2d9fd380Sjfb8856606 u8 stride_log2;
1862*2d9fd380Sjfb8856606 __le64 dma_addr;
1863*2d9fd380Sjfb8856606 u8 rsvd2[36];
1864*2d9fd380Sjfb8856606 __le32 xxx_table_index;
1865*2d9fd380Sjfb8856606 };
1866*2d9fd380Sjfb8856606
1867*2d9fd380Sjfb8856606 /******************************************************************
1868*2d9fd380Sjfb8856606 ******************* Notify Events ********************************
1869*2d9fd380Sjfb8856606 ******************************************************************/
1870*2d9fd380Sjfb8856606
1871*2d9fd380Sjfb8856606 /**
1872*2d9fd380Sjfb8856606 * struct ionic_notifyq_event
1873*2d9fd380Sjfb8856606 * @eid: event number
1874*2d9fd380Sjfb8856606 * @ecode: event code
1875*2d9fd380Sjfb8856606 * @data: unspecified data about the event
1876*2d9fd380Sjfb8856606 *
1877*2d9fd380Sjfb8856606 * This is the generic event report struct from which the other
1878*2d9fd380Sjfb8856606 * actual events will be formed.
1879*2d9fd380Sjfb8856606 */
1880*2d9fd380Sjfb8856606 struct ionic_notifyq_event {
1881*2d9fd380Sjfb8856606 __le64 eid;
1882*2d9fd380Sjfb8856606 __le16 ecode;
1883*2d9fd380Sjfb8856606 u8 data[54];
1884*2d9fd380Sjfb8856606 };
1885*2d9fd380Sjfb8856606
1886*2d9fd380Sjfb8856606 /**
1887*2d9fd380Sjfb8856606 * struct ionic_link_change_event
1888*2d9fd380Sjfb8856606 * @eid: event number
1889*2d9fd380Sjfb8856606 * @ecode: event code = EVENT_OPCODE_LINK_CHANGE
1890*2d9fd380Sjfb8856606 * @link_status: link up or down, with error bits (enum port_status)
1891*2d9fd380Sjfb8856606 * @link_speed: speed of the network link
1892*2d9fd380Sjfb8856606 *
1893*2d9fd380Sjfb8856606 * Sent when the network link state changes between UP and DOWN
1894*2d9fd380Sjfb8856606 */
1895*2d9fd380Sjfb8856606 struct ionic_link_change_event {
1896*2d9fd380Sjfb8856606 __le64 eid;
1897*2d9fd380Sjfb8856606 __le16 ecode;
1898*2d9fd380Sjfb8856606 __le16 link_status;
1899*2d9fd380Sjfb8856606 __le32 link_speed; /* units of 1Mbps: e.g. 10000 = 10Gbps */
1900*2d9fd380Sjfb8856606 u8 rsvd[48];
1901*2d9fd380Sjfb8856606 };
1902*2d9fd380Sjfb8856606
1903*2d9fd380Sjfb8856606 /**
1904*2d9fd380Sjfb8856606 * struct ionic_reset_event
1905*2d9fd380Sjfb8856606 * @eid: event number
1906*2d9fd380Sjfb8856606 * @ecode: event code = EVENT_OPCODE_RESET
1907*2d9fd380Sjfb8856606 * @reset_code: reset type
1908*2d9fd380Sjfb8856606 * @state: 0=pending, 1=complete, 2=error
1909*2d9fd380Sjfb8856606 *
1910*2d9fd380Sjfb8856606 * Sent when the NIC or some subsystem is going to be or
1911*2d9fd380Sjfb8856606 * has been reset.
1912*2d9fd380Sjfb8856606 */
1913*2d9fd380Sjfb8856606 struct ionic_reset_event {
1914*2d9fd380Sjfb8856606 __le64 eid;
1915*2d9fd380Sjfb8856606 __le16 ecode;
1916*2d9fd380Sjfb8856606 u8 reset_code;
1917*2d9fd380Sjfb8856606 u8 state;
1918*2d9fd380Sjfb8856606 u8 rsvd[52];
1919*2d9fd380Sjfb8856606 };
1920*2d9fd380Sjfb8856606
1921*2d9fd380Sjfb8856606 /**
1922*2d9fd380Sjfb8856606 * struct ionic_heartbeat_event
1923*2d9fd380Sjfb8856606 * @eid: event number
1924*2d9fd380Sjfb8856606 * @ecode: event code = EVENT_OPCODE_HEARTBEAT
1925*2d9fd380Sjfb8856606 *
1926*2d9fd380Sjfb8856606 * Sent periodically by the NIC to indicate continued health
1927*2d9fd380Sjfb8856606 */
1928*2d9fd380Sjfb8856606 struct ionic_heartbeat_event {
1929*2d9fd380Sjfb8856606 __le64 eid;
1930*2d9fd380Sjfb8856606 __le16 ecode;
1931*2d9fd380Sjfb8856606 u8 rsvd[54];
1932*2d9fd380Sjfb8856606 };
1933*2d9fd380Sjfb8856606
1934*2d9fd380Sjfb8856606 /**
1935*2d9fd380Sjfb8856606 * struct ionic_log_event
1936*2d9fd380Sjfb8856606 * @eid: event number
1937*2d9fd380Sjfb8856606 * @ecode: event code = EVENT_OPCODE_LOG
1938*2d9fd380Sjfb8856606 * @data: log data
1939*2d9fd380Sjfb8856606 *
1940*2d9fd380Sjfb8856606 * Sent to notify the driver of an internal error.
1941*2d9fd380Sjfb8856606 */
1942*2d9fd380Sjfb8856606 struct ionic_log_event {
1943*2d9fd380Sjfb8856606 __le64 eid;
1944*2d9fd380Sjfb8856606 __le16 ecode;
1945*2d9fd380Sjfb8856606 u8 data[54];
1946*2d9fd380Sjfb8856606 };
1947*2d9fd380Sjfb8856606
1948*2d9fd380Sjfb8856606 /**
1949*2d9fd380Sjfb8856606 * struct ionic_port_stats
1950*2d9fd380Sjfb8856606 */
1951*2d9fd380Sjfb8856606 struct ionic_port_stats {
1952*2d9fd380Sjfb8856606 __le64 frames_rx_ok;
1953*2d9fd380Sjfb8856606 __le64 frames_rx_all;
1954*2d9fd380Sjfb8856606 __le64 frames_rx_bad_fcs;
1955*2d9fd380Sjfb8856606 __le64 frames_rx_bad_all;
1956*2d9fd380Sjfb8856606 __le64 octets_rx_ok;
1957*2d9fd380Sjfb8856606 __le64 octets_rx_all;
1958*2d9fd380Sjfb8856606 __le64 frames_rx_unicast;
1959*2d9fd380Sjfb8856606 __le64 frames_rx_multicast;
1960*2d9fd380Sjfb8856606 __le64 frames_rx_broadcast;
1961*2d9fd380Sjfb8856606 __le64 frames_rx_pause;
1962*2d9fd380Sjfb8856606 __le64 frames_rx_bad_length;
1963*2d9fd380Sjfb8856606 __le64 frames_rx_undersized;
1964*2d9fd380Sjfb8856606 __le64 frames_rx_oversized;
1965*2d9fd380Sjfb8856606 __le64 frames_rx_fragments;
1966*2d9fd380Sjfb8856606 __le64 frames_rx_jabber;
1967*2d9fd380Sjfb8856606 __le64 frames_rx_pripause;
1968*2d9fd380Sjfb8856606 __le64 frames_rx_stomped_crc;
1969*2d9fd380Sjfb8856606 __le64 frames_rx_too_long;
1970*2d9fd380Sjfb8856606 __le64 frames_rx_vlan_good;
1971*2d9fd380Sjfb8856606 __le64 frames_rx_dropped;
1972*2d9fd380Sjfb8856606 __le64 frames_rx_less_than_64b;
1973*2d9fd380Sjfb8856606 __le64 frames_rx_64b;
1974*2d9fd380Sjfb8856606 __le64 frames_rx_65b_127b;
1975*2d9fd380Sjfb8856606 __le64 frames_rx_128b_255b;
1976*2d9fd380Sjfb8856606 __le64 frames_rx_256b_511b;
1977*2d9fd380Sjfb8856606 __le64 frames_rx_512b_1023b;
1978*2d9fd380Sjfb8856606 __le64 frames_rx_1024b_1518b;
1979*2d9fd380Sjfb8856606 __le64 frames_rx_1519b_2047b;
1980*2d9fd380Sjfb8856606 __le64 frames_rx_2048b_4095b;
1981*2d9fd380Sjfb8856606 __le64 frames_rx_4096b_8191b;
1982*2d9fd380Sjfb8856606 __le64 frames_rx_8192b_9215b;
1983*2d9fd380Sjfb8856606 __le64 frames_rx_other;
1984*2d9fd380Sjfb8856606 __le64 frames_tx_ok;
1985*2d9fd380Sjfb8856606 __le64 frames_tx_all;
1986*2d9fd380Sjfb8856606 __le64 frames_tx_bad;
1987*2d9fd380Sjfb8856606 __le64 octets_tx_ok;
1988*2d9fd380Sjfb8856606 __le64 octets_tx_total;
1989*2d9fd380Sjfb8856606 __le64 frames_tx_unicast;
1990*2d9fd380Sjfb8856606 __le64 frames_tx_multicast;
1991*2d9fd380Sjfb8856606 __le64 frames_tx_broadcast;
1992*2d9fd380Sjfb8856606 __le64 frames_tx_pause;
1993*2d9fd380Sjfb8856606 __le64 frames_tx_pripause;
1994*2d9fd380Sjfb8856606 __le64 frames_tx_vlan;
1995*2d9fd380Sjfb8856606 __le64 frames_tx_less_than_64b;
1996*2d9fd380Sjfb8856606 __le64 frames_tx_64b;
1997*2d9fd380Sjfb8856606 __le64 frames_tx_65b_127b;
1998*2d9fd380Sjfb8856606 __le64 frames_tx_128b_255b;
1999*2d9fd380Sjfb8856606 __le64 frames_tx_256b_511b;
2000*2d9fd380Sjfb8856606 __le64 frames_tx_512b_1023b;
2001*2d9fd380Sjfb8856606 __le64 frames_tx_1024b_1518b;
2002*2d9fd380Sjfb8856606 __le64 frames_tx_1519b_2047b;
2003*2d9fd380Sjfb8856606 __le64 frames_tx_2048b_4095b;
2004*2d9fd380Sjfb8856606 __le64 frames_tx_4096b_8191b;
2005*2d9fd380Sjfb8856606 __le64 frames_tx_8192b_9215b;
2006*2d9fd380Sjfb8856606 __le64 frames_tx_other;
2007*2d9fd380Sjfb8856606 __le64 frames_tx_pri_0;
2008*2d9fd380Sjfb8856606 __le64 frames_tx_pri_1;
2009*2d9fd380Sjfb8856606 __le64 frames_tx_pri_2;
2010*2d9fd380Sjfb8856606 __le64 frames_tx_pri_3;
2011*2d9fd380Sjfb8856606 __le64 frames_tx_pri_4;
2012*2d9fd380Sjfb8856606 __le64 frames_tx_pri_5;
2013*2d9fd380Sjfb8856606 __le64 frames_tx_pri_6;
2014*2d9fd380Sjfb8856606 __le64 frames_tx_pri_7;
2015*2d9fd380Sjfb8856606 __le64 frames_rx_pri_0;
2016*2d9fd380Sjfb8856606 __le64 frames_rx_pri_1;
2017*2d9fd380Sjfb8856606 __le64 frames_rx_pri_2;
2018*2d9fd380Sjfb8856606 __le64 frames_rx_pri_3;
2019*2d9fd380Sjfb8856606 __le64 frames_rx_pri_4;
2020*2d9fd380Sjfb8856606 __le64 frames_rx_pri_5;
2021*2d9fd380Sjfb8856606 __le64 frames_rx_pri_6;
2022*2d9fd380Sjfb8856606 __le64 frames_rx_pri_7;
2023*2d9fd380Sjfb8856606 __le64 tx_pripause_0_1us_count;
2024*2d9fd380Sjfb8856606 __le64 tx_pripause_1_1us_count;
2025*2d9fd380Sjfb8856606 __le64 tx_pripause_2_1us_count;
2026*2d9fd380Sjfb8856606 __le64 tx_pripause_3_1us_count;
2027*2d9fd380Sjfb8856606 __le64 tx_pripause_4_1us_count;
2028*2d9fd380Sjfb8856606 __le64 tx_pripause_5_1us_count;
2029*2d9fd380Sjfb8856606 __le64 tx_pripause_6_1us_count;
2030*2d9fd380Sjfb8856606 __le64 tx_pripause_7_1us_count;
2031*2d9fd380Sjfb8856606 __le64 rx_pripause_0_1us_count;
2032*2d9fd380Sjfb8856606 __le64 rx_pripause_1_1us_count;
2033*2d9fd380Sjfb8856606 __le64 rx_pripause_2_1us_count;
2034*2d9fd380Sjfb8856606 __le64 rx_pripause_3_1us_count;
2035*2d9fd380Sjfb8856606 __le64 rx_pripause_4_1us_count;
2036*2d9fd380Sjfb8856606 __le64 rx_pripause_5_1us_count;
2037*2d9fd380Sjfb8856606 __le64 rx_pripause_6_1us_count;
2038*2d9fd380Sjfb8856606 __le64 rx_pripause_7_1us_count;
2039*2d9fd380Sjfb8856606 __le64 rx_pause_1us_count;
2040*2d9fd380Sjfb8856606 __le64 frames_tx_truncated;
2041*2d9fd380Sjfb8856606 };
2042*2d9fd380Sjfb8856606
2043*2d9fd380Sjfb8856606 struct ionic_mgmt_port_stats {
2044*2d9fd380Sjfb8856606 __le64 frames_rx_ok;
2045*2d9fd380Sjfb8856606 __le64 frames_rx_all;
2046*2d9fd380Sjfb8856606 __le64 frames_rx_bad_fcs;
2047*2d9fd380Sjfb8856606 __le64 frames_rx_bad_all;
2048*2d9fd380Sjfb8856606 __le64 octets_rx_ok;
2049*2d9fd380Sjfb8856606 __le64 octets_rx_all;
2050*2d9fd380Sjfb8856606 __le64 frames_rx_unicast;
2051*2d9fd380Sjfb8856606 __le64 frames_rx_multicast;
2052*2d9fd380Sjfb8856606 __le64 frames_rx_broadcast;
2053*2d9fd380Sjfb8856606 __le64 frames_rx_pause;
2054*2d9fd380Sjfb8856606 __le64 frames_rx_bad_length0;
2055*2d9fd380Sjfb8856606 __le64 frames_rx_undersized1;
2056*2d9fd380Sjfb8856606 __le64 frames_rx_oversized2;
2057*2d9fd380Sjfb8856606 __le64 frames_rx_fragments3;
2058*2d9fd380Sjfb8856606 __le64 frames_rx_jabber4;
2059*2d9fd380Sjfb8856606 __le64 frames_rx_64b5;
2060*2d9fd380Sjfb8856606 __le64 frames_rx_65b_127b6;
2061*2d9fd380Sjfb8856606 __le64 frames_rx_128b_255b7;
2062*2d9fd380Sjfb8856606 __le64 frames_rx_256b_511b8;
2063*2d9fd380Sjfb8856606 __le64 frames_rx_512b_1023b9;
2064*2d9fd380Sjfb8856606 __le64 frames_rx_1024b_1518b0;
2065*2d9fd380Sjfb8856606 __le64 frames_rx_gt_1518b1;
2066*2d9fd380Sjfb8856606 __le64 frames_rx_fifo_full2;
2067*2d9fd380Sjfb8856606 __le64 frames_tx_ok3;
2068*2d9fd380Sjfb8856606 __le64 frames_tx_all4;
2069*2d9fd380Sjfb8856606 __le64 frames_tx_bad5;
2070*2d9fd380Sjfb8856606 __le64 octets_tx_ok6;
2071*2d9fd380Sjfb8856606 __le64 octets_tx_total7;
2072*2d9fd380Sjfb8856606 __le64 frames_tx_unicast8;
2073*2d9fd380Sjfb8856606 __le64 frames_tx_multicast9;
2074*2d9fd380Sjfb8856606 __le64 frames_tx_broadcast0;
2075*2d9fd380Sjfb8856606 __le64 frames_tx_pause1;
2076*2d9fd380Sjfb8856606 };
2077*2d9fd380Sjfb8856606
2078*2d9fd380Sjfb8856606 /**
2079*2d9fd380Sjfb8856606 * struct ionic_port_identity - port identity structure
2080*2d9fd380Sjfb8856606 * @version: identity structure version
2081*2d9fd380Sjfb8856606 * @type: type of port (enum port_type)
2082*2d9fd380Sjfb8856606 * @num_lanes: number of lanes for the port
2083*2d9fd380Sjfb8856606 * @autoneg: autoneg supported
2084*2d9fd380Sjfb8856606 * @min_frame_size: minimum frame size supported
2085*2d9fd380Sjfb8856606 * @max_frame_size: maximum frame size supported
2086*2d9fd380Sjfb8856606 * @fec_type: supported fec types
2087*2d9fd380Sjfb8856606 * @pause_type: supported pause types
2088*2d9fd380Sjfb8856606 * @loopback_mode: supported loopback mode
2089*2d9fd380Sjfb8856606 * @speeds: supported speeds
2090*2d9fd380Sjfb8856606 * @config: current port configuration
2091*2d9fd380Sjfb8856606 */
2092*2d9fd380Sjfb8856606 union ionic_port_identity {
2093*2d9fd380Sjfb8856606 struct {
2094*2d9fd380Sjfb8856606 u8 version;
2095*2d9fd380Sjfb8856606 u8 type;
2096*2d9fd380Sjfb8856606 u8 num_lanes;
2097*2d9fd380Sjfb8856606 u8 autoneg;
2098*2d9fd380Sjfb8856606 __le32 min_frame_size;
2099*2d9fd380Sjfb8856606 __le32 max_frame_size;
2100*2d9fd380Sjfb8856606 u8 fec_type[4];
2101*2d9fd380Sjfb8856606 u8 pause_type[2];
2102*2d9fd380Sjfb8856606 u8 loopback_mode[2];
2103*2d9fd380Sjfb8856606 __le32 speeds[16];
2104*2d9fd380Sjfb8856606 u8 rsvd2[44];
2105*2d9fd380Sjfb8856606 union ionic_port_config config;
2106*2d9fd380Sjfb8856606 };
2107*2d9fd380Sjfb8856606 __le32 words[512];
2108*2d9fd380Sjfb8856606 };
2109*2d9fd380Sjfb8856606
2110*2d9fd380Sjfb8856606 /**
2111*2d9fd380Sjfb8856606 * struct ionic_port_info - port info structure
2112*2d9fd380Sjfb8856606 * @port_status: port status
2113*2d9fd380Sjfb8856606 * @port_stats: port stats
2114*2d9fd380Sjfb8856606 */
2115*2d9fd380Sjfb8856606 struct ionic_port_info {
2116*2d9fd380Sjfb8856606 union ionic_port_config config;
2117*2d9fd380Sjfb8856606 struct ionic_port_status status;
2118*2d9fd380Sjfb8856606 struct ionic_port_stats stats;
2119*2d9fd380Sjfb8856606 };
2120*2d9fd380Sjfb8856606
2121*2d9fd380Sjfb8856606 /**
2122*2d9fd380Sjfb8856606 * struct ionic_lif_stats
2123*2d9fd380Sjfb8856606 */
2124*2d9fd380Sjfb8856606 struct ionic_lif_stats {
2125*2d9fd380Sjfb8856606 /* RX */
2126*2d9fd380Sjfb8856606 __le64 rx_ucast_bytes;
2127*2d9fd380Sjfb8856606 __le64 rx_ucast_packets;
2128*2d9fd380Sjfb8856606 __le64 rx_mcast_bytes;
2129*2d9fd380Sjfb8856606 __le64 rx_mcast_packets;
2130*2d9fd380Sjfb8856606 __le64 rx_bcast_bytes;
2131*2d9fd380Sjfb8856606 __le64 rx_bcast_packets;
2132*2d9fd380Sjfb8856606 __le64 rsvd0;
2133*2d9fd380Sjfb8856606 __le64 rsvd1;
2134*2d9fd380Sjfb8856606 /* RX drops */
2135*2d9fd380Sjfb8856606 __le64 rx_ucast_drop_bytes;
2136*2d9fd380Sjfb8856606 __le64 rx_ucast_drop_packets;
2137*2d9fd380Sjfb8856606 __le64 rx_mcast_drop_bytes;
2138*2d9fd380Sjfb8856606 __le64 rx_mcast_drop_packets;
2139*2d9fd380Sjfb8856606 __le64 rx_bcast_drop_bytes;
2140*2d9fd380Sjfb8856606 __le64 rx_bcast_drop_packets;
2141*2d9fd380Sjfb8856606 __le64 rx_dma_error;
2142*2d9fd380Sjfb8856606 __le64 rsvd2;
2143*2d9fd380Sjfb8856606 /* TX */
2144*2d9fd380Sjfb8856606 __le64 tx_ucast_bytes;
2145*2d9fd380Sjfb8856606 __le64 tx_ucast_packets;
2146*2d9fd380Sjfb8856606 __le64 tx_mcast_bytes;
2147*2d9fd380Sjfb8856606 __le64 tx_mcast_packets;
2148*2d9fd380Sjfb8856606 __le64 tx_bcast_bytes;
2149*2d9fd380Sjfb8856606 __le64 tx_bcast_packets;
2150*2d9fd380Sjfb8856606 __le64 rsvd3;
2151*2d9fd380Sjfb8856606 __le64 rsvd4;
2152*2d9fd380Sjfb8856606 /* TX drops */
2153*2d9fd380Sjfb8856606 __le64 tx_ucast_drop_bytes;
2154*2d9fd380Sjfb8856606 __le64 tx_ucast_drop_packets;
2155*2d9fd380Sjfb8856606 __le64 tx_mcast_drop_bytes;
2156*2d9fd380Sjfb8856606 __le64 tx_mcast_drop_packets;
2157*2d9fd380Sjfb8856606 __le64 tx_bcast_drop_bytes;
2158*2d9fd380Sjfb8856606 __le64 tx_bcast_drop_packets;
2159*2d9fd380Sjfb8856606 __le64 tx_dma_error;
2160*2d9fd380Sjfb8856606 __le64 rsvd5;
2161*2d9fd380Sjfb8856606 /* Rx Queue/Ring drops */
2162*2d9fd380Sjfb8856606 __le64 rx_queue_disabled;
2163*2d9fd380Sjfb8856606 __le64 rx_queue_empty;
2164*2d9fd380Sjfb8856606 __le64 rx_queue_error;
2165*2d9fd380Sjfb8856606 __le64 rx_desc_fetch_error;
2166*2d9fd380Sjfb8856606 __le64 rx_desc_data_error;
2167*2d9fd380Sjfb8856606 __le64 rsvd6;
2168*2d9fd380Sjfb8856606 __le64 rsvd7;
2169*2d9fd380Sjfb8856606 __le64 rsvd8;
2170*2d9fd380Sjfb8856606 /* Tx Queue/Ring drops */
2171*2d9fd380Sjfb8856606 __le64 tx_queue_disabled;
2172*2d9fd380Sjfb8856606 __le64 tx_queue_error;
2173*2d9fd380Sjfb8856606 __le64 tx_desc_fetch_error;
2174*2d9fd380Sjfb8856606 __le64 tx_desc_data_error;
2175*2d9fd380Sjfb8856606 __le64 rsvd9;
2176*2d9fd380Sjfb8856606 __le64 rsvd10;
2177*2d9fd380Sjfb8856606 __le64 rsvd11;
2178*2d9fd380Sjfb8856606 __le64 rsvd12;
2179*2d9fd380Sjfb8856606
2180*2d9fd380Sjfb8856606 /* RDMA/ROCE TX */
2181*2d9fd380Sjfb8856606 __le64 tx_rdma_ucast_bytes;
2182*2d9fd380Sjfb8856606 __le64 tx_rdma_ucast_packets;
2183*2d9fd380Sjfb8856606 __le64 tx_rdma_mcast_bytes;
2184*2d9fd380Sjfb8856606 __le64 tx_rdma_mcast_packets;
2185*2d9fd380Sjfb8856606 __le64 tx_rdma_cnp_packets;
2186*2d9fd380Sjfb8856606 __le64 rsvd13;
2187*2d9fd380Sjfb8856606 __le64 rsvd14;
2188*2d9fd380Sjfb8856606 __le64 rsvd15;
2189*2d9fd380Sjfb8856606
2190*2d9fd380Sjfb8856606 /* RDMA/ROCE RX */
2191*2d9fd380Sjfb8856606 __le64 rx_rdma_ucast_bytes;
2192*2d9fd380Sjfb8856606 __le64 rx_rdma_ucast_packets;
2193*2d9fd380Sjfb8856606 __le64 rx_rdma_mcast_bytes;
2194*2d9fd380Sjfb8856606 __le64 rx_rdma_mcast_packets;
2195*2d9fd380Sjfb8856606 __le64 rx_rdma_cnp_packets;
2196*2d9fd380Sjfb8856606 __le64 rx_rdma_ecn_packets;
2197*2d9fd380Sjfb8856606 __le64 rsvd16;
2198*2d9fd380Sjfb8856606 __le64 rsvd17;
2199*2d9fd380Sjfb8856606
2200*2d9fd380Sjfb8856606 __le64 rsvd18;
2201*2d9fd380Sjfb8856606 __le64 rsvd19;
2202*2d9fd380Sjfb8856606 __le64 rsvd20;
2203*2d9fd380Sjfb8856606 __le64 rsvd21;
2204*2d9fd380Sjfb8856606 __le64 rsvd22;
2205*2d9fd380Sjfb8856606 __le64 rsvd23;
2206*2d9fd380Sjfb8856606 __le64 rsvd24;
2207*2d9fd380Sjfb8856606 __le64 rsvd25;
2208*2d9fd380Sjfb8856606
2209*2d9fd380Sjfb8856606 __le64 rsvd26;
2210*2d9fd380Sjfb8856606 __le64 rsvd27;
2211*2d9fd380Sjfb8856606 __le64 rsvd28;
2212*2d9fd380Sjfb8856606 __le64 rsvd29;
2213*2d9fd380Sjfb8856606 __le64 rsvd30;
2214*2d9fd380Sjfb8856606 __le64 rsvd31;
2215*2d9fd380Sjfb8856606 __le64 rsvd32;
2216*2d9fd380Sjfb8856606 __le64 rsvd33;
2217*2d9fd380Sjfb8856606
2218*2d9fd380Sjfb8856606 __le64 rsvd34;
2219*2d9fd380Sjfb8856606 __le64 rsvd35;
2220*2d9fd380Sjfb8856606 __le64 rsvd36;
2221*2d9fd380Sjfb8856606 __le64 rsvd37;
2222*2d9fd380Sjfb8856606 __le64 rsvd38;
2223*2d9fd380Sjfb8856606 __le64 rsvd39;
2224*2d9fd380Sjfb8856606 __le64 rsvd40;
2225*2d9fd380Sjfb8856606 __le64 rsvd41;
2226*2d9fd380Sjfb8856606
2227*2d9fd380Sjfb8856606 __le64 rsvd42;
2228*2d9fd380Sjfb8856606 __le64 rsvd43;
2229*2d9fd380Sjfb8856606 __le64 rsvd44;
2230*2d9fd380Sjfb8856606 __le64 rsvd45;
2231*2d9fd380Sjfb8856606 __le64 rsvd46;
2232*2d9fd380Sjfb8856606 __le64 rsvd47;
2233*2d9fd380Sjfb8856606 __le64 rsvd48;
2234*2d9fd380Sjfb8856606 __le64 rsvd49;
2235*2d9fd380Sjfb8856606
2236*2d9fd380Sjfb8856606 /* RDMA/ROCE REQ Error/Debugs (768 - 895) */
2237*2d9fd380Sjfb8856606 __le64 rdma_req_rx_pkt_seq_err;
2238*2d9fd380Sjfb8856606 __le64 rdma_req_rx_rnr_retry_err;
2239*2d9fd380Sjfb8856606 __le64 rdma_req_rx_remote_access_err;
2240*2d9fd380Sjfb8856606 __le64 rdma_req_rx_remote_inv_req_err;
2241*2d9fd380Sjfb8856606 __le64 rdma_req_rx_remote_oper_err;
2242*2d9fd380Sjfb8856606 __le64 rdma_req_rx_implied_nak_seq_err;
2243*2d9fd380Sjfb8856606 __le64 rdma_req_rx_cqe_err;
2244*2d9fd380Sjfb8856606 __le64 rdma_req_rx_cqe_flush_err;
2245*2d9fd380Sjfb8856606
2246*2d9fd380Sjfb8856606 __le64 rdma_req_rx_dup_responses;
2247*2d9fd380Sjfb8856606 __le64 rdma_req_rx_invalid_packets;
2248*2d9fd380Sjfb8856606 __le64 rdma_req_tx_local_access_err;
2249*2d9fd380Sjfb8856606 __le64 rdma_req_tx_local_oper_err;
2250*2d9fd380Sjfb8856606 __le64 rdma_req_tx_memory_mgmt_err;
2251*2d9fd380Sjfb8856606 __le64 rsvd52;
2252*2d9fd380Sjfb8856606 __le64 rsvd53;
2253*2d9fd380Sjfb8856606 __le64 rsvd54;
2254*2d9fd380Sjfb8856606
2255*2d9fd380Sjfb8856606 /* RDMA/ROCE RESP Error/Debugs (896 - 1023) */
2256*2d9fd380Sjfb8856606 __le64 rdma_resp_rx_dup_requests;
2257*2d9fd380Sjfb8856606 __le64 rdma_resp_rx_out_of_buffer;
2258*2d9fd380Sjfb8856606 __le64 rdma_resp_rx_out_of_seq_pkts;
2259*2d9fd380Sjfb8856606 __le64 rdma_resp_rx_cqe_err;
2260*2d9fd380Sjfb8856606 __le64 rdma_resp_rx_cqe_flush_err;
2261*2d9fd380Sjfb8856606 __le64 rdma_resp_rx_local_len_err;
2262*2d9fd380Sjfb8856606 __le64 rdma_resp_rx_inv_request_err;
2263*2d9fd380Sjfb8856606 __le64 rdma_resp_rx_local_qp_oper_err;
2264*2d9fd380Sjfb8856606
2265*2d9fd380Sjfb8856606 __le64 rdma_resp_rx_out_of_atomic_resource;
2266*2d9fd380Sjfb8856606 __le64 rdma_resp_tx_pkt_seq_err;
2267*2d9fd380Sjfb8856606 __le64 rdma_resp_tx_remote_inv_req_err;
2268*2d9fd380Sjfb8856606 __le64 rdma_resp_tx_remote_access_err;
2269*2d9fd380Sjfb8856606 __le64 rdma_resp_tx_remote_oper_err;
2270*2d9fd380Sjfb8856606 __le64 rdma_resp_tx_rnr_retry_err;
2271*2d9fd380Sjfb8856606 __le64 rsvd57;
2272*2d9fd380Sjfb8856606 __le64 rsvd58;
2273*2d9fd380Sjfb8856606 };
2274*2d9fd380Sjfb8856606
2275*2d9fd380Sjfb8856606 /**
2276*2d9fd380Sjfb8856606 * struct ionic_lif_info - lif info structure
2277*2d9fd380Sjfb8856606 */
2278*2d9fd380Sjfb8856606 struct ionic_lif_info {
2279*2d9fd380Sjfb8856606 union ionic_lif_config config;
2280*2d9fd380Sjfb8856606 struct ionic_lif_status status;
2281*2d9fd380Sjfb8856606 struct ionic_lif_stats stats;
2282*2d9fd380Sjfb8856606 };
2283*2d9fd380Sjfb8856606
2284*2d9fd380Sjfb8856606 union ionic_dev_cmd {
2285*2d9fd380Sjfb8856606 u32 words[16];
2286*2d9fd380Sjfb8856606 struct ionic_admin_cmd cmd;
2287*2d9fd380Sjfb8856606 struct ionic_nop_cmd nop;
2288*2d9fd380Sjfb8856606
2289*2d9fd380Sjfb8856606 struct ionic_dev_identify_cmd identify;
2290*2d9fd380Sjfb8856606 struct ionic_dev_init_cmd init;
2291*2d9fd380Sjfb8856606 struct ionic_dev_reset_cmd reset;
2292*2d9fd380Sjfb8856606 struct ionic_dev_getattr_cmd getattr;
2293*2d9fd380Sjfb8856606 struct ionic_dev_setattr_cmd setattr;
2294*2d9fd380Sjfb8856606
2295*2d9fd380Sjfb8856606 struct ionic_port_identify_cmd port_identify;
2296*2d9fd380Sjfb8856606 struct ionic_port_init_cmd port_init;
2297*2d9fd380Sjfb8856606 struct ionic_port_reset_cmd port_reset;
2298*2d9fd380Sjfb8856606 struct ionic_port_getattr_cmd port_getattr;
2299*2d9fd380Sjfb8856606 struct ionic_port_setattr_cmd port_setattr;
2300*2d9fd380Sjfb8856606
2301*2d9fd380Sjfb8856606 struct ionic_lif_identify_cmd lif_identify;
2302*2d9fd380Sjfb8856606 struct ionic_lif_init_cmd lif_init;
2303*2d9fd380Sjfb8856606 struct ionic_lif_reset_cmd lif_reset;
2304*2d9fd380Sjfb8856606
2305*2d9fd380Sjfb8856606 struct ionic_qos_identify_cmd qos_identify;
2306*2d9fd380Sjfb8856606 struct ionic_qos_init_cmd qos_init;
2307*2d9fd380Sjfb8856606 struct ionic_qos_reset_cmd qos_reset;
2308*2d9fd380Sjfb8856606
2309*2d9fd380Sjfb8856606 struct ionic_q_init_cmd q_init;
2310*2d9fd380Sjfb8856606 };
2311*2d9fd380Sjfb8856606
2312*2d9fd380Sjfb8856606 union ionic_dev_cmd_comp {
2313*2d9fd380Sjfb8856606 u32 words[4];
2314*2d9fd380Sjfb8856606 u8 status;
2315*2d9fd380Sjfb8856606 struct ionic_admin_comp comp;
2316*2d9fd380Sjfb8856606 struct ionic_nop_comp nop;
2317*2d9fd380Sjfb8856606
2318*2d9fd380Sjfb8856606 struct ionic_dev_identify_comp identify;
2319*2d9fd380Sjfb8856606 struct ionic_dev_init_comp init;
2320*2d9fd380Sjfb8856606 struct ionic_dev_reset_comp reset;
2321*2d9fd380Sjfb8856606 struct ionic_dev_getattr_comp getattr;
2322*2d9fd380Sjfb8856606 struct ionic_dev_setattr_comp setattr;
2323*2d9fd380Sjfb8856606
2324*2d9fd380Sjfb8856606 struct ionic_port_identify_comp port_identify;
2325*2d9fd380Sjfb8856606 struct ionic_port_init_comp port_init;
2326*2d9fd380Sjfb8856606 struct ionic_port_reset_comp port_reset;
2327*2d9fd380Sjfb8856606 struct ionic_port_getattr_comp port_getattr;
2328*2d9fd380Sjfb8856606 struct ionic_port_setattr_comp port_setattr;
2329*2d9fd380Sjfb8856606
2330*2d9fd380Sjfb8856606 struct ionic_lif_identify_comp lif_identify;
2331*2d9fd380Sjfb8856606 struct ionic_lif_init_comp lif_init;
2332*2d9fd380Sjfb8856606 ionic_lif_reset_comp lif_reset;
2333*2d9fd380Sjfb8856606
2334*2d9fd380Sjfb8856606 struct ionic_qos_identify_comp qos_identify;
2335*2d9fd380Sjfb8856606 ionic_qos_init_comp qos_init;
2336*2d9fd380Sjfb8856606 ionic_qos_reset_comp qos_reset;
2337*2d9fd380Sjfb8856606
2338*2d9fd380Sjfb8856606 struct ionic_q_init_comp q_init;
2339*2d9fd380Sjfb8856606 };
2340*2d9fd380Sjfb8856606
2341*2d9fd380Sjfb8856606 /**
2342*2d9fd380Sjfb8856606 * union dev_info - Device info register format (read-only)
2343*2d9fd380Sjfb8856606 * @signature: Signature value of 0x44455649 ('DEVI').
2344*2d9fd380Sjfb8856606 * @version: Current version of info.
2345*2d9fd380Sjfb8856606 * @asic_type: Asic type.
2346*2d9fd380Sjfb8856606 * @asic_rev: Asic revision.
2347*2d9fd380Sjfb8856606 * @fw_status: Firmware status.
2348*2d9fd380Sjfb8856606 * @fw_heartbeat: Firmware heartbeat counter.
2349*2d9fd380Sjfb8856606 * @serial_num: Serial number.
2350*2d9fd380Sjfb8856606 * @fw_version: Firmware version.
2351*2d9fd380Sjfb8856606 */
2352*2d9fd380Sjfb8856606 union ionic_dev_info_regs {
2353*2d9fd380Sjfb8856606 #define IONIC_DEVINFO_FWVERS_BUFLEN 32
2354*2d9fd380Sjfb8856606 #define IONIC_DEVINFO_SERIAL_BUFLEN 32
2355*2d9fd380Sjfb8856606 struct {
2356*2d9fd380Sjfb8856606 u32 signature;
2357*2d9fd380Sjfb8856606 u8 version;
2358*2d9fd380Sjfb8856606 u8 asic_type;
2359*2d9fd380Sjfb8856606 u8 asic_rev;
2360*2d9fd380Sjfb8856606 u8 fw_status;
2361*2d9fd380Sjfb8856606 u32 fw_heartbeat;
2362*2d9fd380Sjfb8856606 char fw_version[IONIC_DEVINFO_FWVERS_BUFLEN];
2363*2d9fd380Sjfb8856606 char serial_num[IONIC_DEVINFO_SERIAL_BUFLEN];
2364*2d9fd380Sjfb8856606 };
2365*2d9fd380Sjfb8856606 u32 words[512];
2366*2d9fd380Sjfb8856606 };
2367*2d9fd380Sjfb8856606
2368*2d9fd380Sjfb8856606 /**
2369*2d9fd380Sjfb8856606 * union ionic_dev_cmd_regs - Device command register format (read-write)
2370*2d9fd380Sjfb8856606 * @doorbell: Device Cmd Doorbell, write-only.
2371*2d9fd380Sjfb8856606 * Write a 1 to signal device to process cmd,
2372*2d9fd380Sjfb8856606 * poll done for completion.
2373*2d9fd380Sjfb8856606 * @done: Done indicator, bit 0 == 1 when command is complete.
2374*2d9fd380Sjfb8856606 * @cmd: Opcode-specific command bytes
2375*2d9fd380Sjfb8856606 * @comp: Opcode-specific response bytes
2376*2d9fd380Sjfb8856606 * @data: Opcode-specific side-data
2377*2d9fd380Sjfb8856606 */
2378*2d9fd380Sjfb8856606 union ionic_dev_cmd_regs {
2379*2d9fd380Sjfb8856606 struct {
2380*2d9fd380Sjfb8856606 u32 doorbell;
2381*2d9fd380Sjfb8856606 u32 done;
2382*2d9fd380Sjfb8856606 union ionic_dev_cmd cmd;
2383*2d9fd380Sjfb8856606 union ionic_dev_cmd_comp comp;
2384*2d9fd380Sjfb8856606 u8 rsvd[48];
2385*2d9fd380Sjfb8856606 u32 data[478];
2386*2d9fd380Sjfb8856606 };
2387*2d9fd380Sjfb8856606 u32 words[512];
2388*2d9fd380Sjfb8856606 };
2389*2d9fd380Sjfb8856606
2390*2d9fd380Sjfb8856606 /**
2391*2d9fd380Sjfb8856606 * union ionic_dev_regs - Device register format in for bar 0 page 0
2392*2d9fd380Sjfb8856606 * @info: Device info registers
2393*2d9fd380Sjfb8856606 * @devcmd: Device command registers
2394*2d9fd380Sjfb8856606 */
2395*2d9fd380Sjfb8856606 union ionic_dev_regs {
2396*2d9fd380Sjfb8856606 struct {
2397*2d9fd380Sjfb8856606 union ionic_dev_info_regs info;
2398*2d9fd380Sjfb8856606 union ionic_dev_cmd_regs devcmd;
2399*2d9fd380Sjfb8856606 };
2400*2d9fd380Sjfb8856606 __le32 words[1024];
2401*2d9fd380Sjfb8856606 };
2402*2d9fd380Sjfb8856606
2403*2d9fd380Sjfb8856606 union ionic_adminq_cmd {
2404*2d9fd380Sjfb8856606 struct ionic_admin_cmd cmd;
2405*2d9fd380Sjfb8856606 struct ionic_nop_cmd nop;
2406*2d9fd380Sjfb8856606 struct ionic_q_init_cmd q_init;
2407*2d9fd380Sjfb8856606 struct ionic_q_control_cmd q_control;
2408*2d9fd380Sjfb8856606 struct ionic_lif_setattr_cmd lif_setattr;
2409*2d9fd380Sjfb8856606 struct ionic_lif_getattr_cmd lif_getattr;
2410*2d9fd380Sjfb8856606 struct ionic_rx_mode_set_cmd rx_mode_set;
2411*2d9fd380Sjfb8856606 struct ionic_rx_filter_add_cmd rx_filter_add;
2412*2d9fd380Sjfb8856606 struct ionic_rx_filter_del_cmd rx_filter_del;
2413*2d9fd380Sjfb8856606 struct ionic_rdma_reset_cmd rdma_reset;
2414*2d9fd380Sjfb8856606 struct ionic_rdma_queue_cmd rdma_queue;
2415*2d9fd380Sjfb8856606 struct ionic_fw_download_cmd fw_download;
2416*2d9fd380Sjfb8856606 struct ionic_fw_control_cmd fw_control;
2417*2d9fd380Sjfb8856606 };
2418*2d9fd380Sjfb8856606
2419*2d9fd380Sjfb8856606 union ionic_adminq_comp {
2420*2d9fd380Sjfb8856606 struct ionic_admin_comp comp;
2421*2d9fd380Sjfb8856606 struct ionic_nop_comp nop;
2422*2d9fd380Sjfb8856606 struct ionic_q_init_comp q_init;
2423*2d9fd380Sjfb8856606 struct ionic_lif_setattr_comp lif_setattr;
2424*2d9fd380Sjfb8856606 struct ionic_lif_getattr_comp lif_getattr;
2425*2d9fd380Sjfb8856606 struct ionic_rx_filter_add_comp rx_filter_add;
2426*2d9fd380Sjfb8856606 struct ionic_fw_control_comp fw_control;
2427*2d9fd380Sjfb8856606 };
2428*2d9fd380Sjfb8856606
2429*2d9fd380Sjfb8856606 #define IONIC_BARS_MAX 6
2430*2d9fd380Sjfb8856606 #define IONIC_PCI_BAR_DBELL 1
2431*2d9fd380Sjfb8856606
2432*2d9fd380Sjfb8856606 /* BAR0 */
2433*2d9fd380Sjfb8856606 #define IONIC_BAR0_SIZE 0x8000
2434*2d9fd380Sjfb8856606
2435*2d9fd380Sjfb8856606 #define IONIC_BAR0_DEV_INFO_REGS_OFFSET 0x0000
2436*2d9fd380Sjfb8856606 #define IONIC_BAR0_DEV_CMD_REGS_OFFSET 0x0800
2437*2d9fd380Sjfb8856606 #define IONIC_BAR0_DEV_CMD_DATA_REGS_OFFSET 0x0c00
2438*2d9fd380Sjfb8856606 #define IONIC_BAR0_INTR_STATUS_OFFSET 0x1000
2439*2d9fd380Sjfb8856606 #define IONIC_BAR0_INTR_CTRL_OFFSET 0x2000
2440*2d9fd380Sjfb8856606 #define IONIC_DEV_CMD_DONE 0x00000001
2441*2d9fd380Sjfb8856606
2442*2d9fd380Sjfb8856606 #define IONIC_ASIC_TYPE_CAPRI 0
2443*2d9fd380Sjfb8856606
2444*2d9fd380Sjfb8856606 /**
2445*2d9fd380Sjfb8856606 * struct ionic_doorbell - Doorbell register layout
2446*2d9fd380Sjfb8856606 * @p_index: Producer index
2447*2d9fd380Sjfb8856606 * @ring: Selects the specific ring of the queue to update.
2448*2d9fd380Sjfb8856606 * Type-specific meaning:
2449*2d9fd380Sjfb8856606 * ring=0: Default producer/consumer queue.
2450*2d9fd380Sjfb8856606 * ring=1: (CQ, EQ) Re-Arm queue. RDMA CQs
2451*2d9fd380Sjfb8856606 * send events to EQs when armed. EQs send
2452*2d9fd380Sjfb8856606 * interrupts when armed.
2453*2d9fd380Sjfb8856606 * @qid: The queue id selects the queue destination for the
2454*2d9fd380Sjfb8856606 * producer index and flags.
2455*2d9fd380Sjfb8856606 */
2456*2d9fd380Sjfb8856606 struct ionic_doorbell {
2457*2d9fd380Sjfb8856606 __le16 p_index;
2458*2d9fd380Sjfb8856606 u8 ring;
2459*2d9fd380Sjfb8856606 u8 qid_lo;
2460*2d9fd380Sjfb8856606 __le16 qid_hi;
2461*2d9fd380Sjfb8856606 u16 rsvd2;
2462*2d9fd380Sjfb8856606 };
2463*2d9fd380Sjfb8856606
2464*2d9fd380Sjfb8856606 struct ionic_intr_status {
2465*2d9fd380Sjfb8856606 u32 status[2];
2466*2d9fd380Sjfb8856606 };
2467*2d9fd380Sjfb8856606
2468*2d9fd380Sjfb8856606 struct ionic_notifyq_cmd {
2469*2d9fd380Sjfb8856606 __le32 data; /* Not used but needed for qcq structure */
2470*2d9fd380Sjfb8856606 };
2471*2d9fd380Sjfb8856606
2472*2d9fd380Sjfb8856606 union ionic_notifyq_comp {
2473*2d9fd380Sjfb8856606 struct ionic_notifyq_event event;
2474*2d9fd380Sjfb8856606 struct ionic_link_change_event link_change;
2475*2d9fd380Sjfb8856606 struct ionic_reset_event reset;
2476*2d9fd380Sjfb8856606 struct ionic_heartbeat_event heartbeat;
2477*2d9fd380Sjfb8856606 struct ionic_log_event log;
2478*2d9fd380Sjfb8856606 };
2479*2d9fd380Sjfb8856606
2480*2d9fd380Sjfb8856606 /* Deprecate */
2481*2d9fd380Sjfb8856606 struct ionic_identity {
2482*2d9fd380Sjfb8856606 union ionic_drv_identity drv;
2483*2d9fd380Sjfb8856606 union ionic_dev_identity dev;
2484*2d9fd380Sjfb8856606 union ionic_lif_identity lif;
2485*2d9fd380Sjfb8856606 union ionic_port_identity port;
2486*2d9fd380Sjfb8856606 union ionic_qos_identity qos;
2487*2d9fd380Sjfb8856606 };
2488*2d9fd380Sjfb8856606
2489*2d9fd380Sjfb8856606 #pragma pack(pop)
2490*2d9fd380Sjfb8856606
2491*2d9fd380Sjfb8856606 #endif /* _IONIC_IF_H_ */
2492