xref: /dpdk/drivers/net/ionic/ionic_if.h (revision b53d106d34b5c638f5a2cbdfee0da5bd42d4383f)
101489e5dSAlfredo Cardigliano /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB OR BSD-3-Clause */
2126fe197SAndrew Boyer /* Copyright (c) 2017-2020 Pensando Systems, Inc.  All rights reserved. */
301489e5dSAlfredo Cardigliano 
401489e5dSAlfredo Cardigliano #ifndef _IONIC_IF_H_
501489e5dSAlfredo Cardigliano #define _IONIC_IF_H_
601489e5dSAlfredo Cardigliano 
701489e5dSAlfredo Cardigliano #define IONIC_DEV_INFO_SIGNATURE		0x44455649      /* 'DEVI' */
801489e5dSAlfredo Cardigliano #define IONIC_DEV_INFO_VERSION			1
901489e5dSAlfredo Cardigliano #define IONIC_IFNAMSIZ				16
1001489e5dSAlfredo Cardigliano 
1101489e5dSAlfredo Cardigliano /**
12126fe197SAndrew Boyer  * enum ionic_cmd_opcode - Device commands
1301489e5dSAlfredo Cardigliano  */
1401489e5dSAlfredo Cardigliano enum ionic_cmd_opcode {
1501489e5dSAlfredo Cardigliano 	IONIC_CMD_NOP				= 0,
1601489e5dSAlfredo Cardigliano 
1701489e5dSAlfredo Cardigliano 	/* Device commands */
1801489e5dSAlfredo Cardigliano 	IONIC_CMD_IDENTIFY			= 1,
1901489e5dSAlfredo Cardigliano 	IONIC_CMD_INIT				= 2,
2001489e5dSAlfredo Cardigliano 	IONIC_CMD_RESET				= 3,
2101489e5dSAlfredo Cardigliano 	IONIC_CMD_GETATTR			= 4,
2201489e5dSAlfredo Cardigliano 	IONIC_CMD_SETATTR			= 5,
2301489e5dSAlfredo Cardigliano 
2401489e5dSAlfredo Cardigliano 	/* Port commands */
2501489e5dSAlfredo Cardigliano 	IONIC_CMD_PORT_IDENTIFY			= 10,
2601489e5dSAlfredo Cardigliano 	IONIC_CMD_PORT_INIT			= 11,
2701489e5dSAlfredo Cardigliano 	IONIC_CMD_PORT_RESET			= 12,
2801489e5dSAlfredo Cardigliano 	IONIC_CMD_PORT_GETATTR			= 13,
2901489e5dSAlfredo Cardigliano 	IONIC_CMD_PORT_SETATTR			= 14,
3001489e5dSAlfredo Cardigliano 
3101489e5dSAlfredo Cardigliano 	/* LIF commands */
3201489e5dSAlfredo Cardigliano 	IONIC_CMD_LIF_IDENTIFY			= 20,
3301489e5dSAlfredo Cardigliano 	IONIC_CMD_LIF_INIT			= 21,
3401489e5dSAlfredo Cardigliano 	IONIC_CMD_LIF_RESET			= 22,
3501489e5dSAlfredo Cardigliano 	IONIC_CMD_LIF_GETATTR			= 23,
3601489e5dSAlfredo Cardigliano 	IONIC_CMD_LIF_SETATTR			= 24,
3701489e5dSAlfredo Cardigliano 
3801489e5dSAlfredo Cardigliano 	IONIC_CMD_RX_MODE_SET			= 30,
3901489e5dSAlfredo Cardigliano 	IONIC_CMD_RX_FILTER_ADD			= 31,
4001489e5dSAlfredo Cardigliano 	IONIC_CMD_RX_FILTER_DEL			= 32,
4101489e5dSAlfredo Cardigliano 
4201489e5dSAlfredo Cardigliano 	/* Queue commands */
43126fe197SAndrew Boyer 	IONIC_CMD_Q_IDENTIFY			= 39,
4401489e5dSAlfredo Cardigliano 	IONIC_CMD_Q_INIT			= 40,
4501489e5dSAlfredo Cardigliano 	IONIC_CMD_Q_CONTROL			= 41,
4601489e5dSAlfredo Cardigliano 
4701489e5dSAlfredo Cardigliano 	/* RDMA commands */
4801489e5dSAlfredo Cardigliano 	IONIC_CMD_RDMA_RESET_LIF		= 50,
4901489e5dSAlfredo Cardigliano 	IONIC_CMD_RDMA_CREATE_EQ		= 51,
5001489e5dSAlfredo Cardigliano 	IONIC_CMD_RDMA_CREATE_CQ		= 52,
5101489e5dSAlfredo Cardigliano 	IONIC_CMD_RDMA_CREATE_ADMINQ		= 53,
5201489e5dSAlfredo Cardigliano 
53126fe197SAndrew Boyer 	/* SR/IOV commands */
54126fe197SAndrew Boyer 	IONIC_CMD_VF_GETATTR			= 60,
55126fe197SAndrew Boyer 	IONIC_CMD_VF_SETATTR			= 61,
56126fe197SAndrew Boyer 
5701489e5dSAlfredo Cardigliano 	/* QoS commands */
5801489e5dSAlfredo Cardigliano 	IONIC_CMD_QOS_CLASS_IDENTIFY		= 240,
5901489e5dSAlfredo Cardigliano 	IONIC_CMD_QOS_CLASS_INIT		= 241,
6001489e5dSAlfredo Cardigliano 	IONIC_CMD_QOS_CLASS_RESET		= 242,
61126fe197SAndrew Boyer 	IONIC_CMD_QOS_CLASS_UPDATE		= 243,
62126fe197SAndrew Boyer 	IONIC_CMD_QOS_CLEAR_STATS		= 244,
63126fe197SAndrew Boyer 	IONIC_CMD_QOS_RESET			= 245,
6401489e5dSAlfredo Cardigliano 
6501489e5dSAlfredo Cardigliano 	/* Firmware commands */
6601489e5dSAlfredo Cardigliano 	IONIC_CMD_FW_DOWNLOAD			= 254,
6701489e5dSAlfredo Cardigliano 	IONIC_CMD_FW_CONTROL			= 255,
6801489e5dSAlfredo Cardigliano };
6901489e5dSAlfredo Cardigliano 
7001489e5dSAlfredo Cardigliano /**
71126fe197SAndrew Boyer  * enum ionic_status_code - Device command return codes
7201489e5dSAlfredo Cardigliano  */
7301489e5dSAlfredo Cardigliano enum ionic_status_code {
7401489e5dSAlfredo Cardigliano 	IONIC_RC_SUCCESS	= 0,	/* Success */
7501489e5dSAlfredo Cardigliano 	IONIC_RC_EVERSION	= 1,	/* Incorrect version for request */
7601489e5dSAlfredo Cardigliano 	IONIC_RC_EOPCODE	= 2,	/* Invalid cmd opcode */
7701489e5dSAlfredo Cardigliano 	IONIC_RC_EIO		= 3,	/* I/O error */
7801489e5dSAlfredo Cardigliano 	IONIC_RC_EPERM		= 4,	/* Permission denied */
7901489e5dSAlfredo Cardigliano 	IONIC_RC_EQID		= 5,	/* Bad qid */
8001489e5dSAlfredo Cardigliano 	IONIC_RC_EQTYPE		= 6,	/* Bad qtype */
8101489e5dSAlfredo Cardigliano 	IONIC_RC_ENOENT		= 7,	/* No such element */
8201489e5dSAlfredo Cardigliano 	IONIC_RC_EINTR		= 8,	/* operation interrupted */
8301489e5dSAlfredo Cardigliano 	IONIC_RC_EAGAIN		= 9,	/* Try again */
8401489e5dSAlfredo Cardigliano 	IONIC_RC_ENOMEM		= 10,	/* Out of memory */
8501489e5dSAlfredo Cardigliano 	IONIC_RC_EFAULT		= 11,	/* Bad address */
8601489e5dSAlfredo Cardigliano 	IONIC_RC_EBUSY		= 12,	/* Device or resource busy */
8701489e5dSAlfredo Cardigliano 	IONIC_RC_EEXIST		= 13,	/* object already exists */
8801489e5dSAlfredo Cardigliano 	IONIC_RC_EINVAL		= 14,	/* Invalid argument */
8901489e5dSAlfredo Cardigliano 	IONIC_RC_ENOSPC		= 15,	/* No space left or alloc failure */
9001489e5dSAlfredo Cardigliano 	IONIC_RC_ERANGE		= 16,	/* Parameter out of range */
9101489e5dSAlfredo Cardigliano 	IONIC_RC_BAD_ADDR	= 17,	/* Descriptor contains a bad ptr */
9201489e5dSAlfredo Cardigliano 	IONIC_RC_DEV_CMD	= 18,	/* Device cmd attempted on AdminQ */
9301489e5dSAlfredo Cardigliano 	IONIC_RC_ENOSUPP	= 19,	/* Operation not supported */
9401489e5dSAlfredo Cardigliano 	IONIC_RC_ERROR		= 29,	/* Generic error */
9501489e5dSAlfredo Cardigliano 	IONIC_RC_ERDMA		= 30,	/* Generic RDMA error */
96126fe197SAndrew Boyer 	IONIC_RC_EVFID		= 31,	/* VF ID does not exist */
9701489e5dSAlfredo Cardigliano };
9801489e5dSAlfredo Cardigliano 
9901489e5dSAlfredo Cardigliano enum ionic_notifyq_opcode {
10001489e5dSAlfredo Cardigliano 	IONIC_EVENT_LINK_CHANGE		= 1,
10101489e5dSAlfredo Cardigliano 	IONIC_EVENT_RESET		= 2,
10201489e5dSAlfredo Cardigliano 	IONIC_EVENT_HEARTBEAT		= 3,
10301489e5dSAlfredo Cardigliano 	IONIC_EVENT_LOG			= 4,
104126fe197SAndrew Boyer 	IONIC_EVENT_XCVR		= 5,
10501489e5dSAlfredo Cardigliano };
10601489e5dSAlfredo Cardigliano 
10701489e5dSAlfredo Cardigliano /**
108126fe197SAndrew Boyer  * struct ionic_admin_cmd - General admin command format
10901489e5dSAlfredo Cardigliano  * @opcode:     Opcode for the command
11001489e5dSAlfredo Cardigliano  * @lif_index:  LIF index
11101489e5dSAlfredo Cardigliano  * @cmd_data:   Opcode-specific command bytes
11201489e5dSAlfredo Cardigliano  */
11301489e5dSAlfredo Cardigliano struct ionic_admin_cmd {
11401489e5dSAlfredo Cardigliano 	u8     opcode;
11501489e5dSAlfredo Cardigliano 	u8     rsvd;
11601489e5dSAlfredo Cardigliano 	__le16 lif_index;
11701489e5dSAlfredo Cardigliano 	u8     cmd_data[60];
11801489e5dSAlfredo Cardigliano };
11901489e5dSAlfredo Cardigliano 
12001489e5dSAlfredo Cardigliano /**
12101489e5dSAlfredo Cardigliano  * struct ionic_admin_comp - General admin command completion format
122126fe197SAndrew Boyer  * @status:     Status of the command (enum ionic_status_code)
123126fe197SAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
124126fe197SAndrew Boyer  * @cmd_data:   Command-specific bytes
125126fe197SAndrew Boyer  * @color:      Color bit (Always 0 for commands issued to the
126126fe197SAndrew Boyer  *              Device Cmd Registers)
12701489e5dSAlfredo Cardigliano  */
12801489e5dSAlfredo Cardigliano struct ionic_admin_comp {
12901489e5dSAlfredo Cardigliano 	u8     status;
13001489e5dSAlfredo Cardigliano 	u8     rsvd;
13101489e5dSAlfredo Cardigliano 	__le16 comp_index;
13201489e5dSAlfredo Cardigliano 	u8     cmd_data[11];
13301489e5dSAlfredo Cardigliano 	u8     color;
13401489e5dSAlfredo Cardigliano #define IONIC_COMP_COLOR_MASK  0x80
13501489e5dSAlfredo Cardigliano };
13601489e5dSAlfredo Cardigliano 
13701489e5dSAlfredo Cardigliano static inline u8 color_match(u8 color, u8 done_color)
13801489e5dSAlfredo Cardigliano {
13901489e5dSAlfredo Cardigliano 	return (!!(color & IONIC_COMP_COLOR_MASK)) == done_color;
14001489e5dSAlfredo Cardigliano }
14101489e5dSAlfredo Cardigliano 
14201489e5dSAlfredo Cardigliano /**
14301489e5dSAlfredo Cardigliano  * struct ionic_nop_cmd - NOP command
14401489e5dSAlfredo Cardigliano  * @opcode: opcode
14501489e5dSAlfredo Cardigliano  */
14601489e5dSAlfredo Cardigliano struct ionic_nop_cmd {
14701489e5dSAlfredo Cardigliano 	u8 opcode;
14801489e5dSAlfredo Cardigliano 	u8 rsvd[63];
14901489e5dSAlfredo Cardigliano };
15001489e5dSAlfredo Cardigliano 
15101489e5dSAlfredo Cardigliano /**
15201489e5dSAlfredo Cardigliano  * struct ionic_nop_comp - NOP command completion
153126fe197SAndrew Boyer  * @status: Status of the command (enum ionic_status_code)
15401489e5dSAlfredo Cardigliano  */
15501489e5dSAlfredo Cardigliano struct ionic_nop_comp {
15601489e5dSAlfredo Cardigliano 	u8 status;
15701489e5dSAlfredo Cardigliano 	u8 rsvd[15];
15801489e5dSAlfredo Cardigliano };
15901489e5dSAlfredo Cardigliano 
16001489e5dSAlfredo Cardigliano /**
16101489e5dSAlfredo Cardigliano  * struct ionic_dev_init_cmd - Device init command
16201489e5dSAlfredo Cardigliano  * @opcode:    opcode
163126fe197SAndrew Boyer  * @type:      Device type
16401489e5dSAlfredo Cardigliano  */
16501489e5dSAlfredo Cardigliano struct ionic_dev_init_cmd {
16601489e5dSAlfredo Cardigliano 	u8     opcode;
16701489e5dSAlfredo Cardigliano 	u8     type;
16801489e5dSAlfredo Cardigliano 	u8     rsvd[62];
16901489e5dSAlfredo Cardigliano };
17001489e5dSAlfredo Cardigliano 
17101489e5dSAlfredo Cardigliano /**
172126fe197SAndrew Boyer  * struct ionic_dev_init_comp - Device init command completion
173126fe197SAndrew Boyer  * @status: Status of the command (enum ionic_status_code)
17401489e5dSAlfredo Cardigliano  */
17501489e5dSAlfredo Cardigliano struct ionic_dev_init_comp {
17601489e5dSAlfredo Cardigliano 	u8 status;
17701489e5dSAlfredo Cardigliano 	u8 rsvd[15];
17801489e5dSAlfredo Cardigliano };
17901489e5dSAlfredo Cardigliano 
18001489e5dSAlfredo Cardigliano /**
18101489e5dSAlfredo Cardigliano  * struct ionic_dev_reset_cmd - Device reset command
18201489e5dSAlfredo Cardigliano  * @opcode: opcode
18301489e5dSAlfredo Cardigliano  */
18401489e5dSAlfredo Cardigliano struct ionic_dev_reset_cmd {
18501489e5dSAlfredo Cardigliano 	u8 opcode;
18601489e5dSAlfredo Cardigliano 	u8 rsvd[63];
18701489e5dSAlfredo Cardigliano };
18801489e5dSAlfredo Cardigliano 
18901489e5dSAlfredo Cardigliano /**
190126fe197SAndrew Boyer  * struct ionic_dev_reset_comp - Reset command completion
191126fe197SAndrew Boyer  * @status: Status of the command (enum ionic_status_code)
19201489e5dSAlfredo Cardigliano  */
19301489e5dSAlfredo Cardigliano struct ionic_dev_reset_comp {
19401489e5dSAlfredo Cardigliano 	u8 status;
19501489e5dSAlfredo Cardigliano 	u8 rsvd[15];
19601489e5dSAlfredo Cardigliano };
19701489e5dSAlfredo Cardigliano 
19801489e5dSAlfredo Cardigliano #define IONIC_IDENTITY_VERSION_1	1
19901489e5dSAlfredo Cardigliano 
20001489e5dSAlfredo Cardigliano /**
20101489e5dSAlfredo Cardigliano  * struct ionic_dev_identify_cmd - Driver/device identify command
20201489e5dSAlfredo Cardigliano  * @opcode:  opcode
20301489e5dSAlfredo Cardigliano  * @ver:     Highest version of identify supported by driver
20401489e5dSAlfredo Cardigliano  */
20501489e5dSAlfredo Cardigliano struct ionic_dev_identify_cmd {
20601489e5dSAlfredo Cardigliano 	u8 opcode;
20701489e5dSAlfredo Cardigliano 	u8 ver;
20801489e5dSAlfredo Cardigliano 	u8 rsvd[62];
20901489e5dSAlfredo Cardigliano };
21001489e5dSAlfredo Cardigliano 
21101489e5dSAlfredo Cardigliano /**
212126fe197SAndrew Boyer  * struct ionic_dev_identify_comp - Driver/device identify command completion
213126fe197SAndrew Boyer  * @status: Status of the command (enum ionic_status_code)
21401489e5dSAlfredo Cardigliano  * @ver:    Version of identify returned by device
21501489e5dSAlfredo Cardigliano  */
21601489e5dSAlfredo Cardigliano struct ionic_dev_identify_comp {
21701489e5dSAlfredo Cardigliano 	u8 status;
21801489e5dSAlfredo Cardigliano 	u8 ver;
21901489e5dSAlfredo Cardigliano 	u8 rsvd[14];
22001489e5dSAlfredo Cardigliano };
22101489e5dSAlfredo Cardigliano 
22201489e5dSAlfredo Cardigliano enum ionic_os_type {
22301489e5dSAlfredo Cardigliano 	IONIC_OS_TYPE_LINUX   = 1,
22401489e5dSAlfredo Cardigliano 	IONIC_OS_TYPE_WIN     = 2,
22501489e5dSAlfredo Cardigliano 	IONIC_OS_TYPE_DPDK    = 3,
22601489e5dSAlfredo Cardigliano 	IONIC_OS_TYPE_FREEBSD = 4,
22701489e5dSAlfredo Cardigliano 	IONIC_OS_TYPE_IPXE    = 5,
22801489e5dSAlfredo Cardigliano 	IONIC_OS_TYPE_ESXI    = 6,
22901489e5dSAlfredo Cardigliano };
23001489e5dSAlfredo Cardigliano 
23101489e5dSAlfredo Cardigliano /**
232126fe197SAndrew Boyer  * union ionic_drv_identity - driver identity information
233126fe197SAndrew Boyer  * @os_type:          OS type (see enum ionic_os_type)
23401489e5dSAlfredo Cardigliano  * @os_dist:          OS distribution, numeric format
23501489e5dSAlfredo Cardigliano  * @os_dist_str:      OS distribution, string format
23601489e5dSAlfredo Cardigliano  * @kernel_ver:       Kernel version, numeric format
23701489e5dSAlfredo Cardigliano  * @kernel_ver_str:   Kernel version, string format
23801489e5dSAlfredo Cardigliano  * @driver_ver_str:   Driver version, string format
23901489e5dSAlfredo Cardigliano  */
24001489e5dSAlfredo Cardigliano union ionic_drv_identity {
24101489e5dSAlfredo Cardigliano 	struct {
24201489e5dSAlfredo Cardigliano 		__le32 os_type;
24301489e5dSAlfredo Cardigliano 		__le32 os_dist;
24401489e5dSAlfredo Cardigliano 		char   os_dist_str[128];
24501489e5dSAlfredo Cardigliano 		__le32 kernel_ver;
24601489e5dSAlfredo Cardigliano 		char   kernel_ver_str[32];
24701489e5dSAlfredo Cardigliano 		char   driver_ver_str[32];
24801489e5dSAlfredo Cardigliano 	};
249126fe197SAndrew Boyer 	__le32 words[478];
25001489e5dSAlfredo Cardigliano };
25101489e5dSAlfredo Cardigliano 
25201489e5dSAlfredo Cardigliano /**
253126fe197SAndrew Boyer  * union ionic_dev_identity - device identity information
25401489e5dSAlfredo Cardigliano  * @version:          Version of device identify
25501489e5dSAlfredo Cardigliano  * @type:             Identify type (0 for now)
25601489e5dSAlfredo Cardigliano  * @nports:           Number of ports provisioned
25701489e5dSAlfredo Cardigliano  * @nlifs:            Number of LIFs provisioned
25801489e5dSAlfredo Cardigliano  * @nintrs:           Number of interrupts provisioned
25901489e5dSAlfredo Cardigliano  * @ndbpgs_per_lif:   Number of doorbell pages per LIF
260126fe197SAndrew Boyer  * @intr_coal_mult:   Interrupt coalescing multiplication factor
26101489e5dSAlfredo Cardigliano  *                    Scale user-supplied interrupt coalescing
26201489e5dSAlfredo Cardigliano  *                    value in usecs to device units using:
26301489e5dSAlfredo Cardigliano  *                    device units = usecs * mult / div
264126fe197SAndrew Boyer  * @intr_coal_div:    Interrupt coalescing division factor
26501489e5dSAlfredo Cardigliano  *                    Scale user-supplied interrupt coalescing
26601489e5dSAlfredo Cardigliano  *                    value in usecs to device units using:
26701489e5dSAlfredo Cardigliano  *                    device units = usecs * mult / div
268126fe197SAndrew Boyer  * @eq_count:         Number of shared event queues
26901489e5dSAlfredo Cardigliano  */
27001489e5dSAlfredo Cardigliano union ionic_dev_identity {
27101489e5dSAlfredo Cardigliano 	struct {
27201489e5dSAlfredo Cardigliano 		u8     version;
27301489e5dSAlfredo Cardigliano 		u8     type;
27401489e5dSAlfredo Cardigliano 		u8     rsvd[2];
27501489e5dSAlfredo Cardigliano 		u8     nports;
27601489e5dSAlfredo Cardigliano 		u8     rsvd2[3];
27701489e5dSAlfredo Cardigliano 		__le32 nlifs;
27801489e5dSAlfredo Cardigliano 		__le32 nintrs;
27901489e5dSAlfredo Cardigliano 		__le32 ndbpgs_per_lif;
28001489e5dSAlfredo Cardigliano 		__le32 intr_coal_mult;
28101489e5dSAlfredo Cardigliano 		__le32 intr_coal_div;
282126fe197SAndrew Boyer 		__le32 eq_count;
28301489e5dSAlfredo Cardigliano 	};
284126fe197SAndrew Boyer 	__le32 words[478];
28501489e5dSAlfredo Cardigliano };
28601489e5dSAlfredo Cardigliano 
28701489e5dSAlfredo Cardigliano enum ionic_lif_type {
28801489e5dSAlfredo Cardigliano 	IONIC_LIF_TYPE_CLASSIC = 0,
28901489e5dSAlfredo Cardigliano 	IONIC_LIF_TYPE_MACVLAN = 1,
29001489e5dSAlfredo Cardigliano 	IONIC_LIF_TYPE_NETQUEUE = 2,
29101489e5dSAlfredo Cardigliano };
29201489e5dSAlfredo Cardigliano 
29301489e5dSAlfredo Cardigliano /**
294126fe197SAndrew Boyer  * struct ionic_lif_identify_cmd - LIF identify command
29501489e5dSAlfredo Cardigliano  * @opcode:  opcode
296126fe197SAndrew Boyer  * @type:    LIF type (enum ionic_lif_type)
297126fe197SAndrew Boyer  * @ver:     Version of identify returned by device
29801489e5dSAlfredo Cardigliano  */
29901489e5dSAlfredo Cardigliano struct ionic_lif_identify_cmd {
30001489e5dSAlfredo Cardigliano 	u8 opcode;
30101489e5dSAlfredo Cardigliano 	u8 type;
30201489e5dSAlfredo Cardigliano 	u8 ver;
30301489e5dSAlfredo Cardigliano 	u8 rsvd[61];
30401489e5dSAlfredo Cardigliano };
30501489e5dSAlfredo Cardigliano 
30601489e5dSAlfredo Cardigliano /**
307126fe197SAndrew Boyer  * struct ionic_lif_identify_comp - LIF identify command completion
308126fe197SAndrew Boyer  * @status:  Status of the command (enum ionic_status_code)
309126fe197SAndrew Boyer  * @ver:     Version of identify returned by device
31001489e5dSAlfredo Cardigliano  */
31101489e5dSAlfredo Cardigliano struct ionic_lif_identify_comp {
31201489e5dSAlfredo Cardigliano 	u8 status;
31301489e5dSAlfredo Cardigliano 	u8 ver;
31401489e5dSAlfredo Cardigliano 	u8 rsvd2[14];
31501489e5dSAlfredo Cardigliano };
31601489e5dSAlfredo Cardigliano 
317126fe197SAndrew Boyer /**
318126fe197SAndrew Boyer  * enum ionic_lif_capability - LIF capabilities
319126fe197SAndrew Boyer  * @IONIC_LIF_CAP_ETH:     LIF supports Ethernet
320126fe197SAndrew Boyer  * @IONIC_LIF_CAP_RDMA:    LIF support RDMA
321126fe197SAndrew Boyer  */
32201489e5dSAlfredo Cardigliano enum ionic_lif_capability {
32301489e5dSAlfredo Cardigliano 	IONIC_LIF_CAP_ETH        = BIT(0),
32401489e5dSAlfredo Cardigliano 	IONIC_LIF_CAP_RDMA       = BIT(1),
32501489e5dSAlfredo Cardigliano };
32601489e5dSAlfredo Cardigliano 
32701489e5dSAlfredo Cardigliano /**
328126fe197SAndrew Boyer  * enum ionic_logical_qtype - Logical Queue Types
329126fe197SAndrew Boyer  * @IONIC_QTYPE_ADMINQ:    Administrative Queue
330126fe197SAndrew Boyer  * @IONIC_QTYPE_NOTIFYQ:   Notify Queue
331126fe197SAndrew Boyer  * @IONIC_QTYPE_RXQ:       Receive Queue
332126fe197SAndrew Boyer  * @IONIC_QTYPE_TXQ:       Transmit Queue
333126fe197SAndrew Boyer  * @IONIC_QTYPE_EQ:        Event Queue
334126fe197SAndrew Boyer  * @IONIC_QTYPE_MAX:       Max queue type supported
33501489e5dSAlfredo Cardigliano  */
33601489e5dSAlfredo Cardigliano enum ionic_logical_qtype {
33701489e5dSAlfredo Cardigliano 	IONIC_QTYPE_ADMINQ  = 0,
33801489e5dSAlfredo Cardigliano 	IONIC_QTYPE_NOTIFYQ = 1,
33901489e5dSAlfredo Cardigliano 	IONIC_QTYPE_RXQ     = 2,
34001489e5dSAlfredo Cardigliano 	IONIC_QTYPE_TXQ     = 3,
34101489e5dSAlfredo Cardigliano 	IONIC_QTYPE_EQ      = 4,
34201489e5dSAlfredo Cardigliano 	IONIC_QTYPE_MAX     = 16,
34301489e5dSAlfredo Cardigliano };
34401489e5dSAlfredo Cardigliano 
34501489e5dSAlfredo Cardigliano /**
346126fe197SAndrew Boyer  * struct ionic_lif_logical_qtype - Descriptor of logical to HW queue type
347126fe197SAndrew Boyer  * @qtype:          Hardware Queue Type
348126fe197SAndrew Boyer  * @qid_count:      Number of Queue IDs of the logical type
349126fe197SAndrew Boyer  * @qid_base:       Minimum Queue ID of the logical type
35001489e5dSAlfredo Cardigliano  */
35101489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype {
35201489e5dSAlfredo Cardigliano 	u8     qtype;
35301489e5dSAlfredo Cardigliano 	u8     rsvd[3];
35401489e5dSAlfredo Cardigliano 	__le32 qid_count;
35501489e5dSAlfredo Cardigliano 	__le32 qid_base;
35601489e5dSAlfredo Cardigliano };
35701489e5dSAlfredo Cardigliano 
358126fe197SAndrew Boyer /**
359126fe197SAndrew Boyer  * enum ionic_lif_state - LIF state
360126fe197SAndrew Boyer  * @IONIC_LIF_DISABLE:     LIF disabled
361126fe197SAndrew Boyer  * @IONIC_LIF_ENABLE:      LIF enabled
362126fe197SAndrew Boyer  * @IONIC_LIF_QUIESCE:     LIF Quiesced
363126fe197SAndrew Boyer  */
36401489e5dSAlfredo Cardigliano enum ionic_lif_state {
365126fe197SAndrew Boyer 	IONIC_LIF_QUIESCE	= 0,
36601489e5dSAlfredo Cardigliano 	IONIC_LIF_ENABLE	= 1,
367126fe197SAndrew Boyer 	IONIC_LIF_DISABLE	= 2,
36801489e5dSAlfredo Cardigliano };
36901489e5dSAlfredo Cardigliano 
37001489e5dSAlfredo Cardigliano /**
371126fe197SAndrew Boyer  * union ionic_lif_config - LIF configuration
372126fe197SAndrew Boyer  * @state:          LIF state (enum ionic_lif_state)
373126fe197SAndrew Boyer  * @name:           LIF name
374126fe197SAndrew Boyer  * @mtu:            MTU
375126fe197SAndrew Boyer  * @mac:            Station MAC address
376126fe197SAndrew Boyer  * @vlan:           Default Vlan ID
377126fe197SAndrew Boyer  * @features:       Features (enum ionic_eth_hw_features)
378126fe197SAndrew Boyer  * @queue_count:    Queue counts per queue-type
37901489e5dSAlfredo Cardigliano  */
38001489e5dSAlfredo Cardigliano union ionic_lif_config {
38101489e5dSAlfredo Cardigliano 	struct {
38201489e5dSAlfredo Cardigliano 		u8     state;
38301489e5dSAlfredo Cardigliano 		u8     rsvd[3];
38401489e5dSAlfredo Cardigliano 		char   name[IONIC_IFNAMSIZ];
38501489e5dSAlfredo Cardigliano 		__le32 mtu;
38601489e5dSAlfredo Cardigliano 		u8     mac[6];
387126fe197SAndrew Boyer 		__le16 vlan;
38801489e5dSAlfredo Cardigliano 		__le64 features;
38901489e5dSAlfredo Cardigliano 		__le32 queue_count[IONIC_QTYPE_MAX];
390126fe197SAndrew Boyer 	} __rte_packed;
39101489e5dSAlfredo Cardigliano 	__le32 words[64];
39201489e5dSAlfredo Cardigliano };
39301489e5dSAlfredo Cardigliano 
39401489e5dSAlfredo Cardigliano /**
395126fe197SAndrew Boyer  * struct ionic_lif_identity - LIF identity information (type-specific)
39601489e5dSAlfredo Cardigliano  *
397126fe197SAndrew Boyer  * @capabilities:        LIF capabilities
39801489e5dSAlfredo Cardigliano  *
399126fe197SAndrew Boyer  * @eth:                    Ethernet identify structure
400126fe197SAndrew Boyer  *     @version:            Ethernet identify structure version
401126fe197SAndrew Boyer  *     @max_ucast_filters:  Number of perfect unicast addresses supported
402126fe197SAndrew Boyer  *     @max_mcast_filters:  Number of perfect multicast addresses supported
40301489e5dSAlfredo Cardigliano  *     @min_frame_size:     Minimum size of frames to be sent
40401489e5dSAlfredo Cardigliano  *     @max_frame_size:     Maximum size of frames to be sent
40501489e5dSAlfredo Cardigliano  *     @config:             LIF config struct with features, mtu, mac, q counts
40601489e5dSAlfredo Cardigliano  *
407126fe197SAndrew Boyer  * @rdma:                RDMA identify structure
408126fe197SAndrew Boyer  *     @version:         RDMA version of opcodes and queue descriptors
409126fe197SAndrew Boyer  *     @qp_opcodes:      Number of RDMA queue pair opcodes supported
410126fe197SAndrew Boyer  *     @admin_opcodes:   Number of RDMA admin opcodes supported
411126fe197SAndrew Boyer  *     @npts_per_lif:    Page table size per LIF
412126fe197SAndrew Boyer  *     @nmrs_per_lif:    Number of memory regions per LIF
413126fe197SAndrew Boyer  *     @nahs_per_lif:    Number of address handles per LIF
414126fe197SAndrew Boyer  *     @max_stride:      Max work request stride
415126fe197SAndrew Boyer  *     @cl_stride:       Cache line stride
416126fe197SAndrew Boyer  *     @pte_stride:      Page table entry stride
417126fe197SAndrew Boyer  *     @rrq_stride:      Remote RQ work request stride
418126fe197SAndrew Boyer  *     @rsq_stride:      Remote SQ work request stride
41901489e5dSAlfredo Cardigliano  *     @dcqcn_profiles:  Number of DCQCN profiles
420126fe197SAndrew Boyer  *     @aq_qtype:        RDMA Admin Qtype
421126fe197SAndrew Boyer  *     @sq_qtype:        RDMA Send Qtype
422126fe197SAndrew Boyer  *     @rq_qtype:        RDMA Receive Qtype
423126fe197SAndrew Boyer  *     @cq_qtype:        RDMA Completion Qtype
424126fe197SAndrew Boyer  *     @eq_qtype:        RDMA Event Qtype
42501489e5dSAlfredo Cardigliano  */
42601489e5dSAlfredo Cardigliano union ionic_lif_identity {
42701489e5dSAlfredo Cardigliano 	struct {
42801489e5dSAlfredo Cardigliano 		__le64 capabilities;
42901489e5dSAlfredo Cardigliano 
43001489e5dSAlfredo Cardigliano 		struct {
43101489e5dSAlfredo Cardigliano 			u8 version;
43201489e5dSAlfredo Cardigliano 			u8 rsvd[3];
43301489e5dSAlfredo Cardigliano 			__le32 max_ucast_filters;
43401489e5dSAlfredo Cardigliano 			__le32 max_mcast_filters;
43501489e5dSAlfredo Cardigliano 			__le16 rss_ind_tbl_sz;
43601489e5dSAlfredo Cardigliano 			__le32 min_frame_size;
43701489e5dSAlfredo Cardigliano 			__le32 max_frame_size;
43801489e5dSAlfredo Cardigliano 			u8 rsvd2[106];
43901489e5dSAlfredo Cardigliano 			union ionic_lif_config config;
440126fe197SAndrew Boyer 		} __rte_packed eth;
44101489e5dSAlfredo Cardigliano 
44201489e5dSAlfredo Cardigliano 		struct {
44301489e5dSAlfredo Cardigliano 			u8 version;
44401489e5dSAlfredo Cardigliano 			u8 qp_opcodes;
44501489e5dSAlfredo Cardigliano 			u8 admin_opcodes;
44601489e5dSAlfredo Cardigliano 			u8 rsvd;
44701489e5dSAlfredo Cardigliano 			__le32 npts_per_lif;
44801489e5dSAlfredo Cardigliano 			__le32 nmrs_per_lif;
44901489e5dSAlfredo Cardigliano 			__le32 nahs_per_lif;
45001489e5dSAlfredo Cardigliano 			u8 max_stride;
45101489e5dSAlfredo Cardigliano 			u8 cl_stride;
45201489e5dSAlfredo Cardigliano 			u8 pte_stride;
45301489e5dSAlfredo Cardigliano 			u8 rrq_stride;
45401489e5dSAlfredo Cardigliano 			u8 rsq_stride;
45501489e5dSAlfredo Cardigliano 			u8 dcqcn_profiles;
45601489e5dSAlfredo Cardigliano 			u8 rsvd_dimensions[10];
45701489e5dSAlfredo Cardigliano 			struct ionic_lif_logical_qtype aq_qtype;
45801489e5dSAlfredo Cardigliano 			struct ionic_lif_logical_qtype sq_qtype;
45901489e5dSAlfredo Cardigliano 			struct ionic_lif_logical_qtype rq_qtype;
46001489e5dSAlfredo Cardigliano 			struct ionic_lif_logical_qtype cq_qtype;
46101489e5dSAlfredo Cardigliano 			struct ionic_lif_logical_qtype eq_qtype;
462126fe197SAndrew Boyer 		} __rte_packed rdma;
463126fe197SAndrew Boyer 	} __rte_packed;
464126fe197SAndrew Boyer 	__le32 words[478];
46501489e5dSAlfredo Cardigliano };
46601489e5dSAlfredo Cardigliano 
46701489e5dSAlfredo Cardigliano /**
46801489e5dSAlfredo Cardigliano  * struct ionic_lif_init_cmd - LIF init command
469126fe197SAndrew Boyer  * @opcode:       Opcode
470126fe197SAndrew Boyer  * @type:         LIF type (enum ionic_lif_type)
47101489e5dSAlfredo Cardigliano  * @index:        LIF index
472126fe197SAndrew Boyer  * @info_pa:      Destination address for LIF info (struct ionic_lif_info)
47301489e5dSAlfredo Cardigliano  */
47401489e5dSAlfredo Cardigliano struct ionic_lif_init_cmd {
47501489e5dSAlfredo Cardigliano 	u8     opcode;
47601489e5dSAlfredo Cardigliano 	u8     type;
47701489e5dSAlfredo Cardigliano 	__le16 index;
47801489e5dSAlfredo Cardigliano 	__le32 rsvd;
47901489e5dSAlfredo Cardigliano 	__le64 info_pa;
48001489e5dSAlfredo Cardigliano 	u8     rsvd2[48];
48101489e5dSAlfredo Cardigliano };
48201489e5dSAlfredo Cardigliano 
48301489e5dSAlfredo Cardigliano /**
48401489e5dSAlfredo Cardigliano  * struct ionic_lif_init_comp - LIF init command completion
485126fe197SAndrew Boyer  * @status:	Status of the command (enum ionic_status_code)
486126fe197SAndrew Boyer  * @hw_index:	Hardware index of the initialized LIF
48701489e5dSAlfredo Cardigliano  */
48801489e5dSAlfredo Cardigliano struct ionic_lif_init_comp {
48901489e5dSAlfredo Cardigliano 	u8 status;
49001489e5dSAlfredo Cardigliano 	u8 rsvd;
49101489e5dSAlfredo Cardigliano 	__le16 hw_index;
49201489e5dSAlfredo Cardigliano 	u8 rsvd2[12];
49301489e5dSAlfredo Cardigliano };
49401489e5dSAlfredo Cardigliano 
49501489e5dSAlfredo Cardigliano /**
496126fe197SAndrew Boyer  * struct ionic_q_identify_cmd - queue identify command
497126fe197SAndrew Boyer  * @opcode:     opcode
498126fe197SAndrew Boyer  * @lif_type:   LIF type (enum ionic_lif_type)
499126fe197SAndrew Boyer  * @type:       Logical queue type (enum ionic_logical_qtype)
500126fe197SAndrew Boyer  * @ver:        Highest queue type version that the driver supports
501126fe197SAndrew Boyer  */
502126fe197SAndrew Boyer struct ionic_q_identify_cmd {
503126fe197SAndrew Boyer 	u8     opcode;
504126fe197SAndrew Boyer 	u8     rsvd;
505126fe197SAndrew Boyer 	__le16 lif_type;
506126fe197SAndrew Boyer 	u8     type;
507126fe197SAndrew Boyer 	u8     ver;
508126fe197SAndrew Boyer 	u8     rsvd2[58];
509126fe197SAndrew Boyer };
510126fe197SAndrew Boyer 
511126fe197SAndrew Boyer /**
512126fe197SAndrew Boyer  * struct ionic_q_identify_comp - queue identify command completion
513126fe197SAndrew Boyer  * @status:     Status of the command (enum ionic_status_code)
514126fe197SAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
515126fe197SAndrew Boyer  * @ver:        Queue type version that can be used with FW
516126fe197SAndrew Boyer  */
517126fe197SAndrew Boyer struct ionic_q_identify_comp {
518126fe197SAndrew Boyer 	u8     status;
519126fe197SAndrew Boyer 	u8     rsvd;
520126fe197SAndrew Boyer 	__le16 comp_index;
521126fe197SAndrew Boyer 	u8     ver;
522126fe197SAndrew Boyer 	u8     rsvd2[11];
523126fe197SAndrew Boyer };
524126fe197SAndrew Boyer 
525126fe197SAndrew Boyer /**
526126fe197SAndrew Boyer  * union ionic_q_identity - queue identity information
527126fe197SAndrew Boyer  *     @version:        Queue type version that can be used with FW
528126fe197SAndrew Boyer  *     @supported:      Bitfield of queue versions, first bit = ver 0
529126fe197SAndrew Boyer  *     @features:       Queue features
530126fe197SAndrew Boyer  *     @desc_sz:        Descriptor size
531126fe197SAndrew Boyer  *     @comp_sz:        Completion descriptor size
532126fe197SAndrew Boyer  *     @sg_desc_sz:     Scatter/Gather descriptor size
533126fe197SAndrew Boyer  *     @max_sg_elems:   Maximum number of Scatter/Gather elements
534126fe197SAndrew Boyer  *     @sg_desc_stride: Number of Scatter/Gather elements per descriptor
535126fe197SAndrew Boyer  */
536126fe197SAndrew Boyer union ionic_q_identity {
537126fe197SAndrew Boyer 	struct {
538126fe197SAndrew Boyer 		u8      version;
539126fe197SAndrew Boyer 		u8      supported;
540126fe197SAndrew Boyer 		u8      rsvd[6];
541126fe197SAndrew Boyer #define IONIC_QIDENT_F_CQ	0x01	/* queue has completion ring */
542126fe197SAndrew Boyer #define IONIC_QIDENT_F_SG	0x02	/* queue has scatter/gather ring */
543126fe197SAndrew Boyer #define IONIC_QIDENT_F_EQ	0x04	/* queue can use event queue */
544126fe197SAndrew Boyer #define IONIC_QIDENT_F_CMB	0x08	/* queue is in cmb bar */
545126fe197SAndrew Boyer 		__le64  features;
546126fe197SAndrew Boyer 		__le16  desc_sz;
547126fe197SAndrew Boyer 		__le16  comp_sz;
548126fe197SAndrew Boyer 		__le16  sg_desc_sz;
549126fe197SAndrew Boyer 		__le16  max_sg_elems;
550126fe197SAndrew Boyer 		__le16  sg_desc_stride;
551126fe197SAndrew Boyer 	};
552126fe197SAndrew Boyer 	__le32 words[478];
553126fe197SAndrew Boyer };
554126fe197SAndrew Boyer 
555126fe197SAndrew Boyer /**
55601489e5dSAlfredo Cardigliano  * struct ionic_q_init_cmd - Queue init command
55701489e5dSAlfredo Cardigliano  * @opcode:       opcode
55801489e5dSAlfredo Cardigliano  * @type:         Logical queue type
559126fe197SAndrew Boyer  * @ver:          Queue type version
56001489e5dSAlfredo Cardigliano  * @lif_index:    LIF index
561126fe197SAndrew Boyer  * @index:        (LIF, qtype) relative admin queue index
562126fe197SAndrew Boyer  * @intr_index:   Interrupt control register index, or Event queue index
56301489e5dSAlfredo Cardigliano  * @pid:          Process ID
56401489e5dSAlfredo Cardigliano  * @flags:
56501489e5dSAlfredo Cardigliano  *    IRQ:        Interrupt requested on completion
56601489e5dSAlfredo Cardigliano  *    ENA:        Enable the queue.  If ENA=0 the queue is initialized
56701489e5dSAlfredo Cardigliano  *                but remains disabled, to be later enabled with the
56801489e5dSAlfredo Cardigliano  *                Queue Enable command.  If ENA=1, then queue is
56901489e5dSAlfredo Cardigliano  *                initialized and then enabled.
57001489e5dSAlfredo Cardigliano  *    SG:         Enable Scatter-Gather on the queue.
57101489e5dSAlfredo Cardigliano  *                in number of descs.  The actual ring size is
57201489e5dSAlfredo Cardigliano  *                (1 << ring_size).  For example, to
57301489e5dSAlfredo Cardigliano  *                select a ring size of 64 descriptors write
57401489e5dSAlfredo Cardigliano  *                ring_size = 6.  The minimum ring_size value is 2
57501489e5dSAlfredo Cardigliano  *                for a ring size of 4 descriptors.  The maximum
57601489e5dSAlfredo Cardigliano  *                ring_size value is 16 for a ring size of 64k
57701489e5dSAlfredo Cardigliano  *                descriptors.  Values of ring_size <2 and >16 are
57801489e5dSAlfredo Cardigliano  *                reserved.
57901489e5dSAlfredo Cardigliano  *    EQ:         Enable the Event Queue
580126fe197SAndrew Boyer  * @cos:          Class of service for this queue
58101489e5dSAlfredo Cardigliano  * @ring_size:    Queue ring size, encoded as a log2(size)
58201489e5dSAlfredo Cardigliano  * @ring_base:    Queue ring base address
58301489e5dSAlfredo Cardigliano  * @cq_ring_base: Completion queue ring base address
58401489e5dSAlfredo Cardigliano  * @sg_ring_base: Scatter/Gather ring base address
58501489e5dSAlfredo Cardigliano  */
58601489e5dSAlfredo Cardigliano struct ionic_q_init_cmd {
58701489e5dSAlfredo Cardigliano 	u8     opcode;
58801489e5dSAlfredo Cardigliano 	u8     rsvd;
58901489e5dSAlfredo Cardigliano 	__le16 lif_index;
59001489e5dSAlfredo Cardigliano 	u8     type;
59101489e5dSAlfredo Cardigliano 	u8     ver;
59201489e5dSAlfredo Cardigliano 	u8     rsvd1[2];
59301489e5dSAlfredo Cardigliano 	__le32 index;
59401489e5dSAlfredo Cardigliano 	__le16 pid;
59501489e5dSAlfredo Cardigliano 	__le16 intr_index;
59601489e5dSAlfredo Cardigliano 	__le16 flags;
59701489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_IRQ	0x01	/* Request interrupt on completion */
59801489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_ENA	0x02	/* Enable the queue */
59901489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_SG	0x04	/* Enable scatter/gather on the queue */
60001489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_EQ	0x08	/* Enable event queue */
601126fe197SAndrew Boyer #define IONIC_QINIT_F_CMB	0x10	/* Enable cmb-based queue */
60201489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_DEBUG	0x80	/* Enable queue debugging */
60301489e5dSAlfredo Cardigliano 	u8     cos;
60401489e5dSAlfredo Cardigliano 	u8     ring_size;
60501489e5dSAlfredo Cardigliano 	__le64 ring_base;
60601489e5dSAlfredo Cardigliano 	__le64 cq_ring_base;
60701489e5dSAlfredo Cardigliano 	__le64 sg_ring_base;
608126fe197SAndrew Boyer 	u8     rsvd2[20];
609126fe197SAndrew Boyer } __rte_packed;
61001489e5dSAlfredo Cardigliano 
61101489e5dSAlfredo Cardigliano /**
61201489e5dSAlfredo Cardigliano  * struct ionic_q_init_comp - Queue init command completion
613126fe197SAndrew Boyer  * @status:     Status of the command (enum ionic_status_code)
614126fe197SAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
61501489e5dSAlfredo Cardigliano  * @hw_index:   Hardware Queue ID
61601489e5dSAlfredo Cardigliano  * @hw_type:    Hardware Queue type
61701489e5dSAlfredo Cardigliano  * @color:      Color
61801489e5dSAlfredo Cardigliano  */
61901489e5dSAlfredo Cardigliano struct ionic_q_init_comp {
62001489e5dSAlfredo Cardigliano 	u8     status;
621126fe197SAndrew Boyer 	u8     rsvd;
62201489e5dSAlfredo Cardigliano 	__le16 comp_index;
62301489e5dSAlfredo Cardigliano 	__le32 hw_index;
62401489e5dSAlfredo Cardigliano 	u8     hw_type;
62501489e5dSAlfredo Cardigliano 	u8     rsvd2[6];
62601489e5dSAlfredo Cardigliano 	u8     color;
62701489e5dSAlfredo Cardigliano };
62801489e5dSAlfredo Cardigliano 
62901489e5dSAlfredo Cardigliano /* the device's internal addressing uses up to 52 bits */
63001489e5dSAlfredo Cardigliano #define IONIC_ADDR_LEN		52
63101489e5dSAlfredo Cardigliano #define IONIC_ADDR_MASK		(BIT_ULL(IONIC_ADDR_LEN) - 1)
63201489e5dSAlfredo Cardigliano 
63301489e5dSAlfredo Cardigliano enum ionic_txq_desc_opcode {
63401489e5dSAlfredo Cardigliano 	IONIC_TXQ_DESC_OPCODE_CSUM_NONE = 0,
63501489e5dSAlfredo Cardigliano 	IONIC_TXQ_DESC_OPCODE_CSUM_PARTIAL = 1,
63601489e5dSAlfredo Cardigliano 	IONIC_TXQ_DESC_OPCODE_CSUM_HW = 2,
63701489e5dSAlfredo Cardigliano 	IONIC_TXQ_DESC_OPCODE_TSO = 3,
63801489e5dSAlfredo Cardigliano };
63901489e5dSAlfredo Cardigliano 
64001489e5dSAlfredo Cardigliano /**
64101489e5dSAlfredo Cardigliano  * struct ionic_txq_desc - Ethernet Tx queue descriptor format
642126fe197SAndrew Boyer  * @cmd:          Tx operation, see IONIC_TXQ_DESC_OPCODE_*:
64301489e5dSAlfredo Cardigliano  *
64401489e5dSAlfredo Cardigliano  *                   IONIC_TXQ_DESC_OPCODE_CSUM_NONE:
64501489e5dSAlfredo Cardigliano  *                      Non-offload send.  No segmentation,
64601489e5dSAlfredo Cardigliano  *                      fragmentation or checksum calc/insertion is
64701489e5dSAlfredo Cardigliano  *                      performed by device; packet is prepared
64801489e5dSAlfredo Cardigliano  *                      to send by software stack and requires
64901489e5dSAlfredo Cardigliano  *                      no further manipulation from device.
65001489e5dSAlfredo Cardigliano  *
65101489e5dSAlfredo Cardigliano  *                   IONIC_TXQ_DESC_OPCODE_CSUM_PARTIAL:
65201489e5dSAlfredo Cardigliano  *                      Offload 16-bit L4 checksum
65301489e5dSAlfredo Cardigliano  *                      calculation/insertion.  The device will
65401489e5dSAlfredo Cardigliano  *                      calculate the L4 checksum value and
65501489e5dSAlfredo Cardigliano  *                      insert the result in the packet's L4
65601489e5dSAlfredo Cardigliano  *                      header checksum field.  The L4 checksum
65701489e5dSAlfredo Cardigliano  *                      is calculated starting at @csum_start bytes
65801489e5dSAlfredo Cardigliano  *                      into the packet to the end of the packet.
65901489e5dSAlfredo Cardigliano  *                      The checksum insertion position is given
660126fe197SAndrew Boyer  *                      in @csum_offset, which is the offset from
661126fe197SAndrew Boyer  *                      @csum_start to the checksum field in the L4
662126fe197SAndrew Boyer  *                      header.  This feature is only applicable to
663126fe197SAndrew Boyer  *                      protocols such as TCP, UDP and ICMP where a
664126fe197SAndrew Boyer  *                      standard (i.e. the 'IP-style' checksum)
665126fe197SAndrew Boyer  *                      one's complement 16-bit checksum is used,
666126fe197SAndrew Boyer  *                      using an IP pseudo-header to seed the
667126fe197SAndrew Boyer  *                      calculation.  Software will preload the L4
668126fe197SAndrew Boyer  *                      checksum field with the IP pseudo-header
669126fe197SAndrew Boyer  *                      checksum.
67001489e5dSAlfredo Cardigliano  *
67101489e5dSAlfredo Cardigliano  *                      For tunnel encapsulation, @csum_start and
67201489e5dSAlfredo Cardigliano  *                      @csum_offset refer to the inner L4
67301489e5dSAlfredo Cardigliano  *                      header.  Supported tunnels encapsulations
67401489e5dSAlfredo Cardigliano  *                      are: IPIP, GRE, and UDP.  If the @encap
67501489e5dSAlfredo Cardigliano  *                      is clear, no further processing by the
67601489e5dSAlfredo Cardigliano  *                      device is required; software will
67701489e5dSAlfredo Cardigliano  *                      calculate the outer header checksums.  If
67801489e5dSAlfredo Cardigliano  *                      the @encap is set, the device will
67901489e5dSAlfredo Cardigliano  *                      offload the outer header checksums using
68001489e5dSAlfredo Cardigliano  *                      LCO (local checksum offload) (see
681126fe197SAndrew Boyer  *                      Documentation/networking/checksum-offloads.rst
682126fe197SAndrew Boyer  *                      for more info).
68301489e5dSAlfredo Cardigliano  *
68401489e5dSAlfredo Cardigliano  *                   IONIC_TXQ_DESC_OPCODE_CSUM_HW:
68501489e5dSAlfredo Cardigliano  *                      Offload 16-bit checksum computation to hardware.
68601489e5dSAlfredo Cardigliano  *                      If @csum_l3 is set then the packet's L3 checksum is
687*b53d106dSSean Morrissey  *                      updated. Similarly, if @csum_l4 is set the L4
68801489e5dSAlfredo Cardigliano  *                      checksum is updated. If @encap is set then encap header
68901489e5dSAlfredo Cardigliano  *                      checksums are also updated.
69001489e5dSAlfredo Cardigliano  *
69101489e5dSAlfredo Cardigliano  *                   IONIC_TXQ_DESC_OPCODE_TSO:
69201489e5dSAlfredo Cardigliano  *                      Device performs TCP segmentation offload
69301489e5dSAlfredo Cardigliano  *                      (TSO).  @hdr_len is the number of bytes
69401489e5dSAlfredo Cardigliano  *                      to the end of TCP header (the offset to
69501489e5dSAlfredo Cardigliano  *                      the TCP payload).  @mss is the desired
69601489e5dSAlfredo Cardigliano  *                      MSS, the TCP payload length for each
69701489e5dSAlfredo Cardigliano  *                      segment.  The device will calculate/
69801489e5dSAlfredo Cardigliano  *                      insert IP (IPv4 only) and TCP checksums
69901489e5dSAlfredo Cardigliano  *                      for each segment.  In the first data
70001489e5dSAlfredo Cardigliano  *                      buffer containing the header template,
70101489e5dSAlfredo Cardigliano  *                      the driver will set IPv4 checksum to 0
70201489e5dSAlfredo Cardigliano  *                      and preload TCP checksum with the IP
70301489e5dSAlfredo Cardigliano  *                      pseudo header calculated with IP length = 0.
70401489e5dSAlfredo Cardigliano  *
70501489e5dSAlfredo Cardigliano  *                      Supported tunnel encapsulations are IPIP,
70601489e5dSAlfredo Cardigliano  *                      layer-3 GRE, and UDP. @hdr_len includes
70701489e5dSAlfredo Cardigliano  *                      both outer and inner headers.  The driver
70801489e5dSAlfredo Cardigliano  *                      will set IPv4 checksum to zero and
70901489e5dSAlfredo Cardigliano  *                      preload TCP checksum with IP pseudo
71001489e5dSAlfredo Cardigliano  *                      header on the inner header.
71101489e5dSAlfredo Cardigliano  *
71201489e5dSAlfredo Cardigliano  *                      TCP ECN offload is supported.  The device
71301489e5dSAlfredo Cardigliano  *                      will set CWR flag in the first segment if
71401489e5dSAlfredo Cardigliano  *                      CWR is set in the template header, and
71501489e5dSAlfredo Cardigliano  *                      clear CWR in remaining segments.
71601489e5dSAlfredo Cardigliano  * @flags:
71701489e5dSAlfredo Cardigliano  *                vlan:
718126fe197SAndrew Boyer  *                    Insert an L2 VLAN header using @vlan_tci
71901489e5dSAlfredo Cardigliano  *                encap:
720126fe197SAndrew Boyer  *                    Calculate encap header checksum
72101489e5dSAlfredo Cardigliano  *                csum_l3:
722126fe197SAndrew Boyer  *                    Compute L3 header checksum
72301489e5dSAlfredo Cardigliano  *                csum_l4:
724126fe197SAndrew Boyer  *                    Compute L4 header checksum
72501489e5dSAlfredo Cardigliano  *                tso_sot:
72601489e5dSAlfredo Cardigliano  *                    TSO start
72701489e5dSAlfredo Cardigliano  *                tso_eot:
72801489e5dSAlfredo Cardigliano  *                    TSO end
72901489e5dSAlfredo Cardigliano  * @num_sg_elems: Number of scatter-gather elements in SG
73001489e5dSAlfredo Cardigliano  *                descriptor
731126fe197SAndrew Boyer  * @addr:         First data buffer's DMA address
732126fe197SAndrew Boyer  *                (Subsequent data buffers are on txq_sg_desc)
73301489e5dSAlfredo Cardigliano  * @len:          First data buffer's length, in bytes
73401489e5dSAlfredo Cardigliano  * @vlan_tci:     VLAN tag to insert in the packet (if requested
73501489e5dSAlfredo Cardigliano  *                by @V-bit).  Includes .1p and .1q tags
73601489e5dSAlfredo Cardigliano  * @hdr_len:      Length of packet headers, including
737126fe197SAndrew Boyer  *                encapsulating outer header, if applicable
738126fe197SAndrew Boyer  *                Valid for opcodes IONIC_TXQ_DESC_OPCODE_CALC_CSUM and
739126fe197SAndrew Boyer  *                IONIC_TXQ_DESC_OPCODE_TSO.  Should be set to zero for
74001489e5dSAlfredo Cardigliano  *                all other modes.  For
741126fe197SAndrew Boyer  *                IONIC_TXQ_DESC_OPCODE_CALC_CSUM, @hdr_len is length
74201489e5dSAlfredo Cardigliano  *                of headers up to inner-most L4 header.  For
743126fe197SAndrew Boyer  *                IONIC_TXQ_DESC_OPCODE_TSO, @hdr_len is up to
74401489e5dSAlfredo Cardigliano  *                inner-most L4 payload, so inclusive of
74501489e5dSAlfredo Cardigliano  *                inner-most L4 header.
746126fe197SAndrew Boyer  * @mss:          Desired MSS value for TSO; only applicable for
747126fe197SAndrew Boyer  *                IONIC_TXQ_DESC_OPCODE_TSO
748126fe197SAndrew Boyer  * @csum_start:   Offset from packet to first byte checked in L4 checksum
749126fe197SAndrew Boyer  * @csum_offset:  Offset from csum_start to L4 checksum field
75001489e5dSAlfredo Cardigliano  */
751126fe197SAndrew Boyer struct ionic_txq_desc {
752126fe197SAndrew Boyer 	__le64  cmd;
75301489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_OPCODE_MASK		0xf
75401489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_OPCODE_SHIFT		4
75501489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAGS_MASK		0xf
75601489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAGS_SHIFT		0
75701489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_NSGE_MASK		0xf
75801489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_NSGE_SHIFT		8
75901489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_ADDR_MASK		(BIT_ULL(IONIC_ADDR_LEN) - 1)
76001489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_ADDR_SHIFT		12
76101489e5dSAlfredo Cardigliano 
76201489e5dSAlfredo Cardigliano /* common flags */
76301489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_VLAN		0x1
76401489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_ENCAP		0x2
76501489e5dSAlfredo Cardigliano 
76601489e5dSAlfredo Cardigliano /* flags for csum_hw opcode */
76701489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_CSUM_L3		0x4
76801489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_CSUM_L4		0x8
76901489e5dSAlfredo Cardigliano 
77001489e5dSAlfredo Cardigliano /* flags for tso opcode */
77101489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_TSO_SOT		0x4
77201489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_TSO_EOT		0x8
77301489e5dSAlfredo Cardigliano 
77401489e5dSAlfredo Cardigliano 	__le16  len;
77501489e5dSAlfredo Cardigliano 	union {
77601489e5dSAlfredo Cardigliano 		__le16  vlan_tci;
77701489e5dSAlfredo Cardigliano 		__le16  hword0;
77801489e5dSAlfredo Cardigliano 	};
77901489e5dSAlfredo Cardigliano 	union {
78001489e5dSAlfredo Cardigliano 		__le16  csum_start;
78101489e5dSAlfredo Cardigliano 		__le16  hdr_len;
78201489e5dSAlfredo Cardigliano 		__le16  hword1;
78301489e5dSAlfredo Cardigliano 	};
78401489e5dSAlfredo Cardigliano 	union {
78501489e5dSAlfredo Cardigliano 		__le16  csum_offset;
78601489e5dSAlfredo Cardigliano 		__le16  mss;
78701489e5dSAlfredo Cardigliano 		__le16  hword2;
78801489e5dSAlfredo Cardigliano 	};
78901489e5dSAlfredo Cardigliano };
79001489e5dSAlfredo Cardigliano 
79101489e5dSAlfredo Cardigliano static inline u64 encode_txq_desc_cmd(u8 opcode, u8 flags,
79201489e5dSAlfredo Cardigliano 				      u8 nsge, u64 addr)
79301489e5dSAlfredo Cardigliano {
79401489e5dSAlfredo Cardigliano 	u64 cmd;
79501489e5dSAlfredo Cardigliano 
79601489e5dSAlfredo Cardigliano 	cmd = (opcode & IONIC_TXQ_DESC_OPCODE_MASK) <<
79701489e5dSAlfredo Cardigliano 		IONIC_TXQ_DESC_OPCODE_SHIFT;
79801489e5dSAlfredo Cardigliano 	cmd |= (flags & IONIC_TXQ_DESC_FLAGS_MASK) <<
79901489e5dSAlfredo Cardigliano 		IONIC_TXQ_DESC_FLAGS_SHIFT;
800126fe197SAndrew Boyer 	cmd |= (nsge & IONIC_TXQ_DESC_NSGE_MASK) <<
801126fe197SAndrew Boyer 		IONIC_TXQ_DESC_NSGE_SHIFT;
802126fe197SAndrew Boyer 	cmd |= (addr & IONIC_TXQ_DESC_ADDR_MASK) <<
803126fe197SAndrew Boyer 		IONIC_TXQ_DESC_ADDR_SHIFT;
80401489e5dSAlfredo Cardigliano 
80501489e5dSAlfredo Cardigliano 	return cmd;
80601489e5dSAlfredo Cardigliano };
80701489e5dSAlfredo Cardigliano 
808126fe197SAndrew Boyer static inline void
809126fe197SAndrew Boyer decode_txq_desc_cmd(u64 cmd, u8 *opcode, u8 *flags,
81001489e5dSAlfredo Cardigliano 				       u8 *nsge, u64 *addr)
81101489e5dSAlfredo Cardigliano {
81201489e5dSAlfredo Cardigliano 	*opcode = (cmd >> IONIC_TXQ_DESC_OPCODE_SHIFT) &
81301489e5dSAlfredo Cardigliano 		IONIC_TXQ_DESC_OPCODE_MASK;
81401489e5dSAlfredo Cardigliano 	*flags = (cmd >> IONIC_TXQ_DESC_FLAGS_SHIFT) &
81501489e5dSAlfredo Cardigliano 		IONIC_TXQ_DESC_FLAGS_MASK;
816126fe197SAndrew Boyer 	*nsge = (cmd >> IONIC_TXQ_DESC_NSGE_SHIFT) &
817126fe197SAndrew Boyer 		IONIC_TXQ_DESC_NSGE_MASK;
818126fe197SAndrew Boyer 	*addr = (cmd >> IONIC_TXQ_DESC_ADDR_SHIFT) &
819126fe197SAndrew Boyer 		IONIC_TXQ_DESC_ADDR_MASK;
82001489e5dSAlfredo Cardigliano };
82101489e5dSAlfredo Cardigliano 
82201489e5dSAlfredo Cardigliano /**
823126fe197SAndrew Boyer  * struct ionic_txq_sg_elem - Transmit scatter-gather (SG) descriptor element
82401489e5dSAlfredo Cardigliano  * @addr:      DMA address of SG element data buffer
82501489e5dSAlfredo Cardigliano  * @len:       Length of SG element data buffer, in bytes
82601489e5dSAlfredo Cardigliano  */
82701489e5dSAlfredo Cardigliano struct ionic_txq_sg_elem {
82801489e5dSAlfredo Cardigliano 	__le64 addr;
82901489e5dSAlfredo Cardigliano 	__le16 len;
83001489e5dSAlfredo Cardigliano 	__le16 rsvd[3];
831126fe197SAndrew Boyer };
832126fe197SAndrew Boyer 
833126fe197SAndrew Boyer /**
834126fe197SAndrew Boyer  * struct ionic_txq_sg_desc - Transmit scatter-gather (SG) list
835126fe197SAndrew Boyer  * @elems:     Scatter-gather elements
836126fe197SAndrew Boyer  */
837126fe197SAndrew Boyer struct ionic_txq_sg_desc {
838126fe197SAndrew Boyer #define IONIC_TX_MAX_SG_ELEMS		8
839126fe197SAndrew Boyer #define IONIC_TX_SG_DESC_STRIDE		8
840126fe197SAndrew Boyer 	struct ionic_txq_sg_elem elems[IONIC_TX_MAX_SG_ELEMS];
841126fe197SAndrew Boyer };
842126fe197SAndrew Boyer 
843126fe197SAndrew Boyer struct ionic_txq_sg_desc_v1 {
844126fe197SAndrew Boyer #define IONIC_TX_MAX_SG_ELEMS_V1		15
845126fe197SAndrew Boyer #define IONIC_TX_SG_DESC_STRIDE_V1		16
846126fe197SAndrew Boyer 	struct ionic_txq_sg_elem elems[IONIC_TX_SG_DESC_STRIDE_V1];
84701489e5dSAlfredo Cardigliano };
84801489e5dSAlfredo Cardigliano 
84901489e5dSAlfredo Cardigliano /**
85001489e5dSAlfredo Cardigliano  * struct ionic_txq_comp - Ethernet transmit queue completion descriptor
851126fe197SAndrew Boyer  * @status:     Status of the command (enum ionic_status_code)
852126fe197SAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
853126fe197SAndrew Boyer  * @color:      Color bit
85401489e5dSAlfredo Cardigliano  */
85501489e5dSAlfredo Cardigliano struct ionic_txq_comp {
85601489e5dSAlfredo Cardigliano 	u8     status;
85701489e5dSAlfredo Cardigliano 	u8     rsvd;
85801489e5dSAlfredo Cardigliano 	__le16 comp_index;
85901489e5dSAlfredo Cardigliano 	u8     rsvd2[11];
86001489e5dSAlfredo Cardigliano 	u8     color;
86101489e5dSAlfredo Cardigliano };
86201489e5dSAlfredo Cardigliano 
86301489e5dSAlfredo Cardigliano enum ionic_rxq_desc_opcode {
86401489e5dSAlfredo Cardigliano 	IONIC_RXQ_DESC_OPCODE_SIMPLE = 0,
86501489e5dSAlfredo Cardigliano 	IONIC_RXQ_DESC_OPCODE_SG = 1,
86601489e5dSAlfredo Cardigliano };
86701489e5dSAlfredo Cardigliano 
86801489e5dSAlfredo Cardigliano /**
86901489e5dSAlfredo Cardigliano  * struct ionic_rxq_desc - Ethernet Rx queue descriptor format
870126fe197SAndrew Boyer  * @opcode:       Rx operation, see IONIC_RXQ_DESC_OPCODE_*:
87101489e5dSAlfredo Cardigliano  *
872126fe197SAndrew Boyer  *                   IONIC_RXQ_DESC_OPCODE_SIMPLE:
87301489e5dSAlfredo Cardigliano  *                      Receive full packet into data buffer
87401489e5dSAlfredo Cardigliano  *                      starting at @addr.  Results of
87501489e5dSAlfredo Cardigliano  *                      receive, including actual bytes received,
87601489e5dSAlfredo Cardigliano  *                      are recorded in Rx completion descriptor.
87701489e5dSAlfredo Cardigliano  *
878126fe197SAndrew Boyer  * @len:          Data buffer's length, in bytes
87901489e5dSAlfredo Cardigliano  * @addr:         Data buffer's DMA address
88001489e5dSAlfredo Cardigliano  */
88101489e5dSAlfredo Cardigliano struct ionic_rxq_desc {
88201489e5dSAlfredo Cardigliano 	u8     opcode;
88301489e5dSAlfredo Cardigliano 	u8     rsvd[5];
88401489e5dSAlfredo Cardigliano 	__le16 len;
88501489e5dSAlfredo Cardigliano 	__le64 addr;
88601489e5dSAlfredo Cardigliano };
88701489e5dSAlfredo Cardigliano 
88801489e5dSAlfredo Cardigliano /**
889126fe197SAndrew Boyer  * struct ionic_rxq_sg_elem - Receive scatter-gather (SG) descriptor element
89001489e5dSAlfredo Cardigliano  * @addr:      DMA address of SG element data buffer
89101489e5dSAlfredo Cardigliano  * @len:       Length of SG element data buffer, in bytes
89201489e5dSAlfredo Cardigliano  */
89301489e5dSAlfredo Cardigliano struct ionic_rxq_sg_elem {
89401489e5dSAlfredo Cardigliano 	__le64 addr;
89501489e5dSAlfredo Cardigliano 	__le16 len;
89601489e5dSAlfredo Cardigliano 	__le16 rsvd[3];
897126fe197SAndrew Boyer };
898126fe197SAndrew Boyer 
899126fe197SAndrew Boyer /**
900126fe197SAndrew Boyer  * struct ionic_rxq_sg_desc - Receive scatter-gather (SG) list
901126fe197SAndrew Boyer  * @elems:     Scatter-gather elements
902126fe197SAndrew Boyer  */
903126fe197SAndrew Boyer struct ionic_rxq_sg_desc {
904126fe197SAndrew Boyer #define IONIC_RX_MAX_SG_ELEMS		8
905126fe197SAndrew Boyer #define IONIC_RX_SG_DESC_STRIDE		8
906126fe197SAndrew Boyer 	struct ionic_rxq_sg_elem elems[IONIC_RX_SG_DESC_STRIDE];
90701489e5dSAlfredo Cardigliano };
90801489e5dSAlfredo Cardigliano 
90901489e5dSAlfredo Cardigliano /**
91001489e5dSAlfredo Cardigliano  * struct ionic_rxq_comp - Ethernet receive queue completion descriptor
911126fe197SAndrew Boyer  * @status:       Status of the command (enum ionic_status_code)
91201489e5dSAlfredo Cardigliano  * @num_sg_elems: Number of SG elements used by this descriptor
913126fe197SAndrew Boyer  * @comp_index:   Index in the descriptor ring for which this is the completion
91401489e5dSAlfredo Cardigliano  * @rss_hash:     32-bit RSS hash
915126fe197SAndrew Boyer  * @csum:         16-bit sum of the packet's L2 payload
91601489e5dSAlfredo Cardigliano  *                If the packet's L2 payload is odd length, an extra
91701489e5dSAlfredo Cardigliano  *                zero-value byte is included in the @csum calculation but
91801489e5dSAlfredo Cardigliano  *                not included in @len.
91901489e5dSAlfredo Cardigliano  * @vlan_tci:     VLAN tag stripped from the packet.  Valid if @VLAN is
92001489e5dSAlfredo Cardigliano  *                set.  Includes .1p and .1q tags.
92101489e5dSAlfredo Cardigliano  * @len:          Received packet length, in bytes.  Excludes FCS.
92201489e5dSAlfredo Cardigliano  * @csum_calc     L2 payload checksum is computed or not
923126fe197SAndrew Boyer  * @csum_flags:   See IONIC_RXQ_COMP_CSUM_F_*:
924126fe197SAndrew Boyer  *
925126fe197SAndrew Boyer  *                  IONIC_RXQ_COMP_CSUM_F_TCP_OK:
926126fe197SAndrew Boyer  *                    The TCP checksum calculated by the device
92701489e5dSAlfredo Cardigliano  *                    matched the checksum in the receive packet's
928126fe197SAndrew Boyer  *                    TCP header.
929126fe197SAndrew Boyer  *
930126fe197SAndrew Boyer  *                  IONIC_RXQ_COMP_CSUM_F_TCP_BAD:
931126fe197SAndrew Boyer  *                    The TCP checksum calculated by the device did
93201489e5dSAlfredo Cardigliano  *                    not match the checksum in the receive packet's
93301489e5dSAlfredo Cardigliano  *                    TCP header.
934126fe197SAndrew Boyer  *
935126fe197SAndrew Boyer  *                  IONIC_RXQ_COMP_CSUM_F_UDP_OK:
936126fe197SAndrew Boyer  *                    The UDP checksum calculated by the device
93701489e5dSAlfredo Cardigliano  *                    matched the checksum in the receive packet's
93801489e5dSAlfredo Cardigliano  *                    UDP header
939126fe197SAndrew Boyer  *
940126fe197SAndrew Boyer  *                  IONIC_RXQ_COMP_CSUM_F_UDP_BAD:
941126fe197SAndrew Boyer  *                    The UDP checksum calculated by the device did
94201489e5dSAlfredo Cardigliano  *                    not match the checksum in the receive packet's
94301489e5dSAlfredo Cardigliano  *                    UDP header.
944126fe197SAndrew Boyer  *
945126fe197SAndrew Boyer  *                  IONIC_RXQ_COMP_CSUM_F_IP_OK:
946126fe197SAndrew Boyer  *                    The IPv4 checksum calculated by the device
94701489e5dSAlfredo Cardigliano  *                    matched the checksum in the receive packet's
94801489e5dSAlfredo Cardigliano  *                    first IPv4 header.  If the receive packet
94901489e5dSAlfredo Cardigliano  *                    contains both a tunnel IPv4 header and a
95001489e5dSAlfredo Cardigliano  *                    transport IPv4 header, the device validates the
95101489e5dSAlfredo Cardigliano  *                    checksum for the both IPv4 headers.
952126fe197SAndrew Boyer  *
953126fe197SAndrew Boyer  *                  IONIC_RXQ_COMP_CSUM_F_IP_BAD:
954126fe197SAndrew Boyer  *                    The IPv4 checksum calculated by the device did
95501489e5dSAlfredo Cardigliano  *                    not match the checksum in the receive packet's
95601489e5dSAlfredo Cardigliano  *                    first IPv4 header. If the receive packet
95701489e5dSAlfredo Cardigliano  *                    contains both a tunnel IPv4 header and a
95801489e5dSAlfredo Cardigliano  *                    transport IPv4 header, the device validates the
95901489e5dSAlfredo Cardigliano  *                    checksum for both IP headers.
960126fe197SAndrew Boyer  *
961126fe197SAndrew Boyer  *                  IONIC_RXQ_COMP_CSUM_F_VLAN:
962126fe197SAndrew Boyer  *                    The VLAN header was stripped and placed in @vlan_tci.
963126fe197SAndrew Boyer  *
964126fe197SAndrew Boyer  *                  IONIC_RXQ_COMP_CSUM_F_CALC:
965126fe197SAndrew Boyer  *                    The checksum was calculated by the device.
966126fe197SAndrew Boyer  *
967126fe197SAndrew Boyer  * @pkt_type_color: Packet type and color bit; see IONIC_RXQ_COMP_PKT_TYPE_MASK
96801489e5dSAlfredo Cardigliano  */
96901489e5dSAlfredo Cardigliano struct ionic_rxq_comp {
97001489e5dSAlfredo Cardigliano 	u8     status;
97101489e5dSAlfredo Cardigliano 	u8     num_sg_elems;
97201489e5dSAlfredo Cardigliano 	__le16 comp_index;
97301489e5dSAlfredo Cardigliano 	__le32 rss_hash;
97401489e5dSAlfredo Cardigliano 	__le16 csum;
97501489e5dSAlfredo Cardigliano 	__le16 vlan_tci;
97601489e5dSAlfredo Cardigliano 	__le16 len;
97701489e5dSAlfredo Cardigliano 	u8     csum_flags;
97801489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_TCP_OK	0x01
97901489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_TCP_BAD	0x02
98001489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_UDP_OK	0x04
98101489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_UDP_BAD	0x08
98201489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_IP_OK	0x10
98301489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_IP_BAD	0x20
98401489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_VLAN	0x40
98501489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_CALC	0x80
98601489e5dSAlfredo Cardigliano 	u8     pkt_type_color;
9876645b283SAlfredo Cardigliano #define IONIC_RXQ_COMP_PKT_TYPE_MASK	0x7f
98801489e5dSAlfredo Cardigliano };
98901489e5dSAlfredo Cardigliano 
99001489e5dSAlfredo Cardigliano enum ionic_pkt_type {
991126fe197SAndrew Boyer 	IONIC_PKT_TYPE_NON_IP		= 0x00,
992126fe197SAndrew Boyer 	IONIC_PKT_TYPE_IPV4		= 0x01,
993126fe197SAndrew Boyer 	IONIC_PKT_TYPE_IPV4_TCP		= 0x03,
994126fe197SAndrew Boyer 	IONIC_PKT_TYPE_IPV4_UDP		= 0x05,
995126fe197SAndrew Boyer 	IONIC_PKT_TYPE_IPV6		= 0x08,
996126fe197SAndrew Boyer 	IONIC_PKT_TYPE_IPV6_TCP		= 0x18,
997126fe197SAndrew Boyer 	IONIC_PKT_TYPE_IPV6_UDP		= 0x28,
998126fe197SAndrew Boyer 	/* below types are only used if encap offloads are enabled on lif */
999126fe197SAndrew Boyer 	IONIC_PKT_TYPE_ENCAP_NON_IP	= 0x40,
1000126fe197SAndrew Boyer 	IONIC_PKT_TYPE_ENCAP_IPV4	= 0x41,
1001126fe197SAndrew Boyer 	IONIC_PKT_TYPE_ENCAP_IPV4_TCP	= 0x43,
1002126fe197SAndrew Boyer 	IONIC_PKT_TYPE_ENCAP_IPV4_UDP	= 0x45,
1003126fe197SAndrew Boyer 	IONIC_PKT_TYPE_ENCAP_IPV6	= 0x48,
1004126fe197SAndrew Boyer 	IONIC_PKT_TYPE_ENCAP_IPV6_TCP	= 0x58,
1005126fe197SAndrew Boyer 	IONIC_PKT_TYPE_ENCAP_IPV6_UDP	= 0x68,
100601489e5dSAlfredo Cardigliano };
100701489e5dSAlfredo Cardigliano 
100801489e5dSAlfredo Cardigliano enum ionic_eth_hw_features {
100901489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_VLAN_TX_TAG	= BIT(0),
101001489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_VLAN_RX_STRIP	= BIT(1),
101101489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_VLAN_RX_FILTER	= BIT(2),
101201489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_RX_HASH		= BIT(3),
101301489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_RX_CSUM		= BIT(4),
101401489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TX_SG		= BIT(5),
101501489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_RX_SG		= BIT(6),
101601489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TX_CSUM		= BIT(7),
101701489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO		= BIT(8),
101801489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO_IPV6		= BIT(9),
101901489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO_ECN		= BIT(10),
102001489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO_GRE		= BIT(11),
102101489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO_GRE_CSUM	= BIT(12),
102201489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO_IPXIP4		= BIT(13),
102301489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO_IPXIP6		= BIT(14),
102401489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO_UDP		= BIT(15),
102501489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO_UDP_CSUM	= BIT(16),
1026126fe197SAndrew Boyer 	IONIC_ETH_HW_RX_CSUM_GENEVE	= BIT(17),
1027126fe197SAndrew Boyer 	IONIC_ETH_HW_TX_CSUM_GENEVE	= BIT(18),
1028126fe197SAndrew Boyer 	IONIC_ETH_HW_TSO_GENEVE		= BIT(19)
102901489e5dSAlfredo Cardigliano };
103001489e5dSAlfredo Cardigliano 
103101489e5dSAlfredo Cardigliano /**
103201489e5dSAlfredo Cardigliano  * struct ionic_q_control_cmd - Queue control command
103301489e5dSAlfredo Cardigliano  * @opcode:     opcode
103401489e5dSAlfredo Cardigliano  * @type:       Queue type
103501489e5dSAlfredo Cardigliano  * @lif_index:  LIF index
103601489e5dSAlfredo Cardigliano  * @index:      Queue index
1037126fe197SAndrew Boyer  * @oper:       Operation (enum ionic_q_control_oper)
103801489e5dSAlfredo Cardigliano  */
103901489e5dSAlfredo Cardigliano struct ionic_q_control_cmd {
104001489e5dSAlfredo Cardigliano 	u8     opcode;
104101489e5dSAlfredo Cardigliano 	u8     type;
104201489e5dSAlfredo Cardigliano 	__le16 lif_index;
104301489e5dSAlfredo Cardigliano 	__le32 index;
104401489e5dSAlfredo Cardigliano 	u8     oper;
104501489e5dSAlfredo Cardigliano 	u8     rsvd[55];
104601489e5dSAlfredo Cardigliano };
104701489e5dSAlfredo Cardigliano 
104801489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_q_control_comp;
104901489e5dSAlfredo Cardigliano 
1050126fe197SAndrew Boyer enum ionic_q_control_oper {
105101489e5dSAlfredo Cardigliano 	IONIC_Q_DISABLE		= 0,
105201489e5dSAlfredo Cardigliano 	IONIC_Q_ENABLE		= 1,
105301489e5dSAlfredo Cardigliano 	IONIC_Q_HANG_RESET	= 2,
105401489e5dSAlfredo Cardigliano };
105501489e5dSAlfredo Cardigliano 
105601489e5dSAlfredo Cardigliano /**
1057126fe197SAndrew Boyer  * enum ionic_phy_type - Physical connection type
1058126fe197SAndrew Boyer  * @IONIC_PHY_TYPE_NONE:    No PHY installed
1059126fe197SAndrew Boyer  * @IONIC_PHY_TYPE_COPPER:  Copper PHY
1060126fe197SAndrew Boyer  * @IONIC_PHY_TYPE_FIBER:   Fiber PHY
106101489e5dSAlfredo Cardigliano  */
106201489e5dSAlfredo Cardigliano enum ionic_phy_type {
106301489e5dSAlfredo Cardigliano 	IONIC_PHY_TYPE_NONE	= 0,
106401489e5dSAlfredo Cardigliano 	IONIC_PHY_TYPE_COPPER	= 1,
106501489e5dSAlfredo Cardigliano 	IONIC_PHY_TYPE_FIBER	= 2,
106601489e5dSAlfredo Cardigliano };
106701489e5dSAlfredo Cardigliano 
106801489e5dSAlfredo Cardigliano /**
1069126fe197SAndrew Boyer  * enum ionic_xcvr_state - Transceiver status
1070126fe197SAndrew Boyer  * @IONIC_XCVR_STATE_REMOVED:        Transceiver removed
1071126fe197SAndrew Boyer  * @IONIC_XCVR_STATE_INSERTED:       Transceiver inserted
1072126fe197SAndrew Boyer  * @IONIC_XCVR_STATE_PENDING:        Transceiver pending
1073126fe197SAndrew Boyer  * @IONIC_XCVR_STATE_SPROM_READ:     Transceiver data read
1074126fe197SAndrew Boyer  * @IONIC_XCVR_STATE_SPROM_READ_ERR: Transceiver data read error
107501489e5dSAlfredo Cardigliano  */
107601489e5dSAlfredo Cardigliano enum ionic_xcvr_state {
107701489e5dSAlfredo Cardigliano 	IONIC_XCVR_STATE_REMOVED	 = 0,
107801489e5dSAlfredo Cardigliano 	IONIC_XCVR_STATE_INSERTED	 = 1,
107901489e5dSAlfredo Cardigliano 	IONIC_XCVR_STATE_PENDING	 = 2,
108001489e5dSAlfredo Cardigliano 	IONIC_XCVR_STATE_SPROM_READ	 = 3,
108101489e5dSAlfredo Cardigliano 	IONIC_XCVR_STATE_SPROM_READ_ERR	 = 4,
108201489e5dSAlfredo Cardigliano };
108301489e5dSAlfredo Cardigliano 
108401489e5dSAlfredo Cardigliano /**
1085126fe197SAndrew Boyer  * enum ionic_xcvr_pid - Supported link modes
108601489e5dSAlfredo Cardigliano  */
108701489e5dSAlfredo Cardigliano enum ionic_xcvr_pid {
108801489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_UNKNOWN           = 0,
108901489e5dSAlfredo Cardigliano 
109001489e5dSAlfredo Cardigliano 	/* CU */
109101489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_100G_CR4     = 1,
109201489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_40GBASE_CR4  = 2,
109301489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_25GBASE_CR_S  = 3,
109401489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_25GBASE_CR_L  = 4,
109501489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_25GBASE_CR_N  = 5,
109601489e5dSAlfredo Cardigliano 
109701489e5dSAlfredo Cardigliano 	/* Fiber */
109801489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_100G_AOC    = 50,
109901489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_100G_ACC    = 51,
110001489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_100G_SR4    = 52,
110101489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_100G_LR4    = 53,
110201489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_100G_ER4    = 54,
110301489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_40GBASE_ER4 = 55,
110401489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_40GBASE_SR4 = 56,
110501489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_40GBASE_LR4 = 57,
110601489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_40GBASE_AOC = 58,
110701489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_25GBASE_SR   = 59,
110801489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_25GBASE_LR   = 60,
110901489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_25GBASE_ER   = 61,
111001489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_25GBASE_AOC  = 62,
111101489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_10GBASE_SR   = 63,
111201489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_10GBASE_LR   = 64,
111301489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_10GBASE_LRM  = 65,
111401489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_10GBASE_ER   = 66,
111501489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_10GBASE_AOC  = 67,
111601489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_10GBASE_CU   = 68,
111701489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_100G_CWDM4  = 69,
111801489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_100G_PSM4   = 70,
1119126fe197SAndrew Boyer 	IONIC_XCVR_PID_SFP_25GBASE_ACC  = 71,
112001489e5dSAlfredo Cardigliano };
112101489e5dSAlfredo Cardigliano 
112201489e5dSAlfredo Cardigliano /**
1123126fe197SAndrew Boyer  * enum ionic_port_admin_state - Port config state
1124126fe197SAndrew Boyer  * @IONIC_PORT_ADMIN_STATE_NONE:    Port admin state not configured
1125126fe197SAndrew Boyer  * @IONIC_PORT_ADMIN_STATE_DOWN:    Port admin disabled
1126126fe197SAndrew Boyer  * @IONIC_PORT_ADMIN_STATE_UP:      Port admin enabled
112701489e5dSAlfredo Cardigliano  */
112801489e5dSAlfredo Cardigliano enum ionic_port_admin_state {
1129126fe197SAndrew Boyer 	IONIC_PORT_ADMIN_STATE_NONE = 0,
1130126fe197SAndrew Boyer 	IONIC_PORT_ADMIN_STATE_DOWN = 1,
1131126fe197SAndrew Boyer 	IONIC_PORT_ADMIN_STATE_UP   = 2,
113201489e5dSAlfredo Cardigliano };
113301489e5dSAlfredo Cardigliano 
113401489e5dSAlfredo Cardigliano /**
1135126fe197SAndrew Boyer  * enum ionic_port_oper_status - Port operational status
1136126fe197SAndrew Boyer  * @IONIC_PORT_OPER_STATUS_NONE:    Port disabled
1137126fe197SAndrew Boyer  * @IONIC_PORT_OPER_STATUS_UP:      Port link status up
1138126fe197SAndrew Boyer  * @IONIC_PORT_OPER_STATUS_DOWN:    Port link status down
113901489e5dSAlfredo Cardigliano  */
114001489e5dSAlfredo Cardigliano enum ionic_port_oper_status {
1141126fe197SAndrew Boyer 	IONIC_PORT_OPER_STATUS_NONE  = 0,
1142126fe197SAndrew Boyer 	IONIC_PORT_OPER_STATUS_UP    = 1,
1143126fe197SAndrew Boyer 	IONIC_PORT_OPER_STATUS_DOWN  = 2,
114401489e5dSAlfredo Cardigliano };
114501489e5dSAlfredo Cardigliano 
114601489e5dSAlfredo Cardigliano /**
1147126fe197SAndrew Boyer  * enum ionic_port_fec_type - Ethernet Forward error correction (FEC) modes
1148126fe197SAndrew Boyer  * @IONIC_PORT_FEC_TYPE_NONE:       FEC Disabled
1149126fe197SAndrew Boyer  * @IONIC_PORT_FEC_TYPE_FC:         FireCode FEC
1150126fe197SAndrew Boyer  * @IONIC_PORT_FEC_TYPE_RS:         ReedSolomon FEC
115101489e5dSAlfredo Cardigliano  */
115201489e5dSAlfredo Cardigliano enum ionic_port_fec_type {
1153126fe197SAndrew Boyer 	IONIC_PORT_FEC_TYPE_NONE = 0,
1154126fe197SAndrew Boyer 	IONIC_PORT_FEC_TYPE_FC   = 1,
1155126fe197SAndrew Boyer 	IONIC_PORT_FEC_TYPE_RS   = 2,
115601489e5dSAlfredo Cardigliano };
115701489e5dSAlfredo Cardigliano 
115801489e5dSAlfredo Cardigliano /**
1159126fe197SAndrew Boyer  * enum ionic_port_pause_type - Ethernet pause (flow control) modes
1160126fe197SAndrew Boyer  * @IONIC_PORT_PAUSE_TYPE_NONE:     Disable Pause
1161126fe197SAndrew Boyer  * @IONIC_PORT_PAUSE_TYPE_LINK:     Link level pause
1162126fe197SAndrew Boyer  * @IONIC_PORT_PAUSE_TYPE_PFC:      Priority-Flow Control
116301489e5dSAlfredo Cardigliano  */
116401489e5dSAlfredo Cardigliano enum ionic_port_pause_type {
1165126fe197SAndrew Boyer 	IONIC_PORT_PAUSE_TYPE_NONE = 0,
1166126fe197SAndrew Boyer 	IONIC_PORT_PAUSE_TYPE_LINK = 1,
1167126fe197SAndrew Boyer 	IONIC_PORT_PAUSE_TYPE_PFC  = 2,
116801489e5dSAlfredo Cardigliano };
116901489e5dSAlfredo Cardigliano 
117001489e5dSAlfredo Cardigliano /**
1171126fe197SAndrew Boyer  * enum ionic_port_loopback_mode - Loopback modes
1172126fe197SAndrew Boyer  * @IONIC_PORT_LOOPBACK_MODE_NONE:  Disable loopback
1173126fe197SAndrew Boyer  * @IONIC_PORT_LOOPBACK_MODE_MAC:   MAC loopback
1174126fe197SAndrew Boyer  * @IONIC_PORT_LOOPBACK_MODE_PHY:   PHY/SerDes loopback
117501489e5dSAlfredo Cardigliano  */
117601489e5dSAlfredo Cardigliano enum ionic_port_loopback_mode {
1177126fe197SAndrew Boyer 	IONIC_PORT_LOOPBACK_MODE_NONE = 0,
1178126fe197SAndrew Boyer 	IONIC_PORT_LOOPBACK_MODE_MAC  = 1,
1179126fe197SAndrew Boyer 	IONIC_PORT_LOOPBACK_MODE_PHY  = 2,
118001489e5dSAlfredo Cardigliano };
118101489e5dSAlfredo Cardigliano 
118201489e5dSAlfredo Cardigliano /**
1183126fe197SAndrew Boyer  * struct ionic_xcvr_status - Transceiver Status information
118401489e5dSAlfredo Cardigliano  * @state:    Transceiver status (enum ionic_xcvr_state)
118501489e5dSAlfredo Cardigliano  * @phy:      Physical connection type (enum ionic_phy_type)
1186126fe197SAndrew Boyer  * @pid:      Transceiver link mode (enum ionic_xcvr_pid)
118701489e5dSAlfredo Cardigliano  * @sprom:    Transceiver sprom contents
118801489e5dSAlfredo Cardigliano  */
118901489e5dSAlfredo Cardigliano struct ionic_xcvr_status {
119001489e5dSAlfredo Cardigliano 	u8     state;
119101489e5dSAlfredo Cardigliano 	u8     phy;
119201489e5dSAlfredo Cardigliano 	__le16 pid;
119301489e5dSAlfredo Cardigliano 	u8     sprom[256];
119401489e5dSAlfredo Cardigliano };
119501489e5dSAlfredo Cardigliano 
119601489e5dSAlfredo Cardigliano /**
1197126fe197SAndrew Boyer  * union ionic_port_config - Port configuration
119801489e5dSAlfredo Cardigliano  * @speed:              port speed (in Mbps)
119901489e5dSAlfredo Cardigliano  * @mtu:                mtu
1200126fe197SAndrew Boyer  * @state:              port admin state (enum ionic_port_admin_state)
120101489e5dSAlfredo Cardigliano  * @an_enable:          autoneg enable
120201489e5dSAlfredo Cardigliano  * @fec_type:           fec type (enum ionic_port_fec_type)
120301489e5dSAlfredo Cardigliano  * @pause_type:         pause type (enum ionic_port_pause_type)
120401489e5dSAlfredo Cardigliano  * @loopback_mode:      loopback mode (enum ionic_port_loopback_mode)
120501489e5dSAlfredo Cardigliano  */
120601489e5dSAlfredo Cardigliano union ionic_port_config {
120701489e5dSAlfredo Cardigliano 	struct {
120801489e5dSAlfredo Cardigliano #define IONIC_SPEED_100G	100000	/* 100G in Mbps */
120901489e5dSAlfredo Cardigliano #define IONIC_SPEED_50G		50000	/* 50G in Mbps */
121001489e5dSAlfredo Cardigliano #define IONIC_SPEED_40G		40000	/* 40G in Mbps */
121101489e5dSAlfredo Cardigliano #define IONIC_SPEED_25G		25000	/* 25G in Mbps */
121201489e5dSAlfredo Cardigliano #define IONIC_SPEED_10G		10000	/* 10G in Mbps */
121301489e5dSAlfredo Cardigliano #define IONIC_SPEED_1G		1000	/* 1G in Mbps */
121401489e5dSAlfredo Cardigliano 		__le32 speed;
121501489e5dSAlfredo Cardigliano 		__le32 mtu;
121601489e5dSAlfredo Cardigliano 		u8     state;
121701489e5dSAlfredo Cardigliano 		u8     an_enable;
121801489e5dSAlfredo Cardigliano 		u8     fec_type;
121901489e5dSAlfredo Cardigliano #define IONIC_PAUSE_TYPE_MASK		0x0f
122001489e5dSAlfredo Cardigliano #define IONIC_PAUSE_FLAGS_MASK		0xf0
122101489e5dSAlfredo Cardigliano #define IONIC_PAUSE_F_TX		0x10
122201489e5dSAlfredo Cardigliano #define IONIC_PAUSE_F_RX		0x20
122301489e5dSAlfredo Cardigliano 		u8     pause_type;
122401489e5dSAlfredo Cardigliano 		u8     loopback_mode;
122501489e5dSAlfredo Cardigliano 	};
122601489e5dSAlfredo Cardigliano 	__le32 words[64];
122701489e5dSAlfredo Cardigliano };
122801489e5dSAlfredo Cardigliano 
122901489e5dSAlfredo Cardigliano /**
1230126fe197SAndrew Boyer  * struct ionic_port_status - Port Status information
123101489e5dSAlfredo Cardigliano  * @status:             link status (enum ionic_port_oper_status)
123201489e5dSAlfredo Cardigliano  * @id:                 port id
123301489e5dSAlfredo Cardigliano  * @speed:              link speed (in Mbps)
1234126fe197SAndrew Boyer  * @link_down_count:    number of times link went from up to down
1235126fe197SAndrew Boyer  * @fec_type:           fec type (enum ionic_port_fec_type)
123601489e5dSAlfredo Cardigliano  * @xcvr:               transceiver status
123701489e5dSAlfredo Cardigliano  */
123801489e5dSAlfredo Cardigliano struct ionic_port_status {
123901489e5dSAlfredo Cardigliano 	__le32 id;
124001489e5dSAlfredo Cardigliano 	__le32 speed;
124101489e5dSAlfredo Cardigliano 	u8     status;
1242126fe197SAndrew Boyer 	__le16 link_down_count;
1243126fe197SAndrew Boyer 	u8     fec_type;
1244126fe197SAndrew Boyer 	u8     rsvd[48];
124501489e5dSAlfredo Cardigliano 	struct ionic_xcvr_status  xcvr;
1246126fe197SAndrew Boyer } __rte_packed;
124701489e5dSAlfredo Cardigliano 
124801489e5dSAlfredo Cardigliano /**
124901489e5dSAlfredo Cardigliano  * struct ionic_port_identify_cmd - Port identify command
125001489e5dSAlfredo Cardigliano  * @opcode:     opcode
125101489e5dSAlfredo Cardigliano  * @index:      port index
125201489e5dSAlfredo Cardigliano  * @ver:        Highest version of identify supported by driver
125301489e5dSAlfredo Cardigliano  */
125401489e5dSAlfredo Cardigliano struct ionic_port_identify_cmd {
125501489e5dSAlfredo Cardigliano 	u8 opcode;
125601489e5dSAlfredo Cardigliano 	u8 index;
125701489e5dSAlfredo Cardigliano 	u8 ver;
125801489e5dSAlfredo Cardigliano 	u8 rsvd[61];
125901489e5dSAlfredo Cardigliano };
126001489e5dSAlfredo Cardigliano 
126101489e5dSAlfredo Cardigliano /**
126201489e5dSAlfredo Cardigliano  * struct ionic_port_identify_comp - Port identify command completion
1263126fe197SAndrew Boyer  * @status: Status of the command (enum ionic_status_code)
126401489e5dSAlfredo Cardigliano  * @ver:    Version of identify returned by device
126501489e5dSAlfredo Cardigliano  */
126601489e5dSAlfredo Cardigliano struct ionic_port_identify_comp {
126701489e5dSAlfredo Cardigliano 	u8 status;
126801489e5dSAlfredo Cardigliano 	u8 ver;
126901489e5dSAlfredo Cardigliano 	u8 rsvd[14];
127001489e5dSAlfredo Cardigliano };
127101489e5dSAlfredo Cardigliano 
127201489e5dSAlfredo Cardigliano /**
127301489e5dSAlfredo Cardigliano  * struct ionic_port_init_cmd - Port initialization command
127401489e5dSAlfredo Cardigliano  * @opcode:     opcode
127501489e5dSAlfredo Cardigliano  * @index:      port index
127601489e5dSAlfredo Cardigliano  * @info_pa:    destination address for port info (struct ionic_port_info)
127701489e5dSAlfredo Cardigliano  */
127801489e5dSAlfredo Cardigliano struct ionic_port_init_cmd {
127901489e5dSAlfredo Cardigliano 	u8     opcode;
128001489e5dSAlfredo Cardigliano 	u8     index;
128101489e5dSAlfredo Cardigliano 	u8     rsvd[6];
128201489e5dSAlfredo Cardigliano 	__le64 info_pa;
128301489e5dSAlfredo Cardigliano 	u8     rsvd2[48];
128401489e5dSAlfredo Cardigliano };
128501489e5dSAlfredo Cardigliano 
128601489e5dSAlfredo Cardigliano /**
128701489e5dSAlfredo Cardigliano  * struct ionic_port_init_comp - Port initialization command completion
1288126fe197SAndrew Boyer  * @status: Status of the command (enum ionic_status_code)
128901489e5dSAlfredo Cardigliano  */
129001489e5dSAlfredo Cardigliano struct ionic_port_init_comp {
129101489e5dSAlfredo Cardigliano 	u8 status;
129201489e5dSAlfredo Cardigliano 	u8 rsvd[15];
129301489e5dSAlfredo Cardigliano };
129401489e5dSAlfredo Cardigliano 
129501489e5dSAlfredo Cardigliano /**
129601489e5dSAlfredo Cardigliano  * struct ionic_port_reset_cmd - Port reset command
129701489e5dSAlfredo Cardigliano  * @opcode:     opcode
129801489e5dSAlfredo Cardigliano  * @index:      port index
129901489e5dSAlfredo Cardigliano  */
130001489e5dSAlfredo Cardigliano struct ionic_port_reset_cmd {
130101489e5dSAlfredo Cardigliano 	u8 opcode;
130201489e5dSAlfredo Cardigliano 	u8 index;
130301489e5dSAlfredo Cardigliano 	u8 rsvd[62];
130401489e5dSAlfredo Cardigliano };
130501489e5dSAlfredo Cardigliano 
130601489e5dSAlfredo Cardigliano /**
130701489e5dSAlfredo Cardigliano  * struct ionic_port_reset_comp - Port reset command completion
1308126fe197SAndrew Boyer  * @status: Status of the command (enum ionic_status_code)
130901489e5dSAlfredo Cardigliano  */
131001489e5dSAlfredo Cardigliano struct ionic_port_reset_comp {
131101489e5dSAlfredo Cardigliano 	u8 status;
131201489e5dSAlfredo Cardigliano 	u8 rsvd[15];
131301489e5dSAlfredo Cardigliano };
131401489e5dSAlfredo Cardigliano 
131501489e5dSAlfredo Cardigliano /**
1316126fe197SAndrew Boyer  * enum ionic_stats_ctl_cmd - List of commands for stats control
1317126fe197SAndrew Boyer  * @IONIC_STATS_CTL_RESET:      Reset statistics
131801489e5dSAlfredo Cardigliano  */
131901489e5dSAlfredo Cardigliano enum ionic_stats_ctl_cmd {
132001489e5dSAlfredo Cardigliano 	IONIC_STATS_CTL_RESET		= 0,
132101489e5dSAlfredo Cardigliano };
132201489e5dSAlfredo Cardigliano 
132301489e5dSAlfredo Cardigliano /**
132401489e5dSAlfredo Cardigliano  * enum ionic_port_attr - List of device attributes
1325126fe197SAndrew Boyer  * @IONIC_PORT_ATTR_STATE:      Port state attribute
1326126fe197SAndrew Boyer  * @IONIC_PORT_ATTR_SPEED:      Port speed attribute
1327126fe197SAndrew Boyer  * @IONIC_PORT_ATTR_MTU:        Port MTU attribute
1328126fe197SAndrew Boyer  * @IONIC_PORT_ATTR_AUTONEG:    Port autonegotiation attribute
1329126fe197SAndrew Boyer  * @IONIC_PORT_ATTR_FEC:        Port FEC attribute
1330126fe197SAndrew Boyer  * @IONIC_PORT_ATTR_PAUSE:      Port pause attribute
1331126fe197SAndrew Boyer  * @IONIC_PORT_ATTR_LOOPBACK:   Port loopback attribute
1332126fe197SAndrew Boyer  * @IONIC_PORT_ATTR_STATS_CTRL: Port statistics control attribute
133301489e5dSAlfredo Cardigliano  */
133401489e5dSAlfredo Cardigliano enum ionic_port_attr {
133501489e5dSAlfredo Cardigliano 	IONIC_PORT_ATTR_STATE		= 0,
133601489e5dSAlfredo Cardigliano 	IONIC_PORT_ATTR_SPEED		= 1,
133701489e5dSAlfredo Cardigliano 	IONIC_PORT_ATTR_MTU		= 2,
133801489e5dSAlfredo Cardigliano 	IONIC_PORT_ATTR_AUTONEG		= 3,
133901489e5dSAlfredo Cardigliano 	IONIC_PORT_ATTR_FEC		= 4,
134001489e5dSAlfredo Cardigliano 	IONIC_PORT_ATTR_PAUSE		= 5,
134101489e5dSAlfredo Cardigliano 	IONIC_PORT_ATTR_LOOPBACK	= 6,
134201489e5dSAlfredo Cardigliano 	IONIC_PORT_ATTR_STATS_CTRL	= 7,
134301489e5dSAlfredo Cardigliano };
134401489e5dSAlfredo Cardigliano 
134501489e5dSAlfredo Cardigliano /**
134601489e5dSAlfredo Cardigliano  * struct ionic_port_setattr_cmd - Set port attributes on the NIC
134701489e5dSAlfredo Cardigliano  * @opcode:         Opcode
1348126fe197SAndrew Boyer  * @index:          Port index
134901489e5dSAlfredo Cardigliano  * @attr:           Attribute type (enum ionic_port_attr)
1350126fe197SAndrew Boyer  * @state:          Port state
1351126fe197SAndrew Boyer  * @speed:          Port speed
1352126fe197SAndrew Boyer  * @mtu:            Port MTU
1353126fe197SAndrew Boyer  * @an_enable:      Port autonegotiation setting
1354126fe197SAndrew Boyer  * @fec_type:       Port FEC type setting
1355126fe197SAndrew Boyer  * @pause_type:     Port pause type setting
1356126fe197SAndrew Boyer  * @loopback_mode:  Port loopback mode
1357126fe197SAndrew Boyer  * @stats_ctl:      Port stats setting
135801489e5dSAlfredo Cardigliano  */
135901489e5dSAlfredo Cardigliano struct ionic_port_setattr_cmd {
136001489e5dSAlfredo Cardigliano 	u8     opcode;
136101489e5dSAlfredo Cardigliano 	u8     index;
136201489e5dSAlfredo Cardigliano 	u8     attr;
136301489e5dSAlfredo Cardigliano 	u8     rsvd;
136401489e5dSAlfredo Cardigliano 	union {
136501489e5dSAlfredo Cardigliano 		u8      state;
136601489e5dSAlfredo Cardigliano 		__le32  speed;
136701489e5dSAlfredo Cardigliano 		__le32  mtu;
136801489e5dSAlfredo Cardigliano 		u8      an_enable;
136901489e5dSAlfredo Cardigliano 		u8      fec_type;
137001489e5dSAlfredo Cardigliano 		u8      pause_type;
137101489e5dSAlfredo Cardigliano 		u8      loopback_mode;
137201489e5dSAlfredo Cardigliano 		u8      stats_ctl;
137301489e5dSAlfredo Cardigliano 		u8      rsvd2[60];
137401489e5dSAlfredo Cardigliano 	};
137501489e5dSAlfredo Cardigliano };
137601489e5dSAlfredo Cardigliano 
137701489e5dSAlfredo Cardigliano /**
137801489e5dSAlfredo Cardigliano  * struct ionic_port_setattr_comp - Port set attr command completion
1379126fe197SAndrew Boyer  * @status:     Status of the command (enum ionic_status_code)
138001489e5dSAlfredo Cardigliano  * @color:      Color bit
138101489e5dSAlfredo Cardigliano  */
138201489e5dSAlfredo Cardigliano struct ionic_port_setattr_comp {
138301489e5dSAlfredo Cardigliano 	u8     status;
138401489e5dSAlfredo Cardigliano 	u8     rsvd[14];
138501489e5dSAlfredo Cardigliano 	u8     color;
138601489e5dSAlfredo Cardigliano };
138701489e5dSAlfredo Cardigliano 
138801489e5dSAlfredo Cardigliano /**
138901489e5dSAlfredo Cardigliano  * struct ionic_port_getattr_cmd - Get port attributes from the NIC
139001489e5dSAlfredo Cardigliano  * @opcode:     Opcode
139101489e5dSAlfredo Cardigliano  * @index:      port index
139201489e5dSAlfredo Cardigliano  * @attr:       Attribute type (enum ionic_port_attr)
139301489e5dSAlfredo Cardigliano  */
139401489e5dSAlfredo Cardigliano struct ionic_port_getattr_cmd {
139501489e5dSAlfredo Cardigliano 	u8     opcode;
139601489e5dSAlfredo Cardigliano 	u8     index;
139701489e5dSAlfredo Cardigliano 	u8     attr;
139801489e5dSAlfredo Cardigliano 	u8     rsvd[61];
139901489e5dSAlfredo Cardigliano };
140001489e5dSAlfredo Cardigliano 
140101489e5dSAlfredo Cardigliano /**
140201489e5dSAlfredo Cardigliano  * struct ionic_port_getattr_comp - Port get attr command completion
1403126fe197SAndrew Boyer  * @status:         Status of the command (enum ionic_status_code)
1404126fe197SAndrew Boyer  * @state:          Port state
1405126fe197SAndrew Boyer  * @speed:          Port speed
1406126fe197SAndrew Boyer  * @mtu:            Port MTU
1407126fe197SAndrew Boyer  * @an_enable:      Port autonegotiation setting
1408126fe197SAndrew Boyer  * @fec_type:       Port FEC type setting
1409126fe197SAndrew Boyer  * @pause_type:     Port pause type setting
1410126fe197SAndrew Boyer  * @loopback_mode:  Port loopback mode
141101489e5dSAlfredo Cardigliano  * @color:          Color bit
141201489e5dSAlfredo Cardigliano  */
141301489e5dSAlfredo Cardigliano struct ionic_port_getattr_comp {
141401489e5dSAlfredo Cardigliano 	u8     status;
141501489e5dSAlfredo Cardigliano 	u8     rsvd[3];
141601489e5dSAlfredo Cardigliano 	union {
141701489e5dSAlfredo Cardigliano 		u8      state;
141801489e5dSAlfredo Cardigliano 		__le32  speed;
141901489e5dSAlfredo Cardigliano 		__le32  mtu;
142001489e5dSAlfredo Cardigliano 		u8      an_enable;
142101489e5dSAlfredo Cardigliano 		u8      fec_type;
142201489e5dSAlfredo Cardigliano 		u8      pause_type;
142301489e5dSAlfredo Cardigliano 		u8      loopback_mode;
142401489e5dSAlfredo Cardigliano 		u8      rsvd2[11];
1425126fe197SAndrew Boyer 	} __rte_packed;
142601489e5dSAlfredo Cardigliano 	u8     color;
142701489e5dSAlfredo Cardigliano };
142801489e5dSAlfredo Cardigliano 
142901489e5dSAlfredo Cardigliano /**
1430126fe197SAndrew Boyer  * struct ionic_lif_status - LIF status register
143101489e5dSAlfredo Cardigliano  * @eid:             most recent NotifyQ event id
1432126fe197SAndrew Boyer  * @port_num:        port the LIF is connected to
143301489e5dSAlfredo Cardigliano  * @link_status:     port status (enum ionic_port_oper_status)
143401489e5dSAlfredo Cardigliano  * @link_speed:      speed of link in Mbps
1435126fe197SAndrew Boyer  * @link_down_count: number of times link went from up to down
143601489e5dSAlfredo Cardigliano  */
143701489e5dSAlfredo Cardigliano struct ionic_lif_status {
143801489e5dSAlfredo Cardigliano 	__le64 eid;
143901489e5dSAlfredo Cardigliano 	u8     port_num;
144001489e5dSAlfredo Cardigliano 	u8     rsvd;
144101489e5dSAlfredo Cardigliano 	__le16 link_status;
144201489e5dSAlfredo Cardigliano 	__le32 link_speed;		/* units of 1Mbps: eg 10000 = 10Gbps */
144301489e5dSAlfredo Cardigliano 	__le16 link_down_count;
144401489e5dSAlfredo Cardigliano 	u8      rsvd2[46];
144501489e5dSAlfredo Cardigliano };
144601489e5dSAlfredo Cardigliano 
144701489e5dSAlfredo Cardigliano /**
144801489e5dSAlfredo Cardigliano  * struct ionic_lif_reset_cmd - LIF reset command
144901489e5dSAlfredo Cardigliano  * @opcode:    opcode
145001489e5dSAlfredo Cardigliano  * @index:     LIF index
145101489e5dSAlfredo Cardigliano  */
145201489e5dSAlfredo Cardigliano struct ionic_lif_reset_cmd {
145301489e5dSAlfredo Cardigliano 	u8     opcode;
145401489e5dSAlfredo Cardigliano 	u8     rsvd;
145501489e5dSAlfredo Cardigliano 	__le16 index;
145601489e5dSAlfredo Cardigliano 	__le32 rsvd2[15];
145701489e5dSAlfredo Cardigliano };
145801489e5dSAlfredo Cardigliano 
145901489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_lif_reset_comp;
146001489e5dSAlfredo Cardigliano 
146101489e5dSAlfredo Cardigliano enum ionic_dev_state {
146201489e5dSAlfredo Cardigliano 	IONIC_DEV_DISABLE	= 0,
146301489e5dSAlfredo Cardigliano 	IONIC_DEV_ENABLE	= 1,
146401489e5dSAlfredo Cardigliano 	IONIC_DEV_HANG_RESET	= 2,
146501489e5dSAlfredo Cardigliano };
146601489e5dSAlfredo Cardigliano 
146701489e5dSAlfredo Cardigliano /**
146801489e5dSAlfredo Cardigliano  * enum ionic_dev_attr - List of device attributes
1469126fe197SAndrew Boyer  * @IONIC_DEV_ATTR_STATE:     Device state attribute
1470126fe197SAndrew Boyer  * @IONIC_DEV_ATTR_NAME:      Device name attribute
1471126fe197SAndrew Boyer  * @IONIC_DEV_ATTR_FEATURES:  Device feature attributes
147201489e5dSAlfredo Cardigliano  */
147301489e5dSAlfredo Cardigliano enum ionic_dev_attr {
147401489e5dSAlfredo Cardigliano 	IONIC_DEV_ATTR_STATE    = 0,
147501489e5dSAlfredo Cardigliano 	IONIC_DEV_ATTR_NAME     = 1,
147601489e5dSAlfredo Cardigliano 	IONIC_DEV_ATTR_FEATURES = 2,
147701489e5dSAlfredo Cardigliano };
147801489e5dSAlfredo Cardigliano 
147901489e5dSAlfredo Cardigliano /**
148001489e5dSAlfredo Cardigliano  * struct ionic_dev_setattr_cmd - Set Device attributes on the NIC
148101489e5dSAlfredo Cardigliano  * @opcode:     Opcode
148201489e5dSAlfredo Cardigliano  * @attr:       Attribute type (enum ionic_dev_attr)
148301489e5dSAlfredo Cardigliano  * @state:      Device state (enum ionic_dev_state)
148401489e5dSAlfredo Cardigliano  * @name:       The bus info, e.g. PCI slot-device-function, 0 terminated
148501489e5dSAlfredo Cardigliano  * @features:   Device features
148601489e5dSAlfredo Cardigliano  */
148701489e5dSAlfredo Cardigliano struct ionic_dev_setattr_cmd {
148801489e5dSAlfredo Cardigliano 	u8     opcode;
148901489e5dSAlfredo Cardigliano 	u8     attr;
149001489e5dSAlfredo Cardigliano 	__le16 rsvd;
149101489e5dSAlfredo Cardigliano 	union {
149201489e5dSAlfredo Cardigliano 		u8      state;
149301489e5dSAlfredo Cardigliano 		char    name[IONIC_IFNAMSIZ];
149401489e5dSAlfredo Cardigliano 		__le64  features;
149501489e5dSAlfredo Cardigliano 		u8      rsvd2[60];
1496126fe197SAndrew Boyer 	} __rte_packed;
149701489e5dSAlfredo Cardigliano };
149801489e5dSAlfredo Cardigliano 
149901489e5dSAlfredo Cardigliano /**
150001489e5dSAlfredo Cardigliano  * struct ionic_dev_setattr_comp - Device set attr command completion
1501126fe197SAndrew Boyer  * @status:     Status of the command (enum ionic_status_code)
150201489e5dSAlfredo Cardigliano  * @features:   Device features
150301489e5dSAlfredo Cardigliano  * @color:      Color bit
150401489e5dSAlfredo Cardigliano  */
150501489e5dSAlfredo Cardigliano struct ionic_dev_setattr_comp {
150601489e5dSAlfredo Cardigliano 	u8     status;
150701489e5dSAlfredo Cardigliano 	u8     rsvd[3];
150801489e5dSAlfredo Cardigliano 	union {
150901489e5dSAlfredo Cardigliano 		__le64  features;
151001489e5dSAlfredo Cardigliano 		u8      rsvd2[11];
1511126fe197SAndrew Boyer 	} __rte_packed;
151201489e5dSAlfredo Cardigliano 	u8     color;
151301489e5dSAlfredo Cardigliano };
151401489e5dSAlfredo Cardigliano 
151501489e5dSAlfredo Cardigliano /**
151601489e5dSAlfredo Cardigliano  * struct ionic_dev_getattr_cmd - Get Device attributes from the NIC
151701489e5dSAlfredo Cardigliano  * @opcode:     opcode
151801489e5dSAlfredo Cardigliano  * @attr:       Attribute type (enum ionic_dev_attr)
151901489e5dSAlfredo Cardigliano  */
152001489e5dSAlfredo Cardigliano struct ionic_dev_getattr_cmd {
152101489e5dSAlfredo Cardigliano 	u8     opcode;
152201489e5dSAlfredo Cardigliano 	u8     attr;
152301489e5dSAlfredo Cardigliano 	u8     rsvd[62];
152401489e5dSAlfredo Cardigliano };
152501489e5dSAlfredo Cardigliano 
152601489e5dSAlfredo Cardigliano /**
152701489e5dSAlfredo Cardigliano  * struct ionic_dev_setattr_comp - Device set attr command completion
1528126fe197SAndrew Boyer  * @status:     Status of the command (enum ionic_status_code)
152901489e5dSAlfredo Cardigliano  * @features:   Device features
153001489e5dSAlfredo Cardigliano  * @color:      Color bit
153101489e5dSAlfredo Cardigliano  */
153201489e5dSAlfredo Cardigliano struct ionic_dev_getattr_comp {
153301489e5dSAlfredo Cardigliano 	u8     status;
153401489e5dSAlfredo Cardigliano 	u8     rsvd[3];
153501489e5dSAlfredo Cardigliano 	union {
153601489e5dSAlfredo Cardigliano 		__le64  features;
153701489e5dSAlfredo Cardigliano 		u8      rsvd2[11];
1538126fe197SAndrew Boyer 	} __rte_packed;
153901489e5dSAlfredo Cardigliano 	u8     color;
154001489e5dSAlfredo Cardigliano };
154101489e5dSAlfredo Cardigliano 
154201489e5dSAlfredo Cardigliano /**
154301489e5dSAlfredo Cardigliano  * RSS parameters
154401489e5dSAlfredo Cardigliano  */
154501489e5dSAlfredo Cardigliano #define IONIC_RSS_HASH_KEY_SIZE		40
154601489e5dSAlfredo Cardigliano 
154701489e5dSAlfredo Cardigliano enum ionic_rss_hash_types {
154801489e5dSAlfredo Cardigliano 	IONIC_RSS_TYPE_IPV4	= BIT(0),
154901489e5dSAlfredo Cardigliano 	IONIC_RSS_TYPE_IPV4_TCP	= BIT(1),
155001489e5dSAlfredo Cardigliano 	IONIC_RSS_TYPE_IPV4_UDP	= BIT(2),
155101489e5dSAlfredo Cardigliano 	IONIC_RSS_TYPE_IPV6	= BIT(3),
155201489e5dSAlfredo Cardigliano 	IONIC_RSS_TYPE_IPV6_TCP	= BIT(4),
155301489e5dSAlfredo Cardigliano 	IONIC_RSS_TYPE_IPV6_UDP	= BIT(5),
155401489e5dSAlfredo Cardigliano };
155501489e5dSAlfredo Cardigliano 
155601489e5dSAlfredo Cardigliano /**
155701489e5dSAlfredo Cardigliano  * enum ionic_lif_attr - List of LIF attributes
1558126fe197SAndrew Boyer  * @IONIC_LIF_ATTR_STATE:       LIF state attribute
1559126fe197SAndrew Boyer  * @IONIC_LIF_ATTR_NAME:        LIF name attribute
1560126fe197SAndrew Boyer  * @IONIC_LIF_ATTR_MTU:         LIF MTU attribute
1561126fe197SAndrew Boyer  * @IONIC_LIF_ATTR_MAC:         LIF MAC attribute
1562126fe197SAndrew Boyer  * @IONIC_LIF_ATTR_FEATURES:    LIF features attribute
1563126fe197SAndrew Boyer  * @IONIC_LIF_ATTR_RSS:         LIF RSS attribute
1564126fe197SAndrew Boyer  * @IONIC_LIF_ATTR_STATS_CTRL:  LIF statistics control attribute
156501489e5dSAlfredo Cardigliano  */
156601489e5dSAlfredo Cardigliano enum ionic_lif_attr {
156701489e5dSAlfredo Cardigliano 	IONIC_LIF_ATTR_STATE        = 0,
156801489e5dSAlfredo Cardigliano 	IONIC_LIF_ATTR_NAME         = 1,
156901489e5dSAlfredo Cardigliano 	IONIC_LIF_ATTR_MTU          = 2,
157001489e5dSAlfredo Cardigliano 	IONIC_LIF_ATTR_MAC          = 3,
157101489e5dSAlfredo Cardigliano 	IONIC_LIF_ATTR_FEATURES     = 4,
157201489e5dSAlfredo Cardigliano 	IONIC_LIF_ATTR_RSS          = 5,
157301489e5dSAlfredo Cardigliano 	IONIC_LIF_ATTR_STATS_CTRL   = 6,
157401489e5dSAlfredo Cardigliano };
157501489e5dSAlfredo Cardigliano 
157601489e5dSAlfredo Cardigliano /**
157701489e5dSAlfredo Cardigliano  * struct ionic_lif_setattr_cmd - Set LIF attributes on the NIC
157801489e5dSAlfredo Cardigliano  * @opcode:     Opcode
1579126fe197SAndrew Boyer  * @attr:       Attribute type (enum ionic_lif_attr)
158001489e5dSAlfredo Cardigliano  * @index:      LIF index
1581126fe197SAndrew Boyer  * @state:      LIF state (enum ionic_lif_state)
158201489e5dSAlfredo Cardigliano  * @name:       The netdev name string, 0 terminated
158301489e5dSAlfredo Cardigliano  * @mtu:        Mtu
158401489e5dSAlfredo Cardigliano  * @mac:        Station mac
158501489e5dSAlfredo Cardigliano  * @features:   Features (enum ionic_eth_hw_features)
158601489e5dSAlfredo Cardigliano  * @rss:        RSS properties
1587126fe197SAndrew Boyer  *              @types:     The hash types to enable (see rss_hash_types)
1588126fe197SAndrew Boyer  *              @key:       The hash secret key
1589126fe197SAndrew Boyer  *              @addr:      Address for the indirection table shared memory
1590126fe197SAndrew Boyer  * @stats_ctl:  stats control commands (enum ionic_stats_ctl_cmd)
159101489e5dSAlfredo Cardigliano  */
159201489e5dSAlfredo Cardigliano struct ionic_lif_setattr_cmd {
159301489e5dSAlfredo Cardigliano 	u8     opcode;
159401489e5dSAlfredo Cardigliano 	u8     attr;
159501489e5dSAlfredo Cardigliano 	__le16 index;
159601489e5dSAlfredo Cardigliano 	union {
159701489e5dSAlfredo Cardigliano 		u8      state;
159801489e5dSAlfredo Cardigliano 		char    name[IONIC_IFNAMSIZ];
159901489e5dSAlfredo Cardigliano 		__le32  mtu;
160001489e5dSAlfredo Cardigliano 		u8      mac[6];
160101489e5dSAlfredo Cardigliano 		__le64  features;
160201489e5dSAlfredo Cardigliano 		struct {
160301489e5dSAlfredo Cardigliano 			__le16 types;
160401489e5dSAlfredo Cardigliano 			u8     key[IONIC_RSS_HASH_KEY_SIZE];
160501489e5dSAlfredo Cardigliano 			u8     rsvd[6];
160601489e5dSAlfredo Cardigliano 			__le64 addr;
160701489e5dSAlfredo Cardigliano 		} rss;
160801489e5dSAlfredo Cardigliano 		u8      stats_ctl;
160901489e5dSAlfredo Cardigliano 		u8      rsvd[60];
1610126fe197SAndrew Boyer 	} __rte_packed;
161101489e5dSAlfredo Cardigliano };
161201489e5dSAlfredo Cardigliano 
161301489e5dSAlfredo Cardigliano /**
161401489e5dSAlfredo Cardigliano  * struct ionic_lif_setattr_comp - LIF set attr command completion
1615126fe197SAndrew Boyer  * @status:     Status of the command (enum ionic_status_code)
1616126fe197SAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
161701489e5dSAlfredo Cardigliano  * @features:   features (enum ionic_eth_hw_features)
161801489e5dSAlfredo Cardigliano  * @color:      Color bit
161901489e5dSAlfredo Cardigliano  */
162001489e5dSAlfredo Cardigliano struct ionic_lif_setattr_comp {
162101489e5dSAlfredo Cardigliano 	u8     status;
162201489e5dSAlfredo Cardigliano 	u8     rsvd;
162301489e5dSAlfredo Cardigliano 	__le16 comp_index;
162401489e5dSAlfredo Cardigliano 	union {
162501489e5dSAlfredo Cardigliano 		__le64  features;
162601489e5dSAlfredo Cardigliano 		u8      rsvd2[11];
1627126fe197SAndrew Boyer 	} __rte_packed;
162801489e5dSAlfredo Cardigliano 	u8     color;
162901489e5dSAlfredo Cardigliano };
163001489e5dSAlfredo Cardigliano 
163101489e5dSAlfredo Cardigliano /**
163201489e5dSAlfredo Cardigliano  * struct ionic_lif_getattr_cmd - Get LIF attributes from the NIC
163301489e5dSAlfredo Cardigliano  * @opcode:     Opcode
163401489e5dSAlfredo Cardigliano  * @attr:       Attribute type (enum ionic_lif_attr)
163501489e5dSAlfredo Cardigliano  * @index:      LIF index
163601489e5dSAlfredo Cardigliano  */
163701489e5dSAlfredo Cardigliano struct ionic_lif_getattr_cmd {
163801489e5dSAlfredo Cardigliano 	u8     opcode;
163901489e5dSAlfredo Cardigliano 	u8     attr;
164001489e5dSAlfredo Cardigliano 	__le16 index;
164101489e5dSAlfredo Cardigliano 	u8     rsvd[60];
164201489e5dSAlfredo Cardigliano };
164301489e5dSAlfredo Cardigliano 
164401489e5dSAlfredo Cardigliano /**
164501489e5dSAlfredo Cardigliano  * struct ionic_lif_getattr_comp - LIF get attr command completion
1646126fe197SAndrew Boyer  * @status:     Status of the command (enum ionic_status_code)
1647126fe197SAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
1648126fe197SAndrew Boyer  * @state:      LIF state (enum ionic_lif_state)
164901489e5dSAlfredo Cardigliano  * @name:       The netdev name string, 0 terminated
165001489e5dSAlfredo Cardigliano  * @mtu:        Mtu
165101489e5dSAlfredo Cardigliano  * @mac:        Station mac
165201489e5dSAlfredo Cardigliano  * @features:   Features (enum ionic_eth_hw_features)
165301489e5dSAlfredo Cardigliano  * @color:      Color bit
165401489e5dSAlfredo Cardigliano  */
165501489e5dSAlfredo Cardigliano struct ionic_lif_getattr_comp {
165601489e5dSAlfredo Cardigliano 	u8     status;
165701489e5dSAlfredo Cardigliano 	u8     rsvd;
165801489e5dSAlfredo Cardigliano 	__le16 comp_index;
165901489e5dSAlfredo Cardigliano 	union {
166001489e5dSAlfredo Cardigliano 		u8      state;
166101489e5dSAlfredo Cardigliano 		__le32  mtu;
166201489e5dSAlfredo Cardigliano 		u8      mac[6];
166301489e5dSAlfredo Cardigliano 		__le64  features;
166401489e5dSAlfredo Cardigliano 		u8      rsvd2[11];
1665126fe197SAndrew Boyer 	} __rte_packed;
166601489e5dSAlfredo Cardigliano 	u8     color;
166701489e5dSAlfredo Cardigliano };
166801489e5dSAlfredo Cardigliano 
166901489e5dSAlfredo Cardigliano enum ionic_rx_mode {
167001489e5dSAlfredo Cardigliano 	IONIC_RX_MODE_F_UNICAST		= BIT(0),
167101489e5dSAlfredo Cardigliano 	IONIC_RX_MODE_F_MULTICAST	= BIT(1),
167201489e5dSAlfredo Cardigliano 	IONIC_RX_MODE_F_BROADCAST	= BIT(2),
167301489e5dSAlfredo Cardigliano 	IONIC_RX_MODE_F_PROMISC		= BIT(3),
167401489e5dSAlfredo Cardigliano 	IONIC_RX_MODE_F_ALLMULTI	= BIT(4),
1675126fe197SAndrew Boyer 	IONIC_RX_MODE_F_RDMA_SNIFFER	= BIT(5),
167601489e5dSAlfredo Cardigliano };
167701489e5dSAlfredo Cardigliano 
167801489e5dSAlfredo Cardigliano /**
167901489e5dSAlfredo Cardigliano  * struct ionic_rx_mode_set_cmd - Set LIF's Rx mode command
168001489e5dSAlfredo Cardigliano  * @opcode:     opcode
168101489e5dSAlfredo Cardigliano  * @lif_index:  LIF index
168201489e5dSAlfredo Cardigliano  * @rx_mode:    Rx mode flags:
1683126fe197SAndrew Boyer  *                  IONIC_RX_MODE_F_UNICAST: Accept known unicast packets
1684126fe197SAndrew Boyer  *                  IONIC_RX_MODE_F_MULTICAST: Accept known multicast packets
1685126fe197SAndrew Boyer  *                  IONIC_RX_MODE_F_BROADCAST: Accept broadcast packets
1686126fe197SAndrew Boyer  *                  IONIC_RX_MODE_F_PROMISC: Accept any packets
1687126fe197SAndrew Boyer  *                  IONIC_RX_MODE_F_ALLMULTI: Accept any multicast packets
1688126fe197SAndrew Boyer  *                  IONIC_RX_MODE_F_RDMA_SNIFFER: Sniff RDMA packets
168901489e5dSAlfredo Cardigliano  */
169001489e5dSAlfredo Cardigliano struct ionic_rx_mode_set_cmd {
169101489e5dSAlfredo Cardigliano 	u8     opcode;
169201489e5dSAlfredo Cardigliano 	u8     rsvd;
169301489e5dSAlfredo Cardigliano 	__le16 lif_index;
169401489e5dSAlfredo Cardigliano 	__le16 rx_mode;
169501489e5dSAlfredo Cardigliano 	__le16 rsvd2[29];
169601489e5dSAlfredo Cardigliano };
169701489e5dSAlfredo Cardigliano 
169801489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_rx_mode_set_comp;
169901489e5dSAlfredo Cardigliano 
170001489e5dSAlfredo Cardigliano enum ionic_rx_filter_match_type {
170101489e5dSAlfredo Cardigliano 	IONIC_RX_FILTER_MATCH_VLAN = 0,
170201489e5dSAlfredo Cardigliano 	IONIC_RX_FILTER_MATCH_MAC,
170301489e5dSAlfredo Cardigliano 	IONIC_RX_FILTER_MATCH_MAC_VLAN,
170401489e5dSAlfredo Cardigliano };
170501489e5dSAlfredo Cardigliano 
170601489e5dSAlfredo Cardigliano /**
170701489e5dSAlfredo Cardigliano  * struct ionic_rx_filter_add_cmd - Add LIF Rx filter command
170801489e5dSAlfredo Cardigliano  * @opcode:     opcode
170901489e5dSAlfredo Cardigliano  * @qtype:      Queue type
171001489e5dSAlfredo Cardigliano  * @lif_index:  LIF index
171101489e5dSAlfredo Cardigliano  * @qid:        Queue ID
1712126fe197SAndrew Boyer  * @match:      Rx filter match type (see IONIC_RX_FILTER_MATCH_xxx)
1713126fe197SAndrew Boyer  * @vlan:       VLAN filter
1714126fe197SAndrew Boyer  *              @vlan:  VLAN ID
1715126fe197SAndrew Boyer  * @mac:        MAC filter
1716126fe197SAndrew Boyer  *              @addr:  MAC address (network-byte order)
1717126fe197SAndrew Boyer  * @mac_vlan:   MACVLAN filter
171801489e5dSAlfredo Cardigliano  *              @vlan:  VLAN ID
171901489e5dSAlfredo Cardigliano  *              @addr:  MAC address (network-byte order)
172001489e5dSAlfredo Cardigliano  */
172101489e5dSAlfredo Cardigliano struct ionic_rx_filter_add_cmd {
172201489e5dSAlfredo Cardigliano 	u8     opcode;
172301489e5dSAlfredo Cardigliano 	u8     qtype;
172401489e5dSAlfredo Cardigliano 	__le16 lif_index;
172501489e5dSAlfredo Cardigliano 	__le32 qid;
172601489e5dSAlfredo Cardigliano 	__le16 match;
172701489e5dSAlfredo Cardigliano 	union {
172801489e5dSAlfredo Cardigliano 		struct {
172901489e5dSAlfredo Cardigliano 			__le16 vlan;
173001489e5dSAlfredo Cardigliano 		} vlan;
173101489e5dSAlfredo Cardigliano 		struct {
173201489e5dSAlfredo Cardigliano 			u8     addr[6];
173301489e5dSAlfredo Cardigliano 		} mac;
173401489e5dSAlfredo Cardigliano 		struct {
173501489e5dSAlfredo Cardigliano 			__le16 vlan;
173601489e5dSAlfredo Cardigliano 			u8     addr[6];
173701489e5dSAlfredo Cardigliano 		} mac_vlan;
173801489e5dSAlfredo Cardigliano 		u8 rsvd[54];
173901489e5dSAlfredo Cardigliano 	};
174001489e5dSAlfredo Cardigliano };
174101489e5dSAlfredo Cardigliano 
174201489e5dSAlfredo Cardigliano /**
174301489e5dSAlfredo Cardigliano  * struct ionic_rx_filter_add_comp - Add LIF Rx filter command completion
1744126fe197SAndrew Boyer  * @status:     Status of the command (enum ionic_status_code)
1745126fe197SAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
174601489e5dSAlfredo Cardigliano  * @filter_id:  Filter ID
1747126fe197SAndrew Boyer  * @color:      Color bit
174801489e5dSAlfredo Cardigliano  */
174901489e5dSAlfredo Cardigliano struct ionic_rx_filter_add_comp {
175001489e5dSAlfredo Cardigliano 	u8     status;
175101489e5dSAlfredo Cardigliano 	u8     rsvd;
175201489e5dSAlfredo Cardigliano 	__le16 comp_index;
175301489e5dSAlfredo Cardigliano 	__le32 filter_id;
175401489e5dSAlfredo Cardigliano 	u8     rsvd2[7];
175501489e5dSAlfredo Cardigliano 	u8     color;
175601489e5dSAlfredo Cardigliano };
175701489e5dSAlfredo Cardigliano 
175801489e5dSAlfredo Cardigliano /**
175901489e5dSAlfredo Cardigliano  * struct ionic_rx_filter_del_cmd - Delete LIF Rx filter command
176001489e5dSAlfredo Cardigliano  * @opcode:     opcode
176101489e5dSAlfredo Cardigliano  * @lif_index:  LIF index
176201489e5dSAlfredo Cardigliano  * @filter_id:  Filter ID
176301489e5dSAlfredo Cardigliano  */
176401489e5dSAlfredo Cardigliano struct ionic_rx_filter_del_cmd {
176501489e5dSAlfredo Cardigliano 	u8     opcode;
176601489e5dSAlfredo Cardigliano 	u8     rsvd;
176701489e5dSAlfredo Cardigliano 	__le16 lif_index;
176801489e5dSAlfredo Cardigliano 	__le32 filter_id;
176901489e5dSAlfredo Cardigliano 	u8     rsvd2[56];
177001489e5dSAlfredo Cardigliano };
177101489e5dSAlfredo Cardigliano 
177201489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_rx_filter_del_comp;
177301489e5dSAlfredo Cardigliano 
1774126fe197SAndrew Boyer enum ionic_vf_attr {
1775126fe197SAndrew Boyer 	IONIC_VF_ATTR_SPOOFCHK	= 1,
1776126fe197SAndrew Boyer 	IONIC_VF_ATTR_TRUST	= 2,
1777126fe197SAndrew Boyer 	IONIC_VF_ATTR_MAC	= 3,
1778126fe197SAndrew Boyer 	IONIC_VF_ATTR_LINKSTATE	= 4,
1779126fe197SAndrew Boyer 	IONIC_VF_ATTR_VLAN	= 5,
1780126fe197SAndrew Boyer 	IONIC_VF_ATTR_RATE	= 6,
1781126fe197SAndrew Boyer 	IONIC_VF_ATTR_STATSADDR	= 7,
1782126fe197SAndrew Boyer };
1783126fe197SAndrew Boyer 
1784126fe197SAndrew Boyer /**
1785126fe197SAndrew Boyer  * enum ionic_vf_link_status - Virtual Function link status
1786126fe197SAndrew Boyer  * @IONIC_VF_LINK_STATUS_AUTO:   Use link state of the uplink
1787126fe197SAndrew Boyer  * @IONIC_VF_LINK_STATUS_UP:     Link always up
1788126fe197SAndrew Boyer  * @IONIC_VF_LINK_STATUS_DOWN:   Link always down
1789126fe197SAndrew Boyer  */
1790126fe197SAndrew Boyer enum ionic_vf_link_status {
1791126fe197SAndrew Boyer 	IONIC_VF_LINK_STATUS_AUTO = 0,
1792126fe197SAndrew Boyer 	IONIC_VF_LINK_STATUS_UP   = 1,
1793126fe197SAndrew Boyer 	IONIC_VF_LINK_STATUS_DOWN = 2,
1794126fe197SAndrew Boyer };
1795126fe197SAndrew Boyer 
1796126fe197SAndrew Boyer /**
1797126fe197SAndrew Boyer  * struct ionic_vf_setattr_cmd - Set VF attributes on the NIC
1798126fe197SAndrew Boyer  * @opcode:     Opcode
1799126fe197SAndrew Boyer  * @attr:       Attribute type (enum ionic_vf_attr)
1800126fe197SAndrew Boyer  * @vf_index:   VF index
1801126fe197SAndrew Boyer  *	@macaddr:	mac address
1802126fe197SAndrew Boyer  *	@vlanid:	vlan ID
1803126fe197SAndrew Boyer  *	@maxrate:	max Tx rate in Mbps
1804126fe197SAndrew Boyer  *	@spoofchk:	enable address spoof checking
1805126fe197SAndrew Boyer  *	@trust:		enable VF trust
1806126fe197SAndrew Boyer  *	@linkstate:	set link up or down
1807126fe197SAndrew Boyer  *	@stats_pa:	set DMA address for VF stats
1808126fe197SAndrew Boyer  */
1809126fe197SAndrew Boyer struct ionic_vf_setattr_cmd {
1810126fe197SAndrew Boyer 	u8     opcode;
1811126fe197SAndrew Boyer 	u8     attr;
1812126fe197SAndrew Boyer 	__le16 vf_index;
1813126fe197SAndrew Boyer 	union {
1814126fe197SAndrew Boyer 		u8     macaddr[6];
1815126fe197SAndrew Boyer 		__le16 vlanid;
1816126fe197SAndrew Boyer 		__le32 maxrate;
1817126fe197SAndrew Boyer 		u8     spoofchk;
1818126fe197SAndrew Boyer 		u8     trust;
1819126fe197SAndrew Boyer 		u8     linkstate;
1820126fe197SAndrew Boyer 		__le64 stats_pa;
1821126fe197SAndrew Boyer 		u8     pad[60];
1822126fe197SAndrew Boyer 	} __rte_packed;
1823126fe197SAndrew Boyer };
1824126fe197SAndrew Boyer 
1825126fe197SAndrew Boyer struct ionic_vf_setattr_comp {
1826126fe197SAndrew Boyer 	u8     status;
1827126fe197SAndrew Boyer 	u8     attr;
1828126fe197SAndrew Boyer 	__le16 vf_index;
1829126fe197SAndrew Boyer 	__le16 comp_index;
1830126fe197SAndrew Boyer 	u8     rsvd[9];
1831126fe197SAndrew Boyer 	u8     color;
1832126fe197SAndrew Boyer };
1833126fe197SAndrew Boyer 
1834126fe197SAndrew Boyer /**
1835126fe197SAndrew Boyer  * struct ionic_vf_getattr_cmd - Get VF attributes from the NIC
1836126fe197SAndrew Boyer  * @opcode:     Opcode
1837126fe197SAndrew Boyer  * @attr:       Attribute type (enum ionic_vf_attr)
1838126fe197SAndrew Boyer  * @vf_index:   VF index
1839126fe197SAndrew Boyer  */
1840126fe197SAndrew Boyer struct ionic_vf_getattr_cmd {
1841126fe197SAndrew Boyer 	u8     opcode;
1842126fe197SAndrew Boyer 	u8     attr;
1843126fe197SAndrew Boyer 	__le16 vf_index;
1844126fe197SAndrew Boyer 	u8     rsvd[60];
1845126fe197SAndrew Boyer };
1846126fe197SAndrew Boyer 
1847126fe197SAndrew Boyer struct ionic_vf_getattr_comp {
1848126fe197SAndrew Boyer 	u8     status;
1849126fe197SAndrew Boyer 	u8     attr;
1850126fe197SAndrew Boyer 	__le16 vf_index;
1851126fe197SAndrew Boyer 	union {
1852126fe197SAndrew Boyer 		u8     macaddr[6];
1853126fe197SAndrew Boyer 		__le16 vlanid;
1854126fe197SAndrew Boyer 		__le32 maxrate;
1855126fe197SAndrew Boyer 		u8     spoofchk;
1856126fe197SAndrew Boyer 		u8     trust;
1857126fe197SAndrew Boyer 		u8     linkstate;
1858126fe197SAndrew Boyer 		__le64 stats_pa;
1859126fe197SAndrew Boyer 		u8     pad[11];
1860126fe197SAndrew Boyer 	} __rte_packed;
1861126fe197SAndrew Boyer 	u8     color;
1862126fe197SAndrew Boyer };
1863126fe197SAndrew Boyer 
186401489e5dSAlfredo Cardigliano /**
186501489e5dSAlfredo Cardigliano  * struct ionic_qos_identify_cmd - QoS identify command
186601489e5dSAlfredo Cardigliano  * @opcode:  opcode
186701489e5dSAlfredo Cardigliano  * @ver:     Highest version of identify supported by driver
186801489e5dSAlfredo Cardigliano  *
186901489e5dSAlfredo Cardigliano  */
187001489e5dSAlfredo Cardigliano struct ionic_qos_identify_cmd {
187101489e5dSAlfredo Cardigliano 	u8 opcode;
187201489e5dSAlfredo Cardigliano 	u8 ver;
187301489e5dSAlfredo Cardigliano 	u8 rsvd[62];
187401489e5dSAlfredo Cardigliano };
187501489e5dSAlfredo Cardigliano 
187601489e5dSAlfredo Cardigliano /**
187701489e5dSAlfredo Cardigliano  * struct ionic_qos_identify_comp - QoS identify command completion
1878126fe197SAndrew Boyer  * @status: Status of the command (enum ionic_status_code)
187901489e5dSAlfredo Cardigliano  * @ver:    Version of identify returned by device
188001489e5dSAlfredo Cardigliano  */
188101489e5dSAlfredo Cardigliano struct ionic_qos_identify_comp {
188201489e5dSAlfredo Cardigliano 	u8 status;
188301489e5dSAlfredo Cardigliano 	u8 ver;
188401489e5dSAlfredo Cardigliano 	u8 rsvd[14];
188501489e5dSAlfredo Cardigliano };
188601489e5dSAlfredo Cardigliano 
1887126fe197SAndrew Boyer #define IONIC_QOS_TC_MAX		8
1888126fe197SAndrew Boyer #define IONIC_QOS_ALL_TC		0xFF
1889126fe197SAndrew Boyer /* Capri max supported, should be renamed. */
189001489e5dSAlfredo Cardigliano #define IONIC_QOS_CLASS_MAX		7
1891126fe197SAndrew Boyer #define IONIC_QOS_PCP_MAX		8
189201489e5dSAlfredo Cardigliano #define IONIC_QOS_CLASS_NAME_SZ	32
1893126fe197SAndrew Boyer #define IONIC_QOS_DSCP_MAX		64
1894126fe197SAndrew Boyer #define IONIC_QOS_ALL_PCP		0xFF
1895126fe197SAndrew Boyer #define IONIC_DSCP_BLOCK_SIZE		8
189601489e5dSAlfredo Cardigliano 
189701489e5dSAlfredo Cardigliano /**
189801489e5dSAlfredo Cardigliano  * enum ionic_qos_class
189901489e5dSAlfredo Cardigliano  */
190001489e5dSAlfredo Cardigliano enum ionic_qos_class {
190101489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_DEFAULT		= 0,
190201489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_USER_DEFINED_1	= 1,
190301489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_USER_DEFINED_2	= 2,
190401489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_USER_DEFINED_3	= 3,
190501489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_USER_DEFINED_4	= 4,
190601489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_USER_DEFINED_5	= 5,
190701489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_USER_DEFINED_6	= 6,
190801489e5dSAlfredo Cardigliano };
190901489e5dSAlfredo Cardigliano 
191001489e5dSAlfredo Cardigliano /**
191101489e5dSAlfredo Cardigliano  * enum ionic_qos_class_type - Traffic classification criteria
1912126fe197SAndrew Boyer  * @IONIC_QOS_CLASS_TYPE_NONE:    No QoS
1913126fe197SAndrew Boyer  * @IONIC_QOS_CLASS_TYPE_PCP:     Dot1Q PCP
1914126fe197SAndrew Boyer  * @IONIC_QOS_CLASS_TYPE_DSCP:    IP DSCP
191501489e5dSAlfredo Cardigliano  */
191601489e5dSAlfredo Cardigliano enum ionic_qos_class_type {
191701489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_TYPE_NONE	= 0,
1918126fe197SAndrew Boyer 	IONIC_QOS_CLASS_TYPE_PCP	= 1,
1919126fe197SAndrew Boyer 	IONIC_QOS_CLASS_TYPE_DSCP	= 2,
192001489e5dSAlfredo Cardigliano };
192101489e5dSAlfredo Cardigliano 
192201489e5dSAlfredo Cardigliano /**
1923126fe197SAndrew Boyer  * enum ionic_qos_sched_type - QoS class scheduling type
1924126fe197SAndrew Boyer  * @IONIC_QOS_SCHED_TYPE_STRICT:  Strict priority
1925126fe197SAndrew Boyer  * @IONIC_QOS_SCHED_TYPE_DWRR:    Deficit weighted round-robin
192601489e5dSAlfredo Cardigliano  */
192701489e5dSAlfredo Cardigliano enum ionic_qos_sched_type {
192801489e5dSAlfredo Cardigliano 	IONIC_QOS_SCHED_TYPE_STRICT	= 0,
192901489e5dSAlfredo Cardigliano 	IONIC_QOS_SCHED_TYPE_DWRR	= 1,
193001489e5dSAlfredo Cardigliano };
193101489e5dSAlfredo Cardigliano 
193201489e5dSAlfredo Cardigliano /**
1933126fe197SAndrew Boyer  * union ionic_qos_config - QoS configuration structure
193401489e5dSAlfredo Cardigliano  * @flags:		Configuration flags
193501489e5dSAlfredo Cardigliano  *	IONIC_QOS_CONFIG_F_ENABLE		enable
1936126fe197SAndrew Boyer  *	IONIC_QOS_CONFIG_F_NO_DROP		drop/nodrop
193701489e5dSAlfredo Cardigliano  *	IONIC_QOS_CONFIG_F_RW_DOT1Q_PCP		enable dot1q pcp rewrite
193801489e5dSAlfredo Cardigliano  *	IONIC_QOS_CONFIG_F_RW_IP_DSCP		enable ip dscp rewrite
1939126fe197SAndrew Boyer  *	IONIC_QOS_CONFIG_F_NON_DISRUPTIVE	Non-disruptive TC update
1940126fe197SAndrew Boyer  * @sched_type:		QoS class scheduling type (enum ionic_qos_sched_type)
1941126fe197SAndrew Boyer  * @class_type:		QoS class type (enum ionic_qos_class_type)
1942126fe197SAndrew Boyer  * @pause_type:		QoS pause type (enum ionic_qos_pause_type)
1943126fe197SAndrew Boyer  * @name:		QoS class name
194401489e5dSAlfredo Cardigliano  * @mtu:		MTU of the class
1945126fe197SAndrew Boyer  * @pfc_cos:		Priority-Flow Control class of service
1946126fe197SAndrew Boyer  * @dwrr_weight:	QoS class scheduling weight
194701489e5dSAlfredo Cardigliano  * @strict_rlmt:	Rate limit for strict priority scheduling
1948126fe197SAndrew Boyer  * @rw_dot1q_pcp:	Rewrite dot1q pcp to value (valid iff F_RW_DOT1Q_PCP)
1949126fe197SAndrew Boyer  * @rw_ip_dscp:		Rewrite ip dscp to value (valid iff F_RW_IP_DSCP)
195001489e5dSAlfredo Cardigliano  * @dot1q_pcp:		Dot1q pcp value
195101489e5dSAlfredo Cardigliano  * @ndscp:		Number of valid dscp values in the ip_dscp field
195201489e5dSAlfredo Cardigliano  * @ip_dscp:		IP dscp values
195301489e5dSAlfredo Cardigliano  */
195401489e5dSAlfredo Cardigliano union ionic_qos_config {
195501489e5dSAlfredo Cardigliano 	struct {
195601489e5dSAlfredo Cardigliano #define IONIC_QOS_CONFIG_F_ENABLE		BIT(0)
1957126fe197SAndrew Boyer #define IONIC_QOS_CONFIG_F_NO_DROP		BIT(1)
1958126fe197SAndrew Boyer /* Used to rewrite PCP or DSCP value. */
195901489e5dSAlfredo Cardigliano #define IONIC_QOS_CONFIG_F_RW_DOT1Q_PCP		BIT(2)
196001489e5dSAlfredo Cardigliano #define IONIC_QOS_CONFIG_F_RW_IP_DSCP		BIT(3)
1961126fe197SAndrew Boyer /* Non-disruptive TC update */
1962126fe197SAndrew Boyer #define IONIC_QOS_CONFIG_F_NON_DISRUPTIVE	BIT(4)
196301489e5dSAlfredo Cardigliano 		u8      flags;
196401489e5dSAlfredo Cardigliano 		u8      sched_type;
196501489e5dSAlfredo Cardigliano 		u8      class_type;
196601489e5dSAlfredo Cardigliano 		u8      pause_type;
196701489e5dSAlfredo Cardigliano 		char    name[IONIC_QOS_CLASS_NAME_SZ];
196801489e5dSAlfredo Cardigliano 		__le32  mtu;
196901489e5dSAlfredo Cardigliano 		/* flow control */
197001489e5dSAlfredo Cardigliano 		u8      pfc_cos;
197101489e5dSAlfredo Cardigliano 		/* scheduler */
197201489e5dSAlfredo Cardigliano 		union {
197301489e5dSAlfredo Cardigliano 			u8      dwrr_weight;
197401489e5dSAlfredo Cardigliano 			__le64  strict_rlmt;
197501489e5dSAlfredo Cardigliano 		};
197601489e5dSAlfredo Cardigliano 		/* marking */
1977126fe197SAndrew Boyer 		/* Used to rewrite PCP or DSCP value. */
197801489e5dSAlfredo Cardigliano 		union {
197901489e5dSAlfredo Cardigliano 			u8      rw_dot1q_pcp;
198001489e5dSAlfredo Cardigliano 			u8      rw_ip_dscp;
198101489e5dSAlfredo Cardigliano 		};
198201489e5dSAlfredo Cardigliano 		/* classification */
198301489e5dSAlfredo Cardigliano 		union {
198401489e5dSAlfredo Cardigliano 			u8      dot1q_pcp;
198501489e5dSAlfredo Cardigliano 			struct {
198601489e5dSAlfredo Cardigliano 				u8      ndscp;
1987126fe197SAndrew Boyer 				u8      ip_dscp[IONIC_QOS_DSCP_MAX];
198801489e5dSAlfredo Cardigliano 			};
198901489e5dSAlfredo Cardigliano 		};
1990126fe197SAndrew Boyer 	} __rte_packed;
199101489e5dSAlfredo Cardigliano 	__le32  words[64];
199201489e5dSAlfredo Cardigliano };
199301489e5dSAlfredo Cardigliano 
199401489e5dSAlfredo Cardigliano /**
199501489e5dSAlfredo Cardigliano  * union ionic_qos_identity - QoS identity structure
199601489e5dSAlfredo Cardigliano  * @version:	Version of the identify structure
199701489e5dSAlfredo Cardigliano  * @type:	QoS system type
199801489e5dSAlfredo Cardigliano  * @nclasses:	Number of usable QoS classes
199901489e5dSAlfredo Cardigliano  * @config:	Current configuration of classes
200001489e5dSAlfredo Cardigliano  */
200101489e5dSAlfredo Cardigliano union ionic_qos_identity {
200201489e5dSAlfredo Cardigliano 	struct {
200301489e5dSAlfredo Cardigliano 		u8     version;
200401489e5dSAlfredo Cardigliano 		u8     type;
200501489e5dSAlfredo Cardigliano 		u8     rsvd[62];
200601489e5dSAlfredo Cardigliano 		union ionic_qos_config config[IONIC_QOS_CLASS_MAX];
200701489e5dSAlfredo Cardigliano 	};
2008126fe197SAndrew Boyer 	__le32 words[478];
200901489e5dSAlfredo Cardigliano };
201001489e5dSAlfredo Cardigliano 
201101489e5dSAlfredo Cardigliano /**
2012126fe197SAndrew Boyer  * struct ionic_qos_init_cmd - QoS config init command
201301489e5dSAlfredo Cardigliano  * @opcode:	Opcode
2014126fe197SAndrew Boyer  * @group:	QoS class id
201501489e5dSAlfredo Cardigliano  * @info_pa:	destination address for qos info
201601489e5dSAlfredo Cardigliano  */
201701489e5dSAlfredo Cardigliano struct ionic_qos_init_cmd {
201801489e5dSAlfredo Cardigliano 	u8     opcode;
201901489e5dSAlfredo Cardigliano 	u8     group;
202001489e5dSAlfredo Cardigliano 	u8     rsvd[6];
202101489e5dSAlfredo Cardigliano 	__le64 info_pa;
202201489e5dSAlfredo Cardigliano 	u8     rsvd1[48];
202301489e5dSAlfredo Cardigliano };
202401489e5dSAlfredo Cardigliano 
202501489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_qos_init_comp;
202601489e5dSAlfredo Cardigliano 
202701489e5dSAlfredo Cardigliano /**
2028126fe197SAndrew Boyer  * struct ionic_qos_reset_cmd - QoS config reset command
202901489e5dSAlfredo Cardigliano  * @opcode:	Opcode
2030126fe197SAndrew Boyer  * @group:	QoS class id
203101489e5dSAlfredo Cardigliano  */
203201489e5dSAlfredo Cardigliano struct ionic_qos_reset_cmd {
203301489e5dSAlfredo Cardigliano 	u8    opcode;
203401489e5dSAlfredo Cardigliano 	u8    group;
203501489e5dSAlfredo Cardigliano 	u8    rsvd[62];
203601489e5dSAlfredo Cardigliano };
203701489e5dSAlfredo Cardigliano 
2038126fe197SAndrew Boyer /**
2039126fe197SAndrew Boyer  * struct ionic_qos_clear_port_stats_cmd - Qos config reset command
2040126fe197SAndrew Boyer  * @opcode:	Opcode
2041126fe197SAndrew Boyer  */
2042126fe197SAndrew Boyer struct ionic_qos_clear_stats_cmd {
2043126fe197SAndrew Boyer 	u8    opcode;
2044126fe197SAndrew Boyer 	u8    group_bitmap;
2045126fe197SAndrew Boyer 	u8    rsvd[62];
2046126fe197SAndrew Boyer };
2047126fe197SAndrew Boyer 
204801489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_qos_reset_comp;
204901489e5dSAlfredo Cardigliano 
205001489e5dSAlfredo Cardigliano /**
205101489e5dSAlfredo Cardigliano  * struct ionic_fw_download_cmd - Firmware download command
205201489e5dSAlfredo Cardigliano  * @opcode:	opcode
205301489e5dSAlfredo Cardigliano  * @addr:	dma address of the firmware buffer
205401489e5dSAlfredo Cardigliano  * @offset:	offset of the firmware buffer within the full image
205501489e5dSAlfredo Cardigliano  * @length:	number of valid bytes in the firmware buffer
205601489e5dSAlfredo Cardigliano  */
205701489e5dSAlfredo Cardigliano struct ionic_fw_download_cmd {
205801489e5dSAlfredo Cardigliano 	u8     opcode;
205901489e5dSAlfredo Cardigliano 	u8     rsvd[3];
206001489e5dSAlfredo Cardigliano 	__le32 offset;
206101489e5dSAlfredo Cardigliano 	__le64 addr;
206201489e5dSAlfredo Cardigliano 	__le32 length;
206301489e5dSAlfredo Cardigliano };
206401489e5dSAlfredo Cardigliano 
206501489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_fw_download_comp;
206601489e5dSAlfredo Cardigliano 
2067126fe197SAndrew Boyer /**
2068126fe197SAndrew Boyer  * enum ionic_fw_control_oper - FW control operations
2069126fe197SAndrew Boyer  * @IONIC_FW_RESET:     Reset firmware
2070126fe197SAndrew Boyer  * @IONIC_FW_INSTALL:   Install firmware
2071126fe197SAndrew Boyer  * @IONIC_FW_ACTIVATE:  Acticate firmware
2072126fe197SAndrew Boyer  */
207301489e5dSAlfredo Cardigliano enum ionic_fw_control_oper {
2074126fe197SAndrew Boyer 	IONIC_FW_RESET		= 0,
2075126fe197SAndrew Boyer 	IONIC_FW_INSTALL	= 1,
2076126fe197SAndrew Boyer 	IONIC_FW_ACTIVATE	= 2,
207701489e5dSAlfredo Cardigliano };
207801489e5dSAlfredo Cardigliano 
207901489e5dSAlfredo Cardigliano /**
208001489e5dSAlfredo Cardigliano  * struct ionic_fw_control_cmd - Firmware control command
208101489e5dSAlfredo Cardigliano  * @opcode:    opcode
208201489e5dSAlfredo Cardigliano  * @oper:      firmware control operation (enum ionic_fw_control_oper)
208301489e5dSAlfredo Cardigliano  * @slot:      slot to activate
208401489e5dSAlfredo Cardigliano  */
208501489e5dSAlfredo Cardigliano struct ionic_fw_control_cmd {
208601489e5dSAlfredo Cardigliano 	u8  opcode;
208701489e5dSAlfredo Cardigliano 	u8  rsvd[3];
208801489e5dSAlfredo Cardigliano 	u8  oper;
208901489e5dSAlfredo Cardigliano 	u8  slot;
209001489e5dSAlfredo Cardigliano 	u8  rsvd1[58];
209101489e5dSAlfredo Cardigliano };
209201489e5dSAlfredo Cardigliano 
209301489e5dSAlfredo Cardigliano /**
209401489e5dSAlfredo Cardigliano  * struct ionic_fw_control_comp - Firmware control copletion
2095126fe197SAndrew Boyer  * @status:     Status of the command (enum ionic_status_code)
2096126fe197SAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
2097126fe197SAndrew Boyer  * @slot:       Slot where the firmware was installed
2098126fe197SAndrew Boyer  * @color:      Color bit
209901489e5dSAlfredo Cardigliano  */
210001489e5dSAlfredo Cardigliano struct ionic_fw_control_comp {
210101489e5dSAlfredo Cardigliano 	u8     status;
210201489e5dSAlfredo Cardigliano 	u8     rsvd;
210301489e5dSAlfredo Cardigliano 	__le16 comp_index;
210401489e5dSAlfredo Cardigliano 	u8     slot;
210501489e5dSAlfredo Cardigliano 	u8     rsvd1[10];
210601489e5dSAlfredo Cardigliano 	u8     color;
210701489e5dSAlfredo Cardigliano };
210801489e5dSAlfredo Cardigliano 
210901489e5dSAlfredo Cardigliano /******************************************************************
211001489e5dSAlfredo Cardigliano  ******************* RDMA Commands ********************************
211101489e5dSAlfredo Cardigliano  ******************************************************************/
211201489e5dSAlfredo Cardigliano 
211301489e5dSAlfredo Cardigliano /**
211401489e5dSAlfredo Cardigliano  * struct ionic_rdma_reset_cmd - Reset RDMA LIF cmd
211501489e5dSAlfredo Cardigliano  * @opcode:        opcode
2116126fe197SAndrew Boyer  * @lif_index:     LIF index
211701489e5dSAlfredo Cardigliano  *
2118126fe197SAndrew Boyer  * There is no RDMA specific dev command completion struct.  Completion uses
211901489e5dSAlfredo Cardigliano  * the common struct ionic_admin_comp.  Only the status is indicated.
2120126fe197SAndrew Boyer  * Nonzero status means the LIF does not support RDMA.
212101489e5dSAlfredo Cardigliano  **/
212201489e5dSAlfredo Cardigliano struct ionic_rdma_reset_cmd {
212301489e5dSAlfredo Cardigliano 	u8     opcode;
212401489e5dSAlfredo Cardigliano 	u8     rsvd;
212501489e5dSAlfredo Cardigliano 	__le16 lif_index;
212601489e5dSAlfredo Cardigliano 	u8     rsvd2[60];
212701489e5dSAlfredo Cardigliano };
212801489e5dSAlfredo Cardigliano 
212901489e5dSAlfredo Cardigliano /**
213001489e5dSAlfredo Cardigliano  * struct ionic_rdma_queue_cmd - Create RDMA Queue command
213101489e5dSAlfredo Cardigliano  * @opcode:        opcode, 52, 53
2132126fe197SAndrew Boyer  * @lif_index:     LIF index
2133126fe197SAndrew Boyer  * @qid_ver:       (qid | (RDMA version << 24))
213401489e5dSAlfredo Cardigliano  * @cid:           intr, eq_id, or cq_id
213501489e5dSAlfredo Cardigliano  * @dbid:          doorbell page id
213601489e5dSAlfredo Cardigliano  * @depth_log2:    log base two of queue depth
213701489e5dSAlfredo Cardigliano  * @stride_log2:   log base two of queue stride
213801489e5dSAlfredo Cardigliano  * @dma_addr:      address of the queue memory
213901489e5dSAlfredo Cardigliano  *
2140126fe197SAndrew Boyer  * The same command struct is used to create an RDMA event queue, completion
2141126fe197SAndrew Boyer  * queue, or RDMA admin queue.  The cid is an interrupt number for an event
214201489e5dSAlfredo Cardigliano  * queue, an event queue id for a completion queue, or a completion queue id
2143126fe197SAndrew Boyer  * for an RDMA admin queue.
214401489e5dSAlfredo Cardigliano  *
214501489e5dSAlfredo Cardigliano  * The queue created via a dev command must be contiguous in dma space.
214601489e5dSAlfredo Cardigliano  *
214701489e5dSAlfredo Cardigliano  * The dev commands are intended only to be used during driver initialization,
2148126fe197SAndrew Boyer  * to create queues supporting the RDMA admin queue.  Other queues, and other
2149126fe197SAndrew Boyer  * types of RDMA resources like memory regions, will be created and registered
2150126fe197SAndrew Boyer  * via the RDMA admin queue, and will support a more complete interface
215101489e5dSAlfredo Cardigliano  * providing scatter gather lists for larger, scattered queue buffers and
215201489e5dSAlfredo Cardigliano  * memory registration.
215301489e5dSAlfredo Cardigliano  *
2154126fe197SAndrew Boyer  * There is no RDMA specific dev command completion struct.  Completion uses
215501489e5dSAlfredo Cardigliano  * the common struct ionic_admin_comp.  Only the status is indicated.
215601489e5dSAlfredo Cardigliano  **/
215701489e5dSAlfredo Cardigliano struct ionic_rdma_queue_cmd {
215801489e5dSAlfredo Cardigliano 	u8     opcode;
215901489e5dSAlfredo Cardigliano 	u8     rsvd;
216001489e5dSAlfredo Cardigliano 	__le16 lif_index;
216101489e5dSAlfredo Cardigliano 	__le32 qid_ver;
216201489e5dSAlfredo Cardigliano 	__le32 cid;
216301489e5dSAlfredo Cardigliano 	__le16 dbid;
216401489e5dSAlfredo Cardigliano 	u8     depth_log2;
216501489e5dSAlfredo Cardigliano 	u8     stride_log2;
216601489e5dSAlfredo Cardigliano 	__le64 dma_addr;
2167126fe197SAndrew Boyer 	u8     rsvd2[40];
216801489e5dSAlfredo Cardigliano };
216901489e5dSAlfredo Cardigliano 
217001489e5dSAlfredo Cardigliano /******************************************************************
217101489e5dSAlfredo Cardigliano  ******************* Notify Events ********************************
217201489e5dSAlfredo Cardigliano  ******************************************************************/
217301489e5dSAlfredo Cardigliano 
217401489e5dSAlfredo Cardigliano /**
2175126fe197SAndrew Boyer  * struct ionic_notifyq_event - Generic event reporting structure
217601489e5dSAlfredo Cardigliano  * @eid:   event number
217701489e5dSAlfredo Cardigliano  * @ecode: event code
217801489e5dSAlfredo Cardigliano  * @data:  unspecified data about the event
217901489e5dSAlfredo Cardigliano  *
218001489e5dSAlfredo Cardigliano  * This is the generic event report struct from which the other
218101489e5dSAlfredo Cardigliano  * actual events will be formed.
218201489e5dSAlfredo Cardigliano  */
218301489e5dSAlfredo Cardigliano struct ionic_notifyq_event {
218401489e5dSAlfredo Cardigliano 	__le64 eid;
218501489e5dSAlfredo Cardigliano 	__le16 ecode;
218601489e5dSAlfredo Cardigliano 	u8     data[54];
218701489e5dSAlfredo Cardigliano };
218801489e5dSAlfredo Cardigliano 
218901489e5dSAlfredo Cardigliano /**
2190126fe197SAndrew Boyer  * struct ionic_link_change_event - Link change event notification
219101489e5dSAlfredo Cardigliano  * @eid:		event number
2192126fe197SAndrew Boyer  * @ecode:		event code = IONIC_EVENT_LINK_CHANGE
2193126fe197SAndrew Boyer  * @link_status:	link up/down, with error bits (enum ionic_port_status)
219401489e5dSAlfredo Cardigliano  * @link_speed:		speed of the network link
219501489e5dSAlfredo Cardigliano  *
219601489e5dSAlfredo Cardigliano  * Sent when the network link state changes between UP and DOWN
219701489e5dSAlfredo Cardigliano  */
219801489e5dSAlfredo Cardigliano struct ionic_link_change_event {
219901489e5dSAlfredo Cardigliano 	__le64 eid;
220001489e5dSAlfredo Cardigliano 	__le16 ecode;
220101489e5dSAlfredo Cardigliano 	__le16 link_status;
220201489e5dSAlfredo Cardigliano 	__le32 link_speed;	/* units of 1Mbps: e.g. 10000 = 10Gbps */
220301489e5dSAlfredo Cardigliano 	u8     rsvd[48];
220401489e5dSAlfredo Cardigliano };
220501489e5dSAlfredo Cardigliano 
220601489e5dSAlfredo Cardigliano /**
2207126fe197SAndrew Boyer  * struct ionic_reset_event - Reset event notification
220801489e5dSAlfredo Cardigliano  * @eid:		event number
2209126fe197SAndrew Boyer  * @ecode:		event code = IONIC_EVENT_RESET
221001489e5dSAlfredo Cardigliano  * @reset_code:		reset type
221101489e5dSAlfredo Cardigliano  * @state:		0=pending, 1=complete, 2=error
221201489e5dSAlfredo Cardigliano  *
221301489e5dSAlfredo Cardigliano  * Sent when the NIC or some subsystem is going to be or
221401489e5dSAlfredo Cardigliano  * has been reset.
221501489e5dSAlfredo Cardigliano  */
221601489e5dSAlfredo Cardigliano struct ionic_reset_event {
221701489e5dSAlfredo Cardigliano 	__le64 eid;
221801489e5dSAlfredo Cardigliano 	__le16 ecode;
221901489e5dSAlfredo Cardigliano 	u8     reset_code;
222001489e5dSAlfredo Cardigliano 	u8     state;
222101489e5dSAlfredo Cardigliano 	u8     rsvd[52];
222201489e5dSAlfredo Cardigliano };
222301489e5dSAlfredo Cardigliano 
222401489e5dSAlfredo Cardigliano /**
2225126fe197SAndrew Boyer  * struct ionic_heartbeat_event - Sent periodically by NIC to indicate health
222601489e5dSAlfredo Cardigliano  * @eid:	event number
2227126fe197SAndrew Boyer  * @ecode:	event code = IONIC_EVENT_HEARTBEAT
222801489e5dSAlfredo Cardigliano  */
222901489e5dSAlfredo Cardigliano struct ionic_heartbeat_event {
223001489e5dSAlfredo Cardigliano 	__le64 eid;
223101489e5dSAlfredo Cardigliano 	__le16 ecode;
223201489e5dSAlfredo Cardigliano 	u8     rsvd[54];
223301489e5dSAlfredo Cardigliano };
223401489e5dSAlfredo Cardigliano 
223501489e5dSAlfredo Cardigliano /**
2236126fe197SAndrew Boyer  * struct ionic_log_event - Sent to notify the driver of an internal error
223701489e5dSAlfredo Cardigliano  * @eid:	event number
2238126fe197SAndrew Boyer  * @ecode:	event code = IONIC_EVENT_LOG
223901489e5dSAlfredo Cardigliano  * @data:	log data
224001489e5dSAlfredo Cardigliano  */
224101489e5dSAlfredo Cardigliano struct ionic_log_event {
224201489e5dSAlfredo Cardigliano 	__le64 eid;
224301489e5dSAlfredo Cardigliano 	__le16 ecode;
224401489e5dSAlfredo Cardigliano 	u8     data[54];
224501489e5dSAlfredo Cardigliano };
224601489e5dSAlfredo Cardigliano 
224701489e5dSAlfredo Cardigliano /**
2248126fe197SAndrew Boyer  * struct ionic_xcvr_event - Transceiver change event
2249126fe197SAndrew Boyer  * @eid:	event number
2250126fe197SAndrew Boyer  * @ecode:	event code = IONIC_EVENT_XCVR
2251126fe197SAndrew Boyer  */
2252126fe197SAndrew Boyer struct ionic_xcvr_event {
2253126fe197SAndrew Boyer 	__le64 eid;
2254126fe197SAndrew Boyer 	__le16 ecode;
2255126fe197SAndrew Boyer 	u8     rsvd[54];
2256126fe197SAndrew Boyer };
2257126fe197SAndrew Boyer 
2258126fe197SAndrew Boyer /**
2259126fe197SAndrew Boyer  * struct ionic_port_stats - Port statistics structure
226001489e5dSAlfredo Cardigliano  */
226101489e5dSAlfredo Cardigliano struct ionic_port_stats {
226201489e5dSAlfredo Cardigliano 	__le64 frames_rx_ok;
226301489e5dSAlfredo Cardigliano 	__le64 frames_rx_all;
226401489e5dSAlfredo Cardigliano 	__le64 frames_rx_bad_fcs;
226501489e5dSAlfredo Cardigliano 	__le64 frames_rx_bad_all;
226601489e5dSAlfredo Cardigliano 	__le64 octets_rx_ok;
226701489e5dSAlfredo Cardigliano 	__le64 octets_rx_all;
226801489e5dSAlfredo Cardigliano 	__le64 frames_rx_unicast;
226901489e5dSAlfredo Cardigliano 	__le64 frames_rx_multicast;
227001489e5dSAlfredo Cardigliano 	__le64 frames_rx_broadcast;
227101489e5dSAlfredo Cardigliano 	__le64 frames_rx_pause;
227201489e5dSAlfredo Cardigliano 	__le64 frames_rx_bad_length;
227301489e5dSAlfredo Cardigliano 	__le64 frames_rx_undersized;
227401489e5dSAlfredo Cardigliano 	__le64 frames_rx_oversized;
227501489e5dSAlfredo Cardigliano 	__le64 frames_rx_fragments;
227601489e5dSAlfredo Cardigliano 	__le64 frames_rx_jabber;
227701489e5dSAlfredo Cardigliano 	__le64 frames_rx_pripause;
227801489e5dSAlfredo Cardigliano 	__le64 frames_rx_stomped_crc;
227901489e5dSAlfredo Cardigliano 	__le64 frames_rx_too_long;
228001489e5dSAlfredo Cardigliano 	__le64 frames_rx_vlan_good;
228101489e5dSAlfredo Cardigliano 	__le64 frames_rx_dropped;
228201489e5dSAlfredo Cardigliano 	__le64 frames_rx_less_than_64b;
228301489e5dSAlfredo Cardigliano 	__le64 frames_rx_64b;
228401489e5dSAlfredo Cardigliano 	__le64 frames_rx_65b_127b;
228501489e5dSAlfredo Cardigliano 	__le64 frames_rx_128b_255b;
228601489e5dSAlfredo Cardigliano 	__le64 frames_rx_256b_511b;
228701489e5dSAlfredo Cardigliano 	__le64 frames_rx_512b_1023b;
228801489e5dSAlfredo Cardigliano 	__le64 frames_rx_1024b_1518b;
228901489e5dSAlfredo Cardigliano 	__le64 frames_rx_1519b_2047b;
229001489e5dSAlfredo Cardigliano 	__le64 frames_rx_2048b_4095b;
229101489e5dSAlfredo Cardigliano 	__le64 frames_rx_4096b_8191b;
229201489e5dSAlfredo Cardigliano 	__le64 frames_rx_8192b_9215b;
229301489e5dSAlfredo Cardigliano 	__le64 frames_rx_other;
229401489e5dSAlfredo Cardigliano 	__le64 frames_tx_ok;
229501489e5dSAlfredo Cardigliano 	__le64 frames_tx_all;
229601489e5dSAlfredo Cardigliano 	__le64 frames_tx_bad;
229701489e5dSAlfredo Cardigliano 	__le64 octets_tx_ok;
229801489e5dSAlfredo Cardigliano 	__le64 octets_tx_total;
229901489e5dSAlfredo Cardigliano 	__le64 frames_tx_unicast;
230001489e5dSAlfredo Cardigliano 	__le64 frames_tx_multicast;
230101489e5dSAlfredo Cardigliano 	__le64 frames_tx_broadcast;
230201489e5dSAlfredo Cardigliano 	__le64 frames_tx_pause;
230301489e5dSAlfredo Cardigliano 	__le64 frames_tx_pripause;
230401489e5dSAlfredo Cardigliano 	__le64 frames_tx_vlan;
230501489e5dSAlfredo Cardigliano 	__le64 frames_tx_less_than_64b;
230601489e5dSAlfredo Cardigliano 	__le64 frames_tx_64b;
230701489e5dSAlfredo Cardigliano 	__le64 frames_tx_65b_127b;
230801489e5dSAlfredo Cardigliano 	__le64 frames_tx_128b_255b;
230901489e5dSAlfredo Cardigliano 	__le64 frames_tx_256b_511b;
231001489e5dSAlfredo Cardigliano 	__le64 frames_tx_512b_1023b;
231101489e5dSAlfredo Cardigliano 	__le64 frames_tx_1024b_1518b;
231201489e5dSAlfredo Cardigliano 	__le64 frames_tx_1519b_2047b;
231301489e5dSAlfredo Cardigliano 	__le64 frames_tx_2048b_4095b;
231401489e5dSAlfredo Cardigliano 	__le64 frames_tx_4096b_8191b;
231501489e5dSAlfredo Cardigliano 	__le64 frames_tx_8192b_9215b;
231601489e5dSAlfredo Cardigliano 	__le64 frames_tx_other;
231701489e5dSAlfredo Cardigliano 	__le64 frames_tx_pri_0;
231801489e5dSAlfredo Cardigliano 	__le64 frames_tx_pri_1;
231901489e5dSAlfredo Cardigliano 	__le64 frames_tx_pri_2;
232001489e5dSAlfredo Cardigliano 	__le64 frames_tx_pri_3;
232101489e5dSAlfredo Cardigliano 	__le64 frames_tx_pri_4;
232201489e5dSAlfredo Cardigliano 	__le64 frames_tx_pri_5;
232301489e5dSAlfredo Cardigliano 	__le64 frames_tx_pri_6;
232401489e5dSAlfredo Cardigliano 	__le64 frames_tx_pri_7;
232501489e5dSAlfredo Cardigliano 	__le64 frames_rx_pri_0;
232601489e5dSAlfredo Cardigliano 	__le64 frames_rx_pri_1;
232701489e5dSAlfredo Cardigliano 	__le64 frames_rx_pri_2;
232801489e5dSAlfredo Cardigliano 	__le64 frames_rx_pri_3;
232901489e5dSAlfredo Cardigliano 	__le64 frames_rx_pri_4;
233001489e5dSAlfredo Cardigliano 	__le64 frames_rx_pri_5;
233101489e5dSAlfredo Cardigliano 	__le64 frames_rx_pri_6;
233201489e5dSAlfredo Cardigliano 	__le64 frames_rx_pri_7;
233301489e5dSAlfredo Cardigliano 	__le64 tx_pripause_0_1us_count;
233401489e5dSAlfredo Cardigliano 	__le64 tx_pripause_1_1us_count;
233501489e5dSAlfredo Cardigliano 	__le64 tx_pripause_2_1us_count;
233601489e5dSAlfredo Cardigliano 	__le64 tx_pripause_3_1us_count;
233701489e5dSAlfredo Cardigliano 	__le64 tx_pripause_4_1us_count;
233801489e5dSAlfredo Cardigliano 	__le64 tx_pripause_5_1us_count;
233901489e5dSAlfredo Cardigliano 	__le64 tx_pripause_6_1us_count;
234001489e5dSAlfredo Cardigliano 	__le64 tx_pripause_7_1us_count;
234101489e5dSAlfredo Cardigliano 	__le64 rx_pripause_0_1us_count;
234201489e5dSAlfredo Cardigliano 	__le64 rx_pripause_1_1us_count;
234301489e5dSAlfredo Cardigliano 	__le64 rx_pripause_2_1us_count;
234401489e5dSAlfredo Cardigliano 	__le64 rx_pripause_3_1us_count;
234501489e5dSAlfredo Cardigliano 	__le64 rx_pripause_4_1us_count;
234601489e5dSAlfredo Cardigliano 	__le64 rx_pripause_5_1us_count;
234701489e5dSAlfredo Cardigliano 	__le64 rx_pripause_6_1us_count;
234801489e5dSAlfredo Cardigliano 	__le64 rx_pripause_7_1us_count;
234901489e5dSAlfredo Cardigliano 	__le64 rx_pause_1us_count;
235001489e5dSAlfredo Cardigliano 	__le64 frames_tx_truncated;
235101489e5dSAlfredo Cardigliano };
235201489e5dSAlfredo Cardigliano 
235301489e5dSAlfredo Cardigliano struct ionic_mgmt_port_stats {
235401489e5dSAlfredo Cardigliano 	__le64 frames_rx_ok;
235501489e5dSAlfredo Cardigliano 	__le64 frames_rx_all;
235601489e5dSAlfredo Cardigliano 	__le64 frames_rx_bad_fcs;
235701489e5dSAlfredo Cardigliano 	__le64 frames_rx_bad_all;
235801489e5dSAlfredo Cardigliano 	__le64 octets_rx_ok;
235901489e5dSAlfredo Cardigliano 	__le64 octets_rx_all;
236001489e5dSAlfredo Cardigliano 	__le64 frames_rx_unicast;
236101489e5dSAlfredo Cardigliano 	__le64 frames_rx_multicast;
236201489e5dSAlfredo Cardigliano 	__le64 frames_rx_broadcast;
236301489e5dSAlfredo Cardigliano 	__le64 frames_rx_pause;
2364126fe197SAndrew Boyer 	__le64 frames_rx_bad_length;
2365126fe197SAndrew Boyer 	__le64 frames_rx_undersized;
2366126fe197SAndrew Boyer 	__le64 frames_rx_oversized;
2367126fe197SAndrew Boyer 	__le64 frames_rx_fragments;
2368126fe197SAndrew Boyer 	__le64 frames_rx_jabber;
2369126fe197SAndrew Boyer 	__le64 frames_rx_64b;
2370126fe197SAndrew Boyer 	__le64 frames_rx_65b_127b;
2371126fe197SAndrew Boyer 	__le64 frames_rx_128b_255b;
2372126fe197SAndrew Boyer 	__le64 frames_rx_256b_511b;
2373126fe197SAndrew Boyer 	__le64 frames_rx_512b_1023b;
2374126fe197SAndrew Boyer 	__le64 frames_rx_1024b_1518b;
2375126fe197SAndrew Boyer 	__le64 frames_rx_gt_1518b;
2376126fe197SAndrew Boyer 	__le64 frames_rx_fifo_full;
2377126fe197SAndrew Boyer 	__le64 frames_tx_ok;
2378126fe197SAndrew Boyer 	__le64 frames_tx_all;
2379126fe197SAndrew Boyer 	__le64 frames_tx_bad;
2380126fe197SAndrew Boyer 	__le64 octets_tx_ok;
2381126fe197SAndrew Boyer 	__le64 octets_tx_total;
2382126fe197SAndrew Boyer 	__le64 frames_tx_unicast;
2383126fe197SAndrew Boyer 	__le64 frames_tx_multicast;
2384126fe197SAndrew Boyer 	__le64 frames_tx_broadcast;
2385126fe197SAndrew Boyer 	__le64 frames_tx_pause;
2386126fe197SAndrew Boyer };
2387126fe197SAndrew Boyer 
2388126fe197SAndrew Boyer enum ionic_pb_buffer_drop_stats {
2389126fe197SAndrew Boyer 	IONIC_BUFFER_INTRINSIC_DROP = 0,
2390126fe197SAndrew Boyer 	IONIC_BUFFER_DISCARDED,
2391126fe197SAndrew Boyer 	IONIC_BUFFER_ADMITTED,
2392126fe197SAndrew Boyer 	IONIC_BUFFER_OUT_OF_CELLS_DROP,
2393126fe197SAndrew Boyer 	IONIC_BUFFER_OUT_OF_CELLS_DROP_2,
2394126fe197SAndrew Boyer 	IONIC_BUFFER_OUT_OF_CREDIT_DROP,
2395126fe197SAndrew Boyer 	IONIC_BUFFER_TRUNCATION_DROP,
2396126fe197SAndrew Boyer 	IONIC_BUFFER_PORT_DISABLED_DROP,
2397126fe197SAndrew Boyer 	IONIC_BUFFER_COPY_TO_CPU_TAIL_DROP,
2398126fe197SAndrew Boyer 	IONIC_BUFFER_SPAN_TAIL_DROP,
2399126fe197SAndrew Boyer 	IONIC_BUFFER_MIN_SIZE_VIOLATION_DROP,
2400126fe197SAndrew Boyer 	IONIC_BUFFER_ENQUEUE_ERROR_DROP,
2401126fe197SAndrew Boyer 	IONIC_BUFFER_INVALID_PORT_DROP,
2402126fe197SAndrew Boyer 	IONIC_BUFFER_INVALID_OUTPUT_QUEUE_DROP,
2403126fe197SAndrew Boyer 	IONIC_BUFFER_DROP_MAX,
2404126fe197SAndrew Boyer };
2405126fe197SAndrew Boyer 
2406126fe197SAndrew Boyer enum ionic_oflow_drop_stats {
2407126fe197SAndrew Boyer 	IONIC_OFLOW_OCCUPANCY_DROP,
2408126fe197SAndrew Boyer 	IONIC_OFLOW_EMERGENCY_STOP_DROP,
2409126fe197SAndrew Boyer 	IONIC_OFLOW_WRITE_BUFFER_ACK_FILL_UP_DROP,
2410126fe197SAndrew Boyer 	IONIC_OFLOW_WRITE_BUFFER_ACK_FULL_DROP,
2411126fe197SAndrew Boyer 	IONIC_OFLOW_WRITE_BUFFER_FULL_DROP,
2412126fe197SAndrew Boyer 	IONIC_OFLOW_CONTROL_FIFO_FULL_DROP,
2413126fe197SAndrew Boyer 	IONIC_OFLOW_DROP_MAX,
2414126fe197SAndrew Boyer };
2415126fe197SAndrew Boyer 
2416126fe197SAndrew Boyer /**
2417126fe197SAndrew Boyer  * struct port_pb_stats - packet buffers system stats
2418126fe197SAndrew Boyer  * uses ionic_pb_buffer_drop_stats for drop_counts[]
2419126fe197SAndrew Boyer  */
2420126fe197SAndrew Boyer struct ionic_port_pb_stats {
2421126fe197SAndrew Boyer 	__le64 sop_count_in;
2422126fe197SAndrew Boyer 	__le64 eop_count_in;
2423126fe197SAndrew Boyer 	__le64 sop_count_out;
2424126fe197SAndrew Boyer 	__le64 eop_count_out;
2425126fe197SAndrew Boyer 	__le64 drop_counts[IONIC_BUFFER_DROP_MAX];
2426126fe197SAndrew Boyer 	__le64 input_queue_buffer_occupancy[IONIC_QOS_TC_MAX];
2427126fe197SAndrew Boyer 	__le64 input_queue_port_monitor[IONIC_QOS_TC_MAX];
2428126fe197SAndrew Boyer 	__le64 output_queue_port_monitor[IONIC_QOS_TC_MAX];
2429126fe197SAndrew Boyer 	__le64 oflow_drop_counts[IONIC_OFLOW_DROP_MAX];
2430126fe197SAndrew Boyer 	__le64 input_queue_good_pkts_in[IONIC_QOS_TC_MAX];
2431126fe197SAndrew Boyer 	__le64 input_queue_good_pkts_out[IONIC_QOS_TC_MAX];
2432126fe197SAndrew Boyer 	__le64 input_queue_err_pkts_in[IONIC_QOS_TC_MAX];
2433126fe197SAndrew Boyer 	__le64 input_queue_fifo_depth[IONIC_QOS_TC_MAX];
2434126fe197SAndrew Boyer 	__le64 input_queue_max_fifo_depth[IONIC_QOS_TC_MAX];
2435126fe197SAndrew Boyer 	__le64 input_queue_peak_occupancy[IONIC_QOS_TC_MAX];
2436126fe197SAndrew Boyer 	__le64 output_queue_buffer_occupancy[IONIC_QOS_TC_MAX];
2437126fe197SAndrew Boyer };
2438126fe197SAndrew Boyer 
2439126fe197SAndrew Boyer /**
2440126fe197SAndrew Boyer  * enum ionic_port_type - Port types
2441126fe197SAndrew Boyer  * @IONIC_ETH_UNKNOWN:             Port type not configured
2442126fe197SAndrew Boyer  * @IONIC_ETH_HOST:                Port carries ethernet traffic (inband)
2443126fe197SAndrew Boyer  * @IONIC_ETH_HOST_MGMT:           Port carries mgmt traffic (out-of-band)
2444126fe197SAndrew Boyer  * @IONIC_ETH_MNIC_OOB_MGMT:
2445126fe197SAndrew Boyer  * @IONIC_ETH_MNIC_INTERNAL_MGMT:
2446126fe197SAndrew Boyer  * @IONIC_ETH_MNIC_INBAND_MGMT:
2447126fe197SAndrew Boyer  * @IONIC_ETH_MNIC_CPU:
2448126fe197SAndrew Boyer  * @IONIC_ETH_MNIC_LEARN:
2449126fe197SAndrew Boyer  * @IONIC_ETH_MNIC_CONTROL:
2450126fe197SAndrew Boyer  */
2451126fe197SAndrew Boyer enum ionic_port_type {
2452126fe197SAndrew Boyer 	IONIC_ETH_UNKNOWN,
2453126fe197SAndrew Boyer 	IONIC_ETH_HOST,
2454126fe197SAndrew Boyer 	IONIC_ETH_HOST_MGMT,
2455126fe197SAndrew Boyer 	IONIC_ETH_MNIC_OOB_MGMT,
2456126fe197SAndrew Boyer 	IONIC_ETH_MNIC_INTERNAL_MGMT,
2457126fe197SAndrew Boyer 	IONIC_ETH_MNIC_INBAND_MGMT,
2458126fe197SAndrew Boyer 	IONIC_ETH_MNIC_CPU,
2459126fe197SAndrew Boyer 	IONIC_ETH_MNIC_LEARN,
2460126fe197SAndrew Boyer 	IONIC_ETH_MNIC_CONTROL,
246101489e5dSAlfredo Cardigliano };
246201489e5dSAlfredo Cardigliano 
246301489e5dSAlfredo Cardigliano /**
246401489e5dSAlfredo Cardigliano  * struct ionic_port_identity - port identity structure
246501489e5dSAlfredo Cardigliano  * @version:        identity structure version
2466126fe197SAndrew Boyer  * @type:           type of port (enum ionic_port_type)
246701489e5dSAlfredo Cardigliano  * @num_lanes:      number of lanes for the port
246801489e5dSAlfredo Cardigliano  * @autoneg:        autoneg supported
246901489e5dSAlfredo Cardigliano  * @min_frame_size: minimum frame size supported
247001489e5dSAlfredo Cardigliano  * @max_frame_size: maximum frame size supported
247101489e5dSAlfredo Cardigliano  * @fec_type:       supported fec types
247201489e5dSAlfredo Cardigliano  * @pause_type:     supported pause types
247301489e5dSAlfredo Cardigliano  * @loopback_mode:  supported loopback mode
247401489e5dSAlfredo Cardigliano  * @speeds:         supported speeds
247501489e5dSAlfredo Cardigliano  * @config:         current port configuration
247601489e5dSAlfredo Cardigliano  */
247701489e5dSAlfredo Cardigliano union ionic_port_identity {
247801489e5dSAlfredo Cardigliano 	struct {
247901489e5dSAlfredo Cardigliano 		u8     version;
248001489e5dSAlfredo Cardigliano 		u8     type;
248101489e5dSAlfredo Cardigliano 		u8     num_lanes;
248201489e5dSAlfredo Cardigliano 		u8     autoneg;
248301489e5dSAlfredo Cardigliano 		__le32 min_frame_size;
248401489e5dSAlfredo Cardigliano 		__le32 max_frame_size;
248501489e5dSAlfredo Cardigliano 		u8     fec_type[4];
248601489e5dSAlfredo Cardigliano 		u8     pause_type[2];
248701489e5dSAlfredo Cardigliano 		u8     loopback_mode[2];
248801489e5dSAlfredo Cardigliano 		__le32 speeds[16];
248901489e5dSAlfredo Cardigliano 		u8     rsvd2[44];
249001489e5dSAlfredo Cardigliano 		union ionic_port_config config;
249101489e5dSAlfredo Cardigliano 	};
2492126fe197SAndrew Boyer 	__le32 words[478];
249301489e5dSAlfredo Cardigliano };
249401489e5dSAlfredo Cardigliano 
249501489e5dSAlfredo Cardigliano /**
249601489e5dSAlfredo Cardigliano  * struct ionic_port_info - port info structure
2497126fe197SAndrew Boyer  * @config:          Port configuration data
2498126fe197SAndrew Boyer  * @status:          Port status data
2499126fe197SAndrew Boyer  * @stats:           Port statistics data
2500126fe197SAndrew Boyer  * @mgmt_stats:      Port management statistics data
2501126fe197SAndrew Boyer  * @port_pb_drop_stats:   uplink pb drop stats
250201489e5dSAlfredo Cardigliano  */
250301489e5dSAlfredo Cardigliano struct ionic_port_info {
250401489e5dSAlfredo Cardigliano 	union ionic_port_config config;
250501489e5dSAlfredo Cardigliano 	struct ionic_port_status status;
2506126fe197SAndrew Boyer 	union {
250701489e5dSAlfredo Cardigliano 		struct ionic_port_stats      stats;
2508126fe197SAndrew Boyer 		struct ionic_mgmt_port_stats mgmt_stats;
2509126fe197SAndrew Boyer 	};
2510126fe197SAndrew Boyer 	/* room for pb_stats to start at 2k offset */
2511126fe197SAndrew Boyer 	u8                          rsvd[760];
2512126fe197SAndrew Boyer 	struct ionic_port_pb_stats  pb_stats;
251301489e5dSAlfredo Cardigliano };
251401489e5dSAlfredo Cardigliano 
251501489e5dSAlfredo Cardigliano /**
2516126fe197SAndrew Boyer  * struct ionic_lif_stats - LIF statistics structure
251701489e5dSAlfredo Cardigliano  */
251801489e5dSAlfredo Cardigliano struct ionic_lif_stats {
251901489e5dSAlfredo Cardigliano 	/* RX */
252001489e5dSAlfredo Cardigliano 	__le64 rx_ucast_bytes;
252101489e5dSAlfredo Cardigliano 	__le64 rx_ucast_packets;
252201489e5dSAlfredo Cardigliano 	__le64 rx_mcast_bytes;
252301489e5dSAlfredo Cardigliano 	__le64 rx_mcast_packets;
252401489e5dSAlfredo Cardigliano 	__le64 rx_bcast_bytes;
252501489e5dSAlfredo Cardigliano 	__le64 rx_bcast_packets;
252601489e5dSAlfredo Cardigliano 	__le64 rsvd0;
252701489e5dSAlfredo Cardigliano 	__le64 rsvd1;
252801489e5dSAlfredo Cardigliano 	/* RX drops */
252901489e5dSAlfredo Cardigliano 	__le64 rx_ucast_drop_bytes;
253001489e5dSAlfredo Cardigliano 	__le64 rx_ucast_drop_packets;
253101489e5dSAlfredo Cardigliano 	__le64 rx_mcast_drop_bytes;
253201489e5dSAlfredo Cardigliano 	__le64 rx_mcast_drop_packets;
253301489e5dSAlfredo Cardigliano 	__le64 rx_bcast_drop_bytes;
253401489e5dSAlfredo Cardigliano 	__le64 rx_bcast_drop_packets;
253501489e5dSAlfredo Cardigliano 	__le64 rx_dma_error;
253601489e5dSAlfredo Cardigliano 	__le64 rsvd2;
253701489e5dSAlfredo Cardigliano 	/* TX */
253801489e5dSAlfredo Cardigliano 	__le64 tx_ucast_bytes;
253901489e5dSAlfredo Cardigliano 	__le64 tx_ucast_packets;
254001489e5dSAlfredo Cardigliano 	__le64 tx_mcast_bytes;
254101489e5dSAlfredo Cardigliano 	__le64 tx_mcast_packets;
254201489e5dSAlfredo Cardigliano 	__le64 tx_bcast_bytes;
254301489e5dSAlfredo Cardigliano 	__le64 tx_bcast_packets;
254401489e5dSAlfredo Cardigliano 	__le64 rsvd3;
254501489e5dSAlfredo Cardigliano 	__le64 rsvd4;
254601489e5dSAlfredo Cardigliano 	/* TX drops */
254701489e5dSAlfredo Cardigliano 	__le64 tx_ucast_drop_bytes;
254801489e5dSAlfredo Cardigliano 	__le64 tx_ucast_drop_packets;
254901489e5dSAlfredo Cardigliano 	__le64 tx_mcast_drop_bytes;
255001489e5dSAlfredo Cardigliano 	__le64 tx_mcast_drop_packets;
255101489e5dSAlfredo Cardigliano 	__le64 tx_bcast_drop_bytes;
255201489e5dSAlfredo Cardigliano 	__le64 tx_bcast_drop_packets;
255301489e5dSAlfredo Cardigliano 	__le64 tx_dma_error;
255401489e5dSAlfredo Cardigliano 	__le64 rsvd5;
255501489e5dSAlfredo Cardigliano 	/* Rx Queue/Ring drops */
255601489e5dSAlfredo Cardigliano 	__le64 rx_queue_disabled;
255701489e5dSAlfredo Cardigliano 	__le64 rx_queue_empty;
255801489e5dSAlfredo Cardigliano 	__le64 rx_queue_error;
255901489e5dSAlfredo Cardigliano 	__le64 rx_desc_fetch_error;
256001489e5dSAlfredo Cardigliano 	__le64 rx_desc_data_error;
256101489e5dSAlfredo Cardigliano 	__le64 rsvd6;
256201489e5dSAlfredo Cardigliano 	__le64 rsvd7;
256301489e5dSAlfredo Cardigliano 	__le64 rsvd8;
256401489e5dSAlfredo Cardigliano 	/* Tx Queue/Ring drops */
256501489e5dSAlfredo Cardigliano 	__le64 tx_queue_disabled;
256601489e5dSAlfredo Cardigliano 	__le64 tx_queue_error;
256701489e5dSAlfredo Cardigliano 	__le64 tx_desc_fetch_error;
256801489e5dSAlfredo Cardigliano 	__le64 tx_desc_data_error;
2569126fe197SAndrew Boyer 	__le64 tx_queue_empty;
257001489e5dSAlfredo Cardigliano 	__le64 rsvd10;
257101489e5dSAlfredo Cardigliano 	__le64 rsvd11;
257201489e5dSAlfredo Cardigliano 	__le64 rsvd12;
257301489e5dSAlfredo Cardigliano 
257401489e5dSAlfredo Cardigliano 	/* RDMA/ROCE TX */
257501489e5dSAlfredo Cardigliano 	__le64 tx_rdma_ucast_bytes;
257601489e5dSAlfredo Cardigliano 	__le64 tx_rdma_ucast_packets;
257701489e5dSAlfredo Cardigliano 	__le64 tx_rdma_mcast_bytes;
257801489e5dSAlfredo Cardigliano 	__le64 tx_rdma_mcast_packets;
257901489e5dSAlfredo Cardigliano 	__le64 tx_rdma_cnp_packets;
258001489e5dSAlfredo Cardigliano 	__le64 rsvd13;
258101489e5dSAlfredo Cardigliano 	__le64 rsvd14;
258201489e5dSAlfredo Cardigliano 	__le64 rsvd15;
258301489e5dSAlfredo Cardigliano 
258401489e5dSAlfredo Cardigliano 	/* RDMA/ROCE RX */
258501489e5dSAlfredo Cardigliano 	__le64 rx_rdma_ucast_bytes;
258601489e5dSAlfredo Cardigliano 	__le64 rx_rdma_ucast_packets;
258701489e5dSAlfredo Cardigliano 	__le64 rx_rdma_mcast_bytes;
258801489e5dSAlfredo Cardigliano 	__le64 rx_rdma_mcast_packets;
258901489e5dSAlfredo Cardigliano 	__le64 rx_rdma_cnp_packets;
259001489e5dSAlfredo Cardigliano 	__le64 rx_rdma_ecn_packets;
259101489e5dSAlfredo Cardigliano 	__le64 rsvd16;
259201489e5dSAlfredo Cardigliano 	__le64 rsvd17;
259301489e5dSAlfredo Cardigliano 
259401489e5dSAlfredo Cardigliano 	__le64 rsvd18;
259501489e5dSAlfredo Cardigliano 	__le64 rsvd19;
259601489e5dSAlfredo Cardigliano 	__le64 rsvd20;
259701489e5dSAlfredo Cardigliano 	__le64 rsvd21;
259801489e5dSAlfredo Cardigliano 	__le64 rsvd22;
259901489e5dSAlfredo Cardigliano 	__le64 rsvd23;
260001489e5dSAlfredo Cardigliano 	__le64 rsvd24;
260101489e5dSAlfredo Cardigliano 	__le64 rsvd25;
260201489e5dSAlfredo Cardigliano 
260301489e5dSAlfredo Cardigliano 	__le64 rsvd26;
260401489e5dSAlfredo Cardigliano 	__le64 rsvd27;
260501489e5dSAlfredo Cardigliano 	__le64 rsvd28;
260601489e5dSAlfredo Cardigliano 	__le64 rsvd29;
260701489e5dSAlfredo Cardigliano 	__le64 rsvd30;
260801489e5dSAlfredo Cardigliano 	__le64 rsvd31;
260901489e5dSAlfredo Cardigliano 	__le64 rsvd32;
261001489e5dSAlfredo Cardigliano 	__le64 rsvd33;
261101489e5dSAlfredo Cardigliano 
261201489e5dSAlfredo Cardigliano 	__le64 rsvd34;
261301489e5dSAlfredo Cardigliano 	__le64 rsvd35;
261401489e5dSAlfredo Cardigliano 	__le64 rsvd36;
261501489e5dSAlfredo Cardigliano 	__le64 rsvd37;
261601489e5dSAlfredo Cardigliano 	__le64 rsvd38;
261701489e5dSAlfredo Cardigliano 	__le64 rsvd39;
261801489e5dSAlfredo Cardigliano 	__le64 rsvd40;
261901489e5dSAlfredo Cardigliano 	__le64 rsvd41;
262001489e5dSAlfredo Cardigliano 
262101489e5dSAlfredo Cardigliano 	__le64 rsvd42;
262201489e5dSAlfredo Cardigliano 	__le64 rsvd43;
262301489e5dSAlfredo Cardigliano 	__le64 rsvd44;
262401489e5dSAlfredo Cardigliano 	__le64 rsvd45;
262501489e5dSAlfredo Cardigliano 	__le64 rsvd46;
262601489e5dSAlfredo Cardigliano 	__le64 rsvd47;
262701489e5dSAlfredo Cardigliano 	__le64 rsvd48;
262801489e5dSAlfredo Cardigliano 	__le64 rsvd49;
262901489e5dSAlfredo Cardigliano 
263001489e5dSAlfredo Cardigliano 	/* RDMA/ROCE REQ Error/Debugs (768 - 895) */
263101489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_pkt_seq_err;
263201489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_rnr_retry_err;
263301489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_remote_access_err;
263401489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_remote_inv_req_err;
263501489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_remote_oper_err;
263601489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_implied_nak_seq_err;
263701489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_cqe_err;
263801489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_cqe_flush_err;
263901489e5dSAlfredo Cardigliano 
264001489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_dup_responses;
264101489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_invalid_packets;
264201489e5dSAlfredo Cardigliano 	__le64 rdma_req_tx_local_access_err;
264301489e5dSAlfredo Cardigliano 	__le64 rdma_req_tx_local_oper_err;
264401489e5dSAlfredo Cardigliano 	__le64 rdma_req_tx_memory_mgmt_err;
264501489e5dSAlfredo Cardigliano 	__le64 rsvd52;
264601489e5dSAlfredo Cardigliano 	__le64 rsvd53;
264701489e5dSAlfredo Cardigliano 	__le64 rsvd54;
264801489e5dSAlfredo Cardigliano 
264901489e5dSAlfredo Cardigliano 	/* RDMA/ROCE RESP Error/Debugs (896 - 1023) */
265001489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_dup_requests;
265101489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_out_of_buffer;
265201489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_out_of_seq_pkts;
265301489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_cqe_err;
265401489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_cqe_flush_err;
265501489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_local_len_err;
265601489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_inv_request_err;
265701489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_local_qp_oper_err;
265801489e5dSAlfredo Cardigliano 
265901489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_out_of_atomic_resource;
266001489e5dSAlfredo Cardigliano 	__le64 rdma_resp_tx_pkt_seq_err;
266101489e5dSAlfredo Cardigliano 	__le64 rdma_resp_tx_remote_inv_req_err;
266201489e5dSAlfredo Cardigliano 	__le64 rdma_resp_tx_remote_access_err;
266301489e5dSAlfredo Cardigliano 	__le64 rdma_resp_tx_remote_oper_err;
266401489e5dSAlfredo Cardigliano 	__le64 rdma_resp_tx_rnr_retry_err;
266501489e5dSAlfredo Cardigliano 	__le64 rsvd57;
266601489e5dSAlfredo Cardigliano 	__le64 rsvd58;
266701489e5dSAlfredo Cardigliano };
266801489e5dSAlfredo Cardigliano 
266901489e5dSAlfredo Cardigliano /**
2670126fe197SAndrew Boyer  * struct ionic_lif_info - LIF info structure
2671126fe197SAndrew Boyer  * @config:	LIF configuration structure
2672126fe197SAndrew Boyer  * @status:	LIF status structure
2673126fe197SAndrew Boyer  * @stats:	LIF statistics structure
267401489e5dSAlfredo Cardigliano  */
267501489e5dSAlfredo Cardigliano struct ionic_lif_info {
267601489e5dSAlfredo Cardigliano 	union ionic_lif_config config;
267701489e5dSAlfredo Cardigliano 	struct ionic_lif_status status;
267801489e5dSAlfredo Cardigliano 	struct ionic_lif_stats stats;
267901489e5dSAlfredo Cardigliano };
268001489e5dSAlfredo Cardigliano 
268101489e5dSAlfredo Cardigliano union ionic_dev_cmd {
268201489e5dSAlfredo Cardigliano 	u32 words[16];
268301489e5dSAlfredo Cardigliano 	struct ionic_admin_cmd cmd;
268401489e5dSAlfredo Cardigliano 	struct ionic_nop_cmd nop;
268501489e5dSAlfredo Cardigliano 
268601489e5dSAlfredo Cardigliano 	struct ionic_dev_identify_cmd identify;
268701489e5dSAlfredo Cardigliano 	struct ionic_dev_init_cmd init;
268801489e5dSAlfredo Cardigliano 	struct ionic_dev_reset_cmd reset;
268901489e5dSAlfredo Cardigliano 	struct ionic_dev_getattr_cmd getattr;
269001489e5dSAlfredo Cardigliano 	struct ionic_dev_setattr_cmd setattr;
269101489e5dSAlfredo Cardigliano 
269201489e5dSAlfredo Cardigliano 	struct ionic_port_identify_cmd port_identify;
269301489e5dSAlfredo Cardigliano 	struct ionic_port_init_cmd port_init;
269401489e5dSAlfredo Cardigliano 	struct ionic_port_reset_cmd port_reset;
269501489e5dSAlfredo Cardigliano 	struct ionic_port_getattr_cmd port_getattr;
269601489e5dSAlfredo Cardigliano 	struct ionic_port_setattr_cmd port_setattr;
269701489e5dSAlfredo Cardigliano 
2698126fe197SAndrew Boyer 	struct ionic_vf_setattr_cmd vf_setattr;
2699126fe197SAndrew Boyer 	struct ionic_vf_getattr_cmd vf_getattr;
2700126fe197SAndrew Boyer 
270101489e5dSAlfredo Cardigliano 	struct ionic_lif_identify_cmd lif_identify;
270201489e5dSAlfredo Cardigliano 	struct ionic_lif_init_cmd lif_init;
270301489e5dSAlfredo Cardigliano 	struct ionic_lif_reset_cmd lif_reset;
270401489e5dSAlfredo Cardigliano 
270501489e5dSAlfredo Cardigliano 	struct ionic_qos_identify_cmd qos_identify;
270601489e5dSAlfredo Cardigliano 	struct ionic_qos_init_cmd qos_init;
270701489e5dSAlfredo Cardigliano 	struct ionic_qos_reset_cmd qos_reset;
2708126fe197SAndrew Boyer 	struct ionic_qos_clear_stats_cmd qos_clear_stats;
270901489e5dSAlfredo Cardigliano 
2710126fe197SAndrew Boyer 	struct ionic_q_identify_cmd q_identify;
271101489e5dSAlfredo Cardigliano 	struct ionic_q_init_cmd q_init;
2712126fe197SAndrew Boyer 	struct ionic_q_control_cmd q_control;
271301489e5dSAlfredo Cardigliano };
271401489e5dSAlfredo Cardigliano 
271501489e5dSAlfredo Cardigliano union ionic_dev_cmd_comp {
271601489e5dSAlfredo Cardigliano 	u32 words[4];
271701489e5dSAlfredo Cardigliano 	u8 status;
271801489e5dSAlfredo Cardigliano 	struct ionic_admin_comp comp;
271901489e5dSAlfredo Cardigliano 	struct ionic_nop_comp nop;
272001489e5dSAlfredo Cardigliano 
272101489e5dSAlfredo Cardigliano 	struct ionic_dev_identify_comp identify;
272201489e5dSAlfredo Cardigliano 	struct ionic_dev_init_comp init;
272301489e5dSAlfredo Cardigliano 	struct ionic_dev_reset_comp reset;
272401489e5dSAlfredo Cardigliano 	struct ionic_dev_getattr_comp getattr;
272501489e5dSAlfredo Cardigliano 	struct ionic_dev_setattr_comp setattr;
272601489e5dSAlfredo Cardigliano 
272701489e5dSAlfredo Cardigliano 	struct ionic_port_identify_comp port_identify;
272801489e5dSAlfredo Cardigliano 	struct ionic_port_init_comp port_init;
272901489e5dSAlfredo Cardigliano 	struct ionic_port_reset_comp port_reset;
273001489e5dSAlfredo Cardigliano 	struct ionic_port_getattr_comp port_getattr;
273101489e5dSAlfredo Cardigliano 	struct ionic_port_setattr_comp port_setattr;
273201489e5dSAlfredo Cardigliano 
2733126fe197SAndrew Boyer 	struct ionic_vf_setattr_comp vf_setattr;
2734126fe197SAndrew Boyer 	struct ionic_vf_getattr_comp vf_getattr;
2735126fe197SAndrew Boyer 
273601489e5dSAlfredo Cardigliano 	struct ionic_lif_identify_comp lif_identify;
273701489e5dSAlfredo Cardigliano 	struct ionic_lif_init_comp lif_init;
273801489e5dSAlfredo Cardigliano 	ionic_lif_reset_comp lif_reset;
273901489e5dSAlfredo Cardigliano 
274001489e5dSAlfredo Cardigliano 	struct ionic_qos_identify_comp qos_identify;
274101489e5dSAlfredo Cardigliano 	ionic_qos_init_comp qos_init;
274201489e5dSAlfredo Cardigliano 	ionic_qos_reset_comp qos_reset;
274301489e5dSAlfredo Cardigliano 
2744126fe197SAndrew Boyer 	struct ionic_q_identify_comp q_identify;
274501489e5dSAlfredo Cardigliano 	struct ionic_q_init_comp q_init;
274601489e5dSAlfredo Cardigliano };
274701489e5dSAlfredo Cardigliano 
274801489e5dSAlfredo Cardigliano /**
2749126fe197SAndrew Boyer  * union ionic_dev_info_regs - Device info register format (read-only)
2750126fe197SAndrew Boyer  * @signature:       Signature value of 0x44455649 ('DEVI')
2751126fe197SAndrew Boyer  * @version:         Current version of info
2752126fe197SAndrew Boyer  * @asic_type:       Asic type
2753126fe197SAndrew Boyer  * @asic_rev:        Asic revision
2754126fe197SAndrew Boyer  * @fw_status:       Firmware status
2755126fe197SAndrew Boyer  * @fw_heartbeat:    Firmware heartbeat counter
2756126fe197SAndrew Boyer  * @serial_num:      Serial number
2757126fe197SAndrew Boyer  * @fw_version:      Firmware version
275801489e5dSAlfredo Cardigliano  */
275901489e5dSAlfredo Cardigliano union ionic_dev_info_regs {
276001489e5dSAlfredo Cardigliano #define IONIC_DEVINFO_FWVERS_BUFLEN 32
276101489e5dSAlfredo Cardigliano #define IONIC_DEVINFO_SERIAL_BUFLEN 32
276201489e5dSAlfredo Cardigliano 	struct {
276301489e5dSAlfredo Cardigliano 		u32    signature;
276401489e5dSAlfredo Cardigliano 		u8     version;
276501489e5dSAlfredo Cardigliano 		u8     asic_type;
276601489e5dSAlfredo Cardigliano 		u8     asic_rev;
2767126fe197SAndrew Boyer #define IONIC_FW_STS_F_RUNNING	0x1
276801489e5dSAlfredo Cardigliano 		u8     fw_status;
276901489e5dSAlfredo Cardigliano 		u32    fw_heartbeat;
277001489e5dSAlfredo Cardigliano 		char   fw_version[IONIC_DEVINFO_FWVERS_BUFLEN];
277101489e5dSAlfredo Cardigliano 		char   serial_num[IONIC_DEVINFO_SERIAL_BUFLEN];
277201489e5dSAlfredo Cardigliano 	};
277301489e5dSAlfredo Cardigliano 	u32 words[512];
277401489e5dSAlfredo Cardigliano };
277501489e5dSAlfredo Cardigliano 
277601489e5dSAlfredo Cardigliano /**
277701489e5dSAlfredo Cardigliano  * union ionic_dev_cmd_regs - Device command register format (read-write)
2778126fe197SAndrew Boyer  * @doorbell:        Device Cmd Doorbell, write-only
277901489e5dSAlfredo Cardigliano  *                   Write a 1 to signal device to process cmd,
278001489e5dSAlfredo Cardigliano  *                   poll done for completion.
2781126fe197SAndrew Boyer  * @done:            Done indicator, bit 0 == 1 when command is complete
278201489e5dSAlfredo Cardigliano  * @cmd:             Opcode-specific command bytes
278301489e5dSAlfredo Cardigliano  * @comp:            Opcode-specific response bytes
278401489e5dSAlfredo Cardigliano  * @data:            Opcode-specific side-data
278501489e5dSAlfredo Cardigliano  */
278601489e5dSAlfredo Cardigliano union ionic_dev_cmd_regs {
278701489e5dSAlfredo Cardigliano 	struct {
278801489e5dSAlfredo Cardigliano 		u32                   doorbell;
278901489e5dSAlfredo Cardigliano 		u32                   done;
279001489e5dSAlfredo Cardigliano 		union ionic_dev_cmd         cmd;
279101489e5dSAlfredo Cardigliano 		union ionic_dev_cmd_comp    comp;
279201489e5dSAlfredo Cardigliano 		u8                    rsvd[48];
279301489e5dSAlfredo Cardigliano 		u32                   data[478];
2794126fe197SAndrew Boyer 	} __rte_packed;
279501489e5dSAlfredo Cardigliano 	u32 words[512];
279601489e5dSAlfredo Cardigliano };
279701489e5dSAlfredo Cardigliano 
279801489e5dSAlfredo Cardigliano /**
2799126fe197SAndrew Boyer  * union ionic_dev_regs - Device register format for bar 0 page 0
280001489e5dSAlfredo Cardigliano  * @info:            Device info registers
280101489e5dSAlfredo Cardigliano  * @devcmd:          Device command registers
280201489e5dSAlfredo Cardigliano  */
280301489e5dSAlfredo Cardigliano union ionic_dev_regs {
280401489e5dSAlfredo Cardigliano 	struct {
280501489e5dSAlfredo Cardigliano 		union ionic_dev_info_regs info;
280601489e5dSAlfredo Cardigliano 		union ionic_dev_cmd_regs  devcmd;
2807126fe197SAndrew Boyer 	} __rte_packed;
280801489e5dSAlfredo Cardigliano 	__le32 words[1024];
280901489e5dSAlfredo Cardigliano };
281001489e5dSAlfredo Cardigliano 
281101489e5dSAlfredo Cardigliano union ionic_adminq_cmd {
281201489e5dSAlfredo Cardigliano 	struct ionic_admin_cmd cmd;
281301489e5dSAlfredo Cardigliano 	struct ionic_nop_cmd nop;
2814126fe197SAndrew Boyer 	struct ionic_q_identify_cmd q_identify;
281501489e5dSAlfredo Cardigliano 	struct ionic_q_init_cmd q_init;
281601489e5dSAlfredo Cardigliano 	struct ionic_q_control_cmd q_control;
281701489e5dSAlfredo Cardigliano 	struct ionic_lif_setattr_cmd lif_setattr;
281801489e5dSAlfredo Cardigliano 	struct ionic_lif_getattr_cmd lif_getattr;
281901489e5dSAlfredo Cardigliano 	struct ionic_rx_mode_set_cmd rx_mode_set;
282001489e5dSAlfredo Cardigliano 	struct ionic_rx_filter_add_cmd rx_filter_add;
282101489e5dSAlfredo Cardigliano 	struct ionic_rx_filter_del_cmd rx_filter_del;
282201489e5dSAlfredo Cardigliano 	struct ionic_rdma_reset_cmd rdma_reset;
282301489e5dSAlfredo Cardigliano 	struct ionic_rdma_queue_cmd rdma_queue;
282401489e5dSAlfredo Cardigliano 	struct ionic_fw_download_cmd fw_download;
282501489e5dSAlfredo Cardigliano 	struct ionic_fw_control_cmd fw_control;
282601489e5dSAlfredo Cardigliano };
282701489e5dSAlfredo Cardigliano 
282801489e5dSAlfredo Cardigliano union ionic_adminq_comp {
282901489e5dSAlfredo Cardigliano 	struct ionic_admin_comp comp;
283001489e5dSAlfredo Cardigliano 	struct ionic_nop_comp nop;
2831126fe197SAndrew Boyer 	struct ionic_q_identify_comp q_identify;
283201489e5dSAlfredo Cardigliano 	struct ionic_q_init_comp q_init;
283301489e5dSAlfredo Cardigliano 	struct ionic_lif_setattr_comp lif_setattr;
283401489e5dSAlfredo Cardigliano 	struct ionic_lif_getattr_comp lif_getattr;
283501489e5dSAlfredo Cardigliano 	struct ionic_rx_filter_add_comp rx_filter_add;
283601489e5dSAlfredo Cardigliano 	struct ionic_fw_control_comp fw_control;
283701489e5dSAlfredo Cardigliano };
283801489e5dSAlfredo Cardigliano 
283901489e5dSAlfredo Cardigliano #define IONIC_BARS_MAX			6
284001489e5dSAlfredo Cardigliano #define IONIC_PCI_BAR_DBELL		1
284101489e5dSAlfredo Cardigliano 
284201489e5dSAlfredo Cardigliano /* BAR0 */
284301489e5dSAlfredo Cardigliano #define IONIC_BAR0_SIZE				0x8000
284401489e5dSAlfredo Cardigliano 
284501489e5dSAlfredo Cardigliano #define IONIC_BAR0_DEV_INFO_REGS_OFFSET		0x0000
284601489e5dSAlfredo Cardigliano #define IONIC_BAR0_DEV_CMD_REGS_OFFSET		0x0800
284701489e5dSAlfredo Cardigliano #define IONIC_BAR0_DEV_CMD_DATA_REGS_OFFSET	0x0c00
284801489e5dSAlfredo Cardigliano #define IONIC_BAR0_INTR_STATUS_OFFSET		0x1000
284901489e5dSAlfredo Cardigliano #define IONIC_BAR0_INTR_CTRL_OFFSET		0x2000
285001489e5dSAlfredo Cardigliano #define IONIC_DEV_CMD_DONE			0x00000001
285101489e5dSAlfredo Cardigliano 
285201489e5dSAlfredo Cardigliano #define IONIC_ASIC_TYPE_CAPRI			0
285301489e5dSAlfredo Cardigliano 
285401489e5dSAlfredo Cardigliano /**
285501489e5dSAlfredo Cardigliano  * struct ionic_doorbell - Doorbell register layout
285601489e5dSAlfredo Cardigliano  * @p_index: Producer index
2857126fe197SAndrew Boyer  * @ring:    Selects the specific ring of the queue to update
285801489e5dSAlfredo Cardigliano  *           Type-specific meaning:
2859126fe197SAndrew Boyer  *              ring=0: Default producer/consumer queue
286001489e5dSAlfredo Cardigliano  *              ring=1: (CQ, EQ) Re-Arm queue.  RDMA CQs
286101489e5dSAlfredo Cardigliano  *              send events to EQs when armed.  EQs send
286201489e5dSAlfredo Cardigliano  *              interrupts when armed.
2863126fe197SAndrew Boyer  * @qid_lo:  Queue destination for the producer index and flags (low bits)
2864126fe197SAndrew Boyer  * @qid_hi:  Queue destination for the producer index and flags (high bits)
286501489e5dSAlfredo Cardigliano  */
286601489e5dSAlfredo Cardigliano struct ionic_doorbell {
286701489e5dSAlfredo Cardigliano 	__le16 p_index;
286801489e5dSAlfredo Cardigliano 	u8     ring;
286901489e5dSAlfredo Cardigliano 	u8     qid_lo;
287001489e5dSAlfredo Cardigliano 	__le16 qid_hi;
287101489e5dSAlfredo Cardigliano 	u16    rsvd2;
287201489e5dSAlfredo Cardigliano };
287301489e5dSAlfredo Cardigliano 
2874126fe197SAndrew Boyer /**
2875126fe197SAndrew Boyer  * struct ionic_intr_ctrl - Interrupt control register
2876126fe197SAndrew Boyer  * @coalescing_init:  Coalescing timer initial value, in
2877126fe197SAndrew Boyer  *                    device units.  Use @identity->intr_coal_mult
2878126fe197SAndrew Boyer  *                    and @identity->intr_coal_div to convert from
2879126fe197SAndrew Boyer  *                    usecs to device units:
2880126fe197SAndrew Boyer  *
2881126fe197SAndrew Boyer  *                      coal_init = coal_usecs * coal_mutl / coal_div
2882126fe197SAndrew Boyer  *
2883126fe197SAndrew Boyer  *                    When an interrupt is sent the interrupt
2884126fe197SAndrew Boyer  *                    coalescing timer current value
2885126fe197SAndrew Boyer  *                    (@coalescing_curr) is initialized with this
2886126fe197SAndrew Boyer  *                    value and begins counting down.  No more
2887126fe197SAndrew Boyer  *                    interrupts are sent until the coalescing
2888126fe197SAndrew Boyer  *                    timer reaches 0.  When @coalescing_init=0
2889126fe197SAndrew Boyer  *                    interrupt coalescing is effectively disabled
2890126fe197SAndrew Boyer  *                    and every interrupt assert results in an
2891126fe197SAndrew Boyer  *                    interrupt.  Reset value: 0
2892126fe197SAndrew Boyer  * @mask:             Interrupt mask.  When @mask=1 the interrupt
2893126fe197SAndrew Boyer  *                    resource will not send an interrupt.  When
2894126fe197SAndrew Boyer  *                    @mask=0 the interrupt resource will send an
2895126fe197SAndrew Boyer  *                    interrupt if an interrupt event is pending
2896126fe197SAndrew Boyer  *                    or on the next interrupt assertion event.
2897126fe197SAndrew Boyer  *                    Reset value: 1
2898126fe197SAndrew Boyer  * @int_credits:      Interrupt credits.  This register indicates
2899126fe197SAndrew Boyer  *                    how many interrupt events the hardware has
2900126fe197SAndrew Boyer  *                    sent.  When written by software this
2901126fe197SAndrew Boyer  *                    register atomically decrements @int_credits
2902126fe197SAndrew Boyer  *                    by the value written.  When @int_credits
2903126fe197SAndrew Boyer  *                    becomes 0 then the "pending interrupt" bit
2904126fe197SAndrew Boyer  *                    in the Interrupt Status register is cleared
2905126fe197SAndrew Boyer  *                    by the hardware and any pending but unsent
2906126fe197SAndrew Boyer  *                    interrupts are cleared.
2907126fe197SAndrew Boyer  *                    !!!IMPORTANT!!! This is a signed register.
2908126fe197SAndrew Boyer  * @flags:            Interrupt control flags
2909126fe197SAndrew Boyer  *                       @unmask -- When this bit is written with a 1
2910126fe197SAndrew Boyer  *                       the interrupt resource will set mask=0.
2911126fe197SAndrew Boyer  *                       @coal_timer_reset -- When this
2912126fe197SAndrew Boyer  *                       bit is written with a 1 the
2913126fe197SAndrew Boyer  *                       @coalescing_curr will be reloaded with
2914126fe197SAndrew Boyer  *                       @coalescing_init to reset the coalescing
2915126fe197SAndrew Boyer  *                       timer.
2916126fe197SAndrew Boyer  * @mask_on_assert:   Automatically mask on assertion.  When
2917126fe197SAndrew Boyer  *                    @mask_on_assert=1 the interrupt resource
2918126fe197SAndrew Boyer  *                    will set @mask=1 whenever an interrupt is
2919126fe197SAndrew Boyer  *                    sent.  When using interrupts in Legacy
2920126fe197SAndrew Boyer  *                    Interrupt mode the driver must select
2921126fe197SAndrew Boyer  *                    @mask_on_assert=0 for proper interrupt
2922126fe197SAndrew Boyer  *                    operation.
2923126fe197SAndrew Boyer  * @coalescing_curr:  Coalescing timer current value, in
2924126fe197SAndrew Boyer  *                    microseconds.  When this value reaches 0
2925126fe197SAndrew Boyer  *                    the interrupt resource is again eligible to
2926126fe197SAndrew Boyer  *                    send an interrupt.  If an interrupt event
2927126fe197SAndrew Boyer  *                    is already pending when @coalescing_curr
2928126fe197SAndrew Boyer  *                    reaches 0 the pending interrupt will be
2929126fe197SAndrew Boyer  *                    sent, otherwise an interrupt will be sent
2930126fe197SAndrew Boyer  *                    on the next interrupt assertion event.
2931126fe197SAndrew Boyer  */
2932126fe197SAndrew Boyer struct ionic_intr_ctrl {
2933126fe197SAndrew Boyer 	u8 coalescing_init;
2934126fe197SAndrew Boyer 	u8 rsvd[3];
2935126fe197SAndrew Boyer 	u8 mask;
2936126fe197SAndrew Boyer 	u8 rsvd2[3];
2937126fe197SAndrew Boyer 	u16 int_credits;
2938126fe197SAndrew Boyer 	u16 flags;
2939126fe197SAndrew Boyer #define INTR_F_UNMASK		0x0001
2940126fe197SAndrew Boyer #define INTR_F_TIMER_RESET	0x0002
2941126fe197SAndrew Boyer 	u8 mask_on_assert;
2942126fe197SAndrew Boyer 	u8 rsvd3[3];
2943126fe197SAndrew Boyer 	u8 coalescing_curr;
2944126fe197SAndrew Boyer 	u8 rsvd4[3];
2945126fe197SAndrew Boyer 	u32 rsvd6[3];
2946126fe197SAndrew Boyer };
2947126fe197SAndrew Boyer 
2948126fe197SAndrew Boyer #define IONIC_INTR_CTRL_REGS_MAX	2048
2949126fe197SAndrew Boyer #define IONIC_INTR_CTRL_COAL_MAX	0x3F
2950126fe197SAndrew Boyer 
2951126fe197SAndrew Boyer #define intr_to_coal(intr_ctrl)		\
2952126fe197SAndrew Boyer 		((void __iomem *)&(intr_ctrl)->coalescing_init)
2953126fe197SAndrew Boyer #define intr_to_mask(intr_ctrl)		\
2954126fe197SAndrew Boyer 		((void __iomem *)&(intr_ctrl)->mask)
2955126fe197SAndrew Boyer #define intr_to_credits(intr_ctrl)	\
2956126fe197SAndrew Boyer 		((void __iomem *)&(intr_ctrl)->int_credits)
2957126fe197SAndrew Boyer #define intr_to_mask_on_assert(intr_ctrl)\
2958126fe197SAndrew Boyer 		((void __iomem *)&(intr_ctrl)->mask_on_assert)
2959126fe197SAndrew Boyer 
296001489e5dSAlfredo Cardigliano struct ionic_intr_status {
296101489e5dSAlfredo Cardigliano 	u32 status[2];
296201489e5dSAlfredo Cardigliano };
296301489e5dSAlfredo Cardigliano 
296401489e5dSAlfredo Cardigliano struct ionic_notifyq_cmd {
296501489e5dSAlfredo Cardigliano 	__le32 data;	/* Not used but needed for qcq structure */
296601489e5dSAlfredo Cardigliano };
296701489e5dSAlfredo Cardigliano 
296801489e5dSAlfredo Cardigliano union ionic_notifyq_comp {
296901489e5dSAlfredo Cardigliano 	struct ionic_notifyq_event event;
297001489e5dSAlfredo Cardigliano 	struct ionic_link_change_event link_change;
297101489e5dSAlfredo Cardigliano 	struct ionic_reset_event reset;
297201489e5dSAlfredo Cardigliano 	struct ionic_heartbeat_event heartbeat;
297301489e5dSAlfredo Cardigliano 	struct ionic_log_event log;
297401489e5dSAlfredo Cardigliano };
297501489e5dSAlfredo Cardigliano 
2976126fe197SAndrew Boyer /**
2977126fe197SAndrew Boyer  * struct ionic_eq_comp - Event queue completion descriptor
2978126fe197SAndrew Boyer  *
2979126fe197SAndrew Boyer  * @code:	Event code, see enum ionic_eq_comp_code
2980126fe197SAndrew Boyer  * @lif_index:	To which LIF the event pertains
2981126fe197SAndrew Boyer  * @qid:	To which queue id the event pertains
2982126fe197SAndrew Boyer  * @gen_color:	Event queue wrap counter, init 1, incr each wrap
2983126fe197SAndrew Boyer  */
2984126fe197SAndrew Boyer struct ionic_eq_comp {
2985126fe197SAndrew Boyer 	__le16 code;
2986126fe197SAndrew Boyer 	__le16 lif_index;
2987126fe197SAndrew Boyer 	__le32 qid;
2988126fe197SAndrew Boyer 	u8 rsvd[7];
2989126fe197SAndrew Boyer 	u8 gen_color;
2990126fe197SAndrew Boyer };
2991126fe197SAndrew Boyer 
2992126fe197SAndrew Boyer enum ionic_eq_comp_code {
2993126fe197SAndrew Boyer 	IONIC_EQ_COMP_CODE_NONE = 0,
2994126fe197SAndrew Boyer 	IONIC_EQ_COMP_CODE_RX_COMP = 1,
2995126fe197SAndrew Boyer 	IONIC_EQ_COMP_CODE_TX_COMP = 2,
2996126fe197SAndrew Boyer };
2997126fe197SAndrew Boyer 
299801489e5dSAlfredo Cardigliano /* Deprecate */
299901489e5dSAlfredo Cardigliano struct ionic_identity {
300001489e5dSAlfredo Cardigliano 	union ionic_drv_identity drv;
300101489e5dSAlfredo Cardigliano 	union ionic_dev_identity dev;
300201489e5dSAlfredo Cardigliano 	union ionic_lif_identity lif;
300301489e5dSAlfredo Cardigliano 	union ionic_port_identity port;
300401489e5dSAlfredo Cardigliano 	union ionic_qos_identity qos;
3005126fe197SAndrew Boyer 	union ionic_q_identity txq;
300601489e5dSAlfredo Cardigliano };
300701489e5dSAlfredo Cardigliano 
300801489e5dSAlfredo Cardigliano #endif /* _IONIC_IF_H_ */
3009