106e9bfc1SLukas Bulwahn /* SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB) OR BSD-2-Clause */
2c4e7a75aSShannon Nelson /* Copyright (c) 2017-2020 Pensando Systems, Inc.  All rights reserved. */
3fbfb8031SShannon Nelson 
4fbfb8031SShannon Nelson #ifndef _IONIC_IF_H_
5fbfb8031SShannon Nelson #define _IONIC_IF_H_
6fbfb8031SShannon Nelson 
7fbfb8031SShannon Nelson #define IONIC_DEV_INFO_SIGNATURE		0x44455649      /* 'DEVI' */
8fbfb8031SShannon Nelson #define IONIC_DEV_INFO_VERSION			1
9fbfb8031SShannon Nelson #define IONIC_IFNAMSIZ				16
10fbfb8031SShannon Nelson 
11f43a96d9SShannon Nelson /*
12c4e7a75aSShannon Nelson  * enum ionic_cmd_opcode - Device commands
13fbfb8031SShannon Nelson  */
14fbfb8031SShannon Nelson enum ionic_cmd_opcode {
15fbfb8031SShannon Nelson 	IONIC_CMD_NOP				= 0,
16fbfb8031SShannon Nelson 
17fbfb8031SShannon Nelson 	/* Device commands */
18fbfb8031SShannon Nelson 	IONIC_CMD_IDENTIFY			= 1,
19fbfb8031SShannon Nelson 	IONIC_CMD_INIT				= 2,
20fbfb8031SShannon Nelson 	IONIC_CMD_RESET				= 3,
21fbfb8031SShannon Nelson 	IONIC_CMD_GETATTR			= 4,
22fbfb8031SShannon Nelson 	IONIC_CMD_SETATTR			= 5,
23fbfb8031SShannon Nelson 
24fbfb8031SShannon Nelson 	/* Port commands */
25fbfb8031SShannon Nelson 	IONIC_CMD_PORT_IDENTIFY			= 10,
26fbfb8031SShannon Nelson 	IONIC_CMD_PORT_INIT			= 11,
27fbfb8031SShannon Nelson 	IONIC_CMD_PORT_RESET			= 12,
28fbfb8031SShannon Nelson 	IONIC_CMD_PORT_GETATTR			= 13,
29fbfb8031SShannon Nelson 	IONIC_CMD_PORT_SETATTR			= 14,
30fbfb8031SShannon Nelson 
31fbfb8031SShannon Nelson 	/* LIF commands */
32fbfb8031SShannon Nelson 	IONIC_CMD_LIF_IDENTIFY			= 20,
33fbfb8031SShannon Nelson 	IONIC_CMD_LIF_INIT			= 21,
34fbfb8031SShannon Nelson 	IONIC_CMD_LIF_RESET			= 22,
35fbfb8031SShannon Nelson 	IONIC_CMD_LIF_GETATTR			= 23,
36fbfb8031SShannon Nelson 	IONIC_CMD_LIF_SETATTR			= 24,
373da25843SShannon Nelson 	IONIC_CMD_LIF_SETPHC			= 25,
38fbfb8031SShannon Nelson 
39fbfb8031SShannon Nelson 	IONIC_CMD_RX_MODE_SET			= 30,
40fbfb8031SShannon Nelson 	IONIC_CMD_RX_FILTER_ADD			= 31,
41fbfb8031SShannon Nelson 	IONIC_CMD_RX_FILTER_DEL			= 32,
42fbfb8031SShannon Nelson 
43fbfb8031SShannon Nelson 	/* Queue commands */
445b3f3f2aSShannon Nelson 	IONIC_CMD_Q_IDENTIFY			= 39,
45fbfb8031SShannon Nelson 	IONIC_CMD_Q_INIT			= 40,
46fbfb8031SShannon Nelson 	IONIC_CMD_Q_CONTROL			= 41,
47fbfb8031SShannon Nelson 
48fbfb8031SShannon Nelson 	/* RDMA commands */
49fbfb8031SShannon Nelson 	IONIC_CMD_RDMA_RESET_LIF		= 50,
50fbfb8031SShannon Nelson 	IONIC_CMD_RDMA_CREATE_EQ		= 51,
51fbfb8031SShannon Nelson 	IONIC_CMD_RDMA_CREATE_CQ		= 52,
52fbfb8031SShannon Nelson 	IONIC_CMD_RDMA_CREATE_ADMINQ		= 53,
53fbfb8031SShannon Nelson 
543d462ce2SShannon Nelson 	/* SR/IOV commands */
553d462ce2SShannon Nelson 	IONIC_CMD_VF_GETATTR			= 60,
563d462ce2SShannon Nelson 	IONIC_CMD_VF_SETATTR			= 61,
57f43a96d9SShannon Nelson 	IONIC_CMD_VF_CTRL			= 62,
583d462ce2SShannon Nelson 
59fbfb8031SShannon Nelson 	/* QoS commands */
60fbfb8031SShannon Nelson 	IONIC_CMD_QOS_CLASS_IDENTIFY		= 240,
61fbfb8031SShannon Nelson 	IONIC_CMD_QOS_CLASS_INIT		= 241,
62fbfb8031SShannon Nelson 	IONIC_CMD_QOS_CLASS_RESET		= 242,
63c4e7a75aSShannon Nelson 	IONIC_CMD_QOS_CLASS_UPDATE		= 243,
641b897e7dSShannon Nelson 	IONIC_CMD_QOS_CLEAR_STATS		= 244,
651b897e7dSShannon Nelson 	IONIC_CMD_QOS_RESET			= 245,
66fbfb8031SShannon Nelson 
67fbfb8031SShannon Nelson 	/* Firmware commands */
6887c905d8SShannon Nelson 	IONIC_CMD_FW_DOWNLOAD                   = 252,
6987c905d8SShannon Nelson 	IONIC_CMD_FW_CONTROL                    = 253,
7087c905d8SShannon Nelson 	IONIC_CMD_FW_DOWNLOAD_V1		= 254,
7187c905d8SShannon Nelson 	IONIC_CMD_FW_CONTROL_V1		        = 255,
72fbfb8031SShannon Nelson };
73fbfb8031SShannon Nelson 
74fbfb8031SShannon Nelson /**
75c4e7a75aSShannon Nelson  * enum ionic_status_code - Device command return codes
76fbfb8031SShannon Nelson  */
77fbfb8031SShannon Nelson enum ionic_status_code {
78fbfb8031SShannon Nelson 	IONIC_RC_SUCCESS	= 0,	/* Success */
79fbfb8031SShannon Nelson 	IONIC_RC_EVERSION	= 1,	/* Incorrect version for request */
80fbfb8031SShannon Nelson 	IONIC_RC_EOPCODE	= 2,	/* Invalid cmd opcode */
81fbfb8031SShannon Nelson 	IONIC_RC_EIO		= 3,	/* I/O error */
82fbfb8031SShannon Nelson 	IONIC_RC_EPERM		= 4,	/* Permission denied */
83fbfb8031SShannon Nelson 	IONIC_RC_EQID		= 5,	/* Bad qid */
84fbfb8031SShannon Nelson 	IONIC_RC_EQTYPE		= 6,	/* Bad qtype */
85fbfb8031SShannon Nelson 	IONIC_RC_ENOENT		= 7,	/* No such element */
86fbfb8031SShannon Nelson 	IONIC_RC_EINTR		= 8,	/* operation interrupted */
87fbfb8031SShannon Nelson 	IONIC_RC_EAGAIN		= 9,	/* Try again */
88fbfb8031SShannon Nelson 	IONIC_RC_ENOMEM		= 10,	/* Out of memory */
89fbfb8031SShannon Nelson 	IONIC_RC_EFAULT		= 11,	/* Bad address */
90fbfb8031SShannon Nelson 	IONIC_RC_EBUSY		= 12,	/* Device or resource busy */
91fbfb8031SShannon Nelson 	IONIC_RC_EEXIST		= 13,	/* object already exists */
92fbfb8031SShannon Nelson 	IONIC_RC_EINVAL		= 14,	/* Invalid argument */
93fbfb8031SShannon Nelson 	IONIC_RC_ENOSPC		= 15,	/* No space left or alloc failure */
94fbfb8031SShannon Nelson 	IONIC_RC_ERANGE		= 16,	/* Parameter out of range */
95fbfb8031SShannon Nelson 	IONIC_RC_BAD_ADDR	= 17,	/* Descriptor contains a bad ptr */
96fbfb8031SShannon Nelson 	IONIC_RC_DEV_CMD	= 18,	/* Device cmd attempted on AdminQ */
97fbfb8031SShannon Nelson 	IONIC_RC_ENOSUPP	= 19,	/* Operation not supported */
98fbfb8031SShannon Nelson 	IONIC_RC_ERROR		= 29,	/* Generic error */
99fbfb8031SShannon Nelson 	IONIC_RC_ERDMA		= 30,	/* Generic RDMA error */
1001b897e7dSShannon Nelson 	IONIC_RC_EVFID		= 31,	/* VF ID does not exist */
1019e15410dSShannon Nelson 	IONIC_RC_EBAD_FW	= 32,	/* FW file is invalid or corrupted */
102fbfb8031SShannon Nelson };
103fbfb8031SShannon Nelson 
104fbfb8031SShannon Nelson enum ionic_notifyq_opcode {
105fbfb8031SShannon Nelson 	IONIC_EVENT_LINK_CHANGE		= 1,
106fbfb8031SShannon Nelson 	IONIC_EVENT_RESET		= 2,
107fbfb8031SShannon Nelson 	IONIC_EVENT_HEARTBEAT		= 3,
108fbfb8031SShannon Nelson 	IONIC_EVENT_LOG			= 4,
109c4e7a75aSShannon Nelson 	IONIC_EVENT_XCVR		= 5,
110fbfb8031SShannon Nelson };
111fbfb8031SShannon Nelson 
112fbfb8031SShannon Nelson /**
1131b897e7dSShannon Nelson  * struct ionic_admin_cmd - General admin command format
114fbfb8031SShannon Nelson  * @opcode:     Opcode for the command
115fbfb8031SShannon Nelson  * @lif_index:  LIF index
116fbfb8031SShannon Nelson  * @cmd_data:   Opcode-specific command bytes
117fbfb8031SShannon Nelson  */
118fbfb8031SShannon Nelson struct ionic_admin_cmd {
119fbfb8031SShannon Nelson 	u8     opcode;
120fbfb8031SShannon Nelson 	u8     rsvd;
121fbfb8031SShannon Nelson 	__le16 lif_index;
122fbfb8031SShannon Nelson 	u8     cmd_data[60];
123fbfb8031SShannon Nelson };
124fbfb8031SShannon Nelson 
125fbfb8031SShannon Nelson /**
1265c28f213SShannon Nelson  * struct ionic_admin_comp - General admin command completion format
127c4e7a75aSShannon Nelson  * @status:     Status of the command (enum ionic_status_code)
128c4e7a75aSShannon Nelson  * @comp_index: Index in the descriptor ring for which this is the completion
129c4e7a75aSShannon Nelson  * @cmd_data:   Command-specific bytes
130c4e7a75aSShannon Nelson  * @color:      Color bit (Always 0 for commands issued to the
131c4e7a75aSShannon Nelson  *              Device Cmd Registers)
132fbfb8031SShannon Nelson  */
133fbfb8031SShannon Nelson struct ionic_admin_comp {
134fbfb8031SShannon Nelson 	u8     status;
135fbfb8031SShannon Nelson 	u8     rsvd;
136fbfb8031SShannon Nelson 	__le16 comp_index;
137fbfb8031SShannon Nelson 	u8     cmd_data[11];
138fbfb8031SShannon Nelson 	u8     color;
139fbfb8031SShannon Nelson #define IONIC_COMP_COLOR_MASK  0x80
140fbfb8031SShannon Nelson };
141fbfb8031SShannon Nelson 
color_match(u8 color,u8 done_color)142fbfb8031SShannon Nelson static inline u8 color_match(u8 color, u8 done_color)
143fbfb8031SShannon Nelson {
144fbfb8031SShannon Nelson 	return (!!(color & IONIC_COMP_COLOR_MASK)) == done_color;
145fbfb8031SShannon Nelson }
146fbfb8031SShannon Nelson 
147fbfb8031SShannon Nelson /**
1485c28f213SShannon Nelson  * struct ionic_nop_cmd - NOP command
149fbfb8031SShannon Nelson  * @opcode: opcode
150fbfb8031SShannon Nelson  */
151fbfb8031SShannon Nelson struct ionic_nop_cmd {
152fbfb8031SShannon Nelson 	u8 opcode;
153fbfb8031SShannon Nelson 	u8 rsvd[63];
154fbfb8031SShannon Nelson };
155fbfb8031SShannon Nelson 
156fbfb8031SShannon Nelson /**
1575c28f213SShannon Nelson  * struct ionic_nop_comp - NOP command completion
158c4e7a75aSShannon Nelson  * @status: Status of the command (enum ionic_status_code)
159fbfb8031SShannon Nelson  */
160fbfb8031SShannon Nelson struct ionic_nop_comp {
161fbfb8031SShannon Nelson 	u8 status;
162fbfb8031SShannon Nelson 	u8 rsvd[15];
163fbfb8031SShannon Nelson };
164fbfb8031SShannon Nelson 
165fbfb8031SShannon Nelson /**
1665c28f213SShannon Nelson  * struct ionic_dev_init_cmd - Device init command
167fbfb8031SShannon Nelson  * @opcode:    opcode
168c4e7a75aSShannon Nelson  * @type:      Device type
169fbfb8031SShannon Nelson  */
170fbfb8031SShannon Nelson struct ionic_dev_init_cmd {
171fbfb8031SShannon Nelson 	u8     opcode;
172fbfb8031SShannon Nelson 	u8     type;
173fbfb8031SShannon Nelson 	u8     rsvd[62];
174fbfb8031SShannon Nelson };
175fbfb8031SShannon Nelson 
176fbfb8031SShannon Nelson /**
1771b897e7dSShannon Nelson  * struct ionic_dev_init_comp - Device init command completion
178c4e7a75aSShannon Nelson  * @status: Status of the command (enum ionic_status_code)
179fbfb8031SShannon Nelson  */
180fbfb8031SShannon Nelson struct ionic_dev_init_comp {
181fbfb8031SShannon Nelson 	u8 status;
182fbfb8031SShannon Nelson 	u8 rsvd[15];
183fbfb8031SShannon Nelson };
184fbfb8031SShannon Nelson 
185fbfb8031SShannon Nelson /**
1865c28f213SShannon Nelson  * struct ionic_dev_reset_cmd - Device reset command
187fbfb8031SShannon Nelson  * @opcode: opcode
188fbfb8031SShannon Nelson  */
189fbfb8031SShannon Nelson struct ionic_dev_reset_cmd {
190fbfb8031SShannon Nelson 	u8 opcode;
191fbfb8031SShannon Nelson 	u8 rsvd[63];
192fbfb8031SShannon Nelson };
193fbfb8031SShannon Nelson 
194fbfb8031SShannon Nelson /**
1951b897e7dSShannon Nelson  * struct ionic_dev_reset_comp - Reset command completion
196c4e7a75aSShannon Nelson  * @status: Status of the command (enum ionic_status_code)
197fbfb8031SShannon Nelson  */
198fbfb8031SShannon Nelson struct ionic_dev_reset_comp {
199fbfb8031SShannon Nelson 	u8 status;
200fbfb8031SShannon Nelson 	u8 rsvd[15];
201fbfb8031SShannon Nelson };
202fbfb8031SShannon Nelson 
203fbfb8031SShannon Nelson #define IONIC_IDENTITY_VERSION_1	1
204f43a96d9SShannon Nelson #define IONIC_DEV_IDENTITY_VERSION_2	2
205fbfb8031SShannon Nelson 
206fbfb8031SShannon Nelson /**
2075c28f213SShannon Nelson  * struct ionic_dev_identify_cmd - Driver/device identify command
208fbfb8031SShannon Nelson  * @opcode:  opcode
209fbfb8031SShannon Nelson  * @ver:     Highest version of identify supported by driver
210fbfb8031SShannon Nelson  */
211fbfb8031SShannon Nelson struct ionic_dev_identify_cmd {
212fbfb8031SShannon Nelson 	u8 opcode;
213fbfb8031SShannon Nelson 	u8 ver;
214fbfb8031SShannon Nelson 	u8 rsvd[62];
215fbfb8031SShannon Nelson };
216fbfb8031SShannon Nelson 
217fbfb8031SShannon Nelson /**
218c4e7a75aSShannon Nelson  * struct ionic_dev_identify_comp - Driver/device identify command completion
219c4e7a75aSShannon Nelson  * @status: Status of the command (enum ionic_status_code)
220fbfb8031SShannon Nelson  * @ver:    Version of identify returned by device
221fbfb8031SShannon Nelson  */
222fbfb8031SShannon Nelson struct ionic_dev_identify_comp {
223fbfb8031SShannon Nelson 	u8 status;
224fbfb8031SShannon Nelson 	u8 ver;
225fbfb8031SShannon Nelson 	u8 rsvd[14];
226fbfb8031SShannon Nelson };
227fbfb8031SShannon Nelson 
228fbfb8031SShannon Nelson enum ionic_os_type {
229fbfb8031SShannon Nelson 	IONIC_OS_TYPE_LINUX   = 1,
230fbfb8031SShannon Nelson 	IONIC_OS_TYPE_WIN     = 2,
231fbfb8031SShannon Nelson 	IONIC_OS_TYPE_DPDK    = 3,
232fbfb8031SShannon Nelson 	IONIC_OS_TYPE_FREEBSD = 4,
233fbfb8031SShannon Nelson 	IONIC_OS_TYPE_IPXE    = 5,
234fbfb8031SShannon Nelson 	IONIC_OS_TYPE_ESXI    = 6,
235fbfb8031SShannon Nelson };
236fbfb8031SShannon Nelson 
237fbfb8031SShannon Nelson /**
238c4e7a75aSShannon Nelson  * union ionic_drv_identity - driver identity information
239c4e7a75aSShannon Nelson  * @os_type:          OS type (see enum ionic_os_type)
240fbfb8031SShannon Nelson  * @os_dist:          OS distribution, numeric format
241fbfb8031SShannon Nelson  * @os_dist_str:      OS distribution, string format
242fbfb8031SShannon Nelson  * @kernel_ver:       Kernel version, numeric format
243fbfb8031SShannon Nelson  * @kernel_ver_str:   Kernel version, string format
244fbfb8031SShannon Nelson  * @driver_ver_str:   Driver version, string format
245fbfb8031SShannon Nelson  */
246fbfb8031SShannon Nelson union ionic_drv_identity {
247fbfb8031SShannon Nelson 	struct {
248fbfb8031SShannon Nelson 		__le32 os_type;
249fbfb8031SShannon Nelson 		__le32 os_dist;
250fbfb8031SShannon Nelson 		char   os_dist_str[128];
251fbfb8031SShannon Nelson 		__le32 kernel_ver;
252fbfb8031SShannon Nelson 		char   kernel_ver_str[32];
253fbfb8031SShannon Nelson 		char   driver_ver_str[32];
254fbfb8031SShannon Nelson 	};
255c4e7a75aSShannon Nelson 	__le32 words[478];
256fbfb8031SShannon Nelson };
257fbfb8031SShannon Nelson 
258fbfb8031SShannon Nelson /**
259f43a96d9SShannon Nelson  * enum ionic_dev_capability - Device capabilities
260f43a96d9SShannon Nelson  * @IONIC_DEV_CAP_VF_CTRL:     Device supports VF ctrl operations
261f43a96d9SShannon Nelson  */
262f43a96d9SShannon Nelson enum ionic_dev_capability {
263f43a96d9SShannon Nelson 	IONIC_DEV_CAP_VF_CTRL        = BIT(0),
264f43a96d9SShannon Nelson };
265f43a96d9SShannon Nelson 
266f43a96d9SShannon Nelson /**
267c4e7a75aSShannon Nelson  * union ionic_dev_identity - device identity information
268fbfb8031SShannon Nelson  * @version:          Version of device identify
269fbfb8031SShannon Nelson  * @type:             Identify type (0 for now)
270fbfb8031SShannon Nelson  * @nports:           Number of ports provisioned
271fbfb8031SShannon Nelson  * @nlifs:            Number of LIFs provisioned
272fbfb8031SShannon Nelson  * @nintrs:           Number of interrupts provisioned
273fbfb8031SShannon Nelson  * @ndbpgs_per_lif:   Number of doorbell pages per LIF
274c4e7a75aSShannon Nelson  * @intr_coal_mult:   Interrupt coalescing multiplication factor
275fbfb8031SShannon Nelson  *                    Scale user-supplied interrupt coalescing
276fbfb8031SShannon Nelson  *                    value in usecs to device units using:
277fbfb8031SShannon Nelson  *                    device units = usecs * mult / div
278c4e7a75aSShannon Nelson  * @intr_coal_div:    Interrupt coalescing division factor
279fbfb8031SShannon Nelson  *                    Scale user-supplied interrupt coalescing
280fbfb8031SShannon Nelson  *                    value in usecs to device units using:
281fbfb8031SShannon Nelson  *                    device units = usecs * mult / div
282c4e7a75aSShannon Nelson  * @eq_count:         Number of shared event queues
2833da25843SShannon Nelson  * @hwstamp_mask:     Bitmask for subtraction of hardware tick values.
2843da25843SShannon Nelson  * @hwstamp_mult:     Hardware tick to nanosecond multiplier.
2853da25843SShannon Nelson  * @hwstamp_shift:    Hardware tick to nanosecond divisor (power of two).
286f43a96d9SShannon Nelson  * @capabilities:     Device capabilities
287fbfb8031SShannon Nelson  */
288fbfb8031SShannon Nelson union ionic_dev_identity {
289fbfb8031SShannon Nelson 	struct {
290fbfb8031SShannon Nelson 		u8     version;
291fbfb8031SShannon Nelson 		u8     type;
292fbfb8031SShannon Nelson 		u8     rsvd[2];
293fbfb8031SShannon Nelson 		u8     nports;
294fbfb8031SShannon Nelson 		u8     rsvd2[3];
295fbfb8031SShannon Nelson 		__le32 nlifs;
296fbfb8031SShannon Nelson 		__le32 nintrs;
297fbfb8031SShannon Nelson 		__le32 ndbpgs_per_lif;
298fbfb8031SShannon Nelson 		__le32 intr_coal_mult;
299fbfb8031SShannon Nelson 		__le32 intr_coal_div;
300c4e7a75aSShannon Nelson 		__le32 eq_count;
3013da25843SShannon Nelson 		__le64 hwstamp_mask;
3023da25843SShannon Nelson 		__le32 hwstamp_mult;
3033da25843SShannon Nelson 		__le32 hwstamp_shift;
304f43a96d9SShannon Nelson 		__le64 capabilities;
305fbfb8031SShannon Nelson 	};
306c4e7a75aSShannon Nelson 	__le32 words[478];
307fbfb8031SShannon Nelson };
308fbfb8031SShannon Nelson 
309fbfb8031SShannon Nelson enum ionic_lif_type {
310fbfb8031SShannon Nelson 	IONIC_LIF_TYPE_CLASSIC = 0,
311fbfb8031SShannon Nelson 	IONIC_LIF_TYPE_MACVLAN = 1,
312fbfb8031SShannon Nelson 	IONIC_LIF_TYPE_NETQUEUE = 2,
313fbfb8031SShannon Nelson };
314fbfb8031SShannon Nelson 
315fbfb8031SShannon Nelson /**
316c4e7a75aSShannon Nelson  * struct ionic_lif_identify_cmd - LIF identify command
317fbfb8031SShannon Nelson  * @opcode:  opcode
318c4e7a75aSShannon Nelson  * @type:    LIF type (enum ionic_lif_type)
319c4e7a75aSShannon Nelson  * @ver:     Version of identify returned by device
320fbfb8031SShannon Nelson  */
321fbfb8031SShannon Nelson struct ionic_lif_identify_cmd {
322fbfb8031SShannon Nelson 	u8 opcode;
323fbfb8031SShannon Nelson 	u8 type;
324fbfb8031SShannon Nelson 	u8 ver;
325fbfb8031SShannon Nelson 	u8 rsvd[61];
326fbfb8031SShannon Nelson };
327fbfb8031SShannon Nelson 
328fbfb8031SShannon Nelson /**
329c4e7a75aSShannon Nelson  * struct ionic_lif_identify_comp - LIF identify command completion
330c4e7a75aSShannon Nelson  * @status:  Status of the command (enum ionic_status_code)
331c4e7a75aSShannon Nelson  * @ver:     Version of identify returned by device
332fbfb8031SShannon Nelson  */
333fbfb8031SShannon Nelson struct ionic_lif_identify_comp {
334fbfb8031SShannon Nelson 	u8 status;
335fbfb8031SShannon Nelson 	u8 ver;
336fbfb8031SShannon Nelson 	u8 rsvd2[14];
337fbfb8031SShannon Nelson };
338fbfb8031SShannon Nelson 
339c4e7a75aSShannon Nelson /**
340c4e7a75aSShannon Nelson  * enum ionic_lif_capability - LIF capabilities
341c4e7a75aSShannon Nelson  * @IONIC_LIF_CAP_ETH:     LIF supports Ethernet
34225cc5a5fSShannon Nelson  * @IONIC_LIF_CAP_RDMA:    LIF supports RDMA
343c4e7a75aSShannon Nelson  */
344fbfb8031SShannon Nelson enum ionic_lif_capability {
345fbfb8031SShannon Nelson 	IONIC_LIF_CAP_ETH        = BIT(0),
346fbfb8031SShannon Nelson 	IONIC_LIF_CAP_RDMA       = BIT(1),
347fbfb8031SShannon Nelson };
348fbfb8031SShannon Nelson 
349fbfb8031SShannon Nelson /**
350c4e7a75aSShannon Nelson  * enum ionic_logical_qtype - Logical Queue Types
351c4e7a75aSShannon Nelson  * @IONIC_QTYPE_ADMINQ:    Administrative Queue
352c4e7a75aSShannon Nelson  * @IONIC_QTYPE_NOTIFYQ:   Notify Queue
353c4e7a75aSShannon Nelson  * @IONIC_QTYPE_RXQ:       Receive Queue
354c4e7a75aSShannon Nelson  * @IONIC_QTYPE_TXQ:       Transmit Queue
355c4e7a75aSShannon Nelson  * @IONIC_QTYPE_EQ:        Event Queue
356c4e7a75aSShannon Nelson  * @IONIC_QTYPE_MAX:       Max queue type supported
357fbfb8031SShannon Nelson  */
358fbfb8031SShannon Nelson enum ionic_logical_qtype {
359fbfb8031SShannon Nelson 	IONIC_QTYPE_ADMINQ  = 0,
360fbfb8031SShannon Nelson 	IONIC_QTYPE_NOTIFYQ = 1,
361fbfb8031SShannon Nelson 	IONIC_QTYPE_RXQ     = 2,
362fbfb8031SShannon Nelson 	IONIC_QTYPE_TXQ     = 3,
363fbfb8031SShannon Nelson 	IONIC_QTYPE_EQ      = 4,
364fbfb8031SShannon Nelson 	IONIC_QTYPE_MAX     = 16,
365fbfb8031SShannon Nelson };
366fbfb8031SShannon Nelson 
367fbfb8031SShannon Nelson /**
36857a3a98dSShannon Nelson  * enum ionic_q_feature - Common Features for most queue types
36957a3a98dSShannon Nelson  *
37057a3a98dSShannon Nelson  * Common features use bits 0-15. Per-queue-type features use higher bits.
37157a3a98dSShannon Nelson  *
37257a3a98dSShannon Nelson  * @IONIC_QIDENT_F_CQ:      Queue has completion ring
37357a3a98dSShannon Nelson  * @IONIC_QIDENT_F_SG:      Queue has scatter/gather ring
37457a3a98dSShannon Nelson  * @IONIC_QIDENT_F_EQ:      Queue can use event queue
37557a3a98dSShannon Nelson  * @IONIC_QIDENT_F_CMB:     Queue is in cmb bar
3760ec9f666SShannon Nelson  * @IONIC_Q_F_2X_DESC:      Double main descriptor size
3770ec9f666SShannon Nelson  * @IONIC_Q_F_2X_CQ_DESC:   Double cq descriptor size
3780ec9f666SShannon Nelson  * @IONIC_Q_F_2X_SG_DESC:   Double sg descriptor size
3790ec9f666SShannon Nelson  * @IONIC_Q_F_4X_DESC:      Quadruple main descriptor size
3800ec9f666SShannon Nelson  * @IONIC_Q_F_4X_CQ_DESC:   Quadruple cq descriptor size
3810ec9f666SShannon Nelson  * @IONIC_Q_F_4X_SG_DESC:   Quadruple sg descriptor size
38257a3a98dSShannon Nelson  */
38357a3a98dSShannon Nelson enum ionic_q_feature {
38457a3a98dSShannon Nelson 	IONIC_QIDENT_F_CQ		= BIT_ULL(0),
38557a3a98dSShannon Nelson 	IONIC_QIDENT_F_SG		= BIT_ULL(1),
38657a3a98dSShannon Nelson 	IONIC_QIDENT_F_EQ		= BIT_ULL(2),
38757a3a98dSShannon Nelson 	IONIC_QIDENT_F_CMB		= BIT_ULL(3),
3880ec9f666SShannon Nelson 	IONIC_Q_F_2X_DESC		= BIT_ULL(4),
3890ec9f666SShannon Nelson 	IONIC_Q_F_2X_CQ_DESC		= BIT_ULL(5),
3900ec9f666SShannon Nelson 	IONIC_Q_F_2X_SG_DESC		= BIT_ULL(6),
3910ec9f666SShannon Nelson 	IONIC_Q_F_4X_DESC		= BIT_ULL(7),
3920ec9f666SShannon Nelson 	IONIC_Q_F_4X_CQ_DESC		= BIT_ULL(8),
3930ec9f666SShannon Nelson 	IONIC_Q_F_4X_SG_DESC		= BIT_ULL(9),
39457a3a98dSShannon Nelson };
39557a3a98dSShannon Nelson 
39657a3a98dSShannon Nelson /**
3973da25843SShannon Nelson  * enum ionic_rxq_feature - RXQ-specific Features
3983da25843SShannon Nelson  *
3993da25843SShannon Nelson  * Per-queue-type features use bits 16 and higher.
4003da25843SShannon Nelson  *
4013da25843SShannon Nelson  * @IONIC_RXQ_F_HWSTAMP:   Queue supports Hardware Timestamping
4023da25843SShannon Nelson  */
4033da25843SShannon Nelson enum ionic_rxq_feature {
4043da25843SShannon Nelson 	IONIC_RXQ_F_HWSTAMP		= BIT_ULL(16),
4053da25843SShannon Nelson };
4063da25843SShannon Nelson 
4073da25843SShannon Nelson /**
4083da25843SShannon Nelson  * enum ionic_txq_feature - TXQ-specific Features
4093da25843SShannon Nelson  *
4103da25843SShannon Nelson  * Per-queue-type features use bits 16 and higher.
4113da25843SShannon Nelson  *
4123da25843SShannon Nelson  * @IONIC_TXQ_F_HWSTAMP:   Queue supports Hardware Timestamping
4133da25843SShannon Nelson  */
4143da25843SShannon Nelson enum ionic_txq_feature {
4153da25843SShannon Nelson 	IONIC_TXQ_F_HWSTAMP		= BIT(16),
4163da25843SShannon Nelson };
4173da25843SShannon Nelson 
4183da25843SShannon Nelson /**
4193da25843SShannon Nelson  * struct ionic_hwstamp_bits - Hardware timestamp decoding bits
4203da25843SShannon Nelson  * @IONIC_HWSTAMP_INVALID:          Invalid hardware timestamp value
4213da25843SShannon Nelson  * @IONIC_HWSTAMP_CQ_NEGOFFSET:     Timestamp field negative offset
4223da25843SShannon Nelson  *                                  from the base cq descriptor.
4233da25843SShannon Nelson  */
4243da25843SShannon Nelson enum ionic_hwstamp_bits {
4253da25843SShannon Nelson 	IONIC_HWSTAMP_INVALID	    = ~0ull,
4263da25843SShannon Nelson 	IONIC_HWSTAMP_CQ_NEGOFFSET  = 8,
4273da25843SShannon Nelson };
4283da25843SShannon Nelson 
4293da25843SShannon Nelson /**
430c4e7a75aSShannon Nelson  * struct ionic_lif_logical_qtype - Descriptor of logical to HW queue type
431c4e7a75aSShannon Nelson  * @qtype:          Hardware Queue Type
432c4e7a75aSShannon Nelson  * @qid_count:      Number of Queue IDs of the logical type
433c4e7a75aSShannon Nelson  * @qid_base:       Minimum Queue ID of the logical type
434fbfb8031SShannon Nelson  */
435fbfb8031SShannon Nelson struct ionic_lif_logical_qtype {
436fbfb8031SShannon Nelson 	u8     qtype;
437fbfb8031SShannon Nelson 	u8     rsvd[3];
438fbfb8031SShannon Nelson 	__le32 qid_count;
439fbfb8031SShannon Nelson 	__le32 qid_base;
440fbfb8031SShannon Nelson };
441fbfb8031SShannon Nelson 
442c4e7a75aSShannon Nelson /**
443c4e7a75aSShannon Nelson  * enum ionic_lif_state - LIF state
444c4e7a75aSShannon Nelson  * @IONIC_LIF_DISABLE:     LIF disabled
445c4e7a75aSShannon Nelson  * @IONIC_LIF_ENABLE:      LIF enabled
4461b897e7dSShannon Nelson  * @IONIC_LIF_QUIESCE:     LIF Quiesced
447c4e7a75aSShannon Nelson  */
448fbfb8031SShannon Nelson enum ionic_lif_state {
4491b897e7dSShannon Nelson 	IONIC_LIF_QUIESCE	= 0,
450fbfb8031SShannon Nelson 	IONIC_LIF_ENABLE	= 1,
4511b897e7dSShannon Nelson 	IONIC_LIF_DISABLE	= 2,
452fbfb8031SShannon Nelson };
453fbfb8031SShannon Nelson 
454fbfb8031SShannon Nelson /**
455c4e7a75aSShannon Nelson  * union ionic_lif_config - LIF configuration
456c4e7a75aSShannon Nelson  * @state:          LIF state (enum ionic_lif_state)
457c4e7a75aSShannon Nelson  * @name:           LIF name
458c4e7a75aSShannon Nelson  * @mtu:            MTU
459c4e7a75aSShannon Nelson  * @mac:            Station MAC address
4601b897e7dSShannon Nelson  * @vlan:           Default Vlan ID
461c4e7a75aSShannon Nelson  * @features:       Features (enum ionic_eth_hw_features)
462c4e7a75aSShannon Nelson  * @queue_count:    Queue counts per queue-type
463fbfb8031SShannon Nelson  */
464fbfb8031SShannon Nelson union ionic_lif_config {
465fbfb8031SShannon Nelson 	struct {
466fbfb8031SShannon Nelson 		u8     state;
467fbfb8031SShannon Nelson 		u8     rsvd[3];
468fbfb8031SShannon Nelson 		char   name[IONIC_IFNAMSIZ];
469fbfb8031SShannon Nelson 		__le32 mtu;
470fbfb8031SShannon Nelson 		u8     mac[6];
4711b897e7dSShannon Nelson 		__le16 vlan;
472fbfb8031SShannon Nelson 		__le64 features;
473fbfb8031SShannon Nelson 		__le32 queue_count[IONIC_QTYPE_MAX];
4745dca69c4SShannon Nelson 	} __packed;
475fbfb8031SShannon Nelson 	__le32 words[64];
476fbfb8031SShannon Nelson };
477fbfb8031SShannon Nelson 
478fbfb8031SShannon Nelson /**
479c4e7a75aSShannon Nelson  * struct ionic_lif_identity - LIF identity information (type-specific)
480fbfb8031SShannon Nelson  *
481c4e7a75aSShannon Nelson  * @capabilities:        LIF capabilities
482fbfb8031SShannon Nelson  *
483c4e7a75aSShannon Nelson  * @eth:                    Ethernet identify structure
484c4e7a75aSShannon Nelson  *     @version:            Ethernet identify structure version
485c4e7a75aSShannon Nelson  *     @max_ucast_filters:  Number of perfect unicast addresses supported
486c4e7a75aSShannon Nelson  *     @max_mcast_filters:  Number of perfect multicast addresses supported
487fbfb8031SShannon Nelson  *     @min_frame_size:     Minimum size of frames to be sent
48825cc5a5fSShannon Nelson  *     @max_frame_size:     Maximum size of frames to be sent
4893da25843SShannon Nelson  *     @hwstamp_tx_modes:   Bitmask of BIT_ULL(enum ionic_txstamp_mode)
4903da25843SShannon Nelson  *     @hwstamp_rx_filters: Bitmask of enum ionic_pkt_class
491fbfb8031SShannon Nelson  *     @config:             LIF config struct with features, mtu, mac, q counts
492fbfb8031SShannon Nelson  *
493c4e7a75aSShannon Nelson  * @rdma:                RDMA identify structure
494c4e7a75aSShannon Nelson  *     @version:         RDMA version of opcodes and queue descriptors
495c4e7a75aSShannon Nelson  *     @qp_opcodes:      Number of RDMA queue pair opcodes supported
496c4e7a75aSShannon Nelson  *     @admin_opcodes:   Number of RDMA admin opcodes supported
497c4e7a75aSShannon Nelson  *     @npts_per_lif:    Page table size per LIF
498c4e7a75aSShannon Nelson  *     @nmrs_per_lif:    Number of memory regions per LIF
499c4e7a75aSShannon Nelson  *     @nahs_per_lif:    Number of address handles per LIF
500c4e7a75aSShannon Nelson  *     @max_stride:      Max work request stride
501c4e7a75aSShannon Nelson  *     @cl_stride:       Cache line stride
502c4e7a75aSShannon Nelson  *     @pte_stride:      Page table entry stride
503c4e7a75aSShannon Nelson  *     @rrq_stride:      Remote RQ work request stride
504c4e7a75aSShannon Nelson  *     @rsq_stride:      Remote SQ work request stride
505fbfb8031SShannon Nelson  *     @dcqcn_profiles:  Number of DCQCN profiles
506c4e7a75aSShannon Nelson  *     @aq_qtype:        RDMA Admin Qtype
507c4e7a75aSShannon Nelson  *     @sq_qtype:        RDMA Send Qtype
508c4e7a75aSShannon Nelson  *     @rq_qtype:        RDMA Receive Qtype
509c4e7a75aSShannon Nelson  *     @cq_qtype:        RDMA Completion Qtype
510c4e7a75aSShannon Nelson  *     @eq_qtype:        RDMA Event Qtype
511fbfb8031SShannon Nelson  */
512fbfb8031SShannon Nelson union ionic_lif_identity {
513fbfb8031SShannon Nelson 	struct {
514fbfb8031SShannon Nelson 		__le64 capabilities;
515fbfb8031SShannon Nelson 
516fbfb8031SShannon Nelson 		struct {
517fbfb8031SShannon Nelson 			u8 version;
518fbfb8031SShannon Nelson 			u8 rsvd[3];
519fbfb8031SShannon Nelson 			__le32 max_ucast_filters;
520fbfb8031SShannon Nelson 			__le32 max_mcast_filters;
521fbfb8031SShannon Nelson 			__le16 rss_ind_tbl_sz;
522fbfb8031SShannon Nelson 			__le32 min_frame_size;
523fbfb8031SShannon Nelson 			__le32 max_frame_size;
5243da25843SShannon Nelson 			u8 rsvd2[2];
5253da25843SShannon Nelson 			__le64 hwstamp_tx_modes;
5263da25843SShannon Nelson 			__le64 hwstamp_rx_filters;
5273da25843SShannon Nelson 			u8 rsvd3[88];
528fbfb8031SShannon Nelson 			union ionic_lif_config config;
5295dca69c4SShannon Nelson 		} __packed eth;
530fbfb8031SShannon Nelson 
531fbfb8031SShannon Nelson 		struct {
532fbfb8031SShannon Nelson 			u8 version;
533fbfb8031SShannon Nelson 			u8 qp_opcodes;
534fbfb8031SShannon Nelson 			u8 admin_opcodes;
535fbfb8031SShannon Nelson 			u8 rsvd;
536fbfb8031SShannon Nelson 			__le32 npts_per_lif;
537fbfb8031SShannon Nelson 			__le32 nmrs_per_lif;
538fbfb8031SShannon Nelson 			__le32 nahs_per_lif;
539fbfb8031SShannon Nelson 			u8 max_stride;
540fbfb8031SShannon Nelson 			u8 cl_stride;
541fbfb8031SShannon Nelson 			u8 pte_stride;
542fbfb8031SShannon Nelson 			u8 rrq_stride;
543fbfb8031SShannon Nelson 			u8 rsq_stride;
544fbfb8031SShannon Nelson 			u8 dcqcn_profiles;
545fbfb8031SShannon Nelson 			u8 rsvd_dimensions[10];
546fbfb8031SShannon Nelson 			struct ionic_lif_logical_qtype aq_qtype;
547fbfb8031SShannon Nelson 			struct ionic_lif_logical_qtype sq_qtype;
548fbfb8031SShannon Nelson 			struct ionic_lif_logical_qtype rq_qtype;
549fbfb8031SShannon Nelson 			struct ionic_lif_logical_qtype cq_qtype;
550fbfb8031SShannon Nelson 			struct ionic_lif_logical_qtype eq_qtype;
5515dca69c4SShannon Nelson 		} __packed rdma;
5525dca69c4SShannon Nelson 	} __packed;
553c4e7a75aSShannon Nelson 	__le32 words[478];
554fbfb8031SShannon Nelson };
555fbfb8031SShannon Nelson 
556fbfb8031SShannon Nelson /**
5575c28f213SShannon Nelson  * struct ionic_lif_init_cmd - LIF init command
558c4e7a75aSShannon Nelson  * @opcode:       Opcode
559c4e7a75aSShannon Nelson  * @type:         LIF type (enum ionic_lif_type)
560fbfb8031SShannon Nelson  * @index:        LIF index
561c4e7a75aSShannon Nelson  * @info_pa:      Destination address for LIF info (struct ionic_lif_info)
562fbfb8031SShannon Nelson  */
563fbfb8031SShannon Nelson struct ionic_lif_init_cmd {
564fbfb8031SShannon Nelson 	u8     opcode;
565fbfb8031SShannon Nelson 	u8     type;
566fbfb8031SShannon Nelson 	__le16 index;
567fbfb8031SShannon Nelson 	__le32 rsvd;
568fbfb8031SShannon Nelson 	__le64 info_pa;
569fbfb8031SShannon Nelson 	u8     rsvd2[48];
570fbfb8031SShannon Nelson };
571fbfb8031SShannon Nelson 
572fbfb8031SShannon Nelson /**
5735c28f213SShannon Nelson  * struct ionic_lif_init_comp - LIF init command completion
574c4e7a75aSShannon Nelson  * @status:	Status of the command (enum ionic_status_code)
575c4e7a75aSShannon Nelson  * @hw_index:	Hardware index of the initialized LIF
576fbfb8031SShannon Nelson  */
577fbfb8031SShannon Nelson struct ionic_lif_init_comp {
578fbfb8031SShannon Nelson 	u8 status;
579fbfb8031SShannon Nelson 	u8 rsvd;
580fbfb8031SShannon Nelson 	__le16 hw_index;
581fbfb8031SShannon Nelson 	u8 rsvd2[12];
582fbfb8031SShannon Nelson };
583fbfb8031SShannon Nelson 
584fbfb8031SShannon Nelson /**
5855b3f3f2aSShannon Nelson  * struct ionic_q_identify_cmd - queue identify command
5865b3f3f2aSShannon Nelson  * @opcode:     opcode
5875b3f3f2aSShannon Nelson  * @lif_type:   LIF type (enum ionic_lif_type)
5885b3f3f2aSShannon Nelson  * @type:       Logical queue type (enum ionic_logical_qtype)
5895b3f3f2aSShannon Nelson  * @ver:        Highest queue type version that the driver supports
5905b3f3f2aSShannon Nelson  */
5915b3f3f2aSShannon Nelson struct ionic_q_identify_cmd {
5925b3f3f2aSShannon Nelson 	u8     opcode;
5935b3f3f2aSShannon Nelson 	u8     rsvd;
5945b3f3f2aSShannon Nelson 	__le16 lif_type;
5955b3f3f2aSShannon Nelson 	u8     type;
5965b3f3f2aSShannon Nelson 	u8     ver;
5975b3f3f2aSShannon Nelson 	u8     rsvd2[58];
5985b3f3f2aSShannon Nelson };
5995b3f3f2aSShannon Nelson 
6005b3f3f2aSShannon Nelson /**
6015b3f3f2aSShannon Nelson  * struct ionic_q_identify_comp - queue identify command completion
6025b3f3f2aSShannon Nelson  * @status:     Status of the command (enum ionic_status_code)
6035b3f3f2aSShannon Nelson  * @comp_index: Index in the descriptor ring for which this is the completion
6045b3f3f2aSShannon Nelson  * @ver:        Queue type version that can be used with FW
6055b3f3f2aSShannon Nelson  */
6065b3f3f2aSShannon Nelson struct ionic_q_identify_comp {
6075b3f3f2aSShannon Nelson 	u8     status;
6085b3f3f2aSShannon Nelson 	u8     rsvd;
6095b3f3f2aSShannon Nelson 	__le16 comp_index;
6105b3f3f2aSShannon Nelson 	u8     ver;
6115b3f3f2aSShannon Nelson 	u8     rsvd2[11];
6125b3f3f2aSShannon Nelson };
6135b3f3f2aSShannon Nelson 
6145b3f3f2aSShannon Nelson /**
6155b3f3f2aSShannon Nelson  * union ionic_q_identity - queue identity information
6165b3f3f2aSShannon Nelson  *     @version:        Queue type version that can be used with FW
6175b3f3f2aSShannon Nelson  *     @supported:      Bitfield of queue versions, first bit = ver 0
61857a3a98dSShannon Nelson  *     @features:       Queue features (enum ionic_q_feature, etc)
6195b3f3f2aSShannon Nelson  *     @desc_sz:        Descriptor size
6205b3f3f2aSShannon Nelson  *     @comp_sz:        Completion descriptor size
6215b3f3f2aSShannon Nelson  *     @sg_desc_sz:     Scatter/Gather descriptor size
6225b3f3f2aSShannon Nelson  *     @max_sg_elems:   Maximum number of Scatter/Gather elements
6235b3f3f2aSShannon Nelson  *     @sg_desc_stride: Number of Scatter/Gather elements per descriptor
6245b3f3f2aSShannon Nelson  */
6255b3f3f2aSShannon Nelson union ionic_q_identity {
6265b3f3f2aSShannon Nelson 	struct {
6275b3f3f2aSShannon Nelson 		u8      version;
6285b3f3f2aSShannon Nelson 		u8      supported;
6295b3f3f2aSShannon Nelson 		u8      rsvd[6];
6305b3f3f2aSShannon Nelson 		__le64  features;
6315b3f3f2aSShannon Nelson 		__le16  desc_sz;
6325b3f3f2aSShannon Nelson 		__le16  comp_sz;
6335b3f3f2aSShannon Nelson 		__le16  sg_desc_sz;
6345b3f3f2aSShannon Nelson 		__le16  max_sg_elems;
6355b3f3f2aSShannon Nelson 		__le16  sg_desc_stride;
6365b3f3f2aSShannon Nelson 	};
6375b3f3f2aSShannon Nelson 	__le32 words[478];
6385b3f3f2aSShannon Nelson };
6395b3f3f2aSShannon Nelson 
6405b3f3f2aSShannon Nelson /**
6415c28f213SShannon Nelson  * struct ionic_q_init_cmd - Queue init command
642fbfb8031SShannon Nelson  * @opcode:       opcode
643fbfb8031SShannon Nelson  * @type:         Logical queue type
644c4e7a75aSShannon Nelson  * @ver:          Queue type version
645fbfb8031SShannon Nelson  * @lif_index:    LIF index
646c4e7a75aSShannon Nelson  * @index:        (LIF, qtype) relative admin queue index
647c4e7a75aSShannon Nelson  * @intr_index:   Interrupt control register index, or Event queue index
648fbfb8031SShannon Nelson  * @pid:          Process ID
649fbfb8031SShannon Nelson  * @flags:
650fbfb8031SShannon Nelson  *    IRQ:        Interrupt requested on completion
651fbfb8031SShannon Nelson  *    ENA:        Enable the queue.  If ENA=0 the queue is initialized
652fbfb8031SShannon Nelson  *                but remains disabled, to be later enabled with the
653fbfb8031SShannon Nelson  *                Queue Enable command.  If ENA=1, then queue is
654fbfb8031SShannon Nelson  *                initialized and then enabled.
655fbfb8031SShannon Nelson  *    SG:         Enable Scatter-Gather on the queue.
656fbfb8031SShannon Nelson  *                in number of descs.  The actual ring size is
657fbfb8031SShannon Nelson  *                (1 << ring_size).  For example, to
658fbfb8031SShannon Nelson  *                select a ring size of 64 descriptors write
659fbfb8031SShannon Nelson  *                ring_size = 6.  The minimum ring_size value is 2
660fbfb8031SShannon Nelson  *                for a ring size of 4 descriptors.  The maximum
661fbfb8031SShannon Nelson  *                ring_size value is 16 for a ring size of 64k
662fbfb8031SShannon Nelson  *                descriptors.  Values of ring_size <2 and >16 are
663fbfb8031SShannon Nelson  *                reserved.
664fbfb8031SShannon Nelson  *    EQ:         Enable the Event Queue
665c4e7a75aSShannon Nelson  * @cos:          Class of service for this queue
666fbfb8031SShannon Nelson  * @ring_size:    Queue ring size, encoded as a log2(size)
667fbfb8031SShannon Nelson  * @ring_base:    Queue ring base address
668fbfb8031SShannon Nelson  * @cq_ring_base: Completion queue ring base address
669fbfb8031SShannon Nelson  * @sg_ring_base: Scatter/Gather ring base address
67057a3a98dSShannon Nelson  * @features:     Mask of queue features to enable, if not in the flags above.
671fbfb8031SShannon Nelson  */
672fbfb8031SShannon Nelson struct ionic_q_init_cmd {
673fbfb8031SShannon Nelson 	u8     opcode;
674fbfb8031SShannon Nelson 	u8     rsvd;
675fbfb8031SShannon Nelson 	__le16 lif_index;
676fbfb8031SShannon Nelson 	u8     type;
677fbfb8031SShannon Nelson 	u8     ver;
678fbfb8031SShannon Nelson 	u8     rsvd1[2];
679fbfb8031SShannon Nelson 	__le32 index;
680fbfb8031SShannon Nelson 	__le16 pid;
681fbfb8031SShannon Nelson 	__le16 intr_index;
682fbfb8031SShannon Nelson 	__le16 flags;
683fbfb8031SShannon Nelson #define IONIC_QINIT_F_IRQ	0x01	/* Request interrupt on completion */
684fbfb8031SShannon Nelson #define IONIC_QINIT_F_ENA	0x02	/* Enable the queue */
685fbfb8031SShannon Nelson #define IONIC_QINIT_F_SG	0x04	/* Enable scatter/gather on the queue */
686fbfb8031SShannon Nelson #define IONIC_QINIT_F_EQ	0x08	/* Enable event queue */
687c4e7a75aSShannon Nelson #define IONIC_QINIT_F_CMB	0x10	/* Enable cmb-based queue */
688fbfb8031SShannon Nelson #define IONIC_QINIT_F_DEBUG	0x80	/* Enable queue debugging */
689fbfb8031SShannon Nelson 	u8     cos;
690fbfb8031SShannon Nelson 	u8     ring_size;
691fbfb8031SShannon Nelson 	__le64 ring_base;
692fbfb8031SShannon Nelson 	__le64 cq_ring_base;
693fbfb8031SShannon Nelson 	__le64 sg_ring_base;
69457a3a98dSShannon Nelson 	u8     rsvd2[12];
69557a3a98dSShannon Nelson 	__le64 features;
6965dca69c4SShannon Nelson } __packed;
697fbfb8031SShannon Nelson 
698fbfb8031SShannon Nelson /**
6995c28f213SShannon Nelson  * struct ionic_q_init_comp - Queue init command completion
700c4e7a75aSShannon Nelson  * @status:     Status of the command (enum ionic_status_code)
701c4e7a75aSShannon Nelson  * @comp_index: Index in the descriptor ring for which this is the completion
702fbfb8031SShannon Nelson  * @hw_index:   Hardware Queue ID
703fbfb8031SShannon Nelson  * @hw_type:    Hardware Queue type
704fbfb8031SShannon Nelson  * @color:      Color
705fbfb8031SShannon Nelson  */
706fbfb8031SShannon Nelson struct ionic_q_init_comp {
707fbfb8031SShannon Nelson 	u8     status;
708c4e7a75aSShannon Nelson 	u8     rsvd;
709fbfb8031SShannon Nelson 	__le16 comp_index;
710fbfb8031SShannon Nelson 	__le32 hw_index;
711fbfb8031SShannon Nelson 	u8     hw_type;
712fbfb8031SShannon Nelson 	u8     rsvd2[6];
713fbfb8031SShannon Nelson 	u8     color;
714fbfb8031SShannon Nelson };
715fbfb8031SShannon Nelson 
716fbfb8031SShannon Nelson /* the device's internal addressing uses up to 52 bits */
717fbfb8031SShannon Nelson #define IONIC_ADDR_LEN		52
718fbfb8031SShannon Nelson #define IONIC_ADDR_MASK		(BIT_ULL(IONIC_ADDR_LEN) - 1)
719fbfb8031SShannon Nelson 
720fbfb8031SShannon Nelson enum ionic_txq_desc_opcode {
721fbfb8031SShannon Nelson 	IONIC_TXQ_DESC_OPCODE_CSUM_NONE = 0,
722fbfb8031SShannon Nelson 	IONIC_TXQ_DESC_OPCODE_CSUM_PARTIAL = 1,
723fbfb8031SShannon Nelson 	IONIC_TXQ_DESC_OPCODE_CSUM_HW = 2,
724fbfb8031SShannon Nelson 	IONIC_TXQ_DESC_OPCODE_TSO = 3,
725fbfb8031SShannon Nelson };
726fbfb8031SShannon Nelson 
727fbfb8031SShannon Nelson /**
7285c28f213SShannon Nelson  * struct ionic_txq_desc - Ethernet Tx queue descriptor format
729c4e7a75aSShannon Nelson  * @cmd:          Tx operation, see IONIC_TXQ_DESC_OPCODE_*:
730fbfb8031SShannon Nelson  *
731fbfb8031SShannon Nelson  *                   IONIC_TXQ_DESC_OPCODE_CSUM_NONE:
732fbfb8031SShannon Nelson  *                      Non-offload send.  No segmentation,
733fbfb8031SShannon Nelson  *                      fragmentation or checksum calc/insertion is
734fbfb8031SShannon Nelson  *                      performed by device; packet is prepared
735fbfb8031SShannon Nelson  *                      to send by software stack and requires
736fbfb8031SShannon Nelson  *                      no further manipulation from device.
737fbfb8031SShannon Nelson  *
738fbfb8031SShannon Nelson  *                   IONIC_TXQ_DESC_OPCODE_CSUM_PARTIAL:
739fbfb8031SShannon Nelson  *                      Offload 16-bit L4 checksum
740fbfb8031SShannon Nelson  *                      calculation/insertion.  The device will
741fbfb8031SShannon Nelson  *                      calculate the L4 checksum value and
742fbfb8031SShannon Nelson  *                      insert the result in the packet's L4
743fbfb8031SShannon Nelson  *                      header checksum field.  The L4 checksum
744fbfb8031SShannon Nelson  *                      is calculated starting at @csum_start bytes
745fbfb8031SShannon Nelson  *                      into the packet to the end of the packet.
746fbfb8031SShannon Nelson  *                      The checksum insertion position is given
747c4e7a75aSShannon Nelson  *                      in @csum_offset, which is the offset from
748c4e7a75aSShannon Nelson  *                      @csum_start to the checksum field in the L4
749c4e7a75aSShannon Nelson  *                      header.  This feature is only applicable to
750c4e7a75aSShannon Nelson  *                      protocols such as TCP, UDP and ICMP where a
751c4e7a75aSShannon Nelson  *                      standard (i.e. the 'IP-style' checksum)
752c4e7a75aSShannon Nelson  *                      one's complement 16-bit checksum is used,
753c4e7a75aSShannon Nelson  *                      using an IP pseudo-header to seed the
754c4e7a75aSShannon Nelson  *                      calculation.  Software will preload the L4
755c4e7a75aSShannon Nelson  *                      checksum field with the IP pseudo-header
756c4e7a75aSShannon Nelson  *                      checksum.
757fbfb8031SShannon Nelson  *
758fbfb8031SShannon Nelson  *                      For tunnel encapsulation, @csum_start and
759fbfb8031SShannon Nelson  *                      @csum_offset refer to the inner L4
760fbfb8031SShannon Nelson  *                      header.  Supported tunnels encapsulations
761fbfb8031SShannon Nelson  *                      are: IPIP, GRE, and UDP.  If the @encap
762fbfb8031SShannon Nelson  *                      is clear, no further processing by the
763fbfb8031SShannon Nelson  *                      device is required; software will
764fbfb8031SShannon Nelson  *                      calculate the outer header checksums.  If
765fbfb8031SShannon Nelson  *                      the @encap is set, the device will
766fbfb8031SShannon Nelson  *                      offload the outer header checksums using
767fbfb8031SShannon Nelson  *                      LCO (local checksum offload) (see
7680ac624f4SMauro Carvalho Chehab  *                      Documentation/networking/checksum-offloads.rst
7690ac624f4SMauro Carvalho Chehab  *                      for more info).
770fbfb8031SShannon Nelson  *
771fbfb8031SShannon Nelson  *                   IONIC_TXQ_DESC_OPCODE_CSUM_HW:
772fbfb8031SShannon Nelson  *                      Offload 16-bit checksum computation to hardware.
773fbfb8031SShannon Nelson  *                      If @csum_l3 is set then the packet's L3 checksum is
774ecea8bb4SShannon Nelson  *                      updated. Similarly, if @csum_l4 is set the L4
775fbfb8031SShannon Nelson  *                      checksum is updated. If @encap is set then encap header
776fbfb8031SShannon Nelson  *                      checksums are also updated.
777fbfb8031SShannon Nelson  *
778fbfb8031SShannon Nelson  *                   IONIC_TXQ_DESC_OPCODE_TSO:
77925cc5a5fSShannon Nelson  *                      Device performs TCP segmentation offload
780fbfb8031SShannon Nelson  *                      (TSO).  @hdr_len is the number of bytes
781fbfb8031SShannon Nelson  *                      to the end of TCP header (the offset to
782fbfb8031SShannon Nelson  *                      the TCP payload).  @mss is the desired
783fbfb8031SShannon Nelson  *                      MSS, the TCP payload length for each
784fbfb8031SShannon Nelson  *                      segment.  The device will calculate/
785fbfb8031SShannon Nelson  *                      insert IP (IPv4 only) and TCP checksums
786fbfb8031SShannon Nelson  *                      for each segment.  In the first data
787fbfb8031SShannon Nelson  *                      buffer containing the header template,
788fbfb8031SShannon Nelson  *                      the driver will set IPv4 checksum to 0
789fbfb8031SShannon Nelson  *                      and preload TCP checksum with the IP
790fbfb8031SShannon Nelson  *                      pseudo header calculated with IP length = 0.
791fbfb8031SShannon Nelson  *
792fbfb8031SShannon Nelson  *                      Supported tunnel encapsulations are IPIP,
793fbfb8031SShannon Nelson  *                      layer-3 GRE, and UDP. @hdr_len includes
794fbfb8031SShannon Nelson  *                      both outer and inner headers.  The driver
795fbfb8031SShannon Nelson  *                      will set IPv4 checksum to zero and
796fbfb8031SShannon Nelson  *                      preload TCP checksum with IP pseudo
797fbfb8031SShannon Nelson  *                      header on the inner header.
798fbfb8031SShannon Nelson  *
799fbfb8031SShannon Nelson  *                      TCP ECN offload is supported.  The device
800fbfb8031SShannon Nelson  *                      will set CWR flag in the first segment if
801fbfb8031SShannon Nelson  *                      CWR is set in the template header, and
802fbfb8031SShannon Nelson  *                      clear CWR in remaining segments.
803fbfb8031SShannon Nelson  * @flags:
804fbfb8031SShannon Nelson  *                vlan:
805c4e7a75aSShannon Nelson  *                    Insert an L2 VLAN header using @vlan_tci
806fbfb8031SShannon Nelson  *                encap:
807c4e7a75aSShannon Nelson  *                    Calculate encap header checksum
808fbfb8031SShannon Nelson  *                csum_l3:
809c4e7a75aSShannon Nelson  *                    Compute L3 header checksum
810fbfb8031SShannon Nelson  *                csum_l4:
811c4e7a75aSShannon Nelson  *                    Compute L4 header checksum
812fbfb8031SShannon Nelson  *                tso_sot:
813fbfb8031SShannon Nelson  *                    TSO start
814fbfb8031SShannon Nelson  *                tso_eot:
815fbfb8031SShannon Nelson  *                    TSO end
816fbfb8031SShannon Nelson  * @num_sg_elems: Number of scatter-gather elements in SG
817fbfb8031SShannon Nelson  *                descriptor
818c4e7a75aSShannon Nelson  * @addr:         First data buffer's DMA address
819c4e7a75aSShannon Nelson  *                (Subsequent data buffers are on txq_sg_desc)
820fbfb8031SShannon Nelson  * @len:          First data buffer's length, in bytes
821fbfb8031SShannon Nelson  * @vlan_tci:     VLAN tag to insert in the packet (if requested
822fbfb8031SShannon Nelson  *                by @V-bit).  Includes .1p and .1q tags
823fbfb8031SShannon Nelson  * @hdr_len:      Length of packet headers, including
824c4e7a75aSShannon Nelson  *                encapsulating outer header, if applicable
825c4e7a75aSShannon Nelson  *                Valid for opcodes IONIC_TXQ_DESC_OPCODE_CALC_CSUM and
826c4e7a75aSShannon Nelson  *                IONIC_TXQ_DESC_OPCODE_TSO.  Should be set to zero for
827fbfb8031SShannon Nelson  *                all other modes.  For
828c4e7a75aSShannon Nelson  *                IONIC_TXQ_DESC_OPCODE_CALC_CSUM, @hdr_len is length
829fbfb8031SShannon Nelson  *                of headers up to inner-most L4 header.  For
830c4e7a75aSShannon Nelson  *                IONIC_TXQ_DESC_OPCODE_TSO, @hdr_len is up to
831fbfb8031SShannon Nelson  *                inner-most L4 payload, so inclusive of
832fbfb8031SShannon Nelson  *                inner-most L4 header.
833c4e7a75aSShannon Nelson  * @mss:          Desired MSS value for TSO; only applicable for
834c4e7a75aSShannon Nelson  *                IONIC_TXQ_DESC_OPCODE_TSO
835c4e7a75aSShannon Nelson  * @csum_start:   Offset from packet to first byte checked in L4 checksum
836c4e7a75aSShannon Nelson  * @csum_offset:  Offset from csum_start to L4 checksum field
837fbfb8031SShannon Nelson  */
838c4e7a75aSShannon Nelson struct ionic_txq_desc {
839c4e7a75aSShannon Nelson 	__le64  cmd;
840fbfb8031SShannon Nelson #define IONIC_TXQ_DESC_OPCODE_MASK		0xf
841fbfb8031SShannon Nelson #define IONIC_TXQ_DESC_OPCODE_SHIFT		4
842fbfb8031SShannon Nelson #define IONIC_TXQ_DESC_FLAGS_MASK		0xf
843fbfb8031SShannon Nelson #define IONIC_TXQ_DESC_FLAGS_SHIFT		0
844fbfb8031SShannon Nelson #define IONIC_TXQ_DESC_NSGE_MASK		0xf
845fbfb8031SShannon Nelson #define IONIC_TXQ_DESC_NSGE_SHIFT		8
846fbfb8031SShannon Nelson #define IONIC_TXQ_DESC_ADDR_MASK		(BIT_ULL(IONIC_ADDR_LEN) - 1)
847fbfb8031SShannon Nelson #define IONIC_TXQ_DESC_ADDR_SHIFT		12
848fbfb8031SShannon Nelson 
849fbfb8031SShannon Nelson /* common flags */
850fbfb8031SShannon Nelson #define IONIC_TXQ_DESC_FLAG_VLAN		0x1
851fbfb8031SShannon Nelson #define IONIC_TXQ_DESC_FLAG_ENCAP		0x2
852fbfb8031SShannon Nelson 
853fbfb8031SShannon Nelson /* flags for csum_hw opcode */
854fbfb8031SShannon Nelson #define IONIC_TXQ_DESC_FLAG_CSUM_L3		0x4
855fbfb8031SShannon Nelson #define IONIC_TXQ_DESC_FLAG_CSUM_L4		0x8
856fbfb8031SShannon Nelson 
857fbfb8031SShannon Nelson /* flags for tso opcode */
858fbfb8031SShannon Nelson #define IONIC_TXQ_DESC_FLAG_TSO_SOT		0x4
859fbfb8031SShannon Nelson #define IONIC_TXQ_DESC_FLAG_TSO_EOT		0x8
860fbfb8031SShannon Nelson 
861fbfb8031SShannon Nelson 	__le16  len;
862fbfb8031SShannon Nelson 	union {
863fbfb8031SShannon Nelson 		__le16  vlan_tci;
864fbfb8031SShannon Nelson 		__le16  hword0;
865fbfb8031SShannon Nelson 	};
866fbfb8031SShannon Nelson 	union {
867fbfb8031SShannon Nelson 		__le16  csum_start;
868fbfb8031SShannon Nelson 		__le16  hdr_len;
869fbfb8031SShannon Nelson 		__le16  hword1;
870fbfb8031SShannon Nelson 	};
871fbfb8031SShannon Nelson 	union {
872fbfb8031SShannon Nelson 		__le16  csum_offset;
873fbfb8031SShannon Nelson 		__le16  mss;
874fbfb8031SShannon Nelson 		__le16  hword2;
875fbfb8031SShannon Nelson 	};
876fbfb8031SShannon Nelson };
877fbfb8031SShannon Nelson 
encode_txq_desc_cmd(u8 opcode,u8 flags,u8 nsge,u64 addr)878fbfb8031SShannon Nelson static inline u64 encode_txq_desc_cmd(u8 opcode, u8 flags,
879fbfb8031SShannon Nelson 				      u8 nsge, u64 addr)
880fbfb8031SShannon Nelson {
881fbfb8031SShannon Nelson 	u64 cmd;
882fbfb8031SShannon Nelson 
883fbfb8031SShannon Nelson 	cmd = (opcode & IONIC_TXQ_DESC_OPCODE_MASK) << IONIC_TXQ_DESC_OPCODE_SHIFT;
884fbfb8031SShannon Nelson 	cmd |= (flags & IONIC_TXQ_DESC_FLAGS_MASK) << IONIC_TXQ_DESC_FLAGS_SHIFT;
885fbfb8031SShannon Nelson 	cmd |= (nsge & IONIC_TXQ_DESC_NSGE_MASK) << IONIC_TXQ_DESC_NSGE_SHIFT;
886fbfb8031SShannon Nelson 	cmd |= (addr & IONIC_TXQ_DESC_ADDR_MASK) << IONIC_TXQ_DESC_ADDR_SHIFT;
887fbfb8031SShannon Nelson 
888fbfb8031SShannon Nelson 	return cmd;
889fbfb8031SShannon Nelson };
890fbfb8031SShannon Nelson 
decode_txq_desc_cmd(u64 cmd,u8 * opcode,u8 * flags,u8 * nsge,u64 * addr)891fbfb8031SShannon Nelson static inline void decode_txq_desc_cmd(u64 cmd, u8 *opcode, u8 *flags,
892fbfb8031SShannon Nelson 				       u8 *nsge, u64 *addr)
893fbfb8031SShannon Nelson {
894fbfb8031SShannon Nelson 	*opcode = (cmd >> IONIC_TXQ_DESC_OPCODE_SHIFT) & IONIC_TXQ_DESC_OPCODE_MASK;
895fbfb8031SShannon Nelson 	*flags = (cmd >> IONIC_TXQ_DESC_FLAGS_SHIFT) & IONIC_TXQ_DESC_FLAGS_MASK;
896fbfb8031SShannon Nelson 	*nsge = (cmd >> IONIC_TXQ_DESC_NSGE_SHIFT) & IONIC_TXQ_DESC_NSGE_MASK;
897fbfb8031SShannon Nelson 	*addr = (cmd >> IONIC_TXQ_DESC_ADDR_SHIFT) & IONIC_TXQ_DESC_ADDR_MASK;
898fbfb8031SShannon Nelson };
899fbfb8031SShannon Nelson 
900fbfb8031SShannon Nelson /**
9015b3f3f2aSShannon Nelson  * struct ionic_txq_sg_elem - Transmit scatter-gather (SG) descriptor element
902fbfb8031SShannon Nelson  * @addr:      DMA address of SG element data buffer
903fbfb8031SShannon Nelson  * @len:       Length of SG element data buffer, in bytes
904fbfb8031SShannon Nelson  */
905fbfb8031SShannon Nelson struct ionic_txq_sg_elem {
906fbfb8031SShannon Nelson 	__le64 addr;
907fbfb8031SShannon Nelson 	__le16 len;
908fbfb8031SShannon Nelson 	__le16 rsvd[3];
9095b3f3f2aSShannon Nelson };
9105b3f3f2aSShannon Nelson 
9115b3f3f2aSShannon Nelson /**
9125b3f3f2aSShannon Nelson  * struct ionic_txq_sg_desc - Transmit scatter-gather (SG) list
9135b3f3f2aSShannon Nelson  * @elems:     Scatter-gather elements
9145b3f3f2aSShannon Nelson  */
9155b3f3f2aSShannon Nelson struct ionic_txq_sg_desc {
9165b3f3f2aSShannon Nelson #define IONIC_TX_MAX_SG_ELEMS		8
9175b3f3f2aSShannon Nelson #define IONIC_TX_SG_DESC_STRIDE		8
9185b3f3f2aSShannon Nelson 	struct ionic_txq_sg_elem elems[IONIC_TX_MAX_SG_ELEMS];
9195b3f3f2aSShannon Nelson };
9205b3f3f2aSShannon Nelson 
9215b3f3f2aSShannon Nelson struct ionic_txq_sg_desc_v1 {
9225b3f3f2aSShannon Nelson #define IONIC_TX_MAX_SG_ELEMS_V1		15
9235b3f3f2aSShannon Nelson #define IONIC_TX_SG_DESC_STRIDE_V1		16
9245b3f3f2aSShannon Nelson 	struct ionic_txq_sg_elem elems[IONIC_TX_SG_DESC_STRIDE_V1];
925fbfb8031SShannon Nelson };
926fbfb8031SShannon Nelson 
927fbfb8031SShannon Nelson /**
9285c28f213SShannon Nelson  * struct ionic_txq_comp - Ethernet transmit queue completion descriptor
929c4e7a75aSShannon Nelson  * @status:     Status of the command (enum ionic_status_code)
930c4e7a75aSShannon Nelson  * @comp_index: Index in the descriptor ring for which this is the completion
931c4e7a75aSShannon Nelson  * @color:      Color bit
932fbfb8031SShannon Nelson  */
933fbfb8031SShannon Nelson struct ionic_txq_comp {
934fbfb8031SShannon Nelson 	u8     status;
935fbfb8031SShannon Nelson 	u8     rsvd;
936fbfb8031SShannon Nelson 	__le16 comp_index;
937fbfb8031SShannon Nelson 	u8     rsvd2[11];
938fbfb8031SShannon Nelson 	u8     color;
939fbfb8031SShannon Nelson };
940fbfb8031SShannon Nelson 
941fbfb8031SShannon Nelson enum ionic_rxq_desc_opcode {
942fbfb8031SShannon Nelson 	IONIC_RXQ_DESC_OPCODE_SIMPLE = 0,
943fbfb8031SShannon Nelson 	IONIC_RXQ_DESC_OPCODE_SG = 1,
944fbfb8031SShannon Nelson };
945fbfb8031SShannon Nelson 
946fbfb8031SShannon Nelson /**
9475c28f213SShannon Nelson  * struct ionic_rxq_desc - Ethernet Rx queue descriptor format
948c4e7a75aSShannon Nelson  * @opcode:       Rx operation, see IONIC_RXQ_DESC_OPCODE_*:
949fbfb8031SShannon Nelson  *
950c4e7a75aSShannon Nelson  *                   IONIC_RXQ_DESC_OPCODE_SIMPLE:
951fbfb8031SShannon Nelson  *                      Receive full packet into data buffer
952fbfb8031SShannon Nelson  *                      starting at @addr.  Results of
953fbfb8031SShannon Nelson  *                      receive, including actual bytes received,
954fbfb8031SShannon Nelson  *                      are recorded in Rx completion descriptor.
955fbfb8031SShannon Nelson  *
956c4e7a75aSShannon Nelson  * @len:          Data buffer's length, in bytes
957fbfb8031SShannon Nelson  * @addr:         Data buffer's DMA address
958fbfb8031SShannon Nelson  */
959fbfb8031SShannon Nelson struct ionic_rxq_desc {
960fbfb8031SShannon Nelson 	u8     opcode;
961fbfb8031SShannon Nelson 	u8     rsvd[5];
962fbfb8031SShannon Nelson 	__le16 len;
963fbfb8031SShannon Nelson 	__le64 addr;
964fbfb8031SShannon Nelson };
965fbfb8031SShannon Nelson 
966fbfb8031SShannon Nelson /**
967c4e7a75aSShannon Nelson  * struct ionic_rxq_sg_elem - Receive scatter-gather (SG) descriptor element
968fbfb8031SShannon Nelson  * @addr:      DMA address of SG element data buffer
969fbfb8031SShannon Nelson  * @len:       Length of SG element data buffer, in bytes
970fbfb8031SShannon Nelson  */
971fbfb8031SShannon Nelson struct ionic_rxq_sg_elem {
972fbfb8031SShannon Nelson 	__le64 addr;
973fbfb8031SShannon Nelson 	__le16 len;
974fbfb8031SShannon Nelson 	__le16 rsvd[3];
9755b3f3f2aSShannon Nelson };
9765b3f3f2aSShannon Nelson 
9775b3f3f2aSShannon Nelson /**
9785b3f3f2aSShannon Nelson  * struct ionic_rxq_sg_desc - Receive scatter-gather (SG) list
9795b3f3f2aSShannon Nelson  * @elems:     Scatter-gather elements
9805b3f3f2aSShannon Nelson  */
9815b3f3f2aSShannon Nelson struct ionic_rxq_sg_desc {
9825b3f3f2aSShannon Nelson #define IONIC_RX_MAX_SG_ELEMS		8
9835b3f3f2aSShannon Nelson #define IONIC_RX_SG_DESC_STRIDE		8
9845b3f3f2aSShannon Nelson 	struct ionic_rxq_sg_elem elems[IONIC_RX_SG_DESC_STRIDE];
985fbfb8031SShannon Nelson };
986fbfb8031SShannon Nelson 
987fbfb8031SShannon Nelson /**
9885c28f213SShannon Nelson  * struct ionic_rxq_comp - Ethernet receive queue completion descriptor
989c4e7a75aSShannon Nelson  * @status:       Status of the command (enum ionic_status_code)
990fbfb8031SShannon Nelson  * @num_sg_elems: Number of SG elements used by this descriptor
991c4e7a75aSShannon Nelson  * @comp_index:   Index in the descriptor ring for which this is the completion
992fbfb8031SShannon Nelson  * @rss_hash:     32-bit RSS hash
993c4e7a75aSShannon Nelson  * @csum:         16-bit sum of the packet's L2 payload
994fbfb8031SShannon Nelson  *                If the packet's L2 payload is odd length, an extra
995fbfb8031SShannon Nelson  *                zero-value byte is included in the @csum calculation but
996fbfb8031SShannon Nelson  *                not included in @len.
997fbfb8031SShannon Nelson  * @vlan_tci:     VLAN tag stripped from the packet.  Valid if @VLAN is
998fbfb8031SShannon Nelson  *                set.  Includes .1p and .1q tags.
999fbfb8031SShannon Nelson  * @len:          Received packet length, in bytes.  Excludes FCS.
1000fbfb8031SShannon Nelson  * @csum_calc     L2 payload checksum is computed or not
1001c4e7a75aSShannon Nelson  * @csum_flags:   See IONIC_RXQ_COMP_CSUM_F_*:
1002c4e7a75aSShannon Nelson  *
1003c4e7a75aSShannon Nelson  *                  IONIC_RXQ_COMP_CSUM_F_TCP_OK:
1004c4e7a75aSShannon Nelson  *                    The TCP checksum calculated by the device
1005fbfb8031SShannon Nelson  *                    matched the checksum in the receive packet's
1006c4e7a75aSShannon Nelson  *                    TCP header.
1007c4e7a75aSShannon Nelson  *
1008c4e7a75aSShannon Nelson  *                  IONIC_RXQ_COMP_CSUM_F_TCP_BAD:
1009c4e7a75aSShannon Nelson  *                    The TCP checksum calculated by the device did
1010fbfb8031SShannon Nelson  *                    not match the checksum in the receive packet's
1011fbfb8031SShannon Nelson  *                    TCP header.
1012c4e7a75aSShannon Nelson  *
1013c4e7a75aSShannon Nelson  *                  IONIC_RXQ_COMP_CSUM_F_UDP_OK:
1014c4e7a75aSShannon Nelson  *                    The UDP checksum calculated by the device
1015fbfb8031SShannon Nelson  *                    matched the checksum in the receive packet's
1016fbfb8031SShannon Nelson  *                    UDP header
1017c4e7a75aSShannon Nelson  *
1018c4e7a75aSShannon Nelson  *                  IONIC_RXQ_COMP_CSUM_F_UDP_BAD:
1019c4e7a75aSShannon Nelson  *                    The UDP checksum calculated by the device did
1020fbfb8031SShannon Nelson  *                    not match the checksum in the receive packet's
1021fbfb8031SShannon Nelson  *                    UDP header.
1022c4e7a75aSShannon Nelson  *
1023c4e7a75aSShannon Nelson  *                  IONIC_RXQ_COMP_CSUM_F_IP_OK:
1024c4e7a75aSShannon Nelson  *                    The IPv4 checksum calculated by the device
1025fbfb8031SShannon Nelson  *                    matched the checksum in the receive packet's
1026fbfb8031SShannon Nelson  *                    first IPv4 header.  If the receive packet
1027fbfb8031SShannon Nelson  *                    contains both a tunnel IPv4 header and a
1028fbfb8031SShannon Nelson  *                    transport IPv4 header, the device validates the
1029fbfb8031SShannon Nelson  *                    checksum for the both IPv4 headers.
1030c4e7a75aSShannon Nelson  *
1031c4e7a75aSShannon Nelson  *                  IONIC_RXQ_COMP_CSUM_F_IP_BAD:
1032c4e7a75aSShannon Nelson  *                    The IPv4 checksum calculated by the device did
1033fbfb8031SShannon Nelson  *                    not match the checksum in the receive packet's
1034fbfb8031SShannon Nelson  *                    first IPv4 header. If the receive packet
1035fbfb8031SShannon Nelson  *                    contains both a tunnel IPv4 header and a
1036fbfb8031SShannon Nelson  *                    transport IPv4 header, the device validates the
1037fbfb8031SShannon Nelson  *                    checksum for both IP headers.
1038c4e7a75aSShannon Nelson  *
1039c4e7a75aSShannon Nelson  *                  IONIC_RXQ_COMP_CSUM_F_VLAN:
1040c4e7a75aSShannon Nelson  *                    The VLAN header was stripped and placed in @vlan_tci.
1041c4e7a75aSShannon Nelson  *
1042c4e7a75aSShannon Nelson  *                  IONIC_RXQ_COMP_CSUM_F_CALC:
1043c4e7a75aSShannon Nelson  *                    The checksum was calculated by the device.
1044c4e7a75aSShannon Nelson  *
1045c4e7a75aSShannon Nelson  * @pkt_type_color: Packet type and color bit; see IONIC_RXQ_COMP_PKT_TYPE_MASK
1046fbfb8031SShannon Nelson  */
1047fbfb8031SShannon Nelson struct ionic_rxq_comp {
1048fbfb8031SShannon Nelson 	u8     status;
1049fbfb8031SShannon Nelson 	u8     num_sg_elems;
1050fbfb8031SShannon Nelson 	__le16 comp_index;
1051fbfb8031SShannon Nelson 	__le32 rss_hash;
1052fbfb8031SShannon Nelson 	__le16 csum;
1053fbfb8031SShannon Nelson 	__le16 vlan_tci;
1054fbfb8031SShannon Nelson 	__le16 len;
1055fbfb8031SShannon Nelson 	u8     csum_flags;
1056fbfb8031SShannon Nelson #define IONIC_RXQ_COMP_CSUM_F_TCP_OK	0x01
1057fbfb8031SShannon Nelson #define IONIC_RXQ_COMP_CSUM_F_TCP_BAD	0x02
1058fbfb8031SShannon Nelson #define IONIC_RXQ_COMP_CSUM_F_UDP_OK	0x04
1059fbfb8031SShannon Nelson #define IONIC_RXQ_COMP_CSUM_F_UDP_BAD	0x08
1060fbfb8031SShannon Nelson #define IONIC_RXQ_COMP_CSUM_F_IP_OK	0x10
1061fbfb8031SShannon Nelson #define IONIC_RXQ_COMP_CSUM_F_IP_BAD	0x20
1062fbfb8031SShannon Nelson #define IONIC_RXQ_COMP_CSUM_F_VLAN	0x40
1063fbfb8031SShannon Nelson #define IONIC_RXQ_COMP_CSUM_F_CALC	0x80
1064fbfb8031SShannon Nelson 	u8     pkt_type_color;
1065b5ce31b5SShannon Nelson #define IONIC_RXQ_COMP_PKT_TYPE_MASK	0x7f
1066fbfb8031SShannon Nelson };
1067fbfb8031SShannon Nelson 
1068fbfb8031SShannon Nelson enum ionic_pkt_type {
106925cc5a5fSShannon Nelson 	IONIC_PKT_TYPE_NON_IP		= 0x00,
107025cc5a5fSShannon Nelson 	IONIC_PKT_TYPE_IPV4		= 0x01,
107125cc5a5fSShannon Nelson 	IONIC_PKT_TYPE_IPV4_TCP		= 0x03,
107225cc5a5fSShannon Nelson 	IONIC_PKT_TYPE_IPV4_UDP		= 0x05,
107325cc5a5fSShannon Nelson 	IONIC_PKT_TYPE_IPV6		= 0x08,
107425cc5a5fSShannon Nelson 	IONIC_PKT_TYPE_IPV6_TCP		= 0x18,
107525cc5a5fSShannon Nelson 	IONIC_PKT_TYPE_IPV6_UDP		= 0x28,
10761b897e7dSShannon Nelson 	/* below types are only used if encap offloads are enabled on lif */
10771b897e7dSShannon Nelson 	IONIC_PKT_TYPE_ENCAP_NON_IP	= 0x40,
10781b897e7dSShannon Nelson 	IONIC_PKT_TYPE_ENCAP_IPV4	= 0x41,
10791b897e7dSShannon Nelson 	IONIC_PKT_TYPE_ENCAP_IPV4_TCP	= 0x43,
10801b897e7dSShannon Nelson 	IONIC_PKT_TYPE_ENCAP_IPV4_UDP	= 0x45,
10811b897e7dSShannon Nelson 	IONIC_PKT_TYPE_ENCAP_IPV6	= 0x48,
10821b897e7dSShannon Nelson 	IONIC_PKT_TYPE_ENCAP_IPV6_TCP	= 0x58,
10831b897e7dSShannon Nelson 	IONIC_PKT_TYPE_ENCAP_IPV6_UDP	= 0x68,
1084fbfb8031SShannon Nelson };
1085fbfb8031SShannon Nelson 
1086fbfb8031SShannon Nelson enum ionic_eth_hw_features {
1087fbfb8031SShannon Nelson 	IONIC_ETH_HW_VLAN_TX_TAG	= BIT(0),
1088fbfb8031SShannon Nelson 	IONIC_ETH_HW_VLAN_RX_STRIP	= BIT(1),
1089fbfb8031SShannon Nelson 	IONIC_ETH_HW_VLAN_RX_FILTER	= BIT(2),
1090fbfb8031SShannon Nelson 	IONIC_ETH_HW_RX_HASH		= BIT(3),
1091fbfb8031SShannon Nelson 	IONIC_ETH_HW_RX_CSUM		= BIT(4),
1092fbfb8031SShannon Nelson 	IONIC_ETH_HW_TX_SG		= BIT(5),
1093fbfb8031SShannon Nelson 	IONIC_ETH_HW_RX_SG		= BIT(6),
1094fbfb8031SShannon Nelson 	IONIC_ETH_HW_TX_CSUM		= BIT(7),
1095fbfb8031SShannon Nelson 	IONIC_ETH_HW_TSO		= BIT(8),
1096fbfb8031SShannon Nelson 	IONIC_ETH_HW_TSO_IPV6		= BIT(9),
1097fbfb8031SShannon Nelson 	IONIC_ETH_HW_TSO_ECN		= BIT(10),
1098fbfb8031SShannon Nelson 	IONIC_ETH_HW_TSO_GRE		= BIT(11),
1099fbfb8031SShannon Nelson 	IONIC_ETH_HW_TSO_GRE_CSUM	= BIT(12),
1100fbfb8031SShannon Nelson 	IONIC_ETH_HW_TSO_IPXIP4		= BIT(13),
1101fbfb8031SShannon Nelson 	IONIC_ETH_HW_TSO_IPXIP6		= BIT(14),
1102fbfb8031SShannon Nelson 	IONIC_ETH_HW_TSO_UDP		= BIT(15),
1103fbfb8031SShannon Nelson 	IONIC_ETH_HW_TSO_UDP_CSUM	= BIT(16),
11041b897e7dSShannon Nelson 	IONIC_ETH_HW_RX_CSUM_GENEVE	= BIT(17),
11051b897e7dSShannon Nelson 	IONIC_ETH_HW_TX_CSUM_GENEVE	= BIT(18),
11063da25843SShannon Nelson 	IONIC_ETH_HW_TSO_GENEVE		= BIT(19),
11073da25843SShannon Nelson 	IONIC_ETH_HW_TIMESTAMP		= BIT(20),
11083da25843SShannon Nelson };
11093da25843SShannon Nelson 
11103da25843SShannon Nelson /**
11113da25843SShannon Nelson  * enum ionic_pkt_class - Packet classification mask.
11123da25843SShannon Nelson  *
11133da25843SShannon Nelson  * Used with rx steering filter, packets indicated by the mask can be steered
11143da25843SShannon Nelson  * toward a specific receive queue.
11153da25843SShannon Nelson  *
11163da25843SShannon Nelson  * @IONIC_PKT_CLS_NTP_ALL:          All NTP packets.
11173da25843SShannon Nelson  * @IONIC_PKT_CLS_PTP1_SYNC:        PTPv1 sync
11183da25843SShannon Nelson  * @IONIC_PKT_CLS_PTP1_DREQ:        PTPv1 delay-request
11193da25843SShannon Nelson  * @IONIC_PKT_CLS_PTP1_ALL:         PTPv1 all packets
11203da25843SShannon Nelson  * @IONIC_PKT_CLS_PTP2_L4_SYNC:     PTPv2-UDP sync
11213da25843SShannon Nelson  * @IONIC_PKT_CLS_PTP2_L4_DREQ:     PTPv2-UDP delay-request
11223da25843SShannon Nelson  * @IONIC_PKT_CLS_PTP2_L4_ALL:      PTPv2-UDP all packets
11233da25843SShannon Nelson  * @IONIC_PKT_CLS_PTP2_L2_SYNC:     PTPv2-ETH sync
11243da25843SShannon Nelson  * @IONIC_PKT_CLS_PTP2_L2_DREQ:     PTPv2-ETH delay-request
11253da25843SShannon Nelson  * @IONIC_PKT_CLS_PTP2_L2_ALL:      PTPv2-ETH all packets
11263da25843SShannon Nelson  * @IONIC_PKT_CLS_PTP2_SYNC:        PTPv2 sync
11273da25843SShannon Nelson  * @IONIC_PKT_CLS_PTP2_DREQ:        PTPv2 delay-request
11283da25843SShannon Nelson  * @IONIC_PKT_CLS_PTP2_ALL:         PTPv2 all packets
11293da25843SShannon Nelson  * @IONIC_PKT_CLS_PTP_SYNC:         PTP sync
11303da25843SShannon Nelson  * @IONIC_PKT_CLS_PTP_DREQ:         PTP delay-request
11313da25843SShannon Nelson  * @IONIC_PKT_CLS_PTP_ALL:          PTP all packets
11323da25843SShannon Nelson  */
11333da25843SShannon Nelson enum ionic_pkt_class {
11343da25843SShannon Nelson 	IONIC_PKT_CLS_NTP_ALL		= BIT(0),
11353da25843SShannon Nelson 
11363da25843SShannon Nelson 	IONIC_PKT_CLS_PTP1_SYNC		= BIT(1),
11373da25843SShannon Nelson 	IONIC_PKT_CLS_PTP1_DREQ		= BIT(2),
11383da25843SShannon Nelson 	IONIC_PKT_CLS_PTP1_ALL		= BIT(3) |
11393da25843SShannon Nelson 		IONIC_PKT_CLS_PTP1_SYNC | IONIC_PKT_CLS_PTP1_DREQ,
11403da25843SShannon Nelson 
11413da25843SShannon Nelson 	IONIC_PKT_CLS_PTP2_L4_SYNC	= BIT(4),
11423da25843SShannon Nelson 	IONIC_PKT_CLS_PTP2_L4_DREQ	= BIT(5),
11433da25843SShannon Nelson 	IONIC_PKT_CLS_PTP2_L4_ALL	= BIT(6) |
11443da25843SShannon Nelson 		IONIC_PKT_CLS_PTP2_L4_SYNC | IONIC_PKT_CLS_PTP2_L4_DREQ,
11453da25843SShannon Nelson 
11463da25843SShannon Nelson 	IONIC_PKT_CLS_PTP2_L2_SYNC	= BIT(7),
11473da25843SShannon Nelson 	IONIC_PKT_CLS_PTP2_L2_DREQ	= BIT(8),
11483da25843SShannon Nelson 	IONIC_PKT_CLS_PTP2_L2_ALL	= BIT(9) |
11493da25843SShannon Nelson 		IONIC_PKT_CLS_PTP2_L2_SYNC | IONIC_PKT_CLS_PTP2_L2_DREQ,
11503da25843SShannon Nelson 
11513da25843SShannon Nelson 	IONIC_PKT_CLS_PTP2_SYNC		=
11523da25843SShannon Nelson 		IONIC_PKT_CLS_PTP2_L4_SYNC | IONIC_PKT_CLS_PTP2_L2_SYNC,
11533da25843SShannon Nelson 	IONIC_PKT_CLS_PTP2_DREQ		=
11543da25843SShannon Nelson 		IONIC_PKT_CLS_PTP2_L4_DREQ | IONIC_PKT_CLS_PTP2_L2_DREQ,
11553da25843SShannon Nelson 	IONIC_PKT_CLS_PTP2_ALL		=
11563da25843SShannon Nelson 		IONIC_PKT_CLS_PTP2_L4_ALL | IONIC_PKT_CLS_PTP2_L2_ALL,
11573da25843SShannon Nelson 
11583da25843SShannon Nelson 	IONIC_PKT_CLS_PTP_SYNC		=
11593da25843SShannon Nelson 		IONIC_PKT_CLS_PTP1_SYNC | IONIC_PKT_CLS_PTP2_SYNC,
11603da25843SShannon Nelson 	IONIC_PKT_CLS_PTP_DREQ		=
11613da25843SShannon Nelson 		IONIC_PKT_CLS_PTP1_DREQ | IONIC_PKT_CLS_PTP2_DREQ,
11623da25843SShannon Nelson 	IONIC_PKT_CLS_PTP_ALL		=
11633da25843SShannon Nelson 		IONIC_PKT_CLS_PTP1_ALL | IONIC_PKT_CLS_PTP2_ALL,
1164fbfb8031SShannon Nelson };
1165fbfb8031SShannon Nelson 
1166fbfb8031SShannon Nelson /**
11675c28f213SShannon Nelson  * struct ionic_q_control_cmd - Queue control command
1168fbfb8031SShannon Nelson  * @opcode:     opcode
1169fbfb8031SShannon Nelson  * @type:       Queue type
1170fbfb8031SShannon Nelson  * @lif_index:  LIF index
1171fbfb8031SShannon Nelson  * @index:      Queue index
11721b897e7dSShannon Nelson  * @oper:       Operation (enum ionic_q_control_oper)
1173fbfb8031SShannon Nelson  */
1174fbfb8031SShannon Nelson struct ionic_q_control_cmd {
1175fbfb8031SShannon Nelson 	u8     opcode;
1176fbfb8031SShannon Nelson 	u8     type;
1177fbfb8031SShannon Nelson 	__le16 lif_index;
1178fbfb8031SShannon Nelson 	__le32 index;
1179fbfb8031SShannon Nelson 	u8     oper;
1180fbfb8031SShannon Nelson 	u8     rsvd[55];
1181fbfb8031SShannon Nelson };
1182fbfb8031SShannon Nelson 
1183fbfb8031SShannon Nelson typedef struct ionic_admin_comp ionic_q_control_comp;
1184fbfb8031SShannon Nelson 
1185fbfb8031SShannon Nelson enum q_control_oper {
1186fbfb8031SShannon Nelson 	IONIC_Q_DISABLE		= 0,
1187fbfb8031SShannon Nelson 	IONIC_Q_ENABLE		= 1,
1188fbfb8031SShannon Nelson 	IONIC_Q_HANG_RESET	= 2,
1189fbfb8031SShannon Nelson };
1190fbfb8031SShannon Nelson 
1191fbfb8031SShannon Nelson /**
1192c4e7a75aSShannon Nelson  * enum ionic_phy_type - Physical connection type
1193c4e7a75aSShannon Nelson  * @IONIC_PHY_TYPE_NONE:    No PHY installed
1194c4e7a75aSShannon Nelson  * @IONIC_PHY_TYPE_COPPER:  Copper PHY
1195c4e7a75aSShannon Nelson  * @IONIC_PHY_TYPE_FIBER:   Fiber PHY
1196fbfb8031SShannon Nelson  */
1197fbfb8031SShannon Nelson enum ionic_phy_type {
1198fbfb8031SShannon Nelson 	IONIC_PHY_TYPE_NONE	= 0,
1199fbfb8031SShannon Nelson 	IONIC_PHY_TYPE_COPPER	= 1,
1200fbfb8031SShannon Nelson 	IONIC_PHY_TYPE_FIBER	= 2,
1201fbfb8031SShannon Nelson };
1202fbfb8031SShannon Nelson 
1203fbfb8031SShannon Nelson /**
1204c4e7a75aSShannon Nelson  * enum ionic_xcvr_state - Transceiver status
1205c4e7a75aSShannon Nelson  * @IONIC_XCVR_STATE_REMOVED:        Transceiver removed
1206c4e7a75aSShannon Nelson  * @IONIC_XCVR_STATE_INSERTED:       Transceiver inserted
1207c4e7a75aSShannon Nelson  * @IONIC_XCVR_STATE_PENDING:        Transceiver pending
1208c4e7a75aSShannon Nelson  * @IONIC_XCVR_STATE_SPROM_READ:     Transceiver data read
1209c4e7a75aSShannon Nelson  * @IONIC_XCVR_STATE_SPROM_READ_ERR: Transceiver data read error
1210fbfb8031SShannon Nelson  */
1211fbfb8031SShannon Nelson enum ionic_xcvr_state {
1212fbfb8031SShannon Nelson 	IONIC_XCVR_STATE_REMOVED	 = 0,
1213fbfb8031SShannon Nelson 	IONIC_XCVR_STATE_INSERTED	 = 1,
1214fbfb8031SShannon Nelson 	IONIC_XCVR_STATE_PENDING	 = 2,
1215fbfb8031SShannon Nelson 	IONIC_XCVR_STATE_SPROM_READ	 = 3,
1216fbfb8031SShannon Nelson 	IONIC_XCVR_STATE_SPROM_READ_ERR	 = 4,
1217fbfb8031SShannon Nelson };
1218fbfb8031SShannon Nelson 
1219fbfb8031SShannon Nelson /**
1220c4e7a75aSShannon Nelson  * enum ionic_xcvr_pid - Supported link modes
1221fbfb8031SShannon Nelson  */
1222fbfb8031SShannon Nelson enum ionic_xcvr_pid {
1223fbfb8031SShannon Nelson 	IONIC_XCVR_PID_UNKNOWN           = 0,
1224fbfb8031SShannon Nelson 
1225fbfb8031SShannon Nelson 	/* CU */
1226fbfb8031SShannon Nelson 	IONIC_XCVR_PID_QSFP_100G_CR4     = 1,
1227fbfb8031SShannon Nelson 	IONIC_XCVR_PID_QSFP_40GBASE_CR4  = 2,
1228fbfb8031SShannon Nelson 	IONIC_XCVR_PID_SFP_25GBASE_CR_S  = 3,
1229fbfb8031SShannon Nelson 	IONIC_XCVR_PID_SFP_25GBASE_CR_L  = 4,
1230fbfb8031SShannon Nelson 	IONIC_XCVR_PID_SFP_25GBASE_CR_N  = 5,
1231fbfb8031SShannon Nelson 
1232fbfb8031SShannon Nelson 	/* Fiber */
1233fbfb8031SShannon Nelson 	IONIC_XCVR_PID_QSFP_100G_AOC    = 50,
1234fbfb8031SShannon Nelson 	IONIC_XCVR_PID_QSFP_100G_ACC    = 51,
1235fbfb8031SShannon Nelson 	IONIC_XCVR_PID_QSFP_100G_SR4    = 52,
1236fbfb8031SShannon Nelson 	IONIC_XCVR_PID_QSFP_100G_LR4    = 53,
1237fbfb8031SShannon Nelson 	IONIC_XCVR_PID_QSFP_100G_ER4    = 54,
1238fbfb8031SShannon Nelson 	IONIC_XCVR_PID_QSFP_40GBASE_ER4 = 55,
1239fbfb8031SShannon Nelson 	IONIC_XCVR_PID_QSFP_40GBASE_SR4 = 56,
1240fbfb8031SShannon Nelson 	IONIC_XCVR_PID_QSFP_40GBASE_LR4 = 57,
1241fbfb8031SShannon Nelson 	IONIC_XCVR_PID_QSFP_40GBASE_AOC = 58,
1242fbfb8031SShannon Nelson 	IONIC_XCVR_PID_SFP_25GBASE_SR   = 59,
1243fbfb8031SShannon Nelson 	IONIC_XCVR_PID_SFP_25GBASE_LR   = 60,
1244fbfb8031SShannon Nelson 	IONIC_XCVR_PID_SFP_25GBASE_ER   = 61,
1245fbfb8031SShannon Nelson 	IONIC_XCVR_PID_SFP_25GBASE_AOC  = 62,
1246fbfb8031SShannon Nelson 	IONIC_XCVR_PID_SFP_10GBASE_SR   = 63,
1247fbfb8031SShannon Nelson 	IONIC_XCVR_PID_SFP_10GBASE_LR   = 64,
1248fbfb8031SShannon Nelson 	IONIC_XCVR_PID_SFP_10GBASE_LRM  = 65,
1249fbfb8031SShannon Nelson 	IONIC_XCVR_PID_SFP_10GBASE_ER   = 66,
1250fbfb8031SShannon Nelson 	IONIC_XCVR_PID_SFP_10GBASE_AOC  = 67,
1251fbfb8031SShannon Nelson 	IONIC_XCVR_PID_SFP_10GBASE_CU   = 68,
1252fbfb8031SShannon Nelson 	IONIC_XCVR_PID_QSFP_100G_CWDM4  = 69,
1253fbfb8031SShannon Nelson 	IONIC_XCVR_PID_QSFP_100G_PSM4   = 70,
1254c4e7a75aSShannon Nelson 	IONIC_XCVR_PID_SFP_25GBASE_ACC  = 71,
1255acc606d3SShannon Nelson 	IONIC_XCVR_PID_SFP_10GBASE_T    = 72,
1256acc606d3SShannon Nelson 	IONIC_XCVR_PID_SFP_1000BASE_T   = 73,
1257fbfb8031SShannon Nelson };
1258fbfb8031SShannon Nelson 
1259fbfb8031SShannon Nelson /**
1260c4e7a75aSShannon Nelson  * enum ionic_port_type - Port types
1261c4e7a75aSShannon Nelson  * @IONIC_PORT_TYPE_NONE:           Port type not configured
1262c4e7a75aSShannon Nelson  * @IONIC_PORT_TYPE_ETH:            Port carries ethernet traffic (inband)
1263c4e7a75aSShannon Nelson  * @IONIC_PORT_TYPE_MGMT:           Port carries mgmt traffic (out-of-band)
1264fbfb8031SShannon Nelson  */
1265fbfb8031SShannon Nelson enum ionic_port_type {
1266c4e7a75aSShannon Nelson 	IONIC_PORT_TYPE_NONE = 0,
1267c4e7a75aSShannon Nelson 	IONIC_PORT_TYPE_ETH  = 1,
1268c4e7a75aSShannon Nelson 	IONIC_PORT_TYPE_MGMT = 2,
1269fbfb8031SShannon Nelson };
1270fbfb8031SShannon Nelson 
1271fbfb8031SShannon Nelson /**
1272c4e7a75aSShannon Nelson  * enum ionic_port_admin_state - Port config state
1273c4e7a75aSShannon Nelson  * @IONIC_PORT_ADMIN_STATE_NONE:    Port admin state not configured
1274c4e7a75aSShannon Nelson  * @IONIC_PORT_ADMIN_STATE_DOWN:    Port admin disabled
1275c4e7a75aSShannon Nelson  * @IONIC_PORT_ADMIN_STATE_UP:      Port admin enabled
1276fbfb8031SShannon Nelson  */
1277fbfb8031SShannon Nelson enum ionic_port_admin_state {
1278c4e7a75aSShannon Nelson 	IONIC_PORT_ADMIN_STATE_NONE = 0,
1279c4e7a75aSShannon Nelson 	IONIC_PORT_ADMIN_STATE_DOWN = 1,
1280c4e7a75aSShannon Nelson 	IONIC_PORT_ADMIN_STATE_UP   = 2,
1281fbfb8031SShannon Nelson };
1282fbfb8031SShannon Nelson 
1283fbfb8031SShannon Nelson /**
1284c4e7a75aSShannon Nelson  * enum ionic_port_oper_status - Port operational status
1285c4e7a75aSShannon Nelson  * @IONIC_PORT_OPER_STATUS_NONE:    Port disabled
1286c4e7a75aSShannon Nelson  * @IONIC_PORT_OPER_STATUS_UP:      Port link status up
1287c4e7a75aSShannon Nelson  * @IONIC_PORT_OPER_STATUS_DOWN:    Port link status down
1288fbfb8031SShannon Nelson  */
1289fbfb8031SShannon Nelson enum ionic_port_oper_status {
1290c4e7a75aSShannon Nelson 	IONIC_PORT_OPER_STATUS_NONE  = 0,
1291c4e7a75aSShannon Nelson 	IONIC_PORT_OPER_STATUS_UP    = 1,
1292c4e7a75aSShannon Nelson 	IONIC_PORT_OPER_STATUS_DOWN  = 2,
1293fbfb8031SShannon Nelson };
1294fbfb8031SShannon Nelson 
1295fbfb8031SShannon Nelson /**
1296c4e7a75aSShannon Nelson  * enum ionic_port_fec_type - Ethernet Forward error correction (FEC) modes
1297c4e7a75aSShannon Nelson  * @IONIC_PORT_FEC_TYPE_NONE:       FEC Disabled
1298c4e7a75aSShannon Nelson  * @IONIC_PORT_FEC_TYPE_FC:         FireCode FEC
1299c4e7a75aSShannon Nelson  * @IONIC_PORT_FEC_TYPE_RS:         ReedSolomon FEC
1300fbfb8031SShannon Nelson  */
1301fbfb8031SShannon Nelson enum ionic_port_fec_type {
1302c4e7a75aSShannon Nelson 	IONIC_PORT_FEC_TYPE_NONE = 0,
1303c4e7a75aSShannon Nelson 	IONIC_PORT_FEC_TYPE_FC   = 1,
1304c4e7a75aSShannon Nelson 	IONIC_PORT_FEC_TYPE_RS   = 2,
1305fbfb8031SShannon Nelson };
1306fbfb8031SShannon Nelson 
1307fbfb8031SShannon Nelson /**
1308c4e7a75aSShannon Nelson  * enum ionic_port_pause_type - Ethernet pause (flow control) modes
1309c4e7a75aSShannon Nelson  * @IONIC_PORT_PAUSE_TYPE_NONE:     Disable Pause
1310c4e7a75aSShannon Nelson  * @IONIC_PORT_PAUSE_TYPE_LINK:     Link level pause
1311c4e7a75aSShannon Nelson  * @IONIC_PORT_PAUSE_TYPE_PFC:      Priority-Flow Control
1312fbfb8031SShannon Nelson  */
1313fbfb8031SShannon Nelson enum ionic_port_pause_type {
1314c4e7a75aSShannon Nelson 	IONIC_PORT_PAUSE_TYPE_NONE = 0,
1315c4e7a75aSShannon Nelson 	IONIC_PORT_PAUSE_TYPE_LINK = 1,
1316c4e7a75aSShannon Nelson 	IONIC_PORT_PAUSE_TYPE_PFC  = 2,
1317fbfb8031SShannon Nelson };
1318fbfb8031SShannon Nelson 
1319fbfb8031SShannon Nelson /**
1320c4e7a75aSShannon Nelson  * enum ionic_port_loopback_mode - Loopback modes
1321c4e7a75aSShannon Nelson  * @IONIC_PORT_LOOPBACK_MODE_NONE:  Disable loopback
1322c4e7a75aSShannon Nelson  * @IONIC_PORT_LOOPBACK_MODE_MAC:   MAC loopback
1323c4e7a75aSShannon Nelson  * @IONIC_PORT_LOOPBACK_MODE_PHY:   PHY/SerDes loopback
1324fbfb8031SShannon Nelson  */
1325fbfb8031SShannon Nelson enum ionic_port_loopback_mode {
1326c4e7a75aSShannon Nelson 	IONIC_PORT_LOOPBACK_MODE_NONE = 0,
1327c4e7a75aSShannon Nelson 	IONIC_PORT_LOOPBACK_MODE_MAC  = 1,
1328c4e7a75aSShannon Nelson 	IONIC_PORT_LOOPBACK_MODE_PHY  = 2,
1329fbfb8031SShannon Nelson };
1330fbfb8031SShannon Nelson 
1331fbfb8031SShannon Nelson /**
1332c4e7a75aSShannon Nelson  * struct ionic_xcvr_status - Transceiver Status information
13335c28f213SShannon Nelson  * @state:    Transceiver status (enum ionic_xcvr_state)
13345c28f213SShannon Nelson  * @phy:      Physical connection type (enum ionic_phy_type)
13351b897e7dSShannon Nelson  * @pid:      Transceiver link mode (enum ionic_xcvr_pid)
1336fbfb8031SShannon Nelson  * @sprom:    Transceiver sprom contents
1337fbfb8031SShannon Nelson  */
1338fbfb8031SShannon Nelson struct ionic_xcvr_status {
1339fbfb8031SShannon Nelson 	u8     state;
1340fbfb8031SShannon Nelson 	u8     phy;
1341fbfb8031SShannon Nelson 	__le16 pid;
1342fbfb8031SShannon Nelson 	u8     sprom[256];
1343fbfb8031SShannon Nelson };
1344fbfb8031SShannon Nelson 
1345fbfb8031SShannon Nelson /**
1346c4e7a75aSShannon Nelson  * union ionic_port_config - Port configuration
1347fbfb8031SShannon Nelson  * @speed:              port speed (in Mbps)
1348fbfb8031SShannon Nelson  * @mtu:                mtu
13491b897e7dSShannon Nelson  * @state:              port admin state (enum ionic_port_admin_state)
1350fbfb8031SShannon Nelson  * @an_enable:          autoneg enable
13515c28f213SShannon Nelson  * @fec_type:           fec type (enum ionic_port_fec_type)
13525c28f213SShannon Nelson  * @pause_type:         pause type (enum ionic_port_pause_type)
13535c28f213SShannon Nelson  * @loopback_mode:      loopback mode (enum ionic_port_loopback_mode)
1354fbfb8031SShannon Nelson  */
1355fbfb8031SShannon Nelson union ionic_port_config {
1356fbfb8031SShannon Nelson 	struct {
1357fbfb8031SShannon Nelson #define IONIC_SPEED_100G	100000	/* 100G in Mbps */
1358fbfb8031SShannon Nelson #define IONIC_SPEED_50G		50000	/* 50G in Mbps */
1359fbfb8031SShannon Nelson #define IONIC_SPEED_40G		40000	/* 40G in Mbps */
1360fbfb8031SShannon Nelson #define IONIC_SPEED_25G		25000	/* 25G in Mbps */
1361fbfb8031SShannon Nelson #define IONIC_SPEED_10G		10000	/* 10G in Mbps */
1362fbfb8031SShannon Nelson #define IONIC_SPEED_1G		1000	/* 1G in Mbps */
1363fbfb8031SShannon Nelson 		__le32 speed;
1364fbfb8031SShannon Nelson 		__le32 mtu;
1365fbfb8031SShannon Nelson 		u8     state;
1366fbfb8031SShannon Nelson 		u8     an_enable;
1367fbfb8031SShannon Nelson 		u8     fec_type;
1368fbfb8031SShannon Nelson #define IONIC_PAUSE_TYPE_MASK		0x0f
1369fbfb8031SShannon Nelson #define IONIC_PAUSE_FLAGS_MASK		0xf0
1370fbfb8031SShannon Nelson #define IONIC_PAUSE_F_TX		0x10
1371fbfb8031SShannon Nelson #define IONIC_PAUSE_F_RX		0x20
1372fbfb8031SShannon Nelson 		u8     pause_type;
1373fbfb8031SShannon Nelson 		u8     loopback_mode;
1374fbfb8031SShannon Nelson 	};
1375fbfb8031SShannon Nelson 	__le32 words[64];
1376fbfb8031SShannon Nelson };
1377fbfb8031SShannon Nelson 
1378fbfb8031SShannon Nelson /**
1379c4e7a75aSShannon Nelson  * struct ionic_port_status - Port Status information
13805c28f213SShannon Nelson  * @status:             link status (enum ionic_port_oper_status)
1381fbfb8031SShannon Nelson  * @id:                 port id
1382fbfb8031SShannon Nelson  * @speed:              link speed (in Mbps)
1383ecea8bb4SShannon Nelson  * @link_down_count:    number of times link went from up to down
1384c4e7a75aSShannon Nelson  * @fec_type:           fec type (enum ionic_port_fec_type)
1385ecea8bb4SShannon Nelson  * @xcvr:               transceiver status
1386fbfb8031SShannon Nelson  */
1387fbfb8031SShannon Nelson struct ionic_port_status {
1388fbfb8031SShannon Nelson 	__le32 id;
1389fbfb8031SShannon Nelson 	__le32 speed;
1390fbfb8031SShannon Nelson 	u8     status;
1391c4e7a75aSShannon Nelson 	__le16 link_down_count;
1392c4e7a75aSShannon Nelson 	u8     fec_type;
1393c4e7a75aSShannon Nelson 	u8     rsvd[48];
1394fbfb8031SShannon Nelson 	struct ionic_xcvr_status  xcvr;
13955dca69c4SShannon Nelson } __packed;
1396fbfb8031SShannon Nelson 
1397fbfb8031SShannon Nelson /**
13985c28f213SShannon Nelson  * struct ionic_port_identify_cmd - Port identify command
1399fbfb8031SShannon Nelson  * @opcode:     opcode
1400fbfb8031SShannon Nelson  * @index:      port index
1401fbfb8031SShannon Nelson  * @ver:        Highest version of identify supported by driver
1402fbfb8031SShannon Nelson  */
1403fbfb8031SShannon Nelson struct ionic_port_identify_cmd {
1404fbfb8031SShannon Nelson 	u8 opcode;
1405fbfb8031SShannon Nelson 	u8 index;
1406fbfb8031SShannon Nelson 	u8 ver;
1407fbfb8031SShannon Nelson 	u8 rsvd[61];
1408fbfb8031SShannon Nelson };
1409fbfb8031SShannon Nelson 
1410fbfb8031SShannon Nelson /**
14115c28f213SShannon Nelson  * struct ionic_port_identify_comp - Port identify command completion
1412c4e7a75aSShannon Nelson  * @status: Status of the command (enum ionic_status_code)
1413fbfb8031SShannon Nelson  * @ver:    Version of identify returned by device
1414fbfb8031SShannon Nelson  */
1415fbfb8031SShannon Nelson struct ionic_port_identify_comp {
1416fbfb8031SShannon Nelson 	u8 status;
1417fbfb8031SShannon Nelson 	u8 ver;
1418fbfb8031SShannon Nelson 	u8 rsvd[14];
1419fbfb8031SShannon Nelson };
1420fbfb8031SShannon Nelson 
1421fbfb8031SShannon Nelson /**
14225c28f213SShannon Nelson  * struct ionic_port_init_cmd - Port initialization command
1423fbfb8031SShannon Nelson  * @opcode:     opcode
1424fbfb8031SShannon Nelson  * @index:      port index
14255c28f213SShannon Nelson  * @info_pa:    destination address for port info (struct ionic_port_info)
1426fbfb8031SShannon Nelson  */
1427fbfb8031SShannon Nelson struct ionic_port_init_cmd {
1428fbfb8031SShannon Nelson 	u8     opcode;
1429fbfb8031SShannon Nelson 	u8     index;
1430fbfb8031SShannon Nelson 	u8     rsvd[6];
1431fbfb8031SShannon Nelson 	__le64 info_pa;
1432fbfb8031SShannon Nelson 	u8     rsvd2[48];
1433fbfb8031SShannon Nelson };
1434fbfb8031SShannon Nelson 
1435fbfb8031SShannon Nelson /**
14365c28f213SShannon Nelson  * struct ionic_port_init_comp - Port initialization command completion
1437c4e7a75aSShannon Nelson  * @status: Status of the command (enum ionic_status_code)
1438fbfb8031SShannon Nelson  */
1439fbfb8031SShannon Nelson struct ionic_port_init_comp {
1440fbfb8031SShannon Nelson 	u8 status;
1441fbfb8031SShannon Nelson 	u8 rsvd[15];
1442fbfb8031SShannon Nelson };
1443fbfb8031SShannon Nelson 
1444fbfb8031SShannon Nelson /**
14455c28f213SShannon Nelson  * struct ionic_port_reset_cmd - Port reset command
1446fbfb8031SShannon Nelson  * @opcode:     opcode
1447fbfb8031SShannon Nelson  * @index:      port index
1448fbfb8031SShannon Nelson  */
1449fbfb8031SShannon Nelson struct ionic_port_reset_cmd {
1450fbfb8031SShannon Nelson 	u8 opcode;
1451fbfb8031SShannon Nelson 	u8 index;
1452fbfb8031SShannon Nelson 	u8 rsvd[62];
1453fbfb8031SShannon Nelson };
1454fbfb8031SShannon Nelson 
1455fbfb8031SShannon Nelson /**
14565c28f213SShannon Nelson  * struct ionic_port_reset_comp - Port reset command completion
1457c4e7a75aSShannon Nelson  * @status: Status of the command (enum ionic_status_code)
1458fbfb8031SShannon Nelson  */
1459fbfb8031SShannon Nelson struct ionic_port_reset_comp {
1460fbfb8031SShannon Nelson 	u8 status;
1461fbfb8031SShannon Nelson 	u8 rsvd[15];
1462fbfb8031SShannon Nelson };
1463fbfb8031SShannon Nelson 
1464fbfb8031SShannon Nelson /**
1465c4e7a75aSShannon Nelson  * enum ionic_stats_ctl_cmd - List of commands for stats control
1466c4e7a75aSShannon Nelson  * @IONIC_STATS_CTL_RESET:      Reset statistics
1467fbfb8031SShannon Nelson  */
1468fbfb8031SShannon Nelson enum ionic_stats_ctl_cmd {
1469fbfb8031SShannon Nelson 	IONIC_STATS_CTL_RESET		= 0,
1470fbfb8031SShannon Nelson };
1471fbfb8031SShannon Nelson 
1472fbfb8031SShannon Nelson /**
14733da25843SShannon Nelson  * enum ionic_txstamp_mode - List of TX Timestamping Modes
14743da25843SShannon Nelson  * @IONIC_TXSTAMP_OFF:           Disable TX hardware timetamping.
14753da25843SShannon Nelson  * @IONIC_TXSTAMP_ON:            Enable local TX hardware timetamping.
14763da25843SShannon Nelson  * @IONIC_TXSTAMP_ONESTEP_SYNC:  Modify TX PTP Sync packets.
14773da25843SShannon Nelson  * @IONIC_TXSTAMP_ONESTEP_P2P:   Modify TX PTP Sync and PDelayResp.
14783da25843SShannon Nelson  */
14793da25843SShannon Nelson enum ionic_txstamp_mode {
14803da25843SShannon Nelson 	IONIC_TXSTAMP_OFF		= 0,
14813da25843SShannon Nelson 	IONIC_TXSTAMP_ON		= 1,
14823da25843SShannon Nelson 	IONIC_TXSTAMP_ONESTEP_SYNC	= 2,
14833da25843SShannon Nelson 	IONIC_TXSTAMP_ONESTEP_P2P	= 3,
14843da25843SShannon Nelson };
14853da25843SShannon Nelson 
14863da25843SShannon Nelson /**
1487fbfb8031SShannon Nelson  * enum ionic_port_attr - List of device attributes
1488c4e7a75aSShannon Nelson  * @IONIC_PORT_ATTR_STATE:      Port state attribute
1489c4e7a75aSShannon Nelson  * @IONIC_PORT_ATTR_SPEED:      Port speed attribute
1490c4e7a75aSShannon Nelson  * @IONIC_PORT_ATTR_MTU:        Port MTU attribute
149125cc5a5fSShannon Nelson  * @IONIC_PORT_ATTR_AUTONEG:    Port autonegotiation attribute
1492c4e7a75aSShannon Nelson  * @IONIC_PORT_ATTR_FEC:        Port FEC attribute
1493c4e7a75aSShannon Nelson  * @IONIC_PORT_ATTR_PAUSE:      Port pause attribute
1494c4e7a75aSShannon Nelson  * @IONIC_PORT_ATTR_LOOPBACK:   Port loopback attribute
1495c4e7a75aSShannon Nelson  * @IONIC_PORT_ATTR_STATS_CTRL: Port statistics control attribute
1496fbfb8031SShannon Nelson  */
1497fbfb8031SShannon Nelson enum ionic_port_attr {
1498fbfb8031SShannon Nelson 	IONIC_PORT_ATTR_STATE		= 0,
1499fbfb8031SShannon Nelson 	IONIC_PORT_ATTR_SPEED		= 1,
1500fbfb8031SShannon Nelson 	IONIC_PORT_ATTR_MTU		= 2,
1501fbfb8031SShannon Nelson 	IONIC_PORT_ATTR_AUTONEG		= 3,
1502fbfb8031SShannon Nelson 	IONIC_PORT_ATTR_FEC		= 4,
1503fbfb8031SShannon Nelson 	IONIC_PORT_ATTR_PAUSE		= 5,
1504fbfb8031SShannon Nelson 	IONIC_PORT_ATTR_LOOPBACK	= 6,
1505fbfb8031SShannon Nelson 	IONIC_PORT_ATTR_STATS_CTRL	= 7,
1506fbfb8031SShannon Nelson };
1507fbfb8031SShannon Nelson 
1508fbfb8031SShannon Nelson /**
15095c28f213SShannon Nelson  * struct ionic_port_setattr_cmd - Set port attributes on the NIC
1510fbfb8031SShannon Nelson  * @opcode:         Opcode
1511c4e7a75aSShannon Nelson  * @index:          Port index
1512fbfb8031SShannon Nelson  * @attr:           Attribute type (enum ionic_port_attr)
1513c4e7a75aSShannon Nelson  * @state:          Port state
1514c4e7a75aSShannon Nelson  * @speed:          Port speed
1515c4e7a75aSShannon Nelson  * @mtu:            Port MTU
1516c4e7a75aSShannon Nelson  * @an_enable:      Port autonegotiation setting
1517c4e7a75aSShannon Nelson  * @fec_type:       Port FEC type setting
1518c4e7a75aSShannon Nelson  * @pause_type:     Port pause type setting
1519c4e7a75aSShannon Nelson  * @loopback_mode:  Port loopback mode
1520c4e7a75aSShannon Nelson  * @stats_ctl:      Port stats setting
1521fbfb8031SShannon Nelson  */
1522fbfb8031SShannon Nelson struct ionic_port_setattr_cmd {
1523fbfb8031SShannon Nelson 	u8     opcode;
1524fbfb8031SShannon Nelson 	u8     index;
1525fbfb8031SShannon Nelson 	u8     attr;
1526fbfb8031SShannon Nelson 	u8     rsvd;
1527fbfb8031SShannon Nelson 	union {
1528fbfb8031SShannon Nelson 		u8      state;
1529fbfb8031SShannon Nelson 		__le32  speed;
1530fbfb8031SShannon Nelson 		__le32  mtu;
1531fbfb8031SShannon Nelson 		u8      an_enable;
1532fbfb8031SShannon Nelson 		u8      fec_type;
1533fbfb8031SShannon Nelson 		u8      pause_type;
1534fbfb8031SShannon Nelson 		u8      loopback_mode;
1535fbfb8031SShannon Nelson 		u8      stats_ctl;
1536fbfb8031SShannon Nelson 		u8      rsvd2[60];
1537fbfb8031SShannon Nelson 	};
1538fbfb8031SShannon Nelson };
1539fbfb8031SShannon Nelson 
1540fbfb8031SShannon Nelson /**
15415c28f213SShannon Nelson  * struct ionic_port_setattr_comp - Port set attr command completion
1542c4e7a75aSShannon Nelson  * @status:     Status of the command (enum ionic_status_code)
1543fbfb8031SShannon Nelson  * @color:      Color bit
1544fbfb8031SShannon Nelson  */
1545fbfb8031SShannon Nelson struct ionic_port_setattr_comp {
1546fbfb8031SShannon Nelson 	u8     status;
1547fbfb8031SShannon Nelson 	u8     rsvd[14];
1548fbfb8031SShannon Nelson 	u8     color;
1549fbfb8031SShannon Nelson };
1550fbfb8031SShannon Nelson 
1551fbfb8031SShannon Nelson /**
15525c28f213SShannon Nelson  * struct ionic_port_getattr_cmd - Get port attributes from the NIC
1553fbfb8031SShannon Nelson  * @opcode:     Opcode
1554fbfb8031SShannon Nelson  * @index:      port index
1555fbfb8031SShannon Nelson  * @attr:       Attribute type (enum ionic_port_attr)
1556fbfb8031SShannon Nelson  */
1557fbfb8031SShannon Nelson struct ionic_port_getattr_cmd {
1558fbfb8031SShannon Nelson 	u8     opcode;
1559fbfb8031SShannon Nelson 	u8     index;
1560fbfb8031SShannon Nelson 	u8     attr;
1561fbfb8031SShannon Nelson 	u8     rsvd[61];
1562fbfb8031SShannon Nelson };
1563fbfb8031SShannon Nelson 
1564fbfb8031SShannon Nelson /**
15655c28f213SShannon Nelson  * struct ionic_port_getattr_comp - Port get attr command completion
1566c4e7a75aSShannon Nelson  * @status:         Status of the command (enum ionic_status_code)
1567c4e7a75aSShannon Nelson  * @state:          Port state
1568c4e7a75aSShannon Nelson  * @speed:          Port speed
1569c4e7a75aSShannon Nelson  * @mtu:            Port MTU
1570c4e7a75aSShannon Nelson  * @an_enable:      Port autonegotiation setting
1571c4e7a75aSShannon Nelson  * @fec_type:       Port FEC type setting
1572c4e7a75aSShannon Nelson  * @pause_type:     Port pause type setting
1573c4e7a75aSShannon Nelson  * @loopback_mode:  Port loopback mode
1574fbfb8031SShannon Nelson  * @color:          Color bit
1575fbfb8031SShannon Nelson  */
1576fbfb8031SShannon Nelson struct ionic_port_getattr_comp {
1577fbfb8031SShannon Nelson 	u8     status;
1578fbfb8031SShannon Nelson 	u8     rsvd[3];
1579fbfb8031SShannon Nelson 	union {
1580fbfb8031SShannon Nelson 		u8      state;
1581fbfb8031SShannon Nelson 		__le32  speed;
1582fbfb8031SShannon Nelson 		__le32  mtu;
1583fbfb8031SShannon Nelson 		u8      an_enable;
1584fbfb8031SShannon Nelson 		u8      fec_type;
1585fbfb8031SShannon Nelson 		u8      pause_type;
1586fbfb8031SShannon Nelson 		u8      loopback_mode;
1587fbfb8031SShannon Nelson 		u8      rsvd2[11];
15885dca69c4SShannon Nelson 	} __packed;
1589fbfb8031SShannon Nelson 	u8     color;
1590fbfb8031SShannon Nelson };
1591fbfb8031SShannon Nelson 
1592fbfb8031SShannon Nelson /**
1593c4e7a75aSShannon Nelson  * struct ionic_lif_status - LIF status register
1594fbfb8031SShannon Nelson  * @eid:             most recent NotifyQ event id
1595c4e7a75aSShannon Nelson  * @port_num:        port the LIF is connected to
15965c28f213SShannon Nelson  * @link_status:     port status (enum ionic_port_oper_status)
1597fbfb8031SShannon Nelson  * @link_speed:      speed of link in Mbps
1598c4e7a75aSShannon Nelson  * @link_down_count: number of times link went from up to down
1599fbfb8031SShannon Nelson  */
1600fbfb8031SShannon Nelson struct ionic_lif_status {
1601fbfb8031SShannon Nelson 	__le64 eid;
1602fbfb8031SShannon Nelson 	u8     port_num;
1603fbfb8031SShannon Nelson 	u8     rsvd;
1604fbfb8031SShannon Nelson 	__le16 link_status;
1605fbfb8031SShannon Nelson 	__le32 link_speed;		/* units of 1Mbps: eg 10000 = 10Gbps */
1606fbfb8031SShannon Nelson 	__le16 link_down_count;
1607fbfb8031SShannon Nelson 	u8      rsvd2[46];
1608fbfb8031SShannon Nelson };
1609fbfb8031SShannon Nelson 
1610fbfb8031SShannon Nelson /**
16115c28f213SShannon Nelson  * struct ionic_lif_reset_cmd - LIF reset command
1612fbfb8031SShannon Nelson  * @opcode:    opcode
1613fbfb8031SShannon Nelson  * @index:     LIF index
1614fbfb8031SShannon Nelson  */
1615fbfb8031SShannon Nelson struct ionic_lif_reset_cmd {
1616fbfb8031SShannon Nelson 	u8     opcode;
1617fbfb8031SShannon Nelson 	u8     rsvd;
1618fbfb8031SShannon Nelson 	__le16 index;
1619fbfb8031SShannon Nelson 	__le32 rsvd2[15];
1620fbfb8031SShannon Nelson };
1621fbfb8031SShannon Nelson 
1622fbfb8031SShannon Nelson typedef struct ionic_admin_comp ionic_lif_reset_comp;
1623fbfb8031SShannon Nelson 
1624fbfb8031SShannon Nelson enum ionic_dev_state {
1625fbfb8031SShannon Nelson 	IONIC_DEV_DISABLE	= 0,
1626fbfb8031SShannon Nelson 	IONIC_DEV_ENABLE	= 1,
1627fbfb8031SShannon Nelson 	IONIC_DEV_HANG_RESET	= 2,
1628fbfb8031SShannon Nelson };
1629fbfb8031SShannon Nelson 
1630fbfb8031SShannon Nelson /**
16315c28f213SShannon Nelson  * enum ionic_dev_attr - List of device attributes
1632c4e7a75aSShannon Nelson  * @IONIC_DEV_ATTR_STATE:     Device state attribute
1633c4e7a75aSShannon Nelson  * @IONIC_DEV_ATTR_NAME:      Device name attribute
1634c4e7a75aSShannon Nelson  * @IONIC_DEV_ATTR_FEATURES:  Device feature attributes
1635fbfb8031SShannon Nelson  */
1636fbfb8031SShannon Nelson enum ionic_dev_attr {
1637fbfb8031SShannon Nelson 	IONIC_DEV_ATTR_STATE    = 0,
1638fbfb8031SShannon Nelson 	IONIC_DEV_ATTR_NAME     = 1,
1639fbfb8031SShannon Nelson 	IONIC_DEV_ATTR_FEATURES = 2,
1640fbfb8031SShannon Nelson };
1641fbfb8031SShannon Nelson 
1642fbfb8031SShannon Nelson /**
16435c28f213SShannon Nelson  * struct ionic_dev_setattr_cmd - Set Device attributes on the NIC
1644fbfb8031SShannon Nelson  * @opcode:     Opcode
16455c28f213SShannon Nelson  * @attr:       Attribute type (enum ionic_dev_attr)
16465c28f213SShannon Nelson  * @state:      Device state (enum ionic_dev_state)
1647fbfb8031SShannon Nelson  * @name:       The bus info, e.g. PCI slot-device-function, 0 terminated
1648fbfb8031SShannon Nelson  * @features:   Device features
1649fbfb8031SShannon Nelson  */
1650fbfb8031SShannon Nelson struct ionic_dev_setattr_cmd {
1651fbfb8031SShannon Nelson 	u8     opcode;
1652fbfb8031SShannon Nelson 	u8     attr;
1653fbfb8031SShannon Nelson 	__le16 rsvd;
1654fbfb8031SShannon Nelson 	union {
1655fbfb8031SShannon Nelson 		u8      state;
1656fbfb8031SShannon Nelson 		char    name[IONIC_IFNAMSIZ];
1657fbfb8031SShannon Nelson 		__le64  features;
1658fbfb8031SShannon Nelson 		u8      rsvd2[60];
16595dca69c4SShannon Nelson 	} __packed;
1660fbfb8031SShannon Nelson };
1661fbfb8031SShannon Nelson 
1662fbfb8031SShannon Nelson /**
16635c28f213SShannon Nelson  * struct ionic_dev_setattr_comp - Device set attr command completion
1664c4e7a75aSShannon Nelson  * @status:     Status of the command (enum ionic_status_code)
1665fbfb8031SShannon Nelson  * @features:   Device features
1666fbfb8031SShannon Nelson  * @color:      Color bit
1667fbfb8031SShannon Nelson  */
1668fbfb8031SShannon Nelson struct ionic_dev_setattr_comp {
1669fbfb8031SShannon Nelson 	u8     status;
1670fbfb8031SShannon Nelson 	u8     rsvd[3];
1671fbfb8031SShannon Nelson 	union {
1672fbfb8031SShannon Nelson 		__le64  features;
1673fbfb8031SShannon Nelson 		u8      rsvd2[11];
16745dca69c4SShannon Nelson 	} __packed;
1675fbfb8031SShannon Nelson 	u8     color;
1676fbfb8031SShannon Nelson };
1677fbfb8031SShannon Nelson 
1678fbfb8031SShannon Nelson /**
16795c28f213SShannon Nelson  * struct ionic_dev_getattr_cmd - Get Device attributes from the NIC
1680fbfb8031SShannon Nelson  * @opcode:     opcode
16815c28f213SShannon Nelson  * @attr:       Attribute type (enum ionic_dev_attr)
1682fbfb8031SShannon Nelson  */
1683fbfb8031SShannon Nelson struct ionic_dev_getattr_cmd {
1684fbfb8031SShannon Nelson 	u8     opcode;
1685fbfb8031SShannon Nelson 	u8     attr;
1686fbfb8031SShannon Nelson 	u8     rsvd[62];
1687fbfb8031SShannon Nelson };
1688fbfb8031SShannon Nelson 
1689fbfb8031SShannon Nelson /**
16905c28f213SShannon Nelson  * struct ionic_dev_setattr_comp - Device set attr command completion
1691c4e7a75aSShannon Nelson  * @status:     Status of the command (enum ionic_status_code)
1692fbfb8031SShannon Nelson  * @features:   Device features
1693fbfb8031SShannon Nelson  * @color:      Color bit
1694fbfb8031SShannon Nelson  */
1695fbfb8031SShannon Nelson struct ionic_dev_getattr_comp {
1696fbfb8031SShannon Nelson 	u8     status;
1697fbfb8031SShannon Nelson 	u8     rsvd[3];
1698fbfb8031SShannon Nelson 	union {
1699fbfb8031SShannon Nelson 		__le64  features;
1700fbfb8031SShannon Nelson 		u8      rsvd2[11];
17015dca69c4SShannon Nelson 	} __packed;
1702fbfb8031SShannon Nelson 	u8     color;
1703fbfb8031SShannon Nelson };
1704fbfb8031SShannon Nelson 
1705fbfb8031SShannon Nelson /**
1706fbfb8031SShannon Nelson  * RSS parameters
1707fbfb8031SShannon Nelson  */
1708fbfb8031SShannon Nelson #define IONIC_RSS_HASH_KEY_SIZE		40
1709fbfb8031SShannon Nelson 
1710fbfb8031SShannon Nelson enum ionic_rss_hash_types {
1711fbfb8031SShannon Nelson 	IONIC_RSS_TYPE_IPV4	= BIT(0),
1712fbfb8031SShannon Nelson 	IONIC_RSS_TYPE_IPV4_TCP	= BIT(1),
1713fbfb8031SShannon Nelson 	IONIC_RSS_TYPE_IPV4_UDP	= BIT(2),
1714fbfb8031SShannon Nelson 	IONIC_RSS_TYPE_IPV6	= BIT(3),
1715fbfb8031SShannon Nelson 	IONIC_RSS_TYPE_IPV6_TCP	= BIT(4),
1716fbfb8031SShannon Nelson 	IONIC_RSS_TYPE_IPV6_UDP	= BIT(5),
1717fbfb8031SShannon Nelson };
1718fbfb8031SShannon Nelson 
1719fbfb8031SShannon Nelson /**
17205c28f213SShannon Nelson  * enum ionic_lif_attr - List of LIF attributes
1721c4e7a75aSShannon Nelson  * @IONIC_LIF_ATTR_STATE:       LIF state attribute
1722c4e7a75aSShannon Nelson  * @IONIC_LIF_ATTR_NAME:        LIF name attribute
1723c4e7a75aSShannon Nelson  * @IONIC_LIF_ATTR_MTU:         LIF MTU attribute
1724c4e7a75aSShannon Nelson  * @IONIC_LIF_ATTR_MAC:         LIF MAC attribute
1725c4e7a75aSShannon Nelson  * @IONIC_LIF_ATTR_FEATURES:    LIF features attribute
1726c4e7a75aSShannon Nelson  * @IONIC_LIF_ATTR_RSS:         LIF RSS attribute
1727c4e7a75aSShannon Nelson  * @IONIC_LIF_ATTR_STATS_CTRL:  LIF statistics control attribute
17283da25843SShannon Nelson  * @IONIC_LIF_ATTR_TXSTAMP:     LIF TX timestamping mode
1729fbfb8031SShannon Nelson  */
1730fbfb8031SShannon Nelson enum ionic_lif_attr {
1731fbfb8031SShannon Nelson 	IONIC_LIF_ATTR_STATE        = 0,
1732fbfb8031SShannon Nelson 	IONIC_LIF_ATTR_NAME         = 1,
1733fbfb8031SShannon Nelson 	IONIC_LIF_ATTR_MTU          = 2,
1734fbfb8031SShannon Nelson 	IONIC_LIF_ATTR_MAC          = 3,
1735fbfb8031SShannon Nelson 	IONIC_LIF_ATTR_FEATURES     = 4,
1736fbfb8031SShannon Nelson 	IONIC_LIF_ATTR_RSS          = 5,
1737fbfb8031SShannon Nelson 	IONIC_LIF_ATTR_STATS_CTRL   = 6,
17383da25843SShannon Nelson 	IONIC_LIF_ATTR_TXSTAMP      = 7,
1739fbfb8031SShannon Nelson };
1740fbfb8031SShannon Nelson 
1741fbfb8031SShannon Nelson /**
17425c28f213SShannon Nelson  * struct ionic_lif_setattr_cmd - Set LIF attributes on the NIC
1743fbfb8031SShannon Nelson  * @opcode:     Opcode
1744c4e7a75aSShannon Nelson  * @attr:       Attribute type (enum ionic_lif_attr)
1745fbfb8031SShannon Nelson  * @index:      LIF index
1746c4e7a75aSShannon Nelson  * @state:      LIF state (enum ionic_lif_state)
1747fbfb8031SShannon Nelson  * @name:       The netdev name string, 0 terminated
1748fbfb8031SShannon Nelson  * @mtu:        Mtu
1749fbfb8031SShannon Nelson  * @mac:        Station mac
17505c28f213SShannon Nelson  * @features:   Features (enum ionic_eth_hw_features)
1751fbfb8031SShannon Nelson  * @rss:        RSS properties
1752c4e7a75aSShannon Nelson  *              @types:     The hash types to enable (see rss_hash_types)
1753c4e7a75aSShannon Nelson  *              @key:       The hash secret key
1754c4e7a75aSShannon Nelson  *              @addr:      Address for the indirection table shared memory
1755c4e7a75aSShannon Nelson  * @stats_ctl:  stats control commands (enum ionic_stats_ctl_cmd)
17563da25843SShannon Nelson  * @txstamp:    TX Timestamping Mode (enum ionic_txstamp_mode)
1757fbfb8031SShannon Nelson  */
1758fbfb8031SShannon Nelson struct ionic_lif_setattr_cmd {
1759fbfb8031SShannon Nelson 	u8     opcode;
1760fbfb8031SShannon Nelson 	u8     attr;
1761fbfb8031SShannon Nelson 	__le16 index;
1762fbfb8031SShannon Nelson 	union {
1763fbfb8031SShannon Nelson 		u8      state;
1764fbfb8031SShannon Nelson 		char    name[IONIC_IFNAMSIZ];
1765fbfb8031SShannon Nelson 		__le32  mtu;
1766fbfb8031SShannon Nelson 		u8      mac[6];
1767fbfb8031SShannon Nelson 		__le64  features;
1768fbfb8031SShannon Nelson 		struct {
1769fbfb8031SShannon Nelson 			__le16 types;
1770fbfb8031SShannon Nelson 			u8     key[IONIC_RSS_HASH_KEY_SIZE];
1771fbfb8031SShannon Nelson 			u8     rsvd[6];
1772fbfb8031SShannon Nelson 			__le64 addr;
1773fbfb8031SShannon Nelson 		} rss;
1774fbfb8031SShannon Nelson 		u8      stats_ctl;
17753da25843SShannon Nelson 		__le16 txstamp_mode;
1776fbfb8031SShannon Nelson 		u8      rsvd[60];
17775dca69c4SShannon Nelson 	} __packed;
1778fbfb8031SShannon Nelson };
1779fbfb8031SShannon Nelson 
1780fbfb8031SShannon Nelson /**
17815c28f213SShannon Nelson  * struct ionic_lif_setattr_comp - LIF set attr command completion
1782c4e7a75aSShannon Nelson  * @status:     Status of the command (enum ionic_status_code)
1783c4e7a75aSShannon Nelson  * @comp_index: Index in the descriptor ring for which this is the completion
17845c28f213SShannon Nelson  * @features:   features (enum ionic_eth_hw_features)
1785fbfb8031SShannon Nelson  * @color:      Color bit
1786fbfb8031SShannon Nelson  */
1787fbfb8031SShannon Nelson struct ionic_lif_setattr_comp {
1788fbfb8031SShannon Nelson 	u8     status;
1789fbfb8031SShannon Nelson 	u8     rsvd;
1790fbfb8031SShannon Nelson 	__le16 comp_index;
1791fbfb8031SShannon Nelson 	union {
1792fbfb8031SShannon Nelson 		__le64  features;
1793fbfb8031SShannon Nelson 		u8      rsvd2[11];
17945dca69c4SShannon Nelson 	} __packed;
1795fbfb8031SShannon Nelson 	u8     color;
1796fbfb8031SShannon Nelson };
1797fbfb8031SShannon Nelson 
1798fbfb8031SShannon Nelson /**
17995c28f213SShannon Nelson  * struct ionic_lif_getattr_cmd - Get LIF attributes from the NIC
1800fbfb8031SShannon Nelson  * @opcode:     Opcode
18015c28f213SShannon Nelson  * @attr:       Attribute type (enum ionic_lif_attr)
1802fbfb8031SShannon Nelson  * @index:      LIF index
1803fbfb8031SShannon Nelson  */
1804fbfb8031SShannon Nelson struct ionic_lif_getattr_cmd {
1805fbfb8031SShannon Nelson 	u8     opcode;
1806fbfb8031SShannon Nelson 	u8     attr;
1807fbfb8031SShannon Nelson 	__le16 index;
1808fbfb8031SShannon Nelson 	u8     rsvd[60];
1809fbfb8031SShannon Nelson };
1810fbfb8031SShannon Nelson 
1811fbfb8031SShannon Nelson /**
18125c28f213SShannon Nelson  * struct ionic_lif_getattr_comp - LIF get attr command completion
1813c4e7a75aSShannon Nelson  * @status:     Status of the command (enum ionic_status_code)
1814c4e7a75aSShannon Nelson  * @comp_index: Index in the descriptor ring for which this is the completion
1815c4e7a75aSShannon Nelson  * @state:      LIF state (enum ionic_lif_state)
1816fbfb8031SShannon Nelson  * @name:       The netdev name string, 0 terminated
1817fbfb8031SShannon Nelson  * @mtu:        Mtu
1818fbfb8031SShannon Nelson  * @mac:        Station mac
18195c28f213SShannon Nelson  * @features:   Features (enum ionic_eth_hw_features)
18203da25843SShannon Nelson  * @txstamp:    TX Timestamping Mode (enum ionic_txstamp_mode)
1821fbfb8031SShannon Nelson  * @color:      Color bit
1822fbfb8031SShannon Nelson  */
1823fbfb8031SShannon Nelson struct ionic_lif_getattr_comp {
1824fbfb8031SShannon Nelson 	u8     status;
1825fbfb8031SShannon Nelson 	u8     rsvd;
1826fbfb8031SShannon Nelson 	__le16 comp_index;
1827fbfb8031SShannon Nelson 	union {
1828fbfb8031SShannon Nelson 		u8      state;
1829fbfb8031SShannon Nelson 		__le32  mtu;
1830fbfb8031SShannon Nelson 		u8      mac[6];
1831fbfb8031SShannon Nelson 		__le64  features;
18323da25843SShannon Nelson 		__le16  txstamp_mode;
1833fbfb8031SShannon Nelson 		u8      rsvd2[11];
18345dca69c4SShannon Nelson 	} __packed;
1835fbfb8031SShannon Nelson 	u8     color;
1836fbfb8031SShannon Nelson };
1837fbfb8031SShannon Nelson 
18383da25843SShannon Nelson /**
18393da25843SShannon Nelson  * struct ionic_lif_setphc_cmd - Set LIF PTP Hardware Clock
18403da25843SShannon Nelson  * @opcode:     Opcode
18413da25843SShannon Nelson  * @lif_index:  LIF index
18423da25843SShannon Nelson  * @tick:       Hardware stamp tick of an instant in time.
18433da25843SShannon Nelson  * @nsec:       Nanosecond stamp of the same instant.
18443da25843SShannon Nelson  * @frac:       Fractional nanoseconds at the same instant.
18453da25843SShannon Nelson  * @mult:       Cycle to nanosecond multiplier.
18463da25843SShannon Nelson  * @shift:      Cycle to nanosecond divisor (power of two).
18473da25843SShannon Nelson  */
18483da25843SShannon Nelson struct ionic_lif_setphc_cmd {
18493da25843SShannon Nelson 	u8	opcode;
18503da25843SShannon Nelson 	u8	rsvd1;
18513da25843SShannon Nelson 	__le16  lif_index;
18523da25843SShannon Nelson 	u8      rsvd2[4];
18533da25843SShannon Nelson 	__le64	tick;
18543da25843SShannon Nelson 	__le64	nsec;
18553da25843SShannon Nelson 	__le64	frac;
18563da25843SShannon Nelson 	__le32	mult;
18573da25843SShannon Nelson 	__le32	shift;
18583da25843SShannon Nelson 	u8     rsvd3[24];
18593da25843SShannon Nelson };
18603da25843SShannon Nelson 
1861fbfb8031SShannon Nelson enum ionic_rx_mode {
1862fbfb8031SShannon Nelson 	IONIC_RX_MODE_F_UNICAST		= BIT(0),
1863fbfb8031SShannon Nelson 	IONIC_RX_MODE_F_MULTICAST	= BIT(1),
1864fbfb8031SShannon Nelson 	IONIC_RX_MODE_F_BROADCAST	= BIT(2),
1865fbfb8031SShannon Nelson 	IONIC_RX_MODE_F_PROMISC		= BIT(3),
1866fbfb8031SShannon Nelson 	IONIC_RX_MODE_F_ALLMULTI	= BIT(4),
1867c4e7a75aSShannon Nelson 	IONIC_RX_MODE_F_RDMA_SNIFFER	= BIT(5),
1868fbfb8031SShannon Nelson };
1869fbfb8031SShannon Nelson 
1870fbfb8031SShannon Nelson /**
18715c28f213SShannon Nelson  * struct ionic_rx_mode_set_cmd - Set LIF's Rx mode command
1872fbfb8031SShannon Nelson  * @opcode:     opcode
1873fbfb8031SShannon Nelson  * @lif_index:  LIF index
1874fbfb8031SShannon Nelson  * @rx_mode:    Rx mode flags:
1875c4e7a75aSShannon Nelson  *                  IONIC_RX_MODE_F_UNICAST: Accept known unicast packets
1876c4e7a75aSShannon Nelson  *                  IONIC_RX_MODE_F_MULTICAST: Accept known multicast packets
1877c4e7a75aSShannon Nelson  *                  IONIC_RX_MODE_F_BROADCAST: Accept broadcast packets
1878c4e7a75aSShannon Nelson  *                  IONIC_RX_MODE_F_PROMISC: Accept any packets
1879c4e7a75aSShannon Nelson  *                  IONIC_RX_MODE_F_ALLMULTI: Accept any multicast packets
1880c4e7a75aSShannon Nelson  *                  IONIC_RX_MODE_F_RDMA_SNIFFER: Sniff RDMA packets
1881fbfb8031SShannon Nelson  */
1882fbfb8031SShannon Nelson struct ionic_rx_mode_set_cmd {
1883fbfb8031SShannon Nelson 	u8     opcode;
1884fbfb8031SShannon Nelson 	u8     rsvd;
1885fbfb8031SShannon Nelson 	__le16 lif_index;
1886fbfb8031SShannon Nelson 	__le16 rx_mode;
1887fbfb8031SShannon Nelson 	__le16 rsvd2[29];
1888fbfb8031SShannon Nelson };
1889fbfb8031SShannon Nelson 
1890fbfb8031SShannon Nelson typedef struct ionic_admin_comp ionic_rx_mode_set_comp;
1891fbfb8031SShannon Nelson 
1892fbfb8031SShannon Nelson enum ionic_rx_filter_match_type {
18933da25843SShannon Nelson 	IONIC_RX_FILTER_MATCH_VLAN	= 0x0,
18943da25843SShannon Nelson 	IONIC_RX_FILTER_MATCH_MAC	= 0x1,
18953da25843SShannon Nelson 	IONIC_RX_FILTER_MATCH_MAC_VLAN	= 0x2,
18963da25843SShannon Nelson 	IONIC_RX_FILTER_STEER_PKTCLASS	= 0x10,
1897fbfb8031SShannon Nelson };
1898fbfb8031SShannon Nelson 
1899fbfb8031SShannon Nelson /**
19005c28f213SShannon Nelson  * struct ionic_rx_filter_add_cmd - Add LIF Rx filter command
1901fbfb8031SShannon Nelson  * @opcode:     opcode
1902fbfb8031SShannon Nelson  * @qtype:      Queue type
1903fbfb8031SShannon Nelson  * @lif_index:  LIF index
1904fbfb8031SShannon Nelson  * @qid:        Queue ID
1905c4e7a75aSShannon Nelson  * @match:      Rx filter match type (see IONIC_RX_FILTER_MATCH_xxx)
1906c4e7a75aSShannon Nelson  * @vlan:       VLAN filter
1907c4e7a75aSShannon Nelson  *              @vlan:  VLAN ID
1908c4e7a75aSShannon Nelson  * @mac:        MAC filter
1909c4e7a75aSShannon Nelson  *              @addr:  MAC address (network-byte order)
1910c4e7a75aSShannon Nelson  * @mac_vlan:   MACVLAN filter
1911fbfb8031SShannon Nelson  *              @vlan:  VLAN ID
1912fbfb8031SShannon Nelson  *              @addr:  MAC address (network-byte order)
19133da25843SShannon Nelson  * @pkt_class:  Packet classification filter
1914fbfb8031SShannon Nelson  */
1915fbfb8031SShannon Nelson struct ionic_rx_filter_add_cmd {
1916fbfb8031SShannon Nelson 	u8     opcode;
1917fbfb8031SShannon Nelson 	u8     qtype;
1918fbfb8031SShannon Nelson 	__le16 lif_index;
1919fbfb8031SShannon Nelson 	__le32 qid;
1920fbfb8031SShannon Nelson 	__le16 match;
1921fbfb8031SShannon Nelson 	union {
1922fbfb8031SShannon Nelson 		struct {
1923fbfb8031SShannon Nelson 			__le16 vlan;
1924fbfb8031SShannon Nelson 		} vlan;
1925fbfb8031SShannon Nelson 		struct {
1926fbfb8031SShannon Nelson 			u8     addr[6];
1927fbfb8031SShannon Nelson 		} mac;
1928fbfb8031SShannon Nelson 		struct {
1929fbfb8031SShannon Nelson 			__le16 vlan;
1930fbfb8031SShannon Nelson 			u8     addr[6];
1931fbfb8031SShannon Nelson 		} mac_vlan;
19323da25843SShannon Nelson 		__le64 pkt_class;
1933fbfb8031SShannon Nelson 		u8 rsvd[54];
19343da25843SShannon Nelson 	} __packed;
1935fbfb8031SShannon Nelson };
1936fbfb8031SShannon Nelson 
1937fbfb8031SShannon Nelson /**
19385c28f213SShannon Nelson  * struct ionic_rx_filter_add_comp - Add LIF Rx filter command completion
1939c4e7a75aSShannon Nelson  * @status:     Status of the command (enum ionic_status_code)
1940c4e7a75aSShannon Nelson  * @comp_index: Index in the descriptor ring for which this is the completion
1941fbfb8031SShannon Nelson  * @filter_id:  Filter ID
1942c4e7a75aSShannon Nelson  * @color:      Color bit
1943fbfb8031SShannon Nelson  */
1944fbfb8031SShannon Nelson struct ionic_rx_filter_add_comp {
1945fbfb8031SShannon Nelson 	u8     status;
1946fbfb8031SShannon Nelson 	u8     rsvd;
1947fbfb8031SShannon Nelson 	__le16 comp_index;
1948fbfb8031SShannon Nelson 	__le32 filter_id;
1949fbfb8031SShannon Nelson 	u8     rsvd2[7];
1950fbfb8031SShannon Nelson 	u8     color;
1951fbfb8031SShannon Nelson };
1952fbfb8031SShannon Nelson 
1953fbfb8031SShannon Nelson /**
19545c28f213SShannon Nelson  * struct ionic_rx_filter_del_cmd - Delete LIF Rx filter command
1955fbfb8031SShannon Nelson  * @opcode:     opcode
1956fbfb8031SShannon Nelson  * @lif_index:  LIF index
1957fbfb8031SShannon Nelson  * @filter_id:  Filter ID
1958fbfb8031SShannon Nelson  */
1959fbfb8031SShannon Nelson struct ionic_rx_filter_del_cmd {
1960fbfb8031SShannon Nelson 	u8     opcode;
1961fbfb8031SShannon Nelson 	u8     rsvd;
1962fbfb8031SShannon Nelson 	__le16 lif_index;
1963fbfb8031SShannon Nelson 	__le32 filter_id;
1964fbfb8031SShannon Nelson 	u8     rsvd2[56];
1965fbfb8031SShannon Nelson };
1966fbfb8031SShannon Nelson 
1967fbfb8031SShannon Nelson typedef struct ionic_admin_comp ionic_rx_filter_del_comp;
1968fbfb8031SShannon Nelson 
19693d462ce2SShannon Nelson enum ionic_vf_attr {
19703d462ce2SShannon Nelson 	IONIC_VF_ATTR_SPOOFCHK	= 1,
19713d462ce2SShannon Nelson 	IONIC_VF_ATTR_TRUST	= 2,
19723d462ce2SShannon Nelson 	IONIC_VF_ATTR_MAC	= 3,
19733d462ce2SShannon Nelson 	IONIC_VF_ATTR_LINKSTATE	= 4,
19743d462ce2SShannon Nelson 	IONIC_VF_ATTR_VLAN	= 5,
19753d462ce2SShannon Nelson 	IONIC_VF_ATTR_RATE	= 6,
19763d462ce2SShannon Nelson 	IONIC_VF_ATTR_STATSADDR	= 7,
19773d462ce2SShannon Nelson };
19783d462ce2SShannon Nelson 
19793d462ce2SShannon Nelson /**
1980c4e7a75aSShannon Nelson  * enum ionic_vf_link_status - Virtual Function link status
1981c4e7a75aSShannon Nelson  * @IONIC_VF_LINK_STATUS_AUTO:   Use link state of the uplink
1982c4e7a75aSShannon Nelson  * @IONIC_VF_LINK_STATUS_UP:     Link always up
1983c4e7a75aSShannon Nelson  * @IONIC_VF_LINK_STATUS_DOWN:   Link always down
19843d462ce2SShannon Nelson  */
19853d462ce2SShannon Nelson enum ionic_vf_link_status {
1986c4e7a75aSShannon Nelson 	IONIC_VF_LINK_STATUS_AUTO = 0,
1987c4e7a75aSShannon Nelson 	IONIC_VF_LINK_STATUS_UP   = 1,
1988c4e7a75aSShannon Nelson 	IONIC_VF_LINK_STATUS_DOWN = 2,
19893d462ce2SShannon Nelson };
19903d462ce2SShannon Nelson 
19913d462ce2SShannon Nelson /**
19923d462ce2SShannon Nelson  * struct ionic_vf_setattr_cmd - Set VF attributes on the NIC
19933d462ce2SShannon Nelson  * @opcode:     Opcode
19943d462ce2SShannon Nelson  * @attr:       Attribute type (enum ionic_vf_attr)
1995c4e7a75aSShannon Nelson  * @vf_index:   VF index
1996c4e7a75aSShannon Nelson  *	@macaddr:	mac address
1997c4e7a75aSShannon Nelson  *	@vlanid:	vlan ID
1998c4e7a75aSShannon Nelson  *	@maxrate:	max Tx rate in Mbps
1999c4e7a75aSShannon Nelson  *	@spoofchk:	enable address spoof checking
2000c4e7a75aSShannon Nelson  *	@trust:		enable VF trust
2001c4e7a75aSShannon Nelson  *	@linkstate:	set link up or down
2002c4e7a75aSShannon Nelson  *	@stats_pa:	set DMA address for VF stats
20033d462ce2SShannon Nelson  */
20043d462ce2SShannon Nelson struct ionic_vf_setattr_cmd {
20053d462ce2SShannon Nelson 	u8     opcode;
20063d462ce2SShannon Nelson 	u8     attr;
20073d462ce2SShannon Nelson 	__le16 vf_index;
20083d462ce2SShannon Nelson 	union {
20093d462ce2SShannon Nelson 		u8     macaddr[6];
20103d462ce2SShannon Nelson 		__le16 vlanid;
20113d462ce2SShannon Nelson 		__le32 maxrate;
20123d462ce2SShannon Nelson 		u8     spoofchk;
20133d462ce2SShannon Nelson 		u8     trust;
20143d462ce2SShannon Nelson 		u8     linkstate;
20153d462ce2SShannon Nelson 		__le64 stats_pa;
20163d462ce2SShannon Nelson 		u8     pad[60];
20175dca69c4SShannon Nelson 	} __packed;
20183d462ce2SShannon Nelson };
20193d462ce2SShannon Nelson 
20203d462ce2SShannon Nelson struct ionic_vf_setattr_comp {
20213d462ce2SShannon Nelson 	u8     status;
20223d462ce2SShannon Nelson 	u8     attr;
20233d462ce2SShannon Nelson 	__le16 vf_index;
20243d462ce2SShannon Nelson 	__le16 comp_index;
20253d462ce2SShannon Nelson 	u8     rsvd[9];
20263d462ce2SShannon Nelson 	u8     color;
20273d462ce2SShannon Nelson };
20283d462ce2SShannon Nelson 
20293d462ce2SShannon Nelson /**
20303d462ce2SShannon Nelson  * struct ionic_vf_getattr_cmd - Get VF attributes from the NIC
20313d462ce2SShannon Nelson  * @opcode:     Opcode
20323d462ce2SShannon Nelson  * @attr:       Attribute type (enum ionic_vf_attr)
2033c4e7a75aSShannon Nelson  * @vf_index:   VF index
20343d462ce2SShannon Nelson  */
20353d462ce2SShannon Nelson struct ionic_vf_getattr_cmd {
20363d462ce2SShannon Nelson 	u8     opcode;
20373d462ce2SShannon Nelson 	u8     attr;
20383d462ce2SShannon Nelson 	__le16 vf_index;
20393d462ce2SShannon Nelson 	u8     rsvd[60];
20403d462ce2SShannon Nelson };
20413d462ce2SShannon Nelson 
20423d462ce2SShannon Nelson struct ionic_vf_getattr_comp {
20433d462ce2SShannon Nelson 	u8     status;
20443d462ce2SShannon Nelson 	u8     attr;
20453d462ce2SShannon Nelson 	__le16 vf_index;
20463d462ce2SShannon Nelson 	union {
20473d462ce2SShannon Nelson 		u8     macaddr[6];
20483d462ce2SShannon Nelson 		__le16 vlanid;
20493d462ce2SShannon Nelson 		__le32 maxrate;
20503d462ce2SShannon Nelson 		u8     spoofchk;
20513d462ce2SShannon Nelson 		u8     trust;
20523d462ce2SShannon Nelson 		u8     linkstate;
20533d462ce2SShannon Nelson 		__le64 stats_pa;
20543d462ce2SShannon Nelson 		u8     pad[11];
20555dca69c4SShannon Nelson 	} __packed;
20563d462ce2SShannon Nelson 	u8     color;
20573d462ce2SShannon Nelson };
20583d462ce2SShannon Nelson 
2059f43a96d9SShannon Nelson enum ionic_vf_ctrl_opcode {
2060f43a96d9SShannon Nelson 	IONIC_VF_CTRL_START_ALL	= 0,
2061f43a96d9SShannon Nelson 	IONIC_VF_CTRL_START	= 1,
2062f43a96d9SShannon Nelson };
2063f43a96d9SShannon Nelson 
2064f43a96d9SShannon Nelson /**
2065f43a96d9SShannon Nelson  * struct ionic_vf_ctrl_cmd - VF control command
2066f43a96d9SShannon Nelson  * @opcode:         Opcode for the command
2067f43a96d9SShannon Nelson  * @vf_index:       VF Index. It is unused if op START_ALL is used.
2068f43a96d9SShannon Nelson  * @ctrl_opcode:    VF control operation type
2069f43a96d9SShannon Nelson  */
2070f43a96d9SShannon Nelson struct ionic_vf_ctrl_cmd {
2071f43a96d9SShannon Nelson 	u8	opcode;
2072f43a96d9SShannon Nelson 	u8	ctrl_opcode;
2073f43a96d9SShannon Nelson 	__le16	vf_index;
2074f43a96d9SShannon Nelson 	/* private: */
2075f43a96d9SShannon Nelson 	u8	rsvd1[60];
2076f43a96d9SShannon Nelson };
2077f43a96d9SShannon Nelson 
2078f43a96d9SShannon Nelson /**
2079f43a96d9SShannon Nelson  * struct ionic_vf_ctrl_comp - VF_CTRL command completion.
2080f43a96d9SShannon Nelson  * @status:     Status of the command (enum ionic_status_code)
2081f43a96d9SShannon Nelson  */
2082f43a96d9SShannon Nelson struct ionic_vf_ctrl_comp {
2083f43a96d9SShannon Nelson 	u8	status;
2084f43a96d9SShannon Nelson 	/* private: */
2085f43a96d9SShannon Nelson 	u8      rsvd[15];
2086f43a96d9SShannon Nelson };
2087f43a96d9SShannon Nelson 
2088fbfb8031SShannon Nelson /**
2089c4e7a75aSShannon Nelson  * struct ionic_qos_identify_cmd - QoS identify command
2090c4e7a75aSShannon Nelson  * @opcode:  opcode
2091c4e7a75aSShannon Nelson  * @ver:     Highest version of identify supported by driver
2092c4e7a75aSShannon Nelson  *
2093c4e7a75aSShannon Nelson  */
2094c4e7a75aSShannon Nelson struct ionic_qos_identify_cmd {
2095c4e7a75aSShannon Nelson 	u8 opcode;
2096c4e7a75aSShannon Nelson 	u8 ver;
2097c4e7a75aSShannon Nelson 	u8 rsvd[62];
2098c4e7a75aSShannon Nelson };
2099c4e7a75aSShannon Nelson 
2100c4e7a75aSShannon Nelson /**
2101c4e7a75aSShannon Nelson  * struct ionic_qos_identify_comp - QoS identify command completion
2102c4e7a75aSShannon Nelson  * @status: Status of the command (enum ionic_status_code)
2103c4e7a75aSShannon Nelson  * @ver:    Version of identify returned by device
2104c4e7a75aSShannon Nelson  */
2105c4e7a75aSShannon Nelson struct ionic_qos_identify_comp {
2106c4e7a75aSShannon Nelson 	u8 status;
2107c4e7a75aSShannon Nelson 	u8 ver;
2108c4e7a75aSShannon Nelson 	u8 rsvd[14];
2109c4e7a75aSShannon Nelson };
2110c4e7a75aSShannon Nelson 
2111c4e7a75aSShannon Nelson #define IONIC_QOS_TC_MAX		8
21121b897e7dSShannon Nelson #define IONIC_QOS_ALL_TC		0xFF
2113c4e7a75aSShannon Nelson /* Capri max supported, should be renamed. */
2114c4e7a75aSShannon Nelson #define IONIC_QOS_CLASS_MAX		7
2115c4e7a75aSShannon Nelson #define IONIC_QOS_PCP_MAX		8
2116c4e7a75aSShannon Nelson #define IONIC_QOS_CLASS_NAME_SZ	32
2117c4e7a75aSShannon Nelson #define IONIC_QOS_DSCP_MAX		64
2118c4e7a75aSShannon Nelson #define IONIC_QOS_ALL_PCP		0xFF
21191b897e7dSShannon Nelson #define IONIC_DSCP_BLOCK_SIZE		8
2120c4e7a75aSShannon Nelson 
2121c4e7a75aSShannon Nelson /**
2122c4e7a75aSShannon Nelson  * enum ionic_qos_class
2123c4e7a75aSShannon Nelson  */
2124c4e7a75aSShannon Nelson enum ionic_qos_class {
2125c4e7a75aSShannon Nelson 	IONIC_QOS_CLASS_DEFAULT		= 0,
2126c4e7a75aSShannon Nelson 	IONIC_QOS_CLASS_USER_DEFINED_1	= 1,
2127c4e7a75aSShannon Nelson 	IONIC_QOS_CLASS_USER_DEFINED_2	= 2,
2128c4e7a75aSShannon Nelson 	IONIC_QOS_CLASS_USER_DEFINED_3	= 3,
2129c4e7a75aSShannon Nelson 	IONIC_QOS_CLASS_USER_DEFINED_4	= 4,
2130c4e7a75aSShannon Nelson 	IONIC_QOS_CLASS_USER_DEFINED_5	= 5,
2131c4e7a75aSShannon Nelson 	IONIC_QOS_CLASS_USER_DEFINED_6	= 6,
2132c4e7a75aSShannon Nelson };
2133c4e7a75aSShannon Nelson 
2134c4e7a75aSShannon Nelson /**
2135c4e7a75aSShannon Nelson  * enum ionic_qos_class_type - Traffic classification criteria
2136c4e7a75aSShannon Nelson  * @IONIC_QOS_CLASS_TYPE_NONE:    No QoS
2137c4e7a75aSShannon Nelson  * @IONIC_QOS_CLASS_TYPE_PCP:     Dot1Q PCP
2138c4e7a75aSShannon Nelson  * @IONIC_QOS_CLASS_TYPE_DSCP:    IP DSCP
2139c4e7a75aSShannon Nelson  */
2140c4e7a75aSShannon Nelson enum ionic_qos_class_type {
2141c4e7a75aSShannon Nelson 	IONIC_QOS_CLASS_TYPE_NONE	= 0,
2142c4e7a75aSShannon Nelson 	IONIC_QOS_CLASS_TYPE_PCP	= 1,
2143c4e7a75aSShannon Nelson 	IONIC_QOS_CLASS_TYPE_DSCP	= 2,
2144c4e7a75aSShannon Nelson };
2145c4e7a75aSShannon Nelson 
2146c4e7a75aSShannon Nelson /**
2147c4e7a75aSShannon Nelson  * enum ionic_qos_sched_type - QoS class scheduling type
2148c4e7a75aSShannon Nelson  * @IONIC_QOS_SCHED_TYPE_STRICT:  Strict priority
2149c4e7a75aSShannon Nelson  * @IONIC_QOS_SCHED_TYPE_DWRR:    Deficit weighted round-robin
2150c4e7a75aSShannon Nelson  */
2151c4e7a75aSShannon Nelson enum ionic_qos_sched_type {
2152c4e7a75aSShannon Nelson 	IONIC_QOS_SCHED_TYPE_STRICT	= 0,
2153c4e7a75aSShannon Nelson 	IONIC_QOS_SCHED_TYPE_DWRR	= 1,
2154c4e7a75aSShannon Nelson };
2155c4e7a75aSShannon Nelson 
2156c4e7a75aSShannon Nelson /**
2157c4e7a75aSShannon Nelson  * union ionic_qos_config - QoS configuration structure
2158fbfb8031SShannon Nelson  * @flags:		Configuration flags
2159fbfb8031SShannon Nelson  *	IONIC_QOS_CONFIG_F_ENABLE		enable
2160c4e7a75aSShannon Nelson  *	IONIC_QOS_CONFIG_F_NO_DROP		drop/nodrop
2161fbfb8031SShannon Nelson  *	IONIC_QOS_CONFIG_F_RW_DOT1Q_PCP		enable dot1q pcp rewrite
2162fbfb8031SShannon Nelson  *	IONIC_QOS_CONFIG_F_RW_IP_DSCP		enable ip dscp rewrite
21631b897e7dSShannon Nelson  *	IONIC_QOS_CONFIG_F_NON_DISRUPTIVE	Non-disruptive TC update
2164c4e7a75aSShannon Nelson  * @sched_type:		QoS class scheduling type (enum ionic_qos_sched_type)
2165c4e7a75aSShannon Nelson  * @class_type:		QoS class type (enum ionic_qos_class_type)
2166c4e7a75aSShannon Nelson  * @pause_type:		QoS pause type (enum ionic_qos_pause_type)
2167c4e7a75aSShannon Nelson  * @name:		QoS class name
2168fbfb8031SShannon Nelson  * @mtu:		MTU of the class
2169c4e7a75aSShannon Nelson  * @pfc_cos:		Priority-Flow Control class of service
2170c4e7a75aSShannon Nelson  * @dwrr_weight:	QoS class scheduling weight
2171fbfb8031SShannon Nelson  * @strict_rlmt:	Rate limit for strict priority scheduling
217225cc5a5fSShannon Nelson  * @rw_dot1q_pcp:	Rewrite dot1q pcp to value (valid iff F_RW_DOT1Q_PCP)
217325cc5a5fSShannon Nelson  * @rw_ip_dscp:		Rewrite ip dscp to value (valid iff F_RW_IP_DSCP)
2174fbfb8031SShannon Nelson  * @dot1q_pcp:		Dot1q pcp value
2175fbfb8031SShannon Nelson  * @ndscp:		Number of valid dscp values in the ip_dscp field
2176fbfb8031SShannon Nelson  * @ip_dscp:		IP dscp values
2177fbfb8031SShannon Nelson  */
2178fbfb8031SShannon Nelson union ionic_qos_config {
2179fbfb8031SShannon Nelson 	struct {
2180fbfb8031SShannon Nelson #define IONIC_QOS_CONFIG_F_ENABLE		BIT(0)
2181c4e7a75aSShannon Nelson #define IONIC_QOS_CONFIG_F_NO_DROP		BIT(1)
2182c4e7a75aSShannon Nelson /* Used to rewrite PCP or DSCP value. */
2183fbfb8031SShannon Nelson #define IONIC_QOS_CONFIG_F_RW_DOT1Q_PCP		BIT(2)
2184fbfb8031SShannon Nelson #define IONIC_QOS_CONFIG_F_RW_IP_DSCP		BIT(3)
21851b897e7dSShannon Nelson /* Non-disruptive TC update */
21861b897e7dSShannon Nelson #define IONIC_QOS_CONFIG_F_NON_DISRUPTIVE	BIT(4)
2187fbfb8031SShannon Nelson 		u8      flags;
2188fbfb8031SShannon Nelson 		u8      sched_type;
2189fbfb8031SShannon Nelson 		u8      class_type;
2190fbfb8031SShannon Nelson 		u8      pause_type;
2191fbfb8031SShannon Nelson 		char    name[IONIC_QOS_CLASS_NAME_SZ];
2192fbfb8031SShannon Nelson 		__le32  mtu;
2193fbfb8031SShannon Nelson 		/* flow control */
2194fbfb8031SShannon Nelson 		u8      pfc_cos;
2195fbfb8031SShannon Nelson 		/* scheduler */
2196fbfb8031SShannon Nelson 		union {
2197fbfb8031SShannon Nelson 			u8      dwrr_weight;
2198fbfb8031SShannon Nelson 			__le64  strict_rlmt;
2199fbfb8031SShannon Nelson 		};
2200fbfb8031SShannon Nelson 		/* marking */
2201c4e7a75aSShannon Nelson 		/* Used to rewrite PCP or DSCP value. */
2202fbfb8031SShannon Nelson 		union {
2203fbfb8031SShannon Nelson 			u8      rw_dot1q_pcp;
2204fbfb8031SShannon Nelson 			u8      rw_ip_dscp;
2205fbfb8031SShannon Nelson 		};
2206fbfb8031SShannon Nelson 		/* classification */
2207fbfb8031SShannon Nelson 		union {
2208fbfb8031SShannon Nelson 			u8      dot1q_pcp;
2209fbfb8031SShannon Nelson 			struct {
2210fbfb8031SShannon Nelson 				u8      ndscp;
2211c4e7a75aSShannon Nelson 				u8      ip_dscp[IONIC_QOS_DSCP_MAX];
2212fbfb8031SShannon Nelson 			};
2213fbfb8031SShannon Nelson 		};
2214fbfb8031SShannon Nelson 	};
2215fbfb8031SShannon Nelson 	__le32  words[64];
2216fbfb8031SShannon Nelson };
2217fbfb8031SShannon Nelson 
2218fbfb8031SShannon Nelson /**
22195c28f213SShannon Nelson  * union ionic_qos_identity - QoS identity structure
2220fbfb8031SShannon Nelson  * @version:	Version of the identify structure
2221fbfb8031SShannon Nelson  * @type:	QoS system type
2222fbfb8031SShannon Nelson  * @nclasses:	Number of usable QoS classes
2223fbfb8031SShannon Nelson  * @config:	Current configuration of classes
2224fbfb8031SShannon Nelson  */
2225fbfb8031SShannon Nelson union ionic_qos_identity {
2226fbfb8031SShannon Nelson 	struct {
2227fbfb8031SShannon Nelson 		u8     version;
2228fbfb8031SShannon Nelson 		u8     type;
2229fbfb8031SShannon Nelson 		u8     rsvd[62];
2230fbfb8031SShannon Nelson 		union ionic_qos_config config[IONIC_QOS_CLASS_MAX];
2231fbfb8031SShannon Nelson 	};
2232c4e7a75aSShannon Nelson 	__le32 words[478];
2233fbfb8031SShannon Nelson };
2234fbfb8031SShannon Nelson 
2235fbfb8031SShannon Nelson /**
2236c4e7a75aSShannon Nelson  * struct ionic_qos_init_cmd - QoS config init command
2237fbfb8031SShannon Nelson  * @opcode:	Opcode
2238c4e7a75aSShannon Nelson  * @group:	QoS class id
2239fbfb8031SShannon Nelson  * @info_pa:	destination address for qos info
2240fbfb8031SShannon Nelson  */
2241fbfb8031SShannon Nelson struct ionic_qos_init_cmd {
2242fbfb8031SShannon Nelson 	u8     opcode;
2243fbfb8031SShannon Nelson 	u8     group;
2244fbfb8031SShannon Nelson 	u8     rsvd[6];
2245fbfb8031SShannon Nelson 	__le64 info_pa;
2246fbfb8031SShannon Nelson 	u8     rsvd1[48];
2247fbfb8031SShannon Nelson };
2248fbfb8031SShannon Nelson 
2249fbfb8031SShannon Nelson typedef struct ionic_admin_comp ionic_qos_init_comp;
2250fbfb8031SShannon Nelson 
2251fbfb8031SShannon Nelson /**
2252c4e7a75aSShannon Nelson  * struct ionic_qos_reset_cmd - QoS config reset command
2253fbfb8031SShannon Nelson  * @opcode:	Opcode
2254c4e7a75aSShannon Nelson  * @group:	QoS class id
2255fbfb8031SShannon Nelson  */
2256fbfb8031SShannon Nelson struct ionic_qos_reset_cmd {
2257fbfb8031SShannon Nelson 	u8    opcode;
2258fbfb8031SShannon Nelson 	u8    group;
2259fbfb8031SShannon Nelson 	u8    rsvd[62];
2260fbfb8031SShannon Nelson };
2261fbfb8031SShannon Nelson 
22621b897e7dSShannon Nelson /**
22631b897e7dSShannon Nelson  * struct ionic_qos_clear_port_stats_cmd - Qos config reset command
22641b897e7dSShannon Nelson  * @opcode:	Opcode
22651b897e7dSShannon Nelson  */
22661b897e7dSShannon Nelson struct ionic_qos_clear_stats_cmd {
22671b897e7dSShannon Nelson 	u8    opcode;
22681b897e7dSShannon Nelson 	u8    group_bitmap;
22691b897e7dSShannon Nelson 	u8    rsvd[62];
22701b897e7dSShannon Nelson };
22711b897e7dSShannon Nelson 
2272fbfb8031SShannon Nelson typedef struct ionic_admin_comp ionic_qos_reset_comp;
2273fbfb8031SShannon Nelson 
2274fbfb8031SShannon Nelson /**
22755c28f213SShannon Nelson  * struct ionic_fw_download_cmd - Firmware download command
2276fbfb8031SShannon Nelson  * @opcode:	opcode
2277fbfb8031SShannon Nelson  * @addr:	dma address of the firmware buffer
2278fbfb8031SShannon Nelson  * @offset:	offset of the firmware buffer within the full image
2279fbfb8031SShannon Nelson  * @length:	number of valid bytes in the firmware buffer
2280fbfb8031SShannon Nelson  */
2281fbfb8031SShannon Nelson struct ionic_fw_download_cmd {
2282fbfb8031SShannon Nelson 	u8     opcode;
2283fbfb8031SShannon Nelson 	u8     rsvd[3];
2284fbfb8031SShannon Nelson 	__le32 offset;
2285fbfb8031SShannon Nelson 	__le64 addr;
2286fbfb8031SShannon Nelson 	__le32 length;
2287fbfb8031SShannon Nelson };
2288fbfb8031SShannon Nelson 
2289fbfb8031SShannon Nelson typedef struct ionic_admin_comp ionic_fw_download_comp;
2290fbfb8031SShannon Nelson 
2291c4e7a75aSShannon Nelson /**
2292c4e7a75aSShannon Nelson  * enum ionic_fw_control_oper - FW control operations
2293c4e7a75aSShannon Nelson  * @IONIC_FW_RESET:		Reset firmware
2294c4e7a75aSShannon Nelson  * @IONIC_FW_INSTALL:		Install firmware
2295c4e7a75aSShannon Nelson  * @IONIC_FW_ACTIVATE:		Activate firmware
229687c905d8SShannon Nelson  * @IONIC_FW_INSTALL_ASYNC:	Install firmware asynchronously
229787c905d8SShannon Nelson  * @IONIC_FW_INSTALL_STATUS:	Firmware installation status
229887c905d8SShannon Nelson  * @IONIC_FW_ACTIVATE_ASYNC:	Activate firmware asynchronously
229987c905d8SShannon Nelson  * @IONIC_FW_ACTIVATE_STATUS:	Firmware activate status
2300c4e7a75aSShannon Nelson  */
2301fbfb8031SShannon Nelson enum ionic_fw_control_oper {
2302c4e7a75aSShannon Nelson 	IONIC_FW_RESET			= 0,
2303c4e7a75aSShannon Nelson 	IONIC_FW_INSTALL		= 1,
2304c4e7a75aSShannon Nelson 	IONIC_FW_ACTIVATE		= 2,
230587c905d8SShannon Nelson 	IONIC_FW_INSTALL_ASYNC		= 3,
230687c905d8SShannon Nelson 	IONIC_FW_INSTALL_STATUS		= 4,
230787c905d8SShannon Nelson 	IONIC_FW_ACTIVATE_ASYNC		= 5,
230887c905d8SShannon Nelson 	IONIC_FW_ACTIVATE_STATUS	= 6,
230987c905d8SShannon Nelson 	IONIC_FW_UPDATE_CLEANUP		= 7,
2310fbfb8031SShannon Nelson };
2311fbfb8031SShannon Nelson 
2312fbfb8031SShannon Nelson /**
23135c28f213SShannon Nelson  * struct ionic_fw_control_cmd - Firmware control command
2314fbfb8031SShannon Nelson  * @opcode:    opcode
23155c28f213SShannon Nelson  * @oper:      firmware control operation (enum ionic_fw_control_oper)
2316fbfb8031SShannon Nelson  * @slot:      slot to activate
2317fbfb8031SShannon Nelson  */
2318fbfb8031SShannon Nelson struct ionic_fw_control_cmd {
2319fbfb8031SShannon Nelson 	u8  opcode;
2320fbfb8031SShannon Nelson 	u8  rsvd[3];
2321fbfb8031SShannon Nelson 	u8  oper;
2322fbfb8031SShannon Nelson 	u8  slot;
2323fbfb8031SShannon Nelson 	u8  rsvd1[58];
2324fbfb8031SShannon Nelson };
2325fbfb8031SShannon Nelson 
2326fbfb8031SShannon Nelson /**
23275c28f213SShannon Nelson  * struct ionic_fw_control_comp - Firmware control copletion
2328c4e7a75aSShannon Nelson  * @status:     Status of the command (enum ionic_status_code)
2329c4e7a75aSShannon Nelson  * @comp_index: Index in the descriptor ring for which this is the completion
2330c4e7a75aSShannon Nelson  * @slot:       Slot where the firmware was installed
2331c4e7a75aSShannon Nelson  * @color:      Color bit
2332fbfb8031SShannon Nelson  */
2333fbfb8031SShannon Nelson struct ionic_fw_control_comp {
2334fbfb8031SShannon Nelson 	u8     status;
2335fbfb8031SShannon Nelson 	u8     rsvd;
2336fbfb8031SShannon Nelson 	__le16 comp_index;
2337fbfb8031SShannon Nelson 	u8     slot;
2338fbfb8031SShannon Nelson 	u8     rsvd1[10];
2339fbfb8031SShannon Nelson 	u8     color;
2340fbfb8031SShannon Nelson };
2341fbfb8031SShannon Nelson 
2342fbfb8031SShannon Nelson /******************************************************************
2343fbfb8031SShannon Nelson  ******************* RDMA Commands ********************************
2344fbfb8031SShannon Nelson  ******************************************************************/
2345fbfb8031SShannon Nelson 
2346fbfb8031SShannon Nelson /**
23475c28f213SShannon Nelson  * struct ionic_rdma_reset_cmd - Reset RDMA LIF cmd
2348fbfb8031SShannon Nelson  * @opcode:        opcode
2349c4e7a75aSShannon Nelson  * @lif_index:     LIF index
2350fbfb8031SShannon Nelson  *
2351c4e7a75aSShannon Nelson  * There is no RDMA specific dev command completion struct.  Completion uses
23525c28f213SShannon Nelson  * the common struct ionic_admin_comp.  Only the status is indicated.
2353c4e7a75aSShannon Nelson  * Nonzero status means the LIF does not support RDMA.
2354fbfb8031SShannon Nelson  **/
2355fbfb8031SShannon Nelson struct ionic_rdma_reset_cmd {
2356fbfb8031SShannon Nelson 	u8     opcode;
2357fbfb8031SShannon Nelson 	u8     rsvd;
2358fbfb8031SShannon Nelson 	__le16 lif_index;
2359fbfb8031SShannon Nelson 	u8     rsvd2[60];
2360fbfb8031SShannon Nelson };
2361fbfb8031SShannon Nelson 
2362fbfb8031SShannon Nelson /**
23635c28f213SShannon Nelson  * struct ionic_rdma_queue_cmd - Create RDMA Queue command
2364fbfb8031SShannon Nelson  * @opcode:        opcode, 52, 53
2365c4e7a75aSShannon Nelson  * @lif_index:     LIF index
2366c4e7a75aSShannon Nelson  * @qid_ver:       (qid | (RDMA version << 24))
2367fbfb8031SShannon Nelson  * @cid:           intr, eq_id, or cq_id
2368fbfb8031SShannon Nelson  * @dbid:          doorbell page id
2369fbfb8031SShannon Nelson  * @depth_log2:    log base two of queue depth
2370fbfb8031SShannon Nelson  * @stride_log2:   log base two of queue stride
2371fbfb8031SShannon Nelson  * @dma_addr:      address of the queue memory
2372fbfb8031SShannon Nelson  *
2373c4e7a75aSShannon Nelson  * The same command struct is used to create an RDMA event queue, completion
2374c4e7a75aSShannon Nelson  * queue, or RDMA admin queue.  The cid is an interrupt number for an event
2375fbfb8031SShannon Nelson  * queue, an event queue id for a completion queue, or a completion queue id
2376c4e7a75aSShannon Nelson  * for an RDMA admin queue.
2377fbfb8031SShannon Nelson  *
2378fbfb8031SShannon Nelson  * The queue created via a dev command must be contiguous in dma space.
2379fbfb8031SShannon Nelson  *
2380fbfb8031SShannon Nelson  * The dev commands are intended only to be used during driver initialization,
2381c4e7a75aSShannon Nelson  * to create queues supporting the RDMA admin queue.  Other queues, and other
2382c4e7a75aSShannon Nelson  * types of RDMA resources like memory regions, will be created and registered
2383c4e7a75aSShannon Nelson  * via the RDMA admin queue, and will support a more complete interface
2384fbfb8031SShannon Nelson  * providing scatter gather lists for larger, scattered queue buffers and
2385fbfb8031SShannon Nelson  * memory registration.
2386fbfb8031SShannon Nelson  *
2387c4e7a75aSShannon Nelson  * There is no RDMA specific dev command completion struct.  Completion uses
23885c28f213SShannon Nelson  * the common struct ionic_admin_comp.  Only the status is indicated.
2389fbfb8031SShannon Nelson  **/
2390fbfb8031SShannon Nelson struct ionic_rdma_queue_cmd {
2391fbfb8031SShannon Nelson 	u8     opcode;
2392fbfb8031SShannon Nelson 	u8     rsvd;
2393fbfb8031SShannon Nelson 	__le16 lif_index;
2394fbfb8031SShannon Nelson 	__le32 qid_ver;
2395fbfb8031SShannon Nelson 	__le32 cid;
2396fbfb8031SShannon Nelson 	__le16 dbid;
2397fbfb8031SShannon Nelson 	u8     depth_log2;
2398fbfb8031SShannon Nelson 	u8     stride_log2;
2399fbfb8031SShannon Nelson 	__le64 dma_addr;
2400c4e7a75aSShannon Nelson 	u8     rsvd2[40];
2401fbfb8031SShannon Nelson };
2402fbfb8031SShannon Nelson 
2403fbfb8031SShannon Nelson /******************************************************************
2404fbfb8031SShannon Nelson  ******************* Notify Events ********************************
2405fbfb8031SShannon Nelson  ******************************************************************/
2406fbfb8031SShannon Nelson 
2407fbfb8031SShannon Nelson /**
2408c4e7a75aSShannon Nelson  * struct ionic_notifyq_event - Generic event reporting structure
2409fbfb8031SShannon Nelson  * @eid:   event number
2410fbfb8031SShannon Nelson  * @ecode: event code
2411fbfb8031SShannon Nelson  * @data:  unspecified data about the event
2412fbfb8031SShannon Nelson  *
2413fbfb8031SShannon Nelson  * This is the generic event report struct from which the other
2414fbfb8031SShannon Nelson  * actual events will be formed.
2415fbfb8031SShannon Nelson  */
2416fbfb8031SShannon Nelson struct ionic_notifyq_event {
2417fbfb8031SShannon Nelson 	__le64 eid;
2418fbfb8031SShannon Nelson 	__le16 ecode;
2419fbfb8031SShannon Nelson 	u8     data[54];
2420fbfb8031SShannon Nelson };
2421fbfb8031SShannon Nelson 
2422fbfb8031SShannon Nelson /**
2423c4e7a75aSShannon Nelson  * struct ionic_link_change_event - Link change event notification
2424fbfb8031SShannon Nelson  * @eid:		event number
2425c4e7a75aSShannon Nelson  * @ecode:		event code = IONIC_EVENT_LINK_CHANGE
24261b897e7dSShannon Nelson  * @link_status:	link up/down, with error bits (enum ionic_port_status)
2427fbfb8031SShannon Nelson  * @link_speed:		speed of the network link
2428fbfb8031SShannon Nelson  *
2429fbfb8031SShannon Nelson  * Sent when the network link state changes between UP and DOWN
2430fbfb8031SShannon Nelson  */
2431fbfb8031SShannon Nelson struct ionic_link_change_event {
2432fbfb8031SShannon Nelson 	__le64 eid;
2433fbfb8031SShannon Nelson 	__le16 ecode;
2434fbfb8031SShannon Nelson 	__le16 link_status;
2435fbfb8031SShannon Nelson 	__le32 link_speed;	/* units of 1Mbps: e.g. 10000 = 10Gbps */
2436fbfb8031SShannon Nelson 	u8     rsvd[48];
2437fbfb8031SShannon Nelson };
2438fbfb8031SShannon Nelson 
2439fbfb8031SShannon Nelson /**
2440c4e7a75aSShannon Nelson  * struct ionic_reset_event - Reset event notification
2441fbfb8031SShannon Nelson  * @eid:		event number
2442c4e7a75aSShannon Nelson  * @ecode:		event code = IONIC_EVENT_RESET
2443fbfb8031SShannon Nelson  * @reset_code:		reset type
2444fbfb8031SShannon Nelson  * @state:		0=pending, 1=complete, 2=error
2445fbfb8031SShannon Nelson  *
2446fbfb8031SShannon Nelson  * Sent when the NIC or some subsystem is going to be or
2447fbfb8031SShannon Nelson  * has been reset.
2448fbfb8031SShannon Nelson  */
2449fbfb8031SShannon Nelson struct ionic_reset_event {
2450fbfb8031SShannon Nelson 	__le64 eid;
2451fbfb8031SShannon Nelson 	__le16 ecode;
2452fbfb8031SShannon Nelson 	u8     reset_code;
2453fbfb8031SShannon Nelson 	u8     state;
2454fbfb8031SShannon Nelson 	u8     rsvd[52];
2455fbfb8031SShannon Nelson };
2456fbfb8031SShannon Nelson 
2457fbfb8031SShannon Nelson /**
2458c4e7a75aSShannon Nelson  * struct ionic_heartbeat_event - Sent periodically by NIC to indicate health
2459fbfb8031SShannon Nelson  * @eid:	event number
2460c4e7a75aSShannon Nelson  * @ecode:	event code = IONIC_EVENT_HEARTBEAT
2461fbfb8031SShannon Nelson  */
2462fbfb8031SShannon Nelson struct ionic_heartbeat_event {
2463fbfb8031SShannon Nelson 	__le64 eid;
2464fbfb8031SShannon Nelson 	__le16 ecode;
2465fbfb8031SShannon Nelson 	u8     rsvd[54];
2466fbfb8031SShannon Nelson };
2467fbfb8031SShannon Nelson 
2468fbfb8031SShannon Nelson /**
2469c4e7a75aSShannon Nelson  * struct ionic_log_event - Sent to notify the driver of an internal error
2470fbfb8031SShannon Nelson  * @eid:	event number
2471c4e7a75aSShannon Nelson  * @ecode:	event code = IONIC_EVENT_LOG
2472fbfb8031SShannon Nelson  * @data:	log data
2473fbfb8031SShannon Nelson  */
2474fbfb8031SShannon Nelson struct ionic_log_event {
2475fbfb8031SShannon Nelson 	__le64 eid;
2476fbfb8031SShannon Nelson 	__le16 ecode;
2477fbfb8031SShannon Nelson 	u8     data[54];
2478fbfb8031SShannon Nelson };
2479fbfb8031SShannon Nelson 
2480fbfb8031SShannon Nelson /**
2481c4e7a75aSShannon Nelson  * struct ionic_xcvr_event - Transceiver change event
2482c4e7a75aSShannon Nelson  * @eid:	event number
2483c4e7a75aSShannon Nelson  * @ecode:	event code = IONIC_EVENT_XCVR
2484c4e7a75aSShannon Nelson  */
2485c4e7a75aSShannon Nelson struct ionic_xcvr_event {
2486c4e7a75aSShannon Nelson 	__le64 eid;
2487c4e7a75aSShannon Nelson 	__le16 ecode;
2488c4e7a75aSShannon Nelson 	u8     rsvd[54];
2489c4e7a75aSShannon Nelson };
2490c4e7a75aSShannon Nelson 
2491c4e7a75aSShannon Nelson /**
2492c4e7a75aSShannon Nelson  * struct ionic_port_stats - Port statistics structure
2493fbfb8031SShannon Nelson  */
2494fbfb8031SShannon Nelson struct ionic_port_stats {
2495fbfb8031SShannon Nelson 	__le64 frames_rx_ok;
2496fbfb8031SShannon Nelson 	__le64 frames_rx_all;
2497fbfb8031SShannon Nelson 	__le64 frames_rx_bad_fcs;
2498fbfb8031SShannon Nelson 	__le64 frames_rx_bad_all;
2499fbfb8031SShannon Nelson 	__le64 octets_rx_ok;
2500fbfb8031SShannon Nelson 	__le64 octets_rx_all;
2501fbfb8031SShannon Nelson 	__le64 frames_rx_unicast;
2502fbfb8031SShannon Nelson 	__le64 frames_rx_multicast;
2503fbfb8031SShannon Nelson 	__le64 frames_rx_broadcast;
2504fbfb8031SShannon Nelson 	__le64 frames_rx_pause;
2505fbfb8031SShannon Nelson 	__le64 frames_rx_bad_length;
2506fbfb8031SShannon Nelson 	__le64 frames_rx_undersized;
2507fbfb8031SShannon Nelson 	__le64 frames_rx_oversized;
2508fbfb8031SShannon Nelson 	__le64 frames_rx_fragments;
2509fbfb8031SShannon Nelson 	__le64 frames_rx_jabber;
2510fbfb8031SShannon Nelson 	__le64 frames_rx_pripause;
2511fbfb8031SShannon Nelson 	__le64 frames_rx_stomped_crc;
2512fbfb8031SShannon Nelson 	__le64 frames_rx_too_long;
2513fbfb8031SShannon Nelson 	__le64 frames_rx_vlan_good;
2514fbfb8031SShannon Nelson 	__le64 frames_rx_dropped;
2515fbfb8031SShannon Nelson 	__le64 frames_rx_less_than_64b;
2516fbfb8031SShannon Nelson 	__le64 frames_rx_64b;
2517fbfb8031SShannon Nelson 	__le64 frames_rx_65b_127b;
2518fbfb8031SShannon Nelson 	__le64 frames_rx_128b_255b;
2519fbfb8031SShannon Nelson 	__le64 frames_rx_256b_511b;
2520fbfb8031SShannon Nelson 	__le64 frames_rx_512b_1023b;
2521fbfb8031SShannon Nelson 	__le64 frames_rx_1024b_1518b;
2522fbfb8031SShannon Nelson 	__le64 frames_rx_1519b_2047b;
2523fbfb8031SShannon Nelson 	__le64 frames_rx_2048b_4095b;
2524fbfb8031SShannon Nelson 	__le64 frames_rx_4096b_8191b;
2525fbfb8031SShannon Nelson 	__le64 frames_rx_8192b_9215b;
2526fbfb8031SShannon Nelson 	__le64 frames_rx_other;
2527fbfb8031SShannon Nelson 	__le64 frames_tx_ok;
2528fbfb8031SShannon Nelson 	__le64 frames_tx_all;
2529fbfb8031SShannon Nelson 	__le64 frames_tx_bad;
2530fbfb8031SShannon Nelson 	__le64 octets_tx_ok;
2531fbfb8031SShannon Nelson 	__le64 octets_tx_total;
2532fbfb8031SShannon Nelson 	__le64 frames_tx_unicast;
2533fbfb8031SShannon Nelson 	__le64 frames_tx_multicast;
2534fbfb8031SShannon Nelson 	__le64 frames_tx_broadcast;
2535fbfb8031SShannon Nelson 	__le64 frames_tx_pause;
2536fbfb8031SShannon Nelson 	__le64 frames_tx_pripause;
2537fbfb8031SShannon Nelson 	__le64 frames_tx_vlan;
2538fbfb8031SShannon Nelson 	__le64 frames_tx_less_than_64b;
2539fbfb8031SShannon Nelson 	__le64 frames_tx_64b;
2540fbfb8031SShannon Nelson 	__le64 frames_tx_65b_127b;
2541fbfb8031SShannon Nelson 	__le64 frames_tx_128b_255b;
2542fbfb8031SShannon Nelson 	__le64 frames_tx_256b_511b;
2543fbfb8031SShannon Nelson 	__le64 frames_tx_512b_1023b;
2544fbfb8031SShannon Nelson 	__le64 frames_tx_1024b_1518b;
2545fbfb8031SShannon Nelson 	__le64 frames_tx_1519b_2047b;
2546fbfb8031SShannon Nelson 	__le64 frames_tx_2048b_4095b;
2547fbfb8031SShannon Nelson 	__le64 frames_tx_4096b_8191b;
2548fbfb8031SShannon Nelson 	__le64 frames_tx_8192b_9215b;
2549fbfb8031SShannon Nelson 	__le64 frames_tx_other;
2550fbfb8031SShannon Nelson 	__le64 frames_tx_pri_0;
2551fbfb8031SShannon Nelson 	__le64 frames_tx_pri_1;
2552fbfb8031SShannon Nelson 	__le64 frames_tx_pri_2;
2553fbfb8031SShannon Nelson 	__le64 frames_tx_pri_3;
2554fbfb8031SShannon Nelson 	__le64 frames_tx_pri_4;
2555fbfb8031SShannon Nelson 	__le64 frames_tx_pri_5;
2556fbfb8031SShannon Nelson 	__le64 frames_tx_pri_6;
2557fbfb8031SShannon Nelson 	__le64 frames_tx_pri_7;
2558fbfb8031SShannon Nelson 	__le64 frames_rx_pri_0;
2559fbfb8031SShannon Nelson 	__le64 frames_rx_pri_1;
2560fbfb8031SShannon Nelson 	__le64 frames_rx_pri_2;
2561fbfb8031SShannon Nelson 	__le64 frames_rx_pri_3;
2562fbfb8031SShannon Nelson 	__le64 frames_rx_pri_4;
2563fbfb8031SShannon Nelson 	__le64 frames_rx_pri_5;
2564fbfb8031SShannon Nelson 	__le64 frames_rx_pri_6;
2565fbfb8031SShannon Nelson 	__le64 frames_rx_pri_7;
2566fbfb8031SShannon Nelson 	__le64 tx_pripause_0_1us_count;
2567fbfb8031SShannon Nelson 	__le64 tx_pripause_1_1us_count;
2568fbfb8031SShannon Nelson 	__le64 tx_pripause_2_1us_count;
2569fbfb8031SShannon Nelson 	__le64 tx_pripause_3_1us_count;
2570fbfb8031SShannon Nelson 	__le64 tx_pripause_4_1us_count;
2571fbfb8031SShannon Nelson 	__le64 tx_pripause_5_1us_count;
2572fbfb8031SShannon Nelson 	__le64 tx_pripause_6_1us_count;
2573fbfb8031SShannon Nelson 	__le64 tx_pripause_7_1us_count;
2574fbfb8031SShannon Nelson 	__le64 rx_pripause_0_1us_count;
2575fbfb8031SShannon Nelson 	__le64 rx_pripause_1_1us_count;
2576fbfb8031SShannon Nelson 	__le64 rx_pripause_2_1us_count;
2577fbfb8031SShannon Nelson 	__le64 rx_pripause_3_1us_count;
2578fbfb8031SShannon Nelson 	__le64 rx_pripause_4_1us_count;
2579fbfb8031SShannon Nelson 	__le64 rx_pripause_5_1us_count;
2580fbfb8031SShannon Nelson 	__le64 rx_pripause_6_1us_count;
2581fbfb8031SShannon Nelson 	__le64 rx_pripause_7_1us_count;
2582fbfb8031SShannon Nelson 	__le64 rx_pause_1us_count;
2583fbfb8031SShannon Nelson 	__le64 frames_tx_truncated;
2584fbfb8031SShannon Nelson };
2585fbfb8031SShannon Nelson 
2586fbfb8031SShannon Nelson struct ionic_mgmt_port_stats {
2587fbfb8031SShannon Nelson 	__le64 frames_rx_ok;
2588fbfb8031SShannon Nelson 	__le64 frames_rx_all;
2589fbfb8031SShannon Nelson 	__le64 frames_rx_bad_fcs;
2590fbfb8031SShannon Nelson 	__le64 frames_rx_bad_all;
2591fbfb8031SShannon Nelson 	__le64 octets_rx_ok;
2592fbfb8031SShannon Nelson 	__le64 octets_rx_all;
2593fbfb8031SShannon Nelson 	__le64 frames_rx_unicast;
2594fbfb8031SShannon Nelson 	__le64 frames_rx_multicast;
2595fbfb8031SShannon Nelson 	__le64 frames_rx_broadcast;
2596fbfb8031SShannon Nelson 	__le64 frames_rx_pause;
2597c4e7a75aSShannon Nelson 	__le64 frames_rx_bad_length;
2598c4e7a75aSShannon Nelson 	__le64 frames_rx_undersized;
2599c4e7a75aSShannon Nelson 	__le64 frames_rx_oversized;
2600c4e7a75aSShannon Nelson 	__le64 frames_rx_fragments;
2601c4e7a75aSShannon Nelson 	__le64 frames_rx_jabber;
2602c4e7a75aSShannon Nelson 	__le64 frames_rx_64b;
2603c4e7a75aSShannon Nelson 	__le64 frames_rx_65b_127b;
2604c4e7a75aSShannon Nelson 	__le64 frames_rx_128b_255b;
2605c4e7a75aSShannon Nelson 	__le64 frames_rx_256b_511b;
2606c4e7a75aSShannon Nelson 	__le64 frames_rx_512b_1023b;
2607c4e7a75aSShannon Nelson 	__le64 frames_rx_1024b_1518b;
2608c4e7a75aSShannon Nelson 	__le64 frames_rx_gt_1518b;
2609c4e7a75aSShannon Nelson 	__le64 frames_rx_fifo_full;
2610c4e7a75aSShannon Nelson 	__le64 frames_tx_ok;
2611c4e7a75aSShannon Nelson 	__le64 frames_tx_all;
2612c4e7a75aSShannon Nelson 	__le64 frames_tx_bad;
2613c4e7a75aSShannon Nelson 	__le64 octets_tx_ok;
2614c4e7a75aSShannon Nelson 	__le64 octets_tx_total;
2615c4e7a75aSShannon Nelson 	__le64 frames_tx_unicast;
2616c4e7a75aSShannon Nelson 	__le64 frames_tx_multicast;
2617c4e7a75aSShannon Nelson 	__le64 frames_tx_broadcast;
2618c4e7a75aSShannon Nelson 	__le64 frames_tx_pause;
2619c4e7a75aSShannon Nelson };
2620c4e7a75aSShannon Nelson 
2621c4e7a75aSShannon Nelson enum ionic_pb_buffer_drop_stats {
2622c4e7a75aSShannon Nelson 	IONIC_BUFFER_INTRINSIC_DROP = 0,
2623c4e7a75aSShannon Nelson 	IONIC_BUFFER_DISCARDED,
2624c4e7a75aSShannon Nelson 	IONIC_BUFFER_ADMITTED,
2625c4e7a75aSShannon Nelson 	IONIC_BUFFER_OUT_OF_CELLS_DROP,
2626c4e7a75aSShannon Nelson 	IONIC_BUFFER_OUT_OF_CELLS_DROP_2,
2627c4e7a75aSShannon Nelson 	IONIC_BUFFER_OUT_OF_CREDIT_DROP,
2628c4e7a75aSShannon Nelson 	IONIC_BUFFER_TRUNCATION_DROP,
2629c4e7a75aSShannon Nelson 	IONIC_BUFFER_PORT_DISABLED_DROP,
2630c4e7a75aSShannon Nelson 	IONIC_BUFFER_COPY_TO_CPU_TAIL_DROP,
2631c4e7a75aSShannon Nelson 	IONIC_BUFFER_SPAN_TAIL_DROP,
2632c4e7a75aSShannon Nelson 	IONIC_BUFFER_MIN_SIZE_VIOLATION_DROP,
2633c4e7a75aSShannon Nelson 	IONIC_BUFFER_ENQUEUE_ERROR_DROP,
2634c4e7a75aSShannon Nelson 	IONIC_BUFFER_INVALID_PORT_DROP,
2635c4e7a75aSShannon Nelson 	IONIC_BUFFER_INVALID_OUTPUT_QUEUE_DROP,
2636c4e7a75aSShannon Nelson 	IONIC_BUFFER_DROP_MAX,
2637c4e7a75aSShannon Nelson };
2638c4e7a75aSShannon Nelson 
26391b897e7dSShannon Nelson enum ionic_oflow_drop_stats {
26401b897e7dSShannon Nelson 	IONIC_OFLOW_OCCUPANCY_DROP,
26411b897e7dSShannon Nelson 	IONIC_OFLOW_EMERGENCY_STOP_DROP,
26421b897e7dSShannon Nelson 	IONIC_OFLOW_WRITE_BUFFER_ACK_FILL_UP_DROP,
26431b897e7dSShannon Nelson 	IONIC_OFLOW_WRITE_BUFFER_ACK_FULL_DROP,
26441b897e7dSShannon Nelson 	IONIC_OFLOW_WRITE_BUFFER_FULL_DROP,
26451b897e7dSShannon Nelson 	IONIC_OFLOW_CONTROL_FIFO_FULL_DROP,
26461b897e7dSShannon Nelson 	IONIC_OFLOW_DROP_MAX,
26471b897e7dSShannon Nelson };
26481b897e7dSShannon Nelson 
2649c4e7a75aSShannon Nelson /**
2650c4e7a75aSShannon Nelson  * struct port_pb_stats - packet buffers system stats
2651c4e7a75aSShannon Nelson  * uses ionic_pb_buffer_drop_stats for drop_counts[]
2652c4e7a75aSShannon Nelson  */
2653c4e7a75aSShannon Nelson struct ionic_port_pb_stats {
2654c4e7a75aSShannon Nelson 	__le64 sop_count_in;
2655c4e7a75aSShannon Nelson 	__le64 eop_count_in;
2656c4e7a75aSShannon Nelson 	__le64 sop_count_out;
2657c4e7a75aSShannon Nelson 	__le64 eop_count_out;
2658c4e7a75aSShannon Nelson 	__le64 drop_counts[IONIC_BUFFER_DROP_MAX];
2659c4e7a75aSShannon Nelson 	__le64 input_queue_buffer_occupancy[IONIC_QOS_TC_MAX];
2660c4e7a75aSShannon Nelson 	__le64 input_queue_port_monitor[IONIC_QOS_TC_MAX];
2661c4e7a75aSShannon Nelson 	__le64 output_queue_port_monitor[IONIC_QOS_TC_MAX];
26621b897e7dSShannon Nelson 	__le64 oflow_drop_counts[IONIC_OFLOW_DROP_MAX];
26631b897e7dSShannon Nelson 	__le64 input_queue_good_pkts_in[IONIC_QOS_TC_MAX];
26641b897e7dSShannon Nelson 	__le64 input_queue_good_pkts_out[IONIC_QOS_TC_MAX];
26651b897e7dSShannon Nelson 	__le64 input_queue_err_pkts_in[IONIC_QOS_TC_MAX];
26661b897e7dSShannon Nelson 	__le64 input_queue_fifo_depth[IONIC_QOS_TC_MAX];
26671b897e7dSShannon Nelson 	__le64 input_queue_max_fifo_depth[IONIC_QOS_TC_MAX];
26681b897e7dSShannon Nelson 	__le64 input_queue_peak_occupancy[IONIC_QOS_TC_MAX];
26691b897e7dSShannon Nelson 	__le64 output_queue_buffer_occupancy[IONIC_QOS_TC_MAX];
2670fbfb8031SShannon Nelson };
2671fbfb8031SShannon Nelson 
2672fbfb8031SShannon Nelson /**
26735c28f213SShannon Nelson  * struct ionic_port_identity - port identity structure
2674fbfb8031SShannon Nelson  * @version:        identity structure version
26751b897e7dSShannon Nelson  * @type:           type of port (enum ionic_port_type)
2676fbfb8031SShannon Nelson  * @num_lanes:      number of lanes for the port
2677fbfb8031SShannon Nelson  * @autoneg:        autoneg supported
2678fbfb8031SShannon Nelson  * @min_frame_size: minimum frame size supported
2679fbfb8031SShannon Nelson  * @max_frame_size: maximum frame size supported
2680fbfb8031SShannon Nelson  * @fec_type:       supported fec types
2681fbfb8031SShannon Nelson  * @pause_type:     supported pause types
2682fbfb8031SShannon Nelson  * @loopback_mode:  supported loopback mode
2683fbfb8031SShannon Nelson  * @speeds:         supported speeds
2684fbfb8031SShannon Nelson  * @config:         current port configuration
2685fbfb8031SShannon Nelson  */
2686fbfb8031SShannon Nelson union ionic_port_identity {
2687fbfb8031SShannon Nelson 	struct {
2688fbfb8031SShannon Nelson 		u8     version;
2689fbfb8031SShannon Nelson 		u8     type;
2690fbfb8031SShannon Nelson 		u8     num_lanes;
2691fbfb8031SShannon Nelson 		u8     autoneg;
2692fbfb8031SShannon Nelson 		__le32 min_frame_size;
2693fbfb8031SShannon Nelson 		__le32 max_frame_size;
2694fbfb8031SShannon Nelson 		u8     fec_type[4];
2695fbfb8031SShannon Nelson 		u8     pause_type[2];
2696fbfb8031SShannon Nelson 		u8     loopback_mode[2];
2697fbfb8031SShannon Nelson 		__le32 speeds[16];
2698fbfb8031SShannon Nelson 		u8     rsvd2[44];
2699fbfb8031SShannon Nelson 		union ionic_port_config config;
2700fbfb8031SShannon Nelson 	};
2701c4e7a75aSShannon Nelson 	__le32 words[478];
2702fbfb8031SShannon Nelson };
2703fbfb8031SShannon Nelson 
2704fbfb8031SShannon Nelson /**
27055c28f213SShannon Nelson  * struct ionic_port_info - port info structure
2706c4e7a75aSShannon Nelson  * @config:          Port configuration data
2707c4e7a75aSShannon Nelson  * @status:          Port status data
2708c4e7a75aSShannon Nelson  * @stats:           Port statistics data
2709c4e7a75aSShannon Nelson  * @mgmt_stats:      Port management statistics data
2710c4e7a75aSShannon Nelson  * @port_pb_drop_stats:   uplink pb drop stats
2711fbfb8031SShannon Nelson  */
2712fbfb8031SShannon Nelson struct ionic_port_info {
2713fbfb8031SShannon Nelson 	union ionic_port_config config;
2714fbfb8031SShannon Nelson 	struct ionic_port_status status;
2715c4e7a75aSShannon Nelson 	union {
2716fbfb8031SShannon Nelson 		struct ionic_port_stats      stats;
2717c4e7a75aSShannon Nelson 		struct ionic_mgmt_port_stats mgmt_stats;
2718c4e7a75aSShannon Nelson 	};
2719c4e7a75aSShannon Nelson 	/* room for pb_stats to start at 2k offset */
2720c4e7a75aSShannon Nelson 	u8                          rsvd[760];
2721c4e7a75aSShannon Nelson 	struct ionic_port_pb_stats  pb_stats;
2722fbfb8031SShannon Nelson };
2723fbfb8031SShannon Nelson 
2724fbfb8031SShannon Nelson /**
2725c4e7a75aSShannon Nelson  * struct ionic_lif_stats - LIF statistics structure
2726fbfb8031SShannon Nelson  */
2727fbfb8031SShannon Nelson struct ionic_lif_stats {
2728fbfb8031SShannon Nelson 	/* RX */
2729fbfb8031SShannon Nelson 	__le64 rx_ucast_bytes;
2730fbfb8031SShannon Nelson 	__le64 rx_ucast_packets;
2731fbfb8031SShannon Nelson 	__le64 rx_mcast_bytes;
2732fbfb8031SShannon Nelson 	__le64 rx_mcast_packets;
2733fbfb8031SShannon Nelson 	__le64 rx_bcast_bytes;
2734fbfb8031SShannon Nelson 	__le64 rx_bcast_packets;
2735fbfb8031SShannon Nelson 	__le64 rsvd0;
2736fbfb8031SShannon Nelson 	__le64 rsvd1;
2737fbfb8031SShannon Nelson 	/* RX drops */
2738fbfb8031SShannon Nelson 	__le64 rx_ucast_drop_bytes;
2739fbfb8031SShannon Nelson 	__le64 rx_ucast_drop_packets;
2740fbfb8031SShannon Nelson 	__le64 rx_mcast_drop_bytes;
2741fbfb8031SShannon Nelson 	__le64 rx_mcast_drop_packets;
2742fbfb8031SShannon Nelson 	__le64 rx_bcast_drop_bytes;
2743fbfb8031SShannon Nelson 	__le64 rx_bcast_drop_packets;
2744fbfb8031SShannon Nelson 	__le64 rx_dma_error;
2745fbfb8031SShannon Nelson 	__le64 rsvd2;
2746fbfb8031SShannon Nelson 	/* TX */
2747fbfb8031SShannon Nelson 	__le64 tx_ucast_bytes;
2748fbfb8031SShannon Nelson 	__le64 tx_ucast_packets;
2749fbfb8031SShannon Nelson 	__le64 tx_mcast_bytes;
2750fbfb8031SShannon Nelson 	__le64 tx_mcast_packets;
2751fbfb8031SShannon Nelson 	__le64 tx_bcast_bytes;
2752fbfb8031SShannon Nelson 	__le64 tx_bcast_packets;
2753fbfb8031SShannon Nelson 	__le64 rsvd3;
2754fbfb8031SShannon Nelson 	__le64 rsvd4;
2755fbfb8031SShannon Nelson 	/* TX drops */
2756fbfb8031SShannon Nelson 	__le64 tx_ucast_drop_bytes;
2757fbfb8031SShannon Nelson 	__le64 tx_ucast_drop_packets;
2758fbfb8031SShannon Nelson 	__le64 tx_mcast_drop_bytes;
2759fbfb8031SShannon Nelson 	__le64 tx_mcast_drop_packets;
2760fbfb8031SShannon Nelson 	__le64 tx_bcast_drop_bytes;
2761fbfb8031SShannon Nelson 	__le64 tx_bcast_drop_packets;
2762fbfb8031SShannon Nelson 	__le64 tx_dma_error;
2763fbfb8031SShannon Nelson 	__le64 rsvd5;
2764fbfb8031SShannon Nelson 	/* Rx Queue/Ring drops */
2765fbfb8031SShannon Nelson 	__le64 rx_queue_disabled;
2766fbfb8031SShannon Nelson 	__le64 rx_queue_empty;
2767fbfb8031SShannon Nelson 	__le64 rx_queue_error;
2768fbfb8031SShannon Nelson 	__le64 rx_desc_fetch_error;
2769fbfb8031SShannon Nelson 	__le64 rx_desc_data_error;
2770fbfb8031SShannon Nelson 	__le64 rsvd6;
2771fbfb8031SShannon Nelson 	__le64 rsvd7;
2772fbfb8031SShannon Nelson 	__le64 rsvd8;
2773fbfb8031SShannon Nelson 	/* Tx Queue/Ring drops */
2774fbfb8031SShannon Nelson 	__le64 tx_queue_disabled;
2775fbfb8031SShannon Nelson 	__le64 tx_queue_error;
2776fbfb8031SShannon Nelson 	__le64 tx_desc_fetch_error;
2777fbfb8031SShannon Nelson 	__le64 tx_desc_data_error;
2778c4e7a75aSShannon Nelson 	__le64 tx_queue_empty;
2779fbfb8031SShannon Nelson 	__le64 rsvd10;
2780fbfb8031SShannon Nelson 	__le64 rsvd11;
2781fbfb8031SShannon Nelson 	__le64 rsvd12;
2782fbfb8031SShannon Nelson 
2783fbfb8031SShannon Nelson 	/* RDMA/ROCE TX */
2784fbfb8031SShannon Nelson 	__le64 tx_rdma_ucast_bytes;
2785fbfb8031SShannon Nelson 	__le64 tx_rdma_ucast_packets;
2786fbfb8031SShannon Nelson 	__le64 tx_rdma_mcast_bytes;
2787fbfb8031SShannon Nelson 	__le64 tx_rdma_mcast_packets;
2788fbfb8031SShannon Nelson 	__le64 tx_rdma_cnp_packets;
2789fbfb8031SShannon Nelson 	__le64 rsvd13;
2790fbfb8031SShannon Nelson 	__le64 rsvd14;
2791fbfb8031SShannon Nelson 	__le64 rsvd15;
2792fbfb8031SShannon Nelson 
2793fbfb8031SShannon Nelson 	/* RDMA/ROCE RX */
2794fbfb8031SShannon Nelson 	__le64 rx_rdma_ucast_bytes;
2795fbfb8031SShannon Nelson 	__le64 rx_rdma_ucast_packets;
2796fbfb8031SShannon Nelson 	__le64 rx_rdma_mcast_bytes;
2797fbfb8031SShannon Nelson 	__le64 rx_rdma_mcast_packets;
2798fbfb8031SShannon Nelson 	__le64 rx_rdma_cnp_packets;
2799fbfb8031SShannon Nelson 	__le64 rx_rdma_ecn_packets;
2800fbfb8031SShannon Nelson 	__le64 rsvd16;
2801fbfb8031SShannon Nelson 	__le64 rsvd17;
2802fbfb8031SShannon Nelson 
2803fbfb8031SShannon Nelson 	__le64 rsvd18;
2804fbfb8031SShannon Nelson 	__le64 rsvd19;
2805fbfb8031SShannon Nelson 	__le64 rsvd20;
2806fbfb8031SShannon Nelson 	__le64 rsvd21;
2807fbfb8031SShannon Nelson 	__le64 rsvd22;
2808fbfb8031SShannon Nelson 	__le64 rsvd23;
2809fbfb8031SShannon Nelson 	__le64 rsvd24;
2810fbfb8031SShannon Nelson 	__le64 rsvd25;
2811fbfb8031SShannon Nelson 
2812fbfb8031SShannon Nelson 	__le64 rsvd26;
2813fbfb8031SShannon Nelson 	__le64 rsvd27;
2814fbfb8031SShannon Nelson 	__le64 rsvd28;
2815fbfb8031SShannon Nelson 	__le64 rsvd29;
2816fbfb8031SShannon Nelson 	__le64 rsvd30;
2817fbfb8031SShannon Nelson 	__le64 rsvd31;
2818fbfb8031SShannon Nelson 	__le64 rsvd32;
2819fbfb8031SShannon Nelson 	__le64 rsvd33;
2820fbfb8031SShannon Nelson 
2821fbfb8031SShannon Nelson 	__le64 rsvd34;
2822fbfb8031SShannon Nelson 	__le64 rsvd35;
2823fbfb8031SShannon Nelson 	__le64 rsvd36;
2824fbfb8031SShannon Nelson 	__le64 rsvd37;
2825fbfb8031SShannon Nelson 	__le64 rsvd38;
2826fbfb8031SShannon Nelson 	__le64 rsvd39;
2827fbfb8031SShannon Nelson 	__le64 rsvd40;
2828fbfb8031SShannon Nelson 	__le64 rsvd41;
2829fbfb8031SShannon Nelson 
2830fbfb8031SShannon Nelson 	__le64 rsvd42;
2831fbfb8031SShannon Nelson 	__le64 rsvd43;
2832fbfb8031SShannon Nelson 	__le64 rsvd44;
2833fbfb8031SShannon Nelson 	__le64 rsvd45;
2834fbfb8031SShannon Nelson 	__le64 rsvd46;
2835fbfb8031SShannon Nelson 	__le64 rsvd47;
2836fbfb8031SShannon Nelson 	__le64 rsvd48;
2837fbfb8031SShannon Nelson 	__le64 rsvd49;
2838fbfb8031SShannon Nelson 
2839fbfb8031SShannon Nelson 	/* RDMA/ROCE REQ Error/Debugs (768 - 895) */
2840fbfb8031SShannon Nelson 	__le64 rdma_req_rx_pkt_seq_err;
2841fbfb8031SShannon Nelson 	__le64 rdma_req_rx_rnr_retry_err;
2842fbfb8031SShannon Nelson 	__le64 rdma_req_rx_remote_access_err;
2843fbfb8031SShannon Nelson 	__le64 rdma_req_rx_remote_inv_req_err;
2844fbfb8031SShannon Nelson 	__le64 rdma_req_rx_remote_oper_err;
2845fbfb8031SShannon Nelson 	__le64 rdma_req_rx_implied_nak_seq_err;
2846fbfb8031SShannon Nelson 	__le64 rdma_req_rx_cqe_err;
2847fbfb8031SShannon Nelson 	__le64 rdma_req_rx_cqe_flush_err;
2848fbfb8031SShannon Nelson 
2849fbfb8031SShannon Nelson 	__le64 rdma_req_rx_dup_responses;
2850fbfb8031SShannon Nelson 	__le64 rdma_req_rx_invalid_packets;
2851fbfb8031SShannon Nelson 	__le64 rdma_req_tx_local_access_err;
2852fbfb8031SShannon Nelson 	__le64 rdma_req_tx_local_oper_err;
2853fbfb8031SShannon Nelson 	__le64 rdma_req_tx_memory_mgmt_err;
2854fbfb8031SShannon Nelson 	__le64 rsvd52;
2855fbfb8031SShannon Nelson 	__le64 rsvd53;
2856fbfb8031SShannon Nelson 	__le64 rsvd54;
2857fbfb8031SShannon Nelson 
2858fbfb8031SShannon Nelson 	/* RDMA/ROCE RESP Error/Debugs (896 - 1023) */
2859fbfb8031SShannon Nelson 	__le64 rdma_resp_rx_dup_requests;
2860fbfb8031SShannon Nelson 	__le64 rdma_resp_rx_out_of_buffer;
2861fbfb8031SShannon Nelson 	__le64 rdma_resp_rx_out_of_seq_pkts;
2862fbfb8031SShannon Nelson 	__le64 rdma_resp_rx_cqe_err;
2863fbfb8031SShannon Nelson 	__le64 rdma_resp_rx_cqe_flush_err;
2864fbfb8031SShannon Nelson 	__le64 rdma_resp_rx_local_len_err;
2865fbfb8031SShannon Nelson 	__le64 rdma_resp_rx_inv_request_err;
2866fbfb8031SShannon Nelson 	__le64 rdma_resp_rx_local_qp_oper_err;
2867fbfb8031SShannon Nelson 
2868fbfb8031SShannon Nelson 	__le64 rdma_resp_rx_out_of_atomic_resource;
2869fbfb8031SShannon Nelson 	__le64 rdma_resp_tx_pkt_seq_err;
2870fbfb8031SShannon Nelson 	__le64 rdma_resp_tx_remote_inv_req_err;
2871fbfb8031SShannon Nelson 	__le64 rdma_resp_tx_remote_access_err;
2872fbfb8031SShannon Nelson 	__le64 rdma_resp_tx_remote_oper_err;
2873fbfb8031SShannon Nelson 	__le64 rdma_resp_tx_rnr_retry_err;
2874fbfb8031SShannon Nelson 	__le64 rsvd57;
2875fbfb8031SShannon Nelson 	__le64 rsvd58;
2876fbfb8031SShannon Nelson };
2877fbfb8031SShannon Nelson 
2878fbfb8031SShannon Nelson /**
2879c4e7a75aSShannon Nelson  * struct ionic_lif_info - LIF info structure
2880c4e7a75aSShannon Nelson  * @config:	LIF configuration structure
2881c4e7a75aSShannon Nelson  * @status:	LIF status structure
2882c4e7a75aSShannon Nelson  * @stats:	LIF statistics structure
2883fbfb8031SShannon Nelson  */
2884fbfb8031SShannon Nelson struct ionic_lif_info {
2885fbfb8031SShannon Nelson 	union ionic_lif_config config;
2886fbfb8031SShannon Nelson 	struct ionic_lif_status status;
2887fbfb8031SShannon Nelson 	struct ionic_lif_stats stats;
2888fbfb8031SShannon Nelson };
2889fbfb8031SShannon Nelson 
2890fbfb8031SShannon Nelson union ionic_dev_cmd {
2891fbfb8031SShannon Nelson 	u32 words[16];
2892fbfb8031SShannon Nelson 	struct ionic_admin_cmd cmd;
2893fbfb8031SShannon Nelson 	struct ionic_nop_cmd nop;
2894fbfb8031SShannon Nelson 
2895fbfb8031SShannon Nelson 	struct ionic_dev_identify_cmd identify;
2896fbfb8031SShannon Nelson 	struct ionic_dev_init_cmd init;
2897fbfb8031SShannon Nelson 	struct ionic_dev_reset_cmd reset;
2898fbfb8031SShannon Nelson 	struct ionic_dev_getattr_cmd getattr;
2899fbfb8031SShannon Nelson 	struct ionic_dev_setattr_cmd setattr;
2900fbfb8031SShannon Nelson 
2901fbfb8031SShannon Nelson 	struct ionic_port_identify_cmd port_identify;
2902fbfb8031SShannon Nelson 	struct ionic_port_init_cmd port_init;
2903fbfb8031SShannon Nelson 	struct ionic_port_reset_cmd port_reset;
2904fbfb8031SShannon Nelson 	struct ionic_port_getattr_cmd port_getattr;
2905fbfb8031SShannon Nelson 	struct ionic_port_setattr_cmd port_setattr;
2906fbfb8031SShannon Nelson 
29073d462ce2SShannon Nelson 	struct ionic_vf_setattr_cmd vf_setattr;
29083d462ce2SShannon Nelson 	struct ionic_vf_getattr_cmd vf_getattr;
2909f43a96d9SShannon Nelson 	struct ionic_vf_ctrl_cmd vf_ctrl;
29103d462ce2SShannon Nelson 
2911fbfb8031SShannon Nelson 	struct ionic_lif_identify_cmd lif_identify;
2912fbfb8031SShannon Nelson 	struct ionic_lif_init_cmd lif_init;
2913fbfb8031SShannon Nelson 	struct ionic_lif_reset_cmd lif_reset;
2914fbfb8031SShannon Nelson 
2915fbfb8031SShannon Nelson 	struct ionic_qos_identify_cmd qos_identify;
2916fbfb8031SShannon Nelson 	struct ionic_qos_init_cmd qos_init;
2917fbfb8031SShannon Nelson 	struct ionic_qos_reset_cmd qos_reset;
29181b897e7dSShannon Nelson 	struct ionic_qos_clear_stats_cmd qos_clear_stats;
2919fbfb8031SShannon Nelson 
29205b3f3f2aSShannon Nelson 	struct ionic_q_identify_cmd q_identify;
2921fbfb8031SShannon Nelson 	struct ionic_q_init_cmd q_init;
2922c4e7a75aSShannon Nelson 	struct ionic_q_control_cmd q_control;
292387c905d8SShannon Nelson 
292487c905d8SShannon Nelson 	struct ionic_fw_download_cmd fw_download;
292587c905d8SShannon Nelson 	struct ionic_fw_control_cmd fw_control;
2926fbfb8031SShannon Nelson };
2927fbfb8031SShannon Nelson 
2928fbfb8031SShannon Nelson union ionic_dev_cmd_comp {
2929fbfb8031SShannon Nelson 	u32 words[4];
2930fbfb8031SShannon Nelson 	u8 status;
2931fbfb8031SShannon Nelson 	struct ionic_admin_comp comp;
2932fbfb8031SShannon Nelson 	struct ionic_nop_comp nop;
2933fbfb8031SShannon Nelson 
2934fbfb8031SShannon Nelson 	struct ionic_dev_identify_comp identify;
2935fbfb8031SShannon Nelson 	struct ionic_dev_init_comp init;
2936fbfb8031SShannon Nelson 	struct ionic_dev_reset_comp reset;
2937fbfb8031SShannon Nelson 	struct ionic_dev_getattr_comp getattr;
2938fbfb8031SShannon Nelson 	struct ionic_dev_setattr_comp setattr;
2939fbfb8031SShannon Nelson 
2940fbfb8031SShannon Nelson 	struct ionic_port_identify_comp port_identify;
2941fbfb8031SShannon Nelson 	struct ionic_port_init_comp port_init;
2942fbfb8031SShannon Nelson 	struct ionic_port_reset_comp port_reset;
2943fbfb8031SShannon Nelson 	struct ionic_port_getattr_comp port_getattr;
2944fbfb8031SShannon Nelson 	struct ionic_port_setattr_comp port_setattr;
2945fbfb8031SShannon Nelson 
29463d462ce2SShannon Nelson 	struct ionic_vf_setattr_comp vf_setattr;
29473d462ce2SShannon Nelson 	struct ionic_vf_getattr_comp vf_getattr;
2948f43a96d9SShannon Nelson 	struct ionic_vf_ctrl_comp vf_ctrl;
29493d462ce2SShannon Nelson 
2950fbfb8031SShannon Nelson 	struct ionic_lif_identify_comp lif_identify;
2951fbfb8031SShannon Nelson 	struct ionic_lif_init_comp lif_init;
2952fbfb8031SShannon Nelson 	ionic_lif_reset_comp lif_reset;
2953fbfb8031SShannon Nelson 
2954fbfb8031SShannon Nelson 	struct ionic_qos_identify_comp qos_identify;
2955fbfb8031SShannon Nelson 	ionic_qos_init_comp qos_init;
2956fbfb8031SShannon Nelson 	ionic_qos_reset_comp qos_reset;
2957fbfb8031SShannon Nelson 
29585b3f3f2aSShannon Nelson 	struct ionic_q_identify_comp q_identify;
2959fbfb8031SShannon Nelson 	struct ionic_q_init_comp q_init;
296087c905d8SShannon Nelson 
296187c905d8SShannon Nelson 	ionic_fw_download_comp fw_download;
296287c905d8SShannon Nelson 	struct ionic_fw_control_comp fw_control;
2963fbfb8031SShannon Nelson };
2964fbfb8031SShannon Nelson 
2965fbfb8031SShannon Nelson /**
29663da25843SShannon Nelson  * struct ionic_hwstamp_regs - Hardware current timestamp registers
29673da25843SShannon Nelson  * @tick_low:        Low 32 bits of hardware timestamp
29683da25843SShannon Nelson  * @tick_high:       High 32 bits of hardware timestamp
29693da25843SShannon Nelson  */
29703da25843SShannon Nelson struct ionic_hwstamp_regs {
29713da25843SShannon Nelson 	u32    tick_low;
29723da25843SShannon Nelson 	u32    tick_high;
29733da25843SShannon Nelson };
29743da25843SShannon Nelson 
29753da25843SShannon Nelson /**
2976c4e7a75aSShannon Nelson  * union ionic_dev_info_regs - Device info register format (read-only)
2977c4e7a75aSShannon Nelson  * @signature:       Signature value of 0x44455649 ('DEVI')
2978c4e7a75aSShannon Nelson  * @version:         Current version of info
2979c4e7a75aSShannon Nelson  * @asic_type:       Asic type
2980c4e7a75aSShannon Nelson  * @asic_rev:        Asic revision
2981c4e7a75aSShannon Nelson  * @fw_status:       Firmware status
2982d2662072SShannon Nelson  *			bit 0   - 1 = fw running
2983d2662072SShannon Nelson  *			bit 4-7 - 4 bit generation number, changes on fw restart
2984c4e7a75aSShannon Nelson  * @fw_heartbeat:    Firmware heartbeat counter
2985c4e7a75aSShannon Nelson  * @serial_num:      Serial number
2986c4e7a75aSShannon Nelson  * @fw_version:      Firmware version
29873da25843SShannon Nelson  * @hwstamp_regs:    Hardware current timestamp registers
2988fbfb8031SShannon Nelson  */
2989fbfb8031SShannon Nelson union ionic_dev_info_regs {
2990fbfb8031SShannon Nelson #define IONIC_DEVINFO_FWVERS_BUFLEN 32
2991fbfb8031SShannon Nelson #define IONIC_DEVINFO_SERIAL_BUFLEN 32
2992fbfb8031SShannon Nelson 	struct {
2993fbfb8031SShannon Nelson 		u32    signature;
2994fbfb8031SShannon Nelson 		u8     version;
2995fbfb8031SShannon Nelson 		u8     asic_type;
2996fbfb8031SShannon Nelson 		u8     asic_rev;
2997d2662072SShannon Nelson #define IONIC_FW_STS_F_RUNNING		0x01
2998d2662072SShannon Nelson #define IONIC_FW_STS_F_GENERATION	0xF0
2999fbfb8031SShannon Nelson 		u8     fw_status;
3000fbfb8031SShannon Nelson 		u32    fw_heartbeat;
3001fbfb8031SShannon Nelson 		char   fw_version[IONIC_DEVINFO_FWVERS_BUFLEN];
3002fbfb8031SShannon Nelson 		char   serial_num[IONIC_DEVINFO_SERIAL_BUFLEN];
30033da25843SShannon Nelson 		u8     rsvd_pad1024[948];
30043da25843SShannon Nelson 		struct ionic_hwstamp_regs hwstamp;
3005fbfb8031SShannon Nelson 	};
3006fbfb8031SShannon Nelson 	u32 words[512];
3007fbfb8031SShannon Nelson };
3008fbfb8031SShannon Nelson 
3009fbfb8031SShannon Nelson /**
30105c28f213SShannon Nelson  * union ionic_dev_cmd_regs - Device command register format (read-write)
3011c4e7a75aSShannon Nelson  * @doorbell:        Device Cmd Doorbell, write-only
3012fbfb8031SShannon Nelson  *                   Write a 1 to signal device to process cmd,
3013fbfb8031SShannon Nelson  *                   poll done for completion.
3014c4e7a75aSShannon Nelson  * @done:            Done indicator, bit 0 == 1 when command is complete
3015fbfb8031SShannon Nelson  * @cmd:             Opcode-specific command bytes
3016fbfb8031SShannon Nelson  * @comp:            Opcode-specific response bytes
3017fbfb8031SShannon Nelson  * @data:            Opcode-specific side-data
3018fbfb8031SShannon Nelson  */
3019fbfb8031SShannon Nelson union ionic_dev_cmd_regs {
3020fbfb8031SShannon Nelson 	struct {
3021fbfb8031SShannon Nelson 		u32                   doorbell;
3022fbfb8031SShannon Nelson 		u32                   done;
3023fbfb8031SShannon Nelson 		union ionic_dev_cmd         cmd;
3024fbfb8031SShannon Nelson 		union ionic_dev_cmd_comp    comp;
3025fbfb8031SShannon Nelson 		u8                    rsvd[48];
3026fbfb8031SShannon Nelson 		u32                   data[478];
30275dca69c4SShannon Nelson 	} __packed;
3028fbfb8031SShannon Nelson 	u32 words[512];
3029fbfb8031SShannon Nelson };
3030fbfb8031SShannon Nelson 
3031fbfb8031SShannon Nelson /**
3032c4e7a75aSShannon Nelson  * union ionic_dev_regs - Device register format for bar 0 page 0
3033fbfb8031SShannon Nelson  * @info:            Device info registers
3034fbfb8031SShannon Nelson  * @devcmd:          Device command registers
3035fbfb8031SShannon Nelson  */
3036fbfb8031SShannon Nelson union ionic_dev_regs {
3037fbfb8031SShannon Nelson 	struct {
3038fbfb8031SShannon Nelson 		union ionic_dev_info_regs info;
3039fbfb8031SShannon Nelson 		union ionic_dev_cmd_regs  devcmd;
30405dca69c4SShannon Nelson 	} __packed;
3041fbfb8031SShannon Nelson 	__le32 words[1024];
3042fbfb8031SShannon Nelson };
3043fbfb8031SShannon Nelson 
3044fbfb8031SShannon Nelson union ionic_adminq_cmd {
3045fbfb8031SShannon Nelson 	struct ionic_admin_cmd cmd;
3046fbfb8031SShannon Nelson 	struct ionic_nop_cmd nop;
3047c4e7a75aSShannon Nelson 	struct ionic_q_identify_cmd q_identify;
3048fbfb8031SShannon Nelson 	struct ionic_q_init_cmd q_init;
3049fbfb8031SShannon Nelson 	struct ionic_q_control_cmd q_control;
3050fbfb8031SShannon Nelson 	struct ionic_lif_setattr_cmd lif_setattr;
3051fbfb8031SShannon Nelson 	struct ionic_lif_getattr_cmd lif_getattr;
30523da25843SShannon Nelson 	struct ionic_lif_setphc_cmd lif_setphc;
3053fbfb8031SShannon Nelson 	struct ionic_rx_mode_set_cmd rx_mode_set;
3054fbfb8031SShannon Nelson 	struct ionic_rx_filter_add_cmd rx_filter_add;
3055fbfb8031SShannon Nelson 	struct ionic_rx_filter_del_cmd rx_filter_del;
3056fbfb8031SShannon Nelson 	struct ionic_rdma_reset_cmd rdma_reset;
3057fbfb8031SShannon Nelson 	struct ionic_rdma_queue_cmd rdma_queue;
3058fbfb8031SShannon Nelson 	struct ionic_fw_download_cmd fw_download;
3059fbfb8031SShannon Nelson 	struct ionic_fw_control_cmd fw_control;
3060fbfb8031SShannon Nelson };
3061fbfb8031SShannon Nelson 
3062fbfb8031SShannon Nelson union ionic_adminq_comp {
3063fbfb8031SShannon Nelson 	struct ionic_admin_comp comp;
3064fbfb8031SShannon Nelson 	struct ionic_nop_comp nop;
3065c4e7a75aSShannon Nelson 	struct ionic_q_identify_comp q_identify;
3066fbfb8031SShannon Nelson 	struct ionic_q_init_comp q_init;
3067fbfb8031SShannon Nelson 	struct ionic_lif_setattr_comp lif_setattr;
3068fbfb8031SShannon Nelson 	struct ionic_lif_getattr_comp lif_getattr;
30693da25843SShannon Nelson 	struct ionic_admin_comp lif_setphc;
3070fbfb8031SShannon Nelson 	struct ionic_rx_filter_add_comp rx_filter_add;
3071fbfb8031SShannon Nelson 	struct ionic_fw_control_comp fw_control;
3072fbfb8031SShannon Nelson };
3073fbfb8031SShannon Nelson 
3074fbfb8031SShannon Nelson #define IONIC_BARS_MAX			6
3075fbfb8031SShannon Nelson #define IONIC_PCI_BAR_DBELL		1
3076*40bc471dSShannon Nelson #define IONIC_PCI_BAR_CMB		2
3077fbfb8031SShannon Nelson 
3078fbfb8031SShannon Nelson #define IONIC_BAR0_SIZE				0x8000
3079*40bc471dSShannon Nelson #define IONIC_BAR2_SIZE				0x800000
3080fbfb8031SShannon Nelson 
3081fbfb8031SShannon Nelson #define IONIC_BAR0_DEV_INFO_REGS_OFFSET		0x0000
3082fbfb8031SShannon Nelson #define IONIC_BAR0_DEV_CMD_REGS_OFFSET		0x0800
3083fbfb8031SShannon Nelson #define IONIC_BAR0_DEV_CMD_DATA_REGS_OFFSET	0x0c00
3084fbfb8031SShannon Nelson #define IONIC_BAR0_INTR_STATUS_OFFSET		0x1000
3085fbfb8031SShannon Nelson #define IONIC_BAR0_INTR_CTRL_OFFSET		0x2000
3086fbfb8031SShannon Nelson #define IONIC_DEV_CMD_DONE			0x00000001
3087fbfb8031SShannon Nelson 
3088fbfb8031SShannon Nelson #define IONIC_ASIC_TYPE_CAPRI			0
3089fbfb8031SShannon Nelson 
3090fbfb8031SShannon Nelson /**
30915c28f213SShannon Nelson  * struct ionic_doorbell - Doorbell register layout
3092fbfb8031SShannon Nelson  * @p_index: Producer index
3093c4e7a75aSShannon Nelson  * @ring:    Selects the specific ring of the queue to update
3094fbfb8031SShannon Nelson  *           Type-specific meaning:
3095c4e7a75aSShannon Nelson  *              ring=0: Default producer/consumer queue
3096fbfb8031SShannon Nelson  *              ring=1: (CQ, EQ) Re-Arm queue.  RDMA CQs
3097fbfb8031SShannon Nelson  *              send events to EQs when armed.  EQs send
3098fbfb8031SShannon Nelson  *              interrupts when armed.
3099c4e7a75aSShannon Nelson  * @qid_lo:  Queue destination for the producer index and flags (low bits)
3100c4e7a75aSShannon Nelson  * @qid_hi:  Queue destination for the producer index and flags (high bits)
3101fbfb8031SShannon Nelson  */
3102fbfb8031SShannon Nelson struct ionic_doorbell {
3103fbfb8031SShannon Nelson 	__le16 p_index;
3104fbfb8031SShannon Nelson 	u8     ring;
3105fbfb8031SShannon Nelson 	u8     qid_lo;
3106fbfb8031SShannon Nelson 	__le16 qid_hi;
3107fbfb8031SShannon Nelson 	u16    rsvd2;
3108fbfb8031SShannon Nelson };
3109fbfb8031SShannon Nelson 
3110fbfb8031SShannon Nelson struct ionic_intr_status {
3111fbfb8031SShannon Nelson 	u32 status[2];
3112fbfb8031SShannon Nelson };
3113fbfb8031SShannon Nelson 
3114fbfb8031SShannon Nelson struct ionic_notifyq_cmd {
3115fbfb8031SShannon Nelson 	__le32 data;	/* Not used but needed for qcq structure */
3116fbfb8031SShannon Nelson };
3117fbfb8031SShannon Nelson 
3118fbfb8031SShannon Nelson union ionic_notifyq_comp {
3119fbfb8031SShannon Nelson 	struct ionic_notifyq_event event;
3120fbfb8031SShannon Nelson 	struct ionic_link_change_event link_change;
3121fbfb8031SShannon Nelson 	struct ionic_reset_event reset;
3122fbfb8031SShannon Nelson 	struct ionic_heartbeat_event heartbeat;
3123fbfb8031SShannon Nelson 	struct ionic_log_event log;
3124fbfb8031SShannon Nelson };
3125fbfb8031SShannon Nelson 
3126fbfb8031SShannon Nelson /* Deprecate */
3127fbfb8031SShannon Nelson struct ionic_identity {
3128fbfb8031SShannon Nelson 	union ionic_drv_identity drv;
3129fbfb8031SShannon Nelson 	union ionic_dev_identity dev;
3130fbfb8031SShannon Nelson 	union ionic_lif_identity lif;
3131fbfb8031SShannon Nelson 	union ionic_port_identity port;
3132fbfb8031SShannon Nelson 	union ionic_qos_identity qos;
3133c4e7a75aSShannon Nelson 	union ionic_q_identity txq;
3134fbfb8031SShannon Nelson };
3135fbfb8031SShannon Nelson 
3136fbfb8031SShannon Nelson #endif /* _IONIC_IF_H_ */
3137