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