162306a36Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB) OR BSD-2-Clause */
262306a36Sopenharmony_ci/* Copyright (c) 2017-2020 Pensando Systems, Inc.  All rights reserved. */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifndef _IONIC_IF_H_
562306a36Sopenharmony_ci#define _IONIC_IF_H_
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#define IONIC_DEV_INFO_SIGNATURE		0x44455649      /* 'DEVI' */
862306a36Sopenharmony_ci#define IONIC_DEV_INFO_VERSION			1
962306a36Sopenharmony_ci#define IONIC_IFNAMSIZ				16
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci/*
1262306a36Sopenharmony_ci * enum ionic_cmd_opcode - Device commands
1362306a36Sopenharmony_ci */
1462306a36Sopenharmony_cienum ionic_cmd_opcode {
1562306a36Sopenharmony_ci	IONIC_CMD_NOP				= 0,
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci	/* Device commands */
1862306a36Sopenharmony_ci	IONIC_CMD_IDENTIFY			= 1,
1962306a36Sopenharmony_ci	IONIC_CMD_INIT				= 2,
2062306a36Sopenharmony_ci	IONIC_CMD_RESET				= 3,
2162306a36Sopenharmony_ci	IONIC_CMD_GETATTR			= 4,
2262306a36Sopenharmony_ci	IONIC_CMD_SETATTR			= 5,
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci	/* Port commands */
2562306a36Sopenharmony_ci	IONIC_CMD_PORT_IDENTIFY			= 10,
2662306a36Sopenharmony_ci	IONIC_CMD_PORT_INIT			= 11,
2762306a36Sopenharmony_ci	IONIC_CMD_PORT_RESET			= 12,
2862306a36Sopenharmony_ci	IONIC_CMD_PORT_GETATTR			= 13,
2962306a36Sopenharmony_ci	IONIC_CMD_PORT_SETATTR			= 14,
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	/* LIF commands */
3262306a36Sopenharmony_ci	IONIC_CMD_LIF_IDENTIFY			= 20,
3362306a36Sopenharmony_ci	IONIC_CMD_LIF_INIT			= 21,
3462306a36Sopenharmony_ci	IONIC_CMD_LIF_RESET			= 22,
3562306a36Sopenharmony_ci	IONIC_CMD_LIF_GETATTR			= 23,
3662306a36Sopenharmony_ci	IONIC_CMD_LIF_SETATTR			= 24,
3762306a36Sopenharmony_ci	IONIC_CMD_LIF_SETPHC			= 25,
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	IONIC_CMD_RX_MODE_SET			= 30,
4062306a36Sopenharmony_ci	IONIC_CMD_RX_FILTER_ADD			= 31,
4162306a36Sopenharmony_ci	IONIC_CMD_RX_FILTER_DEL			= 32,
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci	/* Queue commands */
4462306a36Sopenharmony_ci	IONIC_CMD_Q_IDENTIFY			= 39,
4562306a36Sopenharmony_ci	IONIC_CMD_Q_INIT			= 40,
4662306a36Sopenharmony_ci	IONIC_CMD_Q_CONTROL			= 41,
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	/* RDMA commands */
4962306a36Sopenharmony_ci	IONIC_CMD_RDMA_RESET_LIF		= 50,
5062306a36Sopenharmony_ci	IONIC_CMD_RDMA_CREATE_EQ		= 51,
5162306a36Sopenharmony_ci	IONIC_CMD_RDMA_CREATE_CQ		= 52,
5262306a36Sopenharmony_ci	IONIC_CMD_RDMA_CREATE_ADMINQ		= 53,
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	/* SR/IOV commands */
5562306a36Sopenharmony_ci	IONIC_CMD_VF_GETATTR			= 60,
5662306a36Sopenharmony_ci	IONIC_CMD_VF_SETATTR			= 61,
5762306a36Sopenharmony_ci	IONIC_CMD_VF_CTRL			= 62,
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	/* QoS commands */
6062306a36Sopenharmony_ci	IONIC_CMD_QOS_CLASS_IDENTIFY		= 240,
6162306a36Sopenharmony_ci	IONIC_CMD_QOS_CLASS_INIT		= 241,
6262306a36Sopenharmony_ci	IONIC_CMD_QOS_CLASS_RESET		= 242,
6362306a36Sopenharmony_ci	IONIC_CMD_QOS_CLASS_UPDATE		= 243,
6462306a36Sopenharmony_ci	IONIC_CMD_QOS_CLEAR_STATS		= 244,
6562306a36Sopenharmony_ci	IONIC_CMD_QOS_RESET			= 245,
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci	/* Firmware commands */
6862306a36Sopenharmony_ci	IONIC_CMD_FW_DOWNLOAD                   = 252,
6962306a36Sopenharmony_ci	IONIC_CMD_FW_CONTROL                    = 253,
7062306a36Sopenharmony_ci	IONIC_CMD_FW_DOWNLOAD_V1		= 254,
7162306a36Sopenharmony_ci	IONIC_CMD_FW_CONTROL_V1		        = 255,
7262306a36Sopenharmony_ci};
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci/**
7562306a36Sopenharmony_ci * enum ionic_status_code - Device command return codes
7662306a36Sopenharmony_ci */
7762306a36Sopenharmony_cienum ionic_status_code {
7862306a36Sopenharmony_ci	IONIC_RC_SUCCESS	= 0,	/* Success */
7962306a36Sopenharmony_ci	IONIC_RC_EVERSION	= 1,	/* Incorrect version for request */
8062306a36Sopenharmony_ci	IONIC_RC_EOPCODE	= 2,	/* Invalid cmd opcode */
8162306a36Sopenharmony_ci	IONIC_RC_EIO		= 3,	/* I/O error */
8262306a36Sopenharmony_ci	IONIC_RC_EPERM		= 4,	/* Permission denied */
8362306a36Sopenharmony_ci	IONIC_RC_EQID		= 5,	/* Bad qid */
8462306a36Sopenharmony_ci	IONIC_RC_EQTYPE		= 6,	/* Bad qtype */
8562306a36Sopenharmony_ci	IONIC_RC_ENOENT		= 7,	/* No such element */
8662306a36Sopenharmony_ci	IONIC_RC_EINTR		= 8,	/* operation interrupted */
8762306a36Sopenharmony_ci	IONIC_RC_EAGAIN		= 9,	/* Try again */
8862306a36Sopenharmony_ci	IONIC_RC_ENOMEM		= 10,	/* Out of memory */
8962306a36Sopenharmony_ci	IONIC_RC_EFAULT		= 11,	/* Bad address */
9062306a36Sopenharmony_ci	IONIC_RC_EBUSY		= 12,	/* Device or resource busy */
9162306a36Sopenharmony_ci	IONIC_RC_EEXIST		= 13,	/* object already exists */
9262306a36Sopenharmony_ci	IONIC_RC_EINVAL		= 14,	/* Invalid argument */
9362306a36Sopenharmony_ci	IONIC_RC_ENOSPC		= 15,	/* No space left or alloc failure */
9462306a36Sopenharmony_ci	IONIC_RC_ERANGE		= 16,	/* Parameter out of range */
9562306a36Sopenharmony_ci	IONIC_RC_BAD_ADDR	= 17,	/* Descriptor contains a bad ptr */
9662306a36Sopenharmony_ci	IONIC_RC_DEV_CMD	= 18,	/* Device cmd attempted on AdminQ */
9762306a36Sopenharmony_ci	IONIC_RC_ENOSUPP	= 19,	/* Operation not supported */
9862306a36Sopenharmony_ci	IONIC_RC_ERROR		= 29,	/* Generic error */
9962306a36Sopenharmony_ci	IONIC_RC_ERDMA		= 30,	/* Generic RDMA error */
10062306a36Sopenharmony_ci	IONIC_RC_EVFID		= 31,	/* VF ID does not exist */
10162306a36Sopenharmony_ci	IONIC_RC_EBAD_FW	= 32,	/* FW file is invalid or corrupted */
10262306a36Sopenharmony_ci};
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_cienum ionic_notifyq_opcode {
10562306a36Sopenharmony_ci	IONIC_EVENT_LINK_CHANGE		= 1,
10662306a36Sopenharmony_ci	IONIC_EVENT_RESET		= 2,
10762306a36Sopenharmony_ci	IONIC_EVENT_HEARTBEAT		= 3,
10862306a36Sopenharmony_ci	IONIC_EVENT_LOG			= 4,
10962306a36Sopenharmony_ci	IONIC_EVENT_XCVR		= 5,
11062306a36Sopenharmony_ci};
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci/**
11362306a36Sopenharmony_ci * struct ionic_admin_cmd - General admin command format
11462306a36Sopenharmony_ci * @opcode:     Opcode for the command
11562306a36Sopenharmony_ci * @lif_index:  LIF index
11662306a36Sopenharmony_ci * @cmd_data:   Opcode-specific command bytes
11762306a36Sopenharmony_ci */
11862306a36Sopenharmony_cistruct ionic_admin_cmd {
11962306a36Sopenharmony_ci	u8     opcode;
12062306a36Sopenharmony_ci	u8     rsvd;
12162306a36Sopenharmony_ci	__le16 lif_index;
12262306a36Sopenharmony_ci	u8     cmd_data[60];
12362306a36Sopenharmony_ci};
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci/**
12662306a36Sopenharmony_ci * struct ionic_admin_comp - General admin command completion format
12762306a36Sopenharmony_ci * @status:     Status of the command (enum ionic_status_code)
12862306a36Sopenharmony_ci * @comp_index: Index in the descriptor ring for which this is the completion
12962306a36Sopenharmony_ci * @cmd_data:   Command-specific bytes
13062306a36Sopenharmony_ci * @color:      Color bit (Always 0 for commands issued to the
13162306a36Sopenharmony_ci *              Device Cmd Registers)
13262306a36Sopenharmony_ci */
13362306a36Sopenharmony_cistruct ionic_admin_comp {
13462306a36Sopenharmony_ci	u8     status;
13562306a36Sopenharmony_ci	u8     rsvd;
13662306a36Sopenharmony_ci	__le16 comp_index;
13762306a36Sopenharmony_ci	u8     cmd_data[11];
13862306a36Sopenharmony_ci	u8     color;
13962306a36Sopenharmony_ci#define IONIC_COMP_COLOR_MASK  0x80
14062306a36Sopenharmony_ci};
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_cistatic inline u8 color_match(u8 color, u8 done_color)
14362306a36Sopenharmony_ci{
14462306a36Sopenharmony_ci	return (!!(color & IONIC_COMP_COLOR_MASK)) == done_color;
14562306a36Sopenharmony_ci}
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci/**
14862306a36Sopenharmony_ci * struct ionic_nop_cmd - NOP command
14962306a36Sopenharmony_ci * @opcode: opcode
15062306a36Sopenharmony_ci */
15162306a36Sopenharmony_cistruct ionic_nop_cmd {
15262306a36Sopenharmony_ci	u8 opcode;
15362306a36Sopenharmony_ci	u8 rsvd[63];
15462306a36Sopenharmony_ci};
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_ci/**
15762306a36Sopenharmony_ci * struct ionic_nop_comp - NOP command completion
15862306a36Sopenharmony_ci * @status: Status of the command (enum ionic_status_code)
15962306a36Sopenharmony_ci */
16062306a36Sopenharmony_cistruct ionic_nop_comp {
16162306a36Sopenharmony_ci	u8 status;
16262306a36Sopenharmony_ci	u8 rsvd[15];
16362306a36Sopenharmony_ci};
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci/**
16662306a36Sopenharmony_ci * struct ionic_dev_init_cmd - Device init command
16762306a36Sopenharmony_ci * @opcode:    opcode
16862306a36Sopenharmony_ci * @type:      Device type
16962306a36Sopenharmony_ci */
17062306a36Sopenharmony_cistruct ionic_dev_init_cmd {
17162306a36Sopenharmony_ci	u8     opcode;
17262306a36Sopenharmony_ci	u8     type;
17362306a36Sopenharmony_ci	u8     rsvd[62];
17462306a36Sopenharmony_ci};
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ci/**
17762306a36Sopenharmony_ci * struct ionic_dev_init_comp - Device init command completion
17862306a36Sopenharmony_ci * @status: Status of the command (enum ionic_status_code)
17962306a36Sopenharmony_ci */
18062306a36Sopenharmony_cistruct ionic_dev_init_comp {
18162306a36Sopenharmony_ci	u8 status;
18262306a36Sopenharmony_ci	u8 rsvd[15];
18362306a36Sopenharmony_ci};
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci/**
18662306a36Sopenharmony_ci * struct ionic_dev_reset_cmd - Device reset command
18762306a36Sopenharmony_ci * @opcode: opcode
18862306a36Sopenharmony_ci */
18962306a36Sopenharmony_cistruct ionic_dev_reset_cmd {
19062306a36Sopenharmony_ci	u8 opcode;
19162306a36Sopenharmony_ci	u8 rsvd[63];
19262306a36Sopenharmony_ci};
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci/**
19562306a36Sopenharmony_ci * struct ionic_dev_reset_comp - Reset command completion
19662306a36Sopenharmony_ci * @status: Status of the command (enum ionic_status_code)
19762306a36Sopenharmony_ci */
19862306a36Sopenharmony_cistruct ionic_dev_reset_comp {
19962306a36Sopenharmony_ci	u8 status;
20062306a36Sopenharmony_ci	u8 rsvd[15];
20162306a36Sopenharmony_ci};
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ci#define IONIC_IDENTITY_VERSION_1	1
20462306a36Sopenharmony_ci#define IONIC_DEV_IDENTITY_VERSION_2	2
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ci/**
20762306a36Sopenharmony_ci * struct ionic_dev_identify_cmd - Driver/device identify command
20862306a36Sopenharmony_ci * @opcode:  opcode
20962306a36Sopenharmony_ci * @ver:     Highest version of identify supported by driver
21062306a36Sopenharmony_ci */
21162306a36Sopenharmony_cistruct ionic_dev_identify_cmd {
21262306a36Sopenharmony_ci	u8 opcode;
21362306a36Sopenharmony_ci	u8 ver;
21462306a36Sopenharmony_ci	u8 rsvd[62];
21562306a36Sopenharmony_ci};
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ci/**
21862306a36Sopenharmony_ci * struct ionic_dev_identify_comp - Driver/device identify command completion
21962306a36Sopenharmony_ci * @status: Status of the command (enum ionic_status_code)
22062306a36Sopenharmony_ci * @ver:    Version of identify returned by device
22162306a36Sopenharmony_ci */
22262306a36Sopenharmony_cistruct ionic_dev_identify_comp {
22362306a36Sopenharmony_ci	u8 status;
22462306a36Sopenharmony_ci	u8 ver;
22562306a36Sopenharmony_ci	u8 rsvd[14];
22662306a36Sopenharmony_ci};
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_cienum ionic_os_type {
22962306a36Sopenharmony_ci	IONIC_OS_TYPE_LINUX   = 1,
23062306a36Sopenharmony_ci	IONIC_OS_TYPE_WIN     = 2,
23162306a36Sopenharmony_ci	IONIC_OS_TYPE_DPDK    = 3,
23262306a36Sopenharmony_ci	IONIC_OS_TYPE_FREEBSD = 4,
23362306a36Sopenharmony_ci	IONIC_OS_TYPE_IPXE    = 5,
23462306a36Sopenharmony_ci	IONIC_OS_TYPE_ESXI    = 6,
23562306a36Sopenharmony_ci};
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci/**
23862306a36Sopenharmony_ci * union ionic_drv_identity - driver identity information
23962306a36Sopenharmony_ci * @os_type:          OS type (see enum ionic_os_type)
24062306a36Sopenharmony_ci * @os_dist:          OS distribution, numeric format
24162306a36Sopenharmony_ci * @os_dist_str:      OS distribution, string format
24262306a36Sopenharmony_ci * @kernel_ver:       Kernel version, numeric format
24362306a36Sopenharmony_ci * @kernel_ver_str:   Kernel version, string format
24462306a36Sopenharmony_ci * @driver_ver_str:   Driver version, string format
24562306a36Sopenharmony_ci */
24662306a36Sopenharmony_ciunion ionic_drv_identity {
24762306a36Sopenharmony_ci	struct {
24862306a36Sopenharmony_ci		__le32 os_type;
24962306a36Sopenharmony_ci		__le32 os_dist;
25062306a36Sopenharmony_ci		char   os_dist_str[128];
25162306a36Sopenharmony_ci		__le32 kernel_ver;
25262306a36Sopenharmony_ci		char   kernel_ver_str[32];
25362306a36Sopenharmony_ci		char   driver_ver_str[32];
25462306a36Sopenharmony_ci	};
25562306a36Sopenharmony_ci	__le32 words[478];
25662306a36Sopenharmony_ci};
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_ci/**
25962306a36Sopenharmony_ci * enum ionic_dev_capability - Device capabilities
26062306a36Sopenharmony_ci * @IONIC_DEV_CAP_VF_CTRL:     Device supports VF ctrl operations
26162306a36Sopenharmony_ci */
26262306a36Sopenharmony_cienum ionic_dev_capability {
26362306a36Sopenharmony_ci	IONIC_DEV_CAP_VF_CTRL        = BIT(0),
26462306a36Sopenharmony_ci};
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_ci/**
26762306a36Sopenharmony_ci * union ionic_dev_identity - device identity information
26862306a36Sopenharmony_ci * @version:          Version of device identify
26962306a36Sopenharmony_ci * @type:             Identify type (0 for now)
27062306a36Sopenharmony_ci * @nports:           Number of ports provisioned
27162306a36Sopenharmony_ci * @nlifs:            Number of LIFs provisioned
27262306a36Sopenharmony_ci * @nintrs:           Number of interrupts provisioned
27362306a36Sopenharmony_ci * @ndbpgs_per_lif:   Number of doorbell pages per LIF
27462306a36Sopenharmony_ci * @intr_coal_mult:   Interrupt coalescing multiplication factor
27562306a36Sopenharmony_ci *                    Scale user-supplied interrupt coalescing
27662306a36Sopenharmony_ci *                    value in usecs to device units using:
27762306a36Sopenharmony_ci *                    device units = usecs * mult / div
27862306a36Sopenharmony_ci * @intr_coal_div:    Interrupt coalescing division factor
27962306a36Sopenharmony_ci *                    Scale user-supplied interrupt coalescing
28062306a36Sopenharmony_ci *                    value in usecs to device units using:
28162306a36Sopenharmony_ci *                    device units = usecs * mult / div
28262306a36Sopenharmony_ci * @eq_count:         Number of shared event queues
28362306a36Sopenharmony_ci * @hwstamp_mask:     Bitmask for subtraction of hardware tick values.
28462306a36Sopenharmony_ci * @hwstamp_mult:     Hardware tick to nanosecond multiplier.
28562306a36Sopenharmony_ci * @hwstamp_shift:    Hardware tick to nanosecond divisor (power of two).
28662306a36Sopenharmony_ci * @capabilities:     Device capabilities
28762306a36Sopenharmony_ci */
28862306a36Sopenharmony_ciunion ionic_dev_identity {
28962306a36Sopenharmony_ci	struct {
29062306a36Sopenharmony_ci		u8     version;
29162306a36Sopenharmony_ci		u8     type;
29262306a36Sopenharmony_ci		u8     rsvd[2];
29362306a36Sopenharmony_ci		u8     nports;
29462306a36Sopenharmony_ci		u8     rsvd2[3];
29562306a36Sopenharmony_ci		__le32 nlifs;
29662306a36Sopenharmony_ci		__le32 nintrs;
29762306a36Sopenharmony_ci		__le32 ndbpgs_per_lif;
29862306a36Sopenharmony_ci		__le32 intr_coal_mult;
29962306a36Sopenharmony_ci		__le32 intr_coal_div;
30062306a36Sopenharmony_ci		__le32 eq_count;
30162306a36Sopenharmony_ci		__le64 hwstamp_mask;
30262306a36Sopenharmony_ci		__le32 hwstamp_mult;
30362306a36Sopenharmony_ci		__le32 hwstamp_shift;
30462306a36Sopenharmony_ci		__le64 capabilities;
30562306a36Sopenharmony_ci	};
30662306a36Sopenharmony_ci	__le32 words[478];
30762306a36Sopenharmony_ci};
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_cienum ionic_lif_type {
31062306a36Sopenharmony_ci	IONIC_LIF_TYPE_CLASSIC = 0,
31162306a36Sopenharmony_ci	IONIC_LIF_TYPE_MACVLAN = 1,
31262306a36Sopenharmony_ci	IONIC_LIF_TYPE_NETQUEUE = 2,
31362306a36Sopenharmony_ci};
31462306a36Sopenharmony_ci
31562306a36Sopenharmony_ci/**
31662306a36Sopenharmony_ci * struct ionic_lif_identify_cmd - LIF identify command
31762306a36Sopenharmony_ci * @opcode:  opcode
31862306a36Sopenharmony_ci * @type:    LIF type (enum ionic_lif_type)
31962306a36Sopenharmony_ci * @ver:     Version of identify returned by device
32062306a36Sopenharmony_ci */
32162306a36Sopenharmony_cistruct ionic_lif_identify_cmd {
32262306a36Sopenharmony_ci	u8 opcode;
32362306a36Sopenharmony_ci	u8 type;
32462306a36Sopenharmony_ci	u8 ver;
32562306a36Sopenharmony_ci	u8 rsvd[61];
32662306a36Sopenharmony_ci};
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ci/**
32962306a36Sopenharmony_ci * struct ionic_lif_identify_comp - LIF identify command completion
33062306a36Sopenharmony_ci * @status:  Status of the command (enum ionic_status_code)
33162306a36Sopenharmony_ci * @ver:     Version of identify returned by device
33262306a36Sopenharmony_ci */
33362306a36Sopenharmony_cistruct ionic_lif_identify_comp {
33462306a36Sopenharmony_ci	u8 status;
33562306a36Sopenharmony_ci	u8 ver;
33662306a36Sopenharmony_ci	u8 rsvd2[14];
33762306a36Sopenharmony_ci};
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ci/**
34062306a36Sopenharmony_ci * enum ionic_lif_capability - LIF capabilities
34162306a36Sopenharmony_ci * @IONIC_LIF_CAP_ETH:     LIF supports Ethernet
34262306a36Sopenharmony_ci * @IONIC_LIF_CAP_RDMA:    LIF supports RDMA
34362306a36Sopenharmony_ci */
34462306a36Sopenharmony_cienum ionic_lif_capability {
34562306a36Sopenharmony_ci	IONIC_LIF_CAP_ETH        = BIT(0),
34662306a36Sopenharmony_ci	IONIC_LIF_CAP_RDMA       = BIT(1),
34762306a36Sopenharmony_ci};
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_ci/**
35062306a36Sopenharmony_ci * enum ionic_logical_qtype - Logical Queue Types
35162306a36Sopenharmony_ci * @IONIC_QTYPE_ADMINQ:    Administrative Queue
35262306a36Sopenharmony_ci * @IONIC_QTYPE_NOTIFYQ:   Notify Queue
35362306a36Sopenharmony_ci * @IONIC_QTYPE_RXQ:       Receive Queue
35462306a36Sopenharmony_ci * @IONIC_QTYPE_TXQ:       Transmit Queue
35562306a36Sopenharmony_ci * @IONIC_QTYPE_EQ:        Event Queue
35662306a36Sopenharmony_ci * @IONIC_QTYPE_MAX:       Max queue type supported
35762306a36Sopenharmony_ci */
35862306a36Sopenharmony_cienum ionic_logical_qtype {
35962306a36Sopenharmony_ci	IONIC_QTYPE_ADMINQ  = 0,
36062306a36Sopenharmony_ci	IONIC_QTYPE_NOTIFYQ = 1,
36162306a36Sopenharmony_ci	IONIC_QTYPE_RXQ     = 2,
36262306a36Sopenharmony_ci	IONIC_QTYPE_TXQ     = 3,
36362306a36Sopenharmony_ci	IONIC_QTYPE_EQ      = 4,
36462306a36Sopenharmony_ci	IONIC_QTYPE_MAX     = 16,
36562306a36Sopenharmony_ci};
36662306a36Sopenharmony_ci
36762306a36Sopenharmony_ci/**
36862306a36Sopenharmony_ci * enum ionic_q_feature - Common Features for most queue types
36962306a36Sopenharmony_ci *
37062306a36Sopenharmony_ci * Common features use bits 0-15. Per-queue-type features use higher bits.
37162306a36Sopenharmony_ci *
37262306a36Sopenharmony_ci * @IONIC_QIDENT_F_CQ:      Queue has completion ring
37362306a36Sopenharmony_ci * @IONIC_QIDENT_F_SG:      Queue has scatter/gather ring
37462306a36Sopenharmony_ci * @IONIC_QIDENT_F_EQ:      Queue can use event queue
37562306a36Sopenharmony_ci * @IONIC_QIDENT_F_CMB:     Queue is in cmb bar
37662306a36Sopenharmony_ci * @IONIC_Q_F_2X_DESC:      Double main descriptor size
37762306a36Sopenharmony_ci * @IONIC_Q_F_2X_CQ_DESC:   Double cq descriptor size
37862306a36Sopenharmony_ci * @IONIC_Q_F_2X_SG_DESC:   Double sg descriptor size
37962306a36Sopenharmony_ci * @IONIC_Q_F_4X_DESC:      Quadruple main descriptor size
38062306a36Sopenharmony_ci * @IONIC_Q_F_4X_CQ_DESC:   Quadruple cq descriptor size
38162306a36Sopenharmony_ci * @IONIC_Q_F_4X_SG_DESC:   Quadruple sg descriptor size
38262306a36Sopenharmony_ci */
38362306a36Sopenharmony_cienum ionic_q_feature {
38462306a36Sopenharmony_ci	IONIC_QIDENT_F_CQ		= BIT_ULL(0),
38562306a36Sopenharmony_ci	IONIC_QIDENT_F_SG		= BIT_ULL(1),
38662306a36Sopenharmony_ci	IONIC_QIDENT_F_EQ		= BIT_ULL(2),
38762306a36Sopenharmony_ci	IONIC_QIDENT_F_CMB		= BIT_ULL(3),
38862306a36Sopenharmony_ci	IONIC_Q_F_2X_DESC		= BIT_ULL(4),
38962306a36Sopenharmony_ci	IONIC_Q_F_2X_CQ_DESC		= BIT_ULL(5),
39062306a36Sopenharmony_ci	IONIC_Q_F_2X_SG_DESC		= BIT_ULL(6),
39162306a36Sopenharmony_ci	IONIC_Q_F_4X_DESC		= BIT_ULL(7),
39262306a36Sopenharmony_ci	IONIC_Q_F_4X_CQ_DESC		= BIT_ULL(8),
39362306a36Sopenharmony_ci	IONIC_Q_F_4X_SG_DESC		= BIT_ULL(9),
39462306a36Sopenharmony_ci};
39562306a36Sopenharmony_ci
39662306a36Sopenharmony_ci/**
39762306a36Sopenharmony_ci * enum ionic_rxq_feature - RXQ-specific Features
39862306a36Sopenharmony_ci *
39962306a36Sopenharmony_ci * Per-queue-type features use bits 16 and higher.
40062306a36Sopenharmony_ci *
40162306a36Sopenharmony_ci * @IONIC_RXQ_F_HWSTAMP:   Queue supports Hardware Timestamping
40262306a36Sopenharmony_ci */
40362306a36Sopenharmony_cienum ionic_rxq_feature {
40462306a36Sopenharmony_ci	IONIC_RXQ_F_HWSTAMP		= BIT_ULL(16),
40562306a36Sopenharmony_ci};
40662306a36Sopenharmony_ci
40762306a36Sopenharmony_ci/**
40862306a36Sopenharmony_ci * enum ionic_txq_feature - TXQ-specific Features
40962306a36Sopenharmony_ci *
41062306a36Sopenharmony_ci * Per-queue-type features use bits 16 and higher.
41162306a36Sopenharmony_ci *
41262306a36Sopenharmony_ci * @IONIC_TXQ_F_HWSTAMP:   Queue supports Hardware Timestamping
41362306a36Sopenharmony_ci */
41462306a36Sopenharmony_cienum ionic_txq_feature {
41562306a36Sopenharmony_ci	IONIC_TXQ_F_HWSTAMP		= BIT(16),
41662306a36Sopenharmony_ci};
41762306a36Sopenharmony_ci
41862306a36Sopenharmony_ci/**
41962306a36Sopenharmony_ci * struct ionic_hwstamp_bits - Hardware timestamp decoding bits
42062306a36Sopenharmony_ci * @IONIC_HWSTAMP_INVALID:          Invalid hardware timestamp value
42162306a36Sopenharmony_ci * @IONIC_HWSTAMP_CQ_NEGOFFSET:     Timestamp field negative offset
42262306a36Sopenharmony_ci *                                  from the base cq descriptor.
42362306a36Sopenharmony_ci */
42462306a36Sopenharmony_cienum ionic_hwstamp_bits {
42562306a36Sopenharmony_ci	IONIC_HWSTAMP_INVALID	    = ~0ull,
42662306a36Sopenharmony_ci	IONIC_HWSTAMP_CQ_NEGOFFSET  = 8,
42762306a36Sopenharmony_ci};
42862306a36Sopenharmony_ci
42962306a36Sopenharmony_ci/**
43062306a36Sopenharmony_ci * struct ionic_lif_logical_qtype - Descriptor of logical to HW queue type
43162306a36Sopenharmony_ci * @qtype:          Hardware Queue Type
43262306a36Sopenharmony_ci * @qid_count:      Number of Queue IDs of the logical type
43362306a36Sopenharmony_ci * @qid_base:       Minimum Queue ID of the logical type
43462306a36Sopenharmony_ci */
43562306a36Sopenharmony_cistruct ionic_lif_logical_qtype {
43662306a36Sopenharmony_ci	u8     qtype;
43762306a36Sopenharmony_ci	u8     rsvd[3];
43862306a36Sopenharmony_ci	__le32 qid_count;
43962306a36Sopenharmony_ci	__le32 qid_base;
44062306a36Sopenharmony_ci};
44162306a36Sopenharmony_ci
44262306a36Sopenharmony_ci/**
44362306a36Sopenharmony_ci * enum ionic_lif_state - LIF state
44462306a36Sopenharmony_ci * @IONIC_LIF_DISABLE:     LIF disabled
44562306a36Sopenharmony_ci * @IONIC_LIF_ENABLE:      LIF enabled
44662306a36Sopenharmony_ci * @IONIC_LIF_QUIESCE:     LIF Quiesced
44762306a36Sopenharmony_ci */
44862306a36Sopenharmony_cienum ionic_lif_state {
44962306a36Sopenharmony_ci	IONIC_LIF_QUIESCE	= 0,
45062306a36Sopenharmony_ci	IONIC_LIF_ENABLE	= 1,
45162306a36Sopenharmony_ci	IONIC_LIF_DISABLE	= 2,
45262306a36Sopenharmony_ci};
45362306a36Sopenharmony_ci
45462306a36Sopenharmony_ci/**
45562306a36Sopenharmony_ci * union ionic_lif_config - LIF configuration
45662306a36Sopenharmony_ci * @state:          LIF state (enum ionic_lif_state)
45762306a36Sopenharmony_ci * @name:           LIF name
45862306a36Sopenharmony_ci * @mtu:            MTU
45962306a36Sopenharmony_ci * @mac:            Station MAC address
46062306a36Sopenharmony_ci * @vlan:           Default Vlan ID
46162306a36Sopenharmony_ci * @features:       Features (enum ionic_eth_hw_features)
46262306a36Sopenharmony_ci * @queue_count:    Queue counts per queue-type
46362306a36Sopenharmony_ci */
46462306a36Sopenharmony_ciunion ionic_lif_config {
46562306a36Sopenharmony_ci	struct {
46662306a36Sopenharmony_ci		u8     state;
46762306a36Sopenharmony_ci		u8     rsvd[3];
46862306a36Sopenharmony_ci		char   name[IONIC_IFNAMSIZ];
46962306a36Sopenharmony_ci		__le32 mtu;
47062306a36Sopenharmony_ci		u8     mac[6];
47162306a36Sopenharmony_ci		__le16 vlan;
47262306a36Sopenharmony_ci		__le64 features;
47362306a36Sopenharmony_ci		__le32 queue_count[IONIC_QTYPE_MAX];
47462306a36Sopenharmony_ci	} __packed;
47562306a36Sopenharmony_ci	__le32 words[64];
47662306a36Sopenharmony_ci};
47762306a36Sopenharmony_ci
47862306a36Sopenharmony_ci/**
47962306a36Sopenharmony_ci * struct ionic_lif_identity - LIF identity information (type-specific)
48062306a36Sopenharmony_ci *
48162306a36Sopenharmony_ci * @capabilities:        LIF capabilities
48262306a36Sopenharmony_ci *
48362306a36Sopenharmony_ci * @eth:                    Ethernet identify structure
48462306a36Sopenharmony_ci *     @version:            Ethernet identify structure version
48562306a36Sopenharmony_ci *     @max_ucast_filters:  Number of perfect unicast addresses supported
48662306a36Sopenharmony_ci *     @max_mcast_filters:  Number of perfect multicast addresses supported
48762306a36Sopenharmony_ci *     @min_frame_size:     Minimum size of frames to be sent
48862306a36Sopenharmony_ci *     @max_frame_size:     Maximum size of frames to be sent
48962306a36Sopenharmony_ci *     @hwstamp_tx_modes:   Bitmask of BIT_ULL(enum ionic_txstamp_mode)
49062306a36Sopenharmony_ci *     @hwstamp_rx_filters: Bitmask of enum ionic_pkt_class
49162306a36Sopenharmony_ci *     @config:             LIF config struct with features, mtu, mac, q counts
49262306a36Sopenharmony_ci *
49362306a36Sopenharmony_ci * @rdma:                RDMA identify structure
49462306a36Sopenharmony_ci *     @version:         RDMA version of opcodes and queue descriptors
49562306a36Sopenharmony_ci *     @qp_opcodes:      Number of RDMA queue pair opcodes supported
49662306a36Sopenharmony_ci *     @admin_opcodes:   Number of RDMA admin opcodes supported
49762306a36Sopenharmony_ci *     @npts_per_lif:    Page table size per LIF
49862306a36Sopenharmony_ci *     @nmrs_per_lif:    Number of memory regions per LIF
49962306a36Sopenharmony_ci *     @nahs_per_lif:    Number of address handles per LIF
50062306a36Sopenharmony_ci *     @max_stride:      Max work request stride
50162306a36Sopenharmony_ci *     @cl_stride:       Cache line stride
50262306a36Sopenharmony_ci *     @pte_stride:      Page table entry stride
50362306a36Sopenharmony_ci *     @rrq_stride:      Remote RQ work request stride
50462306a36Sopenharmony_ci *     @rsq_stride:      Remote SQ work request stride
50562306a36Sopenharmony_ci *     @dcqcn_profiles:  Number of DCQCN profiles
50662306a36Sopenharmony_ci *     @aq_qtype:        RDMA Admin Qtype
50762306a36Sopenharmony_ci *     @sq_qtype:        RDMA Send Qtype
50862306a36Sopenharmony_ci *     @rq_qtype:        RDMA Receive Qtype
50962306a36Sopenharmony_ci *     @cq_qtype:        RDMA Completion Qtype
51062306a36Sopenharmony_ci *     @eq_qtype:        RDMA Event Qtype
51162306a36Sopenharmony_ci */
51262306a36Sopenharmony_ciunion ionic_lif_identity {
51362306a36Sopenharmony_ci	struct {
51462306a36Sopenharmony_ci		__le64 capabilities;
51562306a36Sopenharmony_ci
51662306a36Sopenharmony_ci		struct {
51762306a36Sopenharmony_ci			u8 version;
51862306a36Sopenharmony_ci			u8 rsvd[3];
51962306a36Sopenharmony_ci			__le32 max_ucast_filters;
52062306a36Sopenharmony_ci			__le32 max_mcast_filters;
52162306a36Sopenharmony_ci			__le16 rss_ind_tbl_sz;
52262306a36Sopenharmony_ci			__le32 min_frame_size;
52362306a36Sopenharmony_ci			__le32 max_frame_size;
52462306a36Sopenharmony_ci			u8 rsvd2[2];
52562306a36Sopenharmony_ci			__le64 hwstamp_tx_modes;
52662306a36Sopenharmony_ci			__le64 hwstamp_rx_filters;
52762306a36Sopenharmony_ci			u8 rsvd3[88];
52862306a36Sopenharmony_ci			union ionic_lif_config config;
52962306a36Sopenharmony_ci		} __packed eth;
53062306a36Sopenharmony_ci
53162306a36Sopenharmony_ci		struct {
53262306a36Sopenharmony_ci			u8 version;
53362306a36Sopenharmony_ci			u8 qp_opcodes;
53462306a36Sopenharmony_ci			u8 admin_opcodes;
53562306a36Sopenharmony_ci			u8 rsvd;
53662306a36Sopenharmony_ci			__le32 npts_per_lif;
53762306a36Sopenharmony_ci			__le32 nmrs_per_lif;
53862306a36Sopenharmony_ci			__le32 nahs_per_lif;
53962306a36Sopenharmony_ci			u8 max_stride;
54062306a36Sopenharmony_ci			u8 cl_stride;
54162306a36Sopenharmony_ci			u8 pte_stride;
54262306a36Sopenharmony_ci			u8 rrq_stride;
54362306a36Sopenharmony_ci			u8 rsq_stride;
54462306a36Sopenharmony_ci			u8 dcqcn_profiles;
54562306a36Sopenharmony_ci			u8 rsvd_dimensions[10];
54662306a36Sopenharmony_ci			struct ionic_lif_logical_qtype aq_qtype;
54762306a36Sopenharmony_ci			struct ionic_lif_logical_qtype sq_qtype;
54862306a36Sopenharmony_ci			struct ionic_lif_logical_qtype rq_qtype;
54962306a36Sopenharmony_ci			struct ionic_lif_logical_qtype cq_qtype;
55062306a36Sopenharmony_ci			struct ionic_lif_logical_qtype eq_qtype;
55162306a36Sopenharmony_ci		} __packed rdma;
55262306a36Sopenharmony_ci	} __packed;
55362306a36Sopenharmony_ci	__le32 words[478];
55462306a36Sopenharmony_ci};
55562306a36Sopenharmony_ci
55662306a36Sopenharmony_ci/**
55762306a36Sopenharmony_ci * struct ionic_lif_init_cmd - LIF init command
55862306a36Sopenharmony_ci * @opcode:       Opcode
55962306a36Sopenharmony_ci * @type:         LIF type (enum ionic_lif_type)
56062306a36Sopenharmony_ci * @index:        LIF index
56162306a36Sopenharmony_ci * @info_pa:      Destination address for LIF info (struct ionic_lif_info)
56262306a36Sopenharmony_ci */
56362306a36Sopenharmony_cistruct ionic_lif_init_cmd {
56462306a36Sopenharmony_ci	u8     opcode;
56562306a36Sopenharmony_ci	u8     type;
56662306a36Sopenharmony_ci	__le16 index;
56762306a36Sopenharmony_ci	__le32 rsvd;
56862306a36Sopenharmony_ci	__le64 info_pa;
56962306a36Sopenharmony_ci	u8     rsvd2[48];
57062306a36Sopenharmony_ci};
57162306a36Sopenharmony_ci
57262306a36Sopenharmony_ci/**
57362306a36Sopenharmony_ci * struct ionic_lif_init_comp - LIF init command completion
57462306a36Sopenharmony_ci * @status:	Status of the command (enum ionic_status_code)
57562306a36Sopenharmony_ci * @hw_index:	Hardware index of the initialized LIF
57662306a36Sopenharmony_ci */
57762306a36Sopenharmony_cistruct ionic_lif_init_comp {
57862306a36Sopenharmony_ci	u8 status;
57962306a36Sopenharmony_ci	u8 rsvd;
58062306a36Sopenharmony_ci	__le16 hw_index;
58162306a36Sopenharmony_ci	u8 rsvd2[12];
58262306a36Sopenharmony_ci};
58362306a36Sopenharmony_ci
58462306a36Sopenharmony_ci/**
58562306a36Sopenharmony_ci * struct ionic_q_identify_cmd - queue identify command
58662306a36Sopenharmony_ci * @opcode:     opcode
58762306a36Sopenharmony_ci * @lif_type:   LIF type (enum ionic_lif_type)
58862306a36Sopenharmony_ci * @type:       Logical queue type (enum ionic_logical_qtype)
58962306a36Sopenharmony_ci * @ver:        Highest queue type version that the driver supports
59062306a36Sopenharmony_ci */
59162306a36Sopenharmony_cistruct ionic_q_identify_cmd {
59262306a36Sopenharmony_ci	u8     opcode;
59362306a36Sopenharmony_ci	u8     rsvd;
59462306a36Sopenharmony_ci	__le16 lif_type;
59562306a36Sopenharmony_ci	u8     type;
59662306a36Sopenharmony_ci	u8     ver;
59762306a36Sopenharmony_ci	u8     rsvd2[58];
59862306a36Sopenharmony_ci};
59962306a36Sopenharmony_ci
60062306a36Sopenharmony_ci/**
60162306a36Sopenharmony_ci * struct ionic_q_identify_comp - queue identify command completion
60262306a36Sopenharmony_ci * @status:     Status of the command (enum ionic_status_code)
60362306a36Sopenharmony_ci * @comp_index: Index in the descriptor ring for which this is the completion
60462306a36Sopenharmony_ci * @ver:        Queue type version that can be used with FW
60562306a36Sopenharmony_ci */
60662306a36Sopenharmony_cistruct ionic_q_identify_comp {
60762306a36Sopenharmony_ci	u8     status;
60862306a36Sopenharmony_ci	u8     rsvd;
60962306a36Sopenharmony_ci	__le16 comp_index;
61062306a36Sopenharmony_ci	u8     ver;
61162306a36Sopenharmony_ci	u8     rsvd2[11];
61262306a36Sopenharmony_ci};
61362306a36Sopenharmony_ci
61462306a36Sopenharmony_ci/**
61562306a36Sopenharmony_ci * union ionic_q_identity - queue identity information
61662306a36Sopenharmony_ci *     @version:        Queue type version that can be used with FW
61762306a36Sopenharmony_ci *     @supported:      Bitfield of queue versions, first bit = ver 0
61862306a36Sopenharmony_ci *     @features:       Queue features (enum ionic_q_feature, etc)
61962306a36Sopenharmony_ci *     @desc_sz:        Descriptor size
62062306a36Sopenharmony_ci *     @comp_sz:        Completion descriptor size
62162306a36Sopenharmony_ci *     @sg_desc_sz:     Scatter/Gather descriptor size
62262306a36Sopenharmony_ci *     @max_sg_elems:   Maximum number of Scatter/Gather elements
62362306a36Sopenharmony_ci *     @sg_desc_stride: Number of Scatter/Gather elements per descriptor
62462306a36Sopenharmony_ci */
62562306a36Sopenharmony_ciunion ionic_q_identity {
62662306a36Sopenharmony_ci	struct {
62762306a36Sopenharmony_ci		u8      version;
62862306a36Sopenharmony_ci		u8      supported;
62962306a36Sopenharmony_ci		u8      rsvd[6];
63062306a36Sopenharmony_ci		__le64  features;
63162306a36Sopenharmony_ci		__le16  desc_sz;
63262306a36Sopenharmony_ci		__le16  comp_sz;
63362306a36Sopenharmony_ci		__le16  sg_desc_sz;
63462306a36Sopenharmony_ci		__le16  max_sg_elems;
63562306a36Sopenharmony_ci		__le16  sg_desc_stride;
63662306a36Sopenharmony_ci	};
63762306a36Sopenharmony_ci	__le32 words[478];
63862306a36Sopenharmony_ci};
63962306a36Sopenharmony_ci
64062306a36Sopenharmony_ci/**
64162306a36Sopenharmony_ci * struct ionic_q_init_cmd - Queue init command
64262306a36Sopenharmony_ci * @opcode:       opcode
64362306a36Sopenharmony_ci * @type:         Logical queue type
64462306a36Sopenharmony_ci * @ver:          Queue type version
64562306a36Sopenharmony_ci * @lif_index:    LIF index
64662306a36Sopenharmony_ci * @index:        (LIF, qtype) relative admin queue index
64762306a36Sopenharmony_ci * @intr_index:   Interrupt control register index, or Event queue index
64862306a36Sopenharmony_ci * @pid:          Process ID
64962306a36Sopenharmony_ci * @flags:
65062306a36Sopenharmony_ci *    IRQ:        Interrupt requested on completion
65162306a36Sopenharmony_ci *    ENA:        Enable the queue.  If ENA=0 the queue is initialized
65262306a36Sopenharmony_ci *                but remains disabled, to be later enabled with the
65362306a36Sopenharmony_ci *                Queue Enable command.  If ENA=1, then queue is
65462306a36Sopenharmony_ci *                initialized and then enabled.
65562306a36Sopenharmony_ci *    SG:         Enable Scatter-Gather on the queue.
65662306a36Sopenharmony_ci *                in number of descs.  The actual ring size is
65762306a36Sopenharmony_ci *                (1 << ring_size).  For example, to
65862306a36Sopenharmony_ci *                select a ring size of 64 descriptors write
65962306a36Sopenharmony_ci *                ring_size = 6.  The minimum ring_size value is 2
66062306a36Sopenharmony_ci *                for a ring size of 4 descriptors.  The maximum
66162306a36Sopenharmony_ci *                ring_size value is 16 for a ring size of 64k
66262306a36Sopenharmony_ci *                descriptors.  Values of ring_size <2 and >16 are
66362306a36Sopenharmony_ci *                reserved.
66462306a36Sopenharmony_ci *    EQ:         Enable the Event Queue
66562306a36Sopenharmony_ci * @cos:          Class of service for this queue
66662306a36Sopenharmony_ci * @ring_size:    Queue ring size, encoded as a log2(size)
66762306a36Sopenharmony_ci * @ring_base:    Queue ring base address
66862306a36Sopenharmony_ci * @cq_ring_base: Completion queue ring base address
66962306a36Sopenharmony_ci * @sg_ring_base: Scatter/Gather ring base address
67062306a36Sopenharmony_ci * @features:     Mask of queue features to enable, if not in the flags above.
67162306a36Sopenharmony_ci */
67262306a36Sopenharmony_cistruct ionic_q_init_cmd {
67362306a36Sopenharmony_ci	u8     opcode;
67462306a36Sopenharmony_ci	u8     rsvd;
67562306a36Sopenharmony_ci	__le16 lif_index;
67662306a36Sopenharmony_ci	u8     type;
67762306a36Sopenharmony_ci	u8     ver;
67862306a36Sopenharmony_ci	u8     rsvd1[2];
67962306a36Sopenharmony_ci	__le32 index;
68062306a36Sopenharmony_ci	__le16 pid;
68162306a36Sopenharmony_ci	__le16 intr_index;
68262306a36Sopenharmony_ci	__le16 flags;
68362306a36Sopenharmony_ci#define IONIC_QINIT_F_IRQ	0x01	/* Request interrupt on completion */
68462306a36Sopenharmony_ci#define IONIC_QINIT_F_ENA	0x02	/* Enable the queue */
68562306a36Sopenharmony_ci#define IONIC_QINIT_F_SG	0x04	/* Enable scatter/gather on the queue */
68662306a36Sopenharmony_ci#define IONIC_QINIT_F_EQ	0x08	/* Enable event queue */
68762306a36Sopenharmony_ci#define IONIC_QINIT_F_CMB	0x10	/* Enable cmb-based queue */
68862306a36Sopenharmony_ci#define IONIC_QINIT_F_DEBUG	0x80	/* Enable queue debugging */
68962306a36Sopenharmony_ci	u8     cos;
69062306a36Sopenharmony_ci	u8     ring_size;
69162306a36Sopenharmony_ci	__le64 ring_base;
69262306a36Sopenharmony_ci	__le64 cq_ring_base;
69362306a36Sopenharmony_ci	__le64 sg_ring_base;
69462306a36Sopenharmony_ci	u8     rsvd2[12];
69562306a36Sopenharmony_ci	__le64 features;
69662306a36Sopenharmony_ci} __packed;
69762306a36Sopenharmony_ci
69862306a36Sopenharmony_ci/**
69962306a36Sopenharmony_ci * struct ionic_q_init_comp - Queue init command completion
70062306a36Sopenharmony_ci * @status:     Status of the command (enum ionic_status_code)
70162306a36Sopenharmony_ci * @comp_index: Index in the descriptor ring for which this is the completion
70262306a36Sopenharmony_ci * @hw_index:   Hardware Queue ID
70362306a36Sopenharmony_ci * @hw_type:    Hardware Queue type
70462306a36Sopenharmony_ci * @color:      Color
70562306a36Sopenharmony_ci */
70662306a36Sopenharmony_cistruct ionic_q_init_comp {
70762306a36Sopenharmony_ci	u8     status;
70862306a36Sopenharmony_ci	u8     rsvd;
70962306a36Sopenharmony_ci	__le16 comp_index;
71062306a36Sopenharmony_ci	__le32 hw_index;
71162306a36Sopenharmony_ci	u8     hw_type;
71262306a36Sopenharmony_ci	u8     rsvd2[6];
71362306a36Sopenharmony_ci	u8     color;
71462306a36Sopenharmony_ci};
71562306a36Sopenharmony_ci
71662306a36Sopenharmony_ci/* the device's internal addressing uses up to 52 bits */
71762306a36Sopenharmony_ci#define IONIC_ADDR_LEN		52
71862306a36Sopenharmony_ci#define IONIC_ADDR_MASK		(BIT_ULL(IONIC_ADDR_LEN) - 1)
71962306a36Sopenharmony_ci
72062306a36Sopenharmony_cienum ionic_txq_desc_opcode {
72162306a36Sopenharmony_ci	IONIC_TXQ_DESC_OPCODE_CSUM_NONE = 0,
72262306a36Sopenharmony_ci	IONIC_TXQ_DESC_OPCODE_CSUM_PARTIAL = 1,
72362306a36Sopenharmony_ci	IONIC_TXQ_DESC_OPCODE_CSUM_HW = 2,
72462306a36Sopenharmony_ci	IONIC_TXQ_DESC_OPCODE_TSO = 3,
72562306a36Sopenharmony_ci};
72662306a36Sopenharmony_ci
72762306a36Sopenharmony_ci/**
72862306a36Sopenharmony_ci * struct ionic_txq_desc - Ethernet Tx queue descriptor format
72962306a36Sopenharmony_ci * @cmd:          Tx operation, see IONIC_TXQ_DESC_OPCODE_*:
73062306a36Sopenharmony_ci *
73162306a36Sopenharmony_ci *                   IONIC_TXQ_DESC_OPCODE_CSUM_NONE:
73262306a36Sopenharmony_ci *                      Non-offload send.  No segmentation,
73362306a36Sopenharmony_ci *                      fragmentation or checksum calc/insertion is
73462306a36Sopenharmony_ci *                      performed by device; packet is prepared
73562306a36Sopenharmony_ci *                      to send by software stack and requires
73662306a36Sopenharmony_ci *                      no further manipulation from device.
73762306a36Sopenharmony_ci *
73862306a36Sopenharmony_ci *                   IONIC_TXQ_DESC_OPCODE_CSUM_PARTIAL:
73962306a36Sopenharmony_ci *                      Offload 16-bit L4 checksum
74062306a36Sopenharmony_ci *                      calculation/insertion.  The device will
74162306a36Sopenharmony_ci *                      calculate the L4 checksum value and
74262306a36Sopenharmony_ci *                      insert the result in the packet's L4
74362306a36Sopenharmony_ci *                      header checksum field.  The L4 checksum
74462306a36Sopenharmony_ci *                      is calculated starting at @csum_start bytes
74562306a36Sopenharmony_ci *                      into the packet to the end of the packet.
74662306a36Sopenharmony_ci *                      The checksum insertion position is given
74762306a36Sopenharmony_ci *                      in @csum_offset, which is the offset from
74862306a36Sopenharmony_ci *                      @csum_start to the checksum field in the L4
74962306a36Sopenharmony_ci *                      header.  This feature is only applicable to
75062306a36Sopenharmony_ci *                      protocols such as TCP, UDP and ICMP where a
75162306a36Sopenharmony_ci *                      standard (i.e. the 'IP-style' checksum)
75262306a36Sopenharmony_ci *                      one's complement 16-bit checksum is used,
75362306a36Sopenharmony_ci *                      using an IP pseudo-header to seed the
75462306a36Sopenharmony_ci *                      calculation.  Software will preload the L4
75562306a36Sopenharmony_ci *                      checksum field with the IP pseudo-header
75662306a36Sopenharmony_ci *                      checksum.
75762306a36Sopenharmony_ci *
75862306a36Sopenharmony_ci *                      For tunnel encapsulation, @csum_start and
75962306a36Sopenharmony_ci *                      @csum_offset refer to the inner L4
76062306a36Sopenharmony_ci *                      header.  Supported tunnels encapsulations
76162306a36Sopenharmony_ci *                      are: IPIP, GRE, and UDP.  If the @encap
76262306a36Sopenharmony_ci *                      is clear, no further processing by the
76362306a36Sopenharmony_ci *                      device is required; software will
76462306a36Sopenharmony_ci *                      calculate the outer header checksums.  If
76562306a36Sopenharmony_ci *                      the @encap is set, the device will
76662306a36Sopenharmony_ci *                      offload the outer header checksums using
76762306a36Sopenharmony_ci *                      LCO (local checksum offload) (see
76862306a36Sopenharmony_ci *                      Documentation/networking/checksum-offloads.rst
76962306a36Sopenharmony_ci *                      for more info).
77062306a36Sopenharmony_ci *
77162306a36Sopenharmony_ci *                   IONIC_TXQ_DESC_OPCODE_CSUM_HW:
77262306a36Sopenharmony_ci *                      Offload 16-bit checksum computation to hardware.
77362306a36Sopenharmony_ci *                      If @csum_l3 is set then the packet's L3 checksum is
77462306a36Sopenharmony_ci *                      updated. Similarly, if @csum_l4 is set the L4
77562306a36Sopenharmony_ci *                      checksum is updated. If @encap is set then encap header
77662306a36Sopenharmony_ci *                      checksums are also updated.
77762306a36Sopenharmony_ci *
77862306a36Sopenharmony_ci *                   IONIC_TXQ_DESC_OPCODE_TSO:
77962306a36Sopenharmony_ci *                      Device performs TCP segmentation offload
78062306a36Sopenharmony_ci *                      (TSO).  @hdr_len is the number of bytes
78162306a36Sopenharmony_ci *                      to the end of TCP header (the offset to
78262306a36Sopenharmony_ci *                      the TCP payload).  @mss is the desired
78362306a36Sopenharmony_ci *                      MSS, the TCP payload length for each
78462306a36Sopenharmony_ci *                      segment.  The device will calculate/
78562306a36Sopenharmony_ci *                      insert IP (IPv4 only) and TCP checksums
78662306a36Sopenharmony_ci *                      for each segment.  In the first data
78762306a36Sopenharmony_ci *                      buffer containing the header template,
78862306a36Sopenharmony_ci *                      the driver will set IPv4 checksum to 0
78962306a36Sopenharmony_ci *                      and preload TCP checksum with the IP
79062306a36Sopenharmony_ci *                      pseudo header calculated with IP length = 0.
79162306a36Sopenharmony_ci *
79262306a36Sopenharmony_ci *                      Supported tunnel encapsulations are IPIP,
79362306a36Sopenharmony_ci *                      layer-3 GRE, and UDP. @hdr_len includes
79462306a36Sopenharmony_ci *                      both outer and inner headers.  The driver
79562306a36Sopenharmony_ci *                      will set IPv4 checksum to zero and
79662306a36Sopenharmony_ci *                      preload TCP checksum with IP pseudo
79762306a36Sopenharmony_ci *                      header on the inner header.
79862306a36Sopenharmony_ci *
79962306a36Sopenharmony_ci *                      TCP ECN offload is supported.  The device
80062306a36Sopenharmony_ci *                      will set CWR flag in the first segment if
80162306a36Sopenharmony_ci *                      CWR is set in the template header, and
80262306a36Sopenharmony_ci *                      clear CWR in remaining segments.
80362306a36Sopenharmony_ci * @flags:
80462306a36Sopenharmony_ci *                vlan:
80562306a36Sopenharmony_ci *                    Insert an L2 VLAN header using @vlan_tci
80662306a36Sopenharmony_ci *                encap:
80762306a36Sopenharmony_ci *                    Calculate encap header checksum
80862306a36Sopenharmony_ci *                csum_l3:
80962306a36Sopenharmony_ci *                    Compute L3 header checksum
81062306a36Sopenharmony_ci *                csum_l4:
81162306a36Sopenharmony_ci *                    Compute L4 header checksum
81262306a36Sopenharmony_ci *                tso_sot:
81362306a36Sopenharmony_ci *                    TSO start
81462306a36Sopenharmony_ci *                tso_eot:
81562306a36Sopenharmony_ci *                    TSO end
81662306a36Sopenharmony_ci * @num_sg_elems: Number of scatter-gather elements in SG
81762306a36Sopenharmony_ci *                descriptor
81862306a36Sopenharmony_ci * @addr:         First data buffer's DMA address
81962306a36Sopenharmony_ci *                (Subsequent data buffers are on txq_sg_desc)
82062306a36Sopenharmony_ci * @len:          First data buffer's length, in bytes
82162306a36Sopenharmony_ci * @vlan_tci:     VLAN tag to insert in the packet (if requested
82262306a36Sopenharmony_ci *                by @V-bit).  Includes .1p and .1q tags
82362306a36Sopenharmony_ci * @hdr_len:      Length of packet headers, including
82462306a36Sopenharmony_ci *                encapsulating outer header, if applicable
82562306a36Sopenharmony_ci *                Valid for opcodes IONIC_TXQ_DESC_OPCODE_CALC_CSUM and
82662306a36Sopenharmony_ci *                IONIC_TXQ_DESC_OPCODE_TSO.  Should be set to zero for
82762306a36Sopenharmony_ci *                all other modes.  For
82862306a36Sopenharmony_ci *                IONIC_TXQ_DESC_OPCODE_CALC_CSUM, @hdr_len is length
82962306a36Sopenharmony_ci *                of headers up to inner-most L4 header.  For
83062306a36Sopenharmony_ci *                IONIC_TXQ_DESC_OPCODE_TSO, @hdr_len is up to
83162306a36Sopenharmony_ci *                inner-most L4 payload, so inclusive of
83262306a36Sopenharmony_ci *                inner-most L4 header.
83362306a36Sopenharmony_ci * @mss:          Desired MSS value for TSO; only applicable for
83462306a36Sopenharmony_ci *                IONIC_TXQ_DESC_OPCODE_TSO
83562306a36Sopenharmony_ci * @csum_start:   Offset from packet to first byte checked in L4 checksum
83662306a36Sopenharmony_ci * @csum_offset:  Offset from csum_start to L4 checksum field
83762306a36Sopenharmony_ci */
83862306a36Sopenharmony_cistruct ionic_txq_desc {
83962306a36Sopenharmony_ci	__le64  cmd;
84062306a36Sopenharmony_ci#define IONIC_TXQ_DESC_OPCODE_MASK		0xf
84162306a36Sopenharmony_ci#define IONIC_TXQ_DESC_OPCODE_SHIFT		4
84262306a36Sopenharmony_ci#define IONIC_TXQ_DESC_FLAGS_MASK		0xf
84362306a36Sopenharmony_ci#define IONIC_TXQ_DESC_FLAGS_SHIFT		0
84462306a36Sopenharmony_ci#define IONIC_TXQ_DESC_NSGE_MASK		0xf
84562306a36Sopenharmony_ci#define IONIC_TXQ_DESC_NSGE_SHIFT		8
84662306a36Sopenharmony_ci#define IONIC_TXQ_DESC_ADDR_MASK		(BIT_ULL(IONIC_ADDR_LEN) - 1)
84762306a36Sopenharmony_ci#define IONIC_TXQ_DESC_ADDR_SHIFT		12
84862306a36Sopenharmony_ci
84962306a36Sopenharmony_ci/* common flags */
85062306a36Sopenharmony_ci#define IONIC_TXQ_DESC_FLAG_VLAN		0x1
85162306a36Sopenharmony_ci#define IONIC_TXQ_DESC_FLAG_ENCAP		0x2
85262306a36Sopenharmony_ci
85362306a36Sopenharmony_ci/* flags for csum_hw opcode */
85462306a36Sopenharmony_ci#define IONIC_TXQ_DESC_FLAG_CSUM_L3		0x4
85562306a36Sopenharmony_ci#define IONIC_TXQ_DESC_FLAG_CSUM_L4		0x8
85662306a36Sopenharmony_ci
85762306a36Sopenharmony_ci/* flags for tso opcode */
85862306a36Sopenharmony_ci#define IONIC_TXQ_DESC_FLAG_TSO_SOT		0x4
85962306a36Sopenharmony_ci#define IONIC_TXQ_DESC_FLAG_TSO_EOT		0x8
86062306a36Sopenharmony_ci
86162306a36Sopenharmony_ci	__le16  len;
86262306a36Sopenharmony_ci	union {
86362306a36Sopenharmony_ci		__le16  vlan_tci;
86462306a36Sopenharmony_ci		__le16  hword0;
86562306a36Sopenharmony_ci	};
86662306a36Sopenharmony_ci	union {
86762306a36Sopenharmony_ci		__le16  csum_start;
86862306a36Sopenharmony_ci		__le16  hdr_len;
86962306a36Sopenharmony_ci		__le16  hword1;
87062306a36Sopenharmony_ci	};
87162306a36Sopenharmony_ci	union {
87262306a36Sopenharmony_ci		__le16  csum_offset;
87362306a36Sopenharmony_ci		__le16  mss;
87462306a36Sopenharmony_ci		__le16  hword2;
87562306a36Sopenharmony_ci	};
87662306a36Sopenharmony_ci};
87762306a36Sopenharmony_ci
87862306a36Sopenharmony_cistatic inline u64 encode_txq_desc_cmd(u8 opcode, u8 flags,
87962306a36Sopenharmony_ci				      u8 nsge, u64 addr)
88062306a36Sopenharmony_ci{
88162306a36Sopenharmony_ci	u64 cmd;
88262306a36Sopenharmony_ci
88362306a36Sopenharmony_ci	cmd = (opcode & IONIC_TXQ_DESC_OPCODE_MASK) << IONIC_TXQ_DESC_OPCODE_SHIFT;
88462306a36Sopenharmony_ci	cmd |= (flags & IONIC_TXQ_DESC_FLAGS_MASK) << IONIC_TXQ_DESC_FLAGS_SHIFT;
88562306a36Sopenharmony_ci	cmd |= (nsge & IONIC_TXQ_DESC_NSGE_MASK) << IONIC_TXQ_DESC_NSGE_SHIFT;
88662306a36Sopenharmony_ci	cmd |= (addr & IONIC_TXQ_DESC_ADDR_MASK) << IONIC_TXQ_DESC_ADDR_SHIFT;
88762306a36Sopenharmony_ci
88862306a36Sopenharmony_ci	return cmd;
88962306a36Sopenharmony_ci};
89062306a36Sopenharmony_ci
89162306a36Sopenharmony_cistatic inline void decode_txq_desc_cmd(u64 cmd, u8 *opcode, u8 *flags,
89262306a36Sopenharmony_ci				       u8 *nsge, u64 *addr)
89362306a36Sopenharmony_ci{
89462306a36Sopenharmony_ci	*opcode = (cmd >> IONIC_TXQ_DESC_OPCODE_SHIFT) & IONIC_TXQ_DESC_OPCODE_MASK;
89562306a36Sopenharmony_ci	*flags = (cmd >> IONIC_TXQ_DESC_FLAGS_SHIFT) & IONIC_TXQ_DESC_FLAGS_MASK;
89662306a36Sopenharmony_ci	*nsge = (cmd >> IONIC_TXQ_DESC_NSGE_SHIFT) & IONIC_TXQ_DESC_NSGE_MASK;
89762306a36Sopenharmony_ci	*addr = (cmd >> IONIC_TXQ_DESC_ADDR_SHIFT) & IONIC_TXQ_DESC_ADDR_MASK;
89862306a36Sopenharmony_ci};
89962306a36Sopenharmony_ci
90062306a36Sopenharmony_ci/**
90162306a36Sopenharmony_ci * struct ionic_txq_sg_elem - Transmit scatter-gather (SG) descriptor element
90262306a36Sopenharmony_ci * @addr:      DMA address of SG element data buffer
90362306a36Sopenharmony_ci * @len:       Length of SG element data buffer, in bytes
90462306a36Sopenharmony_ci */
90562306a36Sopenharmony_cistruct ionic_txq_sg_elem {
90662306a36Sopenharmony_ci	__le64 addr;
90762306a36Sopenharmony_ci	__le16 len;
90862306a36Sopenharmony_ci	__le16 rsvd[3];
90962306a36Sopenharmony_ci};
91062306a36Sopenharmony_ci
91162306a36Sopenharmony_ci/**
91262306a36Sopenharmony_ci * struct ionic_txq_sg_desc - Transmit scatter-gather (SG) list
91362306a36Sopenharmony_ci * @elems:     Scatter-gather elements
91462306a36Sopenharmony_ci */
91562306a36Sopenharmony_cistruct ionic_txq_sg_desc {
91662306a36Sopenharmony_ci#define IONIC_TX_MAX_SG_ELEMS		8
91762306a36Sopenharmony_ci#define IONIC_TX_SG_DESC_STRIDE		8
91862306a36Sopenharmony_ci	struct ionic_txq_sg_elem elems[IONIC_TX_MAX_SG_ELEMS];
91962306a36Sopenharmony_ci};
92062306a36Sopenharmony_ci
92162306a36Sopenharmony_cistruct ionic_txq_sg_desc_v1 {
92262306a36Sopenharmony_ci#define IONIC_TX_MAX_SG_ELEMS_V1		15
92362306a36Sopenharmony_ci#define IONIC_TX_SG_DESC_STRIDE_V1		16
92462306a36Sopenharmony_ci	struct ionic_txq_sg_elem elems[IONIC_TX_SG_DESC_STRIDE_V1];
92562306a36Sopenharmony_ci};
92662306a36Sopenharmony_ci
92762306a36Sopenharmony_ci/**
92862306a36Sopenharmony_ci * struct ionic_txq_comp - Ethernet transmit queue completion descriptor
92962306a36Sopenharmony_ci * @status:     Status of the command (enum ionic_status_code)
93062306a36Sopenharmony_ci * @comp_index: Index in the descriptor ring for which this is the completion
93162306a36Sopenharmony_ci * @color:      Color bit
93262306a36Sopenharmony_ci */
93362306a36Sopenharmony_cistruct ionic_txq_comp {
93462306a36Sopenharmony_ci	u8     status;
93562306a36Sopenharmony_ci	u8     rsvd;
93662306a36Sopenharmony_ci	__le16 comp_index;
93762306a36Sopenharmony_ci	u8     rsvd2[11];
93862306a36Sopenharmony_ci	u8     color;
93962306a36Sopenharmony_ci};
94062306a36Sopenharmony_ci
94162306a36Sopenharmony_cienum ionic_rxq_desc_opcode {
94262306a36Sopenharmony_ci	IONIC_RXQ_DESC_OPCODE_SIMPLE = 0,
94362306a36Sopenharmony_ci	IONIC_RXQ_DESC_OPCODE_SG = 1,
94462306a36Sopenharmony_ci};
94562306a36Sopenharmony_ci
94662306a36Sopenharmony_ci/**
94762306a36Sopenharmony_ci * struct ionic_rxq_desc - Ethernet Rx queue descriptor format
94862306a36Sopenharmony_ci * @opcode:       Rx operation, see IONIC_RXQ_DESC_OPCODE_*:
94962306a36Sopenharmony_ci *
95062306a36Sopenharmony_ci *                   IONIC_RXQ_DESC_OPCODE_SIMPLE:
95162306a36Sopenharmony_ci *                      Receive full packet into data buffer
95262306a36Sopenharmony_ci *                      starting at @addr.  Results of
95362306a36Sopenharmony_ci *                      receive, including actual bytes received,
95462306a36Sopenharmony_ci *                      are recorded in Rx completion descriptor.
95562306a36Sopenharmony_ci *
95662306a36Sopenharmony_ci * @len:          Data buffer's length, in bytes
95762306a36Sopenharmony_ci * @addr:         Data buffer's DMA address
95862306a36Sopenharmony_ci */
95962306a36Sopenharmony_cistruct ionic_rxq_desc {
96062306a36Sopenharmony_ci	u8     opcode;
96162306a36Sopenharmony_ci	u8     rsvd[5];
96262306a36Sopenharmony_ci	__le16 len;
96362306a36Sopenharmony_ci	__le64 addr;
96462306a36Sopenharmony_ci};
96562306a36Sopenharmony_ci
96662306a36Sopenharmony_ci/**
96762306a36Sopenharmony_ci * struct ionic_rxq_sg_elem - Receive scatter-gather (SG) descriptor element
96862306a36Sopenharmony_ci * @addr:      DMA address of SG element data buffer
96962306a36Sopenharmony_ci * @len:       Length of SG element data buffer, in bytes
97062306a36Sopenharmony_ci */
97162306a36Sopenharmony_cistruct ionic_rxq_sg_elem {
97262306a36Sopenharmony_ci	__le64 addr;
97362306a36Sopenharmony_ci	__le16 len;
97462306a36Sopenharmony_ci	__le16 rsvd[3];
97562306a36Sopenharmony_ci};
97662306a36Sopenharmony_ci
97762306a36Sopenharmony_ci/**
97862306a36Sopenharmony_ci * struct ionic_rxq_sg_desc - Receive scatter-gather (SG) list
97962306a36Sopenharmony_ci * @elems:     Scatter-gather elements
98062306a36Sopenharmony_ci */
98162306a36Sopenharmony_cistruct ionic_rxq_sg_desc {
98262306a36Sopenharmony_ci#define IONIC_RX_MAX_SG_ELEMS		8
98362306a36Sopenharmony_ci#define IONIC_RX_SG_DESC_STRIDE		8
98462306a36Sopenharmony_ci	struct ionic_rxq_sg_elem elems[IONIC_RX_SG_DESC_STRIDE];
98562306a36Sopenharmony_ci};
98662306a36Sopenharmony_ci
98762306a36Sopenharmony_ci/**
98862306a36Sopenharmony_ci * struct ionic_rxq_comp - Ethernet receive queue completion descriptor
98962306a36Sopenharmony_ci * @status:       Status of the command (enum ionic_status_code)
99062306a36Sopenharmony_ci * @num_sg_elems: Number of SG elements used by this descriptor
99162306a36Sopenharmony_ci * @comp_index:   Index in the descriptor ring for which this is the completion
99262306a36Sopenharmony_ci * @rss_hash:     32-bit RSS hash
99362306a36Sopenharmony_ci * @csum:         16-bit sum of the packet's L2 payload
99462306a36Sopenharmony_ci *                If the packet's L2 payload is odd length, an extra
99562306a36Sopenharmony_ci *                zero-value byte is included in the @csum calculation but
99662306a36Sopenharmony_ci *                not included in @len.
99762306a36Sopenharmony_ci * @vlan_tci:     VLAN tag stripped from the packet.  Valid if @VLAN is
99862306a36Sopenharmony_ci *                set.  Includes .1p and .1q tags.
99962306a36Sopenharmony_ci * @len:          Received packet length, in bytes.  Excludes FCS.
100062306a36Sopenharmony_ci * @csum_calc     L2 payload checksum is computed or not
100162306a36Sopenharmony_ci * @csum_flags:   See IONIC_RXQ_COMP_CSUM_F_*:
100262306a36Sopenharmony_ci *
100362306a36Sopenharmony_ci *                  IONIC_RXQ_COMP_CSUM_F_TCP_OK:
100462306a36Sopenharmony_ci *                    The TCP checksum calculated by the device
100562306a36Sopenharmony_ci *                    matched the checksum in the receive packet's
100662306a36Sopenharmony_ci *                    TCP header.
100762306a36Sopenharmony_ci *
100862306a36Sopenharmony_ci *                  IONIC_RXQ_COMP_CSUM_F_TCP_BAD:
100962306a36Sopenharmony_ci *                    The TCP checksum calculated by the device did
101062306a36Sopenharmony_ci *                    not match the checksum in the receive packet's
101162306a36Sopenharmony_ci *                    TCP header.
101262306a36Sopenharmony_ci *
101362306a36Sopenharmony_ci *                  IONIC_RXQ_COMP_CSUM_F_UDP_OK:
101462306a36Sopenharmony_ci *                    The UDP checksum calculated by the device
101562306a36Sopenharmony_ci *                    matched the checksum in the receive packet's
101662306a36Sopenharmony_ci *                    UDP header
101762306a36Sopenharmony_ci *
101862306a36Sopenharmony_ci *                  IONIC_RXQ_COMP_CSUM_F_UDP_BAD:
101962306a36Sopenharmony_ci *                    The UDP checksum calculated by the device did
102062306a36Sopenharmony_ci *                    not match the checksum in the receive packet's
102162306a36Sopenharmony_ci *                    UDP header.
102262306a36Sopenharmony_ci *
102362306a36Sopenharmony_ci *                  IONIC_RXQ_COMP_CSUM_F_IP_OK:
102462306a36Sopenharmony_ci *                    The IPv4 checksum calculated by the device
102562306a36Sopenharmony_ci *                    matched the checksum in the receive packet's
102662306a36Sopenharmony_ci *                    first IPv4 header.  If the receive packet
102762306a36Sopenharmony_ci *                    contains both a tunnel IPv4 header and a
102862306a36Sopenharmony_ci *                    transport IPv4 header, the device validates the
102962306a36Sopenharmony_ci *                    checksum for the both IPv4 headers.
103062306a36Sopenharmony_ci *
103162306a36Sopenharmony_ci *                  IONIC_RXQ_COMP_CSUM_F_IP_BAD:
103262306a36Sopenharmony_ci *                    The IPv4 checksum calculated by the device did
103362306a36Sopenharmony_ci *                    not match the checksum in the receive packet's
103462306a36Sopenharmony_ci *                    first IPv4 header. If the receive packet
103562306a36Sopenharmony_ci *                    contains both a tunnel IPv4 header and a
103662306a36Sopenharmony_ci *                    transport IPv4 header, the device validates the
103762306a36Sopenharmony_ci *                    checksum for both IP headers.
103862306a36Sopenharmony_ci *
103962306a36Sopenharmony_ci *                  IONIC_RXQ_COMP_CSUM_F_VLAN:
104062306a36Sopenharmony_ci *                    The VLAN header was stripped and placed in @vlan_tci.
104162306a36Sopenharmony_ci *
104262306a36Sopenharmony_ci *                  IONIC_RXQ_COMP_CSUM_F_CALC:
104362306a36Sopenharmony_ci *                    The checksum was calculated by the device.
104462306a36Sopenharmony_ci *
104562306a36Sopenharmony_ci * @pkt_type_color: Packet type and color bit; see IONIC_RXQ_COMP_PKT_TYPE_MASK
104662306a36Sopenharmony_ci */
104762306a36Sopenharmony_cistruct ionic_rxq_comp {
104862306a36Sopenharmony_ci	u8     status;
104962306a36Sopenharmony_ci	u8     num_sg_elems;
105062306a36Sopenharmony_ci	__le16 comp_index;
105162306a36Sopenharmony_ci	__le32 rss_hash;
105262306a36Sopenharmony_ci	__le16 csum;
105362306a36Sopenharmony_ci	__le16 vlan_tci;
105462306a36Sopenharmony_ci	__le16 len;
105562306a36Sopenharmony_ci	u8     csum_flags;
105662306a36Sopenharmony_ci#define IONIC_RXQ_COMP_CSUM_F_TCP_OK	0x01
105762306a36Sopenharmony_ci#define IONIC_RXQ_COMP_CSUM_F_TCP_BAD	0x02
105862306a36Sopenharmony_ci#define IONIC_RXQ_COMP_CSUM_F_UDP_OK	0x04
105962306a36Sopenharmony_ci#define IONIC_RXQ_COMP_CSUM_F_UDP_BAD	0x08
106062306a36Sopenharmony_ci#define IONIC_RXQ_COMP_CSUM_F_IP_OK	0x10
106162306a36Sopenharmony_ci#define IONIC_RXQ_COMP_CSUM_F_IP_BAD	0x20
106262306a36Sopenharmony_ci#define IONIC_RXQ_COMP_CSUM_F_VLAN	0x40
106362306a36Sopenharmony_ci#define IONIC_RXQ_COMP_CSUM_F_CALC	0x80
106462306a36Sopenharmony_ci	u8     pkt_type_color;
106562306a36Sopenharmony_ci#define IONIC_RXQ_COMP_PKT_TYPE_MASK	0x7f
106662306a36Sopenharmony_ci};
106762306a36Sopenharmony_ci
106862306a36Sopenharmony_cienum ionic_pkt_type {
106962306a36Sopenharmony_ci	IONIC_PKT_TYPE_NON_IP		= 0x00,
107062306a36Sopenharmony_ci	IONIC_PKT_TYPE_IPV4		= 0x01,
107162306a36Sopenharmony_ci	IONIC_PKT_TYPE_IPV4_TCP		= 0x03,
107262306a36Sopenharmony_ci	IONIC_PKT_TYPE_IPV4_UDP		= 0x05,
107362306a36Sopenharmony_ci	IONIC_PKT_TYPE_IPV6		= 0x08,
107462306a36Sopenharmony_ci	IONIC_PKT_TYPE_IPV6_TCP		= 0x18,
107562306a36Sopenharmony_ci	IONIC_PKT_TYPE_IPV6_UDP		= 0x28,
107662306a36Sopenharmony_ci	/* below types are only used if encap offloads are enabled on lif */
107762306a36Sopenharmony_ci	IONIC_PKT_TYPE_ENCAP_NON_IP	= 0x40,
107862306a36Sopenharmony_ci	IONIC_PKT_TYPE_ENCAP_IPV4	= 0x41,
107962306a36Sopenharmony_ci	IONIC_PKT_TYPE_ENCAP_IPV4_TCP	= 0x43,
108062306a36Sopenharmony_ci	IONIC_PKT_TYPE_ENCAP_IPV4_UDP	= 0x45,
108162306a36Sopenharmony_ci	IONIC_PKT_TYPE_ENCAP_IPV6	= 0x48,
108262306a36Sopenharmony_ci	IONIC_PKT_TYPE_ENCAP_IPV6_TCP	= 0x58,
108362306a36Sopenharmony_ci	IONIC_PKT_TYPE_ENCAP_IPV6_UDP	= 0x68,
108462306a36Sopenharmony_ci};
108562306a36Sopenharmony_ci
108662306a36Sopenharmony_cienum ionic_eth_hw_features {
108762306a36Sopenharmony_ci	IONIC_ETH_HW_VLAN_TX_TAG	= BIT(0),
108862306a36Sopenharmony_ci	IONIC_ETH_HW_VLAN_RX_STRIP	= BIT(1),
108962306a36Sopenharmony_ci	IONIC_ETH_HW_VLAN_RX_FILTER	= BIT(2),
109062306a36Sopenharmony_ci	IONIC_ETH_HW_RX_HASH		= BIT(3),
109162306a36Sopenharmony_ci	IONIC_ETH_HW_RX_CSUM		= BIT(4),
109262306a36Sopenharmony_ci	IONIC_ETH_HW_TX_SG		= BIT(5),
109362306a36Sopenharmony_ci	IONIC_ETH_HW_RX_SG		= BIT(6),
109462306a36Sopenharmony_ci	IONIC_ETH_HW_TX_CSUM		= BIT(7),
109562306a36Sopenharmony_ci	IONIC_ETH_HW_TSO		= BIT(8),
109662306a36Sopenharmony_ci	IONIC_ETH_HW_TSO_IPV6		= BIT(9),
109762306a36Sopenharmony_ci	IONIC_ETH_HW_TSO_ECN		= BIT(10),
109862306a36Sopenharmony_ci	IONIC_ETH_HW_TSO_GRE		= BIT(11),
109962306a36Sopenharmony_ci	IONIC_ETH_HW_TSO_GRE_CSUM	= BIT(12),
110062306a36Sopenharmony_ci	IONIC_ETH_HW_TSO_IPXIP4		= BIT(13),
110162306a36Sopenharmony_ci	IONIC_ETH_HW_TSO_IPXIP6		= BIT(14),
110262306a36Sopenharmony_ci	IONIC_ETH_HW_TSO_UDP		= BIT(15),
110362306a36Sopenharmony_ci	IONIC_ETH_HW_TSO_UDP_CSUM	= BIT(16),
110462306a36Sopenharmony_ci	IONIC_ETH_HW_RX_CSUM_GENEVE	= BIT(17),
110562306a36Sopenharmony_ci	IONIC_ETH_HW_TX_CSUM_GENEVE	= BIT(18),
110662306a36Sopenharmony_ci	IONIC_ETH_HW_TSO_GENEVE		= BIT(19),
110762306a36Sopenharmony_ci	IONIC_ETH_HW_TIMESTAMP		= BIT(20),
110862306a36Sopenharmony_ci};
110962306a36Sopenharmony_ci
111062306a36Sopenharmony_ci/**
111162306a36Sopenharmony_ci * enum ionic_pkt_class - Packet classification mask.
111262306a36Sopenharmony_ci *
111362306a36Sopenharmony_ci * Used with rx steering filter, packets indicated by the mask can be steered
111462306a36Sopenharmony_ci * toward a specific receive queue.
111562306a36Sopenharmony_ci *
111662306a36Sopenharmony_ci * @IONIC_PKT_CLS_NTP_ALL:          All NTP packets.
111762306a36Sopenharmony_ci * @IONIC_PKT_CLS_PTP1_SYNC:        PTPv1 sync
111862306a36Sopenharmony_ci * @IONIC_PKT_CLS_PTP1_DREQ:        PTPv1 delay-request
111962306a36Sopenharmony_ci * @IONIC_PKT_CLS_PTP1_ALL:         PTPv1 all packets
112062306a36Sopenharmony_ci * @IONIC_PKT_CLS_PTP2_L4_SYNC:     PTPv2-UDP sync
112162306a36Sopenharmony_ci * @IONIC_PKT_CLS_PTP2_L4_DREQ:     PTPv2-UDP delay-request
112262306a36Sopenharmony_ci * @IONIC_PKT_CLS_PTP2_L4_ALL:      PTPv2-UDP all packets
112362306a36Sopenharmony_ci * @IONIC_PKT_CLS_PTP2_L2_SYNC:     PTPv2-ETH sync
112462306a36Sopenharmony_ci * @IONIC_PKT_CLS_PTP2_L2_DREQ:     PTPv2-ETH delay-request
112562306a36Sopenharmony_ci * @IONIC_PKT_CLS_PTP2_L2_ALL:      PTPv2-ETH all packets
112662306a36Sopenharmony_ci * @IONIC_PKT_CLS_PTP2_SYNC:        PTPv2 sync
112762306a36Sopenharmony_ci * @IONIC_PKT_CLS_PTP2_DREQ:        PTPv2 delay-request
112862306a36Sopenharmony_ci * @IONIC_PKT_CLS_PTP2_ALL:         PTPv2 all packets
112962306a36Sopenharmony_ci * @IONIC_PKT_CLS_PTP_SYNC:         PTP sync
113062306a36Sopenharmony_ci * @IONIC_PKT_CLS_PTP_DREQ:         PTP delay-request
113162306a36Sopenharmony_ci * @IONIC_PKT_CLS_PTP_ALL:          PTP all packets
113262306a36Sopenharmony_ci */
113362306a36Sopenharmony_cienum ionic_pkt_class {
113462306a36Sopenharmony_ci	IONIC_PKT_CLS_NTP_ALL		= BIT(0),
113562306a36Sopenharmony_ci
113662306a36Sopenharmony_ci	IONIC_PKT_CLS_PTP1_SYNC		= BIT(1),
113762306a36Sopenharmony_ci	IONIC_PKT_CLS_PTP1_DREQ		= BIT(2),
113862306a36Sopenharmony_ci	IONIC_PKT_CLS_PTP1_ALL		= BIT(3) |
113962306a36Sopenharmony_ci		IONIC_PKT_CLS_PTP1_SYNC | IONIC_PKT_CLS_PTP1_DREQ,
114062306a36Sopenharmony_ci
114162306a36Sopenharmony_ci	IONIC_PKT_CLS_PTP2_L4_SYNC	= BIT(4),
114262306a36Sopenharmony_ci	IONIC_PKT_CLS_PTP2_L4_DREQ	= BIT(5),
114362306a36Sopenharmony_ci	IONIC_PKT_CLS_PTP2_L4_ALL	= BIT(6) |
114462306a36Sopenharmony_ci		IONIC_PKT_CLS_PTP2_L4_SYNC | IONIC_PKT_CLS_PTP2_L4_DREQ,
114562306a36Sopenharmony_ci
114662306a36Sopenharmony_ci	IONIC_PKT_CLS_PTP2_L2_SYNC	= BIT(7),
114762306a36Sopenharmony_ci	IONIC_PKT_CLS_PTP2_L2_DREQ	= BIT(8),
114862306a36Sopenharmony_ci	IONIC_PKT_CLS_PTP2_L2_ALL	= BIT(9) |
114962306a36Sopenharmony_ci		IONIC_PKT_CLS_PTP2_L2_SYNC | IONIC_PKT_CLS_PTP2_L2_DREQ,
115062306a36Sopenharmony_ci
115162306a36Sopenharmony_ci	IONIC_PKT_CLS_PTP2_SYNC		=
115262306a36Sopenharmony_ci		IONIC_PKT_CLS_PTP2_L4_SYNC | IONIC_PKT_CLS_PTP2_L2_SYNC,
115362306a36Sopenharmony_ci	IONIC_PKT_CLS_PTP2_DREQ		=
115462306a36Sopenharmony_ci		IONIC_PKT_CLS_PTP2_L4_DREQ | IONIC_PKT_CLS_PTP2_L2_DREQ,
115562306a36Sopenharmony_ci	IONIC_PKT_CLS_PTP2_ALL		=
115662306a36Sopenharmony_ci		IONIC_PKT_CLS_PTP2_L4_ALL | IONIC_PKT_CLS_PTP2_L2_ALL,
115762306a36Sopenharmony_ci
115862306a36Sopenharmony_ci	IONIC_PKT_CLS_PTP_SYNC		=
115962306a36Sopenharmony_ci		IONIC_PKT_CLS_PTP1_SYNC | IONIC_PKT_CLS_PTP2_SYNC,
116062306a36Sopenharmony_ci	IONIC_PKT_CLS_PTP_DREQ		=
116162306a36Sopenharmony_ci		IONIC_PKT_CLS_PTP1_DREQ | IONIC_PKT_CLS_PTP2_DREQ,
116262306a36Sopenharmony_ci	IONIC_PKT_CLS_PTP_ALL		=
116362306a36Sopenharmony_ci		IONIC_PKT_CLS_PTP1_ALL | IONIC_PKT_CLS_PTP2_ALL,
116462306a36Sopenharmony_ci};
116562306a36Sopenharmony_ci
116662306a36Sopenharmony_ci/**
116762306a36Sopenharmony_ci * struct ionic_q_control_cmd - Queue control command
116862306a36Sopenharmony_ci * @opcode:     opcode
116962306a36Sopenharmony_ci * @type:       Queue type
117062306a36Sopenharmony_ci * @lif_index:  LIF index
117162306a36Sopenharmony_ci * @index:      Queue index
117262306a36Sopenharmony_ci * @oper:       Operation (enum ionic_q_control_oper)
117362306a36Sopenharmony_ci */
117462306a36Sopenharmony_cistruct ionic_q_control_cmd {
117562306a36Sopenharmony_ci	u8     opcode;
117662306a36Sopenharmony_ci	u8     type;
117762306a36Sopenharmony_ci	__le16 lif_index;
117862306a36Sopenharmony_ci	__le32 index;
117962306a36Sopenharmony_ci	u8     oper;
118062306a36Sopenharmony_ci	u8     rsvd[55];
118162306a36Sopenharmony_ci};
118262306a36Sopenharmony_ci
118362306a36Sopenharmony_citypedef struct ionic_admin_comp ionic_q_control_comp;
118462306a36Sopenharmony_ci
118562306a36Sopenharmony_cienum q_control_oper {
118662306a36Sopenharmony_ci	IONIC_Q_DISABLE		= 0,
118762306a36Sopenharmony_ci	IONIC_Q_ENABLE		= 1,
118862306a36Sopenharmony_ci	IONIC_Q_HANG_RESET	= 2,
118962306a36Sopenharmony_ci};
119062306a36Sopenharmony_ci
119162306a36Sopenharmony_ci/**
119262306a36Sopenharmony_ci * enum ionic_phy_type - Physical connection type
119362306a36Sopenharmony_ci * @IONIC_PHY_TYPE_NONE:    No PHY installed
119462306a36Sopenharmony_ci * @IONIC_PHY_TYPE_COPPER:  Copper PHY
119562306a36Sopenharmony_ci * @IONIC_PHY_TYPE_FIBER:   Fiber PHY
119662306a36Sopenharmony_ci */
119762306a36Sopenharmony_cienum ionic_phy_type {
119862306a36Sopenharmony_ci	IONIC_PHY_TYPE_NONE	= 0,
119962306a36Sopenharmony_ci	IONIC_PHY_TYPE_COPPER	= 1,
120062306a36Sopenharmony_ci	IONIC_PHY_TYPE_FIBER	= 2,
120162306a36Sopenharmony_ci};
120262306a36Sopenharmony_ci
120362306a36Sopenharmony_ci/**
120462306a36Sopenharmony_ci * enum ionic_xcvr_state - Transceiver status
120562306a36Sopenharmony_ci * @IONIC_XCVR_STATE_REMOVED:        Transceiver removed
120662306a36Sopenharmony_ci * @IONIC_XCVR_STATE_INSERTED:       Transceiver inserted
120762306a36Sopenharmony_ci * @IONIC_XCVR_STATE_PENDING:        Transceiver pending
120862306a36Sopenharmony_ci * @IONIC_XCVR_STATE_SPROM_READ:     Transceiver data read
120962306a36Sopenharmony_ci * @IONIC_XCVR_STATE_SPROM_READ_ERR: Transceiver data read error
121062306a36Sopenharmony_ci */
121162306a36Sopenharmony_cienum ionic_xcvr_state {
121262306a36Sopenharmony_ci	IONIC_XCVR_STATE_REMOVED	 = 0,
121362306a36Sopenharmony_ci	IONIC_XCVR_STATE_INSERTED	 = 1,
121462306a36Sopenharmony_ci	IONIC_XCVR_STATE_PENDING	 = 2,
121562306a36Sopenharmony_ci	IONIC_XCVR_STATE_SPROM_READ	 = 3,
121662306a36Sopenharmony_ci	IONIC_XCVR_STATE_SPROM_READ_ERR	 = 4,
121762306a36Sopenharmony_ci};
121862306a36Sopenharmony_ci
121962306a36Sopenharmony_ci/**
122062306a36Sopenharmony_ci * enum ionic_xcvr_pid - Supported link modes
122162306a36Sopenharmony_ci */
122262306a36Sopenharmony_cienum ionic_xcvr_pid {
122362306a36Sopenharmony_ci	IONIC_XCVR_PID_UNKNOWN           = 0,
122462306a36Sopenharmony_ci
122562306a36Sopenharmony_ci	/* CU */
122662306a36Sopenharmony_ci	IONIC_XCVR_PID_QSFP_100G_CR4     = 1,
122762306a36Sopenharmony_ci	IONIC_XCVR_PID_QSFP_40GBASE_CR4  = 2,
122862306a36Sopenharmony_ci	IONIC_XCVR_PID_SFP_25GBASE_CR_S  = 3,
122962306a36Sopenharmony_ci	IONIC_XCVR_PID_SFP_25GBASE_CR_L  = 4,
123062306a36Sopenharmony_ci	IONIC_XCVR_PID_SFP_25GBASE_CR_N  = 5,
123162306a36Sopenharmony_ci
123262306a36Sopenharmony_ci	/* Fiber */
123362306a36Sopenharmony_ci	IONIC_XCVR_PID_QSFP_100G_AOC    = 50,
123462306a36Sopenharmony_ci	IONIC_XCVR_PID_QSFP_100G_ACC    = 51,
123562306a36Sopenharmony_ci	IONIC_XCVR_PID_QSFP_100G_SR4    = 52,
123662306a36Sopenharmony_ci	IONIC_XCVR_PID_QSFP_100G_LR4    = 53,
123762306a36Sopenharmony_ci	IONIC_XCVR_PID_QSFP_100G_ER4    = 54,
123862306a36Sopenharmony_ci	IONIC_XCVR_PID_QSFP_40GBASE_ER4 = 55,
123962306a36Sopenharmony_ci	IONIC_XCVR_PID_QSFP_40GBASE_SR4 = 56,
124062306a36Sopenharmony_ci	IONIC_XCVR_PID_QSFP_40GBASE_LR4 = 57,
124162306a36Sopenharmony_ci	IONIC_XCVR_PID_QSFP_40GBASE_AOC = 58,
124262306a36Sopenharmony_ci	IONIC_XCVR_PID_SFP_25GBASE_SR   = 59,
124362306a36Sopenharmony_ci	IONIC_XCVR_PID_SFP_25GBASE_LR   = 60,
124462306a36Sopenharmony_ci	IONIC_XCVR_PID_SFP_25GBASE_ER   = 61,
124562306a36Sopenharmony_ci	IONIC_XCVR_PID_SFP_25GBASE_AOC  = 62,
124662306a36Sopenharmony_ci	IONIC_XCVR_PID_SFP_10GBASE_SR   = 63,
124762306a36Sopenharmony_ci	IONIC_XCVR_PID_SFP_10GBASE_LR   = 64,
124862306a36Sopenharmony_ci	IONIC_XCVR_PID_SFP_10GBASE_LRM  = 65,
124962306a36Sopenharmony_ci	IONIC_XCVR_PID_SFP_10GBASE_ER   = 66,
125062306a36Sopenharmony_ci	IONIC_XCVR_PID_SFP_10GBASE_AOC  = 67,
125162306a36Sopenharmony_ci	IONIC_XCVR_PID_SFP_10GBASE_CU   = 68,
125262306a36Sopenharmony_ci	IONIC_XCVR_PID_QSFP_100G_CWDM4  = 69,
125362306a36Sopenharmony_ci	IONIC_XCVR_PID_QSFP_100G_PSM4   = 70,
125462306a36Sopenharmony_ci	IONIC_XCVR_PID_SFP_25GBASE_ACC  = 71,
125562306a36Sopenharmony_ci	IONIC_XCVR_PID_SFP_10GBASE_T    = 72,
125662306a36Sopenharmony_ci	IONIC_XCVR_PID_SFP_1000BASE_T   = 73,
125762306a36Sopenharmony_ci};
125862306a36Sopenharmony_ci
125962306a36Sopenharmony_ci/**
126062306a36Sopenharmony_ci * enum ionic_port_type - Port types
126162306a36Sopenharmony_ci * @IONIC_PORT_TYPE_NONE:           Port type not configured
126262306a36Sopenharmony_ci * @IONIC_PORT_TYPE_ETH:            Port carries ethernet traffic (inband)
126362306a36Sopenharmony_ci * @IONIC_PORT_TYPE_MGMT:           Port carries mgmt traffic (out-of-band)
126462306a36Sopenharmony_ci */
126562306a36Sopenharmony_cienum ionic_port_type {
126662306a36Sopenharmony_ci	IONIC_PORT_TYPE_NONE = 0,
126762306a36Sopenharmony_ci	IONIC_PORT_TYPE_ETH  = 1,
126862306a36Sopenharmony_ci	IONIC_PORT_TYPE_MGMT = 2,
126962306a36Sopenharmony_ci};
127062306a36Sopenharmony_ci
127162306a36Sopenharmony_ci/**
127262306a36Sopenharmony_ci * enum ionic_port_admin_state - Port config state
127362306a36Sopenharmony_ci * @IONIC_PORT_ADMIN_STATE_NONE:    Port admin state not configured
127462306a36Sopenharmony_ci * @IONIC_PORT_ADMIN_STATE_DOWN:    Port admin disabled
127562306a36Sopenharmony_ci * @IONIC_PORT_ADMIN_STATE_UP:      Port admin enabled
127662306a36Sopenharmony_ci */
127762306a36Sopenharmony_cienum ionic_port_admin_state {
127862306a36Sopenharmony_ci	IONIC_PORT_ADMIN_STATE_NONE = 0,
127962306a36Sopenharmony_ci	IONIC_PORT_ADMIN_STATE_DOWN = 1,
128062306a36Sopenharmony_ci	IONIC_PORT_ADMIN_STATE_UP   = 2,
128162306a36Sopenharmony_ci};
128262306a36Sopenharmony_ci
128362306a36Sopenharmony_ci/**
128462306a36Sopenharmony_ci * enum ionic_port_oper_status - Port operational status
128562306a36Sopenharmony_ci * @IONIC_PORT_OPER_STATUS_NONE:    Port disabled
128662306a36Sopenharmony_ci * @IONIC_PORT_OPER_STATUS_UP:      Port link status up
128762306a36Sopenharmony_ci * @IONIC_PORT_OPER_STATUS_DOWN:    Port link status down
128862306a36Sopenharmony_ci */
128962306a36Sopenharmony_cienum ionic_port_oper_status {
129062306a36Sopenharmony_ci	IONIC_PORT_OPER_STATUS_NONE  = 0,
129162306a36Sopenharmony_ci	IONIC_PORT_OPER_STATUS_UP    = 1,
129262306a36Sopenharmony_ci	IONIC_PORT_OPER_STATUS_DOWN  = 2,
129362306a36Sopenharmony_ci};
129462306a36Sopenharmony_ci
129562306a36Sopenharmony_ci/**
129662306a36Sopenharmony_ci * enum ionic_port_fec_type - Ethernet Forward error correction (FEC) modes
129762306a36Sopenharmony_ci * @IONIC_PORT_FEC_TYPE_NONE:       FEC Disabled
129862306a36Sopenharmony_ci * @IONIC_PORT_FEC_TYPE_FC:         FireCode FEC
129962306a36Sopenharmony_ci * @IONIC_PORT_FEC_TYPE_RS:         ReedSolomon FEC
130062306a36Sopenharmony_ci */
130162306a36Sopenharmony_cienum ionic_port_fec_type {
130262306a36Sopenharmony_ci	IONIC_PORT_FEC_TYPE_NONE = 0,
130362306a36Sopenharmony_ci	IONIC_PORT_FEC_TYPE_FC   = 1,
130462306a36Sopenharmony_ci	IONIC_PORT_FEC_TYPE_RS   = 2,
130562306a36Sopenharmony_ci};
130662306a36Sopenharmony_ci
130762306a36Sopenharmony_ci/**
130862306a36Sopenharmony_ci * enum ionic_port_pause_type - Ethernet pause (flow control) modes
130962306a36Sopenharmony_ci * @IONIC_PORT_PAUSE_TYPE_NONE:     Disable Pause
131062306a36Sopenharmony_ci * @IONIC_PORT_PAUSE_TYPE_LINK:     Link level pause
131162306a36Sopenharmony_ci * @IONIC_PORT_PAUSE_TYPE_PFC:      Priority-Flow Control
131262306a36Sopenharmony_ci */
131362306a36Sopenharmony_cienum ionic_port_pause_type {
131462306a36Sopenharmony_ci	IONIC_PORT_PAUSE_TYPE_NONE = 0,
131562306a36Sopenharmony_ci	IONIC_PORT_PAUSE_TYPE_LINK = 1,
131662306a36Sopenharmony_ci	IONIC_PORT_PAUSE_TYPE_PFC  = 2,
131762306a36Sopenharmony_ci};
131862306a36Sopenharmony_ci
131962306a36Sopenharmony_ci/**
132062306a36Sopenharmony_ci * enum ionic_port_loopback_mode - Loopback modes
132162306a36Sopenharmony_ci * @IONIC_PORT_LOOPBACK_MODE_NONE:  Disable loopback
132262306a36Sopenharmony_ci * @IONIC_PORT_LOOPBACK_MODE_MAC:   MAC loopback
132362306a36Sopenharmony_ci * @IONIC_PORT_LOOPBACK_MODE_PHY:   PHY/SerDes loopback
132462306a36Sopenharmony_ci */
132562306a36Sopenharmony_cienum ionic_port_loopback_mode {
132662306a36Sopenharmony_ci	IONIC_PORT_LOOPBACK_MODE_NONE = 0,
132762306a36Sopenharmony_ci	IONIC_PORT_LOOPBACK_MODE_MAC  = 1,
132862306a36Sopenharmony_ci	IONIC_PORT_LOOPBACK_MODE_PHY  = 2,
132962306a36Sopenharmony_ci};
133062306a36Sopenharmony_ci
133162306a36Sopenharmony_ci/**
133262306a36Sopenharmony_ci * struct ionic_xcvr_status - Transceiver Status information
133362306a36Sopenharmony_ci * @state:    Transceiver status (enum ionic_xcvr_state)
133462306a36Sopenharmony_ci * @phy:      Physical connection type (enum ionic_phy_type)
133562306a36Sopenharmony_ci * @pid:      Transceiver link mode (enum ionic_xcvr_pid)
133662306a36Sopenharmony_ci * @sprom:    Transceiver sprom contents
133762306a36Sopenharmony_ci */
133862306a36Sopenharmony_cistruct ionic_xcvr_status {
133962306a36Sopenharmony_ci	u8     state;
134062306a36Sopenharmony_ci	u8     phy;
134162306a36Sopenharmony_ci	__le16 pid;
134262306a36Sopenharmony_ci	u8     sprom[256];
134362306a36Sopenharmony_ci};
134462306a36Sopenharmony_ci
134562306a36Sopenharmony_ci/**
134662306a36Sopenharmony_ci * union ionic_port_config - Port configuration
134762306a36Sopenharmony_ci * @speed:              port speed (in Mbps)
134862306a36Sopenharmony_ci * @mtu:                mtu
134962306a36Sopenharmony_ci * @state:              port admin state (enum ionic_port_admin_state)
135062306a36Sopenharmony_ci * @an_enable:          autoneg enable
135162306a36Sopenharmony_ci * @fec_type:           fec type (enum ionic_port_fec_type)
135262306a36Sopenharmony_ci * @pause_type:         pause type (enum ionic_port_pause_type)
135362306a36Sopenharmony_ci * @loopback_mode:      loopback mode (enum ionic_port_loopback_mode)
135462306a36Sopenharmony_ci */
135562306a36Sopenharmony_ciunion ionic_port_config {
135662306a36Sopenharmony_ci	struct {
135762306a36Sopenharmony_ci#define IONIC_SPEED_100G	100000	/* 100G in Mbps */
135862306a36Sopenharmony_ci#define IONIC_SPEED_50G		50000	/* 50G in Mbps */
135962306a36Sopenharmony_ci#define IONIC_SPEED_40G		40000	/* 40G in Mbps */
136062306a36Sopenharmony_ci#define IONIC_SPEED_25G		25000	/* 25G in Mbps */
136162306a36Sopenharmony_ci#define IONIC_SPEED_10G		10000	/* 10G in Mbps */
136262306a36Sopenharmony_ci#define IONIC_SPEED_1G		1000	/* 1G in Mbps */
136362306a36Sopenharmony_ci		__le32 speed;
136462306a36Sopenharmony_ci		__le32 mtu;
136562306a36Sopenharmony_ci		u8     state;
136662306a36Sopenharmony_ci		u8     an_enable;
136762306a36Sopenharmony_ci		u8     fec_type;
136862306a36Sopenharmony_ci#define IONIC_PAUSE_TYPE_MASK		0x0f
136962306a36Sopenharmony_ci#define IONIC_PAUSE_FLAGS_MASK		0xf0
137062306a36Sopenharmony_ci#define IONIC_PAUSE_F_TX		0x10
137162306a36Sopenharmony_ci#define IONIC_PAUSE_F_RX		0x20
137262306a36Sopenharmony_ci		u8     pause_type;
137362306a36Sopenharmony_ci		u8     loopback_mode;
137462306a36Sopenharmony_ci	};
137562306a36Sopenharmony_ci	__le32 words[64];
137662306a36Sopenharmony_ci};
137762306a36Sopenharmony_ci
137862306a36Sopenharmony_ci/**
137962306a36Sopenharmony_ci * struct ionic_port_status - Port Status information
138062306a36Sopenharmony_ci * @status:             link status (enum ionic_port_oper_status)
138162306a36Sopenharmony_ci * @id:                 port id
138262306a36Sopenharmony_ci * @speed:              link speed (in Mbps)
138362306a36Sopenharmony_ci * @link_down_count:    number of times link went from up to down
138462306a36Sopenharmony_ci * @fec_type:           fec type (enum ionic_port_fec_type)
138562306a36Sopenharmony_ci * @xcvr:               transceiver status
138662306a36Sopenharmony_ci */
138762306a36Sopenharmony_cistruct ionic_port_status {
138862306a36Sopenharmony_ci	__le32 id;
138962306a36Sopenharmony_ci	__le32 speed;
139062306a36Sopenharmony_ci	u8     status;
139162306a36Sopenharmony_ci	__le16 link_down_count;
139262306a36Sopenharmony_ci	u8     fec_type;
139362306a36Sopenharmony_ci	u8     rsvd[48];
139462306a36Sopenharmony_ci	struct ionic_xcvr_status  xcvr;
139562306a36Sopenharmony_ci} __packed;
139662306a36Sopenharmony_ci
139762306a36Sopenharmony_ci/**
139862306a36Sopenharmony_ci * struct ionic_port_identify_cmd - Port identify command
139962306a36Sopenharmony_ci * @opcode:     opcode
140062306a36Sopenharmony_ci * @index:      port index
140162306a36Sopenharmony_ci * @ver:        Highest version of identify supported by driver
140262306a36Sopenharmony_ci */
140362306a36Sopenharmony_cistruct ionic_port_identify_cmd {
140462306a36Sopenharmony_ci	u8 opcode;
140562306a36Sopenharmony_ci	u8 index;
140662306a36Sopenharmony_ci	u8 ver;
140762306a36Sopenharmony_ci	u8 rsvd[61];
140862306a36Sopenharmony_ci};
140962306a36Sopenharmony_ci
141062306a36Sopenharmony_ci/**
141162306a36Sopenharmony_ci * struct ionic_port_identify_comp - Port identify command completion
141262306a36Sopenharmony_ci * @status: Status of the command (enum ionic_status_code)
141362306a36Sopenharmony_ci * @ver:    Version of identify returned by device
141462306a36Sopenharmony_ci */
141562306a36Sopenharmony_cistruct ionic_port_identify_comp {
141662306a36Sopenharmony_ci	u8 status;
141762306a36Sopenharmony_ci	u8 ver;
141862306a36Sopenharmony_ci	u8 rsvd[14];
141962306a36Sopenharmony_ci};
142062306a36Sopenharmony_ci
142162306a36Sopenharmony_ci/**
142262306a36Sopenharmony_ci * struct ionic_port_init_cmd - Port initialization command
142362306a36Sopenharmony_ci * @opcode:     opcode
142462306a36Sopenharmony_ci * @index:      port index
142562306a36Sopenharmony_ci * @info_pa:    destination address for port info (struct ionic_port_info)
142662306a36Sopenharmony_ci */
142762306a36Sopenharmony_cistruct ionic_port_init_cmd {
142862306a36Sopenharmony_ci	u8     opcode;
142962306a36Sopenharmony_ci	u8     index;
143062306a36Sopenharmony_ci	u8     rsvd[6];
143162306a36Sopenharmony_ci	__le64 info_pa;
143262306a36Sopenharmony_ci	u8     rsvd2[48];
143362306a36Sopenharmony_ci};
143462306a36Sopenharmony_ci
143562306a36Sopenharmony_ci/**
143662306a36Sopenharmony_ci * struct ionic_port_init_comp - Port initialization command completion
143762306a36Sopenharmony_ci * @status: Status of the command (enum ionic_status_code)
143862306a36Sopenharmony_ci */
143962306a36Sopenharmony_cistruct ionic_port_init_comp {
144062306a36Sopenharmony_ci	u8 status;
144162306a36Sopenharmony_ci	u8 rsvd[15];
144262306a36Sopenharmony_ci};
144362306a36Sopenharmony_ci
144462306a36Sopenharmony_ci/**
144562306a36Sopenharmony_ci * struct ionic_port_reset_cmd - Port reset command
144662306a36Sopenharmony_ci * @opcode:     opcode
144762306a36Sopenharmony_ci * @index:      port index
144862306a36Sopenharmony_ci */
144962306a36Sopenharmony_cistruct ionic_port_reset_cmd {
145062306a36Sopenharmony_ci	u8 opcode;
145162306a36Sopenharmony_ci	u8 index;
145262306a36Sopenharmony_ci	u8 rsvd[62];
145362306a36Sopenharmony_ci};
145462306a36Sopenharmony_ci
145562306a36Sopenharmony_ci/**
145662306a36Sopenharmony_ci * struct ionic_port_reset_comp - Port reset command completion
145762306a36Sopenharmony_ci * @status: Status of the command (enum ionic_status_code)
145862306a36Sopenharmony_ci */
145962306a36Sopenharmony_cistruct ionic_port_reset_comp {
146062306a36Sopenharmony_ci	u8 status;
146162306a36Sopenharmony_ci	u8 rsvd[15];
146262306a36Sopenharmony_ci};
146362306a36Sopenharmony_ci
146462306a36Sopenharmony_ci/**
146562306a36Sopenharmony_ci * enum ionic_stats_ctl_cmd - List of commands for stats control
146662306a36Sopenharmony_ci * @IONIC_STATS_CTL_RESET:      Reset statistics
146762306a36Sopenharmony_ci */
146862306a36Sopenharmony_cienum ionic_stats_ctl_cmd {
146962306a36Sopenharmony_ci	IONIC_STATS_CTL_RESET		= 0,
147062306a36Sopenharmony_ci};
147162306a36Sopenharmony_ci
147262306a36Sopenharmony_ci/**
147362306a36Sopenharmony_ci * enum ionic_txstamp_mode - List of TX Timestamping Modes
147462306a36Sopenharmony_ci * @IONIC_TXSTAMP_OFF:           Disable TX hardware timetamping.
147562306a36Sopenharmony_ci * @IONIC_TXSTAMP_ON:            Enable local TX hardware timetamping.
147662306a36Sopenharmony_ci * @IONIC_TXSTAMP_ONESTEP_SYNC:  Modify TX PTP Sync packets.
147762306a36Sopenharmony_ci * @IONIC_TXSTAMP_ONESTEP_P2P:   Modify TX PTP Sync and PDelayResp.
147862306a36Sopenharmony_ci */
147962306a36Sopenharmony_cienum ionic_txstamp_mode {
148062306a36Sopenharmony_ci	IONIC_TXSTAMP_OFF		= 0,
148162306a36Sopenharmony_ci	IONIC_TXSTAMP_ON		= 1,
148262306a36Sopenharmony_ci	IONIC_TXSTAMP_ONESTEP_SYNC	= 2,
148362306a36Sopenharmony_ci	IONIC_TXSTAMP_ONESTEP_P2P	= 3,
148462306a36Sopenharmony_ci};
148562306a36Sopenharmony_ci
148662306a36Sopenharmony_ci/**
148762306a36Sopenharmony_ci * enum ionic_port_attr - List of device attributes
148862306a36Sopenharmony_ci * @IONIC_PORT_ATTR_STATE:      Port state attribute
148962306a36Sopenharmony_ci * @IONIC_PORT_ATTR_SPEED:      Port speed attribute
149062306a36Sopenharmony_ci * @IONIC_PORT_ATTR_MTU:        Port MTU attribute
149162306a36Sopenharmony_ci * @IONIC_PORT_ATTR_AUTONEG:    Port autonegotiation attribute
149262306a36Sopenharmony_ci * @IONIC_PORT_ATTR_FEC:        Port FEC attribute
149362306a36Sopenharmony_ci * @IONIC_PORT_ATTR_PAUSE:      Port pause attribute
149462306a36Sopenharmony_ci * @IONIC_PORT_ATTR_LOOPBACK:   Port loopback attribute
149562306a36Sopenharmony_ci * @IONIC_PORT_ATTR_STATS_CTRL: Port statistics control attribute
149662306a36Sopenharmony_ci */
149762306a36Sopenharmony_cienum ionic_port_attr {
149862306a36Sopenharmony_ci	IONIC_PORT_ATTR_STATE		= 0,
149962306a36Sopenharmony_ci	IONIC_PORT_ATTR_SPEED		= 1,
150062306a36Sopenharmony_ci	IONIC_PORT_ATTR_MTU		= 2,
150162306a36Sopenharmony_ci	IONIC_PORT_ATTR_AUTONEG		= 3,
150262306a36Sopenharmony_ci	IONIC_PORT_ATTR_FEC		= 4,
150362306a36Sopenharmony_ci	IONIC_PORT_ATTR_PAUSE		= 5,
150462306a36Sopenharmony_ci	IONIC_PORT_ATTR_LOOPBACK	= 6,
150562306a36Sopenharmony_ci	IONIC_PORT_ATTR_STATS_CTRL	= 7,
150662306a36Sopenharmony_ci};
150762306a36Sopenharmony_ci
150862306a36Sopenharmony_ci/**
150962306a36Sopenharmony_ci * struct ionic_port_setattr_cmd - Set port attributes on the NIC
151062306a36Sopenharmony_ci * @opcode:         Opcode
151162306a36Sopenharmony_ci * @index:          Port index
151262306a36Sopenharmony_ci * @attr:           Attribute type (enum ionic_port_attr)
151362306a36Sopenharmony_ci * @state:          Port state
151462306a36Sopenharmony_ci * @speed:          Port speed
151562306a36Sopenharmony_ci * @mtu:            Port MTU
151662306a36Sopenharmony_ci * @an_enable:      Port autonegotiation setting
151762306a36Sopenharmony_ci * @fec_type:       Port FEC type setting
151862306a36Sopenharmony_ci * @pause_type:     Port pause type setting
151962306a36Sopenharmony_ci * @loopback_mode:  Port loopback mode
152062306a36Sopenharmony_ci * @stats_ctl:      Port stats setting
152162306a36Sopenharmony_ci */
152262306a36Sopenharmony_cistruct ionic_port_setattr_cmd {
152362306a36Sopenharmony_ci	u8     opcode;
152462306a36Sopenharmony_ci	u8     index;
152562306a36Sopenharmony_ci	u8     attr;
152662306a36Sopenharmony_ci	u8     rsvd;
152762306a36Sopenharmony_ci	union {
152862306a36Sopenharmony_ci		u8      state;
152962306a36Sopenharmony_ci		__le32  speed;
153062306a36Sopenharmony_ci		__le32  mtu;
153162306a36Sopenharmony_ci		u8      an_enable;
153262306a36Sopenharmony_ci		u8      fec_type;
153362306a36Sopenharmony_ci		u8      pause_type;
153462306a36Sopenharmony_ci		u8      loopback_mode;
153562306a36Sopenharmony_ci		u8      stats_ctl;
153662306a36Sopenharmony_ci		u8      rsvd2[60];
153762306a36Sopenharmony_ci	};
153862306a36Sopenharmony_ci};
153962306a36Sopenharmony_ci
154062306a36Sopenharmony_ci/**
154162306a36Sopenharmony_ci * struct ionic_port_setattr_comp - Port set attr command completion
154262306a36Sopenharmony_ci * @status:     Status of the command (enum ionic_status_code)
154362306a36Sopenharmony_ci * @color:      Color bit
154462306a36Sopenharmony_ci */
154562306a36Sopenharmony_cistruct ionic_port_setattr_comp {
154662306a36Sopenharmony_ci	u8     status;
154762306a36Sopenharmony_ci	u8     rsvd[14];
154862306a36Sopenharmony_ci	u8     color;
154962306a36Sopenharmony_ci};
155062306a36Sopenharmony_ci
155162306a36Sopenharmony_ci/**
155262306a36Sopenharmony_ci * struct ionic_port_getattr_cmd - Get port attributes from the NIC
155362306a36Sopenharmony_ci * @opcode:     Opcode
155462306a36Sopenharmony_ci * @index:      port index
155562306a36Sopenharmony_ci * @attr:       Attribute type (enum ionic_port_attr)
155662306a36Sopenharmony_ci */
155762306a36Sopenharmony_cistruct ionic_port_getattr_cmd {
155862306a36Sopenharmony_ci	u8     opcode;
155962306a36Sopenharmony_ci	u8     index;
156062306a36Sopenharmony_ci	u8     attr;
156162306a36Sopenharmony_ci	u8     rsvd[61];
156262306a36Sopenharmony_ci};
156362306a36Sopenharmony_ci
156462306a36Sopenharmony_ci/**
156562306a36Sopenharmony_ci * struct ionic_port_getattr_comp - Port get attr command completion
156662306a36Sopenharmony_ci * @status:         Status of the command (enum ionic_status_code)
156762306a36Sopenharmony_ci * @state:          Port state
156862306a36Sopenharmony_ci * @speed:          Port speed
156962306a36Sopenharmony_ci * @mtu:            Port MTU
157062306a36Sopenharmony_ci * @an_enable:      Port autonegotiation setting
157162306a36Sopenharmony_ci * @fec_type:       Port FEC type setting
157262306a36Sopenharmony_ci * @pause_type:     Port pause type setting
157362306a36Sopenharmony_ci * @loopback_mode:  Port loopback mode
157462306a36Sopenharmony_ci * @color:          Color bit
157562306a36Sopenharmony_ci */
157662306a36Sopenharmony_cistruct ionic_port_getattr_comp {
157762306a36Sopenharmony_ci	u8     status;
157862306a36Sopenharmony_ci	u8     rsvd[3];
157962306a36Sopenharmony_ci	union {
158062306a36Sopenharmony_ci		u8      state;
158162306a36Sopenharmony_ci		__le32  speed;
158262306a36Sopenharmony_ci		__le32  mtu;
158362306a36Sopenharmony_ci		u8      an_enable;
158462306a36Sopenharmony_ci		u8      fec_type;
158562306a36Sopenharmony_ci		u8      pause_type;
158662306a36Sopenharmony_ci		u8      loopback_mode;
158762306a36Sopenharmony_ci		u8      rsvd2[11];
158862306a36Sopenharmony_ci	} __packed;
158962306a36Sopenharmony_ci	u8     color;
159062306a36Sopenharmony_ci};
159162306a36Sopenharmony_ci
159262306a36Sopenharmony_ci/**
159362306a36Sopenharmony_ci * struct ionic_lif_status - LIF status register
159462306a36Sopenharmony_ci * @eid:             most recent NotifyQ event id
159562306a36Sopenharmony_ci * @port_num:        port the LIF is connected to
159662306a36Sopenharmony_ci * @link_status:     port status (enum ionic_port_oper_status)
159762306a36Sopenharmony_ci * @link_speed:      speed of link in Mbps
159862306a36Sopenharmony_ci * @link_down_count: number of times link went from up to down
159962306a36Sopenharmony_ci */
160062306a36Sopenharmony_cistruct ionic_lif_status {
160162306a36Sopenharmony_ci	__le64 eid;
160262306a36Sopenharmony_ci	u8     port_num;
160362306a36Sopenharmony_ci	u8     rsvd;
160462306a36Sopenharmony_ci	__le16 link_status;
160562306a36Sopenharmony_ci	__le32 link_speed;		/* units of 1Mbps: eg 10000 = 10Gbps */
160662306a36Sopenharmony_ci	__le16 link_down_count;
160762306a36Sopenharmony_ci	u8      rsvd2[46];
160862306a36Sopenharmony_ci};
160962306a36Sopenharmony_ci
161062306a36Sopenharmony_ci/**
161162306a36Sopenharmony_ci * struct ionic_lif_reset_cmd - LIF reset command
161262306a36Sopenharmony_ci * @opcode:    opcode
161362306a36Sopenharmony_ci * @index:     LIF index
161462306a36Sopenharmony_ci */
161562306a36Sopenharmony_cistruct ionic_lif_reset_cmd {
161662306a36Sopenharmony_ci	u8     opcode;
161762306a36Sopenharmony_ci	u8     rsvd;
161862306a36Sopenharmony_ci	__le16 index;
161962306a36Sopenharmony_ci	__le32 rsvd2[15];
162062306a36Sopenharmony_ci};
162162306a36Sopenharmony_ci
162262306a36Sopenharmony_citypedef struct ionic_admin_comp ionic_lif_reset_comp;
162362306a36Sopenharmony_ci
162462306a36Sopenharmony_cienum ionic_dev_state {
162562306a36Sopenharmony_ci	IONIC_DEV_DISABLE	= 0,
162662306a36Sopenharmony_ci	IONIC_DEV_ENABLE	= 1,
162762306a36Sopenharmony_ci	IONIC_DEV_HANG_RESET	= 2,
162862306a36Sopenharmony_ci};
162962306a36Sopenharmony_ci
163062306a36Sopenharmony_ci/**
163162306a36Sopenharmony_ci * enum ionic_dev_attr - List of device attributes
163262306a36Sopenharmony_ci * @IONIC_DEV_ATTR_STATE:     Device state attribute
163362306a36Sopenharmony_ci * @IONIC_DEV_ATTR_NAME:      Device name attribute
163462306a36Sopenharmony_ci * @IONIC_DEV_ATTR_FEATURES:  Device feature attributes
163562306a36Sopenharmony_ci */
163662306a36Sopenharmony_cienum ionic_dev_attr {
163762306a36Sopenharmony_ci	IONIC_DEV_ATTR_STATE    = 0,
163862306a36Sopenharmony_ci	IONIC_DEV_ATTR_NAME     = 1,
163962306a36Sopenharmony_ci	IONIC_DEV_ATTR_FEATURES = 2,
164062306a36Sopenharmony_ci};
164162306a36Sopenharmony_ci
164262306a36Sopenharmony_ci/**
164362306a36Sopenharmony_ci * struct ionic_dev_setattr_cmd - Set Device attributes on the NIC
164462306a36Sopenharmony_ci * @opcode:     Opcode
164562306a36Sopenharmony_ci * @attr:       Attribute type (enum ionic_dev_attr)
164662306a36Sopenharmony_ci * @state:      Device state (enum ionic_dev_state)
164762306a36Sopenharmony_ci * @name:       The bus info, e.g. PCI slot-device-function, 0 terminated
164862306a36Sopenharmony_ci * @features:   Device features
164962306a36Sopenharmony_ci */
165062306a36Sopenharmony_cistruct ionic_dev_setattr_cmd {
165162306a36Sopenharmony_ci	u8     opcode;
165262306a36Sopenharmony_ci	u8     attr;
165362306a36Sopenharmony_ci	__le16 rsvd;
165462306a36Sopenharmony_ci	union {
165562306a36Sopenharmony_ci		u8      state;
165662306a36Sopenharmony_ci		char    name[IONIC_IFNAMSIZ];
165762306a36Sopenharmony_ci		__le64  features;
165862306a36Sopenharmony_ci		u8      rsvd2[60];
165962306a36Sopenharmony_ci	} __packed;
166062306a36Sopenharmony_ci};
166162306a36Sopenharmony_ci
166262306a36Sopenharmony_ci/**
166362306a36Sopenharmony_ci * struct ionic_dev_setattr_comp - Device set attr command completion
166462306a36Sopenharmony_ci * @status:     Status of the command (enum ionic_status_code)
166562306a36Sopenharmony_ci * @features:   Device features
166662306a36Sopenharmony_ci * @color:      Color bit
166762306a36Sopenharmony_ci */
166862306a36Sopenharmony_cistruct ionic_dev_setattr_comp {
166962306a36Sopenharmony_ci	u8     status;
167062306a36Sopenharmony_ci	u8     rsvd[3];
167162306a36Sopenharmony_ci	union {
167262306a36Sopenharmony_ci		__le64  features;
167362306a36Sopenharmony_ci		u8      rsvd2[11];
167462306a36Sopenharmony_ci	} __packed;
167562306a36Sopenharmony_ci	u8     color;
167662306a36Sopenharmony_ci};
167762306a36Sopenharmony_ci
167862306a36Sopenharmony_ci/**
167962306a36Sopenharmony_ci * struct ionic_dev_getattr_cmd - Get Device attributes from the NIC
168062306a36Sopenharmony_ci * @opcode:     opcode
168162306a36Sopenharmony_ci * @attr:       Attribute type (enum ionic_dev_attr)
168262306a36Sopenharmony_ci */
168362306a36Sopenharmony_cistruct ionic_dev_getattr_cmd {
168462306a36Sopenharmony_ci	u8     opcode;
168562306a36Sopenharmony_ci	u8     attr;
168662306a36Sopenharmony_ci	u8     rsvd[62];
168762306a36Sopenharmony_ci};
168862306a36Sopenharmony_ci
168962306a36Sopenharmony_ci/**
169062306a36Sopenharmony_ci * struct ionic_dev_setattr_comp - Device set attr command completion
169162306a36Sopenharmony_ci * @status:     Status of the command (enum ionic_status_code)
169262306a36Sopenharmony_ci * @features:   Device features
169362306a36Sopenharmony_ci * @color:      Color bit
169462306a36Sopenharmony_ci */
169562306a36Sopenharmony_cistruct ionic_dev_getattr_comp {
169662306a36Sopenharmony_ci	u8     status;
169762306a36Sopenharmony_ci	u8     rsvd[3];
169862306a36Sopenharmony_ci	union {
169962306a36Sopenharmony_ci		__le64  features;
170062306a36Sopenharmony_ci		u8      rsvd2[11];
170162306a36Sopenharmony_ci	} __packed;
170262306a36Sopenharmony_ci	u8     color;
170362306a36Sopenharmony_ci};
170462306a36Sopenharmony_ci
170562306a36Sopenharmony_ci/**
170662306a36Sopenharmony_ci * RSS parameters
170762306a36Sopenharmony_ci */
170862306a36Sopenharmony_ci#define IONIC_RSS_HASH_KEY_SIZE		40
170962306a36Sopenharmony_ci
171062306a36Sopenharmony_cienum ionic_rss_hash_types {
171162306a36Sopenharmony_ci	IONIC_RSS_TYPE_IPV4	= BIT(0),
171262306a36Sopenharmony_ci	IONIC_RSS_TYPE_IPV4_TCP	= BIT(1),
171362306a36Sopenharmony_ci	IONIC_RSS_TYPE_IPV4_UDP	= BIT(2),
171462306a36Sopenharmony_ci	IONIC_RSS_TYPE_IPV6	= BIT(3),
171562306a36Sopenharmony_ci	IONIC_RSS_TYPE_IPV6_TCP	= BIT(4),
171662306a36Sopenharmony_ci	IONIC_RSS_TYPE_IPV6_UDP	= BIT(5),
171762306a36Sopenharmony_ci};
171862306a36Sopenharmony_ci
171962306a36Sopenharmony_ci/**
172062306a36Sopenharmony_ci * enum ionic_lif_attr - List of LIF attributes
172162306a36Sopenharmony_ci * @IONIC_LIF_ATTR_STATE:       LIF state attribute
172262306a36Sopenharmony_ci * @IONIC_LIF_ATTR_NAME:        LIF name attribute
172362306a36Sopenharmony_ci * @IONIC_LIF_ATTR_MTU:         LIF MTU attribute
172462306a36Sopenharmony_ci * @IONIC_LIF_ATTR_MAC:         LIF MAC attribute
172562306a36Sopenharmony_ci * @IONIC_LIF_ATTR_FEATURES:    LIF features attribute
172662306a36Sopenharmony_ci * @IONIC_LIF_ATTR_RSS:         LIF RSS attribute
172762306a36Sopenharmony_ci * @IONIC_LIF_ATTR_STATS_CTRL:  LIF statistics control attribute
172862306a36Sopenharmony_ci * @IONIC_LIF_ATTR_TXSTAMP:     LIF TX timestamping mode
172962306a36Sopenharmony_ci */
173062306a36Sopenharmony_cienum ionic_lif_attr {
173162306a36Sopenharmony_ci	IONIC_LIF_ATTR_STATE        = 0,
173262306a36Sopenharmony_ci	IONIC_LIF_ATTR_NAME         = 1,
173362306a36Sopenharmony_ci	IONIC_LIF_ATTR_MTU          = 2,
173462306a36Sopenharmony_ci	IONIC_LIF_ATTR_MAC          = 3,
173562306a36Sopenharmony_ci	IONIC_LIF_ATTR_FEATURES     = 4,
173662306a36Sopenharmony_ci	IONIC_LIF_ATTR_RSS          = 5,
173762306a36Sopenharmony_ci	IONIC_LIF_ATTR_STATS_CTRL   = 6,
173862306a36Sopenharmony_ci	IONIC_LIF_ATTR_TXSTAMP      = 7,
173962306a36Sopenharmony_ci};
174062306a36Sopenharmony_ci
174162306a36Sopenharmony_ci/**
174262306a36Sopenharmony_ci * struct ionic_lif_setattr_cmd - Set LIF attributes on the NIC
174362306a36Sopenharmony_ci * @opcode:     Opcode
174462306a36Sopenharmony_ci * @attr:       Attribute type (enum ionic_lif_attr)
174562306a36Sopenharmony_ci * @index:      LIF index
174662306a36Sopenharmony_ci * @state:      LIF state (enum ionic_lif_state)
174762306a36Sopenharmony_ci * @name:       The netdev name string, 0 terminated
174862306a36Sopenharmony_ci * @mtu:        Mtu
174962306a36Sopenharmony_ci * @mac:        Station mac
175062306a36Sopenharmony_ci * @features:   Features (enum ionic_eth_hw_features)
175162306a36Sopenharmony_ci * @rss:        RSS properties
175262306a36Sopenharmony_ci *              @types:     The hash types to enable (see rss_hash_types)
175362306a36Sopenharmony_ci *              @key:       The hash secret key
175462306a36Sopenharmony_ci *              @addr:      Address for the indirection table shared memory
175562306a36Sopenharmony_ci * @stats_ctl:  stats control commands (enum ionic_stats_ctl_cmd)
175662306a36Sopenharmony_ci * @txstamp:    TX Timestamping Mode (enum ionic_txstamp_mode)
175762306a36Sopenharmony_ci */
175862306a36Sopenharmony_cistruct ionic_lif_setattr_cmd {
175962306a36Sopenharmony_ci	u8     opcode;
176062306a36Sopenharmony_ci	u8     attr;
176162306a36Sopenharmony_ci	__le16 index;
176262306a36Sopenharmony_ci	union {
176362306a36Sopenharmony_ci		u8      state;
176462306a36Sopenharmony_ci		char    name[IONIC_IFNAMSIZ];
176562306a36Sopenharmony_ci		__le32  mtu;
176662306a36Sopenharmony_ci		u8      mac[6];
176762306a36Sopenharmony_ci		__le64  features;
176862306a36Sopenharmony_ci		struct {
176962306a36Sopenharmony_ci			__le16 types;
177062306a36Sopenharmony_ci			u8     key[IONIC_RSS_HASH_KEY_SIZE];
177162306a36Sopenharmony_ci			u8     rsvd[6];
177262306a36Sopenharmony_ci			__le64 addr;
177362306a36Sopenharmony_ci		} rss;
177462306a36Sopenharmony_ci		u8      stats_ctl;
177562306a36Sopenharmony_ci		__le16 txstamp_mode;
177662306a36Sopenharmony_ci		u8      rsvd[60];
177762306a36Sopenharmony_ci	} __packed;
177862306a36Sopenharmony_ci};
177962306a36Sopenharmony_ci
178062306a36Sopenharmony_ci/**
178162306a36Sopenharmony_ci * struct ionic_lif_setattr_comp - LIF set attr command completion
178262306a36Sopenharmony_ci * @status:     Status of the command (enum ionic_status_code)
178362306a36Sopenharmony_ci * @comp_index: Index in the descriptor ring for which this is the completion
178462306a36Sopenharmony_ci * @features:   features (enum ionic_eth_hw_features)
178562306a36Sopenharmony_ci * @color:      Color bit
178662306a36Sopenharmony_ci */
178762306a36Sopenharmony_cistruct ionic_lif_setattr_comp {
178862306a36Sopenharmony_ci	u8     status;
178962306a36Sopenharmony_ci	u8     rsvd;
179062306a36Sopenharmony_ci	__le16 comp_index;
179162306a36Sopenharmony_ci	union {
179262306a36Sopenharmony_ci		__le64  features;
179362306a36Sopenharmony_ci		u8      rsvd2[11];
179462306a36Sopenharmony_ci	} __packed;
179562306a36Sopenharmony_ci	u8     color;
179662306a36Sopenharmony_ci};
179762306a36Sopenharmony_ci
179862306a36Sopenharmony_ci/**
179962306a36Sopenharmony_ci * struct ionic_lif_getattr_cmd - Get LIF attributes from the NIC
180062306a36Sopenharmony_ci * @opcode:     Opcode
180162306a36Sopenharmony_ci * @attr:       Attribute type (enum ionic_lif_attr)
180262306a36Sopenharmony_ci * @index:      LIF index
180362306a36Sopenharmony_ci */
180462306a36Sopenharmony_cistruct ionic_lif_getattr_cmd {
180562306a36Sopenharmony_ci	u8     opcode;
180662306a36Sopenharmony_ci	u8     attr;
180762306a36Sopenharmony_ci	__le16 index;
180862306a36Sopenharmony_ci	u8     rsvd[60];
180962306a36Sopenharmony_ci};
181062306a36Sopenharmony_ci
181162306a36Sopenharmony_ci/**
181262306a36Sopenharmony_ci * struct ionic_lif_getattr_comp - LIF get attr command completion
181362306a36Sopenharmony_ci * @status:     Status of the command (enum ionic_status_code)
181462306a36Sopenharmony_ci * @comp_index: Index in the descriptor ring for which this is the completion
181562306a36Sopenharmony_ci * @state:      LIF state (enum ionic_lif_state)
181662306a36Sopenharmony_ci * @name:       The netdev name string, 0 terminated
181762306a36Sopenharmony_ci * @mtu:        Mtu
181862306a36Sopenharmony_ci * @mac:        Station mac
181962306a36Sopenharmony_ci * @features:   Features (enum ionic_eth_hw_features)
182062306a36Sopenharmony_ci * @txstamp:    TX Timestamping Mode (enum ionic_txstamp_mode)
182162306a36Sopenharmony_ci * @color:      Color bit
182262306a36Sopenharmony_ci */
182362306a36Sopenharmony_cistruct ionic_lif_getattr_comp {
182462306a36Sopenharmony_ci	u8     status;
182562306a36Sopenharmony_ci	u8     rsvd;
182662306a36Sopenharmony_ci	__le16 comp_index;
182762306a36Sopenharmony_ci	union {
182862306a36Sopenharmony_ci		u8      state;
182962306a36Sopenharmony_ci		__le32  mtu;
183062306a36Sopenharmony_ci		u8      mac[6];
183162306a36Sopenharmony_ci		__le64  features;
183262306a36Sopenharmony_ci		__le16  txstamp_mode;
183362306a36Sopenharmony_ci		u8      rsvd2[11];
183462306a36Sopenharmony_ci	} __packed;
183562306a36Sopenharmony_ci	u8     color;
183662306a36Sopenharmony_ci};
183762306a36Sopenharmony_ci
183862306a36Sopenharmony_ci/**
183962306a36Sopenharmony_ci * struct ionic_lif_setphc_cmd - Set LIF PTP Hardware Clock
184062306a36Sopenharmony_ci * @opcode:     Opcode
184162306a36Sopenharmony_ci * @lif_index:  LIF index
184262306a36Sopenharmony_ci * @tick:       Hardware stamp tick of an instant in time.
184362306a36Sopenharmony_ci * @nsec:       Nanosecond stamp of the same instant.
184462306a36Sopenharmony_ci * @frac:       Fractional nanoseconds at the same instant.
184562306a36Sopenharmony_ci * @mult:       Cycle to nanosecond multiplier.
184662306a36Sopenharmony_ci * @shift:      Cycle to nanosecond divisor (power of two).
184762306a36Sopenharmony_ci */
184862306a36Sopenharmony_cistruct ionic_lif_setphc_cmd {
184962306a36Sopenharmony_ci	u8	opcode;
185062306a36Sopenharmony_ci	u8	rsvd1;
185162306a36Sopenharmony_ci	__le16  lif_index;
185262306a36Sopenharmony_ci	u8      rsvd2[4];
185362306a36Sopenharmony_ci	__le64	tick;
185462306a36Sopenharmony_ci	__le64	nsec;
185562306a36Sopenharmony_ci	__le64	frac;
185662306a36Sopenharmony_ci	__le32	mult;
185762306a36Sopenharmony_ci	__le32	shift;
185862306a36Sopenharmony_ci	u8     rsvd3[24];
185962306a36Sopenharmony_ci};
186062306a36Sopenharmony_ci
186162306a36Sopenharmony_cienum ionic_rx_mode {
186262306a36Sopenharmony_ci	IONIC_RX_MODE_F_UNICAST		= BIT(0),
186362306a36Sopenharmony_ci	IONIC_RX_MODE_F_MULTICAST	= BIT(1),
186462306a36Sopenharmony_ci	IONIC_RX_MODE_F_BROADCAST	= BIT(2),
186562306a36Sopenharmony_ci	IONIC_RX_MODE_F_PROMISC		= BIT(3),
186662306a36Sopenharmony_ci	IONIC_RX_MODE_F_ALLMULTI	= BIT(4),
186762306a36Sopenharmony_ci	IONIC_RX_MODE_F_RDMA_SNIFFER	= BIT(5),
186862306a36Sopenharmony_ci};
186962306a36Sopenharmony_ci
187062306a36Sopenharmony_ci/**
187162306a36Sopenharmony_ci * struct ionic_rx_mode_set_cmd - Set LIF's Rx mode command
187262306a36Sopenharmony_ci * @opcode:     opcode
187362306a36Sopenharmony_ci * @lif_index:  LIF index
187462306a36Sopenharmony_ci * @rx_mode:    Rx mode flags:
187562306a36Sopenharmony_ci *                  IONIC_RX_MODE_F_UNICAST: Accept known unicast packets
187662306a36Sopenharmony_ci *                  IONIC_RX_MODE_F_MULTICAST: Accept known multicast packets
187762306a36Sopenharmony_ci *                  IONIC_RX_MODE_F_BROADCAST: Accept broadcast packets
187862306a36Sopenharmony_ci *                  IONIC_RX_MODE_F_PROMISC: Accept any packets
187962306a36Sopenharmony_ci *                  IONIC_RX_MODE_F_ALLMULTI: Accept any multicast packets
188062306a36Sopenharmony_ci *                  IONIC_RX_MODE_F_RDMA_SNIFFER: Sniff RDMA packets
188162306a36Sopenharmony_ci */
188262306a36Sopenharmony_cistruct ionic_rx_mode_set_cmd {
188362306a36Sopenharmony_ci	u8     opcode;
188462306a36Sopenharmony_ci	u8     rsvd;
188562306a36Sopenharmony_ci	__le16 lif_index;
188662306a36Sopenharmony_ci	__le16 rx_mode;
188762306a36Sopenharmony_ci	__le16 rsvd2[29];
188862306a36Sopenharmony_ci};
188962306a36Sopenharmony_ci
189062306a36Sopenharmony_citypedef struct ionic_admin_comp ionic_rx_mode_set_comp;
189162306a36Sopenharmony_ci
189262306a36Sopenharmony_cienum ionic_rx_filter_match_type {
189362306a36Sopenharmony_ci	IONIC_RX_FILTER_MATCH_VLAN	= 0x0,
189462306a36Sopenharmony_ci	IONIC_RX_FILTER_MATCH_MAC	= 0x1,
189562306a36Sopenharmony_ci	IONIC_RX_FILTER_MATCH_MAC_VLAN	= 0x2,
189662306a36Sopenharmony_ci	IONIC_RX_FILTER_STEER_PKTCLASS	= 0x10,
189762306a36Sopenharmony_ci};
189862306a36Sopenharmony_ci
189962306a36Sopenharmony_ci/**
190062306a36Sopenharmony_ci * struct ionic_rx_filter_add_cmd - Add LIF Rx filter command
190162306a36Sopenharmony_ci * @opcode:     opcode
190262306a36Sopenharmony_ci * @qtype:      Queue type
190362306a36Sopenharmony_ci * @lif_index:  LIF index
190462306a36Sopenharmony_ci * @qid:        Queue ID
190562306a36Sopenharmony_ci * @match:      Rx filter match type (see IONIC_RX_FILTER_MATCH_xxx)
190662306a36Sopenharmony_ci * @vlan:       VLAN filter
190762306a36Sopenharmony_ci *              @vlan:  VLAN ID
190862306a36Sopenharmony_ci * @mac:        MAC filter
190962306a36Sopenharmony_ci *              @addr:  MAC address (network-byte order)
191062306a36Sopenharmony_ci * @mac_vlan:   MACVLAN filter
191162306a36Sopenharmony_ci *              @vlan:  VLAN ID
191262306a36Sopenharmony_ci *              @addr:  MAC address (network-byte order)
191362306a36Sopenharmony_ci * @pkt_class:  Packet classification filter
191462306a36Sopenharmony_ci */
191562306a36Sopenharmony_cistruct ionic_rx_filter_add_cmd {
191662306a36Sopenharmony_ci	u8     opcode;
191762306a36Sopenharmony_ci	u8     qtype;
191862306a36Sopenharmony_ci	__le16 lif_index;
191962306a36Sopenharmony_ci	__le32 qid;
192062306a36Sopenharmony_ci	__le16 match;
192162306a36Sopenharmony_ci	union {
192262306a36Sopenharmony_ci		struct {
192362306a36Sopenharmony_ci			__le16 vlan;
192462306a36Sopenharmony_ci		} vlan;
192562306a36Sopenharmony_ci		struct {
192662306a36Sopenharmony_ci			u8     addr[6];
192762306a36Sopenharmony_ci		} mac;
192862306a36Sopenharmony_ci		struct {
192962306a36Sopenharmony_ci			__le16 vlan;
193062306a36Sopenharmony_ci			u8     addr[6];
193162306a36Sopenharmony_ci		} mac_vlan;
193262306a36Sopenharmony_ci		__le64 pkt_class;
193362306a36Sopenharmony_ci		u8 rsvd[54];
193462306a36Sopenharmony_ci	} __packed;
193562306a36Sopenharmony_ci};
193662306a36Sopenharmony_ci
193762306a36Sopenharmony_ci/**
193862306a36Sopenharmony_ci * struct ionic_rx_filter_add_comp - Add LIF Rx filter command completion
193962306a36Sopenharmony_ci * @status:     Status of the command (enum ionic_status_code)
194062306a36Sopenharmony_ci * @comp_index: Index in the descriptor ring for which this is the completion
194162306a36Sopenharmony_ci * @filter_id:  Filter ID
194262306a36Sopenharmony_ci * @color:      Color bit
194362306a36Sopenharmony_ci */
194462306a36Sopenharmony_cistruct ionic_rx_filter_add_comp {
194562306a36Sopenharmony_ci	u8     status;
194662306a36Sopenharmony_ci	u8     rsvd;
194762306a36Sopenharmony_ci	__le16 comp_index;
194862306a36Sopenharmony_ci	__le32 filter_id;
194962306a36Sopenharmony_ci	u8     rsvd2[7];
195062306a36Sopenharmony_ci	u8     color;
195162306a36Sopenharmony_ci};
195262306a36Sopenharmony_ci
195362306a36Sopenharmony_ci/**
195462306a36Sopenharmony_ci * struct ionic_rx_filter_del_cmd - Delete LIF Rx filter command
195562306a36Sopenharmony_ci * @opcode:     opcode
195662306a36Sopenharmony_ci * @lif_index:  LIF index
195762306a36Sopenharmony_ci * @filter_id:  Filter ID
195862306a36Sopenharmony_ci */
195962306a36Sopenharmony_cistruct ionic_rx_filter_del_cmd {
196062306a36Sopenharmony_ci	u8     opcode;
196162306a36Sopenharmony_ci	u8     rsvd;
196262306a36Sopenharmony_ci	__le16 lif_index;
196362306a36Sopenharmony_ci	__le32 filter_id;
196462306a36Sopenharmony_ci	u8     rsvd2[56];
196562306a36Sopenharmony_ci};
196662306a36Sopenharmony_ci
196762306a36Sopenharmony_citypedef struct ionic_admin_comp ionic_rx_filter_del_comp;
196862306a36Sopenharmony_ci
196962306a36Sopenharmony_cienum ionic_vf_attr {
197062306a36Sopenharmony_ci	IONIC_VF_ATTR_SPOOFCHK	= 1,
197162306a36Sopenharmony_ci	IONIC_VF_ATTR_TRUST	= 2,
197262306a36Sopenharmony_ci	IONIC_VF_ATTR_MAC	= 3,
197362306a36Sopenharmony_ci	IONIC_VF_ATTR_LINKSTATE	= 4,
197462306a36Sopenharmony_ci	IONIC_VF_ATTR_VLAN	= 5,
197562306a36Sopenharmony_ci	IONIC_VF_ATTR_RATE	= 6,
197662306a36Sopenharmony_ci	IONIC_VF_ATTR_STATSADDR	= 7,
197762306a36Sopenharmony_ci};
197862306a36Sopenharmony_ci
197962306a36Sopenharmony_ci/**
198062306a36Sopenharmony_ci * enum ionic_vf_link_status - Virtual Function link status
198162306a36Sopenharmony_ci * @IONIC_VF_LINK_STATUS_AUTO:   Use link state of the uplink
198262306a36Sopenharmony_ci * @IONIC_VF_LINK_STATUS_UP:     Link always up
198362306a36Sopenharmony_ci * @IONIC_VF_LINK_STATUS_DOWN:   Link always down
198462306a36Sopenharmony_ci */
198562306a36Sopenharmony_cienum ionic_vf_link_status {
198662306a36Sopenharmony_ci	IONIC_VF_LINK_STATUS_AUTO = 0,
198762306a36Sopenharmony_ci	IONIC_VF_LINK_STATUS_UP   = 1,
198862306a36Sopenharmony_ci	IONIC_VF_LINK_STATUS_DOWN = 2,
198962306a36Sopenharmony_ci};
199062306a36Sopenharmony_ci
199162306a36Sopenharmony_ci/**
199262306a36Sopenharmony_ci * struct ionic_vf_setattr_cmd - Set VF attributes on the NIC
199362306a36Sopenharmony_ci * @opcode:     Opcode
199462306a36Sopenharmony_ci * @attr:       Attribute type (enum ionic_vf_attr)
199562306a36Sopenharmony_ci * @vf_index:   VF index
199662306a36Sopenharmony_ci *	@macaddr:	mac address
199762306a36Sopenharmony_ci *	@vlanid:	vlan ID
199862306a36Sopenharmony_ci *	@maxrate:	max Tx rate in Mbps
199962306a36Sopenharmony_ci *	@spoofchk:	enable address spoof checking
200062306a36Sopenharmony_ci *	@trust:		enable VF trust
200162306a36Sopenharmony_ci *	@linkstate:	set link up or down
200262306a36Sopenharmony_ci *	@stats_pa:	set DMA address for VF stats
200362306a36Sopenharmony_ci */
200462306a36Sopenharmony_cistruct ionic_vf_setattr_cmd {
200562306a36Sopenharmony_ci	u8     opcode;
200662306a36Sopenharmony_ci	u8     attr;
200762306a36Sopenharmony_ci	__le16 vf_index;
200862306a36Sopenharmony_ci	union {
200962306a36Sopenharmony_ci		u8     macaddr[6];
201062306a36Sopenharmony_ci		__le16 vlanid;
201162306a36Sopenharmony_ci		__le32 maxrate;
201262306a36Sopenharmony_ci		u8     spoofchk;
201362306a36Sopenharmony_ci		u8     trust;
201462306a36Sopenharmony_ci		u8     linkstate;
201562306a36Sopenharmony_ci		__le64 stats_pa;
201662306a36Sopenharmony_ci		u8     pad[60];
201762306a36Sopenharmony_ci	} __packed;
201862306a36Sopenharmony_ci};
201962306a36Sopenharmony_ci
202062306a36Sopenharmony_cistruct ionic_vf_setattr_comp {
202162306a36Sopenharmony_ci	u8     status;
202262306a36Sopenharmony_ci	u8     attr;
202362306a36Sopenharmony_ci	__le16 vf_index;
202462306a36Sopenharmony_ci	__le16 comp_index;
202562306a36Sopenharmony_ci	u8     rsvd[9];
202662306a36Sopenharmony_ci	u8     color;
202762306a36Sopenharmony_ci};
202862306a36Sopenharmony_ci
202962306a36Sopenharmony_ci/**
203062306a36Sopenharmony_ci * struct ionic_vf_getattr_cmd - Get VF attributes from the NIC
203162306a36Sopenharmony_ci * @opcode:     Opcode
203262306a36Sopenharmony_ci * @attr:       Attribute type (enum ionic_vf_attr)
203362306a36Sopenharmony_ci * @vf_index:   VF index
203462306a36Sopenharmony_ci */
203562306a36Sopenharmony_cistruct ionic_vf_getattr_cmd {
203662306a36Sopenharmony_ci	u8     opcode;
203762306a36Sopenharmony_ci	u8     attr;
203862306a36Sopenharmony_ci	__le16 vf_index;
203962306a36Sopenharmony_ci	u8     rsvd[60];
204062306a36Sopenharmony_ci};
204162306a36Sopenharmony_ci
204262306a36Sopenharmony_cistruct ionic_vf_getattr_comp {
204362306a36Sopenharmony_ci	u8     status;
204462306a36Sopenharmony_ci	u8     attr;
204562306a36Sopenharmony_ci	__le16 vf_index;
204662306a36Sopenharmony_ci	union {
204762306a36Sopenharmony_ci		u8     macaddr[6];
204862306a36Sopenharmony_ci		__le16 vlanid;
204962306a36Sopenharmony_ci		__le32 maxrate;
205062306a36Sopenharmony_ci		u8     spoofchk;
205162306a36Sopenharmony_ci		u8     trust;
205262306a36Sopenharmony_ci		u8     linkstate;
205362306a36Sopenharmony_ci		__le64 stats_pa;
205462306a36Sopenharmony_ci		u8     pad[11];
205562306a36Sopenharmony_ci	} __packed;
205662306a36Sopenharmony_ci	u8     color;
205762306a36Sopenharmony_ci};
205862306a36Sopenharmony_ci
205962306a36Sopenharmony_cienum ionic_vf_ctrl_opcode {
206062306a36Sopenharmony_ci	IONIC_VF_CTRL_START_ALL	= 0,
206162306a36Sopenharmony_ci	IONIC_VF_CTRL_START	= 1,
206262306a36Sopenharmony_ci};
206362306a36Sopenharmony_ci
206462306a36Sopenharmony_ci/**
206562306a36Sopenharmony_ci * struct ionic_vf_ctrl_cmd - VF control command
206662306a36Sopenharmony_ci * @opcode:         Opcode for the command
206762306a36Sopenharmony_ci * @vf_index:       VF Index. It is unused if op START_ALL is used.
206862306a36Sopenharmony_ci * @ctrl_opcode:    VF control operation type
206962306a36Sopenharmony_ci */
207062306a36Sopenharmony_cistruct ionic_vf_ctrl_cmd {
207162306a36Sopenharmony_ci	u8	opcode;
207262306a36Sopenharmony_ci	u8	ctrl_opcode;
207362306a36Sopenharmony_ci	__le16	vf_index;
207462306a36Sopenharmony_ci	/* private: */
207562306a36Sopenharmony_ci	u8	rsvd1[60];
207662306a36Sopenharmony_ci};
207762306a36Sopenharmony_ci
207862306a36Sopenharmony_ci/**
207962306a36Sopenharmony_ci * struct ionic_vf_ctrl_comp - VF_CTRL command completion.
208062306a36Sopenharmony_ci * @status:     Status of the command (enum ionic_status_code)
208162306a36Sopenharmony_ci */
208262306a36Sopenharmony_cistruct ionic_vf_ctrl_comp {
208362306a36Sopenharmony_ci	u8	status;
208462306a36Sopenharmony_ci	/* private: */
208562306a36Sopenharmony_ci	u8      rsvd[15];
208662306a36Sopenharmony_ci};
208762306a36Sopenharmony_ci
208862306a36Sopenharmony_ci/**
208962306a36Sopenharmony_ci * struct ionic_qos_identify_cmd - QoS identify command
209062306a36Sopenharmony_ci * @opcode:  opcode
209162306a36Sopenharmony_ci * @ver:     Highest version of identify supported by driver
209262306a36Sopenharmony_ci *
209362306a36Sopenharmony_ci */
209462306a36Sopenharmony_cistruct ionic_qos_identify_cmd {
209562306a36Sopenharmony_ci	u8 opcode;
209662306a36Sopenharmony_ci	u8 ver;
209762306a36Sopenharmony_ci	u8 rsvd[62];
209862306a36Sopenharmony_ci};
209962306a36Sopenharmony_ci
210062306a36Sopenharmony_ci/**
210162306a36Sopenharmony_ci * struct ionic_qos_identify_comp - QoS identify command completion
210262306a36Sopenharmony_ci * @status: Status of the command (enum ionic_status_code)
210362306a36Sopenharmony_ci * @ver:    Version of identify returned by device
210462306a36Sopenharmony_ci */
210562306a36Sopenharmony_cistruct ionic_qos_identify_comp {
210662306a36Sopenharmony_ci	u8 status;
210762306a36Sopenharmony_ci	u8 ver;
210862306a36Sopenharmony_ci	u8 rsvd[14];
210962306a36Sopenharmony_ci};
211062306a36Sopenharmony_ci
211162306a36Sopenharmony_ci#define IONIC_QOS_TC_MAX		8
211262306a36Sopenharmony_ci#define IONIC_QOS_ALL_TC		0xFF
211362306a36Sopenharmony_ci/* Capri max supported, should be renamed. */
211462306a36Sopenharmony_ci#define IONIC_QOS_CLASS_MAX		7
211562306a36Sopenharmony_ci#define IONIC_QOS_PCP_MAX		8
211662306a36Sopenharmony_ci#define IONIC_QOS_CLASS_NAME_SZ	32
211762306a36Sopenharmony_ci#define IONIC_QOS_DSCP_MAX		64
211862306a36Sopenharmony_ci#define IONIC_QOS_ALL_PCP		0xFF
211962306a36Sopenharmony_ci#define IONIC_DSCP_BLOCK_SIZE		8
212062306a36Sopenharmony_ci
212162306a36Sopenharmony_ci/**
212262306a36Sopenharmony_ci * enum ionic_qos_class
212362306a36Sopenharmony_ci */
212462306a36Sopenharmony_cienum ionic_qos_class {
212562306a36Sopenharmony_ci	IONIC_QOS_CLASS_DEFAULT		= 0,
212662306a36Sopenharmony_ci	IONIC_QOS_CLASS_USER_DEFINED_1	= 1,
212762306a36Sopenharmony_ci	IONIC_QOS_CLASS_USER_DEFINED_2	= 2,
212862306a36Sopenharmony_ci	IONIC_QOS_CLASS_USER_DEFINED_3	= 3,
212962306a36Sopenharmony_ci	IONIC_QOS_CLASS_USER_DEFINED_4	= 4,
213062306a36Sopenharmony_ci	IONIC_QOS_CLASS_USER_DEFINED_5	= 5,
213162306a36Sopenharmony_ci	IONIC_QOS_CLASS_USER_DEFINED_6	= 6,
213262306a36Sopenharmony_ci};
213362306a36Sopenharmony_ci
213462306a36Sopenharmony_ci/**
213562306a36Sopenharmony_ci * enum ionic_qos_class_type - Traffic classification criteria
213662306a36Sopenharmony_ci * @IONIC_QOS_CLASS_TYPE_NONE:    No QoS
213762306a36Sopenharmony_ci * @IONIC_QOS_CLASS_TYPE_PCP:     Dot1Q PCP
213862306a36Sopenharmony_ci * @IONIC_QOS_CLASS_TYPE_DSCP:    IP DSCP
213962306a36Sopenharmony_ci */
214062306a36Sopenharmony_cienum ionic_qos_class_type {
214162306a36Sopenharmony_ci	IONIC_QOS_CLASS_TYPE_NONE	= 0,
214262306a36Sopenharmony_ci	IONIC_QOS_CLASS_TYPE_PCP	= 1,
214362306a36Sopenharmony_ci	IONIC_QOS_CLASS_TYPE_DSCP	= 2,
214462306a36Sopenharmony_ci};
214562306a36Sopenharmony_ci
214662306a36Sopenharmony_ci/**
214762306a36Sopenharmony_ci * enum ionic_qos_sched_type - QoS class scheduling type
214862306a36Sopenharmony_ci * @IONIC_QOS_SCHED_TYPE_STRICT:  Strict priority
214962306a36Sopenharmony_ci * @IONIC_QOS_SCHED_TYPE_DWRR:    Deficit weighted round-robin
215062306a36Sopenharmony_ci */
215162306a36Sopenharmony_cienum ionic_qos_sched_type {
215262306a36Sopenharmony_ci	IONIC_QOS_SCHED_TYPE_STRICT	= 0,
215362306a36Sopenharmony_ci	IONIC_QOS_SCHED_TYPE_DWRR	= 1,
215462306a36Sopenharmony_ci};
215562306a36Sopenharmony_ci
215662306a36Sopenharmony_ci/**
215762306a36Sopenharmony_ci * union ionic_qos_config - QoS configuration structure
215862306a36Sopenharmony_ci * @flags:		Configuration flags
215962306a36Sopenharmony_ci *	IONIC_QOS_CONFIG_F_ENABLE		enable
216062306a36Sopenharmony_ci *	IONIC_QOS_CONFIG_F_NO_DROP		drop/nodrop
216162306a36Sopenharmony_ci *	IONIC_QOS_CONFIG_F_RW_DOT1Q_PCP		enable dot1q pcp rewrite
216262306a36Sopenharmony_ci *	IONIC_QOS_CONFIG_F_RW_IP_DSCP		enable ip dscp rewrite
216362306a36Sopenharmony_ci *	IONIC_QOS_CONFIG_F_NON_DISRUPTIVE	Non-disruptive TC update
216462306a36Sopenharmony_ci * @sched_type:		QoS class scheduling type (enum ionic_qos_sched_type)
216562306a36Sopenharmony_ci * @class_type:		QoS class type (enum ionic_qos_class_type)
216662306a36Sopenharmony_ci * @pause_type:		QoS pause type (enum ionic_qos_pause_type)
216762306a36Sopenharmony_ci * @name:		QoS class name
216862306a36Sopenharmony_ci * @mtu:		MTU of the class
216962306a36Sopenharmony_ci * @pfc_cos:		Priority-Flow Control class of service
217062306a36Sopenharmony_ci * @dwrr_weight:	QoS class scheduling weight
217162306a36Sopenharmony_ci * @strict_rlmt:	Rate limit for strict priority scheduling
217262306a36Sopenharmony_ci * @rw_dot1q_pcp:	Rewrite dot1q pcp to value (valid iff F_RW_DOT1Q_PCP)
217362306a36Sopenharmony_ci * @rw_ip_dscp:		Rewrite ip dscp to value (valid iff F_RW_IP_DSCP)
217462306a36Sopenharmony_ci * @dot1q_pcp:		Dot1q pcp value
217562306a36Sopenharmony_ci * @ndscp:		Number of valid dscp values in the ip_dscp field
217662306a36Sopenharmony_ci * @ip_dscp:		IP dscp values
217762306a36Sopenharmony_ci */
217862306a36Sopenharmony_ciunion ionic_qos_config {
217962306a36Sopenharmony_ci	struct {
218062306a36Sopenharmony_ci#define IONIC_QOS_CONFIG_F_ENABLE		BIT(0)
218162306a36Sopenharmony_ci#define IONIC_QOS_CONFIG_F_NO_DROP		BIT(1)
218262306a36Sopenharmony_ci/* Used to rewrite PCP or DSCP value. */
218362306a36Sopenharmony_ci#define IONIC_QOS_CONFIG_F_RW_DOT1Q_PCP		BIT(2)
218462306a36Sopenharmony_ci#define IONIC_QOS_CONFIG_F_RW_IP_DSCP		BIT(3)
218562306a36Sopenharmony_ci/* Non-disruptive TC update */
218662306a36Sopenharmony_ci#define IONIC_QOS_CONFIG_F_NON_DISRUPTIVE	BIT(4)
218762306a36Sopenharmony_ci		u8      flags;
218862306a36Sopenharmony_ci		u8      sched_type;
218962306a36Sopenharmony_ci		u8      class_type;
219062306a36Sopenharmony_ci		u8      pause_type;
219162306a36Sopenharmony_ci		char    name[IONIC_QOS_CLASS_NAME_SZ];
219262306a36Sopenharmony_ci		__le32  mtu;
219362306a36Sopenharmony_ci		/* flow control */
219462306a36Sopenharmony_ci		u8      pfc_cos;
219562306a36Sopenharmony_ci		/* scheduler */
219662306a36Sopenharmony_ci		union {
219762306a36Sopenharmony_ci			u8      dwrr_weight;
219862306a36Sopenharmony_ci			__le64  strict_rlmt;
219962306a36Sopenharmony_ci		};
220062306a36Sopenharmony_ci		/* marking */
220162306a36Sopenharmony_ci		/* Used to rewrite PCP or DSCP value. */
220262306a36Sopenharmony_ci		union {
220362306a36Sopenharmony_ci			u8      rw_dot1q_pcp;
220462306a36Sopenharmony_ci			u8      rw_ip_dscp;
220562306a36Sopenharmony_ci		};
220662306a36Sopenharmony_ci		/* classification */
220762306a36Sopenharmony_ci		union {
220862306a36Sopenharmony_ci			u8      dot1q_pcp;
220962306a36Sopenharmony_ci			struct {
221062306a36Sopenharmony_ci				u8      ndscp;
221162306a36Sopenharmony_ci				u8      ip_dscp[IONIC_QOS_DSCP_MAX];
221262306a36Sopenharmony_ci			};
221362306a36Sopenharmony_ci		};
221462306a36Sopenharmony_ci	};
221562306a36Sopenharmony_ci	__le32  words[64];
221662306a36Sopenharmony_ci};
221762306a36Sopenharmony_ci
221862306a36Sopenharmony_ci/**
221962306a36Sopenharmony_ci * union ionic_qos_identity - QoS identity structure
222062306a36Sopenharmony_ci * @version:	Version of the identify structure
222162306a36Sopenharmony_ci * @type:	QoS system type
222262306a36Sopenharmony_ci * @nclasses:	Number of usable QoS classes
222362306a36Sopenharmony_ci * @config:	Current configuration of classes
222462306a36Sopenharmony_ci */
222562306a36Sopenharmony_ciunion ionic_qos_identity {
222662306a36Sopenharmony_ci	struct {
222762306a36Sopenharmony_ci		u8     version;
222862306a36Sopenharmony_ci		u8     type;
222962306a36Sopenharmony_ci		u8     rsvd[62];
223062306a36Sopenharmony_ci		union ionic_qos_config config[IONIC_QOS_CLASS_MAX];
223162306a36Sopenharmony_ci	};
223262306a36Sopenharmony_ci	__le32 words[478];
223362306a36Sopenharmony_ci};
223462306a36Sopenharmony_ci
223562306a36Sopenharmony_ci/**
223662306a36Sopenharmony_ci * struct ionic_qos_init_cmd - QoS config init command
223762306a36Sopenharmony_ci * @opcode:	Opcode
223862306a36Sopenharmony_ci * @group:	QoS class id
223962306a36Sopenharmony_ci * @info_pa:	destination address for qos info
224062306a36Sopenharmony_ci */
224162306a36Sopenharmony_cistruct ionic_qos_init_cmd {
224262306a36Sopenharmony_ci	u8     opcode;
224362306a36Sopenharmony_ci	u8     group;
224462306a36Sopenharmony_ci	u8     rsvd[6];
224562306a36Sopenharmony_ci	__le64 info_pa;
224662306a36Sopenharmony_ci	u8     rsvd1[48];
224762306a36Sopenharmony_ci};
224862306a36Sopenharmony_ci
224962306a36Sopenharmony_citypedef struct ionic_admin_comp ionic_qos_init_comp;
225062306a36Sopenharmony_ci
225162306a36Sopenharmony_ci/**
225262306a36Sopenharmony_ci * struct ionic_qos_reset_cmd - QoS config reset command
225362306a36Sopenharmony_ci * @opcode:	Opcode
225462306a36Sopenharmony_ci * @group:	QoS class id
225562306a36Sopenharmony_ci */
225662306a36Sopenharmony_cistruct ionic_qos_reset_cmd {
225762306a36Sopenharmony_ci	u8    opcode;
225862306a36Sopenharmony_ci	u8    group;
225962306a36Sopenharmony_ci	u8    rsvd[62];
226062306a36Sopenharmony_ci};
226162306a36Sopenharmony_ci
226262306a36Sopenharmony_ci/**
226362306a36Sopenharmony_ci * struct ionic_qos_clear_port_stats_cmd - Qos config reset command
226462306a36Sopenharmony_ci * @opcode:	Opcode
226562306a36Sopenharmony_ci */
226662306a36Sopenharmony_cistruct ionic_qos_clear_stats_cmd {
226762306a36Sopenharmony_ci	u8    opcode;
226862306a36Sopenharmony_ci	u8    group_bitmap;
226962306a36Sopenharmony_ci	u8    rsvd[62];
227062306a36Sopenharmony_ci};
227162306a36Sopenharmony_ci
227262306a36Sopenharmony_citypedef struct ionic_admin_comp ionic_qos_reset_comp;
227362306a36Sopenharmony_ci
227462306a36Sopenharmony_ci/**
227562306a36Sopenharmony_ci * struct ionic_fw_download_cmd - Firmware download command
227662306a36Sopenharmony_ci * @opcode:	opcode
227762306a36Sopenharmony_ci * @addr:	dma address of the firmware buffer
227862306a36Sopenharmony_ci * @offset:	offset of the firmware buffer within the full image
227962306a36Sopenharmony_ci * @length:	number of valid bytes in the firmware buffer
228062306a36Sopenharmony_ci */
228162306a36Sopenharmony_cistruct ionic_fw_download_cmd {
228262306a36Sopenharmony_ci	u8     opcode;
228362306a36Sopenharmony_ci	u8     rsvd[3];
228462306a36Sopenharmony_ci	__le32 offset;
228562306a36Sopenharmony_ci	__le64 addr;
228662306a36Sopenharmony_ci	__le32 length;
228762306a36Sopenharmony_ci};
228862306a36Sopenharmony_ci
228962306a36Sopenharmony_citypedef struct ionic_admin_comp ionic_fw_download_comp;
229062306a36Sopenharmony_ci
229162306a36Sopenharmony_ci/**
229262306a36Sopenharmony_ci * enum ionic_fw_control_oper - FW control operations
229362306a36Sopenharmony_ci * @IONIC_FW_RESET:		Reset firmware
229462306a36Sopenharmony_ci * @IONIC_FW_INSTALL:		Install firmware
229562306a36Sopenharmony_ci * @IONIC_FW_ACTIVATE:		Activate firmware
229662306a36Sopenharmony_ci * @IONIC_FW_INSTALL_ASYNC:	Install firmware asynchronously
229762306a36Sopenharmony_ci * @IONIC_FW_INSTALL_STATUS:	Firmware installation status
229862306a36Sopenharmony_ci * @IONIC_FW_ACTIVATE_ASYNC:	Activate firmware asynchronously
229962306a36Sopenharmony_ci * @IONIC_FW_ACTIVATE_STATUS:	Firmware activate status
230062306a36Sopenharmony_ci */
230162306a36Sopenharmony_cienum ionic_fw_control_oper {
230262306a36Sopenharmony_ci	IONIC_FW_RESET			= 0,
230362306a36Sopenharmony_ci	IONIC_FW_INSTALL		= 1,
230462306a36Sopenharmony_ci	IONIC_FW_ACTIVATE		= 2,
230562306a36Sopenharmony_ci	IONIC_FW_INSTALL_ASYNC		= 3,
230662306a36Sopenharmony_ci	IONIC_FW_INSTALL_STATUS		= 4,
230762306a36Sopenharmony_ci	IONIC_FW_ACTIVATE_ASYNC		= 5,
230862306a36Sopenharmony_ci	IONIC_FW_ACTIVATE_STATUS	= 6,
230962306a36Sopenharmony_ci	IONIC_FW_UPDATE_CLEANUP		= 7,
231062306a36Sopenharmony_ci};
231162306a36Sopenharmony_ci
231262306a36Sopenharmony_ci/**
231362306a36Sopenharmony_ci * struct ionic_fw_control_cmd - Firmware control command
231462306a36Sopenharmony_ci * @opcode:    opcode
231562306a36Sopenharmony_ci * @oper:      firmware control operation (enum ionic_fw_control_oper)
231662306a36Sopenharmony_ci * @slot:      slot to activate
231762306a36Sopenharmony_ci */
231862306a36Sopenharmony_cistruct ionic_fw_control_cmd {
231962306a36Sopenharmony_ci	u8  opcode;
232062306a36Sopenharmony_ci	u8  rsvd[3];
232162306a36Sopenharmony_ci	u8  oper;
232262306a36Sopenharmony_ci	u8  slot;
232362306a36Sopenharmony_ci	u8  rsvd1[58];
232462306a36Sopenharmony_ci};
232562306a36Sopenharmony_ci
232662306a36Sopenharmony_ci/**
232762306a36Sopenharmony_ci * struct ionic_fw_control_comp - Firmware control copletion
232862306a36Sopenharmony_ci * @status:     Status of the command (enum ionic_status_code)
232962306a36Sopenharmony_ci * @comp_index: Index in the descriptor ring for which this is the completion
233062306a36Sopenharmony_ci * @slot:       Slot where the firmware was installed
233162306a36Sopenharmony_ci * @color:      Color bit
233262306a36Sopenharmony_ci */
233362306a36Sopenharmony_cistruct ionic_fw_control_comp {
233462306a36Sopenharmony_ci	u8     status;
233562306a36Sopenharmony_ci	u8     rsvd;
233662306a36Sopenharmony_ci	__le16 comp_index;
233762306a36Sopenharmony_ci	u8     slot;
233862306a36Sopenharmony_ci	u8     rsvd1[10];
233962306a36Sopenharmony_ci	u8     color;
234062306a36Sopenharmony_ci};
234162306a36Sopenharmony_ci
234262306a36Sopenharmony_ci/******************************************************************
234362306a36Sopenharmony_ci ******************* RDMA Commands ********************************
234462306a36Sopenharmony_ci ******************************************************************/
234562306a36Sopenharmony_ci
234662306a36Sopenharmony_ci/**
234762306a36Sopenharmony_ci * struct ionic_rdma_reset_cmd - Reset RDMA LIF cmd
234862306a36Sopenharmony_ci * @opcode:        opcode
234962306a36Sopenharmony_ci * @lif_index:     LIF index
235062306a36Sopenharmony_ci *
235162306a36Sopenharmony_ci * There is no RDMA specific dev command completion struct.  Completion uses
235262306a36Sopenharmony_ci * the common struct ionic_admin_comp.  Only the status is indicated.
235362306a36Sopenharmony_ci * Nonzero status means the LIF does not support RDMA.
235462306a36Sopenharmony_ci **/
235562306a36Sopenharmony_cistruct ionic_rdma_reset_cmd {
235662306a36Sopenharmony_ci	u8     opcode;
235762306a36Sopenharmony_ci	u8     rsvd;
235862306a36Sopenharmony_ci	__le16 lif_index;
235962306a36Sopenharmony_ci	u8     rsvd2[60];
236062306a36Sopenharmony_ci};
236162306a36Sopenharmony_ci
236262306a36Sopenharmony_ci/**
236362306a36Sopenharmony_ci * struct ionic_rdma_queue_cmd - Create RDMA Queue command
236462306a36Sopenharmony_ci * @opcode:        opcode, 52, 53
236562306a36Sopenharmony_ci * @lif_index:     LIF index
236662306a36Sopenharmony_ci * @qid_ver:       (qid | (RDMA version << 24))
236762306a36Sopenharmony_ci * @cid:           intr, eq_id, or cq_id
236862306a36Sopenharmony_ci * @dbid:          doorbell page id
236962306a36Sopenharmony_ci * @depth_log2:    log base two of queue depth
237062306a36Sopenharmony_ci * @stride_log2:   log base two of queue stride
237162306a36Sopenharmony_ci * @dma_addr:      address of the queue memory
237262306a36Sopenharmony_ci *
237362306a36Sopenharmony_ci * The same command struct is used to create an RDMA event queue, completion
237462306a36Sopenharmony_ci * queue, or RDMA admin queue.  The cid is an interrupt number for an event
237562306a36Sopenharmony_ci * queue, an event queue id for a completion queue, or a completion queue id
237662306a36Sopenharmony_ci * for an RDMA admin queue.
237762306a36Sopenharmony_ci *
237862306a36Sopenharmony_ci * The queue created via a dev command must be contiguous in dma space.
237962306a36Sopenharmony_ci *
238062306a36Sopenharmony_ci * The dev commands are intended only to be used during driver initialization,
238162306a36Sopenharmony_ci * to create queues supporting the RDMA admin queue.  Other queues, and other
238262306a36Sopenharmony_ci * types of RDMA resources like memory regions, will be created and registered
238362306a36Sopenharmony_ci * via the RDMA admin queue, and will support a more complete interface
238462306a36Sopenharmony_ci * providing scatter gather lists for larger, scattered queue buffers and
238562306a36Sopenharmony_ci * memory registration.
238662306a36Sopenharmony_ci *
238762306a36Sopenharmony_ci * There is no RDMA specific dev command completion struct.  Completion uses
238862306a36Sopenharmony_ci * the common struct ionic_admin_comp.  Only the status is indicated.
238962306a36Sopenharmony_ci **/
239062306a36Sopenharmony_cistruct ionic_rdma_queue_cmd {
239162306a36Sopenharmony_ci	u8     opcode;
239262306a36Sopenharmony_ci	u8     rsvd;
239362306a36Sopenharmony_ci	__le16 lif_index;
239462306a36Sopenharmony_ci	__le32 qid_ver;
239562306a36Sopenharmony_ci	__le32 cid;
239662306a36Sopenharmony_ci	__le16 dbid;
239762306a36Sopenharmony_ci	u8     depth_log2;
239862306a36Sopenharmony_ci	u8     stride_log2;
239962306a36Sopenharmony_ci	__le64 dma_addr;
240062306a36Sopenharmony_ci	u8     rsvd2[40];
240162306a36Sopenharmony_ci};
240262306a36Sopenharmony_ci
240362306a36Sopenharmony_ci/******************************************************************
240462306a36Sopenharmony_ci ******************* Notify Events ********************************
240562306a36Sopenharmony_ci ******************************************************************/
240662306a36Sopenharmony_ci
240762306a36Sopenharmony_ci/**
240862306a36Sopenharmony_ci * struct ionic_notifyq_event - Generic event reporting structure
240962306a36Sopenharmony_ci * @eid:   event number
241062306a36Sopenharmony_ci * @ecode: event code
241162306a36Sopenharmony_ci * @data:  unspecified data about the event
241262306a36Sopenharmony_ci *
241362306a36Sopenharmony_ci * This is the generic event report struct from which the other
241462306a36Sopenharmony_ci * actual events will be formed.
241562306a36Sopenharmony_ci */
241662306a36Sopenharmony_cistruct ionic_notifyq_event {
241762306a36Sopenharmony_ci	__le64 eid;
241862306a36Sopenharmony_ci	__le16 ecode;
241962306a36Sopenharmony_ci	u8     data[54];
242062306a36Sopenharmony_ci};
242162306a36Sopenharmony_ci
242262306a36Sopenharmony_ci/**
242362306a36Sopenharmony_ci * struct ionic_link_change_event - Link change event notification
242462306a36Sopenharmony_ci * @eid:		event number
242562306a36Sopenharmony_ci * @ecode:		event code = IONIC_EVENT_LINK_CHANGE
242662306a36Sopenharmony_ci * @link_status:	link up/down, with error bits (enum ionic_port_status)
242762306a36Sopenharmony_ci * @link_speed:		speed of the network link
242862306a36Sopenharmony_ci *
242962306a36Sopenharmony_ci * Sent when the network link state changes between UP and DOWN
243062306a36Sopenharmony_ci */
243162306a36Sopenharmony_cistruct ionic_link_change_event {
243262306a36Sopenharmony_ci	__le64 eid;
243362306a36Sopenharmony_ci	__le16 ecode;
243462306a36Sopenharmony_ci	__le16 link_status;
243562306a36Sopenharmony_ci	__le32 link_speed;	/* units of 1Mbps: e.g. 10000 = 10Gbps */
243662306a36Sopenharmony_ci	u8     rsvd[48];
243762306a36Sopenharmony_ci};
243862306a36Sopenharmony_ci
243962306a36Sopenharmony_ci/**
244062306a36Sopenharmony_ci * struct ionic_reset_event - Reset event notification
244162306a36Sopenharmony_ci * @eid:		event number
244262306a36Sopenharmony_ci * @ecode:		event code = IONIC_EVENT_RESET
244362306a36Sopenharmony_ci * @reset_code:		reset type
244462306a36Sopenharmony_ci * @state:		0=pending, 1=complete, 2=error
244562306a36Sopenharmony_ci *
244662306a36Sopenharmony_ci * Sent when the NIC or some subsystem is going to be or
244762306a36Sopenharmony_ci * has been reset.
244862306a36Sopenharmony_ci */
244962306a36Sopenharmony_cistruct ionic_reset_event {
245062306a36Sopenharmony_ci	__le64 eid;
245162306a36Sopenharmony_ci	__le16 ecode;
245262306a36Sopenharmony_ci	u8     reset_code;
245362306a36Sopenharmony_ci	u8     state;
245462306a36Sopenharmony_ci	u8     rsvd[52];
245562306a36Sopenharmony_ci};
245662306a36Sopenharmony_ci
245762306a36Sopenharmony_ci/**
245862306a36Sopenharmony_ci * struct ionic_heartbeat_event - Sent periodically by NIC to indicate health
245962306a36Sopenharmony_ci * @eid:	event number
246062306a36Sopenharmony_ci * @ecode:	event code = IONIC_EVENT_HEARTBEAT
246162306a36Sopenharmony_ci */
246262306a36Sopenharmony_cistruct ionic_heartbeat_event {
246362306a36Sopenharmony_ci	__le64 eid;
246462306a36Sopenharmony_ci	__le16 ecode;
246562306a36Sopenharmony_ci	u8     rsvd[54];
246662306a36Sopenharmony_ci};
246762306a36Sopenharmony_ci
246862306a36Sopenharmony_ci/**
246962306a36Sopenharmony_ci * struct ionic_log_event - Sent to notify the driver of an internal error
247062306a36Sopenharmony_ci * @eid:	event number
247162306a36Sopenharmony_ci * @ecode:	event code = IONIC_EVENT_LOG
247262306a36Sopenharmony_ci * @data:	log data
247362306a36Sopenharmony_ci */
247462306a36Sopenharmony_cistruct ionic_log_event {
247562306a36Sopenharmony_ci	__le64 eid;
247662306a36Sopenharmony_ci	__le16 ecode;
247762306a36Sopenharmony_ci	u8     data[54];
247862306a36Sopenharmony_ci};
247962306a36Sopenharmony_ci
248062306a36Sopenharmony_ci/**
248162306a36Sopenharmony_ci * struct ionic_xcvr_event - Transceiver change event
248262306a36Sopenharmony_ci * @eid:	event number
248362306a36Sopenharmony_ci * @ecode:	event code = IONIC_EVENT_XCVR
248462306a36Sopenharmony_ci */
248562306a36Sopenharmony_cistruct ionic_xcvr_event {
248662306a36Sopenharmony_ci	__le64 eid;
248762306a36Sopenharmony_ci	__le16 ecode;
248862306a36Sopenharmony_ci	u8     rsvd[54];
248962306a36Sopenharmony_ci};
249062306a36Sopenharmony_ci
249162306a36Sopenharmony_ci/**
249262306a36Sopenharmony_ci * struct ionic_port_stats - Port statistics structure
249362306a36Sopenharmony_ci */
249462306a36Sopenharmony_cistruct ionic_port_stats {
249562306a36Sopenharmony_ci	__le64 frames_rx_ok;
249662306a36Sopenharmony_ci	__le64 frames_rx_all;
249762306a36Sopenharmony_ci	__le64 frames_rx_bad_fcs;
249862306a36Sopenharmony_ci	__le64 frames_rx_bad_all;
249962306a36Sopenharmony_ci	__le64 octets_rx_ok;
250062306a36Sopenharmony_ci	__le64 octets_rx_all;
250162306a36Sopenharmony_ci	__le64 frames_rx_unicast;
250262306a36Sopenharmony_ci	__le64 frames_rx_multicast;
250362306a36Sopenharmony_ci	__le64 frames_rx_broadcast;
250462306a36Sopenharmony_ci	__le64 frames_rx_pause;
250562306a36Sopenharmony_ci	__le64 frames_rx_bad_length;
250662306a36Sopenharmony_ci	__le64 frames_rx_undersized;
250762306a36Sopenharmony_ci	__le64 frames_rx_oversized;
250862306a36Sopenharmony_ci	__le64 frames_rx_fragments;
250962306a36Sopenharmony_ci	__le64 frames_rx_jabber;
251062306a36Sopenharmony_ci	__le64 frames_rx_pripause;
251162306a36Sopenharmony_ci	__le64 frames_rx_stomped_crc;
251262306a36Sopenharmony_ci	__le64 frames_rx_too_long;
251362306a36Sopenharmony_ci	__le64 frames_rx_vlan_good;
251462306a36Sopenharmony_ci	__le64 frames_rx_dropped;
251562306a36Sopenharmony_ci	__le64 frames_rx_less_than_64b;
251662306a36Sopenharmony_ci	__le64 frames_rx_64b;
251762306a36Sopenharmony_ci	__le64 frames_rx_65b_127b;
251862306a36Sopenharmony_ci	__le64 frames_rx_128b_255b;
251962306a36Sopenharmony_ci	__le64 frames_rx_256b_511b;
252062306a36Sopenharmony_ci	__le64 frames_rx_512b_1023b;
252162306a36Sopenharmony_ci	__le64 frames_rx_1024b_1518b;
252262306a36Sopenharmony_ci	__le64 frames_rx_1519b_2047b;
252362306a36Sopenharmony_ci	__le64 frames_rx_2048b_4095b;
252462306a36Sopenharmony_ci	__le64 frames_rx_4096b_8191b;
252562306a36Sopenharmony_ci	__le64 frames_rx_8192b_9215b;
252662306a36Sopenharmony_ci	__le64 frames_rx_other;
252762306a36Sopenharmony_ci	__le64 frames_tx_ok;
252862306a36Sopenharmony_ci	__le64 frames_tx_all;
252962306a36Sopenharmony_ci	__le64 frames_tx_bad;
253062306a36Sopenharmony_ci	__le64 octets_tx_ok;
253162306a36Sopenharmony_ci	__le64 octets_tx_total;
253262306a36Sopenharmony_ci	__le64 frames_tx_unicast;
253362306a36Sopenharmony_ci	__le64 frames_tx_multicast;
253462306a36Sopenharmony_ci	__le64 frames_tx_broadcast;
253562306a36Sopenharmony_ci	__le64 frames_tx_pause;
253662306a36Sopenharmony_ci	__le64 frames_tx_pripause;
253762306a36Sopenharmony_ci	__le64 frames_tx_vlan;
253862306a36Sopenharmony_ci	__le64 frames_tx_less_than_64b;
253962306a36Sopenharmony_ci	__le64 frames_tx_64b;
254062306a36Sopenharmony_ci	__le64 frames_tx_65b_127b;
254162306a36Sopenharmony_ci	__le64 frames_tx_128b_255b;
254262306a36Sopenharmony_ci	__le64 frames_tx_256b_511b;
254362306a36Sopenharmony_ci	__le64 frames_tx_512b_1023b;
254462306a36Sopenharmony_ci	__le64 frames_tx_1024b_1518b;
254562306a36Sopenharmony_ci	__le64 frames_tx_1519b_2047b;
254662306a36Sopenharmony_ci	__le64 frames_tx_2048b_4095b;
254762306a36Sopenharmony_ci	__le64 frames_tx_4096b_8191b;
254862306a36Sopenharmony_ci	__le64 frames_tx_8192b_9215b;
254962306a36Sopenharmony_ci	__le64 frames_tx_other;
255062306a36Sopenharmony_ci	__le64 frames_tx_pri_0;
255162306a36Sopenharmony_ci	__le64 frames_tx_pri_1;
255262306a36Sopenharmony_ci	__le64 frames_tx_pri_2;
255362306a36Sopenharmony_ci	__le64 frames_tx_pri_3;
255462306a36Sopenharmony_ci	__le64 frames_tx_pri_4;
255562306a36Sopenharmony_ci	__le64 frames_tx_pri_5;
255662306a36Sopenharmony_ci	__le64 frames_tx_pri_6;
255762306a36Sopenharmony_ci	__le64 frames_tx_pri_7;
255862306a36Sopenharmony_ci	__le64 frames_rx_pri_0;
255962306a36Sopenharmony_ci	__le64 frames_rx_pri_1;
256062306a36Sopenharmony_ci	__le64 frames_rx_pri_2;
256162306a36Sopenharmony_ci	__le64 frames_rx_pri_3;
256262306a36Sopenharmony_ci	__le64 frames_rx_pri_4;
256362306a36Sopenharmony_ci	__le64 frames_rx_pri_5;
256462306a36Sopenharmony_ci	__le64 frames_rx_pri_6;
256562306a36Sopenharmony_ci	__le64 frames_rx_pri_7;
256662306a36Sopenharmony_ci	__le64 tx_pripause_0_1us_count;
256762306a36Sopenharmony_ci	__le64 tx_pripause_1_1us_count;
256862306a36Sopenharmony_ci	__le64 tx_pripause_2_1us_count;
256962306a36Sopenharmony_ci	__le64 tx_pripause_3_1us_count;
257062306a36Sopenharmony_ci	__le64 tx_pripause_4_1us_count;
257162306a36Sopenharmony_ci	__le64 tx_pripause_5_1us_count;
257262306a36Sopenharmony_ci	__le64 tx_pripause_6_1us_count;
257362306a36Sopenharmony_ci	__le64 tx_pripause_7_1us_count;
257462306a36Sopenharmony_ci	__le64 rx_pripause_0_1us_count;
257562306a36Sopenharmony_ci	__le64 rx_pripause_1_1us_count;
257662306a36Sopenharmony_ci	__le64 rx_pripause_2_1us_count;
257762306a36Sopenharmony_ci	__le64 rx_pripause_3_1us_count;
257862306a36Sopenharmony_ci	__le64 rx_pripause_4_1us_count;
257962306a36Sopenharmony_ci	__le64 rx_pripause_5_1us_count;
258062306a36Sopenharmony_ci	__le64 rx_pripause_6_1us_count;
258162306a36Sopenharmony_ci	__le64 rx_pripause_7_1us_count;
258262306a36Sopenharmony_ci	__le64 rx_pause_1us_count;
258362306a36Sopenharmony_ci	__le64 frames_tx_truncated;
258462306a36Sopenharmony_ci};
258562306a36Sopenharmony_ci
258662306a36Sopenharmony_cistruct ionic_mgmt_port_stats {
258762306a36Sopenharmony_ci	__le64 frames_rx_ok;
258862306a36Sopenharmony_ci	__le64 frames_rx_all;
258962306a36Sopenharmony_ci	__le64 frames_rx_bad_fcs;
259062306a36Sopenharmony_ci	__le64 frames_rx_bad_all;
259162306a36Sopenharmony_ci	__le64 octets_rx_ok;
259262306a36Sopenharmony_ci	__le64 octets_rx_all;
259362306a36Sopenharmony_ci	__le64 frames_rx_unicast;
259462306a36Sopenharmony_ci	__le64 frames_rx_multicast;
259562306a36Sopenharmony_ci	__le64 frames_rx_broadcast;
259662306a36Sopenharmony_ci	__le64 frames_rx_pause;
259762306a36Sopenharmony_ci	__le64 frames_rx_bad_length;
259862306a36Sopenharmony_ci	__le64 frames_rx_undersized;
259962306a36Sopenharmony_ci	__le64 frames_rx_oversized;
260062306a36Sopenharmony_ci	__le64 frames_rx_fragments;
260162306a36Sopenharmony_ci	__le64 frames_rx_jabber;
260262306a36Sopenharmony_ci	__le64 frames_rx_64b;
260362306a36Sopenharmony_ci	__le64 frames_rx_65b_127b;
260462306a36Sopenharmony_ci	__le64 frames_rx_128b_255b;
260562306a36Sopenharmony_ci	__le64 frames_rx_256b_511b;
260662306a36Sopenharmony_ci	__le64 frames_rx_512b_1023b;
260762306a36Sopenharmony_ci	__le64 frames_rx_1024b_1518b;
260862306a36Sopenharmony_ci	__le64 frames_rx_gt_1518b;
260962306a36Sopenharmony_ci	__le64 frames_rx_fifo_full;
261062306a36Sopenharmony_ci	__le64 frames_tx_ok;
261162306a36Sopenharmony_ci	__le64 frames_tx_all;
261262306a36Sopenharmony_ci	__le64 frames_tx_bad;
261362306a36Sopenharmony_ci	__le64 octets_tx_ok;
261462306a36Sopenharmony_ci	__le64 octets_tx_total;
261562306a36Sopenharmony_ci	__le64 frames_tx_unicast;
261662306a36Sopenharmony_ci	__le64 frames_tx_multicast;
261762306a36Sopenharmony_ci	__le64 frames_tx_broadcast;
261862306a36Sopenharmony_ci	__le64 frames_tx_pause;
261962306a36Sopenharmony_ci};
262062306a36Sopenharmony_ci
262162306a36Sopenharmony_cienum ionic_pb_buffer_drop_stats {
262262306a36Sopenharmony_ci	IONIC_BUFFER_INTRINSIC_DROP = 0,
262362306a36Sopenharmony_ci	IONIC_BUFFER_DISCARDED,
262462306a36Sopenharmony_ci	IONIC_BUFFER_ADMITTED,
262562306a36Sopenharmony_ci	IONIC_BUFFER_OUT_OF_CELLS_DROP,
262662306a36Sopenharmony_ci	IONIC_BUFFER_OUT_OF_CELLS_DROP_2,
262762306a36Sopenharmony_ci	IONIC_BUFFER_OUT_OF_CREDIT_DROP,
262862306a36Sopenharmony_ci	IONIC_BUFFER_TRUNCATION_DROP,
262962306a36Sopenharmony_ci	IONIC_BUFFER_PORT_DISABLED_DROP,
263062306a36Sopenharmony_ci	IONIC_BUFFER_COPY_TO_CPU_TAIL_DROP,
263162306a36Sopenharmony_ci	IONIC_BUFFER_SPAN_TAIL_DROP,
263262306a36Sopenharmony_ci	IONIC_BUFFER_MIN_SIZE_VIOLATION_DROP,
263362306a36Sopenharmony_ci	IONIC_BUFFER_ENQUEUE_ERROR_DROP,
263462306a36Sopenharmony_ci	IONIC_BUFFER_INVALID_PORT_DROP,
263562306a36Sopenharmony_ci	IONIC_BUFFER_INVALID_OUTPUT_QUEUE_DROP,
263662306a36Sopenharmony_ci	IONIC_BUFFER_DROP_MAX,
263762306a36Sopenharmony_ci};
263862306a36Sopenharmony_ci
263962306a36Sopenharmony_cienum ionic_oflow_drop_stats {
264062306a36Sopenharmony_ci	IONIC_OFLOW_OCCUPANCY_DROP,
264162306a36Sopenharmony_ci	IONIC_OFLOW_EMERGENCY_STOP_DROP,
264262306a36Sopenharmony_ci	IONIC_OFLOW_WRITE_BUFFER_ACK_FILL_UP_DROP,
264362306a36Sopenharmony_ci	IONIC_OFLOW_WRITE_BUFFER_ACK_FULL_DROP,
264462306a36Sopenharmony_ci	IONIC_OFLOW_WRITE_BUFFER_FULL_DROP,
264562306a36Sopenharmony_ci	IONIC_OFLOW_CONTROL_FIFO_FULL_DROP,
264662306a36Sopenharmony_ci	IONIC_OFLOW_DROP_MAX,
264762306a36Sopenharmony_ci};
264862306a36Sopenharmony_ci
264962306a36Sopenharmony_ci/**
265062306a36Sopenharmony_ci * struct port_pb_stats - packet buffers system stats
265162306a36Sopenharmony_ci * uses ionic_pb_buffer_drop_stats for drop_counts[]
265262306a36Sopenharmony_ci */
265362306a36Sopenharmony_cistruct ionic_port_pb_stats {
265462306a36Sopenharmony_ci	__le64 sop_count_in;
265562306a36Sopenharmony_ci	__le64 eop_count_in;
265662306a36Sopenharmony_ci	__le64 sop_count_out;
265762306a36Sopenharmony_ci	__le64 eop_count_out;
265862306a36Sopenharmony_ci	__le64 drop_counts[IONIC_BUFFER_DROP_MAX];
265962306a36Sopenharmony_ci	__le64 input_queue_buffer_occupancy[IONIC_QOS_TC_MAX];
266062306a36Sopenharmony_ci	__le64 input_queue_port_monitor[IONIC_QOS_TC_MAX];
266162306a36Sopenharmony_ci	__le64 output_queue_port_monitor[IONIC_QOS_TC_MAX];
266262306a36Sopenharmony_ci	__le64 oflow_drop_counts[IONIC_OFLOW_DROP_MAX];
266362306a36Sopenharmony_ci	__le64 input_queue_good_pkts_in[IONIC_QOS_TC_MAX];
266462306a36Sopenharmony_ci	__le64 input_queue_good_pkts_out[IONIC_QOS_TC_MAX];
266562306a36Sopenharmony_ci	__le64 input_queue_err_pkts_in[IONIC_QOS_TC_MAX];
266662306a36Sopenharmony_ci	__le64 input_queue_fifo_depth[IONIC_QOS_TC_MAX];
266762306a36Sopenharmony_ci	__le64 input_queue_max_fifo_depth[IONIC_QOS_TC_MAX];
266862306a36Sopenharmony_ci	__le64 input_queue_peak_occupancy[IONIC_QOS_TC_MAX];
266962306a36Sopenharmony_ci	__le64 output_queue_buffer_occupancy[IONIC_QOS_TC_MAX];
267062306a36Sopenharmony_ci};
267162306a36Sopenharmony_ci
267262306a36Sopenharmony_ci/**
267362306a36Sopenharmony_ci * struct ionic_port_identity - port identity structure
267462306a36Sopenharmony_ci * @version:        identity structure version
267562306a36Sopenharmony_ci * @type:           type of port (enum ionic_port_type)
267662306a36Sopenharmony_ci * @num_lanes:      number of lanes for the port
267762306a36Sopenharmony_ci * @autoneg:        autoneg supported
267862306a36Sopenharmony_ci * @min_frame_size: minimum frame size supported
267962306a36Sopenharmony_ci * @max_frame_size: maximum frame size supported
268062306a36Sopenharmony_ci * @fec_type:       supported fec types
268162306a36Sopenharmony_ci * @pause_type:     supported pause types
268262306a36Sopenharmony_ci * @loopback_mode:  supported loopback mode
268362306a36Sopenharmony_ci * @speeds:         supported speeds
268462306a36Sopenharmony_ci * @config:         current port configuration
268562306a36Sopenharmony_ci */
268662306a36Sopenharmony_ciunion ionic_port_identity {
268762306a36Sopenharmony_ci	struct {
268862306a36Sopenharmony_ci		u8     version;
268962306a36Sopenharmony_ci		u8     type;
269062306a36Sopenharmony_ci		u8     num_lanes;
269162306a36Sopenharmony_ci		u8     autoneg;
269262306a36Sopenharmony_ci		__le32 min_frame_size;
269362306a36Sopenharmony_ci		__le32 max_frame_size;
269462306a36Sopenharmony_ci		u8     fec_type[4];
269562306a36Sopenharmony_ci		u8     pause_type[2];
269662306a36Sopenharmony_ci		u8     loopback_mode[2];
269762306a36Sopenharmony_ci		__le32 speeds[16];
269862306a36Sopenharmony_ci		u8     rsvd2[44];
269962306a36Sopenharmony_ci		union ionic_port_config config;
270062306a36Sopenharmony_ci	};
270162306a36Sopenharmony_ci	__le32 words[478];
270262306a36Sopenharmony_ci};
270362306a36Sopenharmony_ci
270462306a36Sopenharmony_ci/**
270562306a36Sopenharmony_ci * struct ionic_port_info - port info structure
270662306a36Sopenharmony_ci * @config:          Port configuration data
270762306a36Sopenharmony_ci * @status:          Port status data
270862306a36Sopenharmony_ci * @stats:           Port statistics data
270962306a36Sopenharmony_ci * @mgmt_stats:      Port management statistics data
271062306a36Sopenharmony_ci * @port_pb_drop_stats:   uplink pb drop stats
271162306a36Sopenharmony_ci */
271262306a36Sopenharmony_cistruct ionic_port_info {
271362306a36Sopenharmony_ci	union ionic_port_config config;
271462306a36Sopenharmony_ci	struct ionic_port_status status;
271562306a36Sopenharmony_ci	union {
271662306a36Sopenharmony_ci		struct ionic_port_stats      stats;
271762306a36Sopenharmony_ci		struct ionic_mgmt_port_stats mgmt_stats;
271862306a36Sopenharmony_ci	};
271962306a36Sopenharmony_ci	/* room for pb_stats to start at 2k offset */
272062306a36Sopenharmony_ci	u8                          rsvd[760];
272162306a36Sopenharmony_ci	struct ionic_port_pb_stats  pb_stats;
272262306a36Sopenharmony_ci};
272362306a36Sopenharmony_ci
272462306a36Sopenharmony_ci/**
272562306a36Sopenharmony_ci * struct ionic_lif_stats - LIF statistics structure
272662306a36Sopenharmony_ci */
272762306a36Sopenharmony_cistruct ionic_lif_stats {
272862306a36Sopenharmony_ci	/* RX */
272962306a36Sopenharmony_ci	__le64 rx_ucast_bytes;
273062306a36Sopenharmony_ci	__le64 rx_ucast_packets;
273162306a36Sopenharmony_ci	__le64 rx_mcast_bytes;
273262306a36Sopenharmony_ci	__le64 rx_mcast_packets;
273362306a36Sopenharmony_ci	__le64 rx_bcast_bytes;
273462306a36Sopenharmony_ci	__le64 rx_bcast_packets;
273562306a36Sopenharmony_ci	__le64 rsvd0;
273662306a36Sopenharmony_ci	__le64 rsvd1;
273762306a36Sopenharmony_ci	/* RX drops */
273862306a36Sopenharmony_ci	__le64 rx_ucast_drop_bytes;
273962306a36Sopenharmony_ci	__le64 rx_ucast_drop_packets;
274062306a36Sopenharmony_ci	__le64 rx_mcast_drop_bytes;
274162306a36Sopenharmony_ci	__le64 rx_mcast_drop_packets;
274262306a36Sopenharmony_ci	__le64 rx_bcast_drop_bytes;
274362306a36Sopenharmony_ci	__le64 rx_bcast_drop_packets;
274462306a36Sopenharmony_ci	__le64 rx_dma_error;
274562306a36Sopenharmony_ci	__le64 rsvd2;
274662306a36Sopenharmony_ci	/* TX */
274762306a36Sopenharmony_ci	__le64 tx_ucast_bytes;
274862306a36Sopenharmony_ci	__le64 tx_ucast_packets;
274962306a36Sopenharmony_ci	__le64 tx_mcast_bytes;
275062306a36Sopenharmony_ci	__le64 tx_mcast_packets;
275162306a36Sopenharmony_ci	__le64 tx_bcast_bytes;
275262306a36Sopenharmony_ci	__le64 tx_bcast_packets;
275362306a36Sopenharmony_ci	__le64 rsvd3;
275462306a36Sopenharmony_ci	__le64 rsvd4;
275562306a36Sopenharmony_ci	/* TX drops */
275662306a36Sopenharmony_ci	__le64 tx_ucast_drop_bytes;
275762306a36Sopenharmony_ci	__le64 tx_ucast_drop_packets;
275862306a36Sopenharmony_ci	__le64 tx_mcast_drop_bytes;
275962306a36Sopenharmony_ci	__le64 tx_mcast_drop_packets;
276062306a36Sopenharmony_ci	__le64 tx_bcast_drop_bytes;
276162306a36Sopenharmony_ci	__le64 tx_bcast_drop_packets;
276262306a36Sopenharmony_ci	__le64 tx_dma_error;
276362306a36Sopenharmony_ci	__le64 rsvd5;
276462306a36Sopenharmony_ci	/* Rx Queue/Ring drops */
276562306a36Sopenharmony_ci	__le64 rx_queue_disabled;
276662306a36Sopenharmony_ci	__le64 rx_queue_empty;
276762306a36Sopenharmony_ci	__le64 rx_queue_error;
276862306a36Sopenharmony_ci	__le64 rx_desc_fetch_error;
276962306a36Sopenharmony_ci	__le64 rx_desc_data_error;
277062306a36Sopenharmony_ci	__le64 rsvd6;
277162306a36Sopenharmony_ci	__le64 rsvd7;
277262306a36Sopenharmony_ci	__le64 rsvd8;
277362306a36Sopenharmony_ci	/* Tx Queue/Ring drops */
277462306a36Sopenharmony_ci	__le64 tx_queue_disabled;
277562306a36Sopenharmony_ci	__le64 tx_queue_error;
277662306a36Sopenharmony_ci	__le64 tx_desc_fetch_error;
277762306a36Sopenharmony_ci	__le64 tx_desc_data_error;
277862306a36Sopenharmony_ci	__le64 tx_queue_empty;
277962306a36Sopenharmony_ci	__le64 rsvd10;
278062306a36Sopenharmony_ci	__le64 rsvd11;
278162306a36Sopenharmony_ci	__le64 rsvd12;
278262306a36Sopenharmony_ci
278362306a36Sopenharmony_ci	/* RDMA/ROCE TX */
278462306a36Sopenharmony_ci	__le64 tx_rdma_ucast_bytes;
278562306a36Sopenharmony_ci	__le64 tx_rdma_ucast_packets;
278662306a36Sopenharmony_ci	__le64 tx_rdma_mcast_bytes;
278762306a36Sopenharmony_ci	__le64 tx_rdma_mcast_packets;
278862306a36Sopenharmony_ci	__le64 tx_rdma_cnp_packets;
278962306a36Sopenharmony_ci	__le64 rsvd13;
279062306a36Sopenharmony_ci	__le64 rsvd14;
279162306a36Sopenharmony_ci	__le64 rsvd15;
279262306a36Sopenharmony_ci
279362306a36Sopenharmony_ci	/* RDMA/ROCE RX */
279462306a36Sopenharmony_ci	__le64 rx_rdma_ucast_bytes;
279562306a36Sopenharmony_ci	__le64 rx_rdma_ucast_packets;
279662306a36Sopenharmony_ci	__le64 rx_rdma_mcast_bytes;
279762306a36Sopenharmony_ci	__le64 rx_rdma_mcast_packets;
279862306a36Sopenharmony_ci	__le64 rx_rdma_cnp_packets;
279962306a36Sopenharmony_ci	__le64 rx_rdma_ecn_packets;
280062306a36Sopenharmony_ci	__le64 rsvd16;
280162306a36Sopenharmony_ci	__le64 rsvd17;
280262306a36Sopenharmony_ci
280362306a36Sopenharmony_ci	__le64 rsvd18;
280462306a36Sopenharmony_ci	__le64 rsvd19;
280562306a36Sopenharmony_ci	__le64 rsvd20;
280662306a36Sopenharmony_ci	__le64 rsvd21;
280762306a36Sopenharmony_ci	__le64 rsvd22;
280862306a36Sopenharmony_ci	__le64 rsvd23;
280962306a36Sopenharmony_ci	__le64 rsvd24;
281062306a36Sopenharmony_ci	__le64 rsvd25;
281162306a36Sopenharmony_ci
281262306a36Sopenharmony_ci	__le64 rsvd26;
281362306a36Sopenharmony_ci	__le64 rsvd27;
281462306a36Sopenharmony_ci	__le64 rsvd28;
281562306a36Sopenharmony_ci	__le64 rsvd29;
281662306a36Sopenharmony_ci	__le64 rsvd30;
281762306a36Sopenharmony_ci	__le64 rsvd31;
281862306a36Sopenharmony_ci	__le64 rsvd32;
281962306a36Sopenharmony_ci	__le64 rsvd33;
282062306a36Sopenharmony_ci
282162306a36Sopenharmony_ci	__le64 rsvd34;
282262306a36Sopenharmony_ci	__le64 rsvd35;
282362306a36Sopenharmony_ci	__le64 rsvd36;
282462306a36Sopenharmony_ci	__le64 rsvd37;
282562306a36Sopenharmony_ci	__le64 rsvd38;
282662306a36Sopenharmony_ci	__le64 rsvd39;
282762306a36Sopenharmony_ci	__le64 rsvd40;
282862306a36Sopenharmony_ci	__le64 rsvd41;
282962306a36Sopenharmony_ci
283062306a36Sopenharmony_ci	__le64 rsvd42;
283162306a36Sopenharmony_ci	__le64 rsvd43;
283262306a36Sopenharmony_ci	__le64 rsvd44;
283362306a36Sopenharmony_ci	__le64 rsvd45;
283462306a36Sopenharmony_ci	__le64 rsvd46;
283562306a36Sopenharmony_ci	__le64 rsvd47;
283662306a36Sopenharmony_ci	__le64 rsvd48;
283762306a36Sopenharmony_ci	__le64 rsvd49;
283862306a36Sopenharmony_ci
283962306a36Sopenharmony_ci	/* RDMA/ROCE REQ Error/Debugs (768 - 895) */
284062306a36Sopenharmony_ci	__le64 rdma_req_rx_pkt_seq_err;
284162306a36Sopenharmony_ci	__le64 rdma_req_rx_rnr_retry_err;
284262306a36Sopenharmony_ci	__le64 rdma_req_rx_remote_access_err;
284362306a36Sopenharmony_ci	__le64 rdma_req_rx_remote_inv_req_err;
284462306a36Sopenharmony_ci	__le64 rdma_req_rx_remote_oper_err;
284562306a36Sopenharmony_ci	__le64 rdma_req_rx_implied_nak_seq_err;
284662306a36Sopenharmony_ci	__le64 rdma_req_rx_cqe_err;
284762306a36Sopenharmony_ci	__le64 rdma_req_rx_cqe_flush_err;
284862306a36Sopenharmony_ci
284962306a36Sopenharmony_ci	__le64 rdma_req_rx_dup_responses;
285062306a36Sopenharmony_ci	__le64 rdma_req_rx_invalid_packets;
285162306a36Sopenharmony_ci	__le64 rdma_req_tx_local_access_err;
285262306a36Sopenharmony_ci	__le64 rdma_req_tx_local_oper_err;
285362306a36Sopenharmony_ci	__le64 rdma_req_tx_memory_mgmt_err;
285462306a36Sopenharmony_ci	__le64 rsvd52;
285562306a36Sopenharmony_ci	__le64 rsvd53;
285662306a36Sopenharmony_ci	__le64 rsvd54;
285762306a36Sopenharmony_ci
285862306a36Sopenharmony_ci	/* RDMA/ROCE RESP Error/Debugs (896 - 1023) */
285962306a36Sopenharmony_ci	__le64 rdma_resp_rx_dup_requests;
286062306a36Sopenharmony_ci	__le64 rdma_resp_rx_out_of_buffer;
286162306a36Sopenharmony_ci	__le64 rdma_resp_rx_out_of_seq_pkts;
286262306a36Sopenharmony_ci	__le64 rdma_resp_rx_cqe_err;
286362306a36Sopenharmony_ci	__le64 rdma_resp_rx_cqe_flush_err;
286462306a36Sopenharmony_ci	__le64 rdma_resp_rx_local_len_err;
286562306a36Sopenharmony_ci	__le64 rdma_resp_rx_inv_request_err;
286662306a36Sopenharmony_ci	__le64 rdma_resp_rx_local_qp_oper_err;
286762306a36Sopenharmony_ci
286862306a36Sopenharmony_ci	__le64 rdma_resp_rx_out_of_atomic_resource;
286962306a36Sopenharmony_ci	__le64 rdma_resp_tx_pkt_seq_err;
287062306a36Sopenharmony_ci	__le64 rdma_resp_tx_remote_inv_req_err;
287162306a36Sopenharmony_ci	__le64 rdma_resp_tx_remote_access_err;
287262306a36Sopenharmony_ci	__le64 rdma_resp_tx_remote_oper_err;
287362306a36Sopenharmony_ci	__le64 rdma_resp_tx_rnr_retry_err;
287462306a36Sopenharmony_ci	__le64 rsvd57;
287562306a36Sopenharmony_ci	__le64 rsvd58;
287662306a36Sopenharmony_ci};
287762306a36Sopenharmony_ci
287862306a36Sopenharmony_ci/**
287962306a36Sopenharmony_ci * struct ionic_lif_info - LIF info structure
288062306a36Sopenharmony_ci * @config:	LIF configuration structure
288162306a36Sopenharmony_ci * @status:	LIF status structure
288262306a36Sopenharmony_ci * @stats:	LIF statistics structure
288362306a36Sopenharmony_ci */
288462306a36Sopenharmony_cistruct ionic_lif_info {
288562306a36Sopenharmony_ci	union ionic_lif_config config;
288662306a36Sopenharmony_ci	struct ionic_lif_status status;
288762306a36Sopenharmony_ci	struct ionic_lif_stats stats;
288862306a36Sopenharmony_ci};
288962306a36Sopenharmony_ci
289062306a36Sopenharmony_ciunion ionic_dev_cmd {
289162306a36Sopenharmony_ci	u32 words[16];
289262306a36Sopenharmony_ci	struct ionic_admin_cmd cmd;
289362306a36Sopenharmony_ci	struct ionic_nop_cmd nop;
289462306a36Sopenharmony_ci
289562306a36Sopenharmony_ci	struct ionic_dev_identify_cmd identify;
289662306a36Sopenharmony_ci	struct ionic_dev_init_cmd init;
289762306a36Sopenharmony_ci	struct ionic_dev_reset_cmd reset;
289862306a36Sopenharmony_ci	struct ionic_dev_getattr_cmd getattr;
289962306a36Sopenharmony_ci	struct ionic_dev_setattr_cmd setattr;
290062306a36Sopenharmony_ci
290162306a36Sopenharmony_ci	struct ionic_port_identify_cmd port_identify;
290262306a36Sopenharmony_ci	struct ionic_port_init_cmd port_init;
290362306a36Sopenharmony_ci	struct ionic_port_reset_cmd port_reset;
290462306a36Sopenharmony_ci	struct ionic_port_getattr_cmd port_getattr;
290562306a36Sopenharmony_ci	struct ionic_port_setattr_cmd port_setattr;
290662306a36Sopenharmony_ci
290762306a36Sopenharmony_ci	struct ionic_vf_setattr_cmd vf_setattr;
290862306a36Sopenharmony_ci	struct ionic_vf_getattr_cmd vf_getattr;
290962306a36Sopenharmony_ci	struct ionic_vf_ctrl_cmd vf_ctrl;
291062306a36Sopenharmony_ci
291162306a36Sopenharmony_ci	struct ionic_lif_identify_cmd lif_identify;
291262306a36Sopenharmony_ci	struct ionic_lif_init_cmd lif_init;
291362306a36Sopenharmony_ci	struct ionic_lif_reset_cmd lif_reset;
291462306a36Sopenharmony_ci
291562306a36Sopenharmony_ci	struct ionic_qos_identify_cmd qos_identify;
291662306a36Sopenharmony_ci	struct ionic_qos_init_cmd qos_init;
291762306a36Sopenharmony_ci	struct ionic_qos_reset_cmd qos_reset;
291862306a36Sopenharmony_ci	struct ionic_qos_clear_stats_cmd qos_clear_stats;
291962306a36Sopenharmony_ci
292062306a36Sopenharmony_ci	struct ionic_q_identify_cmd q_identify;
292162306a36Sopenharmony_ci	struct ionic_q_init_cmd q_init;
292262306a36Sopenharmony_ci	struct ionic_q_control_cmd q_control;
292362306a36Sopenharmony_ci
292462306a36Sopenharmony_ci	struct ionic_fw_download_cmd fw_download;
292562306a36Sopenharmony_ci	struct ionic_fw_control_cmd fw_control;
292662306a36Sopenharmony_ci};
292762306a36Sopenharmony_ci
292862306a36Sopenharmony_ciunion ionic_dev_cmd_comp {
292962306a36Sopenharmony_ci	u32 words[4];
293062306a36Sopenharmony_ci	u8 status;
293162306a36Sopenharmony_ci	struct ionic_admin_comp comp;
293262306a36Sopenharmony_ci	struct ionic_nop_comp nop;
293362306a36Sopenharmony_ci
293462306a36Sopenharmony_ci	struct ionic_dev_identify_comp identify;
293562306a36Sopenharmony_ci	struct ionic_dev_init_comp init;
293662306a36Sopenharmony_ci	struct ionic_dev_reset_comp reset;
293762306a36Sopenharmony_ci	struct ionic_dev_getattr_comp getattr;
293862306a36Sopenharmony_ci	struct ionic_dev_setattr_comp setattr;
293962306a36Sopenharmony_ci
294062306a36Sopenharmony_ci	struct ionic_port_identify_comp port_identify;
294162306a36Sopenharmony_ci	struct ionic_port_init_comp port_init;
294262306a36Sopenharmony_ci	struct ionic_port_reset_comp port_reset;
294362306a36Sopenharmony_ci	struct ionic_port_getattr_comp port_getattr;
294462306a36Sopenharmony_ci	struct ionic_port_setattr_comp port_setattr;
294562306a36Sopenharmony_ci
294662306a36Sopenharmony_ci	struct ionic_vf_setattr_comp vf_setattr;
294762306a36Sopenharmony_ci	struct ionic_vf_getattr_comp vf_getattr;
294862306a36Sopenharmony_ci	struct ionic_vf_ctrl_comp vf_ctrl;
294962306a36Sopenharmony_ci
295062306a36Sopenharmony_ci	struct ionic_lif_identify_comp lif_identify;
295162306a36Sopenharmony_ci	struct ionic_lif_init_comp lif_init;
295262306a36Sopenharmony_ci	ionic_lif_reset_comp lif_reset;
295362306a36Sopenharmony_ci
295462306a36Sopenharmony_ci	struct ionic_qos_identify_comp qos_identify;
295562306a36Sopenharmony_ci	ionic_qos_init_comp qos_init;
295662306a36Sopenharmony_ci	ionic_qos_reset_comp qos_reset;
295762306a36Sopenharmony_ci
295862306a36Sopenharmony_ci	struct ionic_q_identify_comp q_identify;
295962306a36Sopenharmony_ci	struct ionic_q_init_comp q_init;
296062306a36Sopenharmony_ci
296162306a36Sopenharmony_ci	ionic_fw_download_comp fw_download;
296262306a36Sopenharmony_ci	struct ionic_fw_control_comp fw_control;
296362306a36Sopenharmony_ci};
296462306a36Sopenharmony_ci
296562306a36Sopenharmony_ci/**
296662306a36Sopenharmony_ci * struct ionic_hwstamp_regs - Hardware current timestamp registers
296762306a36Sopenharmony_ci * @tick_low:        Low 32 bits of hardware timestamp
296862306a36Sopenharmony_ci * @tick_high:       High 32 bits of hardware timestamp
296962306a36Sopenharmony_ci */
297062306a36Sopenharmony_cistruct ionic_hwstamp_regs {
297162306a36Sopenharmony_ci	u32    tick_low;
297262306a36Sopenharmony_ci	u32    tick_high;
297362306a36Sopenharmony_ci};
297462306a36Sopenharmony_ci
297562306a36Sopenharmony_ci/**
297662306a36Sopenharmony_ci * union ionic_dev_info_regs - Device info register format (read-only)
297762306a36Sopenharmony_ci * @signature:       Signature value of 0x44455649 ('DEVI')
297862306a36Sopenharmony_ci * @version:         Current version of info
297962306a36Sopenharmony_ci * @asic_type:       Asic type
298062306a36Sopenharmony_ci * @asic_rev:        Asic revision
298162306a36Sopenharmony_ci * @fw_status:       Firmware status
298262306a36Sopenharmony_ci *			bit 0   - 1 = fw running
298362306a36Sopenharmony_ci *			bit 4-7 - 4 bit generation number, changes on fw restart
298462306a36Sopenharmony_ci * @fw_heartbeat:    Firmware heartbeat counter
298562306a36Sopenharmony_ci * @serial_num:      Serial number
298662306a36Sopenharmony_ci * @fw_version:      Firmware version
298762306a36Sopenharmony_ci * @hwstamp_regs:    Hardware current timestamp registers
298862306a36Sopenharmony_ci */
298962306a36Sopenharmony_ciunion ionic_dev_info_regs {
299062306a36Sopenharmony_ci#define IONIC_DEVINFO_FWVERS_BUFLEN 32
299162306a36Sopenharmony_ci#define IONIC_DEVINFO_SERIAL_BUFLEN 32
299262306a36Sopenharmony_ci	struct {
299362306a36Sopenharmony_ci		u32    signature;
299462306a36Sopenharmony_ci		u8     version;
299562306a36Sopenharmony_ci		u8     asic_type;
299662306a36Sopenharmony_ci		u8     asic_rev;
299762306a36Sopenharmony_ci#define IONIC_FW_STS_F_RUNNING		0x01
299862306a36Sopenharmony_ci#define IONIC_FW_STS_F_GENERATION	0xF0
299962306a36Sopenharmony_ci		u8     fw_status;
300062306a36Sopenharmony_ci		u32    fw_heartbeat;
300162306a36Sopenharmony_ci		char   fw_version[IONIC_DEVINFO_FWVERS_BUFLEN];
300262306a36Sopenharmony_ci		char   serial_num[IONIC_DEVINFO_SERIAL_BUFLEN];
300362306a36Sopenharmony_ci		u8     rsvd_pad1024[948];
300462306a36Sopenharmony_ci		struct ionic_hwstamp_regs hwstamp;
300562306a36Sopenharmony_ci	};
300662306a36Sopenharmony_ci	u32 words[512];
300762306a36Sopenharmony_ci};
300862306a36Sopenharmony_ci
300962306a36Sopenharmony_ci/**
301062306a36Sopenharmony_ci * union ionic_dev_cmd_regs - Device command register format (read-write)
301162306a36Sopenharmony_ci * @doorbell:        Device Cmd Doorbell, write-only
301262306a36Sopenharmony_ci *                   Write a 1 to signal device to process cmd,
301362306a36Sopenharmony_ci *                   poll done for completion.
301462306a36Sopenharmony_ci * @done:            Done indicator, bit 0 == 1 when command is complete
301562306a36Sopenharmony_ci * @cmd:             Opcode-specific command bytes
301662306a36Sopenharmony_ci * @comp:            Opcode-specific response bytes
301762306a36Sopenharmony_ci * @data:            Opcode-specific side-data
301862306a36Sopenharmony_ci */
301962306a36Sopenharmony_ciunion ionic_dev_cmd_regs {
302062306a36Sopenharmony_ci	struct {
302162306a36Sopenharmony_ci		u32                   doorbell;
302262306a36Sopenharmony_ci		u32                   done;
302362306a36Sopenharmony_ci		union ionic_dev_cmd         cmd;
302462306a36Sopenharmony_ci		union ionic_dev_cmd_comp    comp;
302562306a36Sopenharmony_ci		u8                    rsvd[48];
302662306a36Sopenharmony_ci		u32                   data[478];
302762306a36Sopenharmony_ci	} __packed;
302862306a36Sopenharmony_ci	u32 words[512];
302962306a36Sopenharmony_ci};
303062306a36Sopenharmony_ci
303162306a36Sopenharmony_ci/**
303262306a36Sopenharmony_ci * union ionic_dev_regs - Device register format for bar 0 page 0
303362306a36Sopenharmony_ci * @info:            Device info registers
303462306a36Sopenharmony_ci * @devcmd:          Device command registers
303562306a36Sopenharmony_ci */
303662306a36Sopenharmony_ciunion ionic_dev_regs {
303762306a36Sopenharmony_ci	struct {
303862306a36Sopenharmony_ci		union ionic_dev_info_regs info;
303962306a36Sopenharmony_ci		union ionic_dev_cmd_regs  devcmd;
304062306a36Sopenharmony_ci	} __packed;
304162306a36Sopenharmony_ci	__le32 words[1024];
304262306a36Sopenharmony_ci};
304362306a36Sopenharmony_ci
304462306a36Sopenharmony_ciunion ionic_adminq_cmd {
304562306a36Sopenharmony_ci	struct ionic_admin_cmd cmd;
304662306a36Sopenharmony_ci	struct ionic_nop_cmd nop;
304762306a36Sopenharmony_ci	struct ionic_q_identify_cmd q_identify;
304862306a36Sopenharmony_ci	struct ionic_q_init_cmd q_init;
304962306a36Sopenharmony_ci	struct ionic_q_control_cmd q_control;
305062306a36Sopenharmony_ci	struct ionic_lif_setattr_cmd lif_setattr;
305162306a36Sopenharmony_ci	struct ionic_lif_getattr_cmd lif_getattr;
305262306a36Sopenharmony_ci	struct ionic_lif_setphc_cmd lif_setphc;
305362306a36Sopenharmony_ci	struct ionic_rx_mode_set_cmd rx_mode_set;
305462306a36Sopenharmony_ci	struct ionic_rx_filter_add_cmd rx_filter_add;
305562306a36Sopenharmony_ci	struct ionic_rx_filter_del_cmd rx_filter_del;
305662306a36Sopenharmony_ci	struct ionic_rdma_reset_cmd rdma_reset;
305762306a36Sopenharmony_ci	struct ionic_rdma_queue_cmd rdma_queue;
305862306a36Sopenharmony_ci	struct ionic_fw_download_cmd fw_download;
305962306a36Sopenharmony_ci	struct ionic_fw_control_cmd fw_control;
306062306a36Sopenharmony_ci};
306162306a36Sopenharmony_ci
306262306a36Sopenharmony_ciunion ionic_adminq_comp {
306362306a36Sopenharmony_ci	struct ionic_admin_comp comp;
306462306a36Sopenharmony_ci	struct ionic_nop_comp nop;
306562306a36Sopenharmony_ci	struct ionic_q_identify_comp q_identify;
306662306a36Sopenharmony_ci	struct ionic_q_init_comp q_init;
306762306a36Sopenharmony_ci	struct ionic_lif_setattr_comp lif_setattr;
306862306a36Sopenharmony_ci	struct ionic_lif_getattr_comp lif_getattr;
306962306a36Sopenharmony_ci	struct ionic_admin_comp lif_setphc;
307062306a36Sopenharmony_ci	struct ionic_rx_filter_add_comp rx_filter_add;
307162306a36Sopenharmony_ci	struct ionic_fw_control_comp fw_control;
307262306a36Sopenharmony_ci};
307362306a36Sopenharmony_ci
307462306a36Sopenharmony_ci#define IONIC_BARS_MAX			6
307562306a36Sopenharmony_ci#define IONIC_PCI_BAR_DBELL		1
307662306a36Sopenharmony_ci#define IONIC_PCI_BAR_CMB		2
307762306a36Sopenharmony_ci
307862306a36Sopenharmony_ci#define IONIC_BAR0_SIZE				0x8000
307962306a36Sopenharmony_ci#define IONIC_BAR2_SIZE				0x800000
308062306a36Sopenharmony_ci
308162306a36Sopenharmony_ci#define IONIC_BAR0_DEV_INFO_REGS_OFFSET		0x0000
308262306a36Sopenharmony_ci#define IONIC_BAR0_DEV_CMD_REGS_OFFSET		0x0800
308362306a36Sopenharmony_ci#define IONIC_BAR0_DEV_CMD_DATA_REGS_OFFSET	0x0c00
308462306a36Sopenharmony_ci#define IONIC_BAR0_INTR_STATUS_OFFSET		0x1000
308562306a36Sopenharmony_ci#define IONIC_BAR0_INTR_CTRL_OFFSET		0x2000
308662306a36Sopenharmony_ci#define IONIC_DEV_CMD_DONE			0x00000001
308762306a36Sopenharmony_ci
308862306a36Sopenharmony_ci#define IONIC_ASIC_TYPE_CAPRI			0
308962306a36Sopenharmony_ci
309062306a36Sopenharmony_ci/**
309162306a36Sopenharmony_ci * struct ionic_doorbell - Doorbell register layout
309262306a36Sopenharmony_ci * @p_index: Producer index
309362306a36Sopenharmony_ci * @ring:    Selects the specific ring of the queue to update
309462306a36Sopenharmony_ci *           Type-specific meaning:
309562306a36Sopenharmony_ci *              ring=0: Default producer/consumer queue
309662306a36Sopenharmony_ci *              ring=1: (CQ, EQ) Re-Arm queue.  RDMA CQs
309762306a36Sopenharmony_ci *              send events to EQs when armed.  EQs send
309862306a36Sopenharmony_ci *              interrupts when armed.
309962306a36Sopenharmony_ci * @qid_lo:  Queue destination for the producer index and flags (low bits)
310062306a36Sopenharmony_ci * @qid_hi:  Queue destination for the producer index and flags (high bits)
310162306a36Sopenharmony_ci */
310262306a36Sopenharmony_cistruct ionic_doorbell {
310362306a36Sopenharmony_ci	__le16 p_index;
310462306a36Sopenharmony_ci	u8     ring;
310562306a36Sopenharmony_ci	u8     qid_lo;
310662306a36Sopenharmony_ci	__le16 qid_hi;
310762306a36Sopenharmony_ci	u16    rsvd2;
310862306a36Sopenharmony_ci};
310962306a36Sopenharmony_ci
311062306a36Sopenharmony_cistruct ionic_intr_status {
311162306a36Sopenharmony_ci	u32 status[2];
311262306a36Sopenharmony_ci};
311362306a36Sopenharmony_ci
311462306a36Sopenharmony_cistruct ionic_notifyq_cmd {
311562306a36Sopenharmony_ci	__le32 data;	/* Not used but needed for qcq structure */
311662306a36Sopenharmony_ci};
311762306a36Sopenharmony_ci
311862306a36Sopenharmony_ciunion ionic_notifyq_comp {
311962306a36Sopenharmony_ci	struct ionic_notifyq_event event;
312062306a36Sopenharmony_ci	struct ionic_link_change_event link_change;
312162306a36Sopenharmony_ci	struct ionic_reset_event reset;
312262306a36Sopenharmony_ci	struct ionic_heartbeat_event heartbeat;
312362306a36Sopenharmony_ci	struct ionic_log_event log;
312462306a36Sopenharmony_ci};
312562306a36Sopenharmony_ci
312662306a36Sopenharmony_ci/* Deprecate */
312762306a36Sopenharmony_cistruct ionic_identity {
312862306a36Sopenharmony_ci	union ionic_drv_identity drv;
312962306a36Sopenharmony_ci	union ionic_dev_identity dev;
313062306a36Sopenharmony_ci	union ionic_lif_identity lif;
313162306a36Sopenharmony_ci	union ionic_port_identity port;
313262306a36Sopenharmony_ci	union ionic_qos_identity qos;
313362306a36Sopenharmony_ci	union ionic_q_identity txq;
313462306a36Sopenharmony_ci};
313562306a36Sopenharmony_ci
313662306a36Sopenharmony_ci#endif /* _IONIC_IF_H_ */
3137