xref: /dpdk/drivers/net/ionic/ionic_if.h (revision 6645b283eb66de465692b8c7563b7f5ecbe1cc67)
101489e5dSAlfredo Cardigliano /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB OR BSD-3-Clause */
201489e5dSAlfredo Cardigliano /* Copyright (c) 2017-2019 Pensando Systems, Inc.  All rights reserved. */
301489e5dSAlfredo Cardigliano 
401489e5dSAlfredo Cardigliano #ifndef _IONIC_IF_H_
501489e5dSAlfredo Cardigliano #define _IONIC_IF_H_
601489e5dSAlfredo Cardigliano 
701489e5dSAlfredo Cardigliano #pragma pack(push, 1)
801489e5dSAlfredo Cardigliano 
901489e5dSAlfredo Cardigliano #define IONIC_DEV_INFO_SIGNATURE		0x44455649      /* 'DEVI' */
1001489e5dSAlfredo Cardigliano #define IONIC_DEV_INFO_VERSION			1
1101489e5dSAlfredo Cardigliano #define IONIC_IFNAMSIZ				16
1201489e5dSAlfredo Cardigliano 
1301489e5dSAlfredo Cardigliano /**
1401489e5dSAlfredo Cardigliano  * Commands
1501489e5dSAlfredo Cardigliano  */
1601489e5dSAlfredo Cardigliano enum ionic_cmd_opcode {
1701489e5dSAlfredo Cardigliano 	IONIC_CMD_NOP				= 0,
1801489e5dSAlfredo Cardigliano 
1901489e5dSAlfredo Cardigliano 	/* Device commands */
2001489e5dSAlfredo Cardigliano 	IONIC_CMD_IDENTIFY			= 1,
2101489e5dSAlfredo Cardigliano 	IONIC_CMD_INIT				= 2,
2201489e5dSAlfredo Cardigliano 	IONIC_CMD_RESET				= 3,
2301489e5dSAlfredo Cardigliano 	IONIC_CMD_GETATTR			= 4,
2401489e5dSAlfredo Cardigliano 	IONIC_CMD_SETATTR			= 5,
2501489e5dSAlfredo Cardigliano 
2601489e5dSAlfredo Cardigliano 	/* Port commands */
2701489e5dSAlfredo Cardigliano 	IONIC_CMD_PORT_IDENTIFY			= 10,
2801489e5dSAlfredo Cardigliano 	IONIC_CMD_PORT_INIT			= 11,
2901489e5dSAlfredo Cardigliano 	IONIC_CMD_PORT_RESET			= 12,
3001489e5dSAlfredo Cardigliano 	IONIC_CMD_PORT_GETATTR			= 13,
3101489e5dSAlfredo Cardigliano 	IONIC_CMD_PORT_SETATTR			= 14,
3201489e5dSAlfredo Cardigliano 
3301489e5dSAlfredo Cardigliano 	/* LIF commands */
3401489e5dSAlfredo Cardigliano 	IONIC_CMD_LIF_IDENTIFY			= 20,
3501489e5dSAlfredo Cardigliano 	IONIC_CMD_LIF_INIT			= 21,
3601489e5dSAlfredo Cardigliano 	IONIC_CMD_LIF_RESET			= 22,
3701489e5dSAlfredo Cardigliano 	IONIC_CMD_LIF_GETATTR			= 23,
3801489e5dSAlfredo Cardigliano 	IONIC_CMD_LIF_SETATTR			= 24,
3901489e5dSAlfredo Cardigliano 
4001489e5dSAlfredo Cardigliano 	IONIC_CMD_RX_MODE_SET			= 30,
4101489e5dSAlfredo Cardigliano 	IONIC_CMD_RX_FILTER_ADD			= 31,
4201489e5dSAlfredo Cardigliano 	IONIC_CMD_RX_FILTER_DEL			= 32,
4301489e5dSAlfredo Cardigliano 
4401489e5dSAlfredo Cardigliano 	/* Queue commands */
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 
5401489e5dSAlfredo Cardigliano 	/* QoS commands */
5501489e5dSAlfredo Cardigliano 	IONIC_CMD_QOS_CLASS_IDENTIFY		= 240,
5601489e5dSAlfredo Cardigliano 	IONIC_CMD_QOS_CLASS_INIT		= 241,
5701489e5dSAlfredo Cardigliano 	IONIC_CMD_QOS_CLASS_RESET		= 242,
5801489e5dSAlfredo Cardigliano 
5901489e5dSAlfredo Cardigliano 	/* Firmware commands */
6001489e5dSAlfredo Cardigliano 	IONIC_CMD_FW_DOWNLOAD			= 254,
6101489e5dSAlfredo Cardigliano 	IONIC_CMD_FW_CONTROL			= 255,
6201489e5dSAlfredo Cardigliano };
6301489e5dSAlfredo Cardigliano 
6401489e5dSAlfredo Cardigliano /**
6501489e5dSAlfredo Cardigliano  * Command Return codes
6601489e5dSAlfredo Cardigliano  */
6701489e5dSAlfredo Cardigliano enum ionic_status_code {
6801489e5dSAlfredo Cardigliano 	IONIC_RC_SUCCESS	= 0,	/* Success */
6901489e5dSAlfredo Cardigliano 	IONIC_RC_EVERSION	= 1,	/* Incorrect version for request */
7001489e5dSAlfredo Cardigliano 	IONIC_RC_EOPCODE	= 2,	/* Invalid cmd opcode */
7101489e5dSAlfredo Cardigliano 	IONIC_RC_EIO		= 3,	/* I/O error */
7201489e5dSAlfredo Cardigliano 	IONIC_RC_EPERM		= 4,	/* Permission denied */
7301489e5dSAlfredo Cardigliano 	IONIC_RC_EQID		= 5,	/* Bad qid */
7401489e5dSAlfredo Cardigliano 	IONIC_RC_EQTYPE		= 6,	/* Bad qtype */
7501489e5dSAlfredo Cardigliano 	IONIC_RC_ENOENT		= 7,	/* No such element */
7601489e5dSAlfredo Cardigliano 	IONIC_RC_EINTR		= 8,	/* operation interrupted */
7701489e5dSAlfredo Cardigliano 	IONIC_RC_EAGAIN		= 9,	/* Try again */
7801489e5dSAlfredo Cardigliano 	IONIC_RC_ENOMEM		= 10,	/* Out of memory */
7901489e5dSAlfredo Cardigliano 	IONIC_RC_EFAULT		= 11,	/* Bad address */
8001489e5dSAlfredo Cardigliano 	IONIC_RC_EBUSY		= 12,	/* Device or resource busy */
8101489e5dSAlfredo Cardigliano 	IONIC_RC_EEXIST		= 13,	/* object already exists */
8201489e5dSAlfredo Cardigliano 	IONIC_RC_EINVAL		= 14,	/* Invalid argument */
8301489e5dSAlfredo Cardigliano 	IONIC_RC_ENOSPC		= 15,	/* No space left or alloc failure */
8401489e5dSAlfredo Cardigliano 	IONIC_RC_ERANGE		= 16,	/* Parameter out of range */
8501489e5dSAlfredo Cardigliano 	IONIC_RC_BAD_ADDR	= 17,	/* Descriptor contains a bad ptr */
8601489e5dSAlfredo Cardigliano 	IONIC_RC_DEV_CMD	= 18,	/* Device cmd attempted on AdminQ */
8701489e5dSAlfredo Cardigliano 	IONIC_RC_ENOSUPP	= 19,	/* Operation not supported */
8801489e5dSAlfredo Cardigliano 	IONIC_RC_ERROR		= 29,	/* Generic error */
8901489e5dSAlfredo Cardigliano 
9001489e5dSAlfredo Cardigliano 	IONIC_RC_ERDMA		= 30,	/* Generic RDMA error */
9101489e5dSAlfredo Cardigliano };
9201489e5dSAlfredo Cardigliano 
9301489e5dSAlfredo Cardigliano enum ionic_notifyq_opcode {
9401489e5dSAlfredo Cardigliano 	IONIC_EVENT_LINK_CHANGE		= 1,
9501489e5dSAlfredo Cardigliano 	IONIC_EVENT_RESET		= 2,
9601489e5dSAlfredo Cardigliano 	IONIC_EVENT_HEARTBEAT		= 3,
9701489e5dSAlfredo Cardigliano 	IONIC_EVENT_LOG			= 4,
9801489e5dSAlfredo Cardigliano };
9901489e5dSAlfredo Cardigliano 
10001489e5dSAlfredo Cardigliano /**
10101489e5dSAlfredo Cardigliano  * struct cmd - General admin command format
10201489e5dSAlfredo Cardigliano  * @opcode:     Opcode for the command
10301489e5dSAlfredo Cardigliano  * @lif_index:  LIF index
10401489e5dSAlfredo Cardigliano  * @cmd_data:   Opcode-specific command bytes
10501489e5dSAlfredo Cardigliano  */
10601489e5dSAlfredo Cardigliano struct ionic_admin_cmd {
10701489e5dSAlfredo Cardigliano 	u8     opcode;
10801489e5dSAlfredo Cardigliano 	u8     rsvd;
10901489e5dSAlfredo Cardigliano 	__le16 lif_index;
11001489e5dSAlfredo Cardigliano 	u8     cmd_data[60];
11101489e5dSAlfredo Cardigliano };
11201489e5dSAlfredo Cardigliano 
11301489e5dSAlfredo Cardigliano /**
11401489e5dSAlfredo Cardigliano  * struct ionic_admin_comp - General admin command completion format
11501489e5dSAlfredo Cardigliano  * @status:     The status of the command (enum status_code)
11601489e5dSAlfredo Cardigliano  * @comp_index: The index in the descriptor ring for which this
11701489e5dSAlfredo Cardigliano  *              is the completion.
11801489e5dSAlfredo Cardigliano  * @cmd_data:   Command-specific bytes.
11901489e5dSAlfredo Cardigliano  * @color:      Color bit.  (Always 0 for commands issued to the
12001489e5dSAlfredo Cardigliano  *              Device Cmd Registers.)
12101489e5dSAlfredo Cardigliano  */
12201489e5dSAlfredo Cardigliano struct ionic_admin_comp {
12301489e5dSAlfredo Cardigliano 	u8     status;
12401489e5dSAlfredo Cardigliano 	u8     rsvd;
12501489e5dSAlfredo Cardigliano 	__le16 comp_index;
12601489e5dSAlfredo Cardigliano 	u8     cmd_data[11];
12701489e5dSAlfredo Cardigliano 	u8     color;
12801489e5dSAlfredo Cardigliano #define IONIC_COMP_COLOR_MASK  0x80
12901489e5dSAlfredo Cardigliano };
13001489e5dSAlfredo Cardigliano 
13101489e5dSAlfredo Cardigliano static inline u8 color_match(u8 color, u8 done_color)
13201489e5dSAlfredo Cardigliano {
13301489e5dSAlfredo Cardigliano 	return (!!(color & IONIC_COMP_COLOR_MASK)) == done_color;
13401489e5dSAlfredo Cardigliano }
13501489e5dSAlfredo Cardigliano 
13601489e5dSAlfredo Cardigliano /**
13701489e5dSAlfredo Cardigliano  * struct ionic_nop_cmd - NOP command
13801489e5dSAlfredo Cardigliano  * @opcode: opcode
13901489e5dSAlfredo Cardigliano  */
14001489e5dSAlfredo Cardigliano struct ionic_nop_cmd {
14101489e5dSAlfredo Cardigliano 	u8 opcode;
14201489e5dSAlfredo Cardigliano 	u8 rsvd[63];
14301489e5dSAlfredo Cardigliano };
14401489e5dSAlfredo Cardigliano 
14501489e5dSAlfredo Cardigliano /**
14601489e5dSAlfredo Cardigliano  * struct ionic_nop_comp - NOP command completion
14701489e5dSAlfredo Cardigliano  * @status: The status of the command (enum status_code)
14801489e5dSAlfredo Cardigliano  */
14901489e5dSAlfredo Cardigliano struct ionic_nop_comp {
15001489e5dSAlfredo Cardigliano 	u8 status;
15101489e5dSAlfredo Cardigliano 	u8 rsvd[15];
15201489e5dSAlfredo Cardigliano };
15301489e5dSAlfredo Cardigliano 
15401489e5dSAlfredo Cardigliano /**
15501489e5dSAlfredo Cardigliano  * struct ionic_dev_init_cmd - Device init command
15601489e5dSAlfredo Cardigliano  * @opcode:    opcode
15701489e5dSAlfredo Cardigliano  * @type:      device type
15801489e5dSAlfredo Cardigliano  */
15901489e5dSAlfredo Cardigliano struct ionic_dev_init_cmd {
16001489e5dSAlfredo Cardigliano 	u8     opcode;
16101489e5dSAlfredo Cardigliano 	u8     type;
16201489e5dSAlfredo Cardigliano 	u8     rsvd[62];
16301489e5dSAlfredo Cardigliano };
16401489e5dSAlfredo Cardigliano 
16501489e5dSAlfredo Cardigliano /**
16601489e5dSAlfredo Cardigliano  * struct init_comp - Device init command completion
16701489e5dSAlfredo Cardigliano  * @status: The status of the command (enum status_code)
16801489e5dSAlfredo Cardigliano  */
16901489e5dSAlfredo Cardigliano struct ionic_dev_init_comp {
17001489e5dSAlfredo Cardigliano 	u8 status;
17101489e5dSAlfredo Cardigliano 	u8 rsvd[15];
17201489e5dSAlfredo Cardigliano };
17301489e5dSAlfredo Cardigliano 
17401489e5dSAlfredo Cardigliano /**
17501489e5dSAlfredo Cardigliano  * struct ionic_dev_reset_cmd - Device reset command
17601489e5dSAlfredo Cardigliano  * @opcode: opcode
17701489e5dSAlfredo Cardigliano  */
17801489e5dSAlfredo Cardigliano struct ionic_dev_reset_cmd {
17901489e5dSAlfredo Cardigliano 	u8 opcode;
18001489e5dSAlfredo Cardigliano 	u8 rsvd[63];
18101489e5dSAlfredo Cardigliano };
18201489e5dSAlfredo Cardigliano 
18301489e5dSAlfredo Cardigliano /**
18401489e5dSAlfredo Cardigliano  * struct reset_comp - Reset command completion
18501489e5dSAlfredo Cardigliano  * @status: The status of the command (enum status_code)
18601489e5dSAlfredo Cardigliano  */
18701489e5dSAlfredo Cardigliano struct ionic_dev_reset_comp {
18801489e5dSAlfredo Cardigliano 	u8 status;
18901489e5dSAlfredo Cardigliano 	u8 rsvd[15];
19001489e5dSAlfredo Cardigliano };
19101489e5dSAlfredo Cardigliano 
19201489e5dSAlfredo Cardigliano #define IONIC_IDENTITY_VERSION_1	1
19301489e5dSAlfredo Cardigliano 
19401489e5dSAlfredo Cardigliano /**
19501489e5dSAlfredo Cardigliano  * struct ionic_dev_identify_cmd - Driver/device identify command
19601489e5dSAlfredo Cardigliano  * @opcode:  opcode
19701489e5dSAlfredo Cardigliano  * @ver:     Highest version of identify supported by driver
19801489e5dSAlfredo Cardigliano  */
19901489e5dSAlfredo Cardigliano struct ionic_dev_identify_cmd {
20001489e5dSAlfredo Cardigliano 	u8 opcode;
20101489e5dSAlfredo Cardigliano 	u8 ver;
20201489e5dSAlfredo Cardigliano 	u8 rsvd[62];
20301489e5dSAlfredo Cardigliano };
20401489e5dSAlfredo Cardigliano 
20501489e5dSAlfredo Cardigliano /**
20601489e5dSAlfredo Cardigliano  * struct dev_identify_comp - Driver/device identify command completion
20701489e5dSAlfredo Cardigliano  * @status: The status of the command (enum status_code)
20801489e5dSAlfredo Cardigliano  * @ver:    Version of identify returned by device
20901489e5dSAlfredo Cardigliano  */
21001489e5dSAlfredo Cardigliano struct ionic_dev_identify_comp {
21101489e5dSAlfredo Cardigliano 	u8 status;
21201489e5dSAlfredo Cardigliano 	u8 ver;
21301489e5dSAlfredo Cardigliano 	u8 rsvd[14];
21401489e5dSAlfredo Cardigliano };
21501489e5dSAlfredo Cardigliano 
21601489e5dSAlfredo Cardigliano enum ionic_os_type {
21701489e5dSAlfredo Cardigliano 	IONIC_OS_TYPE_LINUX   = 1,
21801489e5dSAlfredo Cardigliano 	IONIC_OS_TYPE_WIN     = 2,
21901489e5dSAlfredo Cardigliano 	IONIC_OS_TYPE_DPDK    = 3,
22001489e5dSAlfredo Cardigliano 	IONIC_OS_TYPE_FREEBSD = 4,
22101489e5dSAlfredo Cardigliano 	IONIC_OS_TYPE_IPXE    = 5,
22201489e5dSAlfredo Cardigliano 	IONIC_OS_TYPE_ESXI    = 6,
22301489e5dSAlfredo Cardigliano };
22401489e5dSAlfredo Cardigliano 
22501489e5dSAlfredo Cardigliano /**
22601489e5dSAlfredo Cardigliano  * union drv_identity - driver identity information
22701489e5dSAlfredo Cardigliano  * @os_type:          OS type (see enum os_type)
22801489e5dSAlfredo Cardigliano  * @os_dist:          OS distribution, numeric format
22901489e5dSAlfredo Cardigliano  * @os_dist_str:      OS distribution, string format
23001489e5dSAlfredo Cardigliano  * @kernel_ver:       Kernel version, numeric format
23101489e5dSAlfredo Cardigliano  * @kernel_ver_str:   Kernel version, string format
23201489e5dSAlfredo Cardigliano  * @driver_ver_str:   Driver version, string format
23301489e5dSAlfredo Cardigliano  */
23401489e5dSAlfredo Cardigliano union ionic_drv_identity {
23501489e5dSAlfredo Cardigliano 	struct {
23601489e5dSAlfredo Cardigliano 		__le32 os_type;
23701489e5dSAlfredo Cardigliano 		__le32 os_dist;
23801489e5dSAlfredo Cardigliano 		char   os_dist_str[128];
23901489e5dSAlfredo Cardigliano 		__le32 kernel_ver;
24001489e5dSAlfredo Cardigliano 		char   kernel_ver_str[32];
24101489e5dSAlfredo Cardigliano 		char   driver_ver_str[32];
24201489e5dSAlfredo Cardigliano 	};
24301489e5dSAlfredo Cardigliano 	__le32 words[512];
24401489e5dSAlfredo Cardigliano };
24501489e5dSAlfredo Cardigliano 
24601489e5dSAlfredo Cardigliano /**
24701489e5dSAlfredo Cardigliano  * union dev_identity - device identity information
24801489e5dSAlfredo Cardigliano  * @version:          Version of device identify
24901489e5dSAlfredo Cardigliano  * @type:             Identify type (0 for now)
25001489e5dSAlfredo Cardigliano  * @nports:           Number of ports provisioned
25101489e5dSAlfredo Cardigliano  * @nlifs:            Number of LIFs provisioned
25201489e5dSAlfredo Cardigliano  * @nintrs:           Number of interrupts provisioned
25301489e5dSAlfredo Cardigliano  * @ndbpgs_per_lif:   Number of doorbell pages per LIF
25401489e5dSAlfredo Cardigliano  * @intr_coal_mult:   Interrupt coalescing multiplication factor.
25501489e5dSAlfredo Cardigliano  *                    Scale user-supplied interrupt coalescing
25601489e5dSAlfredo Cardigliano  *                    value in usecs to device units using:
25701489e5dSAlfredo Cardigliano  *                    device units = usecs * mult / div
25801489e5dSAlfredo Cardigliano  * @intr_coal_div:    Interrupt coalescing division factor.
25901489e5dSAlfredo Cardigliano  *                    Scale user-supplied interrupt coalescing
26001489e5dSAlfredo Cardigliano  *                    value in usecs to device units using:
26101489e5dSAlfredo Cardigliano  *                    device units = usecs * mult / div
26201489e5dSAlfredo Cardigliano  *
26301489e5dSAlfredo Cardigliano  */
26401489e5dSAlfredo Cardigliano union ionic_dev_identity {
26501489e5dSAlfredo Cardigliano 	struct {
26601489e5dSAlfredo Cardigliano 		u8     version;
26701489e5dSAlfredo Cardigliano 		u8     type;
26801489e5dSAlfredo Cardigliano 		u8     rsvd[2];
26901489e5dSAlfredo Cardigliano 		u8     nports;
27001489e5dSAlfredo Cardigliano 		u8     rsvd2[3];
27101489e5dSAlfredo Cardigliano 		__le32 nlifs;
27201489e5dSAlfredo Cardigliano 		__le32 nintrs;
27301489e5dSAlfredo Cardigliano 		__le32 ndbpgs_per_lif;
27401489e5dSAlfredo Cardigliano 		__le32 intr_coal_mult;
27501489e5dSAlfredo Cardigliano 		__le32 intr_coal_div;
27601489e5dSAlfredo Cardigliano 	};
27701489e5dSAlfredo Cardigliano 	__le32 words[512];
27801489e5dSAlfredo Cardigliano };
27901489e5dSAlfredo Cardigliano 
28001489e5dSAlfredo Cardigliano enum ionic_lif_type {
28101489e5dSAlfredo Cardigliano 	IONIC_LIF_TYPE_CLASSIC = 0,
28201489e5dSAlfredo Cardigliano 	IONIC_LIF_TYPE_MACVLAN = 1,
28301489e5dSAlfredo Cardigliano 	IONIC_LIF_TYPE_NETQUEUE = 2,
28401489e5dSAlfredo Cardigliano };
28501489e5dSAlfredo Cardigliano 
28601489e5dSAlfredo Cardigliano /**
28701489e5dSAlfredo Cardigliano  * struct ionic_lif_identify_cmd - lif identify command
28801489e5dSAlfredo Cardigliano  * @opcode:  opcode
28901489e5dSAlfredo Cardigliano  * @type:    lif type (enum lif_type)
29001489e5dSAlfredo Cardigliano  * @ver:     version of identify returned by device
29101489e5dSAlfredo Cardigliano  */
29201489e5dSAlfredo Cardigliano struct ionic_lif_identify_cmd {
29301489e5dSAlfredo Cardigliano 	u8 opcode;
29401489e5dSAlfredo Cardigliano 	u8 type;
29501489e5dSAlfredo Cardigliano 	u8 ver;
29601489e5dSAlfredo Cardigliano 	u8 rsvd[61];
29701489e5dSAlfredo Cardigliano };
29801489e5dSAlfredo Cardigliano 
29901489e5dSAlfredo Cardigliano /**
30001489e5dSAlfredo Cardigliano  * struct ionic_lif_identify_comp - lif identify command completion
30101489e5dSAlfredo Cardigliano  * @status:  status of the command (enum status_code)
30201489e5dSAlfredo Cardigliano  * @ver:     version of identify returned by device
30301489e5dSAlfredo Cardigliano  */
30401489e5dSAlfredo Cardigliano struct ionic_lif_identify_comp {
30501489e5dSAlfredo Cardigliano 	u8 status;
30601489e5dSAlfredo Cardigliano 	u8 ver;
30701489e5dSAlfredo Cardigliano 	u8 rsvd2[14];
30801489e5dSAlfredo Cardigliano };
30901489e5dSAlfredo Cardigliano 
31001489e5dSAlfredo Cardigliano enum ionic_lif_capability {
31101489e5dSAlfredo Cardigliano 	IONIC_LIF_CAP_ETH        = BIT(0),
31201489e5dSAlfredo Cardigliano 	IONIC_LIF_CAP_RDMA       = BIT(1),
31301489e5dSAlfredo Cardigliano };
31401489e5dSAlfredo Cardigliano 
31501489e5dSAlfredo Cardigliano /**
31601489e5dSAlfredo Cardigliano  * Logical Queue Types
31701489e5dSAlfredo Cardigliano  */
31801489e5dSAlfredo Cardigliano enum ionic_logical_qtype {
31901489e5dSAlfredo Cardigliano 	IONIC_QTYPE_ADMINQ  = 0,
32001489e5dSAlfredo Cardigliano 	IONIC_QTYPE_NOTIFYQ = 1,
32101489e5dSAlfredo Cardigliano 	IONIC_QTYPE_RXQ     = 2,
32201489e5dSAlfredo Cardigliano 	IONIC_QTYPE_TXQ     = 3,
32301489e5dSAlfredo Cardigliano 	IONIC_QTYPE_EQ      = 4,
32401489e5dSAlfredo Cardigliano 	IONIC_QTYPE_MAX     = 16,
32501489e5dSAlfredo Cardigliano };
32601489e5dSAlfredo Cardigliano 
32701489e5dSAlfredo Cardigliano /**
32801489e5dSAlfredo Cardigliano  * struct ionic_lif_logical_qtype - Descriptor of logical to hardware queue
32901489e5dSAlfredo Cardigliano  * type.
33001489e5dSAlfredo Cardigliano  * @qtype:          Hardware Queue Type.
33101489e5dSAlfredo Cardigliano  * @qid_count:      Number of Queue IDs of the logical type.
33201489e5dSAlfredo Cardigliano  * @qid_base:       Minimum Queue ID of the logical type.
33301489e5dSAlfredo Cardigliano  */
33401489e5dSAlfredo Cardigliano struct ionic_lif_logical_qtype {
33501489e5dSAlfredo Cardigliano 	u8     qtype;
33601489e5dSAlfredo Cardigliano 	u8     rsvd[3];
33701489e5dSAlfredo Cardigliano 	__le32 qid_count;
33801489e5dSAlfredo Cardigliano 	__le32 qid_base;
33901489e5dSAlfredo Cardigliano };
34001489e5dSAlfredo Cardigliano 
34101489e5dSAlfredo Cardigliano enum ionic_lif_state {
34201489e5dSAlfredo Cardigliano 	IONIC_LIF_DISABLE	= 0,
34301489e5dSAlfredo Cardigliano 	IONIC_LIF_ENABLE	= 1,
34401489e5dSAlfredo Cardigliano 	IONIC_LIF_HANG_RESET	= 2,
34501489e5dSAlfredo Cardigliano };
34601489e5dSAlfredo Cardigliano 
34701489e5dSAlfredo Cardigliano /**
34801489e5dSAlfredo Cardigliano  * LIF configuration
34901489e5dSAlfredo Cardigliano  * @state:          lif state (enum lif_state)
35001489e5dSAlfredo Cardigliano  * @name:           lif name
35101489e5dSAlfredo Cardigliano  * @mtu:            mtu
35201489e5dSAlfredo Cardigliano  * @mac:            station mac address
35301489e5dSAlfredo Cardigliano  * @features:       features (enum ionic_eth_hw_features)
35401489e5dSAlfredo Cardigliano  * @queue_count:    queue counts per queue-type
35501489e5dSAlfredo Cardigliano  */
35601489e5dSAlfredo Cardigliano union ionic_lif_config {
35701489e5dSAlfredo Cardigliano 	struct {
35801489e5dSAlfredo Cardigliano 		u8     state;
35901489e5dSAlfredo Cardigliano 		u8     rsvd[3];
36001489e5dSAlfredo Cardigliano 		char   name[IONIC_IFNAMSIZ];
36101489e5dSAlfredo Cardigliano 		__le32 mtu;
36201489e5dSAlfredo Cardigliano 		u8     mac[6];
36301489e5dSAlfredo Cardigliano 		u8     rsvd2[2];
36401489e5dSAlfredo Cardigliano 		__le64 features;
36501489e5dSAlfredo Cardigliano 		__le32 queue_count[IONIC_QTYPE_MAX];
36601489e5dSAlfredo Cardigliano 	};
36701489e5dSAlfredo Cardigliano 	__le32 words[64];
36801489e5dSAlfredo Cardigliano };
36901489e5dSAlfredo Cardigliano 
37001489e5dSAlfredo Cardigliano /**
37101489e5dSAlfredo Cardigliano  * struct ionic_lif_identity - lif identity information (type-specific)
37201489e5dSAlfredo Cardigliano  *
37301489e5dSAlfredo Cardigliano  * @capabilities    LIF capabilities
37401489e5dSAlfredo Cardigliano  *
37501489e5dSAlfredo Cardigliano  * Ethernet:
37601489e5dSAlfredo Cardigliano  *     @version:          Ethernet identify structure version.
37701489e5dSAlfredo Cardigliano  *     @features:         Ethernet features supported on this lif type.
37801489e5dSAlfredo Cardigliano  *     @max_ucast_filters:  Number of perfect unicast addresses supported.
37901489e5dSAlfredo Cardigliano  *     @max_mcast_filters:  Number of perfect multicast addresses supported.
38001489e5dSAlfredo Cardigliano  *     @min_frame_size:   Minimum size of frames to be sent
38101489e5dSAlfredo Cardigliano  *     @max_frame_size:   Maximum size of frames to be sent
38201489e5dSAlfredo Cardigliano  *     @config:           LIF config struct with features, mtu, mac, q counts
38301489e5dSAlfredo Cardigliano  *
38401489e5dSAlfredo Cardigliano  * RDMA:
38501489e5dSAlfredo Cardigliano  *     @version:         RDMA version of opcodes and queue descriptors.
38601489e5dSAlfredo Cardigliano  *     @qp_opcodes:      Number of rdma queue pair opcodes supported.
38701489e5dSAlfredo Cardigliano  *     @admin_opcodes:   Number of rdma admin opcodes supported.
38801489e5dSAlfredo Cardigliano  *     @npts_per_lif:    Page table size per lif
38901489e5dSAlfredo Cardigliano  *     @nmrs_per_lif:    Number of memory regions per lif
39001489e5dSAlfredo Cardigliano  *     @nahs_per_lif:    Number of address handles per lif
39101489e5dSAlfredo Cardigliano  *     @max_stride:      Max work request stride.
39201489e5dSAlfredo Cardigliano  *     @cl_stride:       Cache line stride.
39301489e5dSAlfredo Cardigliano  *     @pte_stride:      Page table entry stride.
39401489e5dSAlfredo Cardigliano  *     @rrq_stride:      Remote RQ work request stride.
39501489e5dSAlfredo Cardigliano  *     @rsq_stride:      Remote SQ work request stride.
39601489e5dSAlfredo Cardigliano  *     @dcqcn_profiles:  Number of DCQCN profiles
39701489e5dSAlfredo Cardigliano  *     @aq_qtype:        RDMA Admin Qtype.
39801489e5dSAlfredo Cardigliano  *     @sq_qtype:        RDMA Send Qtype.
39901489e5dSAlfredo Cardigliano  *     @rq_qtype:        RDMA Receive Qtype.
40001489e5dSAlfredo Cardigliano  *     @cq_qtype:        RDMA Completion Qtype.
40101489e5dSAlfredo Cardigliano  *     @eq_qtype:        RDMA Event Qtype.
40201489e5dSAlfredo Cardigliano  */
40301489e5dSAlfredo Cardigliano union ionic_lif_identity {
40401489e5dSAlfredo Cardigliano 	struct {
40501489e5dSAlfredo Cardigliano 		__le64 capabilities;
40601489e5dSAlfredo Cardigliano 
40701489e5dSAlfredo Cardigliano 		struct {
40801489e5dSAlfredo Cardigliano 			u8 version;
40901489e5dSAlfredo Cardigliano 			u8 rsvd[3];
41001489e5dSAlfredo Cardigliano 			__le32 max_ucast_filters;
41101489e5dSAlfredo Cardigliano 			__le32 max_mcast_filters;
41201489e5dSAlfredo Cardigliano 			__le16 rss_ind_tbl_sz;
41301489e5dSAlfredo Cardigliano 			__le32 min_frame_size;
41401489e5dSAlfredo Cardigliano 			__le32 max_frame_size;
41501489e5dSAlfredo Cardigliano 			u8 rsvd2[106];
41601489e5dSAlfredo Cardigliano 			union ionic_lif_config config;
41701489e5dSAlfredo Cardigliano 		} eth;
41801489e5dSAlfredo Cardigliano 
41901489e5dSAlfredo Cardigliano 		struct {
42001489e5dSAlfredo Cardigliano 			u8 version;
42101489e5dSAlfredo Cardigliano 			u8 qp_opcodes;
42201489e5dSAlfredo Cardigliano 			u8 admin_opcodes;
42301489e5dSAlfredo Cardigliano 			u8 rsvd;
42401489e5dSAlfredo Cardigliano 			__le32 npts_per_lif;
42501489e5dSAlfredo Cardigliano 			__le32 nmrs_per_lif;
42601489e5dSAlfredo Cardigliano 			__le32 nahs_per_lif;
42701489e5dSAlfredo Cardigliano 			u8 max_stride;
42801489e5dSAlfredo Cardigliano 			u8 cl_stride;
42901489e5dSAlfredo Cardigliano 			u8 pte_stride;
43001489e5dSAlfredo Cardigliano 			u8 rrq_stride;
43101489e5dSAlfredo Cardigliano 			u8 rsq_stride;
43201489e5dSAlfredo Cardigliano 			u8 dcqcn_profiles;
43301489e5dSAlfredo Cardigliano 			u8 rsvd_dimensions[10];
43401489e5dSAlfredo Cardigliano 			struct ionic_lif_logical_qtype aq_qtype;
43501489e5dSAlfredo Cardigliano 			struct ionic_lif_logical_qtype sq_qtype;
43601489e5dSAlfredo Cardigliano 			struct ionic_lif_logical_qtype rq_qtype;
43701489e5dSAlfredo Cardigliano 			struct ionic_lif_logical_qtype cq_qtype;
43801489e5dSAlfredo Cardigliano 			struct ionic_lif_logical_qtype eq_qtype;
43901489e5dSAlfredo Cardigliano 		} rdma;
44001489e5dSAlfredo Cardigliano 	};
44101489e5dSAlfredo Cardigliano 	__le32 words[512];
44201489e5dSAlfredo Cardigliano };
44301489e5dSAlfredo Cardigliano 
44401489e5dSAlfredo Cardigliano /**
44501489e5dSAlfredo Cardigliano  * struct ionic_lif_init_cmd - LIF init command
44601489e5dSAlfredo Cardigliano  * @opcode:       opcode
44701489e5dSAlfredo Cardigliano  * @type:         LIF type (enum lif_type)
44801489e5dSAlfredo Cardigliano  * @index:        LIF index
44901489e5dSAlfredo Cardigliano  * @info_pa:      destination address for lif info (struct ionic_lif_info)
45001489e5dSAlfredo Cardigliano  */
45101489e5dSAlfredo Cardigliano struct ionic_lif_init_cmd {
45201489e5dSAlfredo Cardigliano 	u8     opcode;
45301489e5dSAlfredo Cardigliano 	u8     type;
45401489e5dSAlfredo Cardigliano 	__le16 index;
45501489e5dSAlfredo Cardigliano 	__le32 rsvd;
45601489e5dSAlfredo Cardigliano 	__le64 info_pa;
45701489e5dSAlfredo Cardigliano 	u8     rsvd2[48];
45801489e5dSAlfredo Cardigliano };
45901489e5dSAlfredo Cardigliano 
46001489e5dSAlfredo Cardigliano /**
46101489e5dSAlfredo Cardigliano  * struct ionic_lif_init_comp - LIF init command completion
46201489e5dSAlfredo Cardigliano  * @status: The status of the command (enum status_code)
46301489e5dSAlfredo Cardigliano  */
46401489e5dSAlfredo Cardigliano struct ionic_lif_init_comp {
46501489e5dSAlfredo Cardigliano 	u8 status;
46601489e5dSAlfredo Cardigliano 	u8 rsvd;
46701489e5dSAlfredo Cardigliano 	__le16 hw_index;
46801489e5dSAlfredo Cardigliano 	u8 rsvd2[12];
46901489e5dSAlfredo Cardigliano };
47001489e5dSAlfredo Cardigliano 
47101489e5dSAlfredo Cardigliano /**
47201489e5dSAlfredo Cardigliano  * struct ionic_q_init_cmd - Queue init command
47301489e5dSAlfredo Cardigliano  * @opcode:       opcode
47401489e5dSAlfredo Cardigliano  * @type:         Logical queue type
47501489e5dSAlfredo Cardigliano  * @ver:          Queue version (defines opcode/descriptor scope)
47601489e5dSAlfredo Cardigliano  * @lif_index:    LIF index
47701489e5dSAlfredo Cardigliano  * @index:        (lif, qtype) relative admin queue index
47801489e5dSAlfredo Cardigliano  * @intr_index:   Interrupt control register index
47901489e5dSAlfredo Cardigliano  * @pid:          Process ID
48001489e5dSAlfredo Cardigliano  * @flags:
48101489e5dSAlfredo Cardigliano  *    IRQ:        Interrupt requested on completion
48201489e5dSAlfredo Cardigliano  *    ENA:        Enable the queue.  If ENA=0 the queue is initialized
48301489e5dSAlfredo Cardigliano  *                but remains disabled, to be later enabled with the
48401489e5dSAlfredo Cardigliano  *                Queue Enable command.  If ENA=1, then queue is
48501489e5dSAlfredo Cardigliano  *                initialized and then enabled.
48601489e5dSAlfredo Cardigliano  *    SG:         Enable Scatter-Gather on the queue.
48701489e5dSAlfredo Cardigliano  *                in number of descs.  The actual ring size is
48801489e5dSAlfredo Cardigliano  *                (1 << ring_size).  For example, to
48901489e5dSAlfredo Cardigliano  *                select a ring size of 64 descriptors write
49001489e5dSAlfredo Cardigliano  *                ring_size = 6.  The minimum ring_size value is 2
49101489e5dSAlfredo Cardigliano  *                for a ring size of 4 descriptors.  The maximum
49201489e5dSAlfredo Cardigliano  *                ring_size value is 16 for a ring size of 64k
49301489e5dSAlfredo Cardigliano  *                descriptors.  Values of ring_size <2 and >16 are
49401489e5dSAlfredo Cardigliano  *                reserved.
49501489e5dSAlfredo Cardigliano  *    EQ:         Enable the Event Queue
49601489e5dSAlfredo Cardigliano  * @cos:          Class of service for this queue.
49701489e5dSAlfredo Cardigliano  * @ring_size:    Queue ring size, encoded as a log2(size)
49801489e5dSAlfredo Cardigliano  * @ring_base:    Queue ring base address
49901489e5dSAlfredo Cardigliano  * @cq_ring_base: Completion queue ring base address
50001489e5dSAlfredo Cardigliano  * @sg_ring_base: Scatter/Gather ring base address
50101489e5dSAlfredo Cardigliano  * @eq_index:	  Event queue index
50201489e5dSAlfredo Cardigliano  */
50301489e5dSAlfredo Cardigliano struct ionic_q_init_cmd {
50401489e5dSAlfredo Cardigliano 	u8     opcode;
50501489e5dSAlfredo Cardigliano 	u8     rsvd;
50601489e5dSAlfredo Cardigliano 	__le16 lif_index;
50701489e5dSAlfredo Cardigliano 	u8     type;
50801489e5dSAlfredo Cardigliano 	u8     ver;
50901489e5dSAlfredo Cardigliano 	u8     rsvd1[2];
51001489e5dSAlfredo Cardigliano 	__le32 index;
51101489e5dSAlfredo Cardigliano 	__le16 pid;
51201489e5dSAlfredo Cardigliano 	__le16 intr_index;
51301489e5dSAlfredo Cardigliano 	__le16 flags;
51401489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_IRQ	0x01	/* Request interrupt on completion */
51501489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_ENA	0x02	/* Enable the queue */
51601489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_SG	0x04	/* Enable scatter/gather on the queue */
51701489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_EQ	0x08	/* Enable event queue */
51801489e5dSAlfredo Cardigliano #define IONIC_QINIT_F_DEBUG 0x80	/* Enable queue debugging */
51901489e5dSAlfredo Cardigliano 	u8     cos;
52001489e5dSAlfredo Cardigliano 	u8     ring_size;
52101489e5dSAlfredo Cardigliano 	__le64 ring_base;
52201489e5dSAlfredo Cardigliano 	__le64 cq_ring_base;
52301489e5dSAlfredo Cardigliano 	__le64 sg_ring_base;
52401489e5dSAlfredo Cardigliano 	__le32 eq_index;
52501489e5dSAlfredo Cardigliano 	u8     rsvd2[16];
52601489e5dSAlfredo Cardigliano };
52701489e5dSAlfredo Cardigliano 
52801489e5dSAlfredo Cardigliano /**
52901489e5dSAlfredo Cardigliano  * struct ionic_q_init_comp - Queue init command completion
53001489e5dSAlfredo Cardigliano  * @status:     The status of the command (enum status_code)
53101489e5dSAlfredo Cardigliano  * @ver:        Queue version (defines opcode/descriptor scope)
53201489e5dSAlfredo Cardigliano  * @comp_index: The index in the descriptor ring for which this
53301489e5dSAlfredo Cardigliano  *              is the completion.
53401489e5dSAlfredo Cardigliano  * @hw_index:   Hardware Queue ID
53501489e5dSAlfredo Cardigliano  * @hw_type:    Hardware Queue type
53601489e5dSAlfredo Cardigliano  * @color:      Color
53701489e5dSAlfredo Cardigliano  */
53801489e5dSAlfredo Cardigliano struct ionic_q_init_comp {
53901489e5dSAlfredo Cardigliano 	u8     status;
54001489e5dSAlfredo Cardigliano 	u8     ver;
54101489e5dSAlfredo Cardigliano 	__le16 comp_index;
54201489e5dSAlfredo Cardigliano 	__le32 hw_index;
54301489e5dSAlfredo Cardigliano 	u8     hw_type;
54401489e5dSAlfredo Cardigliano 	u8     rsvd2[6];
54501489e5dSAlfredo Cardigliano 	u8     color;
54601489e5dSAlfredo Cardigliano };
54701489e5dSAlfredo Cardigliano 
54801489e5dSAlfredo Cardigliano /* the device's internal addressing uses up to 52 bits */
54901489e5dSAlfredo Cardigliano #define IONIC_ADDR_LEN		52
55001489e5dSAlfredo Cardigliano #define IONIC_ADDR_MASK		(BIT_ULL(IONIC_ADDR_LEN) - 1)
55101489e5dSAlfredo Cardigliano 
55201489e5dSAlfredo Cardigliano enum ionic_txq_desc_opcode {
55301489e5dSAlfredo Cardigliano 	IONIC_TXQ_DESC_OPCODE_CSUM_NONE = 0,
55401489e5dSAlfredo Cardigliano 	IONIC_TXQ_DESC_OPCODE_CSUM_PARTIAL = 1,
55501489e5dSAlfredo Cardigliano 	IONIC_TXQ_DESC_OPCODE_CSUM_HW = 2,
55601489e5dSAlfredo Cardigliano 	IONIC_TXQ_DESC_OPCODE_TSO = 3,
55701489e5dSAlfredo Cardigliano };
55801489e5dSAlfredo Cardigliano 
55901489e5dSAlfredo Cardigliano /**
56001489e5dSAlfredo Cardigliano  * struct ionic_txq_desc - Ethernet Tx queue descriptor format
56101489e5dSAlfredo Cardigliano  * @opcode:       Tx operation, see TXQ_DESC_OPCODE_*:
56201489e5dSAlfredo Cardigliano  *
56301489e5dSAlfredo Cardigliano  *                   IONIC_TXQ_DESC_OPCODE_CSUM_NONE:
56401489e5dSAlfredo Cardigliano  *
56501489e5dSAlfredo Cardigliano  *                      Non-offload send.  No segmentation,
56601489e5dSAlfredo Cardigliano  *                      fragmentation or checksum calc/insertion is
56701489e5dSAlfredo Cardigliano  *                      performed by device; packet is prepared
56801489e5dSAlfredo Cardigliano  *                      to send by software stack and requires
56901489e5dSAlfredo Cardigliano  *                      no further manipulation from device.
57001489e5dSAlfredo Cardigliano  *
57101489e5dSAlfredo Cardigliano  *                   IONIC_TXQ_DESC_OPCODE_CSUM_PARTIAL:
57201489e5dSAlfredo Cardigliano  *
57301489e5dSAlfredo Cardigliano  *                      Offload 16-bit L4 checksum
57401489e5dSAlfredo Cardigliano  *                      calculation/insertion.  The device will
57501489e5dSAlfredo Cardigliano  *                      calculate the L4 checksum value and
57601489e5dSAlfredo Cardigliano  *                      insert the result in the packet's L4
57701489e5dSAlfredo Cardigliano  *                      header checksum field.  The L4 checksum
57801489e5dSAlfredo Cardigliano  *                      is calculated starting at @csum_start bytes
57901489e5dSAlfredo Cardigliano  *                      into the packet to the end of the packet.
58001489e5dSAlfredo Cardigliano  *                      The checksum insertion position is given
58101489e5dSAlfredo Cardigliano  *                      in @csum_offset.  This feature is only
58201489e5dSAlfredo Cardigliano  *                      applicable to protocols such as TCP, UDP
58301489e5dSAlfredo Cardigliano  *                      and ICMP where a standard (i.e. the
58401489e5dSAlfredo Cardigliano  *                      'IP-style' checksum) one's complement
58501489e5dSAlfredo Cardigliano  *                      16-bit checksum is used, using an IP
58601489e5dSAlfredo Cardigliano  *                      pseudo-header to seed the calculation.
58701489e5dSAlfredo Cardigliano  *                      Software will preload the L4 checksum
58801489e5dSAlfredo Cardigliano  *                      field with the IP pseudo-header checksum.
58901489e5dSAlfredo Cardigliano  *
59001489e5dSAlfredo Cardigliano  *                      For tunnel encapsulation, @csum_start and
59101489e5dSAlfredo Cardigliano  *                      @csum_offset refer to the inner L4
59201489e5dSAlfredo Cardigliano  *                      header.  Supported tunnels encapsulations
59301489e5dSAlfredo Cardigliano  *                      are: IPIP, GRE, and UDP.  If the @encap
59401489e5dSAlfredo Cardigliano  *                      is clear, no further processing by the
59501489e5dSAlfredo Cardigliano  *                      device is required; software will
59601489e5dSAlfredo Cardigliano  *                      calculate the outer header checksums.  If
59701489e5dSAlfredo Cardigliano  *                      the @encap is set, the device will
59801489e5dSAlfredo Cardigliano  *                      offload the outer header checksums using
59901489e5dSAlfredo Cardigliano  *                      LCO (local checksum offload) (see
60001489e5dSAlfredo Cardigliano  *                      Documentation/networking/checksum-
60101489e5dSAlfredo Cardigliano  *                      offloads.txt for more info).
60201489e5dSAlfredo Cardigliano  *
60301489e5dSAlfredo Cardigliano  *                   IONIC_TXQ_DESC_OPCODE_CSUM_HW:
60401489e5dSAlfredo Cardigliano  *
60501489e5dSAlfredo Cardigliano  *                      Offload 16-bit checksum computation to hardware.
60601489e5dSAlfredo Cardigliano  *                      If @csum_l3 is set then the packet's L3 checksum is
60701489e5dSAlfredo Cardigliano  *                      updated. Similarly, if @csum_l4 is set the the L4
60801489e5dSAlfredo Cardigliano  *                      checksum is updated. If @encap is set then encap header
60901489e5dSAlfredo Cardigliano  *                      checksums are also updated.
61001489e5dSAlfredo Cardigliano  *
61101489e5dSAlfredo Cardigliano  *                   IONIC_TXQ_DESC_OPCODE_TSO:
61201489e5dSAlfredo Cardigliano  *
61301489e5dSAlfredo Cardigliano  *                      Device performs TCP segmentation offload
61401489e5dSAlfredo Cardigliano  *                      (TSO).  @hdr_len is the number of bytes
61501489e5dSAlfredo Cardigliano  *                      to the end of TCP header (the offset to
61601489e5dSAlfredo Cardigliano  *                      the TCP payload).  @mss is the desired
61701489e5dSAlfredo Cardigliano  *                      MSS, the TCP payload length for each
61801489e5dSAlfredo Cardigliano  *                      segment.  The device will calculate/
61901489e5dSAlfredo Cardigliano  *                      insert IP (IPv4 only) and TCP checksums
62001489e5dSAlfredo Cardigliano  *                      for each segment.  In the first data
62101489e5dSAlfredo Cardigliano  *                      buffer containing the header template,
62201489e5dSAlfredo Cardigliano  *                      the driver will set IPv4 checksum to 0
62301489e5dSAlfredo Cardigliano  *                      and preload TCP checksum with the IP
62401489e5dSAlfredo Cardigliano  *                      pseudo header calculated with IP length = 0.
62501489e5dSAlfredo Cardigliano  *
62601489e5dSAlfredo Cardigliano  *                      Supported tunnel encapsulations are IPIP,
62701489e5dSAlfredo Cardigliano  *                      layer-3 GRE, and UDP. @hdr_len includes
62801489e5dSAlfredo Cardigliano  *                      both outer and inner headers.  The driver
62901489e5dSAlfredo Cardigliano  *                      will set IPv4 checksum to zero and
63001489e5dSAlfredo Cardigliano  *                      preload TCP checksum with IP pseudo
63101489e5dSAlfredo Cardigliano  *                      header on the inner header.
63201489e5dSAlfredo Cardigliano  *
63301489e5dSAlfredo Cardigliano  *                      TCP ECN offload is supported.  The device
63401489e5dSAlfredo Cardigliano  *                      will set CWR flag in the first segment if
63501489e5dSAlfredo Cardigliano  *                      CWR is set in the template header, and
63601489e5dSAlfredo Cardigliano  *                      clear CWR in remaining segments.
63701489e5dSAlfredo Cardigliano  * @flags:
63801489e5dSAlfredo Cardigliano  *                vlan:
63901489e5dSAlfredo Cardigliano  *                    Insert an L2 VLAN header using @vlan_tci.
64001489e5dSAlfredo Cardigliano  *                encap:
64101489e5dSAlfredo Cardigliano  *                    Calculate encap header checksum.
64201489e5dSAlfredo Cardigliano  *                csum_l3:
64301489e5dSAlfredo Cardigliano  *                    Compute L3 header checksum.
64401489e5dSAlfredo Cardigliano  *                csum_l4:
64501489e5dSAlfredo Cardigliano  *                    Compute L4 header checksum.
64601489e5dSAlfredo Cardigliano  *                tso_sot:
64701489e5dSAlfredo Cardigliano  *                    TSO start
64801489e5dSAlfredo Cardigliano  *                tso_eot:
64901489e5dSAlfredo Cardigliano  *                    TSO end
65001489e5dSAlfredo Cardigliano  * @num_sg_elems: Number of scatter-gather elements in SG
65101489e5dSAlfredo Cardigliano  *                descriptor
65201489e5dSAlfredo Cardigliano  * @addr:         First data buffer's DMA address.
65301489e5dSAlfredo Cardigliano  *                (Subsequent data buffers are on txq_sg_desc).
65401489e5dSAlfredo Cardigliano  * @len:          First data buffer's length, in bytes
65501489e5dSAlfredo Cardigliano  * @vlan_tci:     VLAN tag to insert in the packet (if requested
65601489e5dSAlfredo Cardigliano  *                by @V-bit).  Includes .1p and .1q tags
65701489e5dSAlfredo Cardigliano  * @hdr_len:      Length of packet headers, including
65801489e5dSAlfredo Cardigliano  *                encapsulating outer header, if applicable.
65901489e5dSAlfredo Cardigliano  *                Valid for opcodes TXQ_DESC_OPCODE_CALC_CSUM and
66001489e5dSAlfredo Cardigliano  *                TXQ_DESC_OPCODE_TSO.  Should be set to zero for
66101489e5dSAlfredo Cardigliano  *                all other modes.  For
66201489e5dSAlfredo Cardigliano  *                TXQ_DESC_OPCODE_CALC_CSUM, @hdr_len is length
66301489e5dSAlfredo Cardigliano  *                of headers up to inner-most L4 header.  For
66401489e5dSAlfredo Cardigliano  *                TXQ_DESC_OPCODE_TSO, @hdr_len is up to
66501489e5dSAlfredo Cardigliano  *                inner-most L4 payload, so inclusive of
66601489e5dSAlfredo Cardigliano  *                inner-most L4 header.
66701489e5dSAlfredo Cardigliano  * @mss:          Desired MSS value for TSO.  Only applicable for
66801489e5dSAlfredo Cardigliano  *                TXQ_DESC_OPCODE_TSO.
66901489e5dSAlfredo Cardigliano  * @csum_start:   Offset into inner-most L3 header of checksum
67001489e5dSAlfredo Cardigliano  * @csum_offset:  Offset into inner-most L4 header of checksum
67101489e5dSAlfredo Cardigliano  */
67201489e5dSAlfredo Cardigliano 
67301489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_OPCODE_MASK		0xf
67401489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_OPCODE_SHIFT		4
67501489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAGS_MASK		0xf
67601489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAGS_SHIFT		0
67701489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_NSGE_MASK		0xf
67801489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_NSGE_SHIFT		8
67901489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_ADDR_MASK		(BIT_ULL(IONIC_ADDR_LEN) - 1)
68001489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_ADDR_SHIFT		12
68101489e5dSAlfredo Cardigliano 
68201489e5dSAlfredo Cardigliano /* common flags */
68301489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_VLAN		0x1
68401489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_ENCAP		0x2
68501489e5dSAlfredo Cardigliano 
68601489e5dSAlfredo Cardigliano /* flags for csum_hw opcode */
68701489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_CSUM_L3		0x4
68801489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_CSUM_L4		0x8
68901489e5dSAlfredo Cardigliano 
69001489e5dSAlfredo Cardigliano /* flags for tso opcode */
69101489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_TSO_SOT		0x4
69201489e5dSAlfredo Cardigliano #define IONIC_TXQ_DESC_FLAG_TSO_EOT		0x8
69301489e5dSAlfredo Cardigliano 
69401489e5dSAlfredo Cardigliano struct ionic_txq_desc {
69501489e5dSAlfredo Cardigliano 	__le64  cmd;
69601489e5dSAlfredo Cardigliano 	__le16  len;
69701489e5dSAlfredo Cardigliano 	union {
69801489e5dSAlfredo Cardigliano 		__le16  vlan_tci;
69901489e5dSAlfredo Cardigliano 		__le16  hword0;
70001489e5dSAlfredo Cardigliano 	};
70101489e5dSAlfredo Cardigliano 	union {
70201489e5dSAlfredo Cardigliano 		__le16  csum_start;
70301489e5dSAlfredo Cardigliano 		__le16  hdr_len;
70401489e5dSAlfredo Cardigliano 		__le16  hword1;
70501489e5dSAlfredo Cardigliano 	};
70601489e5dSAlfredo Cardigliano 	union {
70701489e5dSAlfredo Cardigliano 		__le16  csum_offset;
70801489e5dSAlfredo Cardigliano 		__le16  mss;
70901489e5dSAlfredo Cardigliano 		__le16  hword2;
71001489e5dSAlfredo Cardigliano 	};
71101489e5dSAlfredo Cardigliano };
71201489e5dSAlfredo Cardigliano 
71301489e5dSAlfredo Cardigliano static inline u64 encode_txq_desc_cmd(u8 opcode, u8 flags,
71401489e5dSAlfredo Cardigliano 				      u8 nsge, u64 addr)
71501489e5dSAlfredo Cardigliano {
71601489e5dSAlfredo Cardigliano 	u64 cmd;
71701489e5dSAlfredo Cardigliano 
71801489e5dSAlfredo Cardigliano 	cmd = (opcode & IONIC_TXQ_DESC_OPCODE_MASK) <<
71901489e5dSAlfredo Cardigliano 		IONIC_TXQ_DESC_OPCODE_SHIFT;
72001489e5dSAlfredo Cardigliano 	cmd |= (flags & IONIC_TXQ_DESC_FLAGS_MASK) <<
72101489e5dSAlfredo Cardigliano 		IONIC_TXQ_DESC_FLAGS_SHIFT;
72201489e5dSAlfredo Cardigliano 	cmd |= (nsge & IONIC_TXQ_DESC_NSGE_MASK) << IONIC_TXQ_DESC_NSGE_SHIFT;
72301489e5dSAlfredo Cardigliano 	cmd |= (addr & IONIC_TXQ_DESC_ADDR_MASK) << IONIC_TXQ_DESC_ADDR_SHIFT;
72401489e5dSAlfredo Cardigliano 
72501489e5dSAlfredo Cardigliano 	return cmd;
72601489e5dSAlfredo Cardigliano };
72701489e5dSAlfredo Cardigliano 
72801489e5dSAlfredo Cardigliano static inline void decode_txq_desc_cmd(u64 cmd, u8 *opcode, u8 *flags,
72901489e5dSAlfredo Cardigliano 				       u8 *nsge, u64 *addr)
73001489e5dSAlfredo Cardigliano {
73101489e5dSAlfredo Cardigliano 	*opcode = (cmd >> IONIC_TXQ_DESC_OPCODE_SHIFT) &
73201489e5dSAlfredo Cardigliano 		IONIC_TXQ_DESC_OPCODE_MASK;
73301489e5dSAlfredo Cardigliano 	*flags = (cmd >> IONIC_TXQ_DESC_FLAGS_SHIFT) &
73401489e5dSAlfredo Cardigliano 		IONIC_TXQ_DESC_FLAGS_MASK;
73501489e5dSAlfredo Cardigliano 	*nsge = (cmd >> IONIC_TXQ_DESC_NSGE_SHIFT) & IONIC_TXQ_DESC_NSGE_MASK;
73601489e5dSAlfredo Cardigliano 	*addr = (cmd >> IONIC_TXQ_DESC_ADDR_SHIFT) & IONIC_TXQ_DESC_ADDR_MASK;
73701489e5dSAlfredo Cardigliano };
73801489e5dSAlfredo Cardigliano 
73901489e5dSAlfredo Cardigliano #define IONIC_TX_MAX_SG_ELEMS	8
74001489e5dSAlfredo Cardigliano #define IONIC_RX_MAX_SG_ELEMS	8
74101489e5dSAlfredo Cardigliano 
74201489e5dSAlfredo Cardigliano /**
74301489e5dSAlfredo Cardigliano  * struct ionic_txq_sg_desc - Transmit scatter-gather (SG) list
74401489e5dSAlfredo Cardigliano  * @addr:      DMA address of SG element data buffer
74501489e5dSAlfredo Cardigliano  * @len:       Length of SG element data buffer, in bytes
74601489e5dSAlfredo Cardigliano  */
74701489e5dSAlfredo Cardigliano struct ionic_txq_sg_desc {
74801489e5dSAlfredo Cardigliano 	struct ionic_txq_sg_elem {
74901489e5dSAlfredo Cardigliano 		__le64 addr;
75001489e5dSAlfredo Cardigliano 		__le16 len;
75101489e5dSAlfredo Cardigliano 		__le16 rsvd[3];
75201489e5dSAlfredo Cardigliano 	} elems[IONIC_TX_MAX_SG_ELEMS];
75301489e5dSAlfredo Cardigliano };
75401489e5dSAlfredo Cardigliano 
75501489e5dSAlfredo Cardigliano /**
75601489e5dSAlfredo Cardigliano  * struct ionic_txq_comp - Ethernet transmit queue completion descriptor
75701489e5dSAlfredo Cardigliano  * @status:     The status of the command (enum status_code)
75801489e5dSAlfredo Cardigliano  * @comp_index: The index in the descriptor ring for which this
75901489e5dSAlfredo Cardigliano  *                 is the completion.
76001489e5dSAlfredo Cardigliano  * @color:      Color bit.
76101489e5dSAlfredo Cardigliano  */
76201489e5dSAlfredo Cardigliano struct ionic_txq_comp {
76301489e5dSAlfredo Cardigliano 	u8     status;
76401489e5dSAlfredo Cardigliano 	u8     rsvd;
76501489e5dSAlfredo Cardigliano 	__le16 comp_index;
76601489e5dSAlfredo Cardigliano 	u8     rsvd2[11];
76701489e5dSAlfredo Cardigliano 	u8     color;
76801489e5dSAlfredo Cardigliano };
76901489e5dSAlfredo Cardigliano 
77001489e5dSAlfredo Cardigliano enum ionic_rxq_desc_opcode {
77101489e5dSAlfredo Cardigliano 	IONIC_RXQ_DESC_OPCODE_SIMPLE = 0,
77201489e5dSAlfredo Cardigliano 	IONIC_RXQ_DESC_OPCODE_SG = 1,
77301489e5dSAlfredo Cardigliano };
77401489e5dSAlfredo Cardigliano 
77501489e5dSAlfredo Cardigliano /**
77601489e5dSAlfredo Cardigliano  * struct ionic_rxq_desc - Ethernet Rx queue descriptor format
77701489e5dSAlfredo Cardigliano  * @opcode:       Rx operation, see RXQ_DESC_OPCODE_*:
77801489e5dSAlfredo Cardigliano  *
77901489e5dSAlfredo Cardigliano  *                   RXQ_DESC_OPCODE_SIMPLE:
78001489e5dSAlfredo Cardigliano  *
78101489e5dSAlfredo Cardigliano  *                      Receive full packet into data buffer
78201489e5dSAlfredo Cardigliano  *                      starting at @addr.  Results of
78301489e5dSAlfredo Cardigliano  *                      receive, including actual bytes received,
78401489e5dSAlfredo Cardigliano  *                      are recorded in Rx completion descriptor.
78501489e5dSAlfredo Cardigliano  *
78601489e5dSAlfredo Cardigliano  * @len:          Data buffer's length, in bytes.
78701489e5dSAlfredo Cardigliano  * @addr:         Data buffer's DMA address
78801489e5dSAlfredo Cardigliano  */
78901489e5dSAlfredo Cardigliano struct ionic_rxq_desc {
79001489e5dSAlfredo Cardigliano 	u8     opcode;
79101489e5dSAlfredo Cardigliano 	u8     rsvd[5];
79201489e5dSAlfredo Cardigliano 	__le16 len;
79301489e5dSAlfredo Cardigliano 	__le64 addr;
79401489e5dSAlfredo Cardigliano };
79501489e5dSAlfredo Cardigliano 
79601489e5dSAlfredo Cardigliano /**
79701489e5dSAlfredo Cardigliano  * struct ionic_rxq_sg_desc - Receive scatter-gather (SG) list
79801489e5dSAlfredo Cardigliano  * @addr:      DMA address of SG element data buffer
79901489e5dSAlfredo Cardigliano  * @len:       Length of SG element data buffer, in bytes
80001489e5dSAlfredo Cardigliano  */
80101489e5dSAlfredo Cardigliano struct ionic_rxq_sg_desc {
80201489e5dSAlfredo Cardigliano 	struct ionic_rxq_sg_elem {
80301489e5dSAlfredo Cardigliano 		__le64 addr;
80401489e5dSAlfredo Cardigliano 		__le16 len;
80501489e5dSAlfredo Cardigliano 		__le16 rsvd[3];
80601489e5dSAlfredo Cardigliano 	} elems[IONIC_RX_MAX_SG_ELEMS];
80701489e5dSAlfredo Cardigliano };
80801489e5dSAlfredo Cardigliano 
80901489e5dSAlfredo Cardigliano /**
81001489e5dSAlfredo Cardigliano  * struct ionic_rxq_comp - Ethernet receive queue completion descriptor
81101489e5dSAlfredo Cardigliano  * @status:       The status of the command (enum status_code)
81201489e5dSAlfredo Cardigliano  * @num_sg_elems: Number of SG elements used by this descriptor
81301489e5dSAlfredo Cardigliano  * @comp_index:   The index in the descriptor ring for which this
81401489e5dSAlfredo Cardigliano  *                is the completion.
81501489e5dSAlfredo Cardigliano  * @rss_hash:     32-bit RSS hash
81601489e5dSAlfredo Cardigliano  * @csum:         16-bit sum of the packet's L2 payload.
81701489e5dSAlfredo Cardigliano  *                If the packet's L2 payload is odd length, an extra
81801489e5dSAlfredo Cardigliano  *                zero-value byte is included in the @csum calculation but
81901489e5dSAlfredo Cardigliano  *                not included in @len.
82001489e5dSAlfredo Cardigliano  * @vlan_tci:     VLAN tag stripped from the packet.  Valid if @VLAN is
82101489e5dSAlfredo Cardigliano  *                set.  Includes .1p and .1q tags.
82201489e5dSAlfredo Cardigliano  * @len:          Received packet length, in bytes.  Excludes FCS.
82301489e5dSAlfredo Cardigliano  * @csum_calc     L2 payload checksum is computed or not
82401489e5dSAlfredo Cardigliano  * @csum_tcp_ok:  The TCP checksum calculated by the device
82501489e5dSAlfredo Cardigliano  *                matched the checksum in the receive packet's
82601489e5dSAlfredo Cardigliano  *                TCP header
82701489e5dSAlfredo Cardigliano  * @csum_tcp_bad: The TCP checksum calculated by the device did
82801489e5dSAlfredo Cardigliano  *                not match the checksum in the receive packet's
82901489e5dSAlfredo Cardigliano  *                TCP header.
83001489e5dSAlfredo Cardigliano  * @csum_udp_ok:  The UDP checksum calculated by the device
83101489e5dSAlfredo Cardigliano  *                matched the checksum in the receive packet's
83201489e5dSAlfredo Cardigliano  *                UDP header
83301489e5dSAlfredo Cardigliano  * @csum_udp_bad: The UDP checksum calculated by the device did
83401489e5dSAlfredo Cardigliano  *                not match the checksum in the receive packet's
83501489e5dSAlfredo Cardigliano  *                UDP header.
83601489e5dSAlfredo Cardigliano  * @csum_ip_ok:   The IPv4 checksum calculated by the device
83701489e5dSAlfredo Cardigliano  *                matched the checksum in the receive packet's
83801489e5dSAlfredo Cardigliano  *                first IPv4 header.  If the receive packet
83901489e5dSAlfredo Cardigliano  *                contains both a tunnel IPv4 header and a
84001489e5dSAlfredo Cardigliano  *                transport IPv4 header, the device validates the
84101489e5dSAlfredo Cardigliano  *                checksum for the both IPv4 headers.
84201489e5dSAlfredo Cardigliano  * @csum_ip_bad:  The IPv4 checksum calculated by the device did
84301489e5dSAlfredo Cardigliano  *                not match the checksum in the receive packet's
84401489e5dSAlfredo Cardigliano  *                first IPv4 header. If the receive packet
84501489e5dSAlfredo Cardigliano  *                contains both a tunnel IPv4 header and a
84601489e5dSAlfredo Cardigliano  *                transport IPv4 header, the device validates the
84701489e5dSAlfredo Cardigliano  *                checksum for both IP headers.
84801489e5dSAlfredo Cardigliano  * @VLAN:         VLAN header was stripped and placed in @vlan_tci.
84901489e5dSAlfredo Cardigliano  * @pkt_type:     Packet type
85001489e5dSAlfredo Cardigliano  * @color:        Color bit.
85101489e5dSAlfredo Cardigliano  */
85201489e5dSAlfredo Cardigliano struct ionic_rxq_comp {
85301489e5dSAlfredo Cardigliano 	u8     status;
85401489e5dSAlfredo Cardigliano 	u8     num_sg_elems;
85501489e5dSAlfredo Cardigliano 	__le16 comp_index;
85601489e5dSAlfredo Cardigliano 	__le32 rss_hash;
85701489e5dSAlfredo Cardigliano 	__le16 csum;
85801489e5dSAlfredo Cardigliano 	__le16 vlan_tci;
85901489e5dSAlfredo Cardigliano 	__le16 len;
86001489e5dSAlfredo Cardigliano 	u8     csum_flags;
86101489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_TCP_OK	0x01
86201489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_TCP_BAD	0x02
86301489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_UDP_OK	0x04
86401489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_UDP_BAD	0x08
86501489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_IP_OK	0x10
86601489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_IP_BAD	0x20
86701489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_VLAN	0x40
86801489e5dSAlfredo Cardigliano #define IONIC_RXQ_COMP_CSUM_F_CALC	0x80
86901489e5dSAlfredo Cardigliano 	u8     pkt_type_color;
870*6645b283SAlfredo Cardigliano #define IONIC_RXQ_COMP_PKT_TYPE_MASK	0x7f
87101489e5dSAlfredo Cardigliano };
87201489e5dSAlfredo Cardigliano 
87301489e5dSAlfredo Cardigliano enum ionic_pkt_type {
87401489e5dSAlfredo Cardigliano 	IONIC_PKT_TYPE_NON_IP     = 0x000,
87501489e5dSAlfredo Cardigliano 	IONIC_PKT_TYPE_IPV4       = 0x001,
87601489e5dSAlfredo Cardigliano 	IONIC_PKT_TYPE_IPV4_TCP   = 0x003,
87701489e5dSAlfredo Cardigliano 	IONIC_PKT_TYPE_IPV4_UDP   = 0x005,
87801489e5dSAlfredo Cardigliano 	IONIC_PKT_TYPE_IPV6       = 0x008,
87901489e5dSAlfredo Cardigliano 	IONIC_PKT_TYPE_IPV6_TCP   = 0x018,
88001489e5dSAlfredo Cardigliano 	IONIC_PKT_TYPE_IPV6_UDP   = 0x028,
88101489e5dSAlfredo Cardigliano };
88201489e5dSAlfredo Cardigliano 
88301489e5dSAlfredo Cardigliano enum ionic_eth_hw_features {
88401489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_VLAN_TX_TAG	= BIT(0),
88501489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_VLAN_RX_STRIP	= BIT(1),
88601489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_VLAN_RX_FILTER	= BIT(2),
88701489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_RX_HASH		= BIT(3),
88801489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_RX_CSUM		= BIT(4),
88901489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TX_SG		= BIT(5),
89001489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_RX_SG		= BIT(6),
89101489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TX_CSUM		= BIT(7),
89201489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO		= BIT(8),
89301489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO_IPV6		= BIT(9),
89401489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO_ECN		= BIT(10),
89501489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO_GRE		= BIT(11),
89601489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO_GRE_CSUM	= BIT(12),
89701489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO_IPXIP4	= BIT(13),
89801489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO_IPXIP6	= BIT(14),
89901489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO_UDP		= BIT(15),
90001489e5dSAlfredo Cardigliano 	IONIC_ETH_HW_TSO_UDP_CSUM	= BIT(16),
90101489e5dSAlfredo Cardigliano };
90201489e5dSAlfredo Cardigliano 
90301489e5dSAlfredo Cardigliano /**
90401489e5dSAlfredo Cardigliano  * struct ionic_q_control_cmd - Queue control command
90501489e5dSAlfredo Cardigliano  * @opcode:     opcode
90601489e5dSAlfredo Cardigliano  * @type:       Queue type
90701489e5dSAlfredo Cardigliano  * @lif_index:  LIF index
90801489e5dSAlfredo Cardigliano  * @index:      Queue index
90901489e5dSAlfredo Cardigliano  * @oper:       Operation (enum q_control_oper)
91001489e5dSAlfredo Cardigliano  */
91101489e5dSAlfredo Cardigliano struct ionic_q_control_cmd {
91201489e5dSAlfredo Cardigliano 	u8     opcode;
91301489e5dSAlfredo Cardigliano 	u8     type;
91401489e5dSAlfredo Cardigliano 	__le16 lif_index;
91501489e5dSAlfredo Cardigliano 	__le32 index;
91601489e5dSAlfredo Cardigliano 	u8     oper;
91701489e5dSAlfredo Cardigliano 	u8     rsvd[55];
91801489e5dSAlfredo Cardigliano };
91901489e5dSAlfredo Cardigliano 
92001489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_q_control_comp;
92101489e5dSAlfredo Cardigliano 
92201489e5dSAlfredo Cardigliano enum q_control_oper {
92301489e5dSAlfredo Cardigliano 	IONIC_Q_DISABLE		= 0,
92401489e5dSAlfredo Cardigliano 	IONIC_Q_ENABLE		= 1,
92501489e5dSAlfredo Cardigliano 	IONIC_Q_HANG_RESET	= 2,
92601489e5dSAlfredo Cardigliano };
92701489e5dSAlfredo Cardigliano 
92801489e5dSAlfredo Cardigliano /**
92901489e5dSAlfredo Cardigliano  * Physical connection type
93001489e5dSAlfredo Cardigliano  */
93101489e5dSAlfredo Cardigliano enum ionic_phy_type {
93201489e5dSAlfredo Cardigliano 	IONIC_PHY_TYPE_NONE	= 0,
93301489e5dSAlfredo Cardigliano 	IONIC_PHY_TYPE_COPPER	= 1,
93401489e5dSAlfredo Cardigliano 	IONIC_PHY_TYPE_FIBER	= 2,
93501489e5dSAlfredo Cardigliano };
93601489e5dSAlfredo Cardigliano 
93701489e5dSAlfredo Cardigliano /**
93801489e5dSAlfredo Cardigliano  * Transceiver status
93901489e5dSAlfredo Cardigliano  */
94001489e5dSAlfredo Cardigliano enum ionic_xcvr_state {
94101489e5dSAlfredo Cardigliano 	IONIC_XCVR_STATE_REMOVED	 = 0,
94201489e5dSAlfredo Cardigliano 	IONIC_XCVR_STATE_INSERTED	 = 1,
94301489e5dSAlfredo Cardigliano 	IONIC_XCVR_STATE_PENDING	 = 2,
94401489e5dSAlfredo Cardigliano 	IONIC_XCVR_STATE_SPROM_READ	 = 3,
94501489e5dSAlfredo Cardigliano 	IONIC_XCVR_STATE_SPROM_READ_ERR  = 4,
94601489e5dSAlfredo Cardigliano };
94701489e5dSAlfredo Cardigliano 
94801489e5dSAlfredo Cardigliano /**
94901489e5dSAlfredo Cardigliano  * Supported link modes
95001489e5dSAlfredo Cardigliano  */
95101489e5dSAlfredo Cardigliano enum ionic_xcvr_pid {
95201489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_UNKNOWN           = 0,
95301489e5dSAlfredo Cardigliano 
95401489e5dSAlfredo Cardigliano 	/* CU */
95501489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_100G_CR4     = 1,
95601489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_40GBASE_CR4  = 2,
95701489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_25GBASE_CR_S  = 3,
95801489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_25GBASE_CR_L  = 4,
95901489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_25GBASE_CR_N  = 5,
96001489e5dSAlfredo Cardigliano 
96101489e5dSAlfredo Cardigliano 	/* Fiber */
96201489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_100G_AOC    = 50,
96301489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_100G_ACC    = 51,
96401489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_100G_SR4    = 52,
96501489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_100G_LR4    = 53,
96601489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_100G_ER4    = 54,
96701489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_40GBASE_ER4 = 55,
96801489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_40GBASE_SR4 = 56,
96901489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_40GBASE_LR4 = 57,
97001489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_40GBASE_AOC = 58,
97101489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_25GBASE_SR   = 59,
97201489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_25GBASE_LR   = 60,
97301489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_25GBASE_ER   = 61,
97401489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_25GBASE_AOC  = 62,
97501489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_10GBASE_SR   = 63,
97601489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_10GBASE_LR   = 64,
97701489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_10GBASE_LRM  = 65,
97801489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_10GBASE_ER   = 66,
97901489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_10GBASE_AOC  = 67,
98001489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_SFP_10GBASE_CU   = 68,
98101489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_100G_CWDM4  = 69,
98201489e5dSAlfredo Cardigliano 	IONIC_XCVR_PID_QSFP_100G_PSM4   = 70,
98301489e5dSAlfredo Cardigliano };
98401489e5dSAlfredo Cardigliano 
98501489e5dSAlfredo Cardigliano /**
98601489e5dSAlfredo Cardigliano  * Port types
98701489e5dSAlfredo Cardigliano  */
98801489e5dSAlfredo Cardigliano enum ionic_port_type {
98901489e5dSAlfredo Cardigliano 	IONIC_PORT_TYPE_NONE = 0,  /* port type not configured */
99001489e5dSAlfredo Cardigliano 	IONIC_PORT_TYPE_ETH  = 1,  /* port carries ethernet traffic (inband) */
99101489e5dSAlfredo Cardigliano 	IONIC_PORT_TYPE_MGMT = 2,  /* port carries mgmt traffic (out-of-band) */
99201489e5dSAlfredo Cardigliano };
99301489e5dSAlfredo Cardigliano 
99401489e5dSAlfredo Cardigliano /**
99501489e5dSAlfredo Cardigliano  * Port config state
99601489e5dSAlfredo Cardigliano  */
99701489e5dSAlfredo Cardigliano enum ionic_port_admin_state {
99801489e5dSAlfredo Cardigliano 	IONIC_PORT_ADMIN_STATE_NONE = 0,   /* port admin state not configured */
99901489e5dSAlfredo Cardigliano 	IONIC_PORT_ADMIN_STATE_DOWN = 1,   /* port is admin disabled */
100001489e5dSAlfredo Cardigliano 	IONIC_PORT_ADMIN_STATE_UP   = 2,   /* port is admin enabled */
100101489e5dSAlfredo Cardigliano };
100201489e5dSAlfredo Cardigliano 
100301489e5dSAlfredo Cardigliano /**
100401489e5dSAlfredo Cardigliano  * Port operational status
100501489e5dSAlfredo Cardigliano  */
100601489e5dSAlfredo Cardigliano enum ionic_port_oper_status {
100701489e5dSAlfredo Cardigliano 	IONIC_PORT_OPER_STATUS_NONE  = 0,	/* port is disabled */
100801489e5dSAlfredo Cardigliano 	IONIC_PORT_OPER_STATUS_UP    = 1,	/* port is linked up */
100901489e5dSAlfredo Cardigliano 	IONIC_PORT_OPER_STATUS_DOWN  = 2,	/* port link status is down */
101001489e5dSAlfredo Cardigliano };
101101489e5dSAlfredo Cardigliano 
101201489e5dSAlfredo Cardigliano /**
101301489e5dSAlfredo Cardigliano  * Ethernet Forward error correction (fec) modes
101401489e5dSAlfredo Cardigliano  */
101501489e5dSAlfredo Cardigliano enum ionic_port_fec_type {
101601489e5dSAlfredo Cardigliano 	IONIC_PORT_FEC_TYPE_NONE = 0,		/* Disabled */
101701489e5dSAlfredo Cardigliano 	IONIC_PORT_FEC_TYPE_FC   = 1,		/* FireCode */
101801489e5dSAlfredo Cardigliano 	IONIC_PORT_FEC_TYPE_RS   = 2,		/* ReedSolomon */
101901489e5dSAlfredo Cardigliano };
102001489e5dSAlfredo Cardigliano 
102101489e5dSAlfredo Cardigliano /**
102201489e5dSAlfredo Cardigliano  * Ethernet pause (flow control) modes
102301489e5dSAlfredo Cardigliano  */
102401489e5dSAlfredo Cardigliano enum ionic_port_pause_type {
102501489e5dSAlfredo Cardigliano 	IONIC_PORT_PAUSE_TYPE_NONE = 0,	/* Disable Pause */
102601489e5dSAlfredo Cardigliano 	IONIC_PORT_PAUSE_TYPE_LINK = 1,	/* Link level pause */
102701489e5dSAlfredo Cardigliano 	IONIC_PORT_PAUSE_TYPE_PFC  = 2,	/* Priority-Flow control */
102801489e5dSAlfredo Cardigliano };
102901489e5dSAlfredo Cardigliano 
103001489e5dSAlfredo Cardigliano /**
103101489e5dSAlfredo Cardigliano  * Loopback modes
103201489e5dSAlfredo Cardigliano  */
103301489e5dSAlfredo Cardigliano enum ionic_port_loopback_mode {
103401489e5dSAlfredo Cardigliano 	IONIC_PORT_LOOPBACK_MODE_NONE = 0,	/* Disable loopback */
103501489e5dSAlfredo Cardigliano 	IONIC_PORT_LOOPBACK_MODE_MAC  = 1,	/* MAC loopback */
103601489e5dSAlfredo Cardigliano 	IONIC_PORT_LOOPBACK_MODE_PHY  = 2,	/* PHY/Serdes loopback */
103701489e5dSAlfredo Cardigliano };
103801489e5dSAlfredo Cardigliano 
103901489e5dSAlfredo Cardigliano /**
104001489e5dSAlfredo Cardigliano  * Transceiver Status information
104101489e5dSAlfredo Cardigliano  * @state:    Transceiver status (enum ionic_xcvr_state)
104201489e5dSAlfredo Cardigliano  * @phy:      Physical connection type (enum ionic_phy_type)
104301489e5dSAlfredo Cardigliano  * @pid:      Transceiver link mode (enum pid)
104401489e5dSAlfredo Cardigliano  * @sprom:    Transceiver sprom contents
104501489e5dSAlfredo Cardigliano  */
104601489e5dSAlfredo Cardigliano struct ionic_xcvr_status {
104701489e5dSAlfredo Cardigliano 	u8     state;
104801489e5dSAlfredo Cardigliano 	u8     phy;
104901489e5dSAlfredo Cardigliano 	__le16 pid;
105001489e5dSAlfredo Cardigliano 	u8     sprom[256];
105101489e5dSAlfredo Cardigliano };
105201489e5dSAlfredo Cardigliano 
105301489e5dSAlfredo Cardigliano /**
105401489e5dSAlfredo Cardigliano  * Port configuration
105501489e5dSAlfredo Cardigliano  * @speed:              port speed (in Mbps)
105601489e5dSAlfredo Cardigliano  * @mtu:                mtu
105701489e5dSAlfredo Cardigliano  * @state:              port admin state (enum port_admin_state)
105801489e5dSAlfredo Cardigliano  * @an_enable:          autoneg enable
105901489e5dSAlfredo Cardigliano  * @fec_type:           fec type (enum ionic_port_fec_type)
106001489e5dSAlfredo Cardigliano  * @pause_type:         pause type (enum ionic_port_pause_type)
106101489e5dSAlfredo Cardigliano  * @loopback_mode:      loopback mode (enum ionic_port_loopback_mode)
106201489e5dSAlfredo Cardigliano  */
106301489e5dSAlfredo Cardigliano union ionic_port_config {
106401489e5dSAlfredo Cardigliano 	struct {
106501489e5dSAlfredo Cardigliano #define IONIC_SPEED_100G	100000	/* 100G in Mbps */
106601489e5dSAlfredo Cardigliano #define IONIC_SPEED_50G		50000	/* 50G in Mbps */
106701489e5dSAlfredo Cardigliano #define IONIC_SPEED_40G		40000	/* 40G in Mbps */
106801489e5dSAlfredo Cardigliano #define IONIC_SPEED_25G		25000	/* 25G in Mbps */
106901489e5dSAlfredo Cardigliano #define IONIC_SPEED_10G		10000	/* 10G in Mbps */
107001489e5dSAlfredo Cardigliano #define IONIC_SPEED_1G		1000	/* 1G in Mbps */
107101489e5dSAlfredo Cardigliano 		__le32 speed;
107201489e5dSAlfredo Cardigliano 		__le32 mtu;
107301489e5dSAlfredo Cardigliano 		u8     state;
107401489e5dSAlfredo Cardigliano 		u8     an_enable;
107501489e5dSAlfredo Cardigliano 		u8     fec_type;
107601489e5dSAlfredo Cardigliano #define IONIC_PAUSE_TYPE_MASK		0x0f
107701489e5dSAlfredo Cardigliano #define IONIC_PAUSE_FLAGS_MASK		0xf0
107801489e5dSAlfredo Cardigliano #define IONIC_PAUSE_F_TX		0x10
107901489e5dSAlfredo Cardigliano #define IONIC_PAUSE_F_RX		0x20
108001489e5dSAlfredo Cardigliano 		u8     pause_type;
108101489e5dSAlfredo Cardigliano 		u8     loopback_mode;
108201489e5dSAlfredo Cardigliano 	};
108301489e5dSAlfredo Cardigliano 	__le32 words[64];
108401489e5dSAlfredo Cardigliano };
108501489e5dSAlfredo Cardigliano 
108601489e5dSAlfredo Cardigliano /**
108701489e5dSAlfredo Cardigliano  * Port Status information
108801489e5dSAlfredo Cardigliano  * @status:             link status (enum ionic_port_oper_status)
108901489e5dSAlfredo Cardigliano  * @id:                 port id
109001489e5dSAlfredo Cardigliano  * @speed:              link speed (in Mbps)
109101489e5dSAlfredo Cardigliano  * @xcvr:               transceiver status
109201489e5dSAlfredo Cardigliano  */
109301489e5dSAlfredo Cardigliano struct ionic_port_status {
109401489e5dSAlfredo Cardigliano 	__le32 id;
109501489e5dSAlfredo Cardigliano 	__le32 speed;
109601489e5dSAlfredo Cardigliano 	u8     status;
109701489e5dSAlfredo Cardigliano 	u8     rsvd[51];
109801489e5dSAlfredo Cardigliano 	struct ionic_xcvr_status  xcvr;
109901489e5dSAlfredo Cardigliano };
110001489e5dSAlfredo Cardigliano 
110101489e5dSAlfredo Cardigliano /**
110201489e5dSAlfredo Cardigliano  * struct ionic_port_identify_cmd - Port identify command
110301489e5dSAlfredo Cardigliano  * @opcode:     opcode
110401489e5dSAlfredo Cardigliano  * @index:      port index
110501489e5dSAlfredo Cardigliano  * @ver:        Highest version of identify supported by driver
110601489e5dSAlfredo Cardigliano  */
110701489e5dSAlfredo Cardigliano struct ionic_port_identify_cmd {
110801489e5dSAlfredo Cardigliano 	u8 opcode;
110901489e5dSAlfredo Cardigliano 	u8 index;
111001489e5dSAlfredo Cardigliano 	u8 ver;
111101489e5dSAlfredo Cardigliano 	u8 rsvd[61];
111201489e5dSAlfredo Cardigliano };
111301489e5dSAlfredo Cardigliano 
111401489e5dSAlfredo Cardigliano /**
111501489e5dSAlfredo Cardigliano  * struct ionic_port_identify_comp - Port identify command completion
111601489e5dSAlfredo Cardigliano  * @status: The status of the command (enum status_code)
111701489e5dSAlfredo Cardigliano  * @ver:    Version of identify returned by device
111801489e5dSAlfredo Cardigliano  */
111901489e5dSAlfredo Cardigliano struct ionic_port_identify_comp {
112001489e5dSAlfredo Cardigliano 	u8 status;
112101489e5dSAlfredo Cardigliano 	u8 ver;
112201489e5dSAlfredo Cardigliano 	u8 rsvd[14];
112301489e5dSAlfredo Cardigliano };
112401489e5dSAlfredo Cardigliano 
112501489e5dSAlfredo Cardigliano /**
112601489e5dSAlfredo Cardigliano  * struct ionic_port_init_cmd - Port initialization command
112701489e5dSAlfredo Cardigliano  * @opcode:     opcode
112801489e5dSAlfredo Cardigliano  * @index:      port index
112901489e5dSAlfredo Cardigliano  * @info_pa:    destination address for port info (struct ionic_port_info)
113001489e5dSAlfredo Cardigliano  */
113101489e5dSAlfredo Cardigliano struct ionic_port_init_cmd {
113201489e5dSAlfredo Cardigliano 	u8     opcode;
113301489e5dSAlfredo Cardigliano 	u8     index;
113401489e5dSAlfredo Cardigliano 	u8     rsvd[6];
113501489e5dSAlfredo Cardigliano 	__le64 info_pa;
113601489e5dSAlfredo Cardigliano 	u8     rsvd2[48];
113701489e5dSAlfredo Cardigliano };
113801489e5dSAlfredo Cardigliano 
113901489e5dSAlfredo Cardigliano /**
114001489e5dSAlfredo Cardigliano  * struct ionic_port_init_comp - Port initialization command completion
114101489e5dSAlfredo Cardigliano  * @status: The status of the command (enum status_code)
114201489e5dSAlfredo Cardigliano  */
114301489e5dSAlfredo Cardigliano struct ionic_port_init_comp {
114401489e5dSAlfredo Cardigliano 	u8 status;
114501489e5dSAlfredo Cardigliano 	u8 rsvd[15];
114601489e5dSAlfredo Cardigliano };
114701489e5dSAlfredo Cardigliano 
114801489e5dSAlfredo Cardigliano /**
114901489e5dSAlfredo Cardigliano  * struct ionic_port_reset_cmd - Port reset command
115001489e5dSAlfredo Cardigliano  * @opcode:     opcode
115101489e5dSAlfredo Cardigliano  * @index:      port index
115201489e5dSAlfredo Cardigliano  */
115301489e5dSAlfredo Cardigliano struct ionic_port_reset_cmd {
115401489e5dSAlfredo Cardigliano 	u8 opcode;
115501489e5dSAlfredo Cardigliano 	u8 index;
115601489e5dSAlfredo Cardigliano 	u8 rsvd[62];
115701489e5dSAlfredo Cardigliano };
115801489e5dSAlfredo Cardigliano 
115901489e5dSAlfredo Cardigliano /**
116001489e5dSAlfredo Cardigliano  * struct ionic_port_reset_comp - Port reset command completion
116101489e5dSAlfredo Cardigliano  * @status: The status of the command (enum status_code)
116201489e5dSAlfredo Cardigliano  */
116301489e5dSAlfredo Cardigliano struct ionic_port_reset_comp {
116401489e5dSAlfredo Cardigliano 	u8 status;
116501489e5dSAlfredo Cardigliano 	u8 rsvd[15];
116601489e5dSAlfredo Cardigliano };
116701489e5dSAlfredo Cardigliano 
116801489e5dSAlfredo Cardigliano /**
116901489e5dSAlfredo Cardigliano  * enum stats_ctl_cmd - List of commands for stats control
117001489e5dSAlfredo Cardigliano  */
117101489e5dSAlfredo Cardigliano enum ionic_stats_ctl_cmd {
117201489e5dSAlfredo Cardigliano 	IONIC_STATS_CTL_RESET		= 0,
117301489e5dSAlfredo Cardigliano };
117401489e5dSAlfredo Cardigliano 
117501489e5dSAlfredo Cardigliano 
117601489e5dSAlfredo Cardigliano /**
117701489e5dSAlfredo Cardigliano  * enum ionic_port_attr - List of device attributes
117801489e5dSAlfredo Cardigliano  */
117901489e5dSAlfredo Cardigliano enum ionic_port_attr {
118001489e5dSAlfredo Cardigliano 	IONIC_PORT_ATTR_STATE		= 0,
118101489e5dSAlfredo Cardigliano 	IONIC_PORT_ATTR_SPEED		= 1,
118201489e5dSAlfredo Cardigliano 	IONIC_PORT_ATTR_MTU		= 2,
118301489e5dSAlfredo Cardigliano 	IONIC_PORT_ATTR_AUTONEG		= 3,
118401489e5dSAlfredo Cardigliano 	IONIC_PORT_ATTR_FEC		= 4,
118501489e5dSAlfredo Cardigliano 	IONIC_PORT_ATTR_PAUSE		= 5,
118601489e5dSAlfredo Cardigliano 	IONIC_PORT_ATTR_LOOPBACK	= 6,
118701489e5dSAlfredo Cardigliano 	IONIC_PORT_ATTR_STATS_CTRL	= 7,
118801489e5dSAlfredo Cardigliano };
118901489e5dSAlfredo Cardigliano 
119001489e5dSAlfredo Cardigliano /**
119101489e5dSAlfredo Cardigliano  * struct ionic_port_setattr_cmd - Set port attributes on the NIC
119201489e5dSAlfredo Cardigliano  * @opcode:     Opcode
119301489e5dSAlfredo Cardigliano  * @index:      port index
119401489e5dSAlfredo Cardigliano  * @attr:       Attribute type (enum ionic_port_attr)
119501489e5dSAlfredo Cardigliano  */
119601489e5dSAlfredo Cardigliano struct ionic_port_setattr_cmd {
119701489e5dSAlfredo Cardigliano 	u8     opcode;
119801489e5dSAlfredo Cardigliano 	u8     index;
119901489e5dSAlfredo Cardigliano 	u8     attr;
120001489e5dSAlfredo Cardigliano 	u8     rsvd;
120101489e5dSAlfredo Cardigliano 	union {
120201489e5dSAlfredo Cardigliano 		u8      state;
120301489e5dSAlfredo Cardigliano 		__le32  speed;
120401489e5dSAlfredo Cardigliano 		__le32  mtu;
120501489e5dSAlfredo Cardigliano 		u8      an_enable;
120601489e5dSAlfredo Cardigliano 		u8      fec_type;
120701489e5dSAlfredo Cardigliano 		u8      pause_type;
120801489e5dSAlfredo Cardigliano 		u8      loopback_mode;
120901489e5dSAlfredo Cardigliano 		u8	stats_ctl;
121001489e5dSAlfredo Cardigliano 		u8      rsvd2[60];
121101489e5dSAlfredo Cardigliano 	};
121201489e5dSAlfredo Cardigliano };
121301489e5dSAlfredo Cardigliano 
121401489e5dSAlfredo Cardigliano /**
121501489e5dSAlfredo Cardigliano  * struct ionic_port_setattr_comp - Port set attr command completion
121601489e5dSAlfredo Cardigliano  * @status:     The status of the command (enum status_code)
121701489e5dSAlfredo Cardigliano  * @color:      Color bit
121801489e5dSAlfredo Cardigliano  */
121901489e5dSAlfredo Cardigliano struct ionic_port_setattr_comp {
122001489e5dSAlfredo Cardigliano 	u8     status;
122101489e5dSAlfredo Cardigliano 	u8     rsvd[14];
122201489e5dSAlfredo Cardigliano 	u8     color;
122301489e5dSAlfredo Cardigliano };
122401489e5dSAlfredo Cardigliano 
122501489e5dSAlfredo Cardigliano /**
122601489e5dSAlfredo Cardigliano  * struct ionic_port_getattr_cmd - Get port attributes from the NIC
122701489e5dSAlfredo Cardigliano  * @opcode:     Opcode
122801489e5dSAlfredo Cardigliano  * @index:      port index
122901489e5dSAlfredo Cardigliano  * @attr:       Attribute type (enum ionic_port_attr)
123001489e5dSAlfredo Cardigliano  */
123101489e5dSAlfredo Cardigliano struct ionic_port_getattr_cmd {
123201489e5dSAlfredo Cardigliano 	u8     opcode;
123301489e5dSAlfredo Cardigliano 	u8     index;
123401489e5dSAlfredo Cardigliano 	u8     attr;
123501489e5dSAlfredo Cardigliano 	u8     rsvd[61];
123601489e5dSAlfredo Cardigliano };
123701489e5dSAlfredo Cardigliano 
123801489e5dSAlfredo Cardigliano /**
123901489e5dSAlfredo Cardigliano  * struct ionic_port_getattr_comp - Port get attr command completion
124001489e5dSAlfredo Cardigliano  * @status:     The status of the command (enum status_code)
124101489e5dSAlfredo Cardigliano  * @color:      Color bit
124201489e5dSAlfredo Cardigliano  */
124301489e5dSAlfredo Cardigliano struct ionic_port_getattr_comp {
124401489e5dSAlfredo Cardigliano 	u8     status;
124501489e5dSAlfredo Cardigliano 	u8     rsvd[3];
124601489e5dSAlfredo Cardigliano 	union {
124701489e5dSAlfredo Cardigliano 		u8      state;
124801489e5dSAlfredo Cardigliano 		__le32  speed;
124901489e5dSAlfredo Cardigliano 		__le32  mtu;
125001489e5dSAlfredo Cardigliano 		u8      an_enable;
125101489e5dSAlfredo Cardigliano 		u8      fec_type;
125201489e5dSAlfredo Cardigliano 		u8      pause_type;
125301489e5dSAlfredo Cardigliano 		u8      loopback_mode;
125401489e5dSAlfredo Cardigliano 		u8      rsvd2[11];
125501489e5dSAlfredo Cardigliano 	};
125601489e5dSAlfredo Cardigliano 	u8     color;
125701489e5dSAlfredo Cardigliano };
125801489e5dSAlfredo Cardigliano 
125901489e5dSAlfredo Cardigliano /**
126001489e5dSAlfredo Cardigliano  * struct ionic_lif_status - Lif status register
126101489e5dSAlfredo Cardigliano  * @eid:             most recent NotifyQ event id
126201489e5dSAlfredo Cardigliano  * @port_num:        port the lif is connected to
126301489e5dSAlfredo Cardigliano  * @link_status:     port status (enum ionic_port_oper_status)
126401489e5dSAlfredo Cardigliano  * @link_speed:      speed of link in Mbps
126501489e5dSAlfredo Cardigliano  * @link_down_count: number of times link status changes
126601489e5dSAlfredo Cardigliano  */
126701489e5dSAlfredo Cardigliano struct ionic_lif_status {
126801489e5dSAlfredo Cardigliano 	__le64 eid;
126901489e5dSAlfredo Cardigliano 	u8     port_num;
127001489e5dSAlfredo Cardigliano 	u8     rsvd;
127101489e5dSAlfredo Cardigliano 	__le16 link_status;
127201489e5dSAlfredo Cardigliano 	__le32 link_speed;		/* units of 1Mbps: eg 10000 = 10Gbps */
127301489e5dSAlfredo Cardigliano 	__le16 link_down_count;
127401489e5dSAlfredo Cardigliano 	u8      rsvd2[46];
127501489e5dSAlfredo Cardigliano };
127601489e5dSAlfredo Cardigliano 
127701489e5dSAlfredo Cardigliano /**
127801489e5dSAlfredo Cardigliano  * struct ionic_lif_reset_cmd - LIF reset command
127901489e5dSAlfredo Cardigliano  * @opcode:    opcode
128001489e5dSAlfredo Cardigliano  * @index:     LIF index
128101489e5dSAlfredo Cardigliano  */
128201489e5dSAlfredo Cardigliano struct ionic_lif_reset_cmd {
128301489e5dSAlfredo Cardigliano 	u8     opcode;
128401489e5dSAlfredo Cardigliano 	u8     rsvd;
128501489e5dSAlfredo Cardigliano 	__le16 index;
128601489e5dSAlfredo Cardigliano 	__le32 rsvd2[15];
128701489e5dSAlfredo Cardigliano };
128801489e5dSAlfredo Cardigliano 
128901489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_lif_reset_comp;
129001489e5dSAlfredo Cardigliano 
129101489e5dSAlfredo Cardigliano enum ionic_dev_state {
129201489e5dSAlfredo Cardigliano 	IONIC_DEV_DISABLE	= 0,
129301489e5dSAlfredo Cardigliano 	IONIC_DEV_ENABLE	= 1,
129401489e5dSAlfredo Cardigliano 	IONIC_DEV_HANG_RESET	= 2,
129501489e5dSAlfredo Cardigliano };
129601489e5dSAlfredo Cardigliano 
129701489e5dSAlfredo Cardigliano /**
129801489e5dSAlfredo Cardigliano  * enum ionic_dev_attr - List of device attributes
129901489e5dSAlfredo Cardigliano  */
130001489e5dSAlfredo Cardigliano enum ionic_dev_attr {
130101489e5dSAlfredo Cardigliano 	IONIC_DEV_ATTR_STATE    = 0,
130201489e5dSAlfredo Cardigliano 	IONIC_DEV_ATTR_NAME     = 1,
130301489e5dSAlfredo Cardigliano 	IONIC_DEV_ATTR_FEATURES = 2,
130401489e5dSAlfredo Cardigliano };
130501489e5dSAlfredo Cardigliano 
130601489e5dSAlfredo Cardigliano /**
130701489e5dSAlfredo Cardigliano  * struct ionic_dev_setattr_cmd - Set Device attributes on the NIC
130801489e5dSAlfredo Cardigliano  * @opcode:     Opcode
130901489e5dSAlfredo Cardigliano  * @attr:       Attribute type (enum ionic_dev_attr)
131001489e5dSAlfredo Cardigliano  * @state:      Device state (enum ionic_dev_state)
131101489e5dSAlfredo Cardigliano  * @name:       The bus info, e.g. PCI slot-device-function, 0 terminated
131201489e5dSAlfredo Cardigliano  * @features:   Device features
131301489e5dSAlfredo Cardigliano  */
131401489e5dSAlfredo Cardigliano struct ionic_dev_setattr_cmd {
131501489e5dSAlfredo Cardigliano 	u8     opcode;
131601489e5dSAlfredo Cardigliano 	u8     attr;
131701489e5dSAlfredo Cardigliano 	__le16 rsvd;
131801489e5dSAlfredo Cardigliano 	union {
131901489e5dSAlfredo Cardigliano 		u8      state;
132001489e5dSAlfredo Cardigliano 		char    name[IONIC_IFNAMSIZ];
132101489e5dSAlfredo Cardigliano 		__le64  features;
132201489e5dSAlfredo Cardigliano 		u8      rsvd2[60];
132301489e5dSAlfredo Cardigliano 	};
132401489e5dSAlfredo Cardigliano };
132501489e5dSAlfredo Cardigliano 
132601489e5dSAlfredo Cardigliano /**
132701489e5dSAlfredo Cardigliano  * struct ionic_dev_setattr_comp - Device set attr command completion
132801489e5dSAlfredo Cardigliano  * @status:     The status of the command (enum status_code)
132901489e5dSAlfredo Cardigliano  * @features:   Device features
133001489e5dSAlfredo Cardigliano  * @color:      Color bit
133101489e5dSAlfredo Cardigliano  */
133201489e5dSAlfredo Cardigliano struct ionic_dev_setattr_comp {
133301489e5dSAlfredo Cardigliano 	u8     status;
133401489e5dSAlfredo Cardigliano 	u8     rsvd[3];
133501489e5dSAlfredo Cardigliano 	union {
133601489e5dSAlfredo Cardigliano 		__le64  features;
133701489e5dSAlfredo Cardigliano 		u8      rsvd2[11];
133801489e5dSAlfredo Cardigliano 	};
133901489e5dSAlfredo Cardigliano 	u8     color;
134001489e5dSAlfredo Cardigliano };
134101489e5dSAlfredo Cardigliano 
134201489e5dSAlfredo Cardigliano /**
134301489e5dSAlfredo Cardigliano  * struct ionic_dev_getattr_cmd - Get Device attributes from the NIC
134401489e5dSAlfredo Cardigliano  * @opcode:     opcode
134501489e5dSAlfredo Cardigliano  * @attr:       Attribute type (enum ionic_dev_attr)
134601489e5dSAlfredo Cardigliano  */
134701489e5dSAlfredo Cardigliano struct ionic_dev_getattr_cmd {
134801489e5dSAlfredo Cardigliano 	u8     opcode;
134901489e5dSAlfredo Cardigliano 	u8     attr;
135001489e5dSAlfredo Cardigliano 	u8     rsvd[62];
135101489e5dSAlfredo Cardigliano };
135201489e5dSAlfredo Cardigliano 
135301489e5dSAlfredo Cardigliano /**
135401489e5dSAlfredo Cardigliano  * struct ionic_dev_setattr_comp - Device set attr command completion
135501489e5dSAlfredo Cardigliano  * @status:     The status of the command (enum status_code)
135601489e5dSAlfredo Cardigliano  * @features:   Device features
135701489e5dSAlfredo Cardigliano  * @color:      Color bit
135801489e5dSAlfredo Cardigliano  */
135901489e5dSAlfredo Cardigliano struct ionic_dev_getattr_comp {
136001489e5dSAlfredo Cardigliano 	u8     status;
136101489e5dSAlfredo Cardigliano 	u8     rsvd[3];
136201489e5dSAlfredo Cardigliano 	union {
136301489e5dSAlfredo Cardigliano 		__le64  features;
136401489e5dSAlfredo Cardigliano 		u8      rsvd2[11];
136501489e5dSAlfredo Cardigliano 	};
136601489e5dSAlfredo Cardigliano 	u8     color;
136701489e5dSAlfredo Cardigliano };
136801489e5dSAlfredo Cardigliano 
136901489e5dSAlfredo Cardigliano /**
137001489e5dSAlfredo Cardigliano  * RSS parameters
137101489e5dSAlfredo Cardigliano  */
137201489e5dSAlfredo Cardigliano #define IONIC_RSS_HASH_KEY_SIZE		40
137301489e5dSAlfredo Cardigliano 
137401489e5dSAlfredo Cardigliano enum ionic_rss_hash_types {
137501489e5dSAlfredo Cardigliano 	IONIC_RSS_TYPE_IPV4	= BIT(0),
137601489e5dSAlfredo Cardigliano 	IONIC_RSS_TYPE_IPV4_TCP	= BIT(1),
137701489e5dSAlfredo Cardigliano 	IONIC_RSS_TYPE_IPV4_UDP	= BIT(2),
137801489e5dSAlfredo Cardigliano 	IONIC_RSS_TYPE_IPV6	= BIT(3),
137901489e5dSAlfredo Cardigliano 	IONIC_RSS_TYPE_IPV6_TCP	= BIT(4),
138001489e5dSAlfredo Cardigliano 	IONIC_RSS_TYPE_IPV6_UDP	= BIT(5),
138101489e5dSAlfredo Cardigliano };
138201489e5dSAlfredo Cardigliano 
138301489e5dSAlfredo Cardigliano /**
138401489e5dSAlfredo Cardigliano  * enum ionic_lif_attr - List of LIF attributes
138501489e5dSAlfredo Cardigliano  */
138601489e5dSAlfredo Cardigliano enum ionic_lif_attr {
138701489e5dSAlfredo Cardigliano 	IONIC_LIF_ATTR_STATE        = 0,
138801489e5dSAlfredo Cardigliano 	IONIC_LIF_ATTR_NAME         = 1,
138901489e5dSAlfredo Cardigliano 	IONIC_LIF_ATTR_MTU          = 2,
139001489e5dSAlfredo Cardigliano 	IONIC_LIF_ATTR_MAC          = 3,
139101489e5dSAlfredo Cardigliano 	IONIC_LIF_ATTR_FEATURES     = 4,
139201489e5dSAlfredo Cardigliano 	IONIC_LIF_ATTR_RSS          = 5,
139301489e5dSAlfredo Cardigliano 	IONIC_LIF_ATTR_STATS_CTRL   = 6,
139401489e5dSAlfredo Cardigliano };
139501489e5dSAlfredo Cardigliano 
139601489e5dSAlfredo Cardigliano /**
139701489e5dSAlfredo Cardigliano  * struct ionic_lif_setattr_cmd - Set LIF attributes on the NIC
139801489e5dSAlfredo Cardigliano  * @opcode:     Opcode
139901489e5dSAlfredo Cardigliano  * @type:       Attribute type (enum ionic_lif_attr)
140001489e5dSAlfredo Cardigliano  * @index:      LIF index
140101489e5dSAlfredo Cardigliano  * @state:      lif state (enum lif_state)
140201489e5dSAlfredo Cardigliano  * @name:       The netdev name string, 0 terminated
140301489e5dSAlfredo Cardigliano  * @mtu:        Mtu
140401489e5dSAlfredo Cardigliano  * @mac:        Station mac
140501489e5dSAlfredo Cardigliano  * @features:   Features (enum ionic_eth_hw_features)
140601489e5dSAlfredo Cardigliano  * @rss:        RSS properties
140701489e5dSAlfredo Cardigliano  *              @types:     The hash types to enable (see rss_hash_types).
140801489e5dSAlfredo Cardigliano  *              @key:       The hash secret key.
140901489e5dSAlfredo Cardigliano  *              @addr:      Address for the indirection table shared memory.
141001489e5dSAlfredo Cardigliano  * @stats_ctl:  stats control commands (enum stats_ctl_cmd)
141101489e5dSAlfredo Cardigliano  */
141201489e5dSAlfredo Cardigliano struct ionic_lif_setattr_cmd {
141301489e5dSAlfredo Cardigliano 	u8     opcode;
141401489e5dSAlfredo Cardigliano 	u8     attr;
141501489e5dSAlfredo Cardigliano 	__le16 index;
141601489e5dSAlfredo Cardigliano 	union {
141701489e5dSAlfredo Cardigliano 		u8      state;
141801489e5dSAlfredo Cardigliano 		char    name[IONIC_IFNAMSIZ];
141901489e5dSAlfredo Cardigliano 		__le32  mtu;
142001489e5dSAlfredo Cardigliano 		u8      mac[6];
142101489e5dSAlfredo Cardigliano 		__le64  features;
142201489e5dSAlfredo Cardigliano 		struct {
142301489e5dSAlfredo Cardigliano 			__le16 types;
142401489e5dSAlfredo Cardigliano 			u8     key[IONIC_RSS_HASH_KEY_SIZE];
142501489e5dSAlfredo Cardigliano 			u8     rsvd[6];
142601489e5dSAlfredo Cardigliano 			__le64 addr;
142701489e5dSAlfredo Cardigliano 		} rss;
142801489e5dSAlfredo Cardigliano 		u8	stats_ctl;
142901489e5dSAlfredo Cardigliano 		u8      rsvd[60];
143001489e5dSAlfredo Cardigliano 	};
143101489e5dSAlfredo Cardigliano };
143201489e5dSAlfredo Cardigliano 
143301489e5dSAlfredo Cardigliano /**
143401489e5dSAlfredo Cardigliano  * struct ionic_lif_setattr_comp - LIF set attr command completion
143501489e5dSAlfredo Cardigliano  * @status:     The status of the command (enum status_code)
143601489e5dSAlfredo Cardigliano  * @comp_index: The index in the descriptor ring for which this
143701489e5dSAlfredo Cardigliano  *              is the completion.
143801489e5dSAlfredo Cardigliano  * @features:   features (enum ionic_eth_hw_features)
143901489e5dSAlfredo Cardigliano  * @color:      Color bit
144001489e5dSAlfredo Cardigliano  */
144101489e5dSAlfredo Cardigliano struct ionic_lif_setattr_comp {
144201489e5dSAlfredo Cardigliano 	u8     status;
144301489e5dSAlfredo Cardigliano 	u8     rsvd;
144401489e5dSAlfredo Cardigliano 	__le16 comp_index;
144501489e5dSAlfredo Cardigliano 	union {
144601489e5dSAlfredo Cardigliano 		__le64  features;
144701489e5dSAlfredo Cardigliano 		u8      rsvd2[11];
144801489e5dSAlfredo Cardigliano 	};
144901489e5dSAlfredo Cardigliano 	u8     color;
145001489e5dSAlfredo Cardigliano };
145101489e5dSAlfredo Cardigliano 
145201489e5dSAlfredo Cardigliano /**
145301489e5dSAlfredo Cardigliano  * struct ionic_lif_getattr_cmd - Get LIF attributes from the NIC
145401489e5dSAlfredo Cardigliano  * @opcode:     Opcode
145501489e5dSAlfredo Cardigliano  * @attr:       Attribute type (enum ionic_lif_attr)
145601489e5dSAlfredo Cardigliano  * @index:      LIF index
145701489e5dSAlfredo Cardigliano  */
145801489e5dSAlfredo Cardigliano struct ionic_lif_getattr_cmd {
145901489e5dSAlfredo Cardigliano 	u8     opcode;
146001489e5dSAlfredo Cardigliano 	u8     attr;
146101489e5dSAlfredo Cardigliano 	__le16 index;
146201489e5dSAlfredo Cardigliano 	u8     rsvd[60];
146301489e5dSAlfredo Cardigliano };
146401489e5dSAlfredo Cardigliano 
146501489e5dSAlfredo Cardigliano /**
146601489e5dSAlfredo Cardigliano  * struct ionic_lif_getattr_comp - LIF get attr command completion
146701489e5dSAlfredo Cardigliano  * @status:     The status of the command (enum status_code)
146801489e5dSAlfredo Cardigliano  * @comp_index: The index in the descriptor ring for which this
146901489e5dSAlfredo Cardigliano  *              is the completion.
147001489e5dSAlfredo Cardigliano  * @state:      lif state (enum lif_state)
147101489e5dSAlfredo Cardigliano  * @name:       The netdev name string, 0 terminated
147201489e5dSAlfredo Cardigliano  * @mtu:        Mtu
147301489e5dSAlfredo Cardigliano  * @mac:        Station mac
147401489e5dSAlfredo Cardigliano  * @features:   Features (enum ionic_eth_hw_features)
147501489e5dSAlfredo Cardigliano  * @color:      Color bit
147601489e5dSAlfredo Cardigliano  */
147701489e5dSAlfredo Cardigliano struct ionic_lif_getattr_comp {
147801489e5dSAlfredo Cardigliano 	u8     status;
147901489e5dSAlfredo Cardigliano 	u8     rsvd;
148001489e5dSAlfredo Cardigliano 	__le16 comp_index;
148101489e5dSAlfredo Cardigliano 	union {
148201489e5dSAlfredo Cardigliano 		u8      state;
148301489e5dSAlfredo Cardigliano 		__le32  mtu;
148401489e5dSAlfredo Cardigliano 		u8      mac[6];
148501489e5dSAlfredo Cardigliano 		__le64  features;
148601489e5dSAlfredo Cardigliano 		u8      rsvd2[11];
148701489e5dSAlfredo Cardigliano 	};
148801489e5dSAlfredo Cardigliano 	u8     color;
148901489e5dSAlfredo Cardigliano };
149001489e5dSAlfredo Cardigliano 
149101489e5dSAlfredo Cardigliano enum ionic_rx_mode {
149201489e5dSAlfredo Cardigliano 	IONIC_RX_MODE_F_UNICAST    = BIT(0),
149301489e5dSAlfredo Cardigliano 	IONIC_RX_MODE_F_MULTICAST  = BIT(1),
149401489e5dSAlfredo Cardigliano 	IONIC_RX_MODE_F_BROADCAST  = BIT(2),
149501489e5dSAlfredo Cardigliano 	IONIC_RX_MODE_F_PROMISC    = BIT(3),
149601489e5dSAlfredo Cardigliano 	IONIC_RX_MODE_F_ALLMULTI   = BIT(4),
149701489e5dSAlfredo Cardigliano };
149801489e5dSAlfredo Cardigliano 
149901489e5dSAlfredo Cardigliano /**
150001489e5dSAlfredo Cardigliano  * struct ionic_rx_mode_set_cmd - Set LIF's Rx mode command
150101489e5dSAlfredo Cardigliano  * @opcode:     opcode
150201489e5dSAlfredo Cardigliano  * @lif_index:  LIF index
150301489e5dSAlfredo Cardigliano  * @rx_mode:    Rx mode flags:
150401489e5dSAlfredo Cardigliano  *                  IONIC_RX_MODE_F_UNICAST: Accept known unicast packets.
150501489e5dSAlfredo Cardigliano  *                  IONIC_RX_MODE_F_MULTICAST: Accept known multicast packets.
150601489e5dSAlfredo Cardigliano  *                  IONIC_RX_MODE_F_BROADCAST: Accept broadcast packets.
150701489e5dSAlfredo Cardigliano  *                  IONIC_RX_MODE_F_PROMISC: Accept any packets.
150801489e5dSAlfredo Cardigliano  *                  IONIC_RX_MODE_F_ALLMULTI: Accept any multicast packets.
150901489e5dSAlfredo Cardigliano  */
151001489e5dSAlfredo Cardigliano struct ionic_rx_mode_set_cmd {
151101489e5dSAlfredo Cardigliano 	u8     opcode;
151201489e5dSAlfredo Cardigliano 	u8     rsvd;
151301489e5dSAlfredo Cardigliano 	__le16 lif_index;
151401489e5dSAlfredo Cardigliano 	__le16 rx_mode;
151501489e5dSAlfredo Cardigliano 	__le16 rsvd2[29];
151601489e5dSAlfredo Cardigliano };
151701489e5dSAlfredo Cardigliano 
151801489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_rx_mode_set_comp;
151901489e5dSAlfredo Cardigliano 
152001489e5dSAlfredo Cardigliano enum ionic_rx_filter_match_type {
152101489e5dSAlfredo Cardigliano 	IONIC_RX_FILTER_MATCH_VLAN = 0,
152201489e5dSAlfredo Cardigliano 	IONIC_RX_FILTER_MATCH_MAC,
152301489e5dSAlfredo Cardigliano 	IONIC_RX_FILTER_MATCH_MAC_VLAN,
152401489e5dSAlfredo Cardigliano };
152501489e5dSAlfredo Cardigliano 
152601489e5dSAlfredo Cardigliano /**
152701489e5dSAlfredo Cardigliano  * struct ionic_rx_filter_add_cmd - Add LIF Rx filter command
152801489e5dSAlfredo Cardigliano  * @opcode:     opcode
152901489e5dSAlfredo Cardigliano  * @qtype:      Queue type
153001489e5dSAlfredo Cardigliano  * @lif_index:  LIF index
153101489e5dSAlfredo Cardigliano  * @qid:        Queue ID
153201489e5dSAlfredo Cardigliano  * @match:      Rx filter match type.  (See IONIC_RX_FILTER_MATCH_xxx)
153301489e5dSAlfredo Cardigliano  * @vlan:       VLAN ID
153401489e5dSAlfredo Cardigliano  * @addr:       MAC address (network-byte order)
153501489e5dSAlfredo Cardigliano  */
153601489e5dSAlfredo Cardigliano struct ionic_rx_filter_add_cmd {
153701489e5dSAlfredo Cardigliano 	u8     opcode;
153801489e5dSAlfredo Cardigliano 	u8     qtype;
153901489e5dSAlfredo Cardigliano 	__le16 lif_index;
154001489e5dSAlfredo Cardigliano 	__le32 qid;
154101489e5dSAlfredo Cardigliano 	__le16 match;
154201489e5dSAlfredo Cardigliano 	union {
154301489e5dSAlfredo Cardigliano 		struct {
154401489e5dSAlfredo Cardigliano 			__le16 vlan;
154501489e5dSAlfredo Cardigliano 		} vlan;
154601489e5dSAlfredo Cardigliano 		struct {
154701489e5dSAlfredo Cardigliano 			u8     addr[6];
154801489e5dSAlfredo Cardigliano 		} mac;
154901489e5dSAlfredo Cardigliano 		struct {
155001489e5dSAlfredo Cardigliano 			__le16 vlan;
155101489e5dSAlfredo Cardigliano 			u8     addr[6];
155201489e5dSAlfredo Cardigliano 		} mac_vlan;
155301489e5dSAlfredo Cardigliano 		u8 rsvd[54];
155401489e5dSAlfredo Cardigliano 	};
155501489e5dSAlfredo Cardigliano };
155601489e5dSAlfredo Cardigliano 
155701489e5dSAlfredo Cardigliano /**
155801489e5dSAlfredo Cardigliano  * struct ionic_rx_filter_add_comp - Add LIF Rx filter command completion
155901489e5dSAlfredo Cardigliano  * @status:     The status of the command (enum status_code)
156001489e5dSAlfredo Cardigliano  * @comp_index: The index in the descriptor ring for which this
156101489e5dSAlfredo Cardigliano  *              is the completion.
156201489e5dSAlfredo Cardigliano  * @filter_id:  Filter ID
156301489e5dSAlfredo Cardigliano  * @color:      Color bit.
156401489e5dSAlfredo Cardigliano  */
156501489e5dSAlfredo Cardigliano struct ionic_rx_filter_add_comp {
156601489e5dSAlfredo Cardigliano 	u8     status;
156701489e5dSAlfredo Cardigliano 	u8     rsvd;
156801489e5dSAlfredo Cardigliano 	__le16 comp_index;
156901489e5dSAlfredo Cardigliano 	__le32 filter_id;
157001489e5dSAlfredo Cardigliano 	u8     rsvd2[7];
157101489e5dSAlfredo Cardigliano 	u8     color;
157201489e5dSAlfredo Cardigliano };
157301489e5dSAlfredo Cardigliano 
157401489e5dSAlfredo Cardigliano /**
157501489e5dSAlfredo Cardigliano  * struct ionic_rx_filter_del_cmd - Delete LIF Rx filter command
157601489e5dSAlfredo Cardigliano  * @opcode:     opcode
157701489e5dSAlfredo Cardigliano  * @lif_index:  LIF index
157801489e5dSAlfredo Cardigliano  * @filter_id:  Filter ID
157901489e5dSAlfredo Cardigliano  */
158001489e5dSAlfredo Cardigliano struct ionic_rx_filter_del_cmd {
158101489e5dSAlfredo Cardigliano 	u8     opcode;
158201489e5dSAlfredo Cardigliano 	u8     rsvd;
158301489e5dSAlfredo Cardigliano 	__le16 lif_index;
158401489e5dSAlfredo Cardigliano 	__le32 filter_id;
158501489e5dSAlfredo Cardigliano 	u8     rsvd2[56];
158601489e5dSAlfredo Cardigliano };
158701489e5dSAlfredo Cardigliano 
158801489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_rx_filter_del_comp;
158901489e5dSAlfredo Cardigliano 
159001489e5dSAlfredo Cardigliano /**
159101489e5dSAlfredo Cardigliano  * struct ionic_qos_identify_cmd - QoS identify command
159201489e5dSAlfredo Cardigliano  * @opcode:    opcode
159301489e5dSAlfredo Cardigliano  * @ver:     Highest version of identify supported by driver
159401489e5dSAlfredo Cardigliano  *
159501489e5dSAlfredo Cardigliano  */
159601489e5dSAlfredo Cardigliano struct ionic_qos_identify_cmd {
159701489e5dSAlfredo Cardigliano 	u8 opcode;
159801489e5dSAlfredo Cardigliano 	u8 ver;
159901489e5dSAlfredo Cardigliano 	u8 rsvd[62];
160001489e5dSAlfredo Cardigliano };
160101489e5dSAlfredo Cardigliano 
160201489e5dSAlfredo Cardigliano /**
160301489e5dSAlfredo Cardigliano  * struct ionic_qos_identify_comp - QoS identify command completion
160401489e5dSAlfredo Cardigliano  * @status: The status of the command (enum status_code)
160501489e5dSAlfredo Cardigliano  * @ver:    Version of identify returned by device
160601489e5dSAlfredo Cardigliano  */
160701489e5dSAlfredo Cardigliano struct ionic_qos_identify_comp {
160801489e5dSAlfredo Cardigliano 	u8 status;
160901489e5dSAlfredo Cardigliano 	u8 ver;
161001489e5dSAlfredo Cardigliano 	u8 rsvd[14];
161101489e5dSAlfredo Cardigliano };
161201489e5dSAlfredo Cardigliano 
161301489e5dSAlfredo Cardigliano #define IONIC_QOS_CLASS_MAX		7
161401489e5dSAlfredo Cardigliano #define IONIC_QOS_CLASS_NAME_SZ		32
161501489e5dSAlfredo Cardigliano #define IONIC_QOS_DSCP_MAX_VALUES	64
161601489e5dSAlfredo Cardigliano 
161701489e5dSAlfredo Cardigliano /**
161801489e5dSAlfredo Cardigliano  * enum ionic_qos_class
161901489e5dSAlfredo Cardigliano  */
162001489e5dSAlfredo Cardigliano enum ionic_qos_class {
162101489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_DEFAULT		= 0,
162201489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_USER_DEFINED_1	= 1,
162301489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_USER_DEFINED_2	= 2,
162401489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_USER_DEFINED_3	= 3,
162501489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_USER_DEFINED_4	= 4,
162601489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_USER_DEFINED_5	= 5,
162701489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_USER_DEFINED_6	= 6,
162801489e5dSAlfredo Cardigliano };
162901489e5dSAlfredo Cardigliano 
163001489e5dSAlfredo Cardigliano /**
163101489e5dSAlfredo Cardigliano  * enum ionic_qos_class_type - Traffic classification criteria
163201489e5dSAlfredo Cardigliano  */
163301489e5dSAlfredo Cardigliano enum ionic_qos_class_type {
163401489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_TYPE_NONE	= 0,
163501489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_TYPE_PCP	= 1,	/* Dot1Q pcp */
163601489e5dSAlfredo Cardigliano 	IONIC_QOS_CLASS_TYPE_DSCP	= 2,	/* IP dscp */
163701489e5dSAlfredo Cardigliano };
163801489e5dSAlfredo Cardigliano 
163901489e5dSAlfredo Cardigliano /**
164001489e5dSAlfredo Cardigliano  * enum ionic_qos_sched_type - Qos class scheduling type
164101489e5dSAlfredo Cardigliano  */
164201489e5dSAlfredo Cardigliano enum ionic_qos_sched_type {
164301489e5dSAlfredo Cardigliano 	/* Strict priority */
164401489e5dSAlfredo Cardigliano 	IONIC_QOS_SCHED_TYPE_STRICT	= 0,
164501489e5dSAlfredo Cardigliano 	/* Deficit weighted round-robin */
164601489e5dSAlfredo Cardigliano 	IONIC_QOS_SCHED_TYPE_DWRR	= 1,
164701489e5dSAlfredo Cardigliano };
164801489e5dSAlfredo Cardigliano 
164901489e5dSAlfredo Cardigliano /**
165001489e5dSAlfredo Cardigliano  * union ionic_qos_config - Qos configuration structure
165101489e5dSAlfredo Cardigliano  * @flags:		Configuration flags
165201489e5dSAlfredo Cardigliano  *	IONIC_QOS_CONFIG_F_ENABLE		enable
165301489e5dSAlfredo Cardigliano  *	IONIC_QOS_CONFIG_F_DROP			drop/nodrop
165401489e5dSAlfredo Cardigliano  *	IONIC_QOS_CONFIG_F_RW_DOT1Q_PCP		enable dot1q pcp rewrite
165501489e5dSAlfredo Cardigliano  *	IONIC_QOS_CONFIG_F_RW_IP_DSCP		enable ip dscp rewrite
165601489e5dSAlfredo Cardigliano  * @sched_type:		Qos class scheduling type (enum ionic_qos_sched_type)
165701489e5dSAlfredo Cardigliano  * @class_type:		Qos class type (enum ionic_qos_class_type)
165801489e5dSAlfredo Cardigliano  * @pause_type:		Qos pause type (enum qos_pause_type)
165901489e5dSAlfredo Cardigliano  * @name:		Qos class name
166001489e5dSAlfredo Cardigliano  * @mtu:		MTU of the class
166101489e5dSAlfredo Cardigliano  * @pfc_dot1q_pcp:	Pcp value for pause frames (valid iff F_NODROP)
166201489e5dSAlfredo Cardigliano  * @dwrr_weight:	Qos class scheduling weight
166301489e5dSAlfredo Cardigliano  * @strict_rlmt:	Rate limit for strict priority scheduling
166401489e5dSAlfredo Cardigliano  * @rw_dot1q_pcp:	Rewrite dot1q pcp to this value
166501489e5dSAlfredo Cardigliano  *			(valid iff F_RW_DOT1Q_PCP)
166601489e5dSAlfredo Cardigliano  * @rw_ip_dscp:		Rewrite ip dscp to this value
166701489e5dSAlfredo Cardigliano  *			(valid iff F_RW_IP_DSCP)
166801489e5dSAlfredo Cardigliano  * @dot1q_pcp:		Dot1q pcp value
166901489e5dSAlfredo Cardigliano  * @ndscp:		Number of valid dscp values in the ip_dscp field
167001489e5dSAlfredo Cardigliano  * @ip_dscp:		IP dscp values
167101489e5dSAlfredo Cardigliano  */
167201489e5dSAlfredo Cardigliano union ionic_qos_config {
167301489e5dSAlfredo Cardigliano 	struct {
167401489e5dSAlfredo Cardigliano #define IONIC_QOS_CONFIG_F_ENABLE		BIT(0)
167501489e5dSAlfredo Cardigliano #define IONIC_QOS_CONFIG_F_DROP			BIT(1)
167601489e5dSAlfredo Cardigliano #define IONIC_QOS_CONFIG_F_RW_DOT1Q_PCP		BIT(2)
167701489e5dSAlfredo Cardigliano #define IONIC_QOS_CONFIG_F_RW_IP_DSCP		BIT(3)
167801489e5dSAlfredo Cardigliano 		u8      flags;
167901489e5dSAlfredo Cardigliano 		u8      sched_type;
168001489e5dSAlfredo Cardigliano 		u8      class_type;
168101489e5dSAlfredo Cardigliano 		u8      pause_type;
168201489e5dSAlfredo Cardigliano 		char    name[IONIC_QOS_CLASS_NAME_SZ];
168301489e5dSAlfredo Cardigliano 		__le32  mtu;
168401489e5dSAlfredo Cardigliano 		/* flow control */
168501489e5dSAlfredo Cardigliano 		u8      pfc_cos;
168601489e5dSAlfredo Cardigliano 		/* scheduler */
168701489e5dSAlfredo Cardigliano 		union {
168801489e5dSAlfredo Cardigliano 			u8      dwrr_weight;
168901489e5dSAlfredo Cardigliano 			__le64  strict_rlmt;
169001489e5dSAlfredo Cardigliano 		};
169101489e5dSAlfredo Cardigliano 		/* marking */
169201489e5dSAlfredo Cardigliano 		union {
169301489e5dSAlfredo Cardigliano 			u8      rw_dot1q_pcp;
169401489e5dSAlfredo Cardigliano 			u8      rw_ip_dscp;
169501489e5dSAlfredo Cardigliano 		};
169601489e5dSAlfredo Cardigliano 		/* classification */
169701489e5dSAlfredo Cardigliano 		union {
169801489e5dSAlfredo Cardigliano 			u8      dot1q_pcp;
169901489e5dSAlfredo Cardigliano 			struct {
170001489e5dSAlfredo Cardigliano 				u8      ndscp;
170101489e5dSAlfredo Cardigliano 				u8      ip_dscp[IONIC_QOS_DSCP_MAX_VALUES];
170201489e5dSAlfredo Cardigliano 			};
170301489e5dSAlfredo Cardigliano 		};
170401489e5dSAlfredo Cardigliano 	};
170501489e5dSAlfredo Cardigliano 	__le32  words[64];
170601489e5dSAlfredo Cardigliano };
170701489e5dSAlfredo Cardigliano 
170801489e5dSAlfredo Cardigliano /**
170901489e5dSAlfredo Cardigliano  * union ionic_qos_identity - QoS identity structure
171001489e5dSAlfredo Cardigliano  * @version:	Version of the identify structure
171101489e5dSAlfredo Cardigliano  * @type:	QoS system type
171201489e5dSAlfredo Cardigliano  * @nclasses:	Number of usable QoS classes
171301489e5dSAlfredo Cardigliano  * @config:	Current configuration of classes
171401489e5dSAlfredo Cardigliano  */
171501489e5dSAlfredo Cardigliano union ionic_qos_identity {
171601489e5dSAlfredo Cardigliano 	struct {
171701489e5dSAlfredo Cardigliano 		u8     version;
171801489e5dSAlfredo Cardigliano 		u8     type;
171901489e5dSAlfredo Cardigliano 		u8     rsvd[62];
172001489e5dSAlfredo Cardigliano 		union  ionic_qos_config config[IONIC_QOS_CLASS_MAX];
172101489e5dSAlfredo Cardigliano 	};
172201489e5dSAlfredo Cardigliano 	__le32 words[512];
172301489e5dSAlfredo Cardigliano };
172401489e5dSAlfredo Cardigliano 
172501489e5dSAlfredo Cardigliano /**
172601489e5dSAlfredo Cardigliano  * struct qos_init_cmd - QoS config init command
172701489e5dSAlfredo Cardigliano  * @opcode:	Opcode
172801489e5dSAlfredo Cardigliano  * @group:	Qos class id
172901489e5dSAlfredo Cardigliano  * @info_pa:	destination address for qos info
173001489e5dSAlfredo Cardigliano  */
173101489e5dSAlfredo Cardigliano struct ionic_qos_init_cmd {
173201489e5dSAlfredo Cardigliano 	u8     opcode;
173301489e5dSAlfredo Cardigliano 	u8     group;
173401489e5dSAlfredo Cardigliano 	u8     rsvd[6];
173501489e5dSAlfredo Cardigliano 	__le64 info_pa;
173601489e5dSAlfredo Cardigliano 	u8     rsvd1[48];
173701489e5dSAlfredo Cardigliano };
173801489e5dSAlfredo Cardigliano 
173901489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_qos_init_comp;
174001489e5dSAlfredo Cardigliano 
174101489e5dSAlfredo Cardigliano /**
174201489e5dSAlfredo Cardigliano  * struct ionic_qos_reset_cmd - Qos config reset command
174301489e5dSAlfredo Cardigliano  * @opcode:	Opcode
174401489e5dSAlfredo Cardigliano  */
174501489e5dSAlfredo Cardigliano struct ionic_qos_reset_cmd {
174601489e5dSAlfredo Cardigliano 	u8    opcode;
174701489e5dSAlfredo Cardigliano 	u8    group;
174801489e5dSAlfredo Cardigliano 	u8    rsvd[62];
174901489e5dSAlfredo Cardigliano };
175001489e5dSAlfredo Cardigliano 
175101489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_qos_reset_comp;
175201489e5dSAlfredo Cardigliano 
175301489e5dSAlfredo Cardigliano /**
175401489e5dSAlfredo Cardigliano  * struct ionic_fw_download_cmd - Firmware download command
175501489e5dSAlfredo Cardigliano  * @opcode:	opcode
175601489e5dSAlfredo Cardigliano  * @addr:	dma address of the firmware buffer
175701489e5dSAlfredo Cardigliano  * @offset:	offset of the firmware buffer within the full image
175801489e5dSAlfredo Cardigliano  * @length:	number of valid bytes in the firmware buffer
175901489e5dSAlfredo Cardigliano  */
176001489e5dSAlfredo Cardigliano struct ionic_fw_download_cmd {
176101489e5dSAlfredo Cardigliano 	u8     opcode;
176201489e5dSAlfredo Cardigliano 	u8     rsvd[3];
176301489e5dSAlfredo Cardigliano 	__le32 offset;
176401489e5dSAlfredo Cardigliano 	__le64 addr;
176501489e5dSAlfredo Cardigliano 	__le32 length;
176601489e5dSAlfredo Cardigliano };
176701489e5dSAlfredo Cardigliano 
176801489e5dSAlfredo Cardigliano typedef struct ionic_admin_comp ionic_fw_download_comp;
176901489e5dSAlfredo Cardigliano 
177001489e5dSAlfredo Cardigliano enum ionic_fw_control_oper {
177101489e5dSAlfredo Cardigliano 	IONIC_FW_RESET		= 0,	/* Reset firmware */
177201489e5dSAlfredo Cardigliano 	IONIC_FW_INSTALL	= 1,	/* Install firmware */
177301489e5dSAlfredo Cardigliano 	IONIC_FW_ACTIVATE	= 2,	/* Activate firmware */
177401489e5dSAlfredo Cardigliano };
177501489e5dSAlfredo Cardigliano 
177601489e5dSAlfredo Cardigliano /**
177701489e5dSAlfredo Cardigliano  * struct ionic_fw_control_cmd - Firmware control command
177801489e5dSAlfredo Cardigliano  * @opcode:    opcode
177901489e5dSAlfredo Cardigliano  * @oper:      firmware control operation (enum ionic_fw_control_oper)
178001489e5dSAlfredo Cardigliano  * @slot:      slot to activate
178101489e5dSAlfredo Cardigliano  */
178201489e5dSAlfredo Cardigliano struct ionic_fw_control_cmd {
178301489e5dSAlfredo Cardigliano 	u8  opcode;
178401489e5dSAlfredo Cardigliano 	u8  rsvd[3];
178501489e5dSAlfredo Cardigliano 	u8  oper;
178601489e5dSAlfredo Cardigliano 	u8  slot;
178701489e5dSAlfredo Cardigliano 	u8  rsvd1[58];
178801489e5dSAlfredo Cardigliano };
178901489e5dSAlfredo Cardigliano 
179001489e5dSAlfredo Cardigliano /**
179101489e5dSAlfredo Cardigliano  * struct ionic_fw_control_comp - Firmware control copletion
179201489e5dSAlfredo Cardigliano  * @opcode:    opcode
179301489e5dSAlfredo Cardigliano  * @slot:      slot where the firmware was installed
179401489e5dSAlfredo Cardigliano  */
179501489e5dSAlfredo Cardigliano struct ionic_fw_control_comp {
179601489e5dSAlfredo Cardigliano 	u8     status;
179701489e5dSAlfredo Cardigliano 	u8     rsvd;
179801489e5dSAlfredo Cardigliano 	__le16 comp_index;
179901489e5dSAlfredo Cardigliano 	u8     slot;
180001489e5dSAlfredo Cardigliano 	u8     rsvd1[10];
180101489e5dSAlfredo Cardigliano 	u8     color;
180201489e5dSAlfredo Cardigliano };
180301489e5dSAlfredo Cardigliano 
180401489e5dSAlfredo Cardigliano /******************************************************************
180501489e5dSAlfredo Cardigliano  ******************* RDMA Commands ********************************
180601489e5dSAlfredo Cardigliano  ******************************************************************/
180701489e5dSAlfredo Cardigliano 
180801489e5dSAlfredo Cardigliano /**
180901489e5dSAlfredo Cardigliano  * struct ionic_rdma_reset_cmd - Reset RDMA LIF cmd
181001489e5dSAlfredo Cardigliano  * @opcode:        opcode
181101489e5dSAlfredo Cardigliano  * @lif_index:     lif index
181201489e5dSAlfredo Cardigliano  *
181301489e5dSAlfredo Cardigliano  * There is no rdma specific dev command completion struct.  Completion uses
181401489e5dSAlfredo Cardigliano  * the common struct ionic_admin_comp.  Only the status is indicated.
181501489e5dSAlfredo Cardigliano  * Nonzero status means the LIF does not support rdma.
181601489e5dSAlfredo Cardigliano  **/
181701489e5dSAlfredo Cardigliano struct ionic_rdma_reset_cmd {
181801489e5dSAlfredo Cardigliano 	u8     opcode;
181901489e5dSAlfredo Cardigliano 	u8     rsvd;
182001489e5dSAlfredo Cardigliano 	__le16 lif_index;
182101489e5dSAlfredo Cardigliano 	u8     rsvd2[60];
182201489e5dSAlfredo Cardigliano };
182301489e5dSAlfredo Cardigliano 
182401489e5dSAlfredo Cardigliano /**
182501489e5dSAlfredo Cardigliano  * struct ionic_rdma_queue_cmd - Create RDMA Queue command
182601489e5dSAlfredo Cardigliano  * @opcode:        opcode, 52, 53
182701489e5dSAlfredo Cardigliano  * @lif_index      lif index
182801489e5dSAlfredo Cardigliano  * @qid_ver:       (qid | (rdma version << 24))
182901489e5dSAlfredo Cardigliano  * @cid:           intr, eq_id, or cq_id
183001489e5dSAlfredo Cardigliano  * @dbid:          doorbell page id
183101489e5dSAlfredo Cardigliano  * @depth_log2:    log base two of queue depth
183201489e5dSAlfredo Cardigliano  * @stride_log2:   log base two of queue stride
183301489e5dSAlfredo Cardigliano  * @dma_addr:      address of the queue memory
183401489e5dSAlfredo Cardigliano  * @xxx_table_index: temporary, but should not need pgtbl for contig. queues.
183501489e5dSAlfredo Cardigliano  *
183601489e5dSAlfredo Cardigliano  * The same command struct is used to create an rdma event queue, completion
183701489e5dSAlfredo Cardigliano  * queue, or rdma admin queue.  The cid is an interrupt number for an event
183801489e5dSAlfredo Cardigliano  * queue, an event queue id for a completion queue, or a completion queue id
183901489e5dSAlfredo Cardigliano  * for an rdma admin queue.
184001489e5dSAlfredo Cardigliano  *
184101489e5dSAlfredo Cardigliano  * The queue created via a dev command must be contiguous in dma space.
184201489e5dSAlfredo Cardigliano  *
184301489e5dSAlfredo Cardigliano  * The dev commands are intended only to be used during driver initialization,
184401489e5dSAlfredo Cardigliano  * to create queues supporting the rdma admin queue.  Other queues, and other
184501489e5dSAlfredo Cardigliano  * types of rdma resources like memory regions, will be created and registered
184601489e5dSAlfredo Cardigliano  * via the rdma admin queue, and will support a more complete interface
184701489e5dSAlfredo Cardigliano  * providing scatter gather lists for larger, scattered queue buffers and
184801489e5dSAlfredo Cardigliano  * memory registration.
184901489e5dSAlfredo Cardigliano  *
185001489e5dSAlfredo Cardigliano  * There is no rdma specific dev command completion struct.  Completion uses
185101489e5dSAlfredo Cardigliano  * the common struct ionic_admin_comp.  Only the status is indicated.
185201489e5dSAlfredo Cardigliano  **/
185301489e5dSAlfredo Cardigliano struct ionic_rdma_queue_cmd {
185401489e5dSAlfredo Cardigliano 	u8     opcode;
185501489e5dSAlfredo Cardigliano 	u8     rsvd;
185601489e5dSAlfredo Cardigliano 	__le16 lif_index;
185701489e5dSAlfredo Cardigliano 	__le32 qid_ver;
185801489e5dSAlfredo Cardigliano 	__le32 cid;
185901489e5dSAlfredo Cardigliano 	__le16 dbid;
186001489e5dSAlfredo Cardigliano 	u8     depth_log2;
186101489e5dSAlfredo Cardigliano 	u8     stride_log2;
186201489e5dSAlfredo Cardigliano 	__le64 dma_addr;
186301489e5dSAlfredo Cardigliano 	u8     rsvd2[36];
186401489e5dSAlfredo Cardigliano 	__le32 xxx_table_index;
186501489e5dSAlfredo Cardigliano };
186601489e5dSAlfredo Cardigliano 
186701489e5dSAlfredo Cardigliano /******************************************************************
186801489e5dSAlfredo Cardigliano  ******************* Notify Events ********************************
186901489e5dSAlfredo Cardigliano  ******************************************************************/
187001489e5dSAlfredo Cardigliano 
187101489e5dSAlfredo Cardigliano /**
187201489e5dSAlfredo Cardigliano  * struct ionic_notifyq_event
187301489e5dSAlfredo Cardigliano  * @eid:   event number
187401489e5dSAlfredo Cardigliano  * @ecode: event code
187501489e5dSAlfredo Cardigliano  * @data:  unspecified data about the event
187601489e5dSAlfredo Cardigliano  *
187701489e5dSAlfredo Cardigliano  * This is the generic event report struct from which the other
187801489e5dSAlfredo Cardigliano  * actual events will be formed.
187901489e5dSAlfredo Cardigliano  */
188001489e5dSAlfredo Cardigliano struct ionic_notifyq_event {
188101489e5dSAlfredo Cardigliano 	__le64 eid;
188201489e5dSAlfredo Cardigliano 	__le16 ecode;
188301489e5dSAlfredo Cardigliano 	u8     data[54];
188401489e5dSAlfredo Cardigliano };
188501489e5dSAlfredo Cardigliano 
188601489e5dSAlfredo Cardigliano /**
188701489e5dSAlfredo Cardigliano  * struct ionic_link_change_event
188801489e5dSAlfredo Cardigliano  * @eid:		event number
188901489e5dSAlfredo Cardigliano  * @ecode:		event code = EVENT_OPCODE_LINK_CHANGE
189001489e5dSAlfredo Cardigliano  * @link_status:	link up or down, with error bits (enum port_status)
189101489e5dSAlfredo Cardigliano  * @link_speed:		speed of the network link
189201489e5dSAlfredo Cardigliano  *
189301489e5dSAlfredo Cardigliano  * Sent when the network link state changes between UP and DOWN
189401489e5dSAlfredo Cardigliano  */
189501489e5dSAlfredo Cardigliano struct ionic_link_change_event {
189601489e5dSAlfredo Cardigliano 	__le64 eid;
189701489e5dSAlfredo Cardigliano 	__le16 ecode;
189801489e5dSAlfredo Cardigliano 	__le16 link_status;
189901489e5dSAlfredo Cardigliano 	__le32 link_speed;	/* units of 1Mbps: e.g. 10000 = 10Gbps */
190001489e5dSAlfredo Cardigliano 	u8     rsvd[48];
190101489e5dSAlfredo Cardigliano };
190201489e5dSAlfredo Cardigliano 
190301489e5dSAlfredo Cardigliano /**
190401489e5dSAlfredo Cardigliano  * struct ionic_reset_event
190501489e5dSAlfredo Cardigliano  * @eid:		event number
190601489e5dSAlfredo Cardigliano  * @ecode:		event code = EVENT_OPCODE_RESET
190701489e5dSAlfredo Cardigliano  * @reset_code:		reset type
190801489e5dSAlfredo Cardigliano  * @state:		0=pending, 1=complete, 2=error
190901489e5dSAlfredo Cardigliano  *
191001489e5dSAlfredo Cardigliano  * Sent when the NIC or some subsystem is going to be or
191101489e5dSAlfredo Cardigliano  * has been reset.
191201489e5dSAlfredo Cardigliano  */
191301489e5dSAlfredo Cardigliano struct ionic_reset_event {
191401489e5dSAlfredo Cardigliano 	__le64 eid;
191501489e5dSAlfredo Cardigliano 	__le16 ecode;
191601489e5dSAlfredo Cardigliano 	u8     reset_code;
191701489e5dSAlfredo Cardigliano 	u8     state;
191801489e5dSAlfredo Cardigliano 	u8     rsvd[52];
191901489e5dSAlfredo Cardigliano };
192001489e5dSAlfredo Cardigliano 
192101489e5dSAlfredo Cardigliano /**
192201489e5dSAlfredo Cardigliano  * struct ionic_heartbeat_event
192301489e5dSAlfredo Cardigliano  * @eid:	event number
192401489e5dSAlfredo Cardigliano  * @ecode:	event code = EVENT_OPCODE_HEARTBEAT
192501489e5dSAlfredo Cardigliano  *
192601489e5dSAlfredo Cardigliano  * Sent periodically by the NIC to indicate continued health
192701489e5dSAlfredo Cardigliano  */
192801489e5dSAlfredo Cardigliano struct ionic_heartbeat_event {
192901489e5dSAlfredo Cardigliano 	__le64 eid;
193001489e5dSAlfredo Cardigliano 	__le16 ecode;
193101489e5dSAlfredo Cardigliano 	u8     rsvd[54];
193201489e5dSAlfredo Cardigliano };
193301489e5dSAlfredo Cardigliano 
193401489e5dSAlfredo Cardigliano /**
193501489e5dSAlfredo Cardigliano  * struct ionic_log_event
193601489e5dSAlfredo Cardigliano  * @eid:	event number
193701489e5dSAlfredo Cardigliano  * @ecode:	event code = EVENT_OPCODE_LOG
193801489e5dSAlfredo Cardigliano  * @data:	log data
193901489e5dSAlfredo Cardigliano  *
194001489e5dSAlfredo Cardigliano  * Sent to notify the driver of an internal error.
194101489e5dSAlfredo Cardigliano  */
194201489e5dSAlfredo Cardigliano struct ionic_log_event {
194301489e5dSAlfredo Cardigliano 	__le64 eid;
194401489e5dSAlfredo Cardigliano 	__le16 ecode;
194501489e5dSAlfredo Cardigliano 	u8     data[54];
194601489e5dSAlfredo Cardigliano };
194701489e5dSAlfredo Cardigliano 
194801489e5dSAlfredo Cardigliano /**
194901489e5dSAlfredo Cardigliano  * struct ionic_port_stats
195001489e5dSAlfredo Cardigliano  */
195101489e5dSAlfredo Cardigliano struct ionic_port_stats {
195201489e5dSAlfredo Cardigliano 	__le64 frames_rx_ok;
195301489e5dSAlfredo Cardigliano 	__le64 frames_rx_all;
195401489e5dSAlfredo Cardigliano 	__le64 frames_rx_bad_fcs;
195501489e5dSAlfredo Cardigliano 	__le64 frames_rx_bad_all;
195601489e5dSAlfredo Cardigliano 	__le64 octets_rx_ok;
195701489e5dSAlfredo Cardigliano 	__le64 octets_rx_all;
195801489e5dSAlfredo Cardigliano 	__le64 frames_rx_unicast;
195901489e5dSAlfredo Cardigliano 	__le64 frames_rx_multicast;
196001489e5dSAlfredo Cardigliano 	__le64 frames_rx_broadcast;
196101489e5dSAlfredo Cardigliano 	__le64 frames_rx_pause;
196201489e5dSAlfredo Cardigliano 	__le64 frames_rx_bad_length;
196301489e5dSAlfredo Cardigliano 	__le64 frames_rx_undersized;
196401489e5dSAlfredo Cardigliano 	__le64 frames_rx_oversized;
196501489e5dSAlfredo Cardigliano 	__le64 frames_rx_fragments;
196601489e5dSAlfredo Cardigliano 	__le64 frames_rx_jabber;
196701489e5dSAlfredo Cardigliano 	__le64 frames_rx_pripause;
196801489e5dSAlfredo Cardigliano 	__le64 frames_rx_stomped_crc;
196901489e5dSAlfredo Cardigliano 	__le64 frames_rx_too_long;
197001489e5dSAlfredo Cardigliano 	__le64 frames_rx_vlan_good;
197101489e5dSAlfredo Cardigliano 	__le64 frames_rx_dropped;
197201489e5dSAlfredo Cardigliano 	__le64 frames_rx_less_than_64b;
197301489e5dSAlfredo Cardigliano 	__le64 frames_rx_64b;
197401489e5dSAlfredo Cardigliano 	__le64 frames_rx_65b_127b;
197501489e5dSAlfredo Cardigliano 	__le64 frames_rx_128b_255b;
197601489e5dSAlfredo Cardigliano 	__le64 frames_rx_256b_511b;
197701489e5dSAlfredo Cardigliano 	__le64 frames_rx_512b_1023b;
197801489e5dSAlfredo Cardigliano 	__le64 frames_rx_1024b_1518b;
197901489e5dSAlfredo Cardigliano 	__le64 frames_rx_1519b_2047b;
198001489e5dSAlfredo Cardigliano 	__le64 frames_rx_2048b_4095b;
198101489e5dSAlfredo Cardigliano 	__le64 frames_rx_4096b_8191b;
198201489e5dSAlfredo Cardigliano 	__le64 frames_rx_8192b_9215b;
198301489e5dSAlfredo Cardigliano 	__le64 frames_rx_other;
198401489e5dSAlfredo Cardigliano 	__le64 frames_tx_ok;
198501489e5dSAlfredo Cardigliano 	__le64 frames_tx_all;
198601489e5dSAlfredo Cardigliano 	__le64 frames_tx_bad;
198701489e5dSAlfredo Cardigliano 	__le64 octets_tx_ok;
198801489e5dSAlfredo Cardigliano 	__le64 octets_tx_total;
198901489e5dSAlfredo Cardigliano 	__le64 frames_tx_unicast;
199001489e5dSAlfredo Cardigliano 	__le64 frames_tx_multicast;
199101489e5dSAlfredo Cardigliano 	__le64 frames_tx_broadcast;
199201489e5dSAlfredo Cardigliano 	__le64 frames_tx_pause;
199301489e5dSAlfredo Cardigliano 	__le64 frames_tx_pripause;
199401489e5dSAlfredo Cardigliano 	__le64 frames_tx_vlan;
199501489e5dSAlfredo Cardigliano 	__le64 frames_tx_less_than_64b;
199601489e5dSAlfredo Cardigliano 	__le64 frames_tx_64b;
199701489e5dSAlfredo Cardigliano 	__le64 frames_tx_65b_127b;
199801489e5dSAlfredo Cardigliano 	__le64 frames_tx_128b_255b;
199901489e5dSAlfredo Cardigliano 	__le64 frames_tx_256b_511b;
200001489e5dSAlfredo Cardigliano 	__le64 frames_tx_512b_1023b;
200101489e5dSAlfredo Cardigliano 	__le64 frames_tx_1024b_1518b;
200201489e5dSAlfredo Cardigliano 	__le64 frames_tx_1519b_2047b;
200301489e5dSAlfredo Cardigliano 	__le64 frames_tx_2048b_4095b;
200401489e5dSAlfredo Cardigliano 	__le64 frames_tx_4096b_8191b;
200501489e5dSAlfredo Cardigliano 	__le64 frames_tx_8192b_9215b;
200601489e5dSAlfredo Cardigliano 	__le64 frames_tx_other;
200701489e5dSAlfredo Cardigliano 	__le64 frames_tx_pri_0;
200801489e5dSAlfredo Cardigliano 	__le64 frames_tx_pri_1;
200901489e5dSAlfredo Cardigliano 	__le64 frames_tx_pri_2;
201001489e5dSAlfredo Cardigliano 	__le64 frames_tx_pri_3;
201101489e5dSAlfredo Cardigliano 	__le64 frames_tx_pri_4;
201201489e5dSAlfredo Cardigliano 	__le64 frames_tx_pri_5;
201301489e5dSAlfredo Cardigliano 	__le64 frames_tx_pri_6;
201401489e5dSAlfredo Cardigliano 	__le64 frames_tx_pri_7;
201501489e5dSAlfredo Cardigliano 	__le64 frames_rx_pri_0;
201601489e5dSAlfredo Cardigliano 	__le64 frames_rx_pri_1;
201701489e5dSAlfredo Cardigliano 	__le64 frames_rx_pri_2;
201801489e5dSAlfredo Cardigliano 	__le64 frames_rx_pri_3;
201901489e5dSAlfredo Cardigliano 	__le64 frames_rx_pri_4;
202001489e5dSAlfredo Cardigliano 	__le64 frames_rx_pri_5;
202101489e5dSAlfredo Cardigliano 	__le64 frames_rx_pri_6;
202201489e5dSAlfredo Cardigliano 	__le64 frames_rx_pri_7;
202301489e5dSAlfredo Cardigliano 	__le64 tx_pripause_0_1us_count;
202401489e5dSAlfredo Cardigliano 	__le64 tx_pripause_1_1us_count;
202501489e5dSAlfredo Cardigliano 	__le64 tx_pripause_2_1us_count;
202601489e5dSAlfredo Cardigliano 	__le64 tx_pripause_3_1us_count;
202701489e5dSAlfredo Cardigliano 	__le64 tx_pripause_4_1us_count;
202801489e5dSAlfredo Cardigliano 	__le64 tx_pripause_5_1us_count;
202901489e5dSAlfredo Cardigliano 	__le64 tx_pripause_6_1us_count;
203001489e5dSAlfredo Cardigliano 	__le64 tx_pripause_7_1us_count;
203101489e5dSAlfredo Cardigliano 	__le64 rx_pripause_0_1us_count;
203201489e5dSAlfredo Cardigliano 	__le64 rx_pripause_1_1us_count;
203301489e5dSAlfredo Cardigliano 	__le64 rx_pripause_2_1us_count;
203401489e5dSAlfredo Cardigliano 	__le64 rx_pripause_3_1us_count;
203501489e5dSAlfredo Cardigliano 	__le64 rx_pripause_4_1us_count;
203601489e5dSAlfredo Cardigliano 	__le64 rx_pripause_5_1us_count;
203701489e5dSAlfredo Cardigliano 	__le64 rx_pripause_6_1us_count;
203801489e5dSAlfredo Cardigliano 	__le64 rx_pripause_7_1us_count;
203901489e5dSAlfredo Cardigliano 	__le64 rx_pause_1us_count;
204001489e5dSAlfredo Cardigliano 	__le64 frames_tx_truncated;
204101489e5dSAlfredo Cardigliano };
204201489e5dSAlfredo Cardigliano 
204301489e5dSAlfredo Cardigliano struct ionic_mgmt_port_stats {
204401489e5dSAlfredo Cardigliano 	__le64 frames_rx_ok;
204501489e5dSAlfredo Cardigliano 	__le64 frames_rx_all;
204601489e5dSAlfredo Cardigliano 	__le64 frames_rx_bad_fcs;
204701489e5dSAlfredo Cardigliano 	__le64 frames_rx_bad_all;
204801489e5dSAlfredo Cardigliano 	__le64 octets_rx_ok;
204901489e5dSAlfredo Cardigliano 	__le64 octets_rx_all;
205001489e5dSAlfredo Cardigliano 	__le64 frames_rx_unicast;
205101489e5dSAlfredo Cardigliano 	__le64 frames_rx_multicast;
205201489e5dSAlfredo Cardigliano 	__le64 frames_rx_broadcast;
205301489e5dSAlfredo Cardigliano 	__le64 frames_rx_pause;
205401489e5dSAlfredo Cardigliano 	__le64 frames_rx_bad_length0;
205501489e5dSAlfredo Cardigliano 	__le64 frames_rx_undersized1;
205601489e5dSAlfredo Cardigliano 	__le64 frames_rx_oversized2;
205701489e5dSAlfredo Cardigliano 	__le64 frames_rx_fragments3;
205801489e5dSAlfredo Cardigliano 	__le64 frames_rx_jabber4;
205901489e5dSAlfredo Cardigliano 	__le64 frames_rx_64b5;
206001489e5dSAlfredo Cardigliano 	__le64 frames_rx_65b_127b6;
206101489e5dSAlfredo Cardigliano 	__le64 frames_rx_128b_255b7;
206201489e5dSAlfredo Cardigliano 	__le64 frames_rx_256b_511b8;
206301489e5dSAlfredo Cardigliano 	__le64 frames_rx_512b_1023b9;
206401489e5dSAlfredo Cardigliano 	__le64 frames_rx_1024b_1518b0;
206501489e5dSAlfredo Cardigliano 	__le64 frames_rx_gt_1518b1;
206601489e5dSAlfredo Cardigliano 	__le64 frames_rx_fifo_full2;
206701489e5dSAlfredo Cardigliano 	__le64 frames_tx_ok3;
206801489e5dSAlfredo Cardigliano 	__le64 frames_tx_all4;
206901489e5dSAlfredo Cardigliano 	__le64 frames_tx_bad5;
207001489e5dSAlfredo Cardigliano 	__le64 octets_tx_ok6;
207101489e5dSAlfredo Cardigliano 	__le64 octets_tx_total7;
207201489e5dSAlfredo Cardigliano 	__le64 frames_tx_unicast8;
207301489e5dSAlfredo Cardigliano 	__le64 frames_tx_multicast9;
207401489e5dSAlfredo Cardigliano 	__le64 frames_tx_broadcast0;
207501489e5dSAlfredo Cardigliano 	__le64 frames_tx_pause1;
207601489e5dSAlfredo Cardigliano };
207701489e5dSAlfredo Cardigliano 
207801489e5dSAlfredo Cardigliano /**
207901489e5dSAlfredo Cardigliano  * struct ionic_port_identity - port identity structure
208001489e5dSAlfredo Cardigliano  * @version:        identity structure version
208101489e5dSAlfredo Cardigliano  * @type:           type of port (enum port_type)
208201489e5dSAlfredo Cardigliano  * @num_lanes:      number of lanes for the port
208301489e5dSAlfredo Cardigliano  * @autoneg:        autoneg supported
208401489e5dSAlfredo Cardigliano  * @min_frame_size: minimum frame size supported
208501489e5dSAlfredo Cardigliano  * @max_frame_size: maximum frame size supported
208601489e5dSAlfredo Cardigliano  * @fec_type:       supported fec types
208701489e5dSAlfredo Cardigliano  * @pause_type:     supported pause types
208801489e5dSAlfredo Cardigliano  * @loopback_mode:  supported loopback mode
208901489e5dSAlfredo Cardigliano  * @speeds:         supported speeds
209001489e5dSAlfredo Cardigliano  * @config:         current port configuration
209101489e5dSAlfredo Cardigliano  */
209201489e5dSAlfredo Cardigliano union ionic_port_identity {
209301489e5dSAlfredo Cardigliano 	struct {
209401489e5dSAlfredo Cardigliano 		u8     version;
209501489e5dSAlfredo Cardigliano 		u8     type;
209601489e5dSAlfredo Cardigliano 		u8     num_lanes;
209701489e5dSAlfredo Cardigliano 		u8     autoneg;
209801489e5dSAlfredo Cardigliano 		__le32 min_frame_size;
209901489e5dSAlfredo Cardigliano 		__le32 max_frame_size;
210001489e5dSAlfredo Cardigliano 		u8     fec_type[4];
210101489e5dSAlfredo Cardigliano 		u8     pause_type[2];
210201489e5dSAlfredo Cardigliano 		u8     loopback_mode[2];
210301489e5dSAlfredo Cardigliano 		__le32 speeds[16];
210401489e5dSAlfredo Cardigliano 		u8     rsvd2[44];
210501489e5dSAlfredo Cardigliano 		union ionic_port_config config;
210601489e5dSAlfredo Cardigliano 	};
210701489e5dSAlfredo Cardigliano 	__le32 words[512];
210801489e5dSAlfredo Cardigliano };
210901489e5dSAlfredo Cardigliano 
211001489e5dSAlfredo Cardigliano /**
211101489e5dSAlfredo Cardigliano  * struct ionic_port_info - port info structure
211201489e5dSAlfredo Cardigliano  * @port_status:     port status
211301489e5dSAlfredo Cardigliano  * @port_stats:      port stats
211401489e5dSAlfredo Cardigliano  */
211501489e5dSAlfredo Cardigliano struct ionic_port_info {
211601489e5dSAlfredo Cardigliano 	union ionic_port_config config;
211701489e5dSAlfredo Cardigliano 	struct ionic_port_status status;
211801489e5dSAlfredo Cardigliano 	struct ionic_port_stats stats;
211901489e5dSAlfredo Cardigliano };
212001489e5dSAlfredo Cardigliano 
212101489e5dSAlfredo Cardigliano /**
212201489e5dSAlfredo Cardigliano  * struct ionic_lif_stats
212301489e5dSAlfredo Cardigliano  */
212401489e5dSAlfredo Cardigliano struct ionic_lif_stats {
212501489e5dSAlfredo Cardigliano 	/* RX */
212601489e5dSAlfredo Cardigliano 	__le64 rx_ucast_bytes;
212701489e5dSAlfredo Cardigliano 	__le64 rx_ucast_packets;
212801489e5dSAlfredo Cardigliano 	__le64 rx_mcast_bytes;
212901489e5dSAlfredo Cardigliano 	__le64 rx_mcast_packets;
213001489e5dSAlfredo Cardigliano 	__le64 rx_bcast_bytes;
213101489e5dSAlfredo Cardigliano 	__le64 rx_bcast_packets;
213201489e5dSAlfredo Cardigliano 	__le64 rsvd0;
213301489e5dSAlfredo Cardigliano 	__le64 rsvd1;
213401489e5dSAlfredo Cardigliano 	/* RX drops */
213501489e5dSAlfredo Cardigliano 	__le64 rx_ucast_drop_bytes;
213601489e5dSAlfredo Cardigliano 	__le64 rx_ucast_drop_packets;
213701489e5dSAlfredo Cardigliano 	__le64 rx_mcast_drop_bytes;
213801489e5dSAlfredo Cardigliano 	__le64 rx_mcast_drop_packets;
213901489e5dSAlfredo Cardigliano 	__le64 rx_bcast_drop_bytes;
214001489e5dSAlfredo Cardigliano 	__le64 rx_bcast_drop_packets;
214101489e5dSAlfredo Cardigliano 	__le64 rx_dma_error;
214201489e5dSAlfredo Cardigliano 	__le64 rsvd2;
214301489e5dSAlfredo Cardigliano 	/* TX */
214401489e5dSAlfredo Cardigliano 	__le64 tx_ucast_bytes;
214501489e5dSAlfredo Cardigliano 	__le64 tx_ucast_packets;
214601489e5dSAlfredo Cardigliano 	__le64 tx_mcast_bytes;
214701489e5dSAlfredo Cardigliano 	__le64 tx_mcast_packets;
214801489e5dSAlfredo Cardigliano 	__le64 tx_bcast_bytes;
214901489e5dSAlfredo Cardigliano 	__le64 tx_bcast_packets;
215001489e5dSAlfredo Cardigliano 	__le64 rsvd3;
215101489e5dSAlfredo Cardigliano 	__le64 rsvd4;
215201489e5dSAlfredo Cardigliano 	/* TX drops */
215301489e5dSAlfredo Cardigliano 	__le64 tx_ucast_drop_bytes;
215401489e5dSAlfredo Cardigliano 	__le64 tx_ucast_drop_packets;
215501489e5dSAlfredo Cardigliano 	__le64 tx_mcast_drop_bytes;
215601489e5dSAlfredo Cardigliano 	__le64 tx_mcast_drop_packets;
215701489e5dSAlfredo Cardigliano 	__le64 tx_bcast_drop_bytes;
215801489e5dSAlfredo Cardigliano 	__le64 tx_bcast_drop_packets;
215901489e5dSAlfredo Cardigliano 	__le64 tx_dma_error;
216001489e5dSAlfredo Cardigliano 	__le64 rsvd5;
216101489e5dSAlfredo Cardigliano 	/* Rx Queue/Ring drops */
216201489e5dSAlfredo Cardigliano 	__le64 rx_queue_disabled;
216301489e5dSAlfredo Cardigliano 	__le64 rx_queue_empty;
216401489e5dSAlfredo Cardigliano 	__le64 rx_queue_error;
216501489e5dSAlfredo Cardigliano 	__le64 rx_desc_fetch_error;
216601489e5dSAlfredo Cardigliano 	__le64 rx_desc_data_error;
216701489e5dSAlfredo Cardigliano 	__le64 rsvd6;
216801489e5dSAlfredo Cardigliano 	__le64 rsvd7;
216901489e5dSAlfredo Cardigliano 	__le64 rsvd8;
217001489e5dSAlfredo Cardigliano 	/* Tx Queue/Ring drops */
217101489e5dSAlfredo Cardigliano 	__le64 tx_queue_disabled;
217201489e5dSAlfredo Cardigliano 	__le64 tx_queue_error;
217301489e5dSAlfredo Cardigliano 	__le64 tx_desc_fetch_error;
217401489e5dSAlfredo Cardigliano 	__le64 tx_desc_data_error;
217501489e5dSAlfredo Cardigliano 	__le64 rsvd9;
217601489e5dSAlfredo Cardigliano 	__le64 rsvd10;
217701489e5dSAlfredo Cardigliano 	__le64 rsvd11;
217801489e5dSAlfredo Cardigliano 	__le64 rsvd12;
217901489e5dSAlfredo Cardigliano 
218001489e5dSAlfredo Cardigliano 	/* RDMA/ROCE TX */
218101489e5dSAlfredo Cardigliano 	__le64 tx_rdma_ucast_bytes;
218201489e5dSAlfredo Cardigliano 	__le64 tx_rdma_ucast_packets;
218301489e5dSAlfredo Cardigliano 	__le64 tx_rdma_mcast_bytes;
218401489e5dSAlfredo Cardigliano 	__le64 tx_rdma_mcast_packets;
218501489e5dSAlfredo Cardigliano 	__le64 tx_rdma_cnp_packets;
218601489e5dSAlfredo Cardigliano 	__le64 rsvd13;
218701489e5dSAlfredo Cardigliano 	__le64 rsvd14;
218801489e5dSAlfredo Cardigliano 	__le64 rsvd15;
218901489e5dSAlfredo Cardigliano 
219001489e5dSAlfredo Cardigliano 	/* RDMA/ROCE RX */
219101489e5dSAlfredo Cardigliano 	__le64 rx_rdma_ucast_bytes;
219201489e5dSAlfredo Cardigliano 	__le64 rx_rdma_ucast_packets;
219301489e5dSAlfredo Cardigliano 	__le64 rx_rdma_mcast_bytes;
219401489e5dSAlfredo Cardigliano 	__le64 rx_rdma_mcast_packets;
219501489e5dSAlfredo Cardigliano 	__le64 rx_rdma_cnp_packets;
219601489e5dSAlfredo Cardigliano 	__le64 rx_rdma_ecn_packets;
219701489e5dSAlfredo Cardigliano 	__le64 rsvd16;
219801489e5dSAlfredo Cardigliano 	__le64 rsvd17;
219901489e5dSAlfredo Cardigliano 
220001489e5dSAlfredo Cardigliano 	__le64 rsvd18;
220101489e5dSAlfredo Cardigliano 	__le64 rsvd19;
220201489e5dSAlfredo Cardigliano 	__le64 rsvd20;
220301489e5dSAlfredo Cardigliano 	__le64 rsvd21;
220401489e5dSAlfredo Cardigliano 	__le64 rsvd22;
220501489e5dSAlfredo Cardigliano 	__le64 rsvd23;
220601489e5dSAlfredo Cardigliano 	__le64 rsvd24;
220701489e5dSAlfredo Cardigliano 	__le64 rsvd25;
220801489e5dSAlfredo Cardigliano 
220901489e5dSAlfredo Cardigliano 	__le64 rsvd26;
221001489e5dSAlfredo Cardigliano 	__le64 rsvd27;
221101489e5dSAlfredo Cardigliano 	__le64 rsvd28;
221201489e5dSAlfredo Cardigliano 	__le64 rsvd29;
221301489e5dSAlfredo Cardigliano 	__le64 rsvd30;
221401489e5dSAlfredo Cardigliano 	__le64 rsvd31;
221501489e5dSAlfredo Cardigliano 	__le64 rsvd32;
221601489e5dSAlfredo Cardigliano 	__le64 rsvd33;
221701489e5dSAlfredo Cardigliano 
221801489e5dSAlfredo Cardigliano 	__le64 rsvd34;
221901489e5dSAlfredo Cardigliano 	__le64 rsvd35;
222001489e5dSAlfredo Cardigliano 	__le64 rsvd36;
222101489e5dSAlfredo Cardigliano 	__le64 rsvd37;
222201489e5dSAlfredo Cardigliano 	__le64 rsvd38;
222301489e5dSAlfredo Cardigliano 	__le64 rsvd39;
222401489e5dSAlfredo Cardigliano 	__le64 rsvd40;
222501489e5dSAlfredo Cardigliano 	__le64 rsvd41;
222601489e5dSAlfredo Cardigliano 
222701489e5dSAlfredo Cardigliano 	__le64 rsvd42;
222801489e5dSAlfredo Cardigliano 	__le64 rsvd43;
222901489e5dSAlfredo Cardigliano 	__le64 rsvd44;
223001489e5dSAlfredo Cardigliano 	__le64 rsvd45;
223101489e5dSAlfredo Cardigliano 	__le64 rsvd46;
223201489e5dSAlfredo Cardigliano 	__le64 rsvd47;
223301489e5dSAlfredo Cardigliano 	__le64 rsvd48;
223401489e5dSAlfredo Cardigliano 	__le64 rsvd49;
223501489e5dSAlfredo Cardigliano 
223601489e5dSAlfredo Cardigliano 	/* RDMA/ROCE REQ Error/Debugs (768 - 895) */
223701489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_pkt_seq_err;
223801489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_rnr_retry_err;
223901489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_remote_access_err;
224001489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_remote_inv_req_err;
224101489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_remote_oper_err;
224201489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_implied_nak_seq_err;
224301489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_cqe_err;
224401489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_cqe_flush_err;
224501489e5dSAlfredo Cardigliano 
224601489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_dup_responses;
224701489e5dSAlfredo Cardigliano 	__le64 rdma_req_rx_invalid_packets;
224801489e5dSAlfredo Cardigliano 	__le64 rdma_req_tx_local_access_err;
224901489e5dSAlfredo Cardigliano 	__le64 rdma_req_tx_local_oper_err;
225001489e5dSAlfredo Cardigliano 	__le64 rdma_req_tx_memory_mgmt_err;
225101489e5dSAlfredo Cardigliano 	__le64 rsvd52;
225201489e5dSAlfredo Cardigliano 	__le64 rsvd53;
225301489e5dSAlfredo Cardigliano 	__le64 rsvd54;
225401489e5dSAlfredo Cardigliano 
225501489e5dSAlfredo Cardigliano 	/* RDMA/ROCE RESP Error/Debugs (896 - 1023) */
225601489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_dup_requests;
225701489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_out_of_buffer;
225801489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_out_of_seq_pkts;
225901489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_cqe_err;
226001489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_cqe_flush_err;
226101489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_local_len_err;
226201489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_inv_request_err;
226301489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_local_qp_oper_err;
226401489e5dSAlfredo Cardigliano 
226501489e5dSAlfredo Cardigliano 	__le64 rdma_resp_rx_out_of_atomic_resource;
226601489e5dSAlfredo Cardigliano 	__le64 rdma_resp_tx_pkt_seq_err;
226701489e5dSAlfredo Cardigliano 	__le64 rdma_resp_tx_remote_inv_req_err;
226801489e5dSAlfredo Cardigliano 	__le64 rdma_resp_tx_remote_access_err;
226901489e5dSAlfredo Cardigliano 	__le64 rdma_resp_tx_remote_oper_err;
227001489e5dSAlfredo Cardigliano 	__le64 rdma_resp_tx_rnr_retry_err;
227101489e5dSAlfredo Cardigliano 	__le64 rsvd57;
227201489e5dSAlfredo Cardigliano 	__le64 rsvd58;
227301489e5dSAlfredo Cardigliano };
227401489e5dSAlfredo Cardigliano 
227501489e5dSAlfredo Cardigliano /**
227601489e5dSAlfredo Cardigliano  * struct ionic_lif_info - lif info structure
227701489e5dSAlfredo Cardigliano  */
227801489e5dSAlfredo Cardigliano struct ionic_lif_info {
227901489e5dSAlfredo Cardigliano 	union ionic_lif_config config;
228001489e5dSAlfredo Cardigliano 	struct ionic_lif_status status;
228101489e5dSAlfredo Cardigliano 	struct ionic_lif_stats stats;
228201489e5dSAlfredo Cardigliano };
228301489e5dSAlfredo Cardigliano 
228401489e5dSAlfredo Cardigliano union ionic_dev_cmd {
228501489e5dSAlfredo Cardigliano 	u32 words[16];
228601489e5dSAlfredo Cardigliano 	struct ionic_admin_cmd cmd;
228701489e5dSAlfredo Cardigliano 	struct ionic_nop_cmd nop;
228801489e5dSAlfredo Cardigliano 
228901489e5dSAlfredo Cardigliano 	struct ionic_dev_identify_cmd identify;
229001489e5dSAlfredo Cardigliano 	struct ionic_dev_init_cmd init;
229101489e5dSAlfredo Cardigliano 	struct ionic_dev_reset_cmd reset;
229201489e5dSAlfredo Cardigliano 	struct ionic_dev_getattr_cmd getattr;
229301489e5dSAlfredo Cardigliano 	struct ionic_dev_setattr_cmd setattr;
229401489e5dSAlfredo Cardigliano 
229501489e5dSAlfredo Cardigliano 	struct ionic_port_identify_cmd port_identify;
229601489e5dSAlfredo Cardigliano 	struct ionic_port_init_cmd port_init;
229701489e5dSAlfredo Cardigliano 	struct ionic_port_reset_cmd port_reset;
229801489e5dSAlfredo Cardigliano 	struct ionic_port_getattr_cmd port_getattr;
229901489e5dSAlfredo Cardigliano 	struct ionic_port_setattr_cmd port_setattr;
230001489e5dSAlfredo Cardigliano 
230101489e5dSAlfredo Cardigliano 	struct ionic_lif_identify_cmd lif_identify;
230201489e5dSAlfredo Cardigliano 	struct ionic_lif_init_cmd lif_init;
230301489e5dSAlfredo Cardigliano 	struct ionic_lif_reset_cmd lif_reset;
230401489e5dSAlfredo Cardigliano 
230501489e5dSAlfredo Cardigliano 	struct ionic_qos_identify_cmd qos_identify;
230601489e5dSAlfredo Cardigliano 	struct ionic_qos_init_cmd qos_init;
230701489e5dSAlfredo Cardigliano 	struct ionic_qos_reset_cmd qos_reset;
230801489e5dSAlfredo Cardigliano 
230901489e5dSAlfredo Cardigliano 	struct ionic_q_init_cmd q_init;
231001489e5dSAlfredo Cardigliano };
231101489e5dSAlfredo Cardigliano 
231201489e5dSAlfredo Cardigliano union ionic_dev_cmd_comp {
231301489e5dSAlfredo Cardigliano 	u32 words[4];
231401489e5dSAlfredo Cardigliano 	u8 status;
231501489e5dSAlfredo Cardigliano 	struct ionic_admin_comp comp;
231601489e5dSAlfredo Cardigliano 	struct ionic_nop_comp nop;
231701489e5dSAlfredo Cardigliano 
231801489e5dSAlfredo Cardigliano 	struct ionic_dev_identify_comp identify;
231901489e5dSAlfredo Cardigliano 	struct ionic_dev_init_comp init;
232001489e5dSAlfredo Cardigliano 	struct ionic_dev_reset_comp reset;
232101489e5dSAlfredo Cardigliano 	struct ionic_dev_getattr_comp getattr;
232201489e5dSAlfredo Cardigliano 	struct ionic_dev_setattr_comp setattr;
232301489e5dSAlfredo Cardigliano 
232401489e5dSAlfredo Cardigliano 	struct ionic_port_identify_comp port_identify;
232501489e5dSAlfredo Cardigliano 	struct ionic_port_init_comp port_init;
232601489e5dSAlfredo Cardigliano 	struct ionic_port_reset_comp port_reset;
232701489e5dSAlfredo Cardigliano 	struct ionic_port_getattr_comp port_getattr;
232801489e5dSAlfredo Cardigliano 	struct ionic_port_setattr_comp port_setattr;
232901489e5dSAlfredo Cardigliano 
233001489e5dSAlfredo Cardigliano 	struct ionic_lif_identify_comp lif_identify;
233101489e5dSAlfredo Cardigliano 	struct ionic_lif_init_comp lif_init;
233201489e5dSAlfredo Cardigliano 	ionic_lif_reset_comp lif_reset;
233301489e5dSAlfredo Cardigliano 
233401489e5dSAlfredo Cardigliano 	struct ionic_qos_identify_comp qos_identify;
233501489e5dSAlfredo Cardigliano 	ionic_qos_init_comp qos_init;
233601489e5dSAlfredo Cardigliano 	ionic_qos_reset_comp qos_reset;
233701489e5dSAlfredo Cardigliano 
233801489e5dSAlfredo Cardigliano 	struct ionic_q_init_comp q_init;
233901489e5dSAlfredo Cardigliano };
234001489e5dSAlfredo Cardigliano 
234101489e5dSAlfredo Cardigliano /**
234201489e5dSAlfredo Cardigliano  * union dev_info - Device info register format (read-only)
234301489e5dSAlfredo Cardigliano  * @signature:       Signature value of 0x44455649 ('DEVI').
234401489e5dSAlfredo Cardigliano  * @version:         Current version of info.
234501489e5dSAlfredo Cardigliano  * @asic_type:       Asic type.
234601489e5dSAlfredo Cardigliano  * @asic_rev:        Asic revision.
234701489e5dSAlfredo Cardigliano  * @fw_status:       Firmware status.
234801489e5dSAlfredo Cardigliano  * @fw_heartbeat:    Firmware heartbeat counter.
234901489e5dSAlfredo Cardigliano  * @serial_num:      Serial number.
235001489e5dSAlfredo Cardigliano  * @fw_version:      Firmware version.
235101489e5dSAlfredo Cardigliano  */
235201489e5dSAlfredo Cardigliano union ionic_dev_info_regs {
235301489e5dSAlfredo Cardigliano #define IONIC_DEVINFO_FWVERS_BUFLEN 32
235401489e5dSAlfredo Cardigliano #define IONIC_DEVINFO_SERIAL_BUFLEN 32
235501489e5dSAlfredo Cardigliano 	struct {
235601489e5dSAlfredo Cardigliano 		u32    signature;
235701489e5dSAlfredo Cardigliano 		u8     version;
235801489e5dSAlfredo Cardigliano 		u8     asic_type;
235901489e5dSAlfredo Cardigliano 		u8     asic_rev;
236001489e5dSAlfredo Cardigliano 		u8     fw_status;
236101489e5dSAlfredo Cardigliano 		u32    fw_heartbeat;
236201489e5dSAlfredo Cardigliano 		char   fw_version[IONIC_DEVINFO_FWVERS_BUFLEN];
236301489e5dSAlfredo Cardigliano 		char   serial_num[IONIC_DEVINFO_SERIAL_BUFLEN];
236401489e5dSAlfredo Cardigliano 	};
236501489e5dSAlfredo Cardigliano 	u32 words[512];
236601489e5dSAlfredo Cardigliano };
236701489e5dSAlfredo Cardigliano 
236801489e5dSAlfredo Cardigliano /**
236901489e5dSAlfredo Cardigliano  * union ionic_dev_cmd_regs - Device command register format (read-write)
237001489e5dSAlfredo Cardigliano  * @doorbell:        Device Cmd Doorbell, write-only.
237101489e5dSAlfredo Cardigliano  *                   Write a 1 to signal device to process cmd,
237201489e5dSAlfredo Cardigliano  *                   poll done for completion.
237301489e5dSAlfredo Cardigliano  * @done:            Done indicator, bit 0 == 1 when command is complete.
237401489e5dSAlfredo Cardigliano  * @cmd:             Opcode-specific command bytes
237501489e5dSAlfredo Cardigliano  * @comp:            Opcode-specific response bytes
237601489e5dSAlfredo Cardigliano  * @data:            Opcode-specific side-data
237701489e5dSAlfredo Cardigliano  */
237801489e5dSAlfredo Cardigliano union ionic_dev_cmd_regs {
237901489e5dSAlfredo Cardigliano 	struct {
238001489e5dSAlfredo Cardigliano 		u32                   doorbell;
238101489e5dSAlfredo Cardigliano 		u32                   done;
238201489e5dSAlfredo Cardigliano 		union ionic_dev_cmd         cmd;
238301489e5dSAlfredo Cardigliano 		union ionic_dev_cmd_comp    comp;
238401489e5dSAlfredo Cardigliano 		u8                    rsvd[48];
238501489e5dSAlfredo Cardigliano 		u32                   data[478];
238601489e5dSAlfredo Cardigliano 	};
238701489e5dSAlfredo Cardigliano 	u32 words[512];
238801489e5dSAlfredo Cardigliano };
238901489e5dSAlfredo Cardigliano 
239001489e5dSAlfredo Cardigliano /**
239101489e5dSAlfredo Cardigliano  * union ionic_dev_regs - Device register format in for bar 0 page 0
239201489e5dSAlfredo Cardigliano  * @info:            Device info registers
239301489e5dSAlfredo Cardigliano  * @devcmd:          Device command registers
239401489e5dSAlfredo Cardigliano  */
239501489e5dSAlfredo Cardigliano union ionic_dev_regs {
239601489e5dSAlfredo Cardigliano 	struct {
239701489e5dSAlfredo Cardigliano 		union ionic_dev_info_regs info;
239801489e5dSAlfredo Cardigliano 		union ionic_dev_cmd_regs  devcmd;
239901489e5dSAlfredo Cardigliano 	};
240001489e5dSAlfredo Cardigliano 	__le32 words[1024];
240101489e5dSAlfredo Cardigliano };
240201489e5dSAlfredo Cardigliano 
240301489e5dSAlfredo Cardigliano union ionic_adminq_cmd {
240401489e5dSAlfredo Cardigliano 	struct ionic_admin_cmd cmd;
240501489e5dSAlfredo Cardigliano 	struct ionic_nop_cmd nop;
240601489e5dSAlfredo Cardigliano 	struct ionic_q_init_cmd q_init;
240701489e5dSAlfredo Cardigliano 	struct ionic_q_control_cmd q_control;
240801489e5dSAlfredo Cardigliano 	struct ionic_lif_setattr_cmd lif_setattr;
240901489e5dSAlfredo Cardigliano 	struct ionic_lif_getattr_cmd lif_getattr;
241001489e5dSAlfredo Cardigliano 	struct ionic_rx_mode_set_cmd rx_mode_set;
241101489e5dSAlfredo Cardigliano 	struct ionic_rx_filter_add_cmd rx_filter_add;
241201489e5dSAlfredo Cardigliano 	struct ionic_rx_filter_del_cmd rx_filter_del;
241301489e5dSAlfredo Cardigliano 	struct ionic_rdma_reset_cmd rdma_reset;
241401489e5dSAlfredo Cardigliano 	struct ionic_rdma_queue_cmd rdma_queue;
241501489e5dSAlfredo Cardigliano 	struct ionic_fw_download_cmd fw_download;
241601489e5dSAlfredo Cardigliano 	struct ionic_fw_control_cmd fw_control;
241701489e5dSAlfredo Cardigliano };
241801489e5dSAlfredo Cardigliano 
241901489e5dSAlfredo Cardigliano union ionic_adminq_comp {
242001489e5dSAlfredo Cardigliano 	struct ionic_admin_comp comp;
242101489e5dSAlfredo Cardigliano 	struct ionic_nop_comp nop;
242201489e5dSAlfredo Cardigliano 	struct ionic_q_init_comp q_init;
242301489e5dSAlfredo Cardigliano 	struct ionic_lif_setattr_comp lif_setattr;
242401489e5dSAlfredo Cardigliano 	struct ionic_lif_getattr_comp lif_getattr;
242501489e5dSAlfredo Cardigliano 	struct ionic_rx_filter_add_comp rx_filter_add;
242601489e5dSAlfredo Cardigliano 	struct ionic_fw_control_comp fw_control;
242701489e5dSAlfredo Cardigliano };
242801489e5dSAlfredo Cardigliano 
242901489e5dSAlfredo Cardigliano #define IONIC_BARS_MAX			6
243001489e5dSAlfredo Cardigliano #define IONIC_PCI_BAR_DBELL		1
243101489e5dSAlfredo Cardigliano 
243201489e5dSAlfredo Cardigliano /* BAR0 */
243301489e5dSAlfredo Cardigliano #define IONIC_BAR0_SIZE				0x8000
243401489e5dSAlfredo Cardigliano 
243501489e5dSAlfredo Cardigliano #define IONIC_BAR0_DEV_INFO_REGS_OFFSET		0x0000
243601489e5dSAlfredo Cardigliano #define IONIC_BAR0_DEV_CMD_REGS_OFFSET		0x0800
243701489e5dSAlfredo Cardigliano #define IONIC_BAR0_DEV_CMD_DATA_REGS_OFFSET	0x0c00
243801489e5dSAlfredo Cardigliano #define IONIC_BAR0_INTR_STATUS_OFFSET		0x1000
243901489e5dSAlfredo Cardigliano #define IONIC_BAR0_INTR_CTRL_OFFSET		0x2000
244001489e5dSAlfredo Cardigliano #define IONIC_DEV_CMD_DONE			0x00000001
244101489e5dSAlfredo Cardigliano 
244201489e5dSAlfredo Cardigliano #define IONIC_ASIC_TYPE_CAPRI			0
244301489e5dSAlfredo Cardigliano 
244401489e5dSAlfredo Cardigliano /**
244501489e5dSAlfredo Cardigliano  * struct ionic_doorbell - Doorbell register layout
244601489e5dSAlfredo Cardigliano  * @p_index: Producer index
244701489e5dSAlfredo Cardigliano  * @ring:    Selects the specific ring of the queue to update.
244801489e5dSAlfredo Cardigliano  *           Type-specific meaning:
244901489e5dSAlfredo Cardigliano  *              ring=0: Default producer/consumer queue.
245001489e5dSAlfredo Cardigliano  *              ring=1: (CQ, EQ) Re-Arm queue.  RDMA CQs
245101489e5dSAlfredo Cardigliano  *              send events to EQs when armed.  EQs send
245201489e5dSAlfredo Cardigliano  *              interrupts when armed.
245301489e5dSAlfredo Cardigliano  * @qid:     The queue id selects the queue destination for the
245401489e5dSAlfredo Cardigliano  *           producer index and flags.
245501489e5dSAlfredo Cardigliano  */
245601489e5dSAlfredo Cardigliano struct ionic_doorbell {
245701489e5dSAlfredo Cardigliano 	__le16 p_index;
245801489e5dSAlfredo Cardigliano 	u8     ring;
245901489e5dSAlfredo Cardigliano 	u8     qid_lo;
246001489e5dSAlfredo Cardigliano 	__le16 qid_hi;
246101489e5dSAlfredo Cardigliano 	u16    rsvd2;
246201489e5dSAlfredo Cardigliano };
246301489e5dSAlfredo Cardigliano 
246401489e5dSAlfredo Cardigliano struct ionic_intr_status {
246501489e5dSAlfredo Cardigliano 	u32 status[2];
246601489e5dSAlfredo Cardigliano };
246701489e5dSAlfredo Cardigliano 
246801489e5dSAlfredo Cardigliano struct ionic_notifyq_cmd {
246901489e5dSAlfredo Cardigliano 	__le32 data;	/* Not used but needed for qcq structure */
247001489e5dSAlfredo Cardigliano };
247101489e5dSAlfredo Cardigliano 
247201489e5dSAlfredo Cardigliano union ionic_notifyq_comp {
247301489e5dSAlfredo Cardigliano 	struct ionic_notifyq_event event;
247401489e5dSAlfredo Cardigliano 	struct ionic_link_change_event link_change;
247501489e5dSAlfredo Cardigliano 	struct ionic_reset_event reset;
247601489e5dSAlfredo Cardigliano 	struct ionic_heartbeat_event heartbeat;
247701489e5dSAlfredo Cardigliano 	struct ionic_log_event log;
247801489e5dSAlfredo Cardigliano };
247901489e5dSAlfredo Cardigliano 
248001489e5dSAlfredo Cardigliano /* Deprecate */
248101489e5dSAlfredo Cardigliano struct ionic_identity {
248201489e5dSAlfredo Cardigliano 	union ionic_drv_identity drv;
248301489e5dSAlfredo Cardigliano 	union ionic_dev_identity dev;
248401489e5dSAlfredo Cardigliano 	union ionic_lif_identity lif;
248501489e5dSAlfredo Cardigliano 	union ionic_port_identity port;
248601489e5dSAlfredo Cardigliano 	union ionic_qos_identity qos;
248701489e5dSAlfredo Cardigliano };
248801489e5dSAlfredo Cardigliano 
248901489e5dSAlfredo Cardigliano #pragma pack(pop)
249001489e5dSAlfredo Cardigliano 
249101489e5dSAlfredo Cardigliano #endif /* _IONIC_IF_H_ */
2492