xref: /dpdk/drivers/net/ionic/ionic_if.h (revision e77506397fc8005c5129e22e9e2d15d5876790fd)
176668754SAndrew Boyer /* SPDX-License-Identifier: BSD-3-Clause
276668754SAndrew Boyer  * Copyright 2017-2022 Advanced Micro Devices, Inc.
376668754SAndrew Boyer  */
401489e5dSAlfredo Cardigliano 
501489e5dSAlfredo Cardigliano #ifndef _IONIC_IF_H_
601489e5dSAlfredo Cardigliano #define _IONIC_IF_H_
701489e5dSAlfredo Cardigliano 
801489e5dSAlfredo Cardigliano #define IONIC_DEV_INFO_SIGNATURE		0x44455649      /* 'DEVI' */
901489e5dSAlfredo Cardigliano #define IONIC_DEV_INFO_VERSION			1
1001489e5dSAlfredo Cardigliano #define IONIC_IFNAMSIZ				16
1101489e5dSAlfredo Cardigliano 
1201489e5dSAlfredo Cardigliano /**
13126fe197SAndrew Boyer  * enum ionic_cmd_opcode - Device commands
1401489e5dSAlfredo Cardigliano  */
1501489e5dSAlfredo Cardigliano enum ionic_cmd_opcode {
1601489e5dSAlfredo Cardigliano 	IONIC_CMD_NOP				= 0,
1701489e5dSAlfredo Cardigliano 
1801489e5dSAlfredo Cardigliano 	/* Device commands */
1901489e5dSAlfredo Cardigliano 	IONIC_CMD_IDENTIFY			= 1,
2001489e5dSAlfredo Cardigliano 	IONIC_CMD_INIT				= 2,
2101489e5dSAlfredo Cardigliano 	IONIC_CMD_RESET				= 3,
2201489e5dSAlfredo Cardigliano 	IONIC_CMD_GETATTR			= 4,
2301489e5dSAlfredo Cardigliano 	IONIC_CMD_SETATTR			= 5,
2401489e5dSAlfredo Cardigliano 
2501489e5dSAlfredo Cardigliano 	/* Port commands */
2601489e5dSAlfredo Cardigliano 	IONIC_CMD_PORT_IDENTIFY			= 10,
2701489e5dSAlfredo Cardigliano 	IONIC_CMD_PORT_INIT			= 11,
2801489e5dSAlfredo Cardigliano 	IONIC_CMD_PORT_RESET			= 12,
2901489e5dSAlfredo Cardigliano 	IONIC_CMD_PORT_GETATTR			= 13,
3001489e5dSAlfredo Cardigliano 	IONIC_CMD_PORT_SETATTR			= 14,
3101489e5dSAlfredo Cardigliano 
3201489e5dSAlfredo Cardigliano 	/* LIF commands */
3301489e5dSAlfredo Cardigliano 	IONIC_CMD_LIF_IDENTIFY			= 20,
3401489e5dSAlfredo Cardigliano 	IONIC_CMD_LIF_INIT			= 21,
3501489e5dSAlfredo Cardigliano 	IONIC_CMD_LIF_RESET			= 22,
3601489e5dSAlfredo Cardigliano 	IONIC_CMD_LIF_GETATTR			= 23,
3701489e5dSAlfredo Cardigliano 	IONIC_CMD_LIF_SETATTR			= 24,
3801489e5dSAlfredo Cardigliano 
3901489e5dSAlfredo Cardigliano 	IONIC_CMD_RX_MODE_SET			= 30,
4001489e5dSAlfredo Cardigliano 	IONIC_CMD_RX_FILTER_ADD			= 31,
4101489e5dSAlfredo Cardigliano 	IONIC_CMD_RX_FILTER_DEL			= 32,
4201489e5dSAlfredo Cardigliano 
4301489e5dSAlfredo Cardigliano 	/* Queue commands */
44126fe197SAndrew Boyer 	IONIC_CMD_Q_IDENTIFY			= 39,
4501489e5dSAlfredo Cardigliano 	IONIC_CMD_Q_INIT			= 40,
4601489e5dSAlfredo Cardigliano 	IONIC_CMD_Q_CONTROL			= 41,
4701489e5dSAlfredo Cardigliano 
4801489e5dSAlfredo Cardigliano 	/* RDMA commands */
4901489e5dSAlfredo Cardigliano 	IONIC_CMD_RDMA_RESET_LIF		= 50,
5001489e5dSAlfredo Cardigliano 	IONIC_CMD_RDMA_CREATE_EQ		= 51,
5101489e5dSAlfredo Cardigliano 	IONIC_CMD_RDMA_CREATE_CQ		= 52,
5201489e5dSAlfredo Cardigliano 	IONIC_CMD_RDMA_CREATE_ADMINQ		= 53,
5301489e5dSAlfredo Cardigliano 
54126fe197SAndrew Boyer 	/* SR/IOV commands */
55126fe197SAndrew Boyer 	IONIC_CMD_VF_GETATTR			= 60,
56126fe197SAndrew Boyer 	IONIC_CMD_VF_SETATTR			= 61,
57126fe197SAndrew Boyer 
5801489e5dSAlfredo Cardigliano 	/* QoS commands */
5901489e5dSAlfredo Cardigliano 	IONIC_CMD_QOS_CLASS_IDENTIFY		= 240,
6001489e5dSAlfredo Cardigliano 	IONIC_CMD_QOS_CLASS_INIT		= 241,
6101489e5dSAlfredo Cardigliano 	IONIC_CMD_QOS_CLASS_RESET		= 242,
62126fe197SAndrew Boyer 	IONIC_CMD_QOS_CLASS_UPDATE		= 243,
63126fe197SAndrew Boyer 	IONIC_CMD_QOS_CLEAR_STATS		= 244,
64126fe197SAndrew Boyer 	IONIC_CMD_QOS_RESET			= 245,
6501489e5dSAlfredo Cardigliano 
6601489e5dSAlfredo Cardigliano 	/* Firmware commands */
6701489e5dSAlfredo Cardigliano 	IONIC_CMD_FW_DOWNLOAD			= 254,
6801489e5dSAlfredo Cardigliano 	IONIC_CMD_FW_CONTROL			= 255,
6901489e5dSAlfredo Cardigliano };
7001489e5dSAlfredo Cardigliano 
7101489e5dSAlfredo Cardigliano /**
72126fe197SAndrew Boyer  * enum ionic_status_code - Device command return codes
7301489e5dSAlfredo Cardigliano  */
7401489e5dSAlfredo Cardigliano enum ionic_status_code {
7501489e5dSAlfredo Cardigliano 	IONIC_RC_SUCCESS	= 0,	/* Success */
7601489e5dSAlfredo Cardigliano 	IONIC_RC_EVERSION	= 1,	/* Incorrect version for request */
7701489e5dSAlfredo Cardigliano 	IONIC_RC_EOPCODE	= 2,	/* Invalid cmd opcode */
7801489e5dSAlfredo Cardigliano 	IONIC_RC_EIO		= 3,	/* I/O error */
7901489e5dSAlfredo Cardigliano 	IONIC_RC_EPERM		= 4,	/* Permission denied */
8001489e5dSAlfredo Cardigliano 	IONIC_RC_EQID		= 5,	/* Bad qid */
8101489e5dSAlfredo Cardigliano 	IONIC_RC_EQTYPE		= 6,	/* Bad qtype */
8201489e5dSAlfredo Cardigliano 	IONIC_RC_ENOENT		= 7,	/* No such element */
8301489e5dSAlfredo Cardigliano 	IONIC_RC_EINTR		= 8,	/* operation interrupted */
8401489e5dSAlfredo Cardigliano 	IONIC_RC_EAGAIN		= 9,	/* Try again */
8501489e5dSAlfredo Cardigliano 	IONIC_RC_ENOMEM		= 10,	/* Out of memory */
8601489e5dSAlfredo Cardigliano 	IONIC_RC_EFAULT		= 11,	/* Bad address */
8701489e5dSAlfredo Cardigliano 	IONIC_RC_EBUSY		= 12,	/* Device or resource busy */
8801489e5dSAlfredo Cardigliano 	IONIC_RC_EEXIST		= 13,	/* object already exists */
8901489e5dSAlfredo Cardigliano 	IONIC_RC_EINVAL		= 14,	/* Invalid argument */
9001489e5dSAlfredo Cardigliano 	IONIC_RC_ENOSPC		= 15,	/* No space left or alloc failure */
9101489e5dSAlfredo Cardigliano 	IONIC_RC_ERANGE		= 16,	/* Parameter out of range */
9201489e5dSAlfredo Cardigliano 	IONIC_RC_BAD_ADDR	= 17,	/* Descriptor contains a bad ptr */
9301489e5dSAlfredo Cardigliano 	IONIC_RC_DEV_CMD	= 18,	/* Device cmd attempted on AdminQ */
9401489e5dSAlfredo Cardigliano 	IONIC_RC_ENOSUPP	= 19,	/* Operation not supported */
9501489e5dSAlfredo Cardigliano 	IONIC_RC_ERROR		= 29,	/* Generic error */
9601489e5dSAlfredo Cardigliano 	IONIC_RC_ERDMA		= 30,	/* Generic RDMA error */
97126fe197SAndrew Boyer 	IONIC_RC_EVFID		= 31,	/* VF ID does not exist */
9801489e5dSAlfredo Cardigliano };
9901489e5dSAlfredo Cardigliano 
10001489e5dSAlfredo Cardigliano enum ionic_notifyq_opcode {
10101489e5dSAlfredo Cardigliano 	IONIC_EVENT_LINK_CHANGE		= 1,
10201489e5dSAlfredo Cardigliano 	IONIC_EVENT_RESET		= 2,
10301489e5dSAlfredo Cardigliano 	IONIC_EVENT_HEARTBEAT		= 3,
10401489e5dSAlfredo Cardigliano 	IONIC_EVENT_LOG			= 4,
105126fe197SAndrew Boyer 	IONIC_EVENT_XCVR		= 5,
10601489e5dSAlfredo Cardigliano };
10701489e5dSAlfredo Cardigliano 
10801489e5dSAlfredo Cardigliano /**
109126fe197SAndrew Boyer  * struct ionic_admin_cmd - General admin command format
11001489e5dSAlfredo Cardigliano  * @opcode:     Opcode for the command
11101489e5dSAlfredo Cardigliano  * @lif_index:  LIF index
11201489e5dSAlfredo Cardigliano  * @cmd_data:   Opcode-specific command bytes
11301489e5dSAlfredo Cardigliano  */
11401489e5dSAlfredo Cardigliano struct ionic_admin_cmd {
11501489e5dSAlfredo Cardigliano 	u8     opcode;
11601489e5dSAlfredo Cardigliano 	u8     rsvd;
11701489e5dSAlfredo Cardigliano 	__le16 lif_index;
11801489e5dSAlfredo Cardigliano 	u8     cmd_data[60];
11901489e5dSAlfredo Cardigliano };
12001489e5dSAlfredo Cardigliano 
12101489e5dSAlfredo Cardigliano /**
12201489e5dSAlfredo Cardigliano  * struct ionic_admin_comp - General admin command completion format
123126fe197SAndrew Boyer  * @status:     Status of the command (enum ionic_status_code)
124126fe197SAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
125126fe197SAndrew Boyer  * @cmd_data:   Command-specific bytes
126126fe197SAndrew Boyer  * @color:      Color bit (Always 0 for commands issued to the
127126fe197SAndrew Boyer  *              Device Cmd Registers)
12801489e5dSAlfredo Cardigliano  */
12901489e5dSAlfredo Cardigliano struct ionic_admin_comp {
13001489e5dSAlfredo Cardigliano 	u8     status;
13101489e5dSAlfredo Cardigliano 	u8     rsvd;
13201489e5dSAlfredo Cardigliano 	__le16 comp_index;
13301489e5dSAlfredo Cardigliano 	u8     cmd_data[11];
13401489e5dSAlfredo Cardigliano 	u8     color;
13501489e5dSAlfredo Cardigliano #define IONIC_COMP_COLOR_MASK  0x80
13601489e5dSAlfredo Cardigliano };
13701489e5dSAlfredo Cardigliano 
13801489e5dSAlfredo Cardigliano static inline u8 color_match(u8 color, u8 done_color)
13901489e5dSAlfredo Cardigliano {
14001489e5dSAlfredo Cardigliano 	return (!!(color & IONIC_COMP_COLOR_MASK)) == done_color;
14101489e5dSAlfredo Cardigliano }
14201489e5dSAlfredo Cardigliano 
14301489e5dSAlfredo Cardigliano /**
14401489e5dSAlfredo Cardigliano  * struct ionic_nop_cmd - NOP command
14501489e5dSAlfredo Cardigliano  * @opcode: opcode
14601489e5dSAlfredo Cardigliano  */
14701489e5dSAlfredo Cardigliano struct ionic_nop_cmd {
14801489e5dSAlfredo Cardigliano 	u8 opcode;
14901489e5dSAlfredo Cardigliano 	u8 rsvd[63];
15001489e5dSAlfredo Cardigliano };
15101489e5dSAlfredo Cardigliano 
15201489e5dSAlfredo Cardigliano /**
15301489e5dSAlfredo Cardigliano  * struct ionic_nop_comp - NOP command completion
154126fe197SAndrew Boyer  * @status: Status of the command (enum ionic_status_code)
15501489e5dSAlfredo Cardigliano  */
15601489e5dSAlfredo Cardigliano struct ionic_nop_comp {
15701489e5dSAlfredo Cardigliano 	u8 status;
15801489e5dSAlfredo Cardigliano 	u8 rsvd[15];
15901489e5dSAlfredo Cardigliano };
16001489e5dSAlfredo Cardigliano 
16101489e5dSAlfredo Cardigliano /**
16201489e5dSAlfredo Cardigliano  * struct ionic_dev_init_cmd - Device init command
16301489e5dSAlfredo Cardigliano  * @opcode:    opcode
164126fe197SAndrew Boyer  * @type:      Device type
16501489e5dSAlfredo Cardigliano  */
16601489e5dSAlfredo Cardigliano struct ionic_dev_init_cmd {
16701489e5dSAlfredo Cardigliano 	u8     opcode;
16801489e5dSAlfredo Cardigliano 	u8     type;
16901489e5dSAlfredo Cardigliano 	u8     rsvd[62];
17001489e5dSAlfredo Cardigliano };
17101489e5dSAlfredo Cardigliano 
17201489e5dSAlfredo Cardigliano /**
173126fe197SAndrew Boyer  * struct ionic_dev_init_comp - Device init command completion
174126fe197SAndrew Boyer  * @status: Status of the command (enum ionic_status_code)
17501489e5dSAlfredo Cardigliano  */
17601489e5dSAlfredo Cardigliano struct ionic_dev_init_comp {
17701489e5dSAlfredo Cardigliano 	u8 status;
17801489e5dSAlfredo Cardigliano 	u8 rsvd[15];
17901489e5dSAlfredo Cardigliano };
18001489e5dSAlfredo Cardigliano 
18101489e5dSAlfredo Cardigliano /**
18201489e5dSAlfredo Cardigliano  * struct ionic_dev_reset_cmd - Device reset command
18301489e5dSAlfredo Cardigliano  * @opcode: opcode
18401489e5dSAlfredo Cardigliano  */
18501489e5dSAlfredo Cardigliano struct ionic_dev_reset_cmd {
18601489e5dSAlfredo Cardigliano 	u8 opcode;
18701489e5dSAlfredo Cardigliano 	u8 rsvd[63];
18801489e5dSAlfredo Cardigliano };
18901489e5dSAlfredo Cardigliano 
19001489e5dSAlfredo Cardigliano /**
191126fe197SAndrew Boyer  * struct ionic_dev_reset_comp - Reset command completion
192126fe197SAndrew Boyer  * @status: Status of the command (enum ionic_status_code)
19301489e5dSAlfredo Cardigliano  */
19401489e5dSAlfredo Cardigliano struct ionic_dev_reset_comp {
19501489e5dSAlfredo Cardigliano 	u8 status;
19601489e5dSAlfredo Cardigliano 	u8 rsvd[15];
19701489e5dSAlfredo Cardigliano };
19801489e5dSAlfredo Cardigliano 
19901489e5dSAlfredo Cardigliano #define IONIC_IDENTITY_VERSION_1	1
20001489e5dSAlfredo Cardigliano 
20101489e5dSAlfredo Cardigliano /**
20201489e5dSAlfredo Cardigliano  * struct ionic_dev_identify_cmd - Driver/device identify command
20301489e5dSAlfredo Cardigliano  * @opcode:  opcode
20401489e5dSAlfredo Cardigliano  * @ver:     Highest version of identify supported by driver
20501489e5dSAlfredo Cardigliano  */
20601489e5dSAlfredo Cardigliano struct ionic_dev_identify_cmd {
20701489e5dSAlfredo Cardigliano 	u8 opcode;
20801489e5dSAlfredo Cardigliano 	u8 ver;
20901489e5dSAlfredo Cardigliano 	u8 rsvd[62];
21001489e5dSAlfredo Cardigliano };
21101489e5dSAlfredo Cardigliano 
21201489e5dSAlfredo Cardigliano /**
213126fe197SAndrew Boyer  * struct ionic_dev_identify_comp - Driver/device identify command completion
214126fe197SAndrew Boyer  * @status: Status of the command (enum ionic_status_code)
21501489e5dSAlfredo Cardigliano  * @ver:    Version of identify returned by device
21601489e5dSAlfredo Cardigliano  */
21701489e5dSAlfredo Cardigliano struct ionic_dev_identify_comp {
21801489e5dSAlfredo Cardigliano 	u8 status;
21901489e5dSAlfredo Cardigliano 	u8 ver;
22001489e5dSAlfredo Cardigliano 	u8 rsvd[14];
22101489e5dSAlfredo Cardigliano };
22201489e5dSAlfredo Cardigliano 
22301489e5dSAlfredo Cardigliano enum ionic_os_type {
22401489e5dSAlfredo Cardigliano 	IONIC_OS_TYPE_LINUX   = 1,
22501489e5dSAlfredo Cardigliano 	IONIC_OS_TYPE_WIN     = 2,
22601489e5dSAlfredo Cardigliano 	IONIC_OS_TYPE_DPDK    = 3,
22701489e5dSAlfredo Cardigliano 	IONIC_OS_TYPE_FREEBSD = 4,
22801489e5dSAlfredo Cardigliano 	IONIC_OS_TYPE_IPXE    = 5,
22901489e5dSAlfredo Cardigliano 	IONIC_OS_TYPE_ESXI    = 6,
23001489e5dSAlfredo Cardigliano };
23101489e5dSAlfredo Cardigliano 
23201489e5dSAlfredo Cardigliano /**
233126fe197SAndrew Boyer  * union ionic_drv_identity - driver identity information
234126fe197SAndrew Boyer  * @os_type:          OS type (see enum ionic_os_type)
23501489e5dSAlfredo Cardigliano  * @os_dist:          OS distribution, numeric format
23601489e5dSAlfredo Cardigliano  * @os_dist_str:      OS distribution, string format
23701489e5dSAlfredo Cardigliano  * @kernel_ver:       Kernel version, numeric format
23801489e5dSAlfredo Cardigliano  * @kernel_ver_str:   Kernel version, string format
23901489e5dSAlfredo Cardigliano  * @driver_ver_str:   Driver version, string format
24001489e5dSAlfredo Cardigliano  */
24101489e5dSAlfredo Cardigliano union ionic_drv_identity {
24201489e5dSAlfredo Cardigliano 	struct {
24301489e5dSAlfredo Cardigliano 		__le32 os_type;
24401489e5dSAlfredo Cardigliano 		__le32 os_dist;
24501489e5dSAlfredo Cardigliano 		char   os_dist_str[128];
24601489e5dSAlfredo Cardigliano 		__le32 kernel_ver;
24701489e5dSAlfredo Cardigliano 		char   kernel_ver_str[32];
24801489e5dSAlfredo Cardigliano 		char   driver_ver_str[32];
24901489e5dSAlfredo Cardigliano 	};
250126fe197SAndrew Boyer 	__le32 words[478];
25101489e5dSAlfredo Cardigliano };
25201489e5dSAlfredo Cardigliano 
25301489e5dSAlfredo Cardigliano /**
254126fe197SAndrew Boyer  * union ionic_dev_identity - device identity information
25501489e5dSAlfredo Cardigliano  * @version:          Version of device identify
25601489e5dSAlfredo Cardigliano  * @type:             Identify type (0 for now)
25701489e5dSAlfredo Cardigliano  * @nports:           Number of ports provisioned
25801489e5dSAlfredo Cardigliano  * @nlifs:            Number of LIFs provisioned
25901489e5dSAlfredo Cardigliano  * @nintrs:           Number of interrupts provisioned
26001489e5dSAlfredo Cardigliano  * @ndbpgs_per_lif:   Number of doorbell pages per LIF
261126fe197SAndrew Boyer  * @intr_coal_mult:   Interrupt coalescing multiplication factor
26201489e5dSAlfredo Cardigliano  *                    Scale user-supplied interrupt coalescing
26301489e5dSAlfredo Cardigliano  *                    value in usecs to device units using:
26401489e5dSAlfredo Cardigliano  *                    device units = usecs * mult / div
265126fe197SAndrew Boyer  * @intr_coal_div:    Interrupt coalescing division factor
26601489e5dSAlfredo Cardigliano  *                    Scale user-supplied interrupt coalescing
26701489e5dSAlfredo Cardigliano  *                    value in usecs to device units using:
26801489e5dSAlfredo Cardigliano  *                    device units = usecs * mult / div
269126fe197SAndrew Boyer  * @eq_count:         Number of shared event queues
27001489e5dSAlfredo Cardigliano  */
27101489e5dSAlfredo Cardigliano union ionic_dev_identity {
27201489e5dSAlfredo Cardigliano 	struct {
27301489e5dSAlfredo Cardigliano 		u8     version;
27401489e5dSAlfredo Cardigliano 		u8     type;
27501489e5dSAlfredo Cardigliano 		u8     rsvd[2];
27601489e5dSAlfredo Cardigliano 		u8     nports;
27701489e5dSAlfredo Cardigliano 		u8     rsvd2[3];
27801489e5dSAlfredo Cardigliano 		__le32 nlifs;
27901489e5dSAlfredo Cardigliano 		__le32 nintrs;
28001489e5dSAlfredo Cardigliano 		__le32 ndbpgs_per_lif;
28101489e5dSAlfredo Cardigliano 		__le32 intr_coal_mult;
28201489e5dSAlfredo Cardigliano 		__le32 intr_coal_div;
283126fe197SAndrew Boyer 		__le32 eq_count;
28401489e5dSAlfredo Cardigliano 	};
285126fe197SAndrew Boyer 	__le32 words[478];
28601489e5dSAlfredo Cardigliano };
28701489e5dSAlfredo Cardigliano 
28801489e5dSAlfredo Cardigliano enum ionic_lif_type {
28901489e5dSAlfredo Cardigliano 	IONIC_LIF_TYPE_CLASSIC = 0,
29001489e5dSAlfredo Cardigliano 	IONIC_LIF_TYPE_MACVLAN = 1,
29101489e5dSAlfredo Cardigliano 	IONIC_LIF_TYPE_NETQUEUE = 2,
29201489e5dSAlfredo Cardigliano };
29301489e5dSAlfredo Cardigliano 
29401489e5dSAlfredo Cardigliano /**
295126fe197SAndrew Boyer  * struct ionic_lif_identify_cmd - LIF identify command
29601489e5dSAlfredo Cardigliano  * @opcode:  opcode
297126fe197SAndrew Boyer  * @type:    LIF type (enum ionic_lif_type)
298126fe197SAndrew Boyer  * @ver:     Version of identify returned by device
29901489e5dSAlfredo Cardigliano  */
30001489e5dSAlfredo Cardigliano struct ionic_lif_identify_cmd {
30101489e5dSAlfredo Cardigliano 	u8 opcode;
30201489e5dSAlfredo Cardigliano 	u8 type;
30301489e5dSAlfredo Cardigliano 	u8 ver;
30401489e5dSAlfredo Cardigliano 	u8 rsvd[61];
30501489e5dSAlfredo Cardigliano };
30601489e5dSAlfredo Cardigliano 
30701489e5dSAlfredo Cardigliano /**
308126fe197SAndrew Boyer  * struct ionic_lif_identify_comp - LIF identify command completion
309126fe197SAndrew Boyer  * @status:  Status of the command (enum ionic_status_code)
310126fe197SAndrew Boyer  * @ver:     Version of identify returned by device
31101489e5dSAlfredo Cardigliano  */
31201489e5dSAlfredo Cardigliano struct ionic_lif_identify_comp {
31301489e5dSAlfredo Cardigliano 	u8 status;
31401489e5dSAlfredo Cardigliano 	u8 ver;
31501489e5dSAlfredo Cardigliano 	u8 rsvd2[14];
31601489e5dSAlfredo Cardigliano };
31701489e5dSAlfredo Cardigliano 
318126fe197SAndrew Boyer /**
319126fe197SAndrew Boyer  * enum ionic_lif_capability - LIF capabilities
320126fe197SAndrew Boyer  * @IONIC_LIF_CAP_ETH:     LIF supports Ethernet
321126fe197SAndrew Boyer  * @IONIC_LIF_CAP_RDMA:    LIF support RDMA
322126fe197SAndrew Boyer  */
32301489e5dSAlfredo Cardigliano enum ionic_lif_capability {
32401489e5dSAlfredo Cardigliano 	IONIC_LIF_CAP_ETH        = BIT(0),
32501489e5dSAlfredo Cardigliano 	IONIC_LIF_CAP_RDMA       = BIT(1),
32601489e5dSAlfredo Cardigliano };
32701489e5dSAlfredo Cardigliano 
32801489e5dSAlfredo Cardigliano /**
329126fe197SAndrew Boyer  * enum ionic_logical_qtype - Logical Queue Types
330126fe197SAndrew Boyer  * @IONIC_QTYPE_ADMINQ:    Administrative Queue
331126fe197SAndrew Boyer  * @IONIC_QTYPE_NOTIFYQ:   Notify Queue
332126fe197SAndrew Boyer  * @IONIC_QTYPE_RXQ:       Receive Queue
333126fe197SAndrew Boyer  * @IONIC_QTYPE_TXQ:       Transmit Queue
334126fe197SAndrew Boyer  * @IONIC_QTYPE_EQ:        Event Queue
335126fe197SAndrew Boyer  * @IONIC_QTYPE_MAX:       Max queue type supported
33601489e5dSAlfredo Cardigliano  */
33701489e5dSAlfredo Cardigliano enum ionic_logical_qtype {
33801489e5dSAlfredo Cardigliano 	IONIC_QTYPE_ADMINQ  = 0,
33901489e5dSAlfredo Cardigliano 	IONIC_QTYPE_NOTIFYQ = 1,
34001489e5dSAlfredo Cardigliano 	IONIC_QTYPE_RXQ     = 2,
34101489e5dSAlfredo Cardigliano 	IONIC_QTYPE_TXQ     = 3,
34201489e5dSAlfredo Cardigliano 	IONIC_QTYPE_EQ      = 4,
34301489e5dSAlfredo Cardigliano 	IONIC_QTYPE_MAX     = 16,
34401489e5dSAlfredo Cardigliano };
34501489e5dSAlfredo Cardigliano 
34601489e5dSAlfredo Cardigliano /**
347126fe197SAndrew Boyer  * struct ionic_lif_logical_qtype - Descriptor of logical to HW queue type
348126fe197SAndrew Boyer  * @qtype:          Hardware Queue Type
349126fe197SAndrew Boyer  * @qid_count:      Number of Queue IDs of the logical type
350126fe197SAndrew Boyer  * @qid_base:       Minimum Queue ID of the logical type
35101489e5dSAlfredo Cardigliano  */
35201489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype {
35301489e5dSAlfredo Cardigliano 	u8     qtype;
35401489e5dSAlfredo Cardigliano 	u8     rsvd[3];
35501489e5dSAlfredo Cardigliano 	__le32 qid_count;
35601489e5dSAlfredo Cardigliano 	__le32 qid_base;
35701489e5dSAlfredo Cardigliano };
35801489e5dSAlfredo Cardigliano 
359126fe197SAndrew Boyer /**
360126fe197SAndrew Boyer  * enum ionic_lif_state - LIF state
361126fe197SAndrew Boyer  * @IONIC_LIF_DISABLE:     LIF disabled
362126fe197SAndrew Boyer  * @IONIC_LIF_ENABLE:      LIF enabled
363126fe197SAndrew Boyer  * @IONIC_LIF_QUIESCE:     LIF Quiesced
364126fe197SAndrew Boyer  */
36501489e5dSAlfredo Cardigliano enum ionic_lif_state {
366126fe197SAndrew Boyer 	IONIC_LIF_QUIESCE	= 0,
36701489e5dSAlfredo Cardigliano 	IONIC_LIF_ENABLE	= 1,
368126fe197SAndrew Boyer 	IONIC_LIF_DISABLE	= 2,
36901489e5dSAlfredo Cardigliano };
37001489e5dSAlfredo Cardigliano 
37101489e5dSAlfredo Cardigliano /**
372126fe197SAndrew Boyer  * union ionic_lif_config - LIF configuration
373126fe197SAndrew Boyer  * @state:          LIF state (enum ionic_lif_state)
374126fe197SAndrew Boyer  * @name:           LIF name
375126fe197SAndrew Boyer  * @mtu:            MTU
376126fe197SAndrew Boyer  * @mac:            Station MAC address
377126fe197SAndrew Boyer  * @vlan:           Default Vlan ID
378126fe197SAndrew Boyer  * @features:       Features (enum ionic_eth_hw_features)
379126fe197SAndrew Boyer  * @queue_count:    Queue counts per queue-type
38001489e5dSAlfredo Cardigliano  */
38101489e5dSAlfredo Cardigliano union ionic_lif_config {
382*e7750639SAndre Muezerie 	struct __rte_packed_begin {
38301489e5dSAlfredo Cardigliano 		u8     state;
38401489e5dSAlfredo Cardigliano 		u8     rsvd[3];
38501489e5dSAlfredo Cardigliano 		char   name[IONIC_IFNAMSIZ];
38601489e5dSAlfredo Cardigliano 		__le32 mtu;
38701489e5dSAlfredo Cardigliano 		u8     mac[6];
388126fe197SAndrew Boyer 		__le16 vlan;
38901489e5dSAlfredo Cardigliano 		__le64 features;
39001489e5dSAlfredo Cardigliano 		__le32 queue_count[IONIC_QTYPE_MAX];
391*e7750639SAndre Muezerie 	} __rte_packed_end;
39201489e5dSAlfredo Cardigliano 	__le32 words[64];
39301489e5dSAlfredo Cardigliano };
39401489e5dSAlfredo Cardigliano 
39501489e5dSAlfredo Cardigliano /**
396126fe197SAndrew Boyer  * struct ionic_lif_identity - LIF identity information (type-specific)
39701489e5dSAlfredo Cardigliano  *
398126fe197SAndrew Boyer  * @capabilities:        LIF capabilities
39901489e5dSAlfredo Cardigliano  *
400126fe197SAndrew Boyer  * @eth:                    Ethernet identify structure
401126fe197SAndrew Boyer  *     @version:            Ethernet identify structure version
402126fe197SAndrew Boyer  *     @max_ucast_filters:  Number of perfect unicast addresses supported
403126fe197SAndrew Boyer  *     @max_mcast_filters:  Number of perfect multicast addresses supported
404b671e69aSAndrew Boyer  *     @min_mtu:            Minimum MTU of frames to be sent
405b671e69aSAndrew Boyer  *     @max_mtu:            Maximum MTU of frames to be sent
40601489e5dSAlfredo Cardigliano  *     @config:             LIF config struct with features, mtu, mac, q counts
40701489e5dSAlfredo Cardigliano  *
408126fe197SAndrew Boyer  * @rdma:                RDMA identify structure
409126fe197SAndrew Boyer  *     @version:         RDMA version of opcodes and queue descriptors
410126fe197SAndrew Boyer  *     @qp_opcodes:      Number of RDMA queue pair opcodes supported
411126fe197SAndrew Boyer  *     @admin_opcodes:   Number of RDMA admin opcodes supported
412126fe197SAndrew Boyer  *     @npts_per_lif:    Page table size per LIF
413126fe197SAndrew Boyer  *     @nmrs_per_lif:    Number of memory regions per LIF
414126fe197SAndrew Boyer  *     @nahs_per_lif:    Number of address handles per LIF
415126fe197SAndrew Boyer  *     @max_stride:      Max work request stride
416126fe197SAndrew Boyer  *     @cl_stride:       Cache line stride
417126fe197SAndrew Boyer  *     @pte_stride:      Page table entry stride
418126fe197SAndrew Boyer  *     @rrq_stride:      Remote RQ work request stride
419126fe197SAndrew Boyer  *     @rsq_stride:      Remote SQ work request stride
42001489e5dSAlfredo Cardigliano  *     @dcqcn_profiles:  Number of DCQCN profiles
421126fe197SAndrew Boyer  *     @aq_qtype:        RDMA Admin Qtype
422126fe197SAndrew Boyer  *     @sq_qtype:        RDMA Send Qtype
423126fe197SAndrew Boyer  *     @rq_qtype:        RDMA Receive Qtype
424126fe197SAndrew Boyer  *     @cq_qtype:        RDMA Completion Qtype
425126fe197SAndrew Boyer  *     @eq_qtype:        RDMA Event Qtype
42601489e5dSAlfredo Cardigliano  */
42701489e5dSAlfredo Cardigliano union ionic_lif_identity {
428*e7750639SAndre Muezerie 	struct __rte_packed_begin {
42901489e5dSAlfredo Cardigliano 		__le64 capabilities;
43001489e5dSAlfredo Cardigliano 
431*e7750639SAndre Muezerie 		struct __rte_packed_begin {
43201489e5dSAlfredo Cardigliano 			u8 version;
43301489e5dSAlfredo Cardigliano 			u8 rsvd[3];
43401489e5dSAlfredo Cardigliano 			__le32 max_ucast_filters;
43501489e5dSAlfredo Cardigliano 			__le32 max_mcast_filters;
43601489e5dSAlfredo Cardigliano 			__le16 rss_ind_tbl_sz;
437b671e69aSAndrew Boyer 			__le32 min_mtu;
438b671e69aSAndrew Boyer 			__le32 max_mtu;
43901489e5dSAlfredo Cardigliano 			u8 rsvd2[106];
44001489e5dSAlfredo Cardigliano 			union ionic_lif_config config;
441*e7750639SAndre Muezerie 		} __rte_packed_end eth;
44201489e5dSAlfredo Cardigliano 
443*e7750639SAndre Muezerie 		struct __rte_packed_begin {
44401489e5dSAlfredo Cardigliano 			u8 version;
44501489e5dSAlfredo Cardigliano 			u8 qp_opcodes;
44601489e5dSAlfredo Cardigliano 			u8 admin_opcodes;
44701489e5dSAlfredo Cardigliano 			u8 rsvd;
44801489e5dSAlfredo Cardigliano 			__le32 npts_per_lif;
44901489e5dSAlfredo Cardigliano 			__le32 nmrs_per_lif;
45001489e5dSAlfredo Cardigliano 			__le32 nahs_per_lif;
45101489e5dSAlfredo Cardigliano 			u8 max_stride;
45201489e5dSAlfredo Cardigliano 			u8 cl_stride;
45301489e5dSAlfredo Cardigliano 			u8 pte_stride;
45401489e5dSAlfredo Cardigliano 			u8 rrq_stride;
45501489e5dSAlfredo Cardigliano 			u8 rsq_stride;
45601489e5dSAlfredo Cardigliano 			u8 dcqcn_profiles;
45701489e5dSAlfredo Cardigliano 			u8 rsvd_dimensions[10];
45801489e5dSAlfredo Cardigliano 			struct ionic_lif_logical_qtype aq_qtype;
45901489e5dSAlfredo Cardigliano 			struct ionic_lif_logical_qtype sq_qtype;
46001489e5dSAlfredo Cardigliano 			struct ionic_lif_logical_qtype rq_qtype;
46101489e5dSAlfredo Cardigliano 			struct ionic_lif_logical_qtype cq_qtype;
46201489e5dSAlfredo Cardigliano 			struct ionic_lif_logical_qtype eq_qtype;
463*e7750639SAndre Muezerie 		} __rte_packed_end rdma;
464*e7750639SAndre Muezerie 	} __rte_packed_end;
465126fe197SAndrew Boyer 	__le32 words[478];
46601489e5dSAlfredo Cardigliano };
46701489e5dSAlfredo Cardigliano 
46801489e5dSAlfredo Cardigliano /**
46901489e5dSAlfredo Cardigliano  * struct ionic_lif_init_cmd - LIF init command
470126fe197SAndrew Boyer  * @opcode:       Opcode
471126fe197SAndrew Boyer  * @type:         LIF type (enum ionic_lif_type)
47201489e5dSAlfredo Cardigliano  * @index:        LIF index
473126fe197SAndrew Boyer  * @info_pa:      Destination address for LIF info (struct ionic_lif_info)
47401489e5dSAlfredo Cardigliano  */
47501489e5dSAlfredo Cardigliano struct ionic_lif_init_cmd {
47601489e5dSAlfredo Cardigliano 	u8     opcode;
47701489e5dSAlfredo Cardigliano 	u8     type;
47801489e5dSAlfredo Cardigliano 	__le16 index;
47901489e5dSAlfredo Cardigliano 	__le32 rsvd;
48001489e5dSAlfredo Cardigliano 	__le64 info_pa;
48101489e5dSAlfredo Cardigliano 	u8     rsvd2[48];
48201489e5dSAlfredo Cardigliano };
48301489e5dSAlfredo Cardigliano 
48401489e5dSAlfredo Cardigliano /**
48501489e5dSAlfredo Cardigliano  * struct ionic_lif_init_comp - LIF init command completion
486126fe197SAndrew Boyer  * @status:	Status of the command (enum ionic_status_code)
487126fe197SAndrew Boyer  * @hw_index:	Hardware index of the initialized LIF
48801489e5dSAlfredo Cardigliano  */
48901489e5dSAlfredo Cardigliano struct ionic_lif_init_comp {
49001489e5dSAlfredo Cardigliano 	u8 status;
49101489e5dSAlfredo Cardigliano 	u8 rsvd;
49201489e5dSAlfredo Cardigliano 	__le16 hw_index;
49301489e5dSAlfredo Cardigliano 	u8 rsvd2[12];
49401489e5dSAlfredo Cardigliano };
49501489e5dSAlfredo Cardigliano 
49601489e5dSAlfredo Cardigliano /**
497126fe197SAndrew Boyer  * struct ionic_q_identify_cmd - queue identify command
498126fe197SAndrew Boyer  * @opcode:     opcode
499126fe197SAndrew Boyer  * @lif_type:   LIF type (enum ionic_lif_type)
500126fe197SAndrew Boyer  * @type:       Logical queue type (enum ionic_logical_qtype)
501126fe197SAndrew Boyer  * @ver:        Highest queue type version that the driver supports
502126fe197SAndrew Boyer  */
503126fe197SAndrew Boyer struct ionic_q_identify_cmd {
504126fe197SAndrew Boyer 	u8     opcode;
505126fe197SAndrew Boyer 	u8     rsvd;
506126fe197SAndrew Boyer 	__le16 lif_type;
507126fe197SAndrew Boyer 	u8     type;
508126fe197SAndrew Boyer 	u8     ver;
509126fe197SAndrew Boyer 	u8     rsvd2[58];
510126fe197SAndrew Boyer };
511126fe197SAndrew Boyer 
512126fe197SAndrew Boyer /**
513126fe197SAndrew Boyer  * struct ionic_q_identify_comp - queue identify command completion
514126fe197SAndrew Boyer  * @status:     Status of the command (enum ionic_status_code)
515126fe197SAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
516126fe197SAndrew Boyer  * @ver:        Queue type version that can be used with FW
517126fe197SAndrew Boyer  */
518126fe197SAndrew Boyer struct ionic_q_identify_comp {
519126fe197SAndrew Boyer 	u8     status;
520126fe197SAndrew Boyer 	u8     rsvd;
521126fe197SAndrew Boyer 	__le16 comp_index;
522126fe197SAndrew Boyer 	u8     ver;
523126fe197SAndrew Boyer 	u8     rsvd2[11];
524126fe197SAndrew Boyer };
525126fe197SAndrew Boyer 
526126fe197SAndrew Boyer /**
527126fe197SAndrew Boyer  * union ionic_q_identity - queue identity information
528126fe197SAndrew Boyer  *     @version:        Queue type version that can be used with FW
529126fe197SAndrew Boyer  *     @supported:      Bitfield of queue versions, first bit = ver 0
530126fe197SAndrew Boyer  *     @features:       Queue features
531126fe197SAndrew Boyer  *     @desc_sz:        Descriptor size
532126fe197SAndrew Boyer  *     @comp_sz:        Completion descriptor size
533126fe197SAndrew Boyer  *     @sg_desc_sz:     Scatter/Gather descriptor size
534126fe197SAndrew Boyer  *     @max_sg_elems:   Maximum number of Scatter/Gather elements
535126fe197SAndrew Boyer  *     @sg_desc_stride: Number of Scatter/Gather elements per descriptor
536126fe197SAndrew Boyer  */
537126fe197SAndrew Boyer union ionic_q_identity {
538126fe197SAndrew Boyer 	struct {
539126fe197SAndrew Boyer 		u8      version;
540126fe197SAndrew Boyer 		u8      supported;
541126fe197SAndrew Boyer 		u8      rsvd[6];
542126fe197SAndrew Boyer #define IONIC_QIDENT_F_CQ	0x01	/* queue has completion ring */
543126fe197SAndrew Boyer #define IONIC_QIDENT_F_SG	0x02	/* queue has scatter/gather ring */
544126fe197SAndrew Boyer #define IONIC_QIDENT_F_EQ	0x04	/* queue can use event queue */
545126fe197SAndrew Boyer #define IONIC_QIDENT_F_CMB	0x08	/* queue is in cmb bar */
546126fe197SAndrew Boyer 		__le64  features;
547126fe197SAndrew Boyer 		__le16  desc_sz;
548126fe197SAndrew Boyer 		__le16  comp_sz;
549126fe197SAndrew Boyer 		__le16  sg_desc_sz;
550126fe197SAndrew Boyer 		__le16  max_sg_elems;
551126fe197SAndrew Boyer 		__le16  sg_desc_stride;
552126fe197SAndrew Boyer 	};
553126fe197SAndrew Boyer 	__le32 words[478];
554126fe197SAndrew Boyer };
555126fe197SAndrew Boyer 
556126fe197SAndrew Boyer /**
55701489e5dSAlfredo Cardigliano  * struct ionic_q_init_cmd - Queue init command
55801489e5dSAlfredo Cardigliano  * @opcode:       opcode
55901489e5dSAlfredo Cardigliano  * @type:         Logical queue type
560126fe197SAndrew Boyer  * @ver:          Queue type version
56101489e5dSAlfredo Cardigliano  * @lif_index:    LIF index
562126fe197SAndrew Boyer  * @index:        (LIF, qtype) relative admin queue index
563126fe197SAndrew Boyer  * @intr_index:   Interrupt control register index, or Event queue index
56401489e5dSAlfredo Cardigliano  * @pid:          Process ID
56501489e5dSAlfredo Cardigliano  * @flags:
56601489e5dSAlfredo Cardigliano  *    IRQ:        Interrupt requested on completion
56701489e5dSAlfredo Cardigliano  *    ENA:        Enable the queue.  If ENA=0 the queue is initialized
56801489e5dSAlfredo Cardigliano  *                but remains disabled, to be later enabled with the
56901489e5dSAlfredo Cardigliano  *                Queue Enable command.  If ENA=1, then queue is
57001489e5dSAlfredo Cardigliano  *                initialized and then enabled.
57101489e5dSAlfredo Cardigliano  *    SG:         Enable Scatter-Gather on the queue.
57201489e5dSAlfredo Cardigliano  *                in number of descs.  The actual ring size is
57301489e5dSAlfredo Cardigliano  *                (1 << ring_size).  For example, to
57401489e5dSAlfredo Cardigliano  *                select a ring size of 64 descriptors write
57501489e5dSAlfredo Cardigliano  *                ring_size = 6.  The minimum ring_size value is 2
57601489e5dSAlfredo Cardigliano  *                for a ring size of 4 descriptors.  The maximum
57701489e5dSAlfredo Cardigliano  *                ring_size value is 16 for a ring size of 64k
57801489e5dSAlfredo Cardigliano  *                descriptors.  Values of ring_size <2 and >16 are
57901489e5dSAlfredo Cardigliano  *                reserved.
58001489e5dSAlfredo Cardigliano  *    EQ:         Enable the Event Queue
581126fe197SAndrew Boyer  * @cos:          Class of service for this queue
58201489e5dSAlfredo Cardigliano  * @ring_size:    Queue ring size, encoded as a log2(size)
58301489e5dSAlfredo Cardigliano  * @ring_base:    Queue ring base address
58401489e5dSAlfredo Cardigliano  * @cq_ring_base: Completion queue ring base address
58501489e5dSAlfredo Cardigliano  * @sg_ring_base: Scatter/Gather ring base address
58601489e5dSAlfredo Cardigliano  */
587*e7750639SAndre Muezerie struct __rte_packed_begin ionic_q_init_cmd {
58801489e5dSAlfredo Cardigliano 	u8     opcode;
58901489e5dSAlfredo Cardigliano 	u8     rsvd;
59001489e5dSAlfredo Cardigliano 	__le16 lif_index;
59101489e5dSAlfredo Cardigliano 	u8     type;
59201489e5dSAlfredo Cardigliano 	u8     ver;
59301489e5dSAlfredo Cardigliano 	u8     rsvd1[2];
59401489e5dSAlfredo Cardigliano 	__le32 index;
59501489e5dSAlfredo Cardigliano 	__le16 pid;
59601489e5dSAlfredo Cardigliano 	__le16 intr_index;
59701489e5dSAlfredo Cardigliano 	__le16 flags;
59801489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_IRQ	0x01	/* Request interrupt on completion */
59901489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_ENA	0x02	/* Enable the queue */
60001489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_SG	0x04	/* Enable scatter/gather on the queue */
60101489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_EQ	0x08	/* Enable event queue */
602126fe197SAndrew Boyer #define IONIC_QINIT_F_CMB	0x10	/* Enable cmb-based queue */
60301489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_DEBUG	0x80	/* Enable queue debugging */
60401489e5dSAlfredo Cardigliano 	u8     cos;
60501489e5dSAlfredo Cardigliano 	u8     ring_size;
60601489e5dSAlfredo Cardigliano 	__le64 ring_base;
60701489e5dSAlfredo Cardigliano 	__le64 cq_ring_base;
60801489e5dSAlfredo Cardigliano 	__le64 sg_ring_base;
609126fe197SAndrew Boyer 	u8     rsvd2[20];
610*e7750639SAndre Muezerie } __rte_packed_end;
61101489e5dSAlfredo Cardigliano 
61201489e5dSAlfredo Cardigliano /**
61301489e5dSAlfredo Cardigliano  * struct ionic_q_init_comp - Queue init command completion
614126fe197SAndrew Boyer  * @status:     Status of the command (enum ionic_status_code)
615126fe197SAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
61601489e5dSAlfredo Cardigliano  * @hw_index:   Hardware Queue ID
61701489e5dSAlfredo Cardigliano  * @hw_type:    Hardware Queue type
61801489e5dSAlfredo Cardigliano  * @color:      Color
61901489e5dSAlfredo Cardigliano  */
62001489e5dSAlfredo Cardigliano struct ionic_q_init_comp {
62101489e5dSAlfredo Cardigliano 	u8     status;
622126fe197SAndrew Boyer 	u8     rsvd;
62301489e5dSAlfredo Cardigliano 	__le16 comp_index;
62401489e5dSAlfredo Cardigliano 	__le32 hw_index;
62501489e5dSAlfredo Cardigliano 	u8     hw_type;
62601489e5dSAlfredo Cardigliano 	u8     rsvd2[6];
62701489e5dSAlfredo Cardigliano 	u8     color;
62801489e5dSAlfredo Cardigliano };
62901489e5dSAlfredo Cardigliano 
63001489e5dSAlfredo Cardigliano /* the device's internal addressing uses up to 52 bits */
63101489e5dSAlfredo Cardigliano #define IONIC_ADDR_LEN		52
63201489e5dSAlfredo Cardigliano #define IONIC_ADDR_MASK		(BIT_ULL(IONIC_ADDR_LEN) - 1)
63301489e5dSAlfredo Cardigliano 
63401489e5dSAlfredo Cardigliano enum ionic_txq_desc_opcode {
63501489e5dSAlfredo Cardigliano 	IONIC_TXQ_DESC_OPCODE_CSUM_NONE = 0,
63601489e5dSAlfredo Cardigliano 	IONIC_TXQ_DESC_OPCODE_CSUM_PARTIAL = 1,
63701489e5dSAlfredo Cardigliano 	IONIC_TXQ_DESC_OPCODE_CSUM_HW = 2,
63801489e5dSAlfredo Cardigliano 	IONIC_TXQ_DESC_OPCODE_TSO = 3,
63901489e5dSAlfredo Cardigliano };
64001489e5dSAlfredo Cardigliano 
64101489e5dSAlfredo Cardigliano /**
64201489e5dSAlfredo Cardigliano  * struct ionic_txq_desc - Ethernet Tx queue descriptor format
643126fe197SAndrew Boyer  * @cmd:          Tx operation, see IONIC_TXQ_DESC_OPCODE_*:
64401489e5dSAlfredo Cardigliano  *
64501489e5dSAlfredo Cardigliano  *                   IONIC_TXQ_DESC_OPCODE_CSUM_NONE:
64601489e5dSAlfredo Cardigliano  *                      Non-offload send.  No segmentation,
64701489e5dSAlfredo Cardigliano  *                      fragmentation or checksum calc/insertion is
64801489e5dSAlfredo Cardigliano  *                      performed by device; packet is prepared
64901489e5dSAlfredo Cardigliano  *                      to send by software stack and requires
65001489e5dSAlfredo Cardigliano  *                      no further manipulation from device.
65101489e5dSAlfredo Cardigliano  *
65201489e5dSAlfredo Cardigliano  *                   IONIC_TXQ_DESC_OPCODE_CSUM_PARTIAL:
65301489e5dSAlfredo Cardigliano  *                      Offload 16-bit L4 checksum
65401489e5dSAlfredo Cardigliano  *                      calculation/insertion.  The device will
65501489e5dSAlfredo Cardigliano  *                      calculate the L4 checksum value and
65601489e5dSAlfredo Cardigliano  *                      insert the result in the packet's L4
65701489e5dSAlfredo Cardigliano  *                      header checksum field.  The L4 checksum
65801489e5dSAlfredo Cardigliano  *                      is calculated starting at @csum_start bytes
65901489e5dSAlfredo Cardigliano  *                      into the packet to the end of the packet.
66001489e5dSAlfredo Cardigliano  *                      The checksum insertion position is given
661126fe197SAndrew Boyer  *                      in @csum_offset, which is the offset from
662126fe197SAndrew Boyer  *                      @csum_start to the checksum field in the L4
663126fe197SAndrew Boyer  *                      header.  This feature is only applicable to
664126fe197SAndrew Boyer  *                      protocols such as TCP, UDP and ICMP where a
665126fe197SAndrew Boyer  *                      standard (i.e. the 'IP-style' checksum)
666126fe197SAndrew Boyer  *                      one's complement 16-bit checksum is used,
667126fe197SAndrew Boyer  *                      using an IP pseudo-header to seed the
668126fe197SAndrew Boyer  *                      calculation.  Software will preload the L4
669126fe197SAndrew Boyer  *                      checksum field with the IP pseudo-header
670126fe197SAndrew Boyer  *                      checksum.
67101489e5dSAlfredo Cardigliano  *
67201489e5dSAlfredo Cardigliano  *                      For tunnel encapsulation, @csum_start and
67301489e5dSAlfredo Cardigliano  *                      @csum_offset refer to the inner L4
67401489e5dSAlfredo Cardigliano  *                      header.  Supported tunnels encapsulations
67501489e5dSAlfredo Cardigliano  *                      are: IPIP, GRE, and UDP.  If the @encap
67601489e5dSAlfredo Cardigliano  *                      is clear, no further processing by the
67701489e5dSAlfredo Cardigliano  *                      device is required; software will
67801489e5dSAlfredo Cardigliano  *                      calculate the outer header checksums.  If
67901489e5dSAlfredo Cardigliano  *                      the @encap is set, the device will
68001489e5dSAlfredo Cardigliano  *                      offload the outer header checksums using
68101489e5dSAlfredo Cardigliano  *                      LCO (local checksum offload) (see
682126fe197SAndrew Boyer  *                      Documentation/networking/checksum-offloads.rst
683126fe197SAndrew Boyer  *                      for more info).
68401489e5dSAlfredo Cardigliano  *
68501489e5dSAlfredo Cardigliano  *                   IONIC_TXQ_DESC_OPCODE_CSUM_HW:
68601489e5dSAlfredo Cardigliano  *                      Offload 16-bit checksum computation to hardware.
68701489e5dSAlfredo Cardigliano  *                      If @csum_l3 is set then the packet's L3 checksum is
688b53d106dSSean Morrissey  *                      updated. Similarly, if @csum_l4 is set the L4
68901489e5dSAlfredo Cardigliano  *                      checksum is updated. If @encap is set then encap header
69001489e5dSAlfredo Cardigliano  *                      checksums are also updated.
69101489e5dSAlfredo Cardigliano  *
69201489e5dSAlfredo Cardigliano  *                   IONIC_TXQ_DESC_OPCODE_TSO:
69301489e5dSAlfredo Cardigliano  *                      Device performs TCP segmentation offload
69401489e5dSAlfredo Cardigliano  *                      (TSO).  @hdr_len is the number of bytes
69501489e5dSAlfredo Cardigliano  *                      to the end of TCP header (the offset to
69601489e5dSAlfredo Cardigliano  *                      the TCP payload).  @mss is the desired
69701489e5dSAlfredo Cardigliano  *                      MSS, the TCP payload length for each
69801489e5dSAlfredo Cardigliano  *                      segment.  The device will calculate/
69901489e5dSAlfredo Cardigliano  *                      insert IP (IPv4 only) and TCP checksums
70001489e5dSAlfredo Cardigliano  *                      for each segment.  In the first data
70101489e5dSAlfredo Cardigliano  *                      buffer containing the header template,
70201489e5dSAlfredo Cardigliano  *                      the driver will set IPv4 checksum to 0
70301489e5dSAlfredo Cardigliano  *                      and preload TCP checksum with the IP
70401489e5dSAlfredo Cardigliano  *                      pseudo header calculated with IP length = 0.
70501489e5dSAlfredo Cardigliano  *
70601489e5dSAlfredo Cardigliano  *                      Supported tunnel encapsulations are IPIP,
70701489e5dSAlfredo Cardigliano  *                      layer-3 GRE, and UDP. @hdr_len includes
70801489e5dSAlfredo Cardigliano  *                      both outer and inner headers.  The driver
70901489e5dSAlfredo Cardigliano  *                      will set IPv4 checksum to zero and
71001489e5dSAlfredo Cardigliano  *                      preload TCP checksum with IP pseudo
71101489e5dSAlfredo Cardigliano  *                      header on the inner header.
71201489e5dSAlfredo Cardigliano  *
71301489e5dSAlfredo Cardigliano  *                      TCP ECN offload is supported.  The device
71401489e5dSAlfredo Cardigliano  *                      will set CWR flag in the first segment if
71501489e5dSAlfredo Cardigliano  *                      CWR is set in the template header, and
71601489e5dSAlfredo Cardigliano  *                      clear CWR in remaining segments.
71701489e5dSAlfredo Cardigliano  * @flags:
71801489e5dSAlfredo Cardigliano  *                vlan:
719126fe197SAndrew Boyer  *                    Insert an L2 VLAN header using @vlan_tci
72001489e5dSAlfredo Cardigliano  *                encap:
721126fe197SAndrew Boyer  *                    Calculate encap header checksum
72201489e5dSAlfredo Cardigliano  *                csum_l3:
723126fe197SAndrew Boyer  *                    Compute L3 header checksum
72401489e5dSAlfredo Cardigliano  *                csum_l4:
725126fe197SAndrew Boyer  *                    Compute L4 header checksum
72601489e5dSAlfredo Cardigliano  *                tso_sot:
72701489e5dSAlfredo Cardigliano  *                    TSO start
72801489e5dSAlfredo Cardigliano  *                tso_eot:
72901489e5dSAlfredo Cardigliano  *                    TSO end
73001489e5dSAlfredo Cardigliano  * @num_sg_elems: Number of scatter-gather elements in SG
73101489e5dSAlfredo Cardigliano  *                descriptor
732126fe197SAndrew Boyer  * @addr:         First data buffer's DMA address
733126fe197SAndrew Boyer  *                (Subsequent data buffers are on txq_sg_desc)
73401489e5dSAlfredo Cardigliano  * @len:          First data buffer's length, in bytes
73501489e5dSAlfredo Cardigliano  * @vlan_tci:     VLAN tag to insert in the packet (if requested
73601489e5dSAlfredo Cardigliano  *                by @V-bit).  Includes .1p and .1q tags
73701489e5dSAlfredo Cardigliano  * @hdr_len:      Length of packet headers, including
738126fe197SAndrew Boyer  *                encapsulating outer header, if applicable
739126fe197SAndrew Boyer  *                Valid for opcodes IONIC_TXQ_DESC_OPCODE_CALC_CSUM and
740126fe197SAndrew Boyer  *                IONIC_TXQ_DESC_OPCODE_TSO.  Should be set to zero for
74101489e5dSAlfredo Cardigliano  *                all other modes.  For
742126fe197SAndrew Boyer  *                IONIC_TXQ_DESC_OPCODE_CALC_CSUM, @hdr_len is length
74301489e5dSAlfredo Cardigliano  *                of headers up to inner-most L4 header.  For
744126fe197SAndrew Boyer  *                IONIC_TXQ_DESC_OPCODE_TSO, @hdr_len is up to
74501489e5dSAlfredo Cardigliano  *                inner-most L4 payload, so inclusive of
74601489e5dSAlfredo Cardigliano  *                inner-most L4 header.
747126fe197SAndrew Boyer  * @mss:          Desired MSS value for TSO; only applicable for
748126fe197SAndrew Boyer  *                IONIC_TXQ_DESC_OPCODE_TSO
749126fe197SAndrew Boyer  * @csum_start:   Offset from packet to first byte checked in L4 checksum
750126fe197SAndrew Boyer  * @csum_offset:  Offset from csum_start to L4 checksum field
75101489e5dSAlfredo Cardigliano  */
752126fe197SAndrew Boyer struct ionic_txq_desc {
753126fe197SAndrew Boyer 	__le64  cmd;
75401489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_OPCODE_MASK		0xf
75501489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_OPCODE_SHIFT		4
75601489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAGS_MASK		0xf
75701489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAGS_SHIFT		0
75801489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_NSGE_MASK		0xf
75901489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_NSGE_SHIFT		8
76001489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_ADDR_MASK		(BIT_ULL(IONIC_ADDR_LEN) - 1)
76101489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_ADDR_SHIFT		12
76201489e5dSAlfredo Cardigliano 
76301489e5dSAlfredo Cardigliano /* common flags */
76401489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_VLAN		0x1
76501489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_ENCAP		0x2
76601489e5dSAlfredo Cardigliano 
76701489e5dSAlfredo Cardigliano /* flags for csum_hw opcode */
76801489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_CSUM_L3		0x4
76901489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_CSUM_L4		0x8
77001489e5dSAlfredo Cardigliano 
77101489e5dSAlfredo Cardigliano /* flags for tso opcode */
77201489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_TSO_SOT		0x4
77301489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_TSO_EOT		0x8
77401489e5dSAlfredo Cardigliano 
77501489e5dSAlfredo Cardigliano 	__le16  len;
77601489e5dSAlfredo Cardigliano 	union {
77701489e5dSAlfredo Cardigliano 		__le16  vlan_tci;
77801489e5dSAlfredo Cardigliano 		__le16  hword0;
77901489e5dSAlfredo Cardigliano 	};
78001489e5dSAlfredo Cardigliano 	union {
78101489e5dSAlfredo Cardigliano 		__le16  csum_start;
78201489e5dSAlfredo Cardigliano 		__le16  hdr_len;
78301489e5dSAlfredo Cardigliano 		__le16  hword1;
78401489e5dSAlfredo Cardigliano 	};
78501489e5dSAlfredo Cardigliano 	union {
78601489e5dSAlfredo Cardigliano 		__le16  csum_offset;
78701489e5dSAlfredo Cardigliano 		__le16  mss;
78801489e5dSAlfredo Cardigliano 		__le16  hword2;
78901489e5dSAlfredo Cardigliano 	};
79001489e5dSAlfredo Cardigliano };
79101489e5dSAlfredo Cardigliano 
79201489e5dSAlfredo Cardigliano static inline u64 encode_txq_desc_cmd(u8 opcode, u8 flags,
79301489e5dSAlfredo Cardigliano 				      u8 nsge, u64 addr)
79401489e5dSAlfredo Cardigliano {
79501489e5dSAlfredo Cardigliano 	u64 cmd;
79601489e5dSAlfredo Cardigliano 
79701489e5dSAlfredo Cardigliano 	cmd = (opcode & IONIC_TXQ_DESC_OPCODE_MASK) <<
79801489e5dSAlfredo Cardigliano 		IONIC_TXQ_DESC_OPCODE_SHIFT;
79901489e5dSAlfredo Cardigliano 	cmd |= (flags & IONIC_TXQ_DESC_FLAGS_MASK) <<
80001489e5dSAlfredo Cardigliano 		IONIC_TXQ_DESC_FLAGS_SHIFT;
801126fe197SAndrew Boyer 	cmd |= (nsge & IONIC_TXQ_DESC_NSGE_MASK) <<
802126fe197SAndrew Boyer 		IONIC_TXQ_DESC_NSGE_SHIFT;
803126fe197SAndrew Boyer 	cmd |= (addr & IONIC_TXQ_DESC_ADDR_MASK) <<
804126fe197SAndrew Boyer 		IONIC_TXQ_DESC_ADDR_SHIFT;
80501489e5dSAlfredo Cardigliano 
80601489e5dSAlfredo Cardigliano 	return cmd;
80701489e5dSAlfredo Cardigliano };
80801489e5dSAlfredo Cardigliano 
809126fe197SAndrew Boyer static inline void
810126fe197SAndrew Boyer decode_txq_desc_cmd(u64 cmd, u8 *opcode, u8 *flags,
81101489e5dSAlfredo Cardigliano 				       u8 *nsge, u64 *addr)
81201489e5dSAlfredo Cardigliano {
81301489e5dSAlfredo Cardigliano 	*opcode = (cmd >> IONIC_TXQ_DESC_OPCODE_SHIFT) &
81401489e5dSAlfredo Cardigliano 		IONIC_TXQ_DESC_OPCODE_MASK;
81501489e5dSAlfredo Cardigliano 	*flags = (cmd >> IONIC_TXQ_DESC_FLAGS_SHIFT) &
81601489e5dSAlfredo Cardigliano 		IONIC_TXQ_DESC_FLAGS_MASK;
817126fe197SAndrew Boyer 	*nsge = (cmd >> IONIC_TXQ_DESC_NSGE_SHIFT) &
818126fe197SAndrew Boyer 		IONIC_TXQ_DESC_NSGE_MASK;
819126fe197SAndrew Boyer 	*addr = (cmd >> IONIC_TXQ_DESC_ADDR_SHIFT) &
820126fe197SAndrew Boyer 		IONIC_TXQ_DESC_ADDR_MASK;
82101489e5dSAlfredo Cardigliano };
82201489e5dSAlfredo Cardigliano 
82301489e5dSAlfredo Cardigliano /**
824126fe197SAndrew Boyer  * struct ionic_txq_sg_elem - Transmit scatter-gather (SG) descriptor element
82501489e5dSAlfredo Cardigliano  * @addr:      DMA address of SG element data buffer
82601489e5dSAlfredo Cardigliano  * @len:       Length of SG element data buffer, in bytes
82701489e5dSAlfredo Cardigliano  */
82801489e5dSAlfredo Cardigliano struct ionic_txq_sg_elem {
82901489e5dSAlfredo Cardigliano 	__le64 addr;
83001489e5dSAlfredo Cardigliano 	__le16 len;
83101489e5dSAlfredo Cardigliano 	__le16 rsvd[3];
832126fe197SAndrew Boyer };
833126fe197SAndrew Boyer 
834126fe197SAndrew Boyer /**
835126fe197SAndrew Boyer  * struct ionic_txq_sg_desc - Transmit scatter-gather (SG) list
836126fe197SAndrew Boyer  * @elems:     Scatter-gather elements
837126fe197SAndrew Boyer  */
838126fe197SAndrew Boyer struct ionic_txq_sg_desc {
839126fe197SAndrew Boyer #define IONIC_TX_MAX_SG_ELEMS		8
840126fe197SAndrew Boyer #define IONIC_TX_SG_DESC_STRIDE		8
841126fe197SAndrew Boyer 	struct ionic_txq_sg_elem elems[IONIC_TX_MAX_SG_ELEMS];
842126fe197SAndrew Boyer };
843126fe197SAndrew Boyer 
844126fe197SAndrew Boyer struct ionic_txq_sg_desc_v1 {
845126fe197SAndrew Boyer #define IONIC_TX_MAX_SG_ELEMS_V1		15
846126fe197SAndrew Boyer #define IONIC_TX_SG_DESC_STRIDE_V1		16
847126fe197SAndrew Boyer 	struct ionic_txq_sg_elem elems[IONIC_TX_SG_DESC_STRIDE_V1];
84801489e5dSAlfredo Cardigliano };
84901489e5dSAlfredo Cardigliano 
85001489e5dSAlfredo Cardigliano /**
85101489e5dSAlfredo Cardigliano  * struct ionic_txq_comp - Ethernet transmit queue completion descriptor
852126fe197SAndrew Boyer  * @status:     Status of the command (enum ionic_status_code)
853126fe197SAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
854126fe197SAndrew Boyer  * @color:      Color bit
85501489e5dSAlfredo Cardigliano  */
85601489e5dSAlfredo Cardigliano struct ionic_txq_comp {
85701489e5dSAlfredo Cardigliano 	u8     status;
85801489e5dSAlfredo Cardigliano 	u8     rsvd;
85901489e5dSAlfredo Cardigliano 	__le16 comp_index;
86001489e5dSAlfredo Cardigliano 	u8     rsvd2[11];
86101489e5dSAlfredo Cardigliano 	u8     color;
86201489e5dSAlfredo Cardigliano };
86301489e5dSAlfredo Cardigliano 
86401489e5dSAlfredo Cardigliano enum ionic_rxq_desc_opcode {
86501489e5dSAlfredo Cardigliano 	IONIC_RXQ_DESC_OPCODE_SIMPLE = 0,
86601489e5dSAlfredo Cardigliano 	IONIC_RXQ_DESC_OPCODE_SG = 1,
86701489e5dSAlfredo Cardigliano };
86801489e5dSAlfredo Cardigliano 
86901489e5dSAlfredo Cardigliano /**
87001489e5dSAlfredo Cardigliano  * struct ionic_rxq_desc - Ethernet Rx queue descriptor format
871126fe197SAndrew Boyer  * @opcode:       Rx operation, see IONIC_RXQ_DESC_OPCODE_*:
87201489e5dSAlfredo Cardigliano  *
873126fe197SAndrew Boyer  *                   IONIC_RXQ_DESC_OPCODE_SIMPLE:
87401489e5dSAlfredo Cardigliano  *                      Receive full packet into data buffer
87501489e5dSAlfredo Cardigliano  *                      starting at @addr.  Results of
87601489e5dSAlfredo Cardigliano  *                      receive, including actual bytes received,
87701489e5dSAlfredo Cardigliano  *                      are recorded in Rx completion descriptor.
87801489e5dSAlfredo Cardigliano  *
879126fe197SAndrew Boyer  * @len:          Data buffer's length, in bytes
88001489e5dSAlfredo Cardigliano  * @addr:         Data buffer's DMA address
88101489e5dSAlfredo Cardigliano  */
88201489e5dSAlfredo Cardigliano struct ionic_rxq_desc {
88301489e5dSAlfredo Cardigliano 	u8     opcode;
88401489e5dSAlfredo Cardigliano 	u8     rsvd[5];
88501489e5dSAlfredo Cardigliano 	__le16 len;
88601489e5dSAlfredo Cardigliano 	__le64 addr;
88701489e5dSAlfredo Cardigliano };
88801489e5dSAlfredo Cardigliano 
88901489e5dSAlfredo Cardigliano /**
890126fe197SAndrew Boyer  * struct ionic_rxq_sg_elem - Receive scatter-gather (SG) descriptor element
89101489e5dSAlfredo Cardigliano  * @addr:      DMA address of SG element data buffer
89201489e5dSAlfredo Cardigliano  * @len:       Length of SG element data buffer, in bytes
89301489e5dSAlfredo Cardigliano  */
89401489e5dSAlfredo Cardigliano struct ionic_rxq_sg_elem {
89501489e5dSAlfredo Cardigliano 	__le64 addr;
89601489e5dSAlfredo Cardigliano 	__le16 len;
89701489e5dSAlfredo Cardigliano 	__le16 rsvd[3];
898126fe197SAndrew Boyer };
899126fe197SAndrew Boyer 
900126fe197SAndrew Boyer /**
901126fe197SAndrew Boyer  * struct ionic_rxq_sg_desc - Receive scatter-gather (SG) list
902126fe197SAndrew Boyer  * @elems:     Scatter-gather elements
903126fe197SAndrew Boyer  */
904126fe197SAndrew Boyer struct ionic_rxq_sg_desc {
905126fe197SAndrew Boyer #define IONIC_RX_MAX_SG_ELEMS		8
906126fe197SAndrew Boyer #define IONIC_RX_SG_DESC_STRIDE		8
907126fe197SAndrew Boyer 	struct ionic_rxq_sg_elem elems[IONIC_RX_SG_DESC_STRIDE];
90801489e5dSAlfredo Cardigliano };
90901489e5dSAlfredo Cardigliano 
91001489e5dSAlfredo Cardigliano /**
91101489e5dSAlfredo Cardigliano  * struct ionic_rxq_comp - Ethernet receive queue completion descriptor
912126fe197SAndrew Boyer  * @status:       Status of the command (enum ionic_status_code)
91301489e5dSAlfredo Cardigliano  * @num_sg_elems: Number of SG elements used by this descriptor
914126fe197SAndrew Boyer  * @comp_index:   Index in the descriptor ring for which this is the completion
91501489e5dSAlfredo Cardigliano  * @rss_hash:     32-bit RSS hash
916126fe197SAndrew Boyer  * @csum:         16-bit sum of the packet's L2 payload
91701489e5dSAlfredo Cardigliano  *                If the packet's L2 payload is odd length, an extra
91801489e5dSAlfredo Cardigliano  *                zero-value byte is included in the @csum calculation but
91901489e5dSAlfredo Cardigliano  *                not included in @len.
92001489e5dSAlfredo Cardigliano  * @vlan_tci:     VLAN tag stripped from the packet.  Valid if @VLAN is
92101489e5dSAlfredo Cardigliano  *                set.  Includes .1p and .1q tags.
92201489e5dSAlfredo Cardigliano  * @len:          Received packet length, in bytes.  Excludes FCS.
92301489e5dSAlfredo Cardigliano  * @csum_calc     L2 payload checksum is computed or not
924126fe197SAndrew Boyer  * @csum_flags:   See IONIC_RXQ_COMP_CSUM_F_*:
925126fe197SAndrew Boyer  *
926126fe197SAndrew Boyer  *                  IONIC_RXQ_COMP_CSUM_F_TCP_OK:
927126fe197SAndrew Boyer  *                    The TCP checksum calculated by the device
92801489e5dSAlfredo Cardigliano  *                    matched the checksum in the receive packet's
929126fe197SAndrew Boyer  *                    TCP header.
930126fe197SAndrew Boyer  *
931126fe197SAndrew Boyer  *                  IONIC_RXQ_COMP_CSUM_F_TCP_BAD:
932126fe197SAndrew Boyer  *                    The TCP checksum calculated by the device did
93301489e5dSAlfredo Cardigliano  *                    not match the checksum in the receive packet's
93401489e5dSAlfredo Cardigliano  *                    TCP header.
935126fe197SAndrew Boyer  *
936126fe197SAndrew Boyer  *                  IONIC_RXQ_COMP_CSUM_F_UDP_OK:
937126fe197SAndrew Boyer  *                    The UDP checksum calculated by the device
93801489e5dSAlfredo Cardigliano  *                    matched the checksum in the receive packet's
93901489e5dSAlfredo Cardigliano  *                    UDP header
940126fe197SAndrew Boyer  *
941126fe197SAndrew Boyer  *                  IONIC_RXQ_COMP_CSUM_F_UDP_BAD:
942126fe197SAndrew Boyer  *                    The UDP checksum calculated by the device did
94301489e5dSAlfredo Cardigliano  *                    not match the checksum in the receive packet's
94401489e5dSAlfredo Cardigliano  *                    UDP header.
945126fe197SAndrew Boyer  *
946126fe197SAndrew Boyer  *                  IONIC_RXQ_COMP_CSUM_F_IP_OK:
947126fe197SAndrew Boyer  *                    The IPv4 checksum calculated by the device
94801489e5dSAlfredo Cardigliano  *                    matched the checksum in the receive packet's
94901489e5dSAlfredo Cardigliano  *                    first IPv4 header.  If the receive packet
95001489e5dSAlfredo Cardigliano  *                    contains both a tunnel IPv4 header and a
95101489e5dSAlfredo Cardigliano  *                    transport IPv4 header, the device validates the
95201489e5dSAlfredo Cardigliano  *                    checksum for the both IPv4 headers.
953126fe197SAndrew Boyer  *
954126fe197SAndrew Boyer  *                  IONIC_RXQ_COMP_CSUM_F_IP_BAD:
955126fe197SAndrew Boyer  *                    The IPv4 checksum calculated by the device did
95601489e5dSAlfredo Cardigliano  *                    not match the checksum in the receive packet's
95701489e5dSAlfredo Cardigliano  *                    first IPv4 header. If the receive packet
95801489e5dSAlfredo Cardigliano  *                    contains both a tunnel IPv4 header and a
95901489e5dSAlfredo Cardigliano  *                    transport IPv4 header, the device validates the
96001489e5dSAlfredo Cardigliano  *                    checksum for both IP headers.
961126fe197SAndrew Boyer  *
962126fe197SAndrew Boyer  *                  IONIC_RXQ_COMP_CSUM_F_VLAN:
963126fe197SAndrew Boyer  *                    The VLAN header was stripped and placed in @vlan_tci.
964126fe197SAndrew Boyer  *
965126fe197SAndrew Boyer  *                  IONIC_RXQ_COMP_CSUM_F_CALC:
966126fe197SAndrew Boyer  *                    The checksum was calculated by the device.
967126fe197SAndrew Boyer  *
968126fe197SAndrew Boyer  * @pkt_type_color: Packet type and color bit; see IONIC_RXQ_COMP_PKT_TYPE_MASK
96901489e5dSAlfredo Cardigliano  */
97001489e5dSAlfredo Cardigliano struct ionic_rxq_comp {
97101489e5dSAlfredo Cardigliano 	u8     status;
97201489e5dSAlfredo Cardigliano 	u8     num_sg_elems;
97301489e5dSAlfredo Cardigliano 	__le16 comp_index;
97401489e5dSAlfredo Cardigliano 	__le32 rss_hash;
97501489e5dSAlfredo Cardigliano 	__le16 csum;
97601489e5dSAlfredo Cardigliano 	__le16 vlan_tci;
97701489e5dSAlfredo Cardigliano 	__le16 len;
97801489e5dSAlfredo Cardigliano 	u8     csum_flags;
97901489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_TCP_OK	0x01
98001489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_TCP_BAD	0x02
98101489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_UDP_OK	0x04
98201489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_UDP_BAD	0x08
98301489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_IP_OK	0x10
98401489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_IP_BAD	0x20
98501489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_VLAN	0x40
98601489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_CALC	0x80
98701489e5dSAlfredo Cardigliano 	u8     pkt_type_color;
9886645b283SAlfredo Cardigliano #define IONIC_RXQ_COMP_PKT_TYPE_MASK	0x7f
98901489e5dSAlfredo Cardigliano };
99001489e5dSAlfredo Cardigliano 
99101489e5dSAlfredo Cardigliano enum ionic_pkt_type {
992126fe197SAndrew Boyer 	IONIC_PKT_TYPE_NON_IP		= 0x00,
993126fe197SAndrew Boyer 	IONIC_PKT_TYPE_IPV4		= 0x01,
994126fe197SAndrew Boyer 	IONIC_PKT_TYPE_IPV4_TCP		= 0x03,
995126fe197SAndrew Boyer 	IONIC_PKT_TYPE_IPV4_UDP		= 0x05,
996126fe197SAndrew Boyer 	IONIC_PKT_TYPE_IPV6		= 0x08,
997126fe197SAndrew Boyer 	IONIC_PKT_TYPE_IPV6_TCP		= 0x18,
998126fe197SAndrew Boyer 	IONIC_PKT_TYPE_IPV6_UDP		= 0x28,
999126fe197SAndrew Boyer 	/* below types are only used if encap offloads are enabled on lif */
1000126fe197SAndrew Boyer 	IONIC_PKT_TYPE_ENCAP_NON_IP	= 0x40,
1001126fe197SAndrew Boyer 	IONIC_PKT_TYPE_ENCAP_IPV4	= 0x41,
1002126fe197SAndrew Boyer 	IONIC_PKT_TYPE_ENCAP_IPV4_TCP	= 0x43,
1003126fe197SAndrew Boyer 	IONIC_PKT_TYPE_ENCAP_IPV4_UDP	= 0x45,
1004126fe197SAndrew Boyer 	IONIC_PKT_TYPE_ENCAP_IPV6	= 0x48,
1005126fe197SAndrew Boyer 	IONIC_PKT_TYPE_ENCAP_IPV6_TCP	= 0x58,
1006126fe197SAndrew Boyer 	IONIC_PKT_TYPE_ENCAP_IPV6_UDP	= 0x68,
100701489e5dSAlfredo Cardigliano };
100801489e5dSAlfredo Cardigliano 
100901489e5dSAlfredo Cardigliano enum ionic_eth_hw_features {
101001489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_VLAN_TX_TAG	= BIT(0),
101101489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_VLAN_RX_STRIP	= BIT(1),
101201489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_VLAN_RX_FILTER	= BIT(2),
101301489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_RX_HASH		= BIT(3),
101401489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_RX_CSUM		= BIT(4),
101501489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TX_SG		= BIT(5),
101601489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_RX_SG		= BIT(6),
101701489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TX_CSUM		= BIT(7),
101801489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO		= BIT(8),
101901489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO_IPV6		= BIT(9),
102001489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO_ECN		= BIT(10),
102101489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO_GRE		= BIT(11),
102201489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO_GRE_CSUM	= BIT(12),
102301489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO_IPXIP4		= BIT(13),
102401489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO_IPXIP6		= BIT(14),
102501489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO_UDP		= BIT(15),
102601489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO_UDP_CSUM	= BIT(16),
1027126fe197SAndrew Boyer 	IONIC_ETH_HW_RX_CSUM_GENEVE	= BIT(17),
1028126fe197SAndrew Boyer 	IONIC_ETH_HW_TX_CSUM_GENEVE	= BIT(18),
1029126fe197SAndrew Boyer 	IONIC_ETH_HW_TSO_GENEVE		= BIT(19)
103001489e5dSAlfredo Cardigliano };
103101489e5dSAlfredo Cardigliano 
103201489e5dSAlfredo Cardigliano /**
103301489e5dSAlfredo Cardigliano  * struct ionic_q_control_cmd - Queue control command
103401489e5dSAlfredo Cardigliano  * @opcode:     opcode
103501489e5dSAlfredo Cardigliano  * @type:       Queue type
103601489e5dSAlfredo Cardigliano  * @lif_index:  LIF index
103701489e5dSAlfredo Cardigliano  * @index:      Queue index
1038126fe197SAndrew Boyer  * @oper:       Operation (enum ionic_q_control_oper)
103901489e5dSAlfredo Cardigliano  */
104001489e5dSAlfredo Cardigliano struct ionic_q_control_cmd {
104101489e5dSAlfredo Cardigliano 	u8     opcode;
104201489e5dSAlfredo Cardigliano 	u8     type;
104301489e5dSAlfredo Cardigliano 	__le16 lif_index;
104401489e5dSAlfredo Cardigliano 	__le32 index;
104501489e5dSAlfredo Cardigliano 	u8     oper;
104601489e5dSAlfredo Cardigliano 	u8     rsvd[55];
104701489e5dSAlfredo Cardigliano };
104801489e5dSAlfredo Cardigliano 
104901489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_q_control_comp;
105001489e5dSAlfredo Cardigliano 
1051126fe197SAndrew Boyer enum ionic_q_control_oper {
105201489e5dSAlfredo Cardigliano 	IONIC_Q_DISABLE		= 0,
105301489e5dSAlfredo Cardigliano 	IONIC_Q_ENABLE		= 1,
105401489e5dSAlfredo Cardigliano 	IONIC_Q_HANG_RESET	= 2,
105501489e5dSAlfredo Cardigliano };
105601489e5dSAlfredo Cardigliano 
105701489e5dSAlfredo Cardigliano /**
1058126fe197SAndrew Boyer  * enum ionic_phy_type - Physical connection type
1059126fe197SAndrew Boyer  * @IONIC_PHY_TYPE_NONE:    No PHY installed
1060126fe197SAndrew Boyer  * @IONIC_PHY_TYPE_COPPER:  Copper PHY
1061126fe197SAndrew Boyer  * @IONIC_PHY_TYPE_FIBER:   Fiber PHY
106201489e5dSAlfredo Cardigliano  */
106301489e5dSAlfredo Cardigliano enum ionic_phy_type {
106401489e5dSAlfredo Cardigliano 	IONIC_PHY_TYPE_NONE	= 0,
106501489e5dSAlfredo Cardigliano 	IONIC_PHY_TYPE_COPPER	= 1,
106601489e5dSAlfredo Cardigliano 	IONIC_PHY_TYPE_FIBER	= 2,
106701489e5dSAlfredo Cardigliano };
106801489e5dSAlfredo Cardigliano 
106901489e5dSAlfredo Cardigliano /**
1070126fe197SAndrew Boyer  * enum ionic_xcvr_state - Transceiver status
1071126fe197SAndrew Boyer  * @IONIC_XCVR_STATE_REMOVED:        Transceiver removed
1072126fe197SAndrew Boyer  * @IONIC_XCVR_STATE_INSERTED:       Transceiver inserted
1073126fe197SAndrew Boyer  * @IONIC_XCVR_STATE_PENDING:        Transceiver pending
1074126fe197SAndrew Boyer  * @IONIC_XCVR_STATE_SPROM_READ:     Transceiver data read
1075126fe197SAndrew Boyer  * @IONIC_XCVR_STATE_SPROM_READ_ERR: Transceiver data read error
107601489e5dSAlfredo Cardigliano  */
107701489e5dSAlfredo Cardigliano enum ionic_xcvr_state {
107801489e5dSAlfredo Cardigliano 	IONIC_XCVR_STATE_REMOVED	 = 0,
107901489e5dSAlfredo Cardigliano 	IONIC_XCVR_STATE_INSERTED	 = 1,
108001489e5dSAlfredo Cardigliano 	IONIC_XCVR_STATE_PENDING	 = 2,
108101489e5dSAlfredo Cardigliano 	IONIC_XCVR_STATE_SPROM_READ	 = 3,
108201489e5dSAlfredo Cardigliano 	IONIC_XCVR_STATE_SPROM_READ_ERR	 = 4,
108301489e5dSAlfredo Cardigliano };
108401489e5dSAlfredo Cardigliano 
108501489e5dSAlfredo Cardigliano /**
1086126fe197SAndrew Boyer  * enum ionic_xcvr_pid - Supported link modes
108701489e5dSAlfredo Cardigliano  */
108801489e5dSAlfredo Cardigliano enum ionic_xcvr_pid {
108901489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_UNKNOWN           = 0,
109001489e5dSAlfredo Cardigliano 
109101489e5dSAlfredo Cardigliano 	/* CU */
109201489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_100G_CR4     = 1,
109301489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_40GBASE_CR4  = 2,
109401489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_25GBASE_CR_S  = 3,
109501489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_25GBASE_CR_L  = 4,
109601489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_25GBASE_CR_N  = 5,
109701489e5dSAlfredo Cardigliano 
109801489e5dSAlfredo Cardigliano 	/* Fiber */
109901489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_100G_AOC    = 50,
110001489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_100G_ACC    = 51,
110101489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_100G_SR4    = 52,
110201489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_100G_LR4    = 53,
110301489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_100G_ER4    = 54,
110401489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_40GBASE_ER4 = 55,
110501489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_40GBASE_SR4 = 56,
110601489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_40GBASE_LR4 = 57,
110701489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_40GBASE_AOC = 58,
110801489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_25GBASE_SR   = 59,
110901489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_25GBASE_LR   = 60,
111001489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_25GBASE_ER   = 61,
111101489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_25GBASE_AOC  = 62,
111201489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_10GBASE_SR   = 63,
111301489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_10GBASE_LR   = 64,
111401489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_10GBASE_LRM  = 65,
111501489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_10GBASE_ER   = 66,
111601489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_10GBASE_AOC  = 67,
111701489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_10GBASE_CU   = 68,
111801489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_100G_CWDM4  = 69,
111901489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_100G_PSM4   = 70,
1120126fe197SAndrew Boyer 	IONIC_XCVR_PID_SFP_25GBASE_ACC  = 71,
112101489e5dSAlfredo Cardigliano };
112201489e5dSAlfredo Cardigliano 
112301489e5dSAlfredo Cardigliano /**
1124126fe197SAndrew Boyer  * enum ionic_port_admin_state - Port config state
1125126fe197SAndrew Boyer  * @IONIC_PORT_ADMIN_STATE_NONE:    Port admin state not configured
1126126fe197SAndrew Boyer  * @IONIC_PORT_ADMIN_STATE_DOWN:    Port admin disabled
1127126fe197SAndrew Boyer  * @IONIC_PORT_ADMIN_STATE_UP:      Port admin enabled
112801489e5dSAlfredo Cardigliano  */
112901489e5dSAlfredo Cardigliano enum ionic_port_admin_state {
1130126fe197SAndrew Boyer 	IONIC_PORT_ADMIN_STATE_NONE = 0,
1131126fe197SAndrew Boyer 	IONIC_PORT_ADMIN_STATE_DOWN = 1,
1132126fe197SAndrew Boyer 	IONIC_PORT_ADMIN_STATE_UP   = 2,
113301489e5dSAlfredo Cardigliano };
113401489e5dSAlfredo Cardigliano 
113501489e5dSAlfredo Cardigliano /**
1136126fe197SAndrew Boyer  * enum ionic_port_oper_status - Port operational status
1137126fe197SAndrew Boyer  * @IONIC_PORT_OPER_STATUS_NONE:    Port disabled
1138126fe197SAndrew Boyer  * @IONIC_PORT_OPER_STATUS_UP:      Port link status up
1139126fe197SAndrew Boyer  * @IONIC_PORT_OPER_STATUS_DOWN:    Port link status down
114001489e5dSAlfredo Cardigliano  */
114101489e5dSAlfredo Cardigliano enum ionic_port_oper_status {
1142126fe197SAndrew Boyer 	IONIC_PORT_OPER_STATUS_NONE  = 0,
1143126fe197SAndrew Boyer 	IONIC_PORT_OPER_STATUS_UP    = 1,
1144126fe197SAndrew Boyer 	IONIC_PORT_OPER_STATUS_DOWN  = 2,
114501489e5dSAlfredo Cardigliano };
114601489e5dSAlfredo Cardigliano 
114701489e5dSAlfredo Cardigliano /**
1148126fe197SAndrew Boyer  * enum ionic_port_fec_type - Ethernet Forward error correction (FEC) modes
1149126fe197SAndrew Boyer  * @IONIC_PORT_FEC_TYPE_NONE:       FEC Disabled
1150126fe197SAndrew Boyer  * @IONIC_PORT_FEC_TYPE_FC:         FireCode FEC
1151126fe197SAndrew Boyer  * @IONIC_PORT_FEC_TYPE_RS:         ReedSolomon FEC
115201489e5dSAlfredo Cardigliano  */
115301489e5dSAlfredo Cardigliano enum ionic_port_fec_type {
1154126fe197SAndrew Boyer 	IONIC_PORT_FEC_TYPE_NONE = 0,
1155126fe197SAndrew Boyer 	IONIC_PORT_FEC_TYPE_FC   = 1,
1156126fe197SAndrew Boyer 	IONIC_PORT_FEC_TYPE_RS   = 2,
115701489e5dSAlfredo Cardigliano };
115801489e5dSAlfredo Cardigliano 
115901489e5dSAlfredo Cardigliano /**
1160126fe197SAndrew Boyer  * enum ionic_port_pause_type - Ethernet pause (flow control) modes
1161126fe197SAndrew Boyer  * @IONIC_PORT_PAUSE_TYPE_NONE:     Disable Pause
1162126fe197SAndrew Boyer  * @IONIC_PORT_PAUSE_TYPE_LINK:     Link level pause
1163126fe197SAndrew Boyer  * @IONIC_PORT_PAUSE_TYPE_PFC:      Priority-Flow Control
116401489e5dSAlfredo Cardigliano  */
116501489e5dSAlfredo Cardigliano enum ionic_port_pause_type {
1166126fe197SAndrew Boyer 	IONIC_PORT_PAUSE_TYPE_NONE = 0,
1167126fe197SAndrew Boyer 	IONIC_PORT_PAUSE_TYPE_LINK = 1,
1168126fe197SAndrew Boyer 	IONIC_PORT_PAUSE_TYPE_PFC  = 2,
116901489e5dSAlfredo Cardigliano };
117001489e5dSAlfredo Cardigliano 
117101489e5dSAlfredo Cardigliano /**
1172126fe197SAndrew Boyer  * enum ionic_port_loopback_mode - Loopback modes
1173126fe197SAndrew Boyer  * @IONIC_PORT_LOOPBACK_MODE_NONE:  Disable loopback
1174126fe197SAndrew Boyer  * @IONIC_PORT_LOOPBACK_MODE_MAC:   MAC loopback
1175126fe197SAndrew Boyer  * @IONIC_PORT_LOOPBACK_MODE_PHY:   PHY/SerDes loopback
117601489e5dSAlfredo Cardigliano  */
117701489e5dSAlfredo Cardigliano enum ionic_port_loopback_mode {
1178126fe197SAndrew Boyer 	IONIC_PORT_LOOPBACK_MODE_NONE = 0,
1179126fe197SAndrew Boyer 	IONIC_PORT_LOOPBACK_MODE_MAC  = 1,
1180126fe197SAndrew Boyer 	IONIC_PORT_LOOPBACK_MODE_PHY  = 2,
118101489e5dSAlfredo Cardigliano };
118201489e5dSAlfredo Cardigliano 
118301489e5dSAlfredo Cardigliano /**
1184126fe197SAndrew Boyer  * struct ionic_xcvr_status - Transceiver Status information
118501489e5dSAlfredo Cardigliano  * @state:    Transceiver status (enum ionic_xcvr_state)
118601489e5dSAlfredo Cardigliano  * @phy:      Physical connection type (enum ionic_phy_type)
1187126fe197SAndrew Boyer  * @pid:      Transceiver link mode (enum ionic_xcvr_pid)
118801489e5dSAlfredo Cardigliano  * @sprom:    Transceiver sprom contents
118901489e5dSAlfredo Cardigliano  */
119001489e5dSAlfredo Cardigliano struct ionic_xcvr_status {
119101489e5dSAlfredo Cardigliano 	u8     state;
119201489e5dSAlfredo Cardigliano 	u8     phy;
119301489e5dSAlfredo Cardigliano 	__le16 pid;
119401489e5dSAlfredo Cardigliano 	u8     sprom[256];
119501489e5dSAlfredo Cardigliano };
119601489e5dSAlfredo Cardigliano 
119701489e5dSAlfredo Cardigliano /**
1198126fe197SAndrew Boyer  * union ionic_port_config - Port configuration
119901489e5dSAlfredo Cardigliano  * @speed:              port speed (in Mbps)
120001489e5dSAlfredo Cardigliano  * @mtu:                mtu
1201126fe197SAndrew Boyer  * @state:              port admin state (enum ionic_port_admin_state)
120201489e5dSAlfredo Cardigliano  * @an_enable:          autoneg enable
120301489e5dSAlfredo Cardigliano  * @fec_type:           fec type (enum ionic_port_fec_type)
120401489e5dSAlfredo Cardigliano  * @pause_type:         pause type (enum ionic_port_pause_type)
120501489e5dSAlfredo Cardigliano  * @loopback_mode:      loopback mode (enum ionic_port_loopback_mode)
120601489e5dSAlfredo Cardigliano  */
120701489e5dSAlfredo Cardigliano union ionic_port_config {
120801489e5dSAlfredo Cardigliano 	struct {
120901489e5dSAlfredo Cardigliano #define IONIC_SPEED_100G	100000	/* 100G in Mbps */
121001489e5dSAlfredo Cardigliano #define IONIC_SPEED_50G		50000	/* 50G in Mbps */
121101489e5dSAlfredo Cardigliano #define IONIC_SPEED_40G		40000	/* 40G in Mbps */
121201489e5dSAlfredo Cardigliano #define IONIC_SPEED_25G		25000	/* 25G in Mbps */
121301489e5dSAlfredo Cardigliano #define IONIC_SPEED_10G		10000	/* 10G in Mbps */
121401489e5dSAlfredo Cardigliano #define IONIC_SPEED_1G		1000	/* 1G in Mbps */
121501489e5dSAlfredo Cardigliano 		__le32 speed;
121601489e5dSAlfredo Cardigliano 		__le32 mtu;
121701489e5dSAlfredo Cardigliano 		u8     state;
121801489e5dSAlfredo Cardigliano 		u8     an_enable;
121901489e5dSAlfredo Cardigliano 		u8     fec_type;
122001489e5dSAlfredo Cardigliano #define IONIC_PAUSE_TYPE_MASK		0x0f
122101489e5dSAlfredo Cardigliano #define IONIC_PAUSE_FLAGS_MASK		0xf0
122201489e5dSAlfredo Cardigliano #define IONIC_PAUSE_F_TX		0x10
122301489e5dSAlfredo Cardigliano #define IONIC_PAUSE_F_RX		0x20
122401489e5dSAlfredo Cardigliano 		u8     pause_type;
122501489e5dSAlfredo Cardigliano 		u8     loopback_mode;
122601489e5dSAlfredo Cardigliano 	};
122701489e5dSAlfredo Cardigliano 	__le32 words[64];
122801489e5dSAlfredo Cardigliano };
122901489e5dSAlfredo Cardigliano 
123001489e5dSAlfredo Cardigliano /**
1231126fe197SAndrew Boyer  * struct ionic_port_status - Port Status information
123201489e5dSAlfredo Cardigliano  * @status:             link status (enum ionic_port_oper_status)
123301489e5dSAlfredo Cardigliano  * @id:                 port id
123401489e5dSAlfredo Cardigliano  * @speed:              link speed (in Mbps)
1235126fe197SAndrew Boyer  * @link_down_count:    number of times link went from up to down
1236126fe197SAndrew Boyer  * @fec_type:           fec type (enum ionic_port_fec_type)
123701489e5dSAlfredo Cardigliano  * @xcvr:               transceiver status
123801489e5dSAlfredo Cardigliano  */
1239*e7750639SAndre Muezerie struct __rte_packed_begin ionic_port_status {
124001489e5dSAlfredo Cardigliano 	__le32 id;
124101489e5dSAlfredo Cardigliano 	__le32 speed;
124201489e5dSAlfredo Cardigliano 	u8     status;
1243126fe197SAndrew Boyer 	__le16 link_down_count;
1244126fe197SAndrew Boyer 	u8     fec_type;
1245126fe197SAndrew Boyer 	u8     rsvd[48];
124601489e5dSAlfredo Cardigliano 	struct ionic_xcvr_status  xcvr;
1247*e7750639SAndre Muezerie } __rte_packed_end;
124801489e5dSAlfredo Cardigliano 
124901489e5dSAlfredo Cardigliano /**
125001489e5dSAlfredo Cardigliano  * struct ionic_port_identify_cmd - Port identify command
125101489e5dSAlfredo Cardigliano  * @opcode:     opcode
125201489e5dSAlfredo Cardigliano  * @index:      port index
125301489e5dSAlfredo Cardigliano  * @ver:        Highest version of identify supported by driver
125401489e5dSAlfredo Cardigliano  */
125501489e5dSAlfredo Cardigliano struct ionic_port_identify_cmd {
125601489e5dSAlfredo Cardigliano 	u8 opcode;
125701489e5dSAlfredo Cardigliano 	u8 index;
125801489e5dSAlfredo Cardigliano 	u8 ver;
125901489e5dSAlfredo Cardigliano 	u8 rsvd[61];
126001489e5dSAlfredo Cardigliano };
126101489e5dSAlfredo Cardigliano 
126201489e5dSAlfredo Cardigliano /**
126301489e5dSAlfredo Cardigliano  * struct ionic_port_identify_comp - Port identify command completion
1264126fe197SAndrew Boyer  * @status: Status of the command (enum ionic_status_code)
126501489e5dSAlfredo Cardigliano  * @ver:    Version of identify returned by device
126601489e5dSAlfredo Cardigliano  */
126701489e5dSAlfredo Cardigliano struct ionic_port_identify_comp {
126801489e5dSAlfredo Cardigliano 	u8 status;
126901489e5dSAlfredo Cardigliano 	u8 ver;
127001489e5dSAlfredo Cardigliano 	u8 rsvd[14];
127101489e5dSAlfredo Cardigliano };
127201489e5dSAlfredo Cardigliano 
127301489e5dSAlfredo Cardigliano /**
127401489e5dSAlfredo Cardigliano  * struct ionic_port_init_cmd - Port initialization command
127501489e5dSAlfredo Cardigliano  * @opcode:     opcode
127601489e5dSAlfredo Cardigliano  * @index:      port index
127701489e5dSAlfredo Cardigliano  * @info_pa:    destination address for port info (struct ionic_port_info)
127801489e5dSAlfredo Cardigliano  */
127901489e5dSAlfredo Cardigliano struct ionic_port_init_cmd {
128001489e5dSAlfredo Cardigliano 	u8     opcode;
128101489e5dSAlfredo Cardigliano 	u8     index;
128201489e5dSAlfredo Cardigliano 	u8     rsvd[6];
128301489e5dSAlfredo Cardigliano 	__le64 info_pa;
128401489e5dSAlfredo Cardigliano 	u8     rsvd2[48];
128501489e5dSAlfredo Cardigliano };
128601489e5dSAlfredo Cardigliano 
128701489e5dSAlfredo Cardigliano /**
128801489e5dSAlfredo Cardigliano  * struct ionic_port_init_comp - Port initialization command completion
1289126fe197SAndrew Boyer  * @status: Status of the command (enum ionic_status_code)
129001489e5dSAlfredo Cardigliano  */
129101489e5dSAlfredo Cardigliano struct ionic_port_init_comp {
129201489e5dSAlfredo Cardigliano 	u8 status;
129301489e5dSAlfredo Cardigliano 	u8 rsvd[15];
129401489e5dSAlfredo Cardigliano };
129501489e5dSAlfredo Cardigliano 
129601489e5dSAlfredo Cardigliano /**
129701489e5dSAlfredo Cardigliano  * struct ionic_port_reset_cmd - Port reset command
129801489e5dSAlfredo Cardigliano  * @opcode:     opcode
129901489e5dSAlfredo Cardigliano  * @index:      port index
130001489e5dSAlfredo Cardigliano  */
130101489e5dSAlfredo Cardigliano struct ionic_port_reset_cmd {
130201489e5dSAlfredo Cardigliano 	u8 opcode;
130301489e5dSAlfredo Cardigliano 	u8 index;
130401489e5dSAlfredo Cardigliano 	u8 rsvd[62];
130501489e5dSAlfredo Cardigliano };
130601489e5dSAlfredo Cardigliano 
130701489e5dSAlfredo Cardigliano /**
130801489e5dSAlfredo Cardigliano  * struct ionic_port_reset_comp - Port reset command completion
1309126fe197SAndrew Boyer  * @status: Status of the command (enum ionic_status_code)
131001489e5dSAlfredo Cardigliano  */
131101489e5dSAlfredo Cardigliano struct ionic_port_reset_comp {
131201489e5dSAlfredo Cardigliano 	u8 status;
131301489e5dSAlfredo Cardigliano 	u8 rsvd[15];
131401489e5dSAlfredo Cardigliano };
131501489e5dSAlfredo Cardigliano 
131601489e5dSAlfredo Cardigliano /**
1317126fe197SAndrew Boyer  * enum ionic_stats_ctl_cmd - List of commands for stats control
1318126fe197SAndrew Boyer  * @IONIC_STATS_CTL_RESET:      Reset statistics
131901489e5dSAlfredo Cardigliano  */
132001489e5dSAlfredo Cardigliano enum ionic_stats_ctl_cmd {
132101489e5dSAlfredo Cardigliano 	IONIC_STATS_CTL_RESET		= 0,
132201489e5dSAlfredo Cardigliano };
132301489e5dSAlfredo Cardigliano 
132401489e5dSAlfredo Cardigliano /**
132501489e5dSAlfredo Cardigliano  * enum ionic_port_attr - List of device attributes
1326126fe197SAndrew Boyer  * @IONIC_PORT_ATTR_STATE:      Port state attribute
1327126fe197SAndrew Boyer  * @IONIC_PORT_ATTR_SPEED:      Port speed attribute
1328126fe197SAndrew Boyer  * @IONIC_PORT_ATTR_MTU:        Port MTU attribute
1329126fe197SAndrew Boyer  * @IONIC_PORT_ATTR_AUTONEG:    Port autonegotiation attribute
1330126fe197SAndrew Boyer  * @IONIC_PORT_ATTR_FEC:        Port FEC attribute
1331126fe197SAndrew Boyer  * @IONIC_PORT_ATTR_PAUSE:      Port pause attribute
1332126fe197SAndrew Boyer  * @IONIC_PORT_ATTR_LOOPBACK:   Port loopback attribute
1333126fe197SAndrew Boyer  * @IONIC_PORT_ATTR_STATS_CTRL: Port statistics control attribute
133401489e5dSAlfredo Cardigliano  */
133501489e5dSAlfredo Cardigliano enum ionic_port_attr {
133601489e5dSAlfredo Cardigliano 	IONIC_PORT_ATTR_STATE		= 0,
133701489e5dSAlfredo Cardigliano 	IONIC_PORT_ATTR_SPEED		= 1,
133801489e5dSAlfredo Cardigliano 	IONIC_PORT_ATTR_MTU		= 2,
133901489e5dSAlfredo Cardigliano 	IONIC_PORT_ATTR_AUTONEG		= 3,
134001489e5dSAlfredo Cardigliano 	IONIC_PORT_ATTR_FEC		= 4,
134101489e5dSAlfredo Cardigliano 	IONIC_PORT_ATTR_PAUSE		= 5,
134201489e5dSAlfredo Cardigliano 	IONIC_PORT_ATTR_LOOPBACK	= 6,
134301489e5dSAlfredo Cardigliano 	IONIC_PORT_ATTR_STATS_CTRL	= 7,
134401489e5dSAlfredo Cardigliano };
134501489e5dSAlfredo Cardigliano 
134601489e5dSAlfredo Cardigliano /**
134701489e5dSAlfredo Cardigliano  * struct ionic_port_setattr_cmd - Set port attributes on the NIC
134801489e5dSAlfredo Cardigliano  * @opcode:         Opcode
1349126fe197SAndrew Boyer  * @index:          Port index
135001489e5dSAlfredo Cardigliano  * @attr:           Attribute type (enum ionic_port_attr)
1351126fe197SAndrew Boyer  * @state:          Port state
1352126fe197SAndrew Boyer  * @speed:          Port speed
1353126fe197SAndrew Boyer  * @mtu:            Port MTU
1354126fe197SAndrew Boyer  * @an_enable:      Port autonegotiation setting
1355126fe197SAndrew Boyer  * @fec_type:       Port FEC type setting
1356126fe197SAndrew Boyer  * @pause_type:     Port pause type setting
1357126fe197SAndrew Boyer  * @loopback_mode:  Port loopback mode
1358126fe197SAndrew Boyer  * @stats_ctl:      Port stats setting
135901489e5dSAlfredo Cardigliano  */
136001489e5dSAlfredo Cardigliano struct ionic_port_setattr_cmd {
136101489e5dSAlfredo Cardigliano 	u8     opcode;
136201489e5dSAlfredo Cardigliano 	u8     index;
136301489e5dSAlfredo Cardigliano 	u8     attr;
136401489e5dSAlfredo Cardigliano 	u8     rsvd;
136501489e5dSAlfredo Cardigliano 	union {
136601489e5dSAlfredo Cardigliano 		u8      state;
136701489e5dSAlfredo Cardigliano 		__le32  speed;
136801489e5dSAlfredo Cardigliano 		__le32  mtu;
136901489e5dSAlfredo Cardigliano 		u8      an_enable;
137001489e5dSAlfredo Cardigliano 		u8      fec_type;
137101489e5dSAlfredo Cardigliano 		u8      pause_type;
137201489e5dSAlfredo Cardigliano 		u8      loopback_mode;
137301489e5dSAlfredo Cardigliano 		u8      stats_ctl;
137401489e5dSAlfredo Cardigliano 		u8      rsvd2[60];
137501489e5dSAlfredo Cardigliano 	};
137601489e5dSAlfredo Cardigliano };
137701489e5dSAlfredo Cardigliano 
137801489e5dSAlfredo Cardigliano /**
137901489e5dSAlfredo Cardigliano  * struct ionic_port_setattr_comp - Port set attr command completion
1380126fe197SAndrew Boyer  * @status:     Status of the command (enum ionic_status_code)
138101489e5dSAlfredo Cardigliano  * @color:      Color bit
138201489e5dSAlfredo Cardigliano  */
138301489e5dSAlfredo Cardigliano struct ionic_port_setattr_comp {
138401489e5dSAlfredo Cardigliano 	u8     status;
138501489e5dSAlfredo Cardigliano 	u8     rsvd[14];
138601489e5dSAlfredo Cardigliano 	u8     color;
138701489e5dSAlfredo Cardigliano };
138801489e5dSAlfredo Cardigliano 
138901489e5dSAlfredo Cardigliano /**
139001489e5dSAlfredo Cardigliano  * struct ionic_port_getattr_cmd - Get port attributes from the NIC
139101489e5dSAlfredo Cardigliano  * @opcode:     Opcode
139201489e5dSAlfredo Cardigliano  * @index:      port index
139301489e5dSAlfredo Cardigliano  * @attr:       Attribute type (enum ionic_port_attr)
139401489e5dSAlfredo Cardigliano  */
139501489e5dSAlfredo Cardigliano struct ionic_port_getattr_cmd {
139601489e5dSAlfredo Cardigliano 	u8     opcode;
139701489e5dSAlfredo Cardigliano 	u8     index;
139801489e5dSAlfredo Cardigliano 	u8     attr;
139901489e5dSAlfredo Cardigliano 	u8     rsvd[61];
140001489e5dSAlfredo Cardigliano };
140101489e5dSAlfredo Cardigliano 
140201489e5dSAlfredo Cardigliano /**
140301489e5dSAlfredo Cardigliano  * struct ionic_port_getattr_comp - Port get attr command completion
1404126fe197SAndrew Boyer  * @status:         Status of the command (enum ionic_status_code)
1405126fe197SAndrew Boyer  * @state:          Port state
1406126fe197SAndrew Boyer  * @speed:          Port speed
1407126fe197SAndrew Boyer  * @mtu:            Port MTU
1408126fe197SAndrew Boyer  * @an_enable:      Port autonegotiation setting
1409126fe197SAndrew Boyer  * @fec_type:       Port FEC type setting
1410126fe197SAndrew Boyer  * @pause_type:     Port pause type setting
1411126fe197SAndrew Boyer  * @loopback_mode:  Port loopback mode
141201489e5dSAlfredo Cardigliano  * @color:          Color bit
141301489e5dSAlfredo Cardigliano  */
141401489e5dSAlfredo Cardigliano struct ionic_port_getattr_comp {
141501489e5dSAlfredo Cardigliano 	u8     status;
141601489e5dSAlfredo Cardigliano 	u8     rsvd[3];
1417*e7750639SAndre Muezerie 	union __rte_packed_begin {
141801489e5dSAlfredo Cardigliano 		u8      state;
141901489e5dSAlfredo Cardigliano 		__le32  speed;
142001489e5dSAlfredo Cardigliano 		__le32  mtu;
142101489e5dSAlfredo Cardigliano 		u8      an_enable;
142201489e5dSAlfredo Cardigliano 		u8      fec_type;
142301489e5dSAlfredo Cardigliano 		u8      pause_type;
142401489e5dSAlfredo Cardigliano 		u8      loopback_mode;
142501489e5dSAlfredo Cardigliano 		u8      rsvd2[11];
1426*e7750639SAndre Muezerie 	} __rte_packed_end;
142701489e5dSAlfredo Cardigliano 	u8     color;
142801489e5dSAlfredo Cardigliano };
142901489e5dSAlfredo Cardigliano 
143001489e5dSAlfredo Cardigliano /**
1431126fe197SAndrew Boyer  * struct ionic_lif_status - LIF status register
143201489e5dSAlfredo Cardigliano  * @eid:             most recent NotifyQ event id
1433126fe197SAndrew Boyer  * @port_num:        port the LIF is connected to
143401489e5dSAlfredo Cardigliano  * @link_status:     port status (enum ionic_port_oper_status)
143501489e5dSAlfredo Cardigliano  * @link_speed:      speed of link in Mbps
1436126fe197SAndrew Boyer  * @link_down_count: number of times link went from up to down
143701489e5dSAlfredo Cardigliano  */
143801489e5dSAlfredo Cardigliano struct ionic_lif_status {
143901489e5dSAlfredo Cardigliano 	__le64 eid;
144001489e5dSAlfredo Cardigliano 	u8     port_num;
144101489e5dSAlfredo Cardigliano 	u8     rsvd;
144201489e5dSAlfredo Cardigliano 	__le16 link_status;
144301489e5dSAlfredo Cardigliano 	__le32 link_speed;		/* units of 1Mbps: eg 10000 = 10Gbps */
144401489e5dSAlfredo Cardigliano 	__le16 link_down_count;
144501489e5dSAlfredo Cardigliano 	u8      rsvd2[46];
144601489e5dSAlfredo Cardigliano };
144701489e5dSAlfredo Cardigliano 
144801489e5dSAlfredo Cardigliano /**
144901489e5dSAlfredo Cardigliano  * struct ionic_lif_reset_cmd - LIF reset command
145001489e5dSAlfredo Cardigliano  * @opcode:    opcode
145101489e5dSAlfredo Cardigliano  * @index:     LIF index
145201489e5dSAlfredo Cardigliano  */
145301489e5dSAlfredo Cardigliano struct ionic_lif_reset_cmd {
145401489e5dSAlfredo Cardigliano 	u8     opcode;
145501489e5dSAlfredo Cardigliano 	u8     rsvd;
145601489e5dSAlfredo Cardigliano 	__le16 index;
145701489e5dSAlfredo Cardigliano 	__le32 rsvd2[15];
145801489e5dSAlfredo Cardigliano };
145901489e5dSAlfredo Cardigliano 
146001489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_lif_reset_comp;
146101489e5dSAlfredo Cardigliano 
146201489e5dSAlfredo Cardigliano enum ionic_dev_state {
146301489e5dSAlfredo Cardigliano 	IONIC_DEV_DISABLE	= 0,
146401489e5dSAlfredo Cardigliano 	IONIC_DEV_ENABLE	= 1,
146501489e5dSAlfredo Cardigliano 	IONIC_DEV_HANG_RESET	= 2,
146601489e5dSAlfredo Cardigliano };
146701489e5dSAlfredo Cardigliano 
146801489e5dSAlfredo Cardigliano /**
146901489e5dSAlfredo Cardigliano  * enum ionic_dev_attr - List of device attributes
1470126fe197SAndrew Boyer  * @IONIC_DEV_ATTR_STATE:     Device state attribute
1471126fe197SAndrew Boyer  * @IONIC_DEV_ATTR_NAME:      Device name attribute
1472126fe197SAndrew Boyer  * @IONIC_DEV_ATTR_FEATURES:  Device feature attributes
147301489e5dSAlfredo Cardigliano  */
147401489e5dSAlfredo Cardigliano enum ionic_dev_attr {
147501489e5dSAlfredo Cardigliano 	IONIC_DEV_ATTR_STATE    = 0,
147601489e5dSAlfredo Cardigliano 	IONIC_DEV_ATTR_NAME     = 1,
147701489e5dSAlfredo Cardigliano 	IONIC_DEV_ATTR_FEATURES = 2,
147801489e5dSAlfredo Cardigliano };
147901489e5dSAlfredo Cardigliano 
148001489e5dSAlfredo Cardigliano /**
148101489e5dSAlfredo Cardigliano  * struct ionic_dev_setattr_cmd - Set Device attributes on the NIC
148201489e5dSAlfredo Cardigliano  * @opcode:     Opcode
148301489e5dSAlfredo Cardigliano  * @attr:       Attribute type (enum ionic_dev_attr)
148401489e5dSAlfredo Cardigliano  * @state:      Device state (enum ionic_dev_state)
148501489e5dSAlfredo Cardigliano  * @name:       The bus info, e.g. PCI slot-device-function, 0 terminated
148601489e5dSAlfredo Cardigliano  * @features:   Device features
148701489e5dSAlfredo Cardigliano  */
148801489e5dSAlfredo Cardigliano struct ionic_dev_setattr_cmd {
148901489e5dSAlfredo Cardigliano 	u8     opcode;
149001489e5dSAlfredo Cardigliano 	u8     attr;
149101489e5dSAlfredo Cardigliano 	__le16 rsvd;
1492*e7750639SAndre Muezerie 	union __rte_packed_begin {
149301489e5dSAlfredo Cardigliano 		u8      state;
149401489e5dSAlfredo Cardigliano 		char    name[IONIC_IFNAMSIZ];
149501489e5dSAlfredo Cardigliano 		__le64  features;
149601489e5dSAlfredo Cardigliano 		u8      rsvd2[60];
1497*e7750639SAndre Muezerie 	} __rte_packed_end;
149801489e5dSAlfredo Cardigliano };
149901489e5dSAlfredo Cardigliano 
150001489e5dSAlfredo Cardigliano /**
150101489e5dSAlfredo Cardigliano  * struct ionic_dev_setattr_comp - Device set attr command completion
1502126fe197SAndrew Boyer  * @status:     Status of the command (enum ionic_status_code)
150301489e5dSAlfredo Cardigliano  * @features:   Device features
150401489e5dSAlfredo Cardigliano  * @color:      Color bit
150501489e5dSAlfredo Cardigliano  */
150601489e5dSAlfredo Cardigliano struct ionic_dev_setattr_comp {
150701489e5dSAlfredo Cardigliano 	u8     status;
150801489e5dSAlfredo Cardigliano 	u8     rsvd[3];
1509*e7750639SAndre Muezerie 	union __rte_packed_begin {
151001489e5dSAlfredo Cardigliano 		__le64  features;
151101489e5dSAlfredo Cardigliano 		u8      rsvd2[11];
1512*e7750639SAndre Muezerie 	} __rte_packed_end;
151301489e5dSAlfredo Cardigliano 	u8     color;
151401489e5dSAlfredo Cardigliano };
151501489e5dSAlfredo Cardigliano 
151601489e5dSAlfredo Cardigliano /**
151701489e5dSAlfredo Cardigliano  * struct ionic_dev_getattr_cmd - Get Device attributes from the NIC
151801489e5dSAlfredo Cardigliano  * @opcode:     opcode
151901489e5dSAlfredo Cardigliano  * @attr:       Attribute type (enum ionic_dev_attr)
152001489e5dSAlfredo Cardigliano  */
152101489e5dSAlfredo Cardigliano struct ionic_dev_getattr_cmd {
152201489e5dSAlfredo Cardigliano 	u8     opcode;
152301489e5dSAlfredo Cardigliano 	u8     attr;
152401489e5dSAlfredo Cardigliano 	u8     rsvd[62];
152501489e5dSAlfredo Cardigliano };
152601489e5dSAlfredo Cardigliano 
152701489e5dSAlfredo Cardigliano /**
152801489e5dSAlfredo Cardigliano  * struct ionic_dev_setattr_comp - Device set attr command completion
1529126fe197SAndrew Boyer  * @status:     Status of the command (enum ionic_status_code)
153001489e5dSAlfredo Cardigliano  * @features:   Device features
153101489e5dSAlfredo Cardigliano  * @color:      Color bit
153201489e5dSAlfredo Cardigliano  */
153301489e5dSAlfredo Cardigliano struct ionic_dev_getattr_comp {
153401489e5dSAlfredo Cardigliano 	u8     status;
153501489e5dSAlfredo Cardigliano 	u8     rsvd[3];
1536*e7750639SAndre Muezerie 	union __rte_packed_begin {
153701489e5dSAlfredo Cardigliano 		__le64  features;
153801489e5dSAlfredo Cardigliano 		u8      rsvd2[11];
1539*e7750639SAndre Muezerie 	} __rte_packed_end;
154001489e5dSAlfredo Cardigliano 	u8     color;
154101489e5dSAlfredo Cardigliano };
154201489e5dSAlfredo Cardigliano 
154301489e5dSAlfredo Cardigliano /**
154401489e5dSAlfredo Cardigliano  * RSS parameters
154501489e5dSAlfredo Cardigliano  */
154601489e5dSAlfredo Cardigliano #define IONIC_RSS_HASH_KEY_SIZE		40
154701489e5dSAlfredo Cardigliano 
154801489e5dSAlfredo Cardigliano enum ionic_rss_hash_types {
154901489e5dSAlfredo Cardigliano 	IONIC_RSS_TYPE_IPV4	= BIT(0),
155001489e5dSAlfredo Cardigliano 	IONIC_RSS_TYPE_IPV4_TCP	= BIT(1),
155101489e5dSAlfredo Cardigliano 	IONIC_RSS_TYPE_IPV4_UDP	= BIT(2),
155201489e5dSAlfredo Cardigliano 	IONIC_RSS_TYPE_IPV6	= BIT(3),
155301489e5dSAlfredo Cardigliano 	IONIC_RSS_TYPE_IPV6_TCP	= BIT(4),
155401489e5dSAlfredo Cardigliano 	IONIC_RSS_TYPE_IPV6_UDP	= BIT(5),
155501489e5dSAlfredo Cardigliano };
155601489e5dSAlfredo Cardigliano 
155701489e5dSAlfredo Cardigliano /**
155801489e5dSAlfredo Cardigliano  * enum ionic_lif_attr - List of LIF attributes
1559126fe197SAndrew Boyer  * @IONIC_LIF_ATTR_STATE:       LIF state attribute
1560126fe197SAndrew Boyer  * @IONIC_LIF_ATTR_NAME:        LIF name attribute
1561126fe197SAndrew Boyer  * @IONIC_LIF_ATTR_MTU:         LIF MTU attribute
1562126fe197SAndrew Boyer  * @IONIC_LIF_ATTR_MAC:         LIF MAC attribute
1563126fe197SAndrew Boyer  * @IONIC_LIF_ATTR_FEATURES:    LIF features attribute
1564126fe197SAndrew Boyer  * @IONIC_LIF_ATTR_RSS:         LIF RSS attribute
1565126fe197SAndrew Boyer  * @IONIC_LIF_ATTR_STATS_CTRL:  LIF statistics control attribute
156601489e5dSAlfredo Cardigliano  */
156701489e5dSAlfredo Cardigliano enum ionic_lif_attr {
156801489e5dSAlfredo Cardigliano 	IONIC_LIF_ATTR_STATE        = 0,
156901489e5dSAlfredo Cardigliano 	IONIC_LIF_ATTR_NAME         = 1,
157001489e5dSAlfredo Cardigliano 	IONIC_LIF_ATTR_MTU          = 2,
157101489e5dSAlfredo Cardigliano 	IONIC_LIF_ATTR_MAC          = 3,
157201489e5dSAlfredo Cardigliano 	IONIC_LIF_ATTR_FEATURES     = 4,
157301489e5dSAlfredo Cardigliano 	IONIC_LIF_ATTR_RSS          = 5,
157401489e5dSAlfredo Cardigliano 	IONIC_LIF_ATTR_STATS_CTRL   = 6,
157501489e5dSAlfredo Cardigliano };
157601489e5dSAlfredo Cardigliano 
157701489e5dSAlfredo Cardigliano /**
157801489e5dSAlfredo Cardigliano  * struct ionic_lif_setattr_cmd - Set LIF attributes on the NIC
157901489e5dSAlfredo Cardigliano  * @opcode:     Opcode
1580126fe197SAndrew Boyer  * @attr:       Attribute type (enum ionic_lif_attr)
158101489e5dSAlfredo Cardigliano  * @index:      LIF index
1582126fe197SAndrew Boyer  * @state:      LIF state (enum ionic_lif_state)
158301489e5dSAlfredo Cardigliano  * @name:       The netdev name string, 0 terminated
158401489e5dSAlfredo Cardigliano  * @mtu:        Mtu
158501489e5dSAlfredo Cardigliano  * @mac:        Station mac
158601489e5dSAlfredo Cardigliano  * @features:   Features (enum ionic_eth_hw_features)
158701489e5dSAlfredo Cardigliano  * @rss:        RSS properties
1588126fe197SAndrew Boyer  *              @types:     The hash types to enable (see rss_hash_types)
1589126fe197SAndrew Boyer  *              @key:       The hash secret key
1590126fe197SAndrew Boyer  *              @addr:      Address for the indirection table shared memory
1591126fe197SAndrew Boyer  * @stats_ctl:  stats control commands (enum ionic_stats_ctl_cmd)
159201489e5dSAlfredo Cardigliano  */
159301489e5dSAlfredo Cardigliano struct ionic_lif_setattr_cmd {
159401489e5dSAlfredo Cardigliano 	u8     opcode;
159501489e5dSAlfredo Cardigliano 	u8     attr;
159601489e5dSAlfredo Cardigliano 	__le16 index;
1597*e7750639SAndre Muezerie 	union __rte_packed_begin {
159801489e5dSAlfredo Cardigliano 		u8      state;
159901489e5dSAlfredo Cardigliano 		char    name[IONIC_IFNAMSIZ];
160001489e5dSAlfredo Cardigliano 		__le32  mtu;
160101489e5dSAlfredo Cardigliano 		u8      mac[6];
160201489e5dSAlfredo Cardigliano 		__le64  features;
160301489e5dSAlfredo Cardigliano 		struct {
160401489e5dSAlfredo Cardigliano 			__le16 types;
160501489e5dSAlfredo Cardigliano 			u8     key[IONIC_RSS_HASH_KEY_SIZE];
160601489e5dSAlfredo Cardigliano 			u8     rsvd[6];
160701489e5dSAlfredo Cardigliano 			__le64 addr;
160801489e5dSAlfredo Cardigliano 		} rss;
160901489e5dSAlfredo Cardigliano 		u8      stats_ctl;
161001489e5dSAlfredo Cardigliano 		u8      rsvd[60];
1611*e7750639SAndre Muezerie 	} __rte_packed_end;
161201489e5dSAlfredo Cardigliano };
161301489e5dSAlfredo Cardigliano 
161401489e5dSAlfredo Cardigliano /**
161501489e5dSAlfredo Cardigliano  * struct ionic_lif_setattr_comp - LIF set attr command completion
1616126fe197SAndrew Boyer  * @status:     Status of the command (enum ionic_status_code)
1617126fe197SAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
161801489e5dSAlfredo Cardigliano  * @features:   features (enum ionic_eth_hw_features)
161901489e5dSAlfredo Cardigliano  * @color:      Color bit
162001489e5dSAlfredo Cardigliano  */
162101489e5dSAlfredo Cardigliano struct ionic_lif_setattr_comp {
162201489e5dSAlfredo Cardigliano 	u8     status;
162301489e5dSAlfredo Cardigliano 	u8     rsvd;
162401489e5dSAlfredo Cardigliano 	__le16 comp_index;
1625*e7750639SAndre Muezerie 	union __rte_packed_begin {
162601489e5dSAlfredo Cardigliano 		__le64  features;
162701489e5dSAlfredo Cardigliano 		u8      rsvd2[11];
1628*e7750639SAndre Muezerie 	} __rte_packed_end;
162901489e5dSAlfredo Cardigliano 	u8     color;
163001489e5dSAlfredo Cardigliano };
163101489e5dSAlfredo Cardigliano 
163201489e5dSAlfredo Cardigliano /**
163301489e5dSAlfredo Cardigliano  * struct ionic_lif_getattr_cmd - Get LIF attributes from the NIC
163401489e5dSAlfredo Cardigliano  * @opcode:     Opcode
163501489e5dSAlfredo Cardigliano  * @attr:       Attribute type (enum ionic_lif_attr)
163601489e5dSAlfredo Cardigliano  * @index:      LIF index
163701489e5dSAlfredo Cardigliano  */
163801489e5dSAlfredo Cardigliano struct ionic_lif_getattr_cmd {
163901489e5dSAlfredo Cardigliano 	u8     opcode;
164001489e5dSAlfredo Cardigliano 	u8     attr;
164101489e5dSAlfredo Cardigliano 	__le16 index;
164201489e5dSAlfredo Cardigliano 	u8     rsvd[60];
164301489e5dSAlfredo Cardigliano };
164401489e5dSAlfredo Cardigliano 
164501489e5dSAlfredo Cardigliano /**
164601489e5dSAlfredo Cardigliano  * struct ionic_lif_getattr_comp - LIF get attr command completion
1647126fe197SAndrew Boyer  * @status:     Status of the command (enum ionic_status_code)
1648126fe197SAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
1649126fe197SAndrew Boyer  * @state:      LIF state (enum ionic_lif_state)
165001489e5dSAlfredo Cardigliano  * @name:       The netdev name string, 0 terminated
165101489e5dSAlfredo Cardigliano  * @mtu:        Mtu
165201489e5dSAlfredo Cardigliano  * @mac:        Station mac
165301489e5dSAlfredo Cardigliano  * @features:   Features (enum ionic_eth_hw_features)
165401489e5dSAlfredo Cardigliano  * @color:      Color bit
165501489e5dSAlfredo Cardigliano  */
165601489e5dSAlfredo Cardigliano struct ionic_lif_getattr_comp {
165701489e5dSAlfredo Cardigliano 	u8     status;
165801489e5dSAlfredo Cardigliano 	u8     rsvd;
165901489e5dSAlfredo Cardigliano 	__le16 comp_index;
1660*e7750639SAndre Muezerie 	union __rte_packed_begin {
166101489e5dSAlfredo Cardigliano 		u8      state;
166201489e5dSAlfredo Cardigliano 		__le32  mtu;
166301489e5dSAlfredo Cardigliano 		u8      mac[6];
166401489e5dSAlfredo Cardigliano 		__le64  features;
166501489e5dSAlfredo Cardigliano 		u8      rsvd2[11];
1666*e7750639SAndre Muezerie 	} __rte_packed_end;
166701489e5dSAlfredo Cardigliano 	u8     color;
166801489e5dSAlfredo Cardigliano };
166901489e5dSAlfredo Cardigliano 
167001489e5dSAlfredo Cardigliano enum ionic_rx_mode {
167101489e5dSAlfredo Cardigliano 	IONIC_RX_MODE_F_UNICAST		= BIT(0),
167201489e5dSAlfredo Cardigliano 	IONIC_RX_MODE_F_MULTICAST	= BIT(1),
167301489e5dSAlfredo Cardigliano 	IONIC_RX_MODE_F_BROADCAST	= BIT(2),
167401489e5dSAlfredo Cardigliano 	IONIC_RX_MODE_F_PROMISC		= BIT(3),
167501489e5dSAlfredo Cardigliano 	IONIC_RX_MODE_F_ALLMULTI	= BIT(4),
1676126fe197SAndrew Boyer 	IONIC_RX_MODE_F_RDMA_SNIFFER	= BIT(5),
167701489e5dSAlfredo Cardigliano };
167801489e5dSAlfredo Cardigliano 
167901489e5dSAlfredo Cardigliano /**
168001489e5dSAlfredo Cardigliano  * struct ionic_rx_mode_set_cmd - Set LIF's Rx mode command
168101489e5dSAlfredo Cardigliano  * @opcode:     opcode
168201489e5dSAlfredo Cardigliano  * @lif_index:  LIF index
168301489e5dSAlfredo Cardigliano  * @rx_mode:    Rx mode flags:
1684126fe197SAndrew Boyer  *                  IONIC_RX_MODE_F_UNICAST: Accept known unicast packets
1685126fe197SAndrew Boyer  *                  IONIC_RX_MODE_F_MULTICAST: Accept known multicast packets
1686126fe197SAndrew Boyer  *                  IONIC_RX_MODE_F_BROADCAST: Accept broadcast packets
1687126fe197SAndrew Boyer  *                  IONIC_RX_MODE_F_PROMISC: Accept any packets
1688126fe197SAndrew Boyer  *                  IONIC_RX_MODE_F_ALLMULTI: Accept any multicast packets
1689126fe197SAndrew Boyer  *                  IONIC_RX_MODE_F_RDMA_SNIFFER: Sniff RDMA packets
169001489e5dSAlfredo Cardigliano  */
169101489e5dSAlfredo Cardigliano struct ionic_rx_mode_set_cmd {
169201489e5dSAlfredo Cardigliano 	u8     opcode;
169301489e5dSAlfredo Cardigliano 	u8     rsvd;
169401489e5dSAlfredo Cardigliano 	__le16 lif_index;
169501489e5dSAlfredo Cardigliano 	__le16 rx_mode;
169601489e5dSAlfredo Cardigliano 	__le16 rsvd2[29];
169701489e5dSAlfredo Cardigliano };
169801489e5dSAlfredo Cardigliano 
169901489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_rx_mode_set_comp;
170001489e5dSAlfredo Cardigliano 
170101489e5dSAlfredo Cardigliano enum ionic_rx_filter_match_type {
170201489e5dSAlfredo Cardigliano 	IONIC_RX_FILTER_MATCH_VLAN = 0,
170301489e5dSAlfredo Cardigliano 	IONIC_RX_FILTER_MATCH_MAC,
170401489e5dSAlfredo Cardigliano 	IONIC_RX_FILTER_MATCH_MAC_VLAN,
170501489e5dSAlfredo Cardigliano };
170601489e5dSAlfredo Cardigliano 
170701489e5dSAlfredo Cardigliano /**
170801489e5dSAlfredo Cardigliano  * struct ionic_rx_filter_add_cmd - Add LIF Rx filter command
170901489e5dSAlfredo Cardigliano  * @opcode:     opcode
171001489e5dSAlfredo Cardigliano  * @qtype:      Queue type
171101489e5dSAlfredo Cardigliano  * @lif_index:  LIF index
171201489e5dSAlfredo Cardigliano  * @qid:        Queue ID
1713126fe197SAndrew Boyer  * @match:      Rx filter match type (see IONIC_RX_FILTER_MATCH_xxx)
1714126fe197SAndrew Boyer  * @vlan:       VLAN filter
1715126fe197SAndrew Boyer  *              @vlan:  VLAN ID
1716126fe197SAndrew Boyer  * @mac:        MAC filter
1717126fe197SAndrew Boyer  *              @addr:  MAC address (network-byte order)
1718126fe197SAndrew Boyer  * @mac_vlan:   MACVLAN filter
171901489e5dSAlfredo Cardigliano  *              @vlan:  VLAN ID
172001489e5dSAlfredo Cardigliano  *              @addr:  MAC address (network-byte order)
172101489e5dSAlfredo Cardigliano  */
172201489e5dSAlfredo Cardigliano struct ionic_rx_filter_add_cmd {
172301489e5dSAlfredo Cardigliano 	u8     opcode;
172401489e5dSAlfredo Cardigliano 	u8     qtype;
172501489e5dSAlfredo Cardigliano 	__le16 lif_index;
172601489e5dSAlfredo Cardigliano 	__le32 qid;
172701489e5dSAlfredo Cardigliano 	__le16 match;
172801489e5dSAlfredo Cardigliano 	union {
172901489e5dSAlfredo Cardigliano 		struct {
173001489e5dSAlfredo Cardigliano 			__le16 vlan;
173101489e5dSAlfredo Cardigliano 		} vlan;
173201489e5dSAlfredo Cardigliano 		struct {
173301489e5dSAlfredo Cardigliano 			u8     addr[6];
173401489e5dSAlfredo Cardigliano 		} mac;
173501489e5dSAlfredo Cardigliano 		struct {
173601489e5dSAlfredo Cardigliano 			__le16 vlan;
173701489e5dSAlfredo Cardigliano 			u8     addr[6];
173801489e5dSAlfredo Cardigliano 		} mac_vlan;
173901489e5dSAlfredo Cardigliano 		u8 rsvd[54];
174001489e5dSAlfredo Cardigliano 	};
174101489e5dSAlfredo Cardigliano };
174201489e5dSAlfredo Cardigliano 
174301489e5dSAlfredo Cardigliano /**
174401489e5dSAlfredo Cardigliano  * struct ionic_rx_filter_add_comp - Add LIF Rx filter command completion
1745126fe197SAndrew Boyer  * @status:     Status of the command (enum ionic_status_code)
1746126fe197SAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
174701489e5dSAlfredo Cardigliano  * @filter_id:  Filter ID
1748126fe197SAndrew Boyer  * @color:      Color bit
174901489e5dSAlfredo Cardigliano  */
175001489e5dSAlfredo Cardigliano struct ionic_rx_filter_add_comp {
175101489e5dSAlfredo Cardigliano 	u8     status;
175201489e5dSAlfredo Cardigliano 	u8     rsvd;
175301489e5dSAlfredo Cardigliano 	__le16 comp_index;
175401489e5dSAlfredo Cardigliano 	__le32 filter_id;
175501489e5dSAlfredo Cardigliano 	u8     rsvd2[7];
175601489e5dSAlfredo Cardigliano 	u8     color;
175701489e5dSAlfredo Cardigliano };
175801489e5dSAlfredo Cardigliano 
175901489e5dSAlfredo Cardigliano /**
176001489e5dSAlfredo Cardigliano  * struct ionic_rx_filter_del_cmd - Delete LIF Rx filter command
176101489e5dSAlfredo Cardigliano  * @opcode:     opcode
176201489e5dSAlfredo Cardigliano  * @lif_index:  LIF index
176301489e5dSAlfredo Cardigliano  * @filter_id:  Filter ID
176401489e5dSAlfredo Cardigliano  */
176501489e5dSAlfredo Cardigliano struct ionic_rx_filter_del_cmd {
176601489e5dSAlfredo Cardigliano 	u8     opcode;
176701489e5dSAlfredo Cardigliano 	u8     rsvd;
176801489e5dSAlfredo Cardigliano 	__le16 lif_index;
176901489e5dSAlfredo Cardigliano 	__le32 filter_id;
177001489e5dSAlfredo Cardigliano 	u8     rsvd2[56];
177101489e5dSAlfredo Cardigliano };
177201489e5dSAlfredo Cardigliano 
177301489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_rx_filter_del_comp;
177401489e5dSAlfredo Cardigliano 
1775126fe197SAndrew Boyer enum ionic_vf_attr {
1776126fe197SAndrew Boyer 	IONIC_VF_ATTR_SPOOFCHK	= 1,
1777126fe197SAndrew Boyer 	IONIC_VF_ATTR_TRUST	= 2,
1778126fe197SAndrew Boyer 	IONIC_VF_ATTR_MAC	= 3,
1779126fe197SAndrew Boyer 	IONIC_VF_ATTR_LINKSTATE	= 4,
1780126fe197SAndrew Boyer 	IONIC_VF_ATTR_VLAN	= 5,
1781126fe197SAndrew Boyer 	IONIC_VF_ATTR_RATE	= 6,
1782126fe197SAndrew Boyer 	IONIC_VF_ATTR_STATSADDR	= 7,
1783126fe197SAndrew Boyer };
1784126fe197SAndrew Boyer 
1785126fe197SAndrew Boyer /**
1786126fe197SAndrew Boyer  * enum ionic_vf_link_status - Virtual Function link status
1787126fe197SAndrew Boyer  * @IONIC_VF_LINK_STATUS_AUTO:   Use link state of the uplink
1788126fe197SAndrew Boyer  * @IONIC_VF_LINK_STATUS_UP:     Link always up
1789126fe197SAndrew Boyer  * @IONIC_VF_LINK_STATUS_DOWN:   Link always down
1790126fe197SAndrew Boyer  */
1791126fe197SAndrew Boyer enum ionic_vf_link_status {
1792126fe197SAndrew Boyer 	IONIC_VF_LINK_STATUS_AUTO = 0,
1793126fe197SAndrew Boyer 	IONIC_VF_LINK_STATUS_UP   = 1,
1794126fe197SAndrew Boyer 	IONIC_VF_LINK_STATUS_DOWN = 2,
1795126fe197SAndrew Boyer };
1796126fe197SAndrew Boyer 
1797126fe197SAndrew Boyer /**
1798126fe197SAndrew Boyer  * struct ionic_vf_setattr_cmd - Set VF attributes on the NIC
1799126fe197SAndrew Boyer  * @opcode:     Opcode
1800126fe197SAndrew Boyer  * @attr:       Attribute type (enum ionic_vf_attr)
1801126fe197SAndrew Boyer  * @vf_index:   VF index
1802126fe197SAndrew Boyer  *	@macaddr:	mac address
1803126fe197SAndrew Boyer  *	@vlanid:	vlan ID
1804126fe197SAndrew Boyer  *	@maxrate:	max Tx rate in Mbps
1805126fe197SAndrew Boyer  *	@spoofchk:	enable address spoof checking
1806126fe197SAndrew Boyer  *	@trust:		enable VF trust
1807126fe197SAndrew Boyer  *	@linkstate:	set link up or down
1808126fe197SAndrew Boyer  *	@stats_pa:	set DMA address for VF stats
1809126fe197SAndrew Boyer  */
1810126fe197SAndrew Boyer struct ionic_vf_setattr_cmd {
1811126fe197SAndrew Boyer 	u8     opcode;
1812126fe197SAndrew Boyer 	u8     attr;
1813126fe197SAndrew Boyer 	__le16 vf_index;
1814*e7750639SAndre Muezerie 	union __rte_packed_begin {
1815126fe197SAndrew Boyer 		u8     macaddr[6];
1816126fe197SAndrew Boyer 		__le16 vlanid;
1817126fe197SAndrew Boyer 		__le32 maxrate;
1818126fe197SAndrew Boyer 		u8     spoofchk;
1819126fe197SAndrew Boyer 		u8     trust;
1820126fe197SAndrew Boyer 		u8     linkstate;
1821126fe197SAndrew Boyer 		__le64 stats_pa;
1822126fe197SAndrew Boyer 		u8     pad[60];
1823*e7750639SAndre Muezerie 	} __rte_packed_end;
1824126fe197SAndrew Boyer };
1825126fe197SAndrew Boyer 
1826126fe197SAndrew Boyer struct ionic_vf_setattr_comp {
1827126fe197SAndrew Boyer 	u8     status;
1828126fe197SAndrew Boyer 	u8     attr;
1829126fe197SAndrew Boyer 	__le16 vf_index;
1830126fe197SAndrew Boyer 	__le16 comp_index;
1831126fe197SAndrew Boyer 	u8     rsvd[9];
1832126fe197SAndrew Boyer 	u8     color;
1833126fe197SAndrew Boyer };
1834126fe197SAndrew Boyer 
1835126fe197SAndrew Boyer /**
1836126fe197SAndrew Boyer  * struct ionic_vf_getattr_cmd - Get VF attributes from the NIC
1837126fe197SAndrew Boyer  * @opcode:     Opcode
1838126fe197SAndrew Boyer  * @attr:       Attribute type (enum ionic_vf_attr)
1839126fe197SAndrew Boyer  * @vf_index:   VF index
1840126fe197SAndrew Boyer  */
1841126fe197SAndrew Boyer struct ionic_vf_getattr_cmd {
1842126fe197SAndrew Boyer 	u8     opcode;
1843126fe197SAndrew Boyer 	u8     attr;
1844126fe197SAndrew Boyer 	__le16 vf_index;
1845126fe197SAndrew Boyer 	u8     rsvd[60];
1846126fe197SAndrew Boyer };
1847126fe197SAndrew Boyer 
1848126fe197SAndrew Boyer struct ionic_vf_getattr_comp {
1849126fe197SAndrew Boyer 	u8     status;
1850126fe197SAndrew Boyer 	u8     attr;
1851126fe197SAndrew Boyer 	__le16 vf_index;
1852*e7750639SAndre Muezerie 	union __rte_packed_begin {
1853126fe197SAndrew Boyer 		u8     macaddr[6];
1854126fe197SAndrew Boyer 		__le16 vlanid;
1855126fe197SAndrew Boyer 		__le32 maxrate;
1856126fe197SAndrew Boyer 		u8     spoofchk;
1857126fe197SAndrew Boyer 		u8     trust;
1858126fe197SAndrew Boyer 		u8     linkstate;
1859126fe197SAndrew Boyer 		__le64 stats_pa;
1860126fe197SAndrew Boyer 		u8     pad[11];
1861*e7750639SAndre Muezerie 	} __rte_packed_end;
1862126fe197SAndrew Boyer 	u8     color;
1863126fe197SAndrew Boyer };
1864126fe197SAndrew Boyer 
186501489e5dSAlfredo Cardigliano /**
186601489e5dSAlfredo Cardigliano  * struct ionic_qos_identify_cmd - QoS identify command
186701489e5dSAlfredo Cardigliano  * @opcode:  opcode
186801489e5dSAlfredo Cardigliano  * @ver:     Highest version of identify supported by driver
186901489e5dSAlfredo Cardigliano  *
187001489e5dSAlfredo Cardigliano  */
187101489e5dSAlfredo Cardigliano struct ionic_qos_identify_cmd {
187201489e5dSAlfredo Cardigliano 	u8 opcode;
187301489e5dSAlfredo Cardigliano 	u8 ver;
187401489e5dSAlfredo Cardigliano 	u8 rsvd[62];
187501489e5dSAlfredo Cardigliano };
187601489e5dSAlfredo Cardigliano 
187701489e5dSAlfredo Cardigliano /**
187801489e5dSAlfredo Cardigliano  * struct ionic_qos_identify_comp - QoS identify command completion
1879126fe197SAndrew Boyer  * @status: Status of the command (enum ionic_status_code)
188001489e5dSAlfredo Cardigliano  * @ver:    Version of identify returned by device
188101489e5dSAlfredo Cardigliano  */
188201489e5dSAlfredo Cardigliano struct ionic_qos_identify_comp {
188301489e5dSAlfredo Cardigliano 	u8 status;
188401489e5dSAlfredo Cardigliano 	u8 ver;
188501489e5dSAlfredo Cardigliano 	u8 rsvd[14];
188601489e5dSAlfredo Cardigliano };
188701489e5dSAlfredo Cardigliano 
1888126fe197SAndrew Boyer #define IONIC_QOS_TC_MAX		8
1889126fe197SAndrew Boyer #define IONIC_QOS_ALL_TC		0xFF
1890126fe197SAndrew Boyer /* Capri max supported, should be renamed. */
189101489e5dSAlfredo Cardigliano #define IONIC_QOS_CLASS_MAX		7
1892126fe197SAndrew Boyer #define IONIC_QOS_PCP_MAX		8
189301489e5dSAlfredo Cardigliano #define IONIC_QOS_CLASS_NAME_SZ	32
1894126fe197SAndrew Boyer #define IONIC_QOS_DSCP_MAX		64
1895126fe197SAndrew Boyer #define IONIC_QOS_ALL_PCP		0xFF
1896126fe197SAndrew Boyer #define IONIC_DSCP_BLOCK_SIZE		8
189701489e5dSAlfredo Cardigliano 
189801489e5dSAlfredo Cardigliano /**
189901489e5dSAlfredo Cardigliano  * enum ionic_qos_class
190001489e5dSAlfredo Cardigliano  */
190101489e5dSAlfredo Cardigliano enum ionic_qos_class {
190201489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_DEFAULT		= 0,
190301489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_USER_DEFINED_1	= 1,
190401489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_USER_DEFINED_2	= 2,
190501489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_USER_DEFINED_3	= 3,
190601489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_USER_DEFINED_4	= 4,
190701489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_USER_DEFINED_5	= 5,
190801489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_USER_DEFINED_6	= 6,
190901489e5dSAlfredo Cardigliano };
191001489e5dSAlfredo Cardigliano 
191101489e5dSAlfredo Cardigliano /**
191201489e5dSAlfredo Cardigliano  * enum ionic_qos_class_type - Traffic classification criteria
1913126fe197SAndrew Boyer  * @IONIC_QOS_CLASS_TYPE_NONE:    No QoS
1914126fe197SAndrew Boyer  * @IONIC_QOS_CLASS_TYPE_PCP:     Dot1Q PCP
1915126fe197SAndrew Boyer  * @IONIC_QOS_CLASS_TYPE_DSCP:    IP DSCP
191601489e5dSAlfredo Cardigliano  */
191701489e5dSAlfredo Cardigliano enum ionic_qos_class_type {
191801489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_TYPE_NONE	= 0,
1919126fe197SAndrew Boyer 	IONIC_QOS_CLASS_TYPE_PCP	= 1,
1920126fe197SAndrew Boyer 	IONIC_QOS_CLASS_TYPE_DSCP	= 2,
192101489e5dSAlfredo Cardigliano };
192201489e5dSAlfredo Cardigliano 
192301489e5dSAlfredo Cardigliano /**
1924126fe197SAndrew Boyer  * enum ionic_qos_sched_type - QoS class scheduling type
1925126fe197SAndrew Boyer  * @IONIC_QOS_SCHED_TYPE_STRICT:  Strict priority
1926126fe197SAndrew Boyer  * @IONIC_QOS_SCHED_TYPE_DWRR:    Deficit weighted round-robin
192701489e5dSAlfredo Cardigliano  */
192801489e5dSAlfredo Cardigliano enum ionic_qos_sched_type {
192901489e5dSAlfredo Cardigliano 	IONIC_QOS_SCHED_TYPE_STRICT	= 0,
193001489e5dSAlfredo Cardigliano 	IONIC_QOS_SCHED_TYPE_DWRR	= 1,
193101489e5dSAlfredo Cardigliano };
193201489e5dSAlfredo Cardigliano 
193301489e5dSAlfredo Cardigliano /**
1934126fe197SAndrew Boyer  * union ionic_qos_config - QoS configuration structure
193501489e5dSAlfredo Cardigliano  * @flags:		Configuration flags
193601489e5dSAlfredo Cardigliano  *	IONIC_QOS_CONFIG_F_ENABLE		enable
1937126fe197SAndrew Boyer  *	IONIC_QOS_CONFIG_F_NO_DROP		drop/nodrop
193801489e5dSAlfredo Cardigliano  *	IONIC_QOS_CONFIG_F_RW_DOT1Q_PCP		enable dot1q pcp rewrite
193901489e5dSAlfredo Cardigliano  *	IONIC_QOS_CONFIG_F_RW_IP_DSCP		enable ip dscp rewrite
1940126fe197SAndrew Boyer  *	IONIC_QOS_CONFIG_F_NON_DISRUPTIVE	Non-disruptive TC update
1941126fe197SAndrew Boyer  * @sched_type:		QoS class scheduling type (enum ionic_qos_sched_type)
1942126fe197SAndrew Boyer  * @class_type:		QoS class type (enum ionic_qos_class_type)
1943126fe197SAndrew Boyer  * @pause_type:		QoS pause type (enum ionic_qos_pause_type)
1944126fe197SAndrew Boyer  * @name:		QoS class name
194501489e5dSAlfredo Cardigliano  * @mtu:		MTU of the class
1946126fe197SAndrew Boyer  * @pfc_cos:		Priority-Flow Control class of service
1947126fe197SAndrew Boyer  * @dwrr_weight:	QoS class scheduling weight
194801489e5dSAlfredo Cardigliano  * @strict_rlmt:	Rate limit for strict priority scheduling
1949126fe197SAndrew Boyer  * @rw_dot1q_pcp:	Rewrite dot1q pcp to value (valid iff F_RW_DOT1Q_PCP)
1950126fe197SAndrew Boyer  * @rw_ip_dscp:		Rewrite ip dscp to value (valid iff F_RW_IP_DSCP)
195101489e5dSAlfredo Cardigliano  * @dot1q_pcp:		Dot1q pcp value
195201489e5dSAlfredo Cardigliano  * @ndscp:		Number of valid dscp values in the ip_dscp field
195301489e5dSAlfredo Cardigliano  * @ip_dscp:		IP dscp values
195401489e5dSAlfredo Cardigliano  */
195501489e5dSAlfredo Cardigliano union ionic_qos_config {
1956*e7750639SAndre Muezerie 	struct __rte_packed_begin {
195701489e5dSAlfredo Cardigliano #define IONIC_QOS_CONFIG_F_ENABLE		BIT(0)
1958126fe197SAndrew Boyer #define IONIC_QOS_CONFIG_F_NO_DROP		BIT(1)
1959126fe197SAndrew Boyer /* Used to rewrite PCP or DSCP value. */
196001489e5dSAlfredo Cardigliano #define IONIC_QOS_CONFIG_F_RW_DOT1Q_PCP		BIT(2)
196101489e5dSAlfredo Cardigliano #define IONIC_QOS_CONFIG_F_RW_IP_DSCP		BIT(3)
1962126fe197SAndrew Boyer /* Non-disruptive TC update */
1963126fe197SAndrew Boyer #define IONIC_QOS_CONFIG_F_NON_DISRUPTIVE	BIT(4)
196401489e5dSAlfredo Cardigliano 		u8      flags;
196501489e5dSAlfredo Cardigliano 		u8      sched_type;
196601489e5dSAlfredo Cardigliano 		u8      class_type;
196701489e5dSAlfredo Cardigliano 		u8      pause_type;
196801489e5dSAlfredo Cardigliano 		char    name[IONIC_QOS_CLASS_NAME_SZ];
196901489e5dSAlfredo Cardigliano 		__le32  mtu;
197001489e5dSAlfredo Cardigliano 		/* flow control */
197101489e5dSAlfredo Cardigliano 		u8      pfc_cos;
197201489e5dSAlfredo Cardigliano 		/* scheduler */
197301489e5dSAlfredo Cardigliano 		union {
197401489e5dSAlfredo Cardigliano 			u8      dwrr_weight;
197501489e5dSAlfredo Cardigliano 			__le64  strict_rlmt;
197601489e5dSAlfredo Cardigliano 		};
197701489e5dSAlfredo Cardigliano 		/* marking */
1978126fe197SAndrew Boyer 		/* Used to rewrite PCP or DSCP value. */
197901489e5dSAlfredo Cardigliano 		union {
198001489e5dSAlfredo Cardigliano 			u8      rw_dot1q_pcp;
198101489e5dSAlfredo Cardigliano 			u8      rw_ip_dscp;
198201489e5dSAlfredo Cardigliano 		};
198301489e5dSAlfredo Cardigliano 		/* classification */
198401489e5dSAlfredo Cardigliano 		union {
198501489e5dSAlfredo Cardigliano 			u8      dot1q_pcp;
198601489e5dSAlfredo Cardigliano 			struct {
198701489e5dSAlfredo Cardigliano 				u8      ndscp;
1988126fe197SAndrew Boyer 				u8      ip_dscp[IONIC_QOS_DSCP_MAX];
198901489e5dSAlfredo Cardigliano 			};
199001489e5dSAlfredo Cardigliano 		};
1991*e7750639SAndre Muezerie 	} __rte_packed_end;
199201489e5dSAlfredo Cardigliano 	__le32  words[64];
199301489e5dSAlfredo Cardigliano };
199401489e5dSAlfredo Cardigliano 
199501489e5dSAlfredo Cardigliano /**
199601489e5dSAlfredo Cardigliano  * union ionic_qos_identity - QoS identity structure
199701489e5dSAlfredo Cardigliano  * @version:	Version of the identify structure
199801489e5dSAlfredo Cardigliano  * @type:	QoS system type
199901489e5dSAlfredo Cardigliano  * @nclasses:	Number of usable QoS classes
200001489e5dSAlfredo Cardigliano  * @config:	Current configuration of classes
200101489e5dSAlfredo Cardigliano  */
200201489e5dSAlfredo Cardigliano union ionic_qos_identity {
200301489e5dSAlfredo Cardigliano 	struct {
200401489e5dSAlfredo Cardigliano 		u8     version;
200501489e5dSAlfredo Cardigliano 		u8     type;
200601489e5dSAlfredo Cardigliano 		u8     rsvd[62];
200701489e5dSAlfredo Cardigliano 		union ionic_qos_config config[IONIC_QOS_CLASS_MAX];
200801489e5dSAlfredo Cardigliano 	};
2009126fe197SAndrew Boyer 	__le32 words[478];
201001489e5dSAlfredo Cardigliano };
201101489e5dSAlfredo Cardigliano 
201201489e5dSAlfredo Cardigliano /**
2013126fe197SAndrew Boyer  * struct ionic_qos_init_cmd - QoS config init command
201401489e5dSAlfredo Cardigliano  * @opcode:	Opcode
2015126fe197SAndrew Boyer  * @group:	QoS class id
201601489e5dSAlfredo Cardigliano  * @info_pa:	destination address for qos info
201701489e5dSAlfredo Cardigliano  */
201801489e5dSAlfredo Cardigliano struct ionic_qos_init_cmd {
201901489e5dSAlfredo Cardigliano 	u8     opcode;
202001489e5dSAlfredo Cardigliano 	u8     group;
202101489e5dSAlfredo Cardigliano 	u8     rsvd[6];
202201489e5dSAlfredo Cardigliano 	__le64 info_pa;
202301489e5dSAlfredo Cardigliano 	u8     rsvd1[48];
202401489e5dSAlfredo Cardigliano };
202501489e5dSAlfredo Cardigliano 
202601489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_qos_init_comp;
202701489e5dSAlfredo Cardigliano 
202801489e5dSAlfredo Cardigliano /**
2029126fe197SAndrew Boyer  * struct ionic_qos_reset_cmd - QoS config reset command
203001489e5dSAlfredo Cardigliano  * @opcode:	Opcode
2031126fe197SAndrew Boyer  * @group:	QoS class id
203201489e5dSAlfredo Cardigliano  */
203301489e5dSAlfredo Cardigliano struct ionic_qos_reset_cmd {
203401489e5dSAlfredo Cardigliano 	u8    opcode;
203501489e5dSAlfredo Cardigliano 	u8    group;
203601489e5dSAlfredo Cardigliano 	u8    rsvd[62];
203701489e5dSAlfredo Cardigliano };
203801489e5dSAlfredo Cardigliano 
2039126fe197SAndrew Boyer /**
2040126fe197SAndrew Boyer  * struct ionic_qos_clear_port_stats_cmd - Qos config reset command
2041126fe197SAndrew Boyer  * @opcode:	Opcode
2042126fe197SAndrew Boyer  */
2043126fe197SAndrew Boyer struct ionic_qos_clear_stats_cmd {
2044126fe197SAndrew Boyer 	u8    opcode;
2045126fe197SAndrew Boyer 	u8    group_bitmap;
2046126fe197SAndrew Boyer 	u8    rsvd[62];
2047126fe197SAndrew Boyer };
2048126fe197SAndrew Boyer 
204901489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_qos_reset_comp;
205001489e5dSAlfredo Cardigliano 
205101489e5dSAlfredo Cardigliano /**
205201489e5dSAlfredo Cardigliano  * struct ionic_fw_download_cmd - Firmware download command
205301489e5dSAlfredo Cardigliano  * @opcode:	opcode
205401489e5dSAlfredo Cardigliano  * @addr:	dma address of the firmware buffer
205501489e5dSAlfredo Cardigliano  * @offset:	offset of the firmware buffer within the full image
205601489e5dSAlfredo Cardigliano  * @length:	number of valid bytes in the firmware buffer
205701489e5dSAlfredo Cardigliano  */
205801489e5dSAlfredo Cardigliano struct ionic_fw_download_cmd {
205901489e5dSAlfredo Cardigliano 	u8     opcode;
206001489e5dSAlfredo Cardigliano 	u8     rsvd[3];
206101489e5dSAlfredo Cardigliano 	__le32 offset;
206201489e5dSAlfredo Cardigliano 	__le64 addr;
206301489e5dSAlfredo Cardigliano 	__le32 length;
206401489e5dSAlfredo Cardigliano };
206501489e5dSAlfredo Cardigliano 
206601489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_fw_download_comp;
206701489e5dSAlfredo Cardigliano 
2068126fe197SAndrew Boyer /**
2069126fe197SAndrew Boyer  * enum ionic_fw_control_oper - FW control operations
2070126fe197SAndrew Boyer  * @IONIC_FW_RESET:     Reset firmware
2071126fe197SAndrew Boyer  * @IONIC_FW_INSTALL:   Install firmware
20727be78d02SJosh Soref  * @IONIC_FW_ACTIVATE:  Activate firmware
2073126fe197SAndrew Boyer  */
207401489e5dSAlfredo Cardigliano enum ionic_fw_control_oper {
2075126fe197SAndrew Boyer 	IONIC_FW_RESET		= 0,
2076126fe197SAndrew Boyer 	IONIC_FW_INSTALL	= 1,
2077126fe197SAndrew Boyer 	IONIC_FW_ACTIVATE	= 2,
207801489e5dSAlfredo Cardigliano };
207901489e5dSAlfredo Cardigliano 
208001489e5dSAlfredo Cardigliano /**
208101489e5dSAlfredo Cardigliano  * struct ionic_fw_control_cmd - Firmware control command
208201489e5dSAlfredo Cardigliano  * @opcode:    opcode
208301489e5dSAlfredo Cardigliano  * @oper:      firmware control operation (enum ionic_fw_control_oper)
208401489e5dSAlfredo Cardigliano  * @slot:      slot to activate
208501489e5dSAlfredo Cardigliano  */
208601489e5dSAlfredo Cardigliano struct ionic_fw_control_cmd {
208701489e5dSAlfredo Cardigliano 	u8  opcode;
208801489e5dSAlfredo Cardigliano 	u8  rsvd[3];
208901489e5dSAlfredo Cardigliano 	u8  oper;
209001489e5dSAlfredo Cardigliano 	u8  slot;
209101489e5dSAlfredo Cardigliano 	u8  rsvd1[58];
209201489e5dSAlfredo Cardigliano };
209301489e5dSAlfredo Cardigliano 
209401489e5dSAlfredo Cardigliano /**
20957be78d02SJosh Soref  * struct ionic_fw_control_comp - Firmware control completion
2096126fe197SAndrew Boyer  * @status:     Status of the command (enum ionic_status_code)
2097126fe197SAndrew Boyer  * @comp_index: Index in the descriptor ring for which this is the completion
2098126fe197SAndrew Boyer  * @slot:       Slot where the firmware was installed
2099126fe197SAndrew Boyer  * @color:      Color bit
210001489e5dSAlfredo Cardigliano  */
210101489e5dSAlfredo Cardigliano struct ionic_fw_control_comp {
210201489e5dSAlfredo Cardigliano 	u8     status;
210301489e5dSAlfredo Cardigliano 	u8     rsvd;
210401489e5dSAlfredo Cardigliano 	__le16 comp_index;
210501489e5dSAlfredo Cardigliano 	u8     slot;
210601489e5dSAlfredo Cardigliano 	u8     rsvd1[10];
210701489e5dSAlfredo Cardigliano 	u8     color;
210801489e5dSAlfredo Cardigliano };
210901489e5dSAlfredo Cardigliano 
211001489e5dSAlfredo Cardigliano /******************************************************************
211101489e5dSAlfredo Cardigliano  ******************* RDMA Commands ********************************
211201489e5dSAlfredo Cardigliano  ******************************************************************/
211301489e5dSAlfredo Cardigliano 
211401489e5dSAlfredo Cardigliano /**
211501489e5dSAlfredo Cardigliano  * struct ionic_rdma_reset_cmd - Reset RDMA LIF cmd
211601489e5dSAlfredo Cardigliano  * @opcode:        opcode
2117126fe197SAndrew Boyer  * @lif_index:     LIF index
211801489e5dSAlfredo Cardigliano  *
2119126fe197SAndrew Boyer  * There is no RDMA specific dev command completion struct.  Completion uses
212001489e5dSAlfredo Cardigliano  * the common struct ionic_admin_comp.  Only the status is indicated.
2121126fe197SAndrew Boyer  * Nonzero status means the LIF does not support RDMA.
212201489e5dSAlfredo Cardigliano  **/
212301489e5dSAlfredo Cardigliano struct ionic_rdma_reset_cmd {
212401489e5dSAlfredo Cardigliano 	u8     opcode;
212501489e5dSAlfredo Cardigliano 	u8     rsvd;
212601489e5dSAlfredo Cardigliano 	__le16 lif_index;
212701489e5dSAlfredo Cardigliano 	u8     rsvd2[60];
212801489e5dSAlfredo Cardigliano };
212901489e5dSAlfredo Cardigliano 
213001489e5dSAlfredo Cardigliano /**
213101489e5dSAlfredo Cardigliano  * struct ionic_rdma_queue_cmd - Create RDMA Queue command
213201489e5dSAlfredo Cardigliano  * @opcode:        opcode, 52, 53
2133126fe197SAndrew Boyer  * @lif_index:     LIF index
2134126fe197SAndrew Boyer  * @qid_ver:       (qid | (RDMA version << 24))
213501489e5dSAlfredo Cardigliano  * @cid:           intr, eq_id, or cq_id
213601489e5dSAlfredo Cardigliano  * @dbid:          doorbell page id
213701489e5dSAlfredo Cardigliano  * @depth_log2:    log base two of queue depth
213801489e5dSAlfredo Cardigliano  * @stride_log2:   log base two of queue stride
213901489e5dSAlfredo Cardigliano  * @dma_addr:      address of the queue memory
214001489e5dSAlfredo Cardigliano  *
2141126fe197SAndrew Boyer  * The same command struct is used to create an RDMA event queue, completion
2142126fe197SAndrew Boyer  * queue, or RDMA admin queue.  The cid is an interrupt number for an event
214301489e5dSAlfredo Cardigliano  * queue, an event queue id for a completion queue, or a completion queue id
2144126fe197SAndrew Boyer  * for an RDMA admin queue.
214501489e5dSAlfredo Cardigliano  *
214601489e5dSAlfredo Cardigliano  * The queue created via a dev command must be contiguous in dma space.
214701489e5dSAlfredo Cardigliano  *
214801489e5dSAlfredo Cardigliano  * The dev commands are intended only to be used during driver initialization,
2149126fe197SAndrew Boyer  * to create queues supporting the RDMA admin queue.  Other queues, and other
2150126fe197SAndrew Boyer  * types of RDMA resources like memory regions, will be created and registered
2151126fe197SAndrew Boyer  * via the RDMA admin queue, and will support a more complete interface
215201489e5dSAlfredo Cardigliano  * providing scatter gather lists for larger, scattered queue buffers and
215301489e5dSAlfredo Cardigliano  * memory registration.
215401489e5dSAlfredo Cardigliano  *
2155126fe197SAndrew Boyer  * There is no RDMA specific dev command completion struct.  Completion uses
215601489e5dSAlfredo Cardigliano  * the common struct ionic_admin_comp.  Only the status is indicated.
215701489e5dSAlfredo Cardigliano  **/
215801489e5dSAlfredo Cardigliano struct ionic_rdma_queue_cmd {
215901489e5dSAlfredo Cardigliano 	u8     opcode;
216001489e5dSAlfredo Cardigliano 	u8     rsvd;
216101489e5dSAlfredo Cardigliano 	__le16 lif_index;
216201489e5dSAlfredo Cardigliano 	__le32 qid_ver;
216301489e5dSAlfredo Cardigliano 	__le32 cid;
216401489e5dSAlfredo Cardigliano 	__le16 dbid;
216501489e5dSAlfredo Cardigliano 	u8     depth_log2;
216601489e5dSAlfredo Cardigliano 	u8     stride_log2;
216701489e5dSAlfredo Cardigliano 	__le64 dma_addr;
2168126fe197SAndrew Boyer 	u8     rsvd2[40];
216901489e5dSAlfredo Cardigliano };
217001489e5dSAlfredo Cardigliano 
217101489e5dSAlfredo Cardigliano /******************************************************************
217201489e5dSAlfredo Cardigliano  ******************* Notify Events ********************************
217301489e5dSAlfredo Cardigliano  ******************************************************************/
217401489e5dSAlfredo Cardigliano 
217501489e5dSAlfredo Cardigliano /**
2176126fe197SAndrew Boyer  * struct ionic_notifyq_event - Generic event reporting structure
217701489e5dSAlfredo Cardigliano  * @eid:   event number
217801489e5dSAlfredo Cardigliano  * @ecode: event code
217901489e5dSAlfredo Cardigliano  * @data:  unspecified data about the event
218001489e5dSAlfredo Cardigliano  *
218101489e5dSAlfredo Cardigliano  * This is the generic event report struct from which the other
218201489e5dSAlfredo Cardigliano  * actual events will be formed.
218301489e5dSAlfredo Cardigliano  */
218401489e5dSAlfredo Cardigliano struct ionic_notifyq_event {
218501489e5dSAlfredo Cardigliano 	__le64 eid;
218601489e5dSAlfredo Cardigliano 	__le16 ecode;
218701489e5dSAlfredo Cardigliano 	u8     data[54];
218801489e5dSAlfredo Cardigliano };
218901489e5dSAlfredo Cardigliano 
219001489e5dSAlfredo Cardigliano /**
2191126fe197SAndrew Boyer  * struct ionic_link_change_event - Link change event notification
219201489e5dSAlfredo Cardigliano  * @eid:		event number
2193126fe197SAndrew Boyer  * @ecode:		event code = IONIC_EVENT_LINK_CHANGE
2194126fe197SAndrew Boyer  * @link_status:	link up/down, with error bits (enum ionic_port_status)
219501489e5dSAlfredo Cardigliano  * @link_speed:		speed of the network link
219601489e5dSAlfredo Cardigliano  *
219701489e5dSAlfredo Cardigliano  * Sent when the network link state changes between UP and DOWN
219801489e5dSAlfredo Cardigliano  */
219901489e5dSAlfredo Cardigliano struct ionic_link_change_event {
220001489e5dSAlfredo Cardigliano 	__le64 eid;
220101489e5dSAlfredo Cardigliano 	__le16 ecode;
220201489e5dSAlfredo Cardigliano 	__le16 link_status;
220301489e5dSAlfredo Cardigliano 	__le32 link_speed;	/* units of 1Mbps: e.g. 10000 = 10Gbps */
220401489e5dSAlfredo Cardigliano 	u8     rsvd[48];
220501489e5dSAlfredo Cardigliano };
220601489e5dSAlfredo Cardigliano 
220701489e5dSAlfredo Cardigliano /**
2208126fe197SAndrew Boyer  * struct ionic_reset_event - Reset event notification
220901489e5dSAlfredo Cardigliano  * @eid:		event number
2210126fe197SAndrew Boyer  * @ecode:		event code = IONIC_EVENT_RESET
221101489e5dSAlfredo Cardigliano  * @reset_code:		reset type
221201489e5dSAlfredo Cardigliano  * @state:		0=pending, 1=complete, 2=error
221301489e5dSAlfredo Cardigliano  *
221401489e5dSAlfredo Cardigliano  * Sent when the NIC or some subsystem is going to be or
221501489e5dSAlfredo Cardigliano  * has been reset.
221601489e5dSAlfredo Cardigliano  */
221701489e5dSAlfredo Cardigliano struct ionic_reset_event {
221801489e5dSAlfredo Cardigliano 	__le64 eid;
221901489e5dSAlfredo Cardigliano 	__le16 ecode;
222001489e5dSAlfredo Cardigliano 	u8     reset_code;
222101489e5dSAlfredo Cardigliano 	u8     state;
222201489e5dSAlfredo Cardigliano 	u8     rsvd[52];
222301489e5dSAlfredo Cardigliano };
222401489e5dSAlfredo Cardigliano 
222501489e5dSAlfredo Cardigliano /**
2226126fe197SAndrew Boyer  * struct ionic_heartbeat_event - Sent periodically by NIC to indicate health
222701489e5dSAlfredo Cardigliano  * @eid:	event number
2228126fe197SAndrew Boyer  * @ecode:	event code = IONIC_EVENT_HEARTBEAT
222901489e5dSAlfredo Cardigliano  */
223001489e5dSAlfredo Cardigliano struct ionic_heartbeat_event {
223101489e5dSAlfredo Cardigliano 	__le64 eid;
223201489e5dSAlfredo Cardigliano 	__le16 ecode;
223301489e5dSAlfredo Cardigliano 	u8     rsvd[54];
223401489e5dSAlfredo Cardigliano };
223501489e5dSAlfredo Cardigliano 
223601489e5dSAlfredo Cardigliano /**
2237126fe197SAndrew Boyer  * struct ionic_log_event - Sent to notify the driver of an internal error
223801489e5dSAlfredo Cardigliano  * @eid:	event number
2239126fe197SAndrew Boyer  * @ecode:	event code = IONIC_EVENT_LOG
224001489e5dSAlfredo Cardigliano  * @data:	log data
224101489e5dSAlfredo Cardigliano  */
224201489e5dSAlfredo Cardigliano struct ionic_log_event {
224301489e5dSAlfredo Cardigliano 	__le64 eid;
224401489e5dSAlfredo Cardigliano 	__le16 ecode;
224501489e5dSAlfredo Cardigliano 	u8     data[54];
224601489e5dSAlfredo Cardigliano };
224701489e5dSAlfredo Cardigliano 
224801489e5dSAlfredo Cardigliano /**
2249126fe197SAndrew Boyer  * struct ionic_xcvr_event - Transceiver change event
2250126fe197SAndrew Boyer  * @eid:	event number
2251126fe197SAndrew Boyer  * @ecode:	event code = IONIC_EVENT_XCVR
2252126fe197SAndrew Boyer  */
2253126fe197SAndrew Boyer struct ionic_xcvr_event {
2254126fe197SAndrew Boyer 	__le64 eid;
2255126fe197SAndrew Boyer 	__le16 ecode;
2256126fe197SAndrew Boyer 	u8     rsvd[54];
2257126fe197SAndrew Boyer };
2258126fe197SAndrew Boyer 
2259126fe197SAndrew Boyer /**
2260126fe197SAndrew Boyer  * struct ionic_port_stats - Port statistics structure
226101489e5dSAlfredo Cardigliano  */
226201489e5dSAlfredo Cardigliano struct ionic_port_stats {
226301489e5dSAlfredo Cardigliano 	__le64 frames_rx_ok;
226401489e5dSAlfredo Cardigliano 	__le64 frames_rx_all;
226501489e5dSAlfredo Cardigliano 	__le64 frames_rx_bad_fcs;
226601489e5dSAlfredo Cardigliano 	__le64 frames_rx_bad_all;
226701489e5dSAlfredo Cardigliano 	__le64 octets_rx_ok;
226801489e5dSAlfredo Cardigliano 	__le64 octets_rx_all;
226901489e5dSAlfredo Cardigliano 	__le64 frames_rx_unicast;
227001489e5dSAlfredo Cardigliano 	__le64 frames_rx_multicast;
227101489e5dSAlfredo Cardigliano 	__le64 frames_rx_broadcast;
227201489e5dSAlfredo Cardigliano 	__le64 frames_rx_pause;
227301489e5dSAlfredo Cardigliano 	__le64 frames_rx_bad_length;
227401489e5dSAlfredo Cardigliano 	__le64 frames_rx_undersized;
227501489e5dSAlfredo Cardigliano 	__le64 frames_rx_oversized;
227601489e5dSAlfredo Cardigliano 	__le64 frames_rx_fragments;
227701489e5dSAlfredo Cardigliano 	__le64 frames_rx_jabber;
227801489e5dSAlfredo Cardigliano 	__le64 frames_rx_pripause;
227901489e5dSAlfredo Cardigliano 	__le64 frames_rx_stomped_crc;
228001489e5dSAlfredo Cardigliano 	__le64 frames_rx_too_long;
228101489e5dSAlfredo Cardigliano 	__le64 frames_rx_vlan_good;
228201489e5dSAlfredo Cardigliano 	__le64 frames_rx_dropped;
228301489e5dSAlfredo Cardigliano 	__le64 frames_rx_less_than_64b;
228401489e5dSAlfredo Cardigliano 	__le64 frames_rx_64b;
228501489e5dSAlfredo Cardigliano 	__le64 frames_rx_65b_127b;
228601489e5dSAlfredo Cardigliano 	__le64 frames_rx_128b_255b;
228701489e5dSAlfredo Cardigliano 	__le64 frames_rx_256b_511b;
228801489e5dSAlfredo Cardigliano 	__le64 frames_rx_512b_1023b;
228901489e5dSAlfredo Cardigliano 	__le64 frames_rx_1024b_1518b;
229001489e5dSAlfredo Cardigliano 	__le64 frames_rx_1519b_2047b;
229101489e5dSAlfredo Cardigliano 	__le64 frames_rx_2048b_4095b;
229201489e5dSAlfredo Cardigliano 	__le64 frames_rx_4096b_8191b;
229301489e5dSAlfredo Cardigliano 	__le64 frames_rx_8192b_9215b;
229401489e5dSAlfredo Cardigliano 	__le64 frames_rx_other;
229501489e5dSAlfredo Cardigliano 	__le64 frames_tx_ok;
229601489e5dSAlfredo Cardigliano 	__le64 frames_tx_all;
229701489e5dSAlfredo Cardigliano 	__le64 frames_tx_bad;
229801489e5dSAlfredo Cardigliano 	__le64 octets_tx_ok;
229901489e5dSAlfredo Cardigliano 	__le64 octets_tx_total;
230001489e5dSAlfredo Cardigliano 	__le64 frames_tx_unicast;
230101489e5dSAlfredo Cardigliano 	__le64 frames_tx_multicast;
230201489e5dSAlfredo Cardigliano 	__le64 frames_tx_broadcast;
230301489e5dSAlfredo Cardigliano 	__le64 frames_tx_pause;
230401489e5dSAlfredo Cardigliano 	__le64 frames_tx_pripause;
230501489e5dSAlfredo Cardigliano 	__le64 frames_tx_vlan;
230601489e5dSAlfredo Cardigliano 	__le64 frames_tx_less_than_64b;
230701489e5dSAlfredo Cardigliano 	__le64 frames_tx_64b;
230801489e5dSAlfredo Cardigliano 	__le64 frames_tx_65b_127b;
230901489e5dSAlfredo Cardigliano 	__le64 frames_tx_128b_255b;
231001489e5dSAlfredo Cardigliano 	__le64 frames_tx_256b_511b;
231101489e5dSAlfredo Cardigliano 	__le64 frames_tx_512b_1023b;
231201489e5dSAlfredo Cardigliano 	__le64 frames_tx_1024b_1518b;
231301489e5dSAlfredo Cardigliano 	__le64 frames_tx_1519b_2047b;
231401489e5dSAlfredo Cardigliano 	__le64 frames_tx_2048b_4095b;
231501489e5dSAlfredo Cardigliano 	__le64 frames_tx_4096b_8191b;
231601489e5dSAlfredo Cardigliano 	__le64 frames_tx_8192b_9215b;
231701489e5dSAlfredo Cardigliano 	__le64 frames_tx_other;
231801489e5dSAlfredo Cardigliano 	__le64 frames_tx_pri_0;
231901489e5dSAlfredo Cardigliano 	__le64 frames_tx_pri_1;
232001489e5dSAlfredo Cardigliano 	__le64 frames_tx_pri_2;
232101489e5dSAlfredo Cardigliano 	__le64 frames_tx_pri_3;
232201489e5dSAlfredo Cardigliano 	__le64 frames_tx_pri_4;
232301489e5dSAlfredo Cardigliano 	__le64 frames_tx_pri_5;
232401489e5dSAlfredo Cardigliano 	__le64 frames_tx_pri_6;
232501489e5dSAlfredo Cardigliano 	__le64 frames_tx_pri_7;
232601489e5dSAlfredo Cardigliano 	__le64 frames_rx_pri_0;
232701489e5dSAlfredo Cardigliano 	__le64 frames_rx_pri_1;
232801489e5dSAlfredo Cardigliano 	__le64 frames_rx_pri_2;
232901489e5dSAlfredo Cardigliano 	__le64 frames_rx_pri_3;
233001489e5dSAlfredo Cardigliano 	__le64 frames_rx_pri_4;
233101489e5dSAlfredo Cardigliano 	__le64 frames_rx_pri_5;
233201489e5dSAlfredo Cardigliano 	__le64 frames_rx_pri_6;
233301489e5dSAlfredo Cardigliano 	__le64 frames_rx_pri_7;
233401489e5dSAlfredo Cardigliano 	__le64 tx_pripause_0_1us_count;
233501489e5dSAlfredo Cardigliano 	__le64 tx_pripause_1_1us_count;
233601489e5dSAlfredo Cardigliano 	__le64 tx_pripause_2_1us_count;
233701489e5dSAlfredo Cardigliano 	__le64 tx_pripause_3_1us_count;
233801489e5dSAlfredo Cardigliano 	__le64 tx_pripause_4_1us_count;
233901489e5dSAlfredo Cardigliano 	__le64 tx_pripause_5_1us_count;
234001489e5dSAlfredo Cardigliano 	__le64 tx_pripause_6_1us_count;
234101489e5dSAlfredo Cardigliano 	__le64 tx_pripause_7_1us_count;
234201489e5dSAlfredo Cardigliano 	__le64 rx_pripause_0_1us_count;
234301489e5dSAlfredo Cardigliano 	__le64 rx_pripause_1_1us_count;
234401489e5dSAlfredo Cardigliano 	__le64 rx_pripause_2_1us_count;
234501489e5dSAlfredo Cardigliano 	__le64 rx_pripause_3_1us_count;
234601489e5dSAlfredo Cardigliano 	__le64 rx_pripause_4_1us_count;
234701489e5dSAlfredo Cardigliano 	__le64 rx_pripause_5_1us_count;
234801489e5dSAlfredo Cardigliano 	__le64 rx_pripause_6_1us_count;
234901489e5dSAlfredo Cardigliano 	__le64 rx_pripause_7_1us_count;
235001489e5dSAlfredo Cardigliano 	__le64 rx_pause_1us_count;
235101489e5dSAlfredo Cardigliano 	__le64 frames_tx_truncated;
235201489e5dSAlfredo Cardigliano };
235301489e5dSAlfredo Cardigliano 
235401489e5dSAlfredo Cardigliano struct ionic_mgmt_port_stats {
235501489e5dSAlfredo Cardigliano 	__le64 frames_rx_ok;
235601489e5dSAlfredo Cardigliano 	__le64 frames_rx_all;
235701489e5dSAlfredo Cardigliano 	__le64 frames_rx_bad_fcs;
235801489e5dSAlfredo Cardigliano 	__le64 frames_rx_bad_all;
235901489e5dSAlfredo Cardigliano 	__le64 octets_rx_ok;
236001489e5dSAlfredo Cardigliano 	__le64 octets_rx_all;
236101489e5dSAlfredo Cardigliano 	__le64 frames_rx_unicast;
236201489e5dSAlfredo Cardigliano 	__le64 frames_rx_multicast;
236301489e5dSAlfredo Cardigliano 	__le64 frames_rx_broadcast;
236401489e5dSAlfredo Cardigliano 	__le64 frames_rx_pause;
2365126fe197SAndrew Boyer 	__le64 frames_rx_bad_length;
2366126fe197SAndrew Boyer 	__le64 frames_rx_undersized;
2367126fe197SAndrew Boyer 	__le64 frames_rx_oversized;
2368126fe197SAndrew Boyer 	__le64 frames_rx_fragments;
2369126fe197SAndrew Boyer 	__le64 frames_rx_jabber;
2370126fe197SAndrew Boyer 	__le64 frames_rx_64b;
2371126fe197SAndrew Boyer 	__le64 frames_rx_65b_127b;
2372126fe197SAndrew Boyer 	__le64 frames_rx_128b_255b;
2373126fe197SAndrew Boyer 	__le64 frames_rx_256b_511b;
2374126fe197SAndrew Boyer 	__le64 frames_rx_512b_1023b;
2375126fe197SAndrew Boyer 	__le64 frames_rx_1024b_1518b;
2376126fe197SAndrew Boyer 	__le64 frames_rx_gt_1518b;
2377126fe197SAndrew Boyer 	__le64 frames_rx_fifo_full;
2378126fe197SAndrew Boyer 	__le64 frames_tx_ok;
2379126fe197SAndrew Boyer 	__le64 frames_tx_all;
2380126fe197SAndrew Boyer 	__le64 frames_tx_bad;
2381126fe197SAndrew Boyer 	__le64 octets_tx_ok;
2382126fe197SAndrew Boyer 	__le64 octets_tx_total;
2383126fe197SAndrew Boyer 	__le64 frames_tx_unicast;
2384126fe197SAndrew Boyer 	__le64 frames_tx_multicast;
2385126fe197SAndrew Boyer 	__le64 frames_tx_broadcast;
2386126fe197SAndrew Boyer 	__le64 frames_tx_pause;
2387126fe197SAndrew Boyer };
2388126fe197SAndrew Boyer 
2389126fe197SAndrew Boyer enum ionic_pb_buffer_drop_stats {
2390126fe197SAndrew Boyer 	IONIC_BUFFER_INTRINSIC_DROP = 0,
2391126fe197SAndrew Boyer 	IONIC_BUFFER_DISCARDED,
2392126fe197SAndrew Boyer 	IONIC_BUFFER_ADMITTED,
2393126fe197SAndrew Boyer 	IONIC_BUFFER_OUT_OF_CELLS_DROP,
2394126fe197SAndrew Boyer 	IONIC_BUFFER_OUT_OF_CELLS_DROP_2,
2395126fe197SAndrew Boyer 	IONIC_BUFFER_OUT_OF_CREDIT_DROP,
2396126fe197SAndrew Boyer 	IONIC_BUFFER_TRUNCATION_DROP,
2397126fe197SAndrew Boyer 	IONIC_BUFFER_PORT_DISABLED_DROP,
2398126fe197SAndrew Boyer 	IONIC_BUFFER_COPY_TO_CPU_TAIL_DROP,
2399126fe197SAndrew Boyer 	IONIC_BUFFER_SPAN_TAIL_DROP,
2400126fe197SAndrew Boyer 	IONIC_BUFFER_MIN_SIZE_VIOLATION_DROP,
2401126fe197SAndrew Boyer 	IONIC_BUFFER_ENQUEUE_ERROR_DROP,
2402126fe197SAndrew Boyer 	IONIC_BUFFER_INVALID_PORT_DROP,
2403126fe197SAndrew Boyer 	IONIC_BUFFER_INVALID_OUTPUT_QUEUE_DROP,
2404126fe197SAndrew Boyer 	IONIC_BUFFER_DROP_MAX,
2405126fe197SAndrew Boyer };
2406126fe197SAndrew Boyer 
2407126fe197SAndrew Boyer enum ionic_oflow_drop_stats {
2408126fe197SAndrew Boyer 	IONIC_OFLOW_OCCUPANCY_DROP,
2409126fe197SAndrew Boyer 	IONIC_OFLOW_EMERGENCY_STOP_DROP,
2410126fe197SAndrew Boyer 	IONIC_OFLOW_WRITE_BUFFER_ACK_FILL_UP_DROP,
2411126fe197SAndrew Boyer 	IONIC_OFLOW_WRITE_BUFFER_ACK_FULL_DROP,
2412126fe197SAndrew Boyer 	IONIC_OFLOW_WRITE_BUFFER_FULL_DROP,
2413126fe197SAndrew Boyer 	IONIC_OFLOW_CONTROL_FIFO_FULL_DROP,
2414126fe197SAndrew Boyer 	IONIC_OFLOW_DROP_MAX,
2415126fe197SAndrew Boyer };
2416126fe197SAndrew Boyer 
2417126fe197SAndrew Boyer /**
2418126fe197SAndrew Boyer  * struct port_pb_stats - packet buffers system stats
2419126fe197SAndrew Boyer  * uses ionic_pb_buffer_drop_stats for drop_counts[]
2420126fe197SAndrew Boyer  */
2421126fe197SAndrew Boyer struct ionic_port_pb_stats {
2422126fe197SAndrew Boyer 	__le64 sop_count_in;
2423126fe197SAndrew Boyer 	__le64 eop_count_in;
2424126fe197SAndrew Boyer 	__le64 sop_count_out;
2425126fe197SAndrew Boyer 	__le64 eop_count_out;
2426126fe197SAndrew Boyer 	__le64 drop_counts[IONIC_BUFFER_DROP_MAX];
2427126fe197SAndrew Boyer 	__le64 input_queue_buffer_occupancy[IONIC_QOS_TC_MAX];
2428126fe197SAndrew Boyer 	__le64 input_queue_port_monitor[IONIC_QOS_TC_MAX];
2429126fe197SAndrew Boyer 	__le64 output_queue_port_monitor[IONIC_QOS_TC_MAX];
2430126fe197SAndrew Boyer 	__le64 oflow_drop_counts[IONIC_OFLOW_DROP_MAX];
2431126fe197SAndrew Boyer 	__le64 input_queue_good_pkts_in[IONIC_QOS_TC_MAX];
2432126fe197SAndrew Boyer 	__le64 input_queue_good_pkts_out[IONIC_QOS_TC_MAX];
2433126fe197SAndrew Boyer 	__le64 input_queue_err_pkts_in[IONIC_QOS_TC_MAX];
2434126fe197SAndrew Boyer 	__le64 input_queue_fifo_depth[IONIC_QOS_TC_MAX];
2435126fe197SAndrew Boyer 	__le64 input_queue_max_fifo_depth[IONIC_QOS_TC_MAX];
2436126fe197SAndrew Boyer 	__le64 input_queue_peak_occupancy[IONIC_QOS_TC_MAX];
2437126fe197SAndrew Boyer 	__le64 output_queue_buffer_occupancy[IONIC_QOS_TC_MAX];
2438126fe197SAndrew Boyer };
2439126fe197SAndrew Boyer 
2440126fe197SAndrew Boyer /**
2441126fe197SAndrew Boyer  * enum ionic_port_type - Port types
2442126fe197SAndrew Boyer  * @IONIC_ETH_UNKNOWN:             Port type not configured
2443126fe197SAndrew Boyer  * @IONIC_ETH_HOST:                Port carries ethernet traffic (inband)
2444126fe197SAndrew Boyer  * @IONIC_ETH_HOST_MGMT:           Port carries mgmt traffic (out-of-band)
2445126fe197SAndrew Boyer  * @IONIC_ETH_MNIC_OOB_MGMT:
2446126fe197SAndrew Boyer  * @IONIC_ETH_MNIC_INTERNAL_MGMT:
2447126fe197SAndrew Boyer  * @IONIC_ETH_MNIC_INBAND_MGMT:
2448126fe197SAndrew Boyer  * @IONIC_ETH_MNIC_CPU:
2449126fe197SAndrew Boyer  * @IONIC_ETH_MNIC_LEARN:
2450126fe197SAndrew Boyer  * @IONIC_ETH_MNIC_CONTROL:
2451126fe197SAndrew Boyer  */
2452126fe197SAndrew Boyer enum ionic_port_type {
2453126fe197SAndrew Boyer 	IONIC_ETH_UNKNOWN,
2454126fe197SAndrew Boyer 	IONIC_ETH_HOST,
2455126fe197SAndrew Boyer 	IONIC_ETH_HOST_MGMT,
2456126fe197SAndrew Boyer 	IONIC_ETH_MNIC_OOB_MGMT,
2457126fe197SAndrew Boyer 	IONIC_ETH_MNIC_INTERNAL_MGMT,
2458126fe197SAndrew Boyer 	IONIC_ETH_MNIC_INBAND_MGMT,
2459126fe197SAndrew Boyer 	IONIC_ETH_MNIC_CPU,
2460126fe197SAndrew Boyer 	IONIC_ETH_MNIC_LEARN,
2461126fe197SAndrew Boyer 	IONIC_ETH_MNIC_CONTROL,
246201489e5dSAlfredo Cardigliano };
246301489e5dSAlfredo Cardigliano 
246401489e5dSAlfredo Cardigliano /**
246501489e5dSAlfredo Cardigliano  * struct ionic_port_identity - port identity structure
246601489e5dSAlfredo Cardigliano  * @version:        identity structure version
2467126fe197SAndrew Boyer  * @type:           type of port (enum ionic_port_type)
246801489e5dSAlfredo Cardigliano  * @num_lanes:      number of lanes for the port
246901489e5dSAlfredo Cardigliano  * @autoneg:        autoneg supported
247001489e5dSAlfredo Cardigliano  * @min_frame_size: minimum frame size supported
247101489e5dSAlfredo Cardigliano  * @max_frame_size: maximum frame size supported
247201489e5dSAlfredo Cardigliano  * @fec_type:       supported fec types
247301489e5dSAlfredo Cardigliano  * @pause_type:     supported pause types
247401489e5dSAlfredo Cardigliano  * @loopback_mode:  supported loopback mode
247501489e5dSAlfredo Cardigliano  * @speeds:         supported speeds
247601489e5dSAlfredo Cardigliano  * @config:         current port configuration
247701489e5dSAlfredo Cardigliano  */
247801489e5dSAlfredo Cardigliano union ionic_port_identity {
247901489e5dSAlfredo Cardigliano 	struct {
248001489e5dSAlfredo Cardigliano 		u8     version;
248101489e5dSAlfredo Cardigliano 		u8     type;
248201489e5dSAlfredo Cardigliano 		u8     num_lanes;
248301489e5dSAlfredo Cardigliano 		u8     autoneg;
248401489e5dSAlfredo Cardigliano 		__le32 min_frame_size;
248501489e5dSAlfredo Cardigliano 		__le32 max_frame_size;
248601489e5dSAlfredo Cardigliano 		u8     fec_type[4];
248701489e5dSAlfredo Cardigliano 		u8     pause_type[2];
248801489e5dSAlfredo Cardigliano 		u8     loopback_mode[2];
248901489e5dSAlfredo Cardigliano 		__le32 speeds[16];
249001489e5dSAlfredo Cardigliano 		u8     rsvd2[44];
249101489e5dSAlfredo Cardigliano 		union ionic_port_config config;
249201489e5dSAlfredo Cardigliano 	};
2493126fe197SAndrew Boyer 	__le32 words[478];
249401489e5dSAlfredo Cardigliano };
249501489e5dSAlfredo Cardigliano 
249601489e5dSAlfredo Cardigliano /**
249701489e5dSAlfredo Cardigliano  * struct ionic_port_info - port info structure
2498126fe197SAndrew Boyer  * @config:          Port configuration data
2499126fe197SAndrew Boyer  * @status:          Port status data
2500126fe197SAndrew Boyer  * @stats:           Port statistics data
2501126fe197SAndrew Boyer  * @mgmt_stats:      Port management statistics data
2502126fe197SAndrew Boyer  * @port_pb_drop_stats:   uplink pb drop stats
250301489e5dSAlfredo Cardigliano  */
250401489e5dSAlfredo Cardigliano struct ionic_port_info {
250501489e5dSAlfredo Cardigliano 	union ionic_port_config config;
250601489e5dSAlfredo Cardigliano 	struct ionic_port_status status;
2507126fe197SAndrew Boyer 	union {
250801489e5dSAlfredo Cardigliano 		struct ionic_port_stats      stats;
2509126fe197SAndrew Boyer 		struct ionic_mgmt_port_stats mgmt_stats;
2510126fe197SAndrew Boyer 	};
2511126fe197SAndrew Boyer 	/* room for pb_stats to start at 2k offset */
2512126fe197SAndrew Boyer 	u8                          rsvd[760];
2513126fe197SAndrew Boyer 	struct ionic_port_pb_stats  pb_stats;
251401489e5dSAlfredo Cardigliano };
251501489e5dSAlfredo Cardigliano 
251601489e5dSAlfredo Cardigliano /**
2517126fe197SAndrew Boyer  * struct ionic_lif_stats - LIF statistics structure
251801489e5dSAlfredo Cardigliano  */
251901489e5dSAlfredo Cardigliano struct ionic_lif_stats {
252001489e5dSAlfredo Cardigliano 	/* RX */
252101489e5dSAlfredo Cardigliano 	__le64 rx_ucast_bytes;
252201489e5dSAlfredo Cardigliano 	__le64 rx_ucast_packets;
252301489e5dSAlfredo Cardigliano 	__le64 rx_mcast_bytes;
252401489e5dSAlfredo Cardigliano 	__le64 rx_mcast_packets;
252501489e5dSAlfredo Cardigliano 	__le64 rx_bcast_bytes;
252601489e5dSAlfredo Cardigliano 	__le64 rx_bcast_packets;
252701489e5dSAlfredo Cardigliano 	__le64 rsvd0;
252801489e5dSAlfredo Cardigliano 	__le64 rsvd1;
252901489e5dSAlfredo Cardigliano 	/* RX drops */
253001489e5dSAlfredo Cardigliano 	__le64 rx_ucast_drop_bytes;
253101489e5dSAlfredo Cardigliano 	__le64 rx_ucast_drop_packets;
253201489e5dSAlfredo Cardigliano 	__le64 rx_mcast_drop_bytes;
253301489e5dSAlfredo Cardigliano 	__le64 rx_mcast_drop_packets;
253401489e5dSAlfredo Cardigliano 	__le64 rx_bcast_drop_bytes;
253501489e5dSAlfredo Cardigliano 	__le64 rx_bcast_drop_packets;
253601489e5dSAlfredo Cardigliano 	__le64 rx_dma_error;
253701489e5dSAlfredo Cardigliano 	__le64 rsvd2;
253801489e5dSAlfredo Cardigliano 	/* TX */
253901489e5dSAlfredo Cardigliano 	__le64 tx_ucast_bytes;
254001489e5dSAlfredo Cardigliano 	__le64 tx_ucast_packets;
254101489e5dSAlfredo Cardigliano 	__le64 tx_mcast_bytes;
254201489e5dSAlfredo Cardigliano 	__le64 tx_mcast_packets;
254301489e5dSAlfredo Cardigliano 	__le64 tx_bcast_bytes;
254401489e5dSAlfredo Cardigliano 	__le64 tx_bcast_packets;
254501489e5dSAlfredo Cardigliano 	__le64 rsvd3;
254601489e5dSAlfredo Cardigliano 	__le64 rsvd4;
254701489e5dSAlfredo Cardigliano 	/* TX drops */
254801489e5dSAlfredo Cardigliano 	__le64 tx_ucast_drop_bytes;
254901489e5dSAlfredo Cardigliano 	__le64 tx_ucast_drop_packets;
255001489e5dSAlfredo Cardigliano 	__le64 tx_mcast_drop_bytes;
255101489e5dSAlfredo Cardigliano 	__le64 tx_mcast_drop_packets;
255201489e5dSAlfredo Cardigliano 	__le64 tx_bcast_drop_bytes;
255301489e5dSAlfredo Cardigliano 	__le64 tx_bcast_drop_packets;
255401489e5dSAlfredo Cardigliano 	__le64 tx_dma_error;
255501489e5dSAlfredo Cardigliano 	__le64 rsvd5;
255601489e5dSAlfredo Cardigliano 	/* Rx Queue/Ring drops */
255701489e5dSAlfredo Cardigliano 	__le64 rx_queue_disabled;
255801489e5dSAlfredo Cardigliano 	__le64 rx_queue_empty;
255901489e5dSAlfredo Cardigliano 	__le64 rx_queue_error;
256001489e5dSAlfredo Cardigliano 	__le64 rx_desc_fetch_error;
256101489e5dSAlfredo Cardigliano 	__le64 rx_desc_data_error;
256201489e5dSAlfredo Cardigliano 	__le64 rsvd6;
256301489e5dSAlfredo Cardigliano 	__le64 rsvd7;
256401489e5dSAlfredo Cardigliano 	__le64 rsvd8;
256501489e5dSAlfredo Cardigliano 	/* Tx Queue/Ring drops */
256601489e5dSAlfredo Cardigliano 	__le64 tx_queue_disabled;
256701489e5dSAlfredo Cardigliano 	__le64 tx_queue_error;
256801489e5dSAlfredo Cardigliano 	__le64 tx_desc_fetch_error;
256901489e5dSAlfredo Cardigliano 	__le64 tx_desc_data_error;
2570126fe197SAndrew Boyer 	__le64 tx_queue_empty;
257101489e5dSAlfredo Cardigliano 	__le64 rsvd10;
257201489e5dSAlfredo Cardigliano 	__le64 rsvd11;
257301489e5dSAlfredo Cardigliano 	__le64 rsvd12;
257401489e5dSAlfredo Cardigliano 
257501489e5dSAlfredo Cardigliano 	/* RDMA/ROCE TX */
257601489e5dSAlfredo Cardigliano 	__le64 tx_rdma_ucast_bytes;
257701489e5dSAlfredo Cardigliano 	__le64 tx_rdma_ucast_packets;
257801489e5dSAlfredo Cardigliano 	__le64 tx_rdma_mcast_bytes;
257901489e5dSAlfredo Cardigliano 	__le64 tx_rdma_mcast_packets;
258001489e5dSAlfredo Cardigliano 	__le64 tx_rdma_cnp_packets;
258101489e5dSAlfredo Cardigliano 	__le64 rsvd13;
258201489e5dSAlfredo Cardigliano 	__le64 rsvd14;
258301489e5dSAlfredo Cardigliano 	__le64 rsvd15;
258401489e5dSAlfredo Cardigliano 
258501489e5dSAlfredo Cardigliano 	/* RDMA/ROCE RX */
258601489e5dSAlfredo Cardigliano 	__le64 rx_rdma_ucast_bytes;
258701489e5dSAlfredo Cardigliano 	__le64 rx_rdma_ucast_packets;
258801489e5dSAlfredo Cardigliano 	__le64 rx_rdma_mcast_bytes;
258901489e5dSAlfredo Cardigliano 	__le64 rx_rdma_mcast_packets;
259001489e5dSAlfredo Cardigliano 	__le64 rx_rdma_cnp_packets;
259101489e5dSAlfredo Cardigliano 	__le64 rx_rdma_ecn_packets;
259201489e5dSAlfredo Cardigliano 	__le64 rsvd16;
259301489e5dSAlfredo Cardigliano 	__le64 rsvd17;
259401489e5dSAlfredo Cardigliano 
2595081d035eSBrad Larson 	__le64 flex1;
2596081d035eSBrad Larson 	__le64 flex2;
2597081d035eSBrad Larson 	__le64 flex3;
2598081d035eSBrad Larson 	__le64 flex4;
2599081d035eSBrad Larson 	__le64 flex5;
2600081d035eSBrad Larson 	__le64 flex6;
2601081d035eSBrad Larson 	__le64 flex7;
2602081d035eSBrad Larson 	__le64 flex8;
260301489e5dSAlfredo Cardigliano 
2604081d035eSBrad Larson 	__le64 flex9;
2605081d035eSBrad Larson 	__le64 flex10;
2606081d035eSBrad Larson 	__le64 flex11;
2607081d035eSBrad Larson 	__le64 flex12;
2608081d035eSBrad Larson 	__le64 flex13;
2609081d035eSBrad Larson 	__le64 flex14;
2610081d035eSBrad Larson 	__le64 flex15;
2611081d035eSBrad Larson 	__le64 flex16;
261201489e5dSAlfredo Cardigliano 
2613081d035eSBrad Larson 	__le64 flex17;
2614081d035eSBrad Larson 	__le64 flex18;
2615081d035eSBrad Larson 	__le64 flex19;
2616081d035eSBrad Larson 	__le64 flex20;
2617081d035eSBrad Larson 	__le64 flex21;
2618081d035eSBrad Larson 	__le64 flex22;
2619081d035eSBrad Larson 	__le64 flex23;
2620081d035eSBrad Larson 	__le64 flex24;
262101489e5dSAlfredo Cardigliano 
2622081d035eSBrad Larson 	__le64 flex25;
2623081d035eSBrad Larson 	__le64 flex26;
2624081d035eSBrad Larson 	__le64 flex27;
2625081d035eSBrad Larson 	__le64 flex28;
2626081d035eSBrad Larson 	__le64 flex29;
2627081d035eSBrad Larson 	__le64 flex30;
2628081d035eSBrad Larson 	__le64 flex31;
2629081d035eSBrad Larson 	__le64 flex32;
263001489e5dSAlfredo Cardigliano 
263101489e5dSAlfredo Cardigliano 	/* RDMA/ROCE REQ Error/Debugs (768 - 895) */
263201489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_pkt_seq_err;
263301489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_rnr_retry_err;
263401489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_remote_access_err;
263501489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_remote_inv_req_err;
263601489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_remote_oper_err;
263701489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_implied_nak_seq_err;
263801489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_cqe_err;
263901489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_cqe_flush_err;
264001489e5dSAlfredo Cardigliano 
264101489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_dup_responses;
264201489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_invalid_packets;
264301489e5dSAlfredo Cardigliano 	__le64 rdma_req_tx_local_access_err;
264401489e5dSAlfredo Cardigliano 	__le64 rdma_req_tx_local_oper_err;
264501489e5dSAlfredo Cardigliano 	__le64 rdma_req_tx_memory_mgmt_err;
264601489e5dSAlfredo Cardigliano 	__le64 rsvd52;
264701489e5dSAlfredo Cardigliano 	__le64 rsvd53;
264801489e5dSAlfredo Cardigliano 	__le64 rsvd54;
264901489e5dSAlfredo Cardigliano 
265001489e5dSAlfredo Cardigliano 	/* RDMA/ROCE RESP Error/Debugs (896 - 1023) */
265101489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_dup_requests;
265201489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_out_of_buffer;
265301489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_out_of_seq_pkts;
265401489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_cqe_err;
265501489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_cqe_flush_err;
265601489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_local_len_err;
265701489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_inv_request_err;
265801489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_local_qp_oper_err;
265901489e5dSAlfredo Cardigliano 
266001489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_out_of_atomic_resource;
266101489e5dSAlfredo Cardigliano 	__le64 rdma_resp_tx_pkt_seq_err;
266201489e5dSAlfredo Cardigliano 	__le64 rdma_resp_tx_remote_inv_req_err;
266301489e5dSAlfredo Cardigliano 	__le64 rdma_resp_tx_remote_access_err;
266401489e5dSAlfredo Cardigliano 	__le64 rdma_resp_tx_remote_oper_err;
266501489e5dSAlfredo Cardigliano 	__le64 rdma_resp_tx_rnr_retry_err;
266601489e5dSAlfredo Cardigliano 	__le64 rsvd57;
266701489e5dSAlfredo Cardigliano 	__le64 rsvd58;
266801489e5dSAlfredo Cardigliano };
266901489e5dSAlfredo Cardigliano 
267001489e5dSAlfredo Cardigliano /**
2671126fe197SAndrew Boyer  * struct ionic_lif_info - LIF info structure
2672126fe197SAndrew Boyer  * @config:	LIF configuration structure
2673126fe197SAndrew Boyer  * @status:	LIF status structure
2674126fe197SAndrew Boyer  * @stats:	LIF statistics structure
267501489e5dSAlfredo Cardigliano  */
267601489e5dSAlfredo Cardigliano struct ionic_lif_info {
267701489e5dSAlfredo Cardigliano 	union ionic_lif_config config;
267801489e5dSAlfredo Cardigliano 	struct ionic_lif_status status;
267901489e5dSAlfredo Cardigliano 	struct ionic_lif_stats stats;
268001489e5dSAlfredo Cardigliano };
268101489e5dSAlfredo Cardigliano 
268201489e5dSAlfredo Cardigliano union ionic_dev_cmd {
268301489e5dSAlfredo Cardigliano 	u32 words[16];
268401489e5dSAlfredo Cardigliano 	struct ionic_admin_cmd cmd;
268501489e5dSAlfredo Cardigliano 	struct ionic_nop_cmd nop;
268601489e5dSAlfredo Cardigliano 
268701489e5dSAlfredo Cardigliano 	struct ionic_dev_identify_cmd identify;
268801489e5dSAlfredo Cardigliano 	struct ionic_dev_init_cmd init;
268901489e5dSAlfredo Cardigliano 	struct ionic_dev_reset_cmd reset;
269001489e5dSAlfredo Cardigliano 	struct ionic_dev_getattr_cmd getattr;
269101489e5dSAlfredo Cardigliano 	struct ionic_dev_setattr_cmd setattr;
269201489e5dSAlfredo Cardigliano 
269301489e5dSAlfredo Cardigliano 	struct ionic_port_identify_cmd port_identify;
269401489e5dSAlfredo Cardigliano 	struct ionic_port_init_cmd port_init;
269501489e5dSAlfredo Cardigliano 	struct ionic_port_reset_cmd port_reset;
269601489e5dSAlfredo Cardigliano 	struct ionic_port_getattr_cmd port_getattr;
269701489e5dSAlfredo Cardigliano 	struct ionic_port_setattr_cmd port_setattr;
269801489e5dSAlfredo Cardigliano 
2699126fe197SAndrew Boyer 	struct ionic_vf_setattr_cmd vf_setattr;
2700126fe197SAndrew Boyer 	struct ionic_vf_getattr_cmd vf_getattr;
2701126fe197SAndrew Boyer 
270201489e5dSAlfredo Cardigliano 	struct ionic_lif_identify_cmd lif_identify;
270301489e5dSAlfredo Cardigliano 	struct ionic_lif_init_cmd lif_init;
270401489e5dSAlfredo Cardigliano 	struct ionic_lif_reset_cmd lif_reset;
270501489e5dSAlfredo Cardigliano 
270601489e5dSAlfredo Cardigliano 	struct ionic_qos_identify_cmd qos_identify;
270701489e5dSAlfredo Cardigliano 	struct ionic_qos_init_cmd qos_init;
270801489e5dSAlfredo Cardigliano 	struct ionic_qos_reset_cmd qos_reset;
2709126fe197SAndrew Boyer 	struct ionic_qos_clear_stats_cmd qos_clear_stats;
271001489e5dSAlfredo Cardigliano 
2711126fe197SAndrew Boyer 	struct ionic_q_identify_cmd q_identify;
271201489e5dSAlfredo Cardigliano 	struct ionic_q_init_cmd q_init;
2713126fe197SAndrew Boyer 	struct ionic_q_control_cmd q_control;
271401489e5dSAlfredo Cardigliano };
271501489e5dSAlfredo Cardigliano 
271601489e5dSAlfredo Cardigliano union ionic_dev_cmd_comp {
271701489e5dSAlfredo Cardigliano 	u32 words[4];
271801489e5dSAlfredo Cardigliano 	u8 status;
271901489e5dSAlfredo Cardigliano 	struct ionic_admin_comp comp;
272001489e5dSAlfredo Cardigliano 	struct ionic_nop_comp nop;
272101489e5dSAlfredo Cardigliano 
272201489e5dSAlfredo Cardigliano 	struct ionic_dev_identify_comp identify;
272301489e5dSAlfredo Cardigliano 	struct ionic_dev_init_comp init;
272401489e5dSAlfredo Cardigliano 	struct ionic_dev_reset_comp reset;
272501489e5dSAlfredo Cardigliano 	struct ionic_dev_getattr_comp getattr;
272601489e5dSAlfredo Cardigliano 	struct ionic_dev_setattr_comp setattr;
272701489e5dSAlfredo Cardigliano 
272801489e5dSAlfredo Cardigliano 	struct ionic_port_identify_comp port_identify;
272901489e5dSAlfredo Cardigliano 	struct ionic_port_init_comp port_init;
273001489e5dSAlfredo Cardigliano 	struct ionic_port_reset_comp port_reset;
273101489e5dSAlfredo Cardigliano 	struct ionic_port_getattr_comp port_getattr;
273201489e5dSAlfredo Cardigliano 	struct ionic_port_setattr_comp port_setattr;
273301489e5dSAlfredo Cardigliano 
2734126fe197SAndrew Boyer 	struct ionic_vf_setattr_comp vf_setattr;
2735126fe197SAndrew Boyer 	struct ionic_vf_getattr_comp vf_getattr;
2736126fe197SAndrew Boyer 
273701489e5dSAlfredo Cardigliano 	struct ionic_lif_identify_comp lif_identify;
273801489e5dSAlfredo Cardigliano 	struct ionic_lif_init_comp lif_init;
273901489e5dSAlfredo Cardigliano 	ionic_lif_reset_comp lif_reset;
274001489e5dSAlfredo Cardigliano 
274101489e5dSAlfredo Cardigliano 	struct ionic_qos_identify_comp qos_identify;
274201489e5dSAlfredo Cardigliano 	ionic_qos_init_comp qos_init;
274301489e5dSAlfredo Cardigliano 	ionic_qos_reset_comp qos_reset;
274401489e5dSAlfredo Cardigliano 
2745126fe197SAndrew Boyer 	struct ionic_q_identify_comp q_identify;
274601489e5dSAlfredo Cardigliano 	struct ionic_q_init_comp q_init;
274701489e5dSAlfredo Cardigliano };
274801489e5dSAlfredo Cardigliano 
274901489e5dSAlfredo Cardigliano /**
2750126fe197SAndrew Boyer  * union ionic_dev_info_regs - Device info register format (read-only)
2751126fe197SAndrew Boyer  * @signature:       Signature value of 0x44455649 ('DEVI')
2752126fe197SAndrew Boyer  * @version:         Current version of info
2753126fe197SAndrew Boyer  * @asic_type:       Asic type
2754126fe197SAndrew Boyer  * @asic_rev:        Asic revision
2755126fe197SAndrew Boyer  * @fw_status:       Firmware status
2756126fe197SAndrew Boyer  * @fw_heartbeat:    Firmware heartbeat counter
2757126fe197SAndrew Boyer  * @serial_num:      Serial number
2758126fe197SAndrew Boyer  * @fw_version:      Firmware version
275901489e5dSAlfredo Cardigliano  */
276001489e5dSAlfredo Cardigliano union ionic_dev_info_regs {
276101489e5dSAlfredo Cardigliano #define IONIC_DEVINFO_FWVERS_BUFLEN 32
276201489e5dSAlfredo Cardigliano #define IONIC_DEVINFO_SERIAL_BUFLEN 32
276301489e5dSAlfredo Cardigliano 	struct {
276401489e5dSAlfredo Cardigliano 		u32    signature;
276501489e5dSAlfredo Cardigliano 		u8     version;
276601489e5dSAlfredo Cardigliano 		u8     asic_type;
276701489e5dSAlfredo Cardigliano 		u8     asic_rev;
2768126fe197SAndrew Boyer #define IONIC_FW_STS_F_RUNNING	0x1
276901489e5dSAlfredo Cardigliano 		u8     fw_status;
277001489e5dSAlfredo Cardigliano 		u32    fw_heartbeat;
277101489e5dSAlfredo Cardigliano 		char   fw_version[IONIC_DEVINFO_FWVERS_BUFLEN];
277201489e5dSAlfredo Cardigliano 		char   serial_num[IONIC_DEVINFO_SERIAL_BUFLEN];
277301489e5dSAlfredo Cardigliano 	};
277401489e5dSAlfredo Cardigliano 	u32 words[512];
277501489e5dSAlfredo Cardigliano };
277601489e5dSAlfredo Cardigliano 
277701489e5dSAlfredo Cardigliano /**
277801489e5dSAlfredo Cardigliano  * union ionic_dev_cmd_regs - Device command register format (read-write)
2779126fe197SAndrew Boyer  * @doorbell:        Device Cmd Doorbell, write-only
278001489e5dSAlfredo Cardigliano  *                   Write a 1 to signal device to process cmd,
278101489e5dSAlfredo Cardigliano  *                   poll done for completion.
2782126fe197SAndrew Boyer  * @done:            Done indicator, bit 0 == 1 when command is complete
278301489e5dSAlfredo Cardigliano  * @cmd:             Opcode-specific command bytes
278401489e5dSAlfredo Cardigliano  * @comp:            Opcode-specific response bytes
278501489e5dSAlfredo Cardigliano  * @data:            Opcode-specific side-data
278601489e5dSAlfredo Cardigliano  */
278701489e5dSAlfredo Cardigliano union ionic_dev_cmd_regs {
2788*e7750639SAndre Muezerie 	struct __rte_packed_begin {
278901489e5dSAlfredo Cardigliano 		u32                   doorbell;
279001489e5dSAlfredo Cardigliano 		u32                   done;
279101489e5dSAlfredo Cardigliano 		union ionic_dev_cmd         cmd;
279201489e5dSAlfredo Cardigliano 		union ionic_dev_cmd_comp    comp;
279301489e5dSAlfredo Cardigliano 		u8                    rsvd[48];
279401489e5dSAlfredo Cardigliano 		u32                   data[478];
2795*e7750639SAndre Muezerie 	} __rte_packed_end;
279601489e5dSAlfredo Cardigliano 	u32 words[512];
279701489e5dSAlfredo Cardigliano };
279801489e5dSAlfredo Cardigliano 
279901489e5dSAlfredo Cardigliano /**
2800126fe197SAndrew Boyer  * union ionic_dev_regs - Device register format for bar 0 page 0
280101489e5dSAlfredo Cardigliano  * @info:            Device info registers
280201489e5dSAlfredo Cardigliano  * @devcmd:          Device command registers
280301489e5dSAlfredo Cardigliano  */
280401489e5dSAlfredo Cardigliano union ionic_dev_regs {
2805*e7750639SAndre Muezerie 	struct __rte_packed_begin {
280601489e5dSAlfredo Cardigliano 		union ionic_dev_info_regs info;
280701489e5dSAlfredo Cardigliano 		union ionic_dev_cmd_regs  devcmd;
2808*e7750639SAndre Muezerie 	} __rte_packed_end;
280901489e5dSAlfredo Cardigliano 	__le32 words[1024];
281001489e5dSAlfredo Cardigliano };
281101489e5dSAlfredo Cardigliano 
281201489e5dSAlfredo Cardigliano union ionic_adminq_cmd {
281301489e5dSAlfredo Cardigliano 	struct ionic_admin_cmd cmd;
281401489e5dSAlfredo Cardigliano 	struct ionic_nop_cmd nop;
2815126fe197SAndrew Boyer 	struct ionic_q_identify_cmd q_identify;
281601489e5dSAlfredo Cardigliano 	struct ionic_q_init_cmd q_init;
281701489e5dSAlfredo Cardigliano 	struct ionic_q_control_cmd q_control;
281801489e5dSAlfredo Cardigliano 	struct ionic_lif_setattr_cmd lif_setattr;
281901489e5dSAlfredo Cardigliano 	struct ionic_lif_getattr_cmd lif_getattr;
282001489e5dSAlfredo Cardigliano 	struct ionic_rx_mode_set_cmd rx_mode_set;
282101489e5dSAlfredo Cardigliano 	struct ionic_rx_filter_add_cmd rx_filter_add;
282201489e5dSAlfredo Cardigliano 	struct ionic_rx_filter_del_cmd rx_filter_del;
282301489e5dSAlfredo Cardigliano 	struct ionic_rdma_reset_cmd rdma_reset;
282401489e5dSAlfredo Cardigliano 	struct ionic_rdma_queue_cmd rdma_queue;
282501489e5dSAlfredo Cardigliano 	struct ionic_fw_download_cmd fw_download;
282601489e5dSAlfredo Cardigliano 	struct ionic_fw_control_cmd fw_control;
282701489e5dSAlfredo Cardigliano };
282801489e5dSAlfredo Cardigliano 
282901489e5dSAlfredo Cardigliano union ionic_adminq_comp {
283001489e5dSAlfredo Cardigliano 	struct ionic_admin_comp comp;
283101489e5dSAlfredo Cardigliano 	struct ionic_nop_comp nop;
2832126fe197SAndrew Boyer 	struct ionic_q_identify_comp q_identify;
283301489e5dSAlfredo Cardigliano 	struct ionic_q_init_comp q_init;
283401489e5dSAlfredo Cardigliano 	struct ionic_lif_setattr_comp lif_setattr;
283501489e5dSAlfredo Cardigliano 	struct ionic_lif_getattr_comp lif_getattr;
283601489e5dSAlfredo Cardigliano 	struct ionic_rx_filter_add_comp rx_filter_add;
283701489e5dSAlfredo Cardigliano 	struct ionic_fw_control_comp fw_control;
283801489e5dSAlfredo Cardigliano };
283901489e5dSAlfredo Cardigliano 
284001489e5dSAlfredo Cardigliano struct ionic_notifyq_cmd {
284101489e5dSAlfredo Cardigliano 	__le32 data;	/* Not used but needed for qcq structure */
284201489e5dSAlfredo Cardigliano };
284301489e5dSAlfredo Cardigliano 
284401489e5dSAlfredo Cardigliano union ionic_notifyq_comp {
284501489e5dSAlfredo Cardigliano 	struct ionic_notifyq_event event;
284601489e5dSAlfredo Cardigliano 	struct ionic_link_change_event link_change;
284701489e5dSAlfredo Cardigliano 	struct ionic_reset_event reset;
284801489e5dSAlfredo Cardigliano 	struct ionic_heartbeat_event heartbeat;
284901489e5dSAlfredo Cardigliano 	struct ionic_log_event log;
285001489e5dSAlfredo Cardigliano };
285101489e5dSAlfredo Cardigliano 
2852126fe197SAndrew Boyer /**
2853126fe197SAndrew Boyer  * struct ionic_eq_comp - Event queue completion descriptor
2854126fe197SAndrew Boyer  *
2855126fe197SAndrew Boyer  * @code:	Event code, see enum ionic_eq_comp_code
2856126fe197SAndrew Boyer  * @lif_index:	To which LIF the event pertains
2857126fe197SAndrew Boyer  * @qid:	To which queue id the event pertains
2858126fe197SAndrew Boyer  * @gen_color:	Event queue wrap counter, init 1, incr each wrap
2859126fe197SAndrew Boyer  */
2860126fe197SAndrew Boyer struct ionic_eq_comp {
2861126fe197SAndrew Boyer 	__le16 code;
2862126fe197SAndrew Boyer 	__le16 lif_index;
2863126fe197SAndrew Boyer 	__le32 qid;
2864126fe197SAndrew Boyer 	u8 rsvd[7];
2865126fe197SAndrew Boyer 	u8 gen_color;
2866126fe197SAndrew Boyer };
2867126fe197SAndrew Boyer 
2868126fe197SAndrew Boyer enum ionic_eq_comp_code {
2869126fe197SAndrew Boyer 	IONIC_EQ_COMP_CODE_NONE = 0,
2870126fe197SAndrew Boyer 	IONIC_EQ_COMP_CODE_RX_COMP = 1,
2871126fe197SAndrew Boyer 	IONIC_EQ_COMP_CODE_TX_COMP = 2,
2872126fe197SAndrew Boyer };
2873126fe197SAndrew Boyer 
287401489e5dSAlfredo Cardigliano /* Deprecate */
287501489e5dSAlfredo Cardigliano struct ionic_identity {
287601489e5dSAlfredo Cardigliano 	union ionic_drv_identity drv;
287701489e5dSAlfredo Cardigliano 	union ionic_dev_identity dev;
287801489e5dSAlfredo Cardigliano 	union ionic_lif_identity lif;
287901489e5dSAlfredo Cardigliano 	union ionic_port_identity port;
288001489e5dSAlfredo Cardigliano 	union ionic_qos_identity qos;
2881126fe197SAndrew Boyer 	union ionic_q_identity txq;
288201489e5dSAlfredo Cardigliano };
288301489e5dSAlfredo Cardigliano 
288401489e5dSAlfredo Cardigliano #endif /* _IONIC_IF_H_ */
2885