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