162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2021 Broadcom. All Rights Reserved. The term
462306a36Sopenharmony_ci * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci/*
962306a36Sopenharmony_ci * All common SLI-4 structures and function prototypes.
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#ifndef _SLI4_H
1362306a36Sopenharmony_ci#define _SLI4_H
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include <linux/pci.h>
1662306a36Sopenharmony_ci#include <linux/delay.h>
1762306a36Sopenharmony_ci#include "scsi/fc/fc_els.h"
1862306a36Sopenharmony_ci#include "scsi/fc/fc_fs.h"
1962306a36Sopenharmony_ci#include "../include/efc_common.h"
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci/*************************************************************************
2262306a36Sopenharmony_ci * Common SLI-4 register offsets and field definitions
2362306a36Sopenharmony_ci */
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci/* SLI_INTF - SLI Interface Definition Register */
2662306a36Sopenharmony_ci#define SLI4_INTF_REG			0x0058
2762306a36Sopenharmony_cienum sli4_intf {
2862306a36Sopenharmony_ci	SLI4_INTF_REV_SHIFT		= 4,
2962306a36Sopenharmony_ci	SLI4_INTF_REV_MASK		= 0xf0,
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	SLI4_INTF_REV_S3		= 0x30,
3262306a36Sopenharmony_ci	SLI4_INTF_REV_S4		= 0x40,
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	SLI4_INTF_FAMILY_SHIFT		= 8,
3562306a36Sopenharmony_ci	SLI4_INTF_FAMILY_MASK		= 0x0f00,
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	SLI4_FAMILY_CHECK_ASIC_TYPE	= 0x0f00,
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	SLI4_INTF_IF_TYPE_SHIFT		= 12,
4062306a36Sopenharmony_ci	SLI4_INTF_IF_TYPE_MASK		= 0xf000,
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	SLI4_INTF_IF_TYPE_2		= 0x2000,
4362306a36Sopenharmony_ci	SLI4_INTF_IF_TYPE_6		= 0x6000,
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	SLI4_INTF_VALID_SHIFT		= 29,
4662306a36Sopenharmony_ci	SLI4_INTF_VALID_MASK		= 0xe0000000,
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	SLI4_INTF_VALID_VALUE		= 0xc0000000,
4962306a36Sopenharmony_ci};
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci/* ASIC_ID - SLI ASIC Type and Revision Register */
5262306a36Sopenharmony_ci#define SLI4_ASIC_ID_REG	0x009c
5362306a36Sopenharmony_cienum sli4_asic {
5462306a36Sopenharmony_ci	SLI4_ASIC_GEN_SHIFT	= 8,
5562306a36Sopenharmony_ci	SLI4_ASIC_GEN_MASK	= 0xff00,
5662306a36Sopenharmony_ci	SLI4_ASIC_GEN_5		= 0x0b00,
5762306a36Sopenharmony_ci	SLI4_ASIC_GEN_6		= 0x0c00,
5862306a36Sopenharmony_ci	SLI4_ASIC_GEN_7		= 0x0d00,
5962306a36Sopenharmony_ci};
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_cienum sli4_acic_revisions {
6262306a36Sopenharmony_ci	SLI4_ASIC_REV_A0	= 0x00,
6362306a36Sopenharmony_ci	SLI4_ASIC_REV_A1	= 0x01,
6462306a36Sopenharmony_ci	SLI4_ASIC_REV_A2	= 0x02,
6562306a36Sopenharmony_ci	SLI4_ASIC_REV_A3	= 0x03,
6662306a36Sopenharmony_ci	SLI4_ASIC_REV_B0	= 0x10,
6762306a36Sopenharmony_ci	SLI4_ASIC_REV_B1	= 0x11,
6862306a36Sopenharmony_ci	SLI4_ASIC_REV_B2	= 0x12,
6962306a36Sopenharmony_ci	SLI4_ASIC_REV_C0	= 0x20,
7062306a36Sopenharmony_ci	SLI4_ASIC_REV_C1	= 0x21,
7162306a36Sopenharmony_ci	SLI4_ASIC_REV_C2	= 0x22,
7262306a36Sopenharmony_ci	SLI4_ASIC_REV_D0	= 0x30,
7362306a36Sopenharmony_ci};
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_cistruct sli4_asic_entry_t {
7662306a36Sopenharmony_ci	u32 rev_id;
7762306a36Sopenharmony_ci	u32 family;
7862306a36Sopenharmony_ci};
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci/* BMBX - Bootstrap Mailbox Register */
8162306a36Sopenharmony_ci#define SLI4_BMBX_REG		0x0160
8262306a36Sopenharmony_cienum sli4_bmbx {
8362306a36Sopenharmony_ci	SLI4_BMBX_MASK_HI	= 0x3,
8462306a36Sopenharmony_ci	SLI4_BMBX_MASK_LO	= 0xf,
8562306a36Sopenharmony_ci	SLI4_BMBX_RDY		= 1 << 0,
8662306a36Sopenharmony_ci	SLI4_BMBX_HI		= 1 << 1,
8762306a36Sopenharmony_ci	SLI4_BMBX_SIZE		= 256,
8862306a36Sopenharmony_ci};
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_cistatic inline u32
9162306a36Sopenharmony_cisli_bmbx_write_hi(u64 addr) {
9262306a36Sopenharmony_ci	u32 val;
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci	val = upper_32_bits(addr) & ~SLI4_BMBX_MASK_HI;
9562306a36Sopenharmony_ci	val |= SLI4_BMBX_HI;
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci	return val;
9862306a36Sopenharmony_ci}
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_cistatic inline u32
10162306a36Sopenharmony_cisli_bmbx_write_lo(u64 addr) {
10262306a36Sopenharmony_ci	u32 val;
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci	val = (upper_32_bits(addr) & SLI4_BMBX_MASK_HI) << 30;
10562306a36Sopenharmony_ci	val |= ((addr) & ~SLI4_BMBX_MASK_LO) >> 2;
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci	return val;
10862306a36Sopenharmony_ci}
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci/* SLIPORT_CONTROL - SLI Port Control Register */
11162306a36Sopenharmony_ci#define SLI4_PORT_CTRL_REG	0x0408
11262306a36Sopenharmony_cienum sli4_port_ctrl {
11362306a36Sopenharmony_ci	SLI4_PORT_CTRL_IP	= 1u << 27,
11462306a36Sopenharmony_ci	SLI4_PORT_CTRL_IDIS	= 1u << 22,
11562306a36Sopenharmony_ci	SLI4_PORT_CTRL_FDD	= 1u << 31,
11662306a36Sopenharmony_ci};
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci/* SLI4_SLIPORT_ERROR - SLI Port Error Register */
11962306a36Sopenharmony_ci#define SLI4_PORT_ERROR1	0x040c
12062306a36Sopenharmony_ci#define SLI4_PORT_ERROR2	0x0410
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci/* EQCQ_DOORBELL - EQ and CQ Doorbell Register */
12362306a36Sopenharmony_ci#define SLI4_EQCQ_DB_REG	0x120
12462306a36Sopenharmony_cienum sli4_eqcq_e {
12562306a36Sopenharmony_ci	SLI4_EQ_ID_LO_MASK	= 0x01ff,
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci	SLI4_CQ_ID_LO_MASK	= 0x03ff,
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci	SLI4_EQCQ_CI_EQ		= 0x0200,
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci	SLI4_EQCQ_QT_EQ		= 0x00000400,
13262306a36Sopenharmony_ci	SLI4_EQCQ_QT_CQ		= 0x00000000,
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci	SLI4_EQCQ_ID_HI_SHIFT	= 11,
13562306a36Sopenharmony_ci	SLI4_EQCQ_ID_HI_MASK	= 0xf800,
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci	SLI4_EQCQ_NUM_SHIFT	= 16,
13862306a36Sopenharmony_ci	SLI4_EQCQ_NUM_MASK	= 0x1fff0000,
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci	SLI4_EQCQ_ARM		= 0x20000000,
14162306a36Sopenharmony_ci	SLI4_EQCQ_UNARM		= 0x00000000,
14262306a36Sopenharmony_ci};
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_cistatic inline u32
14562306a36Sopenharmony_cisli_format_eq_db_data(u16 num_popped, u16 id, u32 arm) {
14662306a36Sopenharmony_ci	u32 reg;
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci	reg = (id & SLI4_EQ_ID_LO_MASK) | SLI4_EQCQ_QT_EQ;
14962306a36Sopenharmony_ci	reg |= (((id) >> 9) << SLI4_EQCQ_ID_HI_SHIFT) & SLI4_EQCQ_ID_HI_MASK;
15062306a36Sopenharmony_ci	reg |= ((num_popped) << SLI4_EQCQ_NUM_SHIFT) & SLI4_EQCQ_NUM_MASK;
15162306a36Sopenharmony_ci	reg |= arm | SLI4_EQCQ_CI_EQ;
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci	return reg;
15462306a36Sopenharmony_ci}
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_cistatic inline u32
15762306a36Sopenharmony_cisli_format_cq_db_data(u16 num_popped, u16 id, u32 arm) {
15862306a36Sopenharmony_ci	u32 reg;
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci	reg = ((id) & SLI4_CQ_ID_LO_MASK) | SLI4_EQCQ_QT_CQ;
16162306a36Sopenharmony_ci	reg |= (((id) >> 10) << SLI4_EQCQ_ID_HI_SHIFT) & SLI4_EQCQ_ID_HI_MASK;
16262306a36Sopenharmony_ci	reg |= ((num_popped) << SLI4_EQCQ_NUM_SHIFT) & SLI4_EQCQ_NUM_MASK;
16362306a36Sopenharmony_ci	reg |= arm;
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci	return reg;
16662306a36Sopenharmony_ci}
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci/* EQ_DOORBELL - EQ Doorbell Register for IF_TYPE = 6*/
16962306a36Sopenharmony_ci#define SLI4_IF6_EQ_DB_REG	0x120
17062306a36Sopenharmony_cienum sli4_eq_e {
17162306a36Sopenharmony_ci	SLI4_IF6_EQ_ID_MASK	= 0x0fff,
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci	SLI4_IF6_EQ_NUM_SHIFT	= 16,
17462306a36Sopenharmony_ci	SLI4_IF6_EQ_NUM_MASK	= 0x1fff0000,
17562306a36Sopenharmony_ci};
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_cistatic inline u32
17862306a36Sopenharmony_cisli_format_if6_eq_db_data(u16 num_popped, u16 id, u32 arm) {
17962306a36Sopenharmony_ci	u32 reg;
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci	reg = id & SLI4_IF6_EQ_ID_MASK;
18262306a36Sopenharmony_ci	reg |= (num_popped << SLI4_IF6_EQ_NUM_SHIFT) & SLI4_IF6_EQ_NUM_MASK;
18362306a36Sopenharmony_ci	reg |= arm;
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci	return reg;
18662306a36Sopenharmony_ci}
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_ci/* CQ_DOORBELL - CQ Doorbell Register for IF_TYPE = 6 */
18962306a36Sopenharmony_ci#define SLI4_IF6_CQ_DB_REG	0xc0
19062306a36Sopenharmony_cienum sli4_cq_e {
19162306a36Sopenharmony_ci	SLI4_IF6_CQ_ID_MASK	= 0xffff,
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ci	SLI4_IF6_CQ_NUM_SHIFT	= 16,
19462306a36Sopenharmony_ci	SLI4_IF6_CQ_NUM_MASK	= 0x1fff0000,
19562306a36Sopenharmony_ci};
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_cistatic inline u32
19862306a36Sopenharmony_cisli_format_if6_cq_db_data(u16 num_popped, u16 id, u32 arm) {
19962306a36Sopenharmony_ci	u32 reg;
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci	reg = id & SLI4_IF6_CQ_ID_MASK;
20262306a36Sopenharmony_ci	reg |= ((num_popped) << SLI4_IF6_CQ_NUM_SHIFT) & SLI4_IF6_CQ_NUM_MASK;
20362306a36Sopenharmony_ci	reg |= arm;
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_ci	return reg;
20662306a36Sopenharmony_ci}
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci/* MQ_DOORBELL - MQ Doorbell Register */
20962306a36Sopenharmony_ci#define SLI4_MQ_DB_REG		0x0140
21062306a36Sopenharmony_ci#define SLI4_IF6_MQ_DB_REG	0x0160
21162306a36Sopenharmony_cienum sli4_mq_e {
21262306a36Sopenharmony_ci	SLI4_MQ_ID_MASK		= 0xffff,
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_ci	SLI4_MQ_NUM_SHIFT	= 16,
21562306a36Sopenharmony_ci	SLI4_MQ_NUM_MASK	= 0x3fff0000,
21662306a36Sopenharmony_ci};
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_cistatic inline u32
21962306a36Sopenharmony_cisli_format_mq_db_data(u16 id) {
22062306a36Sopenharmony_ci	u32 reg;
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_ci	reg = id & SLI4_MQ_ID_MASK;
22362306a36Sopenharmony_ci	reg |= (1 << SLI4_MQ_NUM_SHIFT) & SLI4_MQ_NUM_MASK;
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_ci	return reg;
22662306a36Sopenharmony_ci}
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_ci/* RQ_DOORBELL - RQ Doorbell Register */
22962306a36Sopenharmony_ci#define SLI4_RQ_DB_REG		0x0a0
23062306a36Sopenharmony_ci#define SLI4_IF6_RQ_DB_REG	0x0080
23162306a36Sopenharmony_cienum sli4_rq_e {
23262306a36Sopenharmony_ci	SLI4_RQ_DB_ID_MASK	= 0xffff,
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_ci	SLI4_RQ_DB_NUM_SHIFT	= 16,
23562306a36Sopenharmony_ci	SLI4_RQ_DB_NUM_MASK	= 0x3fff0000,
23662306a36Sopenharmony_ci};
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_cistatic inline u32
23962306a36Sopenharmony_cisli_format_rq_db_data(u16 id) {
24062306a36Sopenharmony_ci	u32 reg;
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ci	reg = id & SLI4_RQ_DB_ID_MASK;
24362306a36Sopenharmony_ci	reg |= (1 << SLI4_RQ_DB_NUM_SHIFT) & SLI4_RQ_DB_NUM_MASK;
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ci	return reg;
24662306a36Sopenharmony_ci}
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_ci/* WQ_DOORBELL - WQ Doorbell Register */
24962306a36Sopenharmony_ci#define SLI4_IO_WQ_DB_REG	0x040
25062306a36Sopenharmony_ci#define SLI4_IF6_WQ_DB_REG	0x040
25162306a36Sopenharmony_cienum sli4_wq_e {
25262306a36Sopenharmony_ci	SLI4_WQ_ID_MASK		= 0xffff,
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ci	SLI4_WQ_IDX_SHIFT	= 16,
25562306a36Sopenharmony_ci	SLI4_WQ_IDX_MASK	= 0xff0000,
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_ci	SLI4_WQ_NUM_SHIFT	= 24,
25862306a36Sopenharmony_ci	SLI4_WQ_NUM_MASK	= 0x0ff00000,
25962306a36Sopenharmony_ci};
26062306a36Sopenharmony_ci
26162306a36Sopenharmony_cistatic inline u32
26262306a36Sopenharmony_cisli_format_wq_db_data(u16 id) {
26362306a36Sopenharmony_ci	u32 reg;
26462306a36Sopenharmony_ci
26562306a36Sopenharmony_ci	reg = id & SLI4_WQ_ID_MASK;
26662306a36Sopenharmony_ci	reg |= (1 << SLI4_WQ_NUM_SHIFT) & SLI4_WQ_NUM_MASK;
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci	return reg;
26962306a36Sopenharmony_ci}
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ci/* SLIPORT_STATUS - SLI Port Status Register */
27262306a36Sopenharmony_ci#define SLI4_PORT_STATUS_REGOFF	0x0404
27362306a36Sopenharmony_cienum sli4_port_status {
27462306a36Sopenharmony_ci	SLI4_PORT_STATUS_FDP	= 1u << 21,
27562306a36Sopenharmony_ci	SLI4_PORT_STATUS_RDY	= 1u << 23,
27662306a36Sopenharmony_ci	SLI4_PORT_STATUS_RN	= 1u << 24,
27762306a36Sopenharmony_ci	SLI4_PORT_STATUS_DIP	= 1u << 25,
27862306a36Sopenharmony_ci	SLI4_PORT_STATUS_OTI	= 1u << 29,
27962306a36Sopenharmony_ci	SLI4_PORT_STATUS_ERR	= 1u << 31,
28062306a36Sopenharmony_ci};
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_ci#define SLI4_PHYDEV_CTRL_REG	0x0414
28362306a36Sopenharmony_ci#define SLI4_PHYDEV_CTRL_FRST	(1 << 1)
28462306a36Sopenharmony_ci#define SLI4_PHYDEV_CTRL_DD	(1 << 2)
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ci/* Register name enums */
28762306a36Sopenharmony_cienum sli4_regname_en {
28862306a36Sopenharmony_ci	SLI4_REG_BMBX,
28962306a36Sopenharmony_ci	SLI4_REG_EQ_DOORBELL,
29062306a36Sopenharmony_ci	SLI4_REG_CQ_DOORBELL,
29162306a36Sopenharmony_ci	SLI4_REG_RQ_DOORBELL,
29262306a36Sopenharmony_ci	SLI4_REG_IO_WQ_DOORBELL,
29362306a36Sopenharmony_ci	SLI4_REG_MQ_DOORBELL,
29462306a36Sopenharmony_ci	SLI4_REG_PHYSDEV_CONTROL,
29562306a36Sopenharmony_ci	SLI4_REG_PORT_CONTROL,
29662306a36Sopenharmony_ci	SLI4_REG_PORT_ERROR1,
29762306a36Sopenharmony_ci	SLI4_REG_PORT_ERROR2,
29862306a36Sopenharmony_ci	SLI4_REG_PORT_SEMAPHORE,
29962306a36Sopenharmony_ci	SLI4_REG_PORT_STATUS,
30062306a36Sopenharmony_ci	SLI4_REG_UNKWOWN			/* must be last */
30162306a36Sopenharmony_ci};
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_cistruct sli4_reg {
30462306a36Sopenharmony_ci	u32	rset;
30562306a36Sopenharmony_ci	u32	off;
30662306a36Sopenharmony_ci};
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_cistruct sli4_dmaaddr {
30962306a36Sopenharmony_ci	__le32 low;
31062306a36Sopenharmony_ci	__le32 high;
31162306a36Sopenharmony_ci};
31262306a36Sopenharmony_ci
31362306a36Sopenharmony_ci/*
31462306a36Sopenharmony_ci * a 3-word Buffer Descriptor Entry with
31562306a36Sopenharmony_ci * address 1st 2 words, length last word
31662306a36Sopenharmony_ci */
31762306a36Sopenharmony_cistruct sli4_bufptr {
31862306a36Sopenharmony_ci	struct sli4_dmaaddr addr;
31962306a36Sopenharmony_ci	__le32 length;
32062306a36Sopenharmony_ci};
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_ci/* Buffer Descriptor Entry (BDE) */
32362306a36Sopenharmony_cienum sli4_bde_e {
32462306a36Sopenharmony_ci	SLI4_BDE_LEN_MASK	= 0x00ffffff,
32562306a36Sopenharmony_ci	SLI4_BDE_TYPE_MASK	= 0xff000000,
32662306a36Sopenharmony_ci};
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_cistruct sli4_bde {
32962306a36Sopenharmony_ci	__le32		bde_type_buflen;
33062306a36Sopenharmony_ci	union {
33162306a36Sopenharmony_ci		struct sli4_dmaaddr data;
33262306a36Sopenharmony_ci		struct {
33362306a36Sopenharmony_ci			__le32	offset;
33462306a36Sopenharmony_ci			__le32	rsvd2;
33562306a36Sopenharmony_ci		} imm;
33662306a36Sopenharmony_ci		struct sli4_dmaaddr blp;
33762306a36Sopenharmony_ci	} u;
33862306a36Sopenharmony_ci};
33962306a36Sopenharmony_ci
34062306a36Sopenharmony_ci/* Buffer Descriptors */
34162306a36Sopenharmony_cienum sli4_bde_type {
34262306a36Sopenharmony_ci	SLI4_BDE_TYPE_SHIFT	= 24,
34362306a36Sopenharmony_ci	SLI4_BDE_TYPE_64	= 0x00,	/* Generic 64-bit data */
34462306a36Sopenharmony_ci	SLI4_BDE_TYPE_IMM	= 0x01,	/* Immediate data */
34562306a36Sopenharmony_ci	SLI4_BDE_TYPE_BLP	= 0x40,	/* Buffer List Pointer */
34662306a36Sopenharmony_ci};
34762306a36Sopenharmony_ci
34862306a36Sopenharmony_ci#define SLI4_BDE_TYPE_VAL(type) \
34962306a36Sopenharmony_ci	(SLI4_BDE_TYPE_##type << SLI4_BDE_TYPE_SHIFT)
35062306a36Sopenharmony_ci
35162306a36Sopenharmony_ci/* Scatter-Gather Entry (SGE) */
35262306a36Sopenharmony_ci#define SLI4_SGE_MAX_RESERVED		3
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_cienum sli4_sge_type {
35562306a36Sopenharmony_ci	/* DW2 */
35662306a36Sopenharmony_ci	SLI4_SGE_DATA_OFFSET_MASK	= 0x07ffffff,
35762306a36Sopenharmony_ci	/*DW2W1*/
35862306a36Sopenharmony_ci	SLI4_SGE_TYPE_SHIFT		= 27,
35962306a36Sopenharmony_ci	SLI4_SGE_TYPE_MASK		= 0x78000000,
36062306a36Sopenharmony_ci	/*SGE Types*/
36162306a36Sopenharmony_ci	SLI4_SGE_TYPE_DATA		= 0x00,
36262306a36Sopenharmony_ci	SLI4_SGE_TYPE_DIF		= 0x04,	/* Data Integrity Field */
36362306a36Sopenharmony_ci	SLI4_SGE_TYPE_LSP		= 0x05,	/* List Segment Pointer */
36462306a36Sopenharmony_ci	SLI4_SGE_TYPE_PEDIF		= 0x06,	/* Post Encryption Engine DIF */
36562306a36Sopenharmony_ci	SLI4_SGE_TYPE_PESEED		= 0x07,	/* Post Encryption DIF Seed */
36662306a36Sopenharmony_ci	SLI4_SGE_TYPE_DISEED		= 0x08,	/* DIF Seed */
36762306a36Sopenharmony_ci	SLI4_SGE_TYPE_ENC		= 0x09,	/* Encryption */
36862306a36Sopenharmony_ci	SLI4_SGE_TYPE_ATM		= 0x0a,	/* DIF Application Tag Mask */
36962306a36Sopenharmony_ci	SLI4_SGE_TYPE_SKIP		= 0x0c,	/* SKIP */
37062306a36Sopenharmony_ci
37162306a36Sopenharmony_ci	SLI4_SGE_LAST			= 1u << 31,
37262306a36Sopenharmony_ci};
37362306a36Sopenharmony_ci
37462306a36Sopenharmony_cistruct sli4_sge {
37562306a36Sopenharmony_ci	__le32		buffer_address_high;
37662306a36Sopenharmony_ci	__le32		buffer_address_low;
37762306a36Sopenharmony_ci	__le32		dw2_flags;
37862306a36Sopenharmony_ci	__le32		buffer_length;
37962306a36Sopenharmony_ci};
38062306a36Sopenharmony_ci
38162306a36Sopenharmony_ci/* T10 DIF Scatter-Gather Entry (SGE) */
38262306a36Sopenharmony_cistruct sli4_dif_sge {
38362306a36Sopenharmony_ci	__le32		buffer_address_high;
38462306a36Sopenharmony_ci	__le32		buffer_address_low;
38562306a36Sopenharmony_ci	__le32		dw2_flags;
38662306a36Sopenharmony_ci	__le32		rsvd12;
38762306a36Sopenharmony_ci};
38862306a36Sopenharmony_ci
38962306a36Sopenharmony_ci/* Data Integrity Seed (DISEED) SGE */
39062306a36Sopenharmony_cienum sli4_diseed_sge_flags {
39162306a36Sopenharmony_ci	/* DW2W1 */
39262306a36Sopenharmony_ci	SLI4_DISEED_SGE_HS		= 1 << 2,
39362306a36Sopenharmony_ci	SLI4_DISEED_SGE_WS		= 1 << 3,
39462306a36Sopenharmony_ci	SLI4_DISEED_SGE_IC		= 1 << 4,
39562306a36Sopenharmony_ci	SLI4_DISEED_SGE_ICS		= 1 << 5,
39662306a36Sopenharmony_ci	SLI4_DISEED_SGE_ATRT		= 1 << 6,
39762306a36Sopenharmony_ci	SLI4_DISEED_SGE_AT		= 1 << 7,
39862306a36Sopenharmony_ci	SLI4_DISEED_SGE_FAT		= 1 << 8,
39962306a36Sopenharmony_ci	SLI4_DISEED_SGE_NA		= 1 << 9,
40062306a36Sopenharmony_ci	SLI4_DISEED_SGE_HI		= 1 << 10,
40162306a36Sopenharmony_ci
40262306a36Sopenharmony_ci	/* DW3W1 */
40362306a36Sopenharmony_ci	SLI4_DISEED_SGE_BS_MASK		= 0x0007,
40462306a36Sopenharmony_ci	SLI4_DISEED_SGE_AI		= 1 << 3,
40562306a36Sopenharmony_ci	SLI4_DISEED_SGE_ME		= 1 << 4,
40662306a36Sopenharmony_ci	SLI4_DISEED_SGE_RE		= 1 << 5,
40762306a36Sopenharmony_ci	SLI4_DISEED_SGE_CE		= 1 << 6,
40862306a36Sopenharmony_ci	SLI4_DISEED_SGE_NR		= 1 << 7,
40962306a36Sopenharmony_ci
41062306a36Sopenharmony_ci	SLI4_DISEED_SGE_OP_RX_SHIFT	= 8,
41162306a36Sopenharmony_ci	SLI4_DISEED_SGE_OP_RX_MASK	= 0x0f00,
41262306a36Sopenharmony_ci	SLI4_DISEED_SGE_OP_TX_SHIFT	= 12,
41362306a36Sopenharmony_ci	SLI4_DISEED_SGE_OP_TX_MASK	= 0xf000,
41462306a36Sopenharmony_ci};
41562306a36Sopenharmony_ci
41662306a36Sopenharmony_ci/* Opcode values */
41762306a36Sopenharmony_cienum sli4_diseed_sge_opcodes {
41862306a36Sopenharmony_ci	SLI4_DISEED_SGE_OP_IN_NODIF_OUT_CRC,
41962306a36Sopenharmony_ci	SLI4_DISEED_SGE_OP_IN_CRC_OUT_NODIF,
42062306a36Sopenharmony_ci	SLI4_DISEED_SGE_OP_IN_NODIF_OUT_CSUM,
42162306a36Sopenharmony_ci	SLI4_DISEED_SGE_OP_IN_CSUM_OUT_NODIF,
42262306a36Sopenharmony_ci	SLI4_DISEED_SGE_OP_IN_CRC_OUT_CRC,
42362306a36Sopenharmony_ci	SLI4_DISEED_SGE_OP_IN_CSUM_OUT_CSUM,
42462306a36Sopenharmony_ci	SLI4_DISEED_SGE_OP_IN_CRC_OUT_CSUM,
42562306a36Sopenharmony_ci	SLI4_DISEED_SGE_OP_IN_CSUM_OUT_CRC,
42662306a36Sopenharmony_ci	SLI4_DISEED_SGE_OP_IN_RAW_OUT_RAW,
42762306a36Sopenharmony_ci};
42862306a36Sopenharmony_ci
42962306a36Sopenharmony_ci#define SLI4_DISEED_SGE_OP_RX_VALUE(stype) \
43062306a36Sopenharmony_ci	(SLI4_DISEED_SGE_OP_##stype << SLI4_DISEED_SGE_OP_RX_SHIFT)
43162306a36Sopenharmony_ci#define SLI4_DISEED_SGE_OP_TX_VALUE(stype) \
43262306a36Sopenharmony_ci	(SLI4_DISEED_SGE_OP_##stype << SLI4_DISEED_SGE_OP_TX_SHIFT)
43362306a36Sopenharmony_ci
43462306a36Sopenharmony_cistruct sli4_diseed_sge {
43562306a36Sopenharmony_ci	__le32		ref_tag_cmp;
43662306a36Sopenharmony_ci	__le32		ref_tag_repl;
43762306a36Sopenharmony_ci	__le16		app_tag_repl;
43862306a36Sopenharmony_ci	__le16		dw2w1_flags;
43962306a36Sopenharmony_ci	__le16		app_tag_cmp;
44062306a36Sopenharmony_ci	__le16		dw3w1_flags;
44162306a36Sopenharmony_ci};
44262306a36Sopenharmony_ci
44362306a36Sopenharmony_ci/* List Segment Pointer Scatter-Gather Entry (SGE) */
44462306a36Sopenharmony_ci#define SLI4_LSP_SGE_SEGLEN	0x00ffffff
44562306a36Sopenharmony_ci
44662306a36Sopenharmony_cistruct sli4_lsp_sge {
44762306a36Sopenharmony_ci	__le32		buffer_address_high;
44862306a36Sopenharmony_ci	__le32		buffer_address_low;
44962306a36Sopenharmony_ci	__le32		dw2_flags;
45062306a36Sopenharmony_ci	__le32		dw3_seglen;
45162306a36Sopenharmony_ci};
45262306a36Sopenharmony_ci
45362306a36Sopenharmony_cienum sli4_eqe_e {
45462306a36Sopenharmony_ci	SLI4_EQE_VALID	= 1,
45562306a36Sopenharmony_ci	SLI4_EQE_MJCODE	= 0xe,
45662306a36Sopenharmony_ci	SLI4_EQE_MNCODE	= 0xfff0,
45762306a36Sopenharmony_ci};
45862306a36Sopenharmony_ci
45962306a36Sopenharmony_cistruct sli4_eqe {
46062306a36Sopenharmony_ci	__le16		dw0w0_flags;
46162306a36Sopenharmony_ci	__le16		resource_id;
46262306a36Sopenharmony_ci};
46362306a36Sopenharmony_ci
46462306a36Sopenharmony_ci#define SLI4_MAJOR_CODE_STANDARD	0
46562306a36Sopenharmony_ci#define SLI4_MAJOR_CODE_SENTINEL	1
46662306a36Sopenharmony_ci
46762306a36Sopenharmony_ci/* Sentinel EQE indicating the EQ is full */
46862306a36Sopenharmony_ci#define SLI4_EQE_STATUS_EQ_FULL		2
46962306a36Sopenharmony_ci
47062306a36Sopenharmony_cienum sli4_mcqe_e {
47162306a36Sopenharmony_ci	SLI4_MCQE_CONSUMED	= 1u << 27,
47262306a36Sopenharmony_ci	SLI4_MCQE_COMPLETED	= 1u << 28,
47362306a36Sopenharmony_ci	SLI4_MCQE_AE		= 1u << 30,
47462306a36Sopenharmony_ci	SLI4_MCQE_VALID		= 1u << 31,
47562306a36Sopenharmony_ci};
47662306a36Sopenharmony_ci
47762306a36Sopenharmony_ci/* Entry was consumed but not completed */
47862306a36Sopenharmony_ci#define SLI4_MCQE_STATUS_NOT_COMPLETED	-2
47962306a36Sopenharmony_ci
48062306a36Sopenharmony_cistruct sli4_mcqe {
48162306a36Sopenharmony_ci	__le16		completion_status;
48262306a36Sopenharmony_ci	__le16		extended_status;
48362306a36Sopenharmony_ci	__le32		mqe_tag_low;
48462306a36Sopenharmony_ci	__le32		mqe_tag_high;
48562306a36Sopenharmony_ci	__le32		dw3_flags;
48662306a36Sopenharmony_ci};
48762306a36Sopenharmony_ci
48862306a36Sopenharmony_cienum sli4_acqe_e {
48962306a36Sopenharmony_ci	SLI4_ACQE_AE	= 1 << 6, /* async event - this is an ACQE */
49062306a36Sopenharmony_ci	SLI4_ACQE_VAL	= 1 << 7, /* valid - contents of CQE are valid */
49162306a36Sopenharmony_ci};
49262306a36Sopenharmony_ci
49362306a36Sopenharmony_cistruct sli4_acqe {
49462306a36Sopenharmony_ci	__le32		event_data[3];
49562306a36Sopenharmony_ci	u8		rsvd12;
49662306a36Sopenharmony_ci	u8		event_code;
49762306a36Sopenharmony_ci	u8		event_type;
49862306a36Sopenharmony_ci	u8		ae_val;
49962306a36Sopenharmony_ci};
50062306a36Sopenharmony_ci
50162306a36Sopenharmony_cienum sli4_acqe_event_code {
50262306a36Sopenharmony_ci	SLI4_ACQE_EVENT_CODE_LINK_STATE		= 0x01,
50362306a36Sopenharmony_ci	SLI4_ACQE_EVENT_CODE_FIP		= 0x02,
50462306a36Sopenharmony_ci	SLI4_ACQE_EVENT_CODE_DCBX		= 0x03,
50562306a36Sopenharmony_ci	SLI4_ACQE_EVENT_CODE_ISCSI		= 0x04,
50662306a36Sopenharmony_ci	SLI4_ACQE_EVENT_CODE_GRP_5		= 0x05,
50762306a36Sopenharmony_ci	SLI4_ACQE_EVENT_CODE_FC_LINK_EVENT	= 0x10,
50862306a36Sopenharmony_ci	SLI4_ACQE_EVENT_CODE_SLI_PORT_EVENT	= 0x11,
50962306a36Sopenharmony_ci	SLI4_ACQE_EVENT_CODE_VF_EVENT		= 0x12,
51062306a36Sopenharmony_ci	SLI4_ACQE_EVENT_CODE_MR_EVENT		= 0x13,
51162306a36Sopenharmony_ci};
51262306a36Sopenharmony_ci
51362306a36Sopenharmony_cienum sli4_qtype {
51462306a36Sopenharmony_ci	SLI4_QTYPE_EQ,
51562306a36Sopenharmony_ci	SLI4_QTYPE_CQ,
51662306a36Sopenharmony_ci	SLI4_QTYPE_MQ,
51762306a36Sopenharmony_ci	SLI4_QTYPE_WQ,
51862306a36Sopenharmony_ci	SLI4_QTYPE_RQ,
51962306a36Sopenharmony_ci	SLI4_QTYPE_MAX,			/* must be last */
52062306a36Sopenharmony_ci};
52162306a36Sopenharmony_ci
52262306a36Sopenharmony_ci#define SLI4_USER_MQ_COUNT	1
52362306a36Sopenharmony_ci#define SLI4_MAX_CQ_SET_COUNT	16
52462306a36Sopenharmony_ci#define SLI4_MAX_RQ_SET_COUNT	16
52562306a36Sopenharmony_ci
52662306a36Sopenharmony_cienum sli4_qentry {
52762306a36Sopenharmony_ci	SLI4_QENTRY_ASYNC,
52862306a36Sopenharmony_ci	SLI4_QENTRY_MQ,
52962306a36Sopenharmony_ci	SLI4_QENTRY_RQ,
53062306a36Sopenharmony_ci	SLI4_QENTRY_WQ,
53162306a36Sopenharmony_ci	SLI4_QENTRY_WQ_RELEASE,
53262306a36Sopenharmony_ci	SLI4_QENTRY_OPT_WRITE_CMD,
53362306a36Sopenharmony_ci	SLI4_QENTRY_OPT_WRITE_DATA,
53462306a36Sopenharmony_ci	SLI4_QENTRY_XABT,
53562306a36Sopenharmony_ci	SLI4_QENTRY_MAX			/* must be last */
53662306a36Sopenharmony_ci};
53762306a36Sopenharmony_ci
53862306a36Sopenharmony_cienum sli4_queue_flags {
53962306a36Sopenharmony_ci	SLI4_QUEUE_FLAG_MQ	= 1 << 0,	/* CQ has MQ/Async completion */
54062306a36Sopenharmony_ci	SLI4_QUEUE_FLAG_HDR	= 1 << 1,	/* RQ for packet headers */
54162306a36Sopenharmony_ci	SLI4_QUEUE_FLAG_RQBATCH	= 1 << 2,	/* RQ index increment by 8 */
54262306a36Sopenharmony_ci};
54362306a36Sopenharmony_ci
54462306a36Sopenharmony_ci/* Generic Command Request header */
54562306a36Sopenharmony_cienum sli4_cmd_version {
54662306a36Sopenharmony_ci	CMD_V0,
54762306a36Sopenharmony_ci	CMD_V1,
54862306a36Sopenharmony_ci	CMD_V2,
54962306a36Sopenharmony_ci};
55062306a36Sopenharmony_ci
55162306a36Sopenharmony_cistruct sli4_rqst_hdr {
55262306a36Sopenharmony_ci	u8		opcode;
55362306a36Sopenharmony_ci	u8		subsystem;
55462306a36Sopenharmony_ci	__le16		rsvd2;
55562306a36Sopenharmony_ci	__le32		timeout;
55662306a36Sopenharmony_ci	__le32		request_length;
55762306a36Sopenharmony_ci	__le32		dw3_version;
55862306a36Sopenharmony_ci};
55962306a36Sopenharmony_ci
56062306a36Sopenharmony_ci/* Generic Command Response header */
56162306a36Sopenharmony_cistruct sli4_rsp_hdr {
56262306a36Sopenharmony_ci	u8		opcode;
56362306a36Sopenharmony_ci	u8		subsystem;
56462306a36Sopenharmony_ci	__le16		rsvd2;
56562306a36Sopenharmony_ci	u8		status;
56662306a36Sopenharmony_ci	u8		additional_status;
56762306a36Sopenharmony_ci	__le16		rsvd6;
56862306a36Sopenharmony_ci	__le32		response_length;
56962306a36Sopenharmony_ci	__le32		actual_response_length;
57062306a36Sopenharmony_ci};
57162306a36Sopenharmony_ci
57262306a36Sopenharmony_ci#define SLI4_QUEUE_RQ_BATCH	8
57362306a36Sopenharmony_ci
57462306a36Sopenharmony_ci#define SZ_DMAADDR		sizeof(struct sli4_dmaaddr)
57562306a36Sopenharmony_ci#define SLI4_RQST_CMDSZ(stype)	sizeof(struct sli4_rqst_##stype)
57662306a36Sopenharmony_ci
57762306a36Sopenharmony_ci#define SLI4_RQST_PYLD_LEN(stype) \
57862306a36Sopenharmony_ci		cpu_to_le32(sizeof(struct sli4_rqst_##stype) - \
57962306a36Sopenharmony_ci			sizeof(struct sli4_rqst_hdr))
58062306a36Sopenharmony_ci
58162306a36Sopenharmony_ci#define SLI4_RQST_PYLD_LEN_VAR(stype, varpyld) \
58262306a36Sopenharmony_ci		cpu_to_le32((sizeof(struct sli4_rqst_##stype) + \
58362306a36Sopenharmony_ci			varpyld) - sizeof(struct sli4_rqst_hdr))
58462306a36Sopenharmony_ci
58562306a36Sopenharmony_ci#define SLI4_CFG_PYLD_LENGTH(stype) \
58662306a36Sopenharmony_ci		max(sizeof(struct sli4_rqst_##stype), \
58762306a36Sopenharmony_ci		sizeof(struct sli4_rsp_##stype))
58862306a36Sopenharmony_ci
58962306a36Sopenharmony_cienum sli4_create_cqv2_e {
59062306a36Sopenharmony_ci	/* DW5_flags values*/
59162306a36Sopenharmony_ci	SLI4_CREATE_CQV2_CLSWM_MASK	= 0x00003000,
59262306a36Sopenharmony_ci	SLI4_CREATE_CQV2_NODELAY	= 0x00004000,
59362306a36Sopenharmony_ci	SLI4_CREATE_CQV2_AUTOVALID	= 0x00008000,
59462306a36Sopenharmony_ci	SLI4_CREATE_CQV2_CQECNT_MASK	= 0x18000000,
59562306a36Sopenharmony_ci	SLI4_CREATE_CQV2_VALID		= 0x20000000,
59662306a36Sopenharmony_ci	SLI4_CREATE_CQV2_EVT		= 0x80000000,
59762306a36Sopenharmony_ci	/* DW6W1_flags values*/
59862306a36Sopenharmony_ci	SLI4_CREATE_CQV2_ARM		= 0x8000,
59962306a36Sopenharmony_ci};
60062306a36Sopenharmony_ci
60162306a36Sopenharmony_cistruct sli4_rqst_cmn_create_cq_v2 {
60262306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
60362306a36Sopenharmony_ci	__le16			num_pages;
60462306a36Sopenharmony_ci	u8			page_size;
60562306a36Sopenharmony_ci	u8			rsvd19;
60662306a36Sopenharmony_ci	__le32			dw5_flags;
60762306a36Sopenharmony_ci	__le16			eq_id;
60862306a36Sopenharmony_ci	__le16			dw6w1_arm;
60962306a36Sopenharmony_ci	__le16			cqe_count;
61062306a36Sopenharmony_ci	__le16			rsvd30;
61162306a36Sopenharmony_ci	__le32			rsvd32;
61262306a36Sopenharmony_ci	struct sli4_dmaaddr	page_phys_addr[];
61362306a36Sopenharmony_ci};
61462306a36Sopenharmony_ci
61562306a36Sopenharmony_cienum sli4_create_cqset_e {
61662306a36Sopenharmony_ci	/* DW5_flags values*/
61762306a36Sopenharmony_ci	SLI4_CREATE_CQSETV0_CLSWM_MASK	= 0x00003000,
61862306a36Sopenharmony_ci	SLI4_CREATE_CQSETV0_NODELAY	= 0x00004000,
61962306a36Sopenharmony_ci	SLI4_CREATE_CQSETV0_AUTOVALID	= 0x00008000,
62062306a36Sopenharmony_ci	SLI4_CREATE_CQSETV0_CQECNT_MASK	= 0x18000000,
62162306a36Sopenharmony_ci	SLI4_CREATE_CQSETV0_VALID	= 0x20000000,
62262306a36Sopenharmony_ci	SLI4_CREATE_CQSETV0_EVT		= 0x80000000,
62362306a36Sopenharmony_ci	/* DW5W1_flags values */
62462306a36Sopenharmony_ci	SLI4_CREATE_CQSETV0_CQE_COUNT	= 0x7fff,
62562306a36Sopenharmony_ci	SLI4_CREATE_CQSETV0_ARM		= 0x8000,
62662306a36Sopenharmony_ci};
62762306a36Sopenharmony_ci
62862306a36Sopenharmony_cistruct sli4_rqst_cmn_create_cq_set_v0 {
62962306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
63062306a36Sopenharmony_ci	__le16			num_pages;
63162306a36Sopenharmony_ci	u8			page_size;
63262306a36Sopenharmony_ci	u8			rsvd19;
63362306a36Sopenharmony_ci	__le32			dw5_flags;
63462306a36Sopenharmony_ci	__le16			num_cq_req;
63562306a36Sopenharmony_ci	__le16			dw6w1_flags;
63662306a36Sopenharmony_ci	__le16			eq_id[16];
63762306a36Sopenharmony_ci	struct sli4_dmaaddr	page_phys_addr[];
63862306a36Sopenharmony_ci};
63962306a36Sopenharmony_ci
64062306a36Sopenharmony_ci/* CQE count */
64162306a36Sopenharmony_cienum sli4_cq_cnt {
64262306a36Sopenharmony_ci	SLI4_CQ_CNT_256,
64362306a36Sopenharmony_ci	SLI4_CQ_CNT_512,
64462306a36Sopenharmony_ci	SLI4_CQ_CNT_1024,
64562306a36Sopenharmony_ci	SLI4_CQ_CNT_LARGE,
64662306a36Sopenharmony_ci};
64762306a36Sopenharmony_ci
64862306a36Sopenharmony_ci#define SLI4_CQ_CNT_SHIFT	27
64962306a36Sopenharmony_ci#define SLI4_CQ_CNT_VAL(type)	(SLI4_CQ_CNT_##type << SLI4_CQ_CNT_SHIFT)
65062306a36Sopenharmony_ci
65162306a36Sopenharmony_ci#define SLI4_CQE_BYTES		(4 * sizeof(u32))
65262306a36Sopenharmony_ci
65362306a36Sopenharmony_ci#define SLI4_CREATE_CQV2_MAX_PAGES	8
65462306a36Sopenharmony_ci
65562306a36Sopenharmony_ci/* Generic Common Create EQ/CQ/MQ/WQ/RQ Queue completion */
65662306a36Sopenharmony_cistruct sli4_rsp_cmn_create_queue {
65762306a36Sopenharmony_ci	struct sli4_rsp_hdr	hdr;
65862306a36Sopenharmony_ci	__le16	q_id;
65962306a36Sopenharmony_ci	u8	rsvd18;
66062306a36Sopenharmony_ci	u8	ulp;
66162306a36Sopenharmony_ci	__le32	db_offset;
66262306a36Sopenharmony_ci	__le16	db_rs;
66362306a36Sopenharmony_ci	__le16	db_fmt;
66462306a36Sopenharmony_ci};
66562306a36Sopenharmony_ci
66662306a36Sopenharmony_cistruct sli4_rsp_cmn_create_queue_set {
66762306a36Sopenharmony_ci	struct sli4_rsp_hdr	hdr;
66862306a36Sopenharmony_ci	__le16	q_id;
66962306a36Sopenharmony_ci	__le16	num_q_allocated;
67062306a36Sopenharmony_ci};
67162306a36Sopenharmony_ci
67262306a36Sopenharmony_ci/* Common Destroy Queue */
67362306a36Sopenharmony_cistruct sli4_rqst_cmn_destroy_q {
67462306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
67562306a36Sopenharmony_ci	__le16	q_id;
67662306a36Sopenharmony_ci	__le16	rsvd;
67762306a36Sopenharmony_ci};
67862306a36Sopenharmony_ci
67962306a36Sopenharmony_cistruct sli4_rsp_cmn_destroy_q {
68062306a36Sopenharmony_ci	struct sli4_rsp_hdr	hdr;
68162306a36Sopenharmony_ci};
68262306a36Sopenharmony_ci
68362306a36Sopenharmony_ci/* Modify the delay multiplier for EQs */
68462306a36Sopenharmony_cistruct sli4_eqdelay_rec {
68562306a36Sopenharmony_ci	__le32  eq_id;
68662306a36Sopenharmony_ci	__le32  phase;
68762306a36Sopenharmony_ci	__le32  delay_multiplier;
68862306a36Sopenharmony_ci};
68962306a36Sopenharmony_ci
69062306a36Sopenharmony_cistruct sli4_rqst_cmn_modify_eq_delay {
69162306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
69262306a36Sopenharmony_ci	__le32			num_eq;
69362306a36Sopenharmony_ci	struct sli4_eqdelay_rec eq_delay_record[8];
69462306a36Sopenharmony_ci};
69562306a36Sopenharmony_ci
69662306a36Sopenharmony_cistruct sli4_rsp_cmn_modify_eq_delay {
69762306a36Sopenharmony_ci	struct sli4_rsp_hdr	hdr;
69862306a36Sopenharmony_ci};
69962306a36Sopenharmony_ci
70062306a36Sopenharmony_cienum sli4_create_cq_e {
70162306a36Sopenharmony_ci	/* DW5 */
70262306a36Sopenharmony_ci	SLI4_CREATE_EQ_AUTOVALID		= 1u << 28,
70362306a36Sopenharmony_ci	SLI4_CREATE_EQ_VALID			= 1u << 29,
70462306a36Sopenharmony_ci	SLI4_CREATE_EQ_EQESZ			= 1u << 31,
70562306a36Sopenharmony_ci	/* DW6 */
70662306a36Sopenharmony_ci	SLI4_CREATE_EQ_COUNT			= 7 << 26,
70762306a36Sopenharmony_ci	SLI4_CREATE_EQ_ARM			= 1u << 31,
70862306a36Sopenharmony_ci	/* DW7 */
70962306a36Sopenharmony_ci	SLI4_CREATE_EQ_DELAYMULTI_SHIFT		= 13,
71062306a36Sopenharmony_ci	SLI4_CREATE_EQ_DELAYMULTI_MASK		= 0x007fe000,
71162306a36Sopenharmony_ci	SLI4_CREATE_EQ_DELAYMULTI		= 0x00040000,
71262306a36Sopenharmony_ci};
71362306a36Sopenharmony_ci
71462306a36Sopenharmony_cistruct sli4_rqst_cmn_create_eq {
71562306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
71662306a36Sopenharmony_ci	__le16			num_pages;
71762306a36Sopenharmony_ci	__le16			rsvd18;
71862306a36Sopenharmony_ci	__le32			dw5_flags;
71962306a36Sopenharmony_ci	__le32			dw6_flags;
72062306a36Sopenharmony_ci	__le32			dw7_delaymulti;
72162306a36Sopenharmony_ci	__le32			rsvd32;
72262306a36Sopenharmony_ci	struct sli4_dmaaddr	page_address[8];
72362306a36Sopenharmony_ci};
72462306a36Sopenharmony_ci
72562306a36Sopenharmony_cistruct sli4_rsp_cmn_create_eq {
72662306a36Sopenharmony_ci	struct sli4_rsp_cmn_create_queue q_rsp;
72762306a36Sopenharmony_ci};
72862306a36Sopenharmony_ci
72962306a36Sopenharmony_ci/* EQ count */
73062306a36Sopenharmony_cienum sli4_eq_cnt {
73162306a36Sopenharmony_ci	SLI4_EQ_CNT_256,
73262306a36Sopenharmony_ci	SLI4_EQ_CNT_512,
73362306a36Sopenharmony_ci	SLI4_EQ_CNT_1024,
73462306a36Sopenharmony_ci	SLI4_EQ_CNT_2048,
73562306a36Sopenharmony_ci	SLI4_EQ_CNT_4096 = 3,
73662306a36Sopenharmony_ci};
73762306a36Sopenharmony_ci
73862306a36Sopenharmony_ci#define SLI4_EQ_CNT_SHIFT	26
73962306a36Sopenharmony_ci#define SLI4_EQ_CNT_VAL(type)	(SLI4_EQ_CNT_##type << SLI4_EQ_CNT_SHIFT)
74062306a36Sopenharmony_ci
74162306a36Sopenharmony_ci#define SLI4_EQE_SIZE_4		0
74262306a36Sopenharmony_ci#define SLI4_EQE_SIZE_16	1
74362306a36Sopenharmony_ci
74462306a36Sopenharmony_ci/* Create a Mailbox Queue; accommodate v0 and v1 forms. */
74562306a36Sopenharmony_cienum sli4_create_mq_flags {
74662306a36Sopenharmony_ci	/* DW6W1 */
74762306a36Sopenharmony_ci	SLI4_CREATE_MQEXT_RINGSIZE	= 0xf,
74862306a36Sopenharmony_ci	SLI4_CREATE_MQEXT_CQID_SHIFT	= 6,
74962306a36Sopenharmony_ci	SLI4_CREATE_MQEXT_CQIDV0_MASK	= 0xffc0,
75062306a36Sopenharmony_ci	/* DW7 */
75162306a36Sopenharmony_ci	SLI4_CREATE_MQEXT_VAL		= 1u << 31,
75262306a36Sopenharmony_ci	/* DW8 */
75362306a36Sopenharmony_ci	SLI4_CREATE_MQEXT_ACQV		= 1u << 0,
75462306a36Sopenharmony_ci	SLI4_CREATE_MQEXT_ASYNC_CQIDV0	= 0x7fe,
75562306a36Sopenharmony_ci};
75662306a36Sopenharmony_ci
75762306a36Sopenharmony_cistruct sli4_rqst_cmn_create_mq_ext {
75862306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
75962306a36Sopenharmony_ci	__le16			num_pages;
76062306a36Sopenharmony_ci	__le16			cq_id_v1;
76162306a36Sopenharmony_ci	__le32			async_event_bitmap;
76262306a36Sopenharmony_ci	__le16			async_cq_id_v1;
76362306a36Sopenharmony_ci	__le16			dw6w1_flags;
76462306a36Sopenharmony_ci	__le32			dw7_val;
76562306a36Sopenharmony_ci	__le32			dw8_flags;
76662306a36Sopenharmony_ci	__le32			rsvd36;
76762306a36Sopenharmony_ci	struct sli4_dmaaddr	page_phys_addr[];
76862306a36Sopenharmony_ci};
76962306a36Sopenharmony_ci
77062306a36Sopenharmony_cistruct sli4_rsp_cmn_create_mq_ext {
77162306a36Sopenharmony_ci	struct sli4_rsp_cmn_create_queue q_rsp;
77262306a36Sopenharmony_ci};
77362306a36Sopenharmony_ci
77462306a36Sopenharmony_cienum sli4_mqe_size {
77562306a36Sopenharmony_ci	SLI4_MQE_SIZE_16 = 0x05,
77662306a36Sopenharmony_ci	SLI4_MQE_SIZE_32,
77762306a36Sopenharmony_ci	SLI4_MQE_SIZE_64,
77862306a36Sopenharmony_ci	SLI4_MQE_SIZE_128,
77962306a36Sopenharmony_ci};
78062306a36Sopenharmony_ci
78162306a36Sopenharmony_cienum sli4_async_evt {
78262306a36Sopenharmony_ci	SLI4_ASYNC_EVT_LINK_STATE	= 1 << 1,
78362306a36Sopenharmony_ci	SLI4_ASYNC_EVT_FIP		= 1 << 2,
78462306a36Sopenharmony_ci	SLI4_ASYNC_EVT_GRP5		= 1 << 5,
78562306a36Sopenharmony_ci	SLI4_ASYNC_EVT_FC		= 1 << 16,
78662306a36Sopenharmony_ci	SLI4_ASYNC_EVT_SLI_PORT		= 1 << 17,
78762306a36Sopenharmony_ci};
78862306a36Sopenharmony_ci
78962306a36Sopenharmony_ci#define	SLI4_ASYNC_EVT_FC_ALL \
79062306a36Sopenharmony_ci		(SLI4_ASYNC_EVT_LINK_STATE	| \
79162306a36Sopenharmony_ci		 SLI4_ASYNC_EVT_FIP		| \
79262306a36Sopenharmony_ci		 SLI4_ASYNC_EVT_GRP5		| \
79362306a36Sopenharmony_ci		 SLI4_ASYNC_EVT_FC		| \
79462306a36Sopenharmony_ci		 SLI4_ASYNC_EVT_SLI_PORT)
79562306a36Sopenharmony_ci
79662306a36Sopenharmony_ci/* Create a Completion Queue. */
79762306a36Sopenharmony_cistruct sli4_rqst_cmn_create_cq_v0 {
79862306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
79962306a36Sopenharmony_ci	__le16			num_pages;
80062306a36Sopenharmony_ci	__le16			rsvd18;
80162306a36Sopenharmony_ci	__le32			dw5_flags;
80262306a36Sopenharmony_ci	__le32			dw6_flags;
80362306a36Sopenharmony_ci	__le32			rsvd28;
80462306a36Sopenharmony_ci	__le32			rsvd32;
80562306a36Sopenharmony_ci	struct sli4_dmaaddr	page_phys_addr[];
80662306a36Sopenharmony_ci};
80762306a36Sopenharmony_ci
80862306a36Sopenharmony_cienum sli4_create_rq_e {
80962306a36Sopenharmony_ci	SLI4_RQ_CREATE_DUA		= 0x1,
81062306a36Sopenharmony_ci	SLI4_RQ_CREATE_BQU		= 0x2,
81162306a36Sopenharmony_ci
81262306a36Sopenharmony_ci	SLI4_RQE_SIZE			= 8,
81362306a36Sopenharmony_ci	SLI4_RQE_SIZE_8			= 0x2,
81462306a36Sopenharmony_ci	SLI4_RQE_SIZE_16		= 0x3,
81562306a36Sopenharmony_ci	SLI4_RQE_SIZE_32		= 0x4,
81662306a36Sopenharmony_ci	SLI4_RQE_SIZE_64		= 0x5,
81762306a36Sopenharmony_ci	SLI4_RQE_SIZE_128		= 0x6,
81862306a36Sopenharmony_ci
81962306a36Sopenharmony_ci	SLI4_RQ_PAGE_SIZE_4096		= 0x1,
82062306a36Sopenharmony_ci	SLI4_RQ_PAGE_SIZE_8192		= 0x2,
82162306a36Sopenharmony_ci	SLI4_RQ_PAGE_SIZE_16384		= 0x4,
82262306a36Sopenharmony_ci	SLI4_RQ_PAGE_SIZE_32768		= 0x8,
82362306a36Sopenharmony_ci	SLI4_RQ_PAGE_SIZE_64536		= 0x10,
82462306a36Sopenharmony_ci
82562306a36Sopenharmony_ci	SLI4_RQ_CREATE_V0_MAX_PAGES	= 8,
82662306a36Sopenharmony_ci	SLI4_RQ_CREATE_V0_MIN_BUF_SIZE	= 128,
82762306a36Sopenharmony_ci	SLI4_RQ_CREATE_V0_MAX_BUF_SIZE	= 2048,
82862306a36Sopenharmony_ci};
82962306a36Sopenharmony_ci
83062306a36Sopenharmony_cistruct sli4_rqst_rq_create {
83162306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
83262306a36Sopenharmony_ci	__le16			num_pages;
83362306a36Sopenharmony_ci	u8			dua_bqu_byte;
83462306a36Sopenharmony_ci	u8			ulp;
83562306a36Sopenharmony_ci	__le16			rsvd16;
83662306a36Sopenharmony_ci	u8			rqe_count_byte;
83762306a36Sopenharmony_ci	u8			rsvd19;
83862306a36Sopenharmony_ci	__le32			rsvd20;
83962306a36Sopenharmony_ci	__le16			buffer_size;
84062306a36Sopenharmony_ci	__le16			cq_id;
84162306a36Sopenharmony_ci	__le32			rsvd28;
84262306a36Sopenharmony_ci	struct sli4_dmaaddr	page_phys_addr[SLI4_RQ_CREATE_V0_MAX_PAGES];
84362306a36Sopenharmony_ci};
84462306a36Sopenharmony_ci
84562306a36Sopenharmony_cistruct sli4_rsp_rq_create {
84662306a36Sopenharmony_ci	struct sli4_rsp_cmn_create_queue rsp;
84762306a36Sopenharmony_ci};
84862306a36Sopenharmony_ci
84962306a36Sopenharmony_cienum sli4_create_rqv1_e {
85062306a36Sopenharmony_ci	SLI4_RQ_CREATE_V1_DNB		= 0x80,
85162306a36Sopenharmony_ci	SLI4_RQ_CREATE_V1_MAX_PAGES	= 8,
85262306a36Sopenharmony_ci	SLI4_RQ_CREATE_V1_MIN_BUF_SIZE	= 64,
85362306a36Sopenharmony_ci	SLI4_RQ_CREATE_V1_MAX_BUF_SIZE	= 2048,
85462306a36Sopenharmony_ci};
85562306a36Sopenharmony_ci
85662306a36Sopenharmony_cistruct sli4_rqst_rq_create_v1 {
85762306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
85862306a36Sopenharmony_ci	__le16			num_pages;
85962306a36Sopenharmony_ci	u8			rsvd14;
86062306a36Sopenharmony_ci	u8			dim_dfd_dnb;
86162306a36Sopenharmony_ci	u8			page_size;
86262306a36Sopenharmony_ci	u8			rqe_size_byte;
86362306a36Sopenharmony_ci	__le16			rqe_count;
86462306a36Sopenharmony_ci	__le32			rsvd20;
86562306a36Sopenharmony_ci	__le16			rsvd24;
86662306a36Sopenharmony_ci	__le16			cq_id;
86762306a36Sopenharmony_ci	__le32			buffer_size;
86862306a36Sopenharmony_ci	struct sli4_dmaaddr	page_phys_addr[SLI4_RQ_CREATE_V1_MAX_PAGES];
86962306a36Sopenharmony_ci};
87062306a36Sopenharmony_ci
87162306a36Sopenharmony_cistruct sli4_rsp_rq_create_v1 {
87262306a36Sopenharmony_ci	struct sli4_rsp_cmn_create_queue rsp;
87362306a36Sopenharmony_ci};
87462306a36Sopenharmony_ci
87562306a36Sopenharmony_ci#define	SLI4_RQCREATEV2_DNB	0x80
87662306a36Sopenharmony_ci
87762306a36Sopenharmony_cistruct sli4_rqst_rq_create_v2 {
87862306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
87962306a36Sopenharmony_ci	__le16			num_pages;
88062306a36Sopenharmony_ci	u8			rq_count;
88162306a36Sopenharmony_ci	u8			dim_dfd_dnb;
88262306a36Sopenharmony_ci	u8			page_size;
88362306a36Sopenharmony_ci	u8			rqe_size_byte;
88462306a36Sopenharmony_ci	__le16			rqe_count;
88562306a36Sopenharmony_ci	__le16			hdr_buffer_size;
88662306a36Sopenharmony_ci	__le16			payload_buffer_size;
88762306a36Sopenharmony_ci	__le16			base_cq_id;
88862306a36Sopenharmony_ci	__le16			rsvd26;
88962306a36Sopenharmony_ci	__le32			rsvd42;
89062306a36Sopenharmony_ci	struct sli4_dmaaddr	page_phys_addr[];
89162306a36Sopenharmony_ci};
89262306a36Sopenharmony_ci
89362306a36Sopenharmony_cistruct sli4_rsp_rq_create_v2 {
89462306a36Sopenharmony_ci	struct sli4_rsp_cmn_create_queue rsp;
89562306a36Sopenharmony_ci};
89662306a36Sopenharmony_ci
89762306a36Sopenharmony_ci#define SLI4_CQE_CODE_OFFSET	14
89862306a36Sopenharmony_ci
89962306a36Sopenharmony_cienum sli4_cqe_code {
90062306a36Sopenharmony_ci	SLI4_CQE_CODE_WORK_REQUEST_COMPLETION = 0x01,
90162306a36Sopenharmony_ci	SLI4_CQE_CODE_RELEASE_WQE,
90262306a36Sopenharmony_ci	SLI4_CQE_CODE_RSVD,
90362306a36Sopenharmony_ci	SLI4_CQE_CODE_RQ_ASYNC,
90462306a36Sopenharmony_ci	SLI4_CQE_CODE_XRI_ABORTED,
90562306a36Sopenharmony_ci	SLI4_CQE_CODE_RQ_COALESCING,
90662306a36Sopenharmony_ci	SLI4_CQE_CODE_RQ_CONSUMPTION,
90762306a36Sopenharmony_ci	SLI4_CQE_CODE_MEASUREMENT_REPORTING,
90862306a36Sopenharmony_ci	SLI4_CQE_CODE_RQ_ASYNC_V1,
90962306a36Sopenharmony_ci	SLI4_CQE_CODE_RQ_COALESCING_V1,
91062306a36Sopenharmony_ci	SLI4_CQE_CODE_OPTIMIZED_WRITE_CMD,
91162306a36Sopenharmony_ci	SLI4_CQE_CODE_OPTIMIZED_WRITE_DATA,
91262306a36Sopenharmony_ci};
91362306a36Sopenharmony_ci
91462306a36Sopenharmony_ci#define SLI4_WQ_CREATE_MAX_PAGES		8
91562306a36Sopenharmony_ci
91662306a36Sopenharmony_cistruct sli4_rqst_wq_create {
91762306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
91862306a36Sopenharmony_ci	__le16			num_pages;
91962306a36Sopenharmony_ci	__le16			cq_id;
92062306a36Sopenharmony_ci	u8			page_size;
92162306a36Sopenharmony_ci	u8			wqe_size_byte;
92262306a36Sopenharmony_ci	__le16			wqe_count;
92362306a36Sopenharmony_ci	__le32			rsvd;
92462306a36Sopenharmony_ci	struct	sli4_dmaaddr	page_phys_addr[SLI4_WQ_CREATE_MAX_PAGES];
92562306a36Sopenharmony_ci};
92662306a36Sopenharmony_ci
92762306a36Sopenharmony_cistruct sli4_rsp_wq_create {
92862306a36Sopenharmony_ci	struct sli4_rsp_cmn_create_queue rsp;
92962306a36Sopenharmony_ci};
93062306a36Sopenharmony_ci
93162306a36Sopenharmony_cienum sli4_link_attention_flags {
93262306a36Sopenharmony_ci	SLI4_LNK_ATTN_TYPE_LINK_UP		= 0x01,
93362306a36Sopenharmony_ci	SLI4_LNK_ATTN_TYPE_LINK_DOWN		= 0x02,
93462306a36Sopenharmony_ci	SLI4_LNK_ATTN_TYPE_NO_HARD_ALPA		= 0x03,
93562306a36Sopenharmony_ci
93662306a36Sopenharmony_ci	SLI4_LNK_ATTN_P2P			= 0x01,
93762306a36Sopenharmony_ci	SLI4_LNK_ATTN_FC_AL			= 0x02,
93862306a36Sopenharmony_ci	SLI4_LNK_ATTN_INTERNAL_LOOPBACK		= 0x03,
93962306a36Sopenharmony_ci	SLI4_LNK_ATTN_SERDES_LOOPBACK		= 0x04,
94062306a36Sopenharmony_ci};
94162306a36Sopenharmony_ci
94262306a36Sopenharmony_cistruct sli4_link_attention {
94362306a36Sopenharmony_ci	u8		link_number;
94462306a36Sopenharmony_ci	u8		attn_type;
94562306a36Sopenharmony_ci	u8		topology;
94662306a36Sopenharmony_ci	u8		port_speed;
94762306a36Sopenharmony_ci	u8		port_fault;
94862306a36Sopenharmony_ci	u8		shared_link_status;
94962306a36Sopenharmony_ci	__le16		logical_link_speed;
95062306a36Sopenharmony_ci	__le32		event_tag;
95162306a36Sopenharmony_ci	u8		rsvd12;
95262306a36Sopenharmony_ci	u8		event_code;
95362306a36Sopenharmony_ci	u8		event_type;
95462306a36Sopenharmony_ci	u8		flags;
95562306a36Sopenharmony_ci};
95662306a36Sopenharmony_ci
95762306a36Sopenharmony_cienum sli4_link_event_type {
95862306a36Sopenharmony_ci	SLI4_EVENT_LINK_ATTENTION		= 0x01,
95962306a36Sopenharmony_ci	SLI4_EVENT_SHARED_LINK_ATTENTION	= 0x02,
96062306a36Sopenharmony_ci};
96162306a36Sopenharmony_ci
96262306a36Sopenharmony_cienum sli4_wcqe_flags {
96362306a36Sopenharmony_ci	SLI4_WCQE_XB = 0x10,
96462306a36Sopenharmony_ci	SLI4_WCQE_QX = 0x80,
96562306a36Sopenharmony_ci};
96662306a36Sopenharmony_ci
96762306a36Sopenharmony_cistruct sli4_fc_wcqe {
96862306a36Sopenharmony_ci	u8		hw_status;
96962306a36Sopenharmony_ci	u8		status;
97062306a36Sopenharmony_ci	__le16		request_tag;
97162306a36Sopenharmony_ci	__le32		wqe_specific_1;
97262306a36Sopenharmony_ci	__le32		wqe_specific_2;
97362306a36Sopenharmony_ci	u8		rsvd12;
97462306a36Sopenharmony_ci	u8		qx_byte;
97562306a36Sopenharmony_ci	u8		code;
97662306a36Sopenharmony_ci	u8		flags;
97762306a36Sopenharmony_ci};
97862306a36Sopenharmony_ci
97962306a36Sopenharmony_ci/* FC WQ consumed CQ queue entry */
98062306a36Sopenharmony_cistruct sli4_fc_wqec {
98162306a36Sopenharmony_ci	__le32		rsvd0;
98262306a36Sopenharmony_ci	__le32		rsvd1;
98362306a36Sopenharmony_ci	__le16		wqe_index;
98462306a36Sopenharmony_ci	__le16		wq_id;
98562306a36Sopenharmony_ci	__le16		rsvd12;
98662306a36Sopenharmony_ci	u8		code;
98762306a36Sopenharmony_ci	u8		vld_byte;
98862306a36Sopenharmony_ci};
98962306a36Sopenharmony_ci
99062306a36Sopenharmony_ci/* FC Completion Status Codes. */
99162306a36Sopenharmony_cienum sli4_wcqe_status {
99262306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_SUCCESS,
99362306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_FCP_RSP_FAILURE,
99462306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_REMOTE_STOP,
99562306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_LOCAL_REJECT,
99662306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_NPORT_RJT,
99762306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_FABRIC_RJT,
99862306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_NPORT_BSY,
99962306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_FABRIC_BSY,
100062306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_RSVD,
100162306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_LS_RJT,
100262306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_RX_BUF_OVERRUN,
100362306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_CMD_REJECT,
100462306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_FCP_TGT_LENCHECK,
100562306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_RSVD1,
100662306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_ELS_CMPLT_NO_AUTOREG,
100762306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_RSVD2,
100862306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_RQ_SUCCESS,
100962306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_RQ_BUF_LEN_EXCEEDED,
101062306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_RQ_INSUFF_BUF_NEEDED,
101162306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_RQ_INSUFF_FRM_DISC,
101262306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_RQ_DMA_FAILURE,
101362306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_FCP_RSP_TRUNCATE,
101462306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_DI_ERROR,
101562306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_BA_RJT,
101662306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_RQ_INSUFF_XRI_NEEDED,
101762306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_RQ_INSUFF_XRI_DISC,
101862306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_RX_ERROR_DETECT,
101962306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_RX_ABORT_REQUEST,
102062306a36Sopenharmony_ci
102162306a36Sopenharmony_ci	/* driver generated status codes */
102262306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_DISPATCH_ERROR	= 0xfd,
102362306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_SHUTDOWN		= 0xfe,
102462306a36Sopenharmony_ci	SLI4_FC_WCQE_STATUS_TARGET_WQE_TIMEOUT	= 0xff,
102562306a36Sopenharmony_ci};
102662306a36Sopenharmony_ci
102762306a36Sopenharmony_ci/* DI_ERROR Extended Status */
102862306a36Sopenharmony_cienum sli4_fc_di_error_status {
102962306a36Sopenharmony_ci	SLI4_FC_DI_ERROR_GE			= 1 << 0,
103062306a36Sopenharmony_ci	SLI4_FC_DI_ERROR_AE			= 1 << 1,
103162306a36Sopenharmony_ci	SLI4_FC_DI_ERROR_RE			= 1 << 2,
103262306a36Sopenharmony_ci	SLI4_FC_DI_ERROR_TDPV			= 1 << 3,
103362306a36Sopenharmony_ci	SLI4_FC_DI_ERROR_UDB			= 1 << 4,
103462306a36Sopenharmony_ci	SLI4_FC_DI_ERROR_EDIR			= 1 << 5,
103562306a36Sopenharmony_ci};
103662306a36Sopenharmony_ci
103762306a36Sopenharmony_ci/* WQE DIF field contents */
103862306a36Sopenharmony_cienum sli4_dif_fields {
103962306a36Sopenharmony_ci	SLI4_DIF_DISABLED,
104062306a36Sopenharmony_ci	SLI4_DIF_PASS_THROUGH,
104162306a36Sopenharmony_ci	SLI4_DIF_STRIP,
104262306a36Sopenharmony_ci	SLI4_DIF_INSERT,
104362306a36Sopenharmony_ci};
104462306a36Sopenharmony_ci
104562306a36Sopenharmony_ci/* Work Queue Entry (WQE) types */
104662306a36Sopenharmony_cienum sli4_wqe_types {
104762306a36Sopenharmony_ci	SLI4_WQE_ABORT				= 0x0f,
104862306a36Sopenharmony_ci	SLI4_WQE_ELS_REQUEST64			= 0x8a,
104962306a36Sopenharmony_ci	SLI4_WQE_FCP_IBIDIR64			= 0xac,
105062306a36Sopenharmony_ci	SLI4_WQE_FCP_IREAD64			= 0x9a,
105162306a36Sopenharmony_ci	SLI4_WQE_FCP_IWRITE64			= 0x98,
105262306a36Sopenharmony_ci	SLI4_WQE_FCP_ICMND64			= 0x9c,
105362306a36Sopenharmony_ci	SLI4_WQE_FCP_TRECEIVE64			= 0xa1,
105462306a36Sopenharmony_ci	SLI4_WQE_FCP_CONT_TRECEIVE64		= 0xe5,
105562306a36Sopenharmony_ci	SLI4_WQE_FCP_TRSP64			= 0xa3,
105662306a36Sopenharmony_ci	SLI4_WQE_FCP_TSEND64			= 0x9f,
105762306a36Sopenharmony_ci	SLI4_WQE_GEN_REQUEST64			= 0xc2,
105862306a36Sopenharmony_ci	SLI4_WQE_SEND_FRAME			= 0xe1,
105962306a36Sopenharmony_ci	SLI4_WQE_XMIT_BCAST64			= 0x84,
106062306a36Sopenharmony_ci	SLI4_WQE_XMIT_BLS_RSP			= 0x97,
106162306a36Sopenharmony_ci	SLI4_WQE_ELS_RSP64			= 0x95,
106262306a36Sopenharmony_ci	SLI4_WQE_XMIT_SEQUENCE64		= 0x82,
106362306a36Sopenharmony_ci	SLI4_WQE_REQUEUE_XRI			= 0x93,
106462306a36Sopenharmony_ci};
106562306a36Sopenharmony_ci
106662306a36Sopenharmony_ci/* WQE command types */
106762306a36Sopenharmony_cienum sli4_wqe_cmds {
106862306a36Sopenharmony_ci	SLI4_CMD_FCP_IREAD64_WQE		= 0x00,
106962306a36Sopenharmony_ci	SLI4_CMD_FCP_ICMND64_WQE		= 0x00,
107062306a36Sopenharmony_ci	SLI4_CMD_FCP_IWRITE64_WQE		= 0x01,
107162306a36Sopenharmony_ci	SLI4_CMD_FCP_TRECEIVE64_WQE		= 0x02,
107262306a36Sopenharmony_ci	SLI4_CMD_FCP_TRSP64_WQE			= 0x03,
107362306a36Sopenharmony_ci	SLI4_CMD_FCP_TSEND64_WQE		= 0x07,
107462306a36Sopenharmony_ci	SLI4_CMD_GEN_REQUEST64_WQE		= 0x08,
107562306a36Sopenharmony_ci	SLI4_CMD_XMIT_BCAST64_WQE		= 0x08,
107662306a36Sopenharmony_ci	SLI4_CMD_XMIT_BLS_RSP64_WQE		= 0x08,
107762306a36Sopenharmony_ci	SLI4_CMD_ABORT_WQE			= 0x08,
107862306a36Sopenharmony_ci	SLI4_CMD_XMIT_SEQUENCE64_WQE		= 0x08,
107962306a36Sopenharmony_ci	SLI4_CMD_REQUEUE_XRI_WQE		= 0x0a,
108062306a36Sopenharmony_ci	SLI4_CMD_SEND_FRAME_WQE			= 0x0a,
108162306a36Sopenharmony_ci};
108262306a36Sopenharmony_ci
108362306a36Sopenharmony_ci#define SLI4_WQE_SIZE		0x05
108462306a36Sopenharmony_ci#define SLI4_WQE_EXT_SIZE	0x06
108562306a36Sopenharmony_ci
108662306a36Sopenharmony_ci#define SLI4_WQE_BYTES		(16 * sizeof(u32))
108762306a36Sopenharmony_ci#define SLI4_WQE_EXT_BYTES	(32 * sizeof(u32))
108862306a36Sopenharmony_ci
108962306a36Sopenharmony_ci/* Mask for ccp (CS_CTL) */
109062306a36Sopenharmony_ci#define SLI4_MASK_CCP		0xfe
109162306a36Sopenharmony_ci
109262306a36Sopenharmony_ci/* Generic WQE */
109362306a36Sopenharmony_cienum sli4_gen_wqe_flags {
109462306a36Sopenharmony_ci	SLI4_GEN_WQE_EBDECNT	= 0xf,
109562306a36Sopenharmony_ci	SLI4_GEN_WQE_LEN_LOC	= 0x3 << 7,
109662306a36Sopenharmony_ci	SLI4_GEN_WQE_QOSD	= 1 << 9,
109762306a36Sopenharmony_ci	SLI4_GEN_WQE_XBL	= 1 << 11,
109862306a36Sopenharmony_ci	SLI4_GEN_WQE_HLM	= 1 << 12,
109962306a36Sopenharmony_ci	SLI4_GEN_WQE_IOD	= 1 << 13,
110062306a36Sopenharmony_ci	SLI4_GEN_WQE_DBDE	= 1 << 14,
110162306a36Sopenharmony_ci	SLI4_GEN_WQE_WQES	= 1 << 15,
110262306a36Sopenharmony_ci
110362306a36Sopenharmony_ci	SLI4_GEN_WQE_PRI	= 0x7,
110462306a36Sopenharmony_ci	SLI4_GEN_WQE_PV		= 1 << 3,
110562306a36Sopenharmony_ci	SLI4_GEN_WQE_EAT	= 1 << 4,
110662306a36Sopenharmony_ci	SLI4_GEN_WQE_XC		= 1 << 5,
110762306a36Sopenharmony_ci	SLI4_GEN_WQE_CCPE	= 1 << 7,
110862306a36Sopenharmony_ci
110962306a36Sopenharmony_ci	SLI4_GEN_WQE_CMDTYPE	= 0xf,
111062306a36Sopenharmony_ci	SLI4_GEN_WQE_WQEC	= 1 << 7,
111162306a36Sopenharmony_ci};
111262306a36Sopenharmony_ci
111362306a36Sopenharmony_cistruct sli4_generic_wqe {
111462306a36Sopenharmony_ci	__le32		cmd_spec0_5[6];
111562306a36Sopenharmony_ci	__le16		xri_tag;
111662306a36Sopenharmony_ci	__le16		context_tag;
111762306a36Sopenharmony_ci	u8		ct_byte;
111862306a36Sopenharmony_ci	u8		command;
111962306a36Sopenharmony_ci	u8		class_byte;
112062306a36Sopenharmony_ci	u8		timer;
112162306a36Sopenharmony_ci	__le32		abort_tag;
112262306a36Sopenharmony_ci	__le16		request_tag;
112362306a36Sopenharmony_ci	__le16		rsvd34;
112462306a36Sopenharmony_ci	__le16		dw10w0_flags;
112562306a36Sopenharmony_ci	u8		eat_xc_ccpe;
112662306a36Sopenharmony_ci	u8		ccp;
112762306a36Sopenharmony_ci	u8		cmdtype_wqec_byte;
112862306a36Sopenharmony_ci	u8		rsvd41;
112962306a36Sopenharmony_ci	__le16		cq_id;
113062306a36Sopenharmony_ci};
113162306a36Sopenharmony_ci
113262306a36Sopenharmony_ci/* WQE used to abort exchanges. */
113362306a36Sopenharmony_cienum sli4_abort_wqe_flags {
113462306a36Sopenharmony_ci	SLI4_ABRT_WQE_IR	= 0x02,
113562306a36Sopenharmony_ci
113662306a36Sopenharmony_ci	SLI4_ABRT_WQE_EBDECNT	= 0xf,
113762306a36Sopenharmony_ci	SLI4_ABRT_WQE_LEN_LOC	= 0x3 << 7,
113862306a36Sopenharmony_ci	SLI4_ABRT_WQE_QOSD	= 1 << 9,
113962306a36Sopenharmony_ci	SLI4_ABRT_WQE_XBL	= 1 << 11,
114062306a36Sopenharmony_ci	SLI4_ABRT_WQE_IOD	= 1 << 13,
114162306a36Sopenharmony_ci	SLI4_ABRT_WQE_DBDE	= 1 << 14,
114262306a36Sopenharmony_ci	SLI4_ABRT_WQE_WQES	= 1 << 15,
114362306a36Sopenharmony_ci
114462306a36Sopenharmony_ci	SLI4_ABRT_WQE_PRI	= 0x7,
114562306a36Sopenharmony_ci	SLI4_ABRT_WQE_PV	= 1 << 3,
114662306a36Sopenharmony_ci	SLI4_ABRT_WQE_EAT	= 1 << 4,
114762306a36Sopenharmony_ci	SLI4_ABRT_WQE_XC	= 1 << 5,
114862306a36Sopenharmony_ci	SLI4_ABRT_WQE_CCPE	= 1 << 7,
114962306a36Sopenharmony_ci
115062306a36Sopenharmony_ci	SLI4_ABRT_WQE_CMDTYPE	= 0xf,
115162306a36Sopenharmony_ci	SLI4_ABRT_WQE_WQEC	= 1 << 7,
115262306a36Sopenharmony_ci};
115362306a36Sopenharmony_ci
115462306a36Sopenharmony_cistruct sli4_abort_wqe {
115562306a36Sopenharmony_ci	__le32		rsvd0;
115662306a36Sopenharmony_ci	__le32		rsvd4;
115762306a36Sopenharmony_ci	__le32		ext_t_tag;
115862306a36Sopenharmony_ci	u8		ia_ir_byte;
115962306a36Sopenharmony_ci	u8		criteria;
116062306a36Sopenharmony_ci	__le16		rsvd10;
116162306a36Sopenharmony_ci	__le32		ext_t_mask;
116262306a36Sopenharmony_ci	__le32		t_mask;
116362306a36Sopenharmony_ci	__le16		xri_tag;
116462306a36Sopenharmony_ci	__le16		context_tag;
116562306a36Sopenharmony_ci	u8		ct_byte;
116662306a36Sopenharmony_ci	u8		command;
116762306a36Sopenharmony_ci	u8		class_byte;
116862306a36Sopenharmony_ci	u8		timer;
116962306a36Sopenharmony_ci	__le32		t_tag;
117062306a36Sopenharmony_ci	__le16		request_tag;
117162306a36Sopenharmony_ci	__le16		rsvd34;
117262306a36Sopenharmony_ci	__le16		dw10w0_flags;
117362306a36Sopenharmony_ci	u8		eat_xc_ccpe;
117462306a36Sopenharmony_ci	u8		ccp;
117562306a36Sopenharmony_ci	u8		cmdtype_wqec_byte;
117662306a36Sopenharmony_ci	u8		rsvd41;
117762306a36Sopenharmony_ci	__le16		cq_id;
117862306a36Sopenharmony_ci};
117962306a36Sopenharmony_ci
118062306a36Sopenharmony_cienum sli4_abort_criteria {
118162306a36Sopenharmony_ci	SLI4_ABORT_CRITERIA_XRI_TAG = 0x01,
118262306a36Sopenharmony_ci	SLI4_ABORT_CRITERIA_ABORT_TAG,
118362306a36Sopenharmony_ci	SLI4_ABORT_CRITERIA_REQUEST_TAG,
118462306a36Sopenharmony_ci	SLI4_ABORT_CRITERIA_EXT_ABORT_TAG,
118562306a36Sopenharmony_ci};
118662306a36Sopenharmony_ci
118762306a36Sopenharmony_cienum sli4_abort_type {
118862306a36Sopenharmony_ci	SLI4_ABORT_XRI,
118962306a36Sopenharmony_ci	SLI4_ABORT_ABORT_ID,
119062306a36Sopenharmony_ci	SLI4_ABORT_REQUEST_ID,
119162306a36Sopenharmony_ci	SLI4_ABORT_MAX,		/* must be last */
119262306a36Sopenharmony_ci};
119362306a36Sopenharmony_ci
119462306a36Sopenharmony_ci/* WQE used to create an ELS request. */
119562306a36Sopenharmony_cienum sli4_els_req_wqe_flags {
119662306a36Sopenharmony_ci	SLI4_REQ_WQE_QOSD		= 0x2,
119762306a36Sopenharmony_ci	SLI4_REQ_WQE_DBDE		= 0x40,
119862306a36Sopenharmony_ci	SLI4_REQ_WQE_XBL		= 0x8,
119962306a36Sopenharmony_ci	SLI4_REQ_WQE_XC			= 0x20,
120062306a36Sopenharmony_ci	SLI4_REQ_WQE_IOD		= 0x20,
120162306a36Sopenharmony_ci	SLI4_REQ_WQE_HLM		= 0x10,
120262306a36Sopenharmony_ci	SLI4_REQ_WQE_CCPE		= 0x80,
120362306a36Sopenharmony_ci	SLI4_REQ_WQE_EAT		= 0x10,
120462306a36Sopenharmony_ci	SLI4_REQ_WQE_WQES		= 0x80,
120562306a36Sopenharmony_ci	SLI4_REQ_WQE_PU_SHFT		= 4,
120662306a36Sopenharmony_ci	SLI4_REQ_WQE_CT_SHFT		= 2,
120762306a36Sopenharmony_ci	SLI4_REQ_WQE_CT			= 0xc,
120862306a36Sopenharmony_ci	SLI4_REQ_WQE_ELSID_SHFT		= 4,
120962306a36Sopenharmony_ci	SLI4_REQ_WQE_SP_SHFT		= 24,
121062306a36Sopenharmony_ci	SLI4_REQ_WQE_LEN_LOC_BIT1	= 0x80,
121162306a36Sopenharmony_ci	SLI4_REQ_WQE_LEN_LOC_BIT2	= 0x1,
121262306a36Sopenharmony_ci};
121362306a36Sopenharmony_ci
121462306a36Sopenharmony_cistruct sli4_els_request64_wqe {
121562306a36Sopenharmony_ci	struct sli4_bde	els_request_payload;
121662306a36Sopenharmony_ci	__le32		els_request_payload_length;
121762306a36Sopenharmony_ci	__le32		sid_sp_dword;
121862306a36Sopenharmony_ci	__le32		remote_id_dword;
121962306a36Sopenharmony_ci	__le16		xri_tag;
122062306a36Sopenharmony_ci	__le16		context_tag;
122162306a36Sopenharmony_ci	u8		ct_byte;
122262306a36Sopenharmony_ci	u8		command;
122362306a36Sopenharmony_ci	u8		class_byte;
122462306a36Sopenharmony_ci	u8		timer;
122562306a36Sopenharmony_ci	__le32		abort_tag;
122662306a36Sopenharmony_ci	__le16		request_tag;
122762306a36Sopenharmony_ci	__le16		temporary_rpi;
122862306a36Sopenharmony_ci	u8		len_loc1_byte;
122962306a36Sopenharmony_ci	u8		qosd_xbl_hlm_iod_dbde_wqes;
123062306a36Sopenharmony_ci	u8		eat_xc_ccpe;
123162306a36Sopenharmony_ci	u8		ccp;
123262306a36Sopenharmony_ci	u8		cmdtype_elsid_byte;
123362306a36Sopenharmony_ci	u8		rsvd41;
123462306a36Sopenharmony_ci	__le16		cq_id;
123562306a36Sopenharmony_ci	struct sli4_bde	els_response_payload_bde;
123662306a36Sopenharmony_ci	__le32		max_response_payload_length;
123762306a36Sopenharmony_ci};
123862306a36Sopenharmony_ci
123962306a36Sopenharmony_ci/* WQE used to create an FCP initiator no data command. */
124062306a36Sopenharmony_cienum sli4_icmd_wqe_flags {
124162306a36Sopenharmony_ci	SLI4_ICMD_WQE_DBDE		= 0x40,
124262306a36Sopenharmony_ci	SLI4_ICMD_WQE_XBL		= 0x8,
124362306a36Sopenharmony_ci	SLI4_ICMD_WQE_XC		= 0x20,
124462306a36Sopenharmony_ci	SLI4_ICMD_WQE_IOD		= 0x20,
124562306a36Sopenharmony_ci	SLI4_ICMD_WQE_HLM		= 0x10,
124662306a36Sopenharmony_ci	SLI4_ICMD_WQE_CCPE		= 0x80,
124762306a36Sopenharmony_ci	SLI4_ICMD_WQE_EAT		= 0x10,
124862306a36Sopenharmony_ci	SLI4_ICMD_WQE_APPID		= 0x10,
124962306a36Sopenharmony_ci	SLI4_ICMD_WQE_WQES		= 0x80,
125062306a36Sopenharmony_ci	SLI4_ICMD_WQE_PU_SHFT		= 4,
125162306a36Sopenharmony_ci	SLI4_ICMD_WQE_CT_SHFT		= 2,
125262306a36Sopenharmony_ci	SLI4_ICMD_WQE_BS_SHFT		= 4,
125362306a36Sopenharmony_ci	SLI4_ICMD_WQE_LEN_LOC_BIT1	= 0x80,
125462306a36Sopenharmony_ci	SLI4_ICMD_WQE_LEN_LOC_BIT2	= 0x1,
125562306a36Sopenharmony_ci};
125662306a36Sopenharmony_ci
125762306a36Sopenharmony_cistruct sli4_fcp_icmnd64_wqe {
125862306a36Sopenharmony_ci	struct sli4_bde	bde;
125962306a36Sopenharmony_ci	__le16		payload_offset_length;
126062306a36Sopenharmony_ci	__le16		fcp_cmd_buffer_length;
126162306a36Sopenharmony_ci	__le32		rsvd12;
126262306a36Sopenharmony_ci	__le32		remote_n_port_id_dword;
126362306a36Sopenharmony_ci	__le16		xri_tag;
126462306a36Sopenharmony_ci	__le16		context_tag;
126562306a36Sopenharmony_ci	u8		dif_ct_bs_byte;
126662306a36Sopenharmony_ci	u8		command;
126762306a36Sopenharmony_ci	u8		class_pu_byte;
126862306a36Sopenharmony_ci	u8		timer;
126962306a36Sopenharmony_ci	__le32		abort_tag;
127062306a36Sopenharmony_ci	__le16		request_tag;
127162306a36Sopenharmony_ci	__le16		rsvd34;
127262306a36Sopenharmony_ci	u8		len_loc1_byte;
127362306a36Sopenharmony_ci	u8		qosd_xbl_hlm_iod_dbde_wqes;
127462306a36Sopenharmony_ci	u8		eat_xc_ccpe;
127562306a36Sopenharmony_ci	u8		ccp;
127662306a36Sopenharmony_ci	u8		cmd_type_byte;
127762306a36Sopenharmony_ci	u8		rsvd41;
127862306a36Sopenharmony_ci	__le16		cq_id;
127962306a36Sopenharmony_ci	__le32		rsvd44;
128062306a36Sopenharmony_ci	__le32		rsvd48;
128162306a36Sopenharmony_ci	__le32		rsvd52;
128262306a36Sopenharmony_ci	__le32		rsvd56;
128362306a36Sopenharmony_ci};
128462306a36Sopenharmony_ci
128562306a36Sopenharmony_ci/* WQE used to create an FCP initiator read. */
128662306a36Sopenharmony_cienum sli4_ir_wqe_flags {
128762306a36Sopenharmony_ci	SLI4_IR_WQE_DBDE		= 0x40,
128862306a36Sopenharmony_ci	SLI4_IR_WQE_XBL			= 0x8,
128962306a36Sopenharmony_ci	SLI4_IR_WQE_XC			= 0x20,
129062306a36Sopenharmony_ci	SLI4_IR_WQE_IOD			= 0x20,
129162306a36Sopenharmony_ci	SLI4_IR_WQE_HLM			= 0x10,
129262306a36Sopenharmony_ci	SLI4_IR_WQE_CCPE		= 0x80,
129362306a36Sopenharmony_ci	SLI4_IR_WQE_EAT			= 0x10,
129462306a36Sopenharmony_ci	SLI4_IR_WQE_APPID		= 0x10,
129562306a36Sopenharmony_ci	SLI4_IR_WQE_WQES		= 0x80,
129662306a36Sopenharmony_ci	SLI4_IR_WQE_PU_SHFT		= 4,
129762306a36Sopenharmony_ci	SLI4_IR_WQE_CT_SHFT		= 2,
129862306a36Sopenharmony_ci	SLI4_IR_WQE_BS_SHFT		= 4,
129962306a36Sopenharmony_ci	SLI4_IR_WQE_LEN_LOC_BIT1	= 0x80,
130062306a36Sopenharmony_ci	SLI4_IR_WQE_LEN_LOC_BIT2	= 0x1,
130162306a36Sopenharmony_ci};
130262306a36Sopenharmony_ci
130362306a36Sopenharmony_cistruct sli4_fcp_iread64_wqe {
130462306a36Sopenharmony_ci	struct sli4_bde	bde;
130562306a36Sopenharmony_ci	__le16		payload_offset_length;
130662306a36Sopenharmony_ci	__le16		fcp_cmd_buffer_length;
130762306a36Sopenharmony_ci
130862306a36Sopenharmony_ci	__le32		total_transfer_length;
130962306a36Sopenharmony_ci
131062306a36Sopenharmony_ci	__le32		remote_n_port_id_dword;
131162306a36Sopenharmony_ci
131262306a36Sopenharmony_ci	__le16		xri_tag;
131362306a36Sopenharmony_ci	__le16		context_tag;
131462306a36Sopenharmony_ci
131562306a36Sopenharmony_ci	u8		dif_ct_bs_byte;
131662306a36Sopenharmony_ci	u8		command;
131762306a36Sopenharmony_ci	u8		class_pu_byte;
131862306a36Sopenharmony_ci	u8		timer;
131962306a36Sopenharmony_ci
132062306a36Sopenharmony_ci	__le32		abort_tag;
132162306a36Sopenharmony_ci
132262306a36Sopenharmony_ci	__le16		request_tag;
132362306a36Sopenharmony_ci	__le16		rsvd34;
132462306a36Sopenharmony_ci
132562306a36Sopenharmony_ci	u8		len_loc1_byte;
132662306a36Sopenharmony_ci	u8		qosd_xbl_hlm_iod_dbde_wqes;
132762306a36Sopenharmony_ci	u8		eat_xc_ccpe;
132862306a36Sopenharmony_ci	u8		ccp;
132962306a36Sopenharmony_ci
133062306a36Sopenharmony_ci	u8		cmd_type_byte;
133162306a36Sopenharmony_ci	u8		rsvd41;
133262306a36Sopenharmony_ci	__le16		cq_id;
133362306a36Sopenharmony_ci
133462306a36Sopenharmony_ci	__le32		rsvd44;
133562306a36Sopenharmony_ci	struct sli4_bde	first_data_bde;
133662306a36Sopenharmony_ci};
133762306a36Sopenharmony_ci
133862306a36Sopenharmony_ci/* WQE used to create an FCP initiator write. */
133962306a36Sopenharmony_cienum sli4_iwr_wqe_flags {
134062306a36Sopenharmony_ci	SLI4_IWR_WQE_DBDE		= 0x40,
134162306a36Sopenharmony_ci	SLI4_IWR_WQE_XBL		= 0x8,
134262306a36Sopenharmony_ci	SLI4_IWR_WQE_XC			= 0x20,
134362306a36Sopenharmony_ci	SLI4_IWR_WQE_IOD		= 0x20,
134462306a36Sopenharmony_ci	SLI4_IWR_WQE_HLM		= 0x10,
134562306a36Sopenharmony_ci	SLI4_IWR_WQE_DNRX		= 0x10,
134662306a36Sopenharmony_ci	SLI4_IWR_WQE_CCPE		= 0x80,
134762306a36Sopenharmony_ci	SLI4_IWR_WQE_EAT		= 0x10,
134862306a36Sopenharmony_ci	SLI4_IWR_WQE_APPID		= 0x10,
134962306a36Sopenharmony_ci	SLI4_IWR_WQE_WQES		= 0x80,
135062306a36Sopenharmony_ci	SLI4_IWR_WQE_PU_SHFT		= 4,
135162306a36Sopenharmony_ci	SLI4_IWR_WQE_CT_SHFT		= 2,
135262306a36Sopenharmony_ci	SLI4_IWR_WQE_BS_SHFT		= 4,
135362306a36Sopenharmony_ci	SLI4_IWR_WQE_LEN_LOC_BIT1	= 0x80,
135462306a36Sopenharmony_ci	SLI4_IWR_WQE_LEN_LOC_BIT2	= 0x1,
135562306a36Sopenharmony_ci};
135662306a36Sopenharmony_ci
135762306a36Sopenharmony_cistruct sli4_fcp_iwrite64_wqe {
135862306a36Sopenharmony_ci	struct sli4_bde	bde;
135962306a36Sopenharmony_ci	__le16		payload_offset_length;
136062306a36Sopenharmony_ci	__le16		fcp_cmd_buffer_length;
136162306a36Sopenharmony_ci	__le16		total_transfer_length;
136262306a36Sopenharmony_ci	__le16		initial_transfer_length;
136362306a36Sopenharmony_ci	__le16		xri_tag;
136462306a36Sopenharmony_ci	__le16		context_tag;
136562306a36Sopenharmony_ci	u8		dif_ct_bs_byte;
136662306a36Sopenharmony_ci	u8		command;
136762306a36Sopenharmony_ci	u8		class_pu_byte;
136862306a36Sopenharmony_ci	u8		timer;
136962306a36Sopenharmony_ci	__le32		abort_tag;
137062306a36Sopenharmony_ci	__le16		request_tag;
137162306a36Sopenharmony_ci	__le16		rsvd34;
137262306a36Sopenharmony_ci	u8		len_loc1_byte;
137362306a36Sopenharmony_ci	u8		qosd_xbl_hlm_iod_dbde_wqes;
137462306a36Sopenharmony_ci	u8		eat_xc_ccpe;
137562306a36Sopenharmony_ci	u8		ccp;
137662306a36Sopenharmony_ci	u8		cmd_type_byte;
137762306a36Sopenharmony_ci	u8		rsvd41;
137862306a36Sopenharmony_ci	__le16		cq_id;
137962306a36Sopenharmony_ci	__le32		remote_n_port_id_dword;
138062306a36Sopenharmony_ci	struct sli4_bde	first_data_bde;
138162306a36Sopenharmony_ci};
138262306a36Sopenharmony_ci
138362306a36Sopenharmony_cistruct sli4_fcp_128byte_wqe {
138462306a36Sopenharmony_ci	u32 dw[32];
138562306a36Sopenharmony_ci};
138662306a36Sopenharmony_ci
138762306a36Sopenharmony_ci/* WQE used to create an FCP target receive */
138862306a36Sopenharmony_cienum sli4_trcv_wqe_flags {
138962306a36Sopenharmony_ci	SLI4_TRCV_WQE_DBDE		= 0x40,
139062306a36Sopenharmony_ci	SLI4_TRCV_WQE_XBL		= 0x8,
139162306a36Sopenharmony_ci	SLI4_TRCV_WQE_AR		= 0x8,
139262306a36Sopenharmony_ci	SLI4_TRCV_WQE_XC		= 0x20,
139362306a36Sopenharmony_ci	SLI4_TRCV_WQE_IOD		= 0x20,
139462306a36Sopenharmony_ci	SLI4_TRCV_WQE_HLM		= 0x10,
139562306a36Sopenharmony_ci	SLI4_TRCV_WQE_DNRX		= 0x10,
139662306a36Sopenharmony_ci	SLI4_TRCV_WQE_CCPE		= 0x80,
139762306a36Sopenharmony_ci	SLI4_TRCV_WQE_EAT		= 0x10,
139862306a36Sopenharmony_ci	SLI4_TRCV_WQE_APPID		= 0x10,
139962306a36Sopenharmony_ci	SLI4_TRCV_WQE_WQES		= 0x80,
140062306a36Sopenharmony_ci	SLI4_TRCV_WQE_PU_SHFT		= 4,
140162306a36Sopenharmony_ci	SLI4_TRCV_WQE_CT_SHFT		= 2,
140262306a36Sopenharmony_ci	SLI4_TRCV_WQE_BS_SHFT		= 4,
140362306a36Sopenharmony_ci	SLI4_TRCV_WQE_LEN_LOC_BIT2	= 0x1,
140462306a36Sopenharmony_ci};
140562306a36Sopenharmony_ci
140662306a36Sopenharmony_cistruct sli4_fcp_treceive64_wqe {
140762306a36Sopenharmony_ci	struct sli4_bde	bde;
140862306a36Sopenharmony_ci	__le32		payload_offset_length;
140962306a36Sopenharmony_ci	__le32		relative_offset;
141062306a36Sopenharmony_ci	union {
141162306a36Sopenharmony_ci		__le16	sec_xri_tag;
141262306a36Sopenharmony_ci		__le16	rsvd;
141362306a36Sopenharmony_ci		__le32	dword;
141462306a36Sopenharmony_ci	} dword5;
141562306a36Sopenharmony_ci	__le16		xri_tag;
141662306a36Sopenharmony_ci	__le16		context_tag;
141762306a36Sopenharmony_ci	u8		dif_ct_bs_byte;
141862306a36Sopenharmony_ci	u8		command;
141962306a36Sopenharmony_ci	u8		class_ar_pu_byte;
142062306a36Sopenharmony_ci	u8		timer;
142162306a36Sopenharmony_ci	__le32		abort_tag;
142262306a36Sopenharmony_ci	__le16		request_tag;
142362306a36Sopenharmony_ci	__le16		remote_xid;
142462306a36Sopenharmony_ci	u8		lloc1_appid;
142562306a36Sopenharmony_ci	u8		qosd_xbl_hlm_iod_dbde_wqes;
142662306a36Sopenharmony_ci	u8		eat_xc_ccpe;
142762306a36Sopenharmony_ci	u8		ccp;
142862306a36Sopenharmony_ci	u8		cmd_type_byte;
142962306a36Sopenharmony_ci	u8		rsvd41;
143062306a36Sopenharmony_ci	__le16		cq_id;
143162306a36Sopenharmony_ci	__le32		fcp_data_receive_length;
143262306a36Sopenharmony_ci	struct sli4_bde	first_data_bde;
143362306a36Sopenharmony_ci};
143462306a36Sopenharmony_ci
143562306a36Sopenharmony_ci/* WQE used to create an FCP target response */
143662306a36Sopenharmony_cienum sli4_trsp_wqe_flags {
143762306a36Sopenharmony_ci	SLI4_TRSP_WQE_AG	= 0x8,
143862306a36Sopenharmony_ci	SLI4_TRSP_WQE_DBDE	= 0x40,
143962306a36Sopenharmony_ci	SLI4_TRSP_WQE_XBL	= 0x8,
144062306a36Sopenharmony_ci	SLI4_TRSP_WQE_XC	= 0x20,
144162306a36Sopenharmony_ci	SLI4_TRSP_WQE_HLM	= 0x10,
144262306a36Sopenharmony_ci	SLI4_TRSP_WQE_DNRX	= 0x10,
144362306a36Sopenharmony_ci	SLI4_TRSP_WQE_CCPE	= 0x80,
144462306a36Sopenharmony_ci	SLI4_TRSP_WQE_EAT	= 0x10,
144562306a36Sopenharmony_ci	SLI4_TRSP_WQE_APPID	= 0x10,
144662306a36Sopenharmony_ci	SLI4_TRSP_WQE_WQES	= 0x80,
144762306a36Sopenharmony_ci};
144862306a36Sopenharmony_ci
144962306a36Sopenharmony_cistruct sli4_fcp_trsp64_wqe {
145062306a36Sopenharmony_ci	struct sli4_bde	bde;
145162306a36Sopenharmony_ci	__le32		fcp_response_length;
145262306a36Sopenharmony_ci	__le32		rsvd12;
145362306a36Sopenharmony_ci	__le32		dword5;
145462306a36Sopenharmony_ci	__le16		xri_tag;
145562306a36Sopenharmony_ci	__le16		rpi;
145662306a36Sopenharmony_ci	u8		ct_dnrx_byte;
145762306a36Sopenharmony_ci	u8		command;
145862306a36Sopenharmony_ci	u8		class_ag_byte;
145962306a36Sopenharmony_ci	u8		timer;
146062306a36Sopenharmony_ci	__le32		abort_tag;
146162306a36Sopenharmony_ci	__le16		request_tag;
146262306a36Sopenharmony_ci	__le16		remote_xid;
146362306a36Sopenharmony_ci	u8		lloc1_appid;
146462306a36Sopenharmony_ci	u8		qosd_xbl_hlm_dbde_wqes;
146562306a36Sopenharmony_ci	u8		eat_xc_ccpe;
146662306a36Sopenharmony_ci	u8		ccp;
146762306a36Sopenharmony_ci	u8		cmd_type_byte;
146862306a36Sopenharmony_ci	u8		rsvd41;
146962306a36Sopenharmony_ci	__le16		cq_id;
147062306a36Sopenharmony_ci	__le32		rsvd44;
147162306a36Sopenharmony_ci	__le32		rsvd48;
147262306a36Sopenharmony_ci	__le32		rsvd52;
147362306a36Sopenharmony_ci	__le32		rsvd56;
147462306a36Sopenharmony_ci};
147562306a36Sopenharmony_ci
147662306a36Sopenharmony_ci/* WQE used to create an FCP target send (DATA IN). */
147762306a36Sopenharmony_cienum sli4_tsend_wqe_flags {
147862306a36Sopenharmony_ci	SLI4_TSEND_WQE_XBL	= 0x8,
147962306a36Sopenharmony_ci	SLI4_TSEND_WQE_DBDE	= 0x40,
148062306a36Sopenharmony_ci	SLI4_TSEND_WQE_IOD	= 0x20,
148162306a36Sopenharmony_ci	SLI4_TSEND_WQE_QOSD	= 0x2,
148262306a36Sopenharmony_ci	SLI4_TSEND_WQE_HLM	= 0x10,
148362306a36Sopenharmony_ci	SLI4_TSEND_WQE_PU_SHFT	= 4,
148462306a36Sopenharmony_ci	SLI4_TSEND_WQE_AR	= 0x8,
148562306a36Sopenharmony_ci	SLI4_TSEND_CT_SHFT	= 2,
148662306a36Sopenharmony_ci	SLI4_TSEND_BS_SHFT	= 4,
148762306a36Sopenharmony_ci	SLI4_TSEND_LEN_LOC_BIT2 = 0x1,
148862306a36Sopenharmony_ci	SLI4_TSEND_CCPE		= 0x80,
148962306a36Sopenharmony_ci	SLI4_TSEND_APPID_VALID	= 0x20,
149062306a36Sopenharmony_ci	SLI4_TSEND_WQES		= 0x80,
149162306a36Sopenharmony_ci	SLI4_TSEND_XC		= 0x20,
149262306a36Sopenharmony_ci	SLI4_TSEND_EAT		= 0x10,
149362306a36Sopenharmony_ci};
149462306a36Sopenharmony_ci
149562306a36Sopenharmony_cistruct sli4_fcp_tsend64_wqe {
149662306a36Sopenharmony_ci	struct sli4_bde	bde;
149762306a36Sopenharmony_ci	__le32		payload_offset_length;
149862306a36Sopenharmony_ci	__le32		relative_offset;
149962306a36Sopenharmony_ci	__le32		dword5;
150062306a36Sopenharmony_ci	__le16		xri_tag;
150162306a36Sopenharmony_ci	__le16		rpi;
150262306a36Sopenharmony_ci	u8		ct_byte;
150362306a36Sopenharmony_ci	u8		command;
150462306a36Sopenharmony_ci	u8		class_pu_ar_byte;
150562306a36Sopenharmony_ci	u8		timer;
150662306a36Sopenharmony_ci	__le32		abort_tag;
150762306a36Sopenharmony_ci	__le16		request_tag;
150862306a36Sopenharmony_ci	__le16		remote_xid;
150962306a36Sopenharmony_ci	u8		dw10byte0;
151062306a36Sopenharmony_ci	u8		ll_qd_xbl_hlm_iod_dbde;
151162306a36Sopenharmony_ci	u8		dw10byte2;
151262306a36Sopenharmony_ci	u8		ccp;
151362306a36Sopenharmony_ci	u8		cmd_type_byte;
151462306a36Sopenharmony_ci	u8		rsvd45;
151562306a36Sopenharmony_ci	__le16		cq_id;
151662306a36Sopenharmony_ci	__le32		fcp_data_transmit_length;
151762306a36Sopenharmony_ci	struct sli4_bde	first_data_bde;
151862306a36Sopenharmony_ci};
151962306a36Sopenharmony_ci
152062306a36Sopenharmony_ci/* WQE used to create a general request. */
152162306a36Sopenharmony_cienum sli4_gen_req_wqe_flags {
152262306a36Sopenharmony_ci	SLI4_GEN_REQ64_WQE_XBL	= 0x8,
152362306a36Sopenharmony_ci	SLI4_GEN_REQ64_WQE_DBDE	= 0x40,
152462306a36Sopenharmony_ci	SLI4_GEN_REQ64_WQE_IOD	= 0x20,
152562306a36Sopenharmony_ci	SLI4_GEN_REQ64_WQE_QOSD	= 0x2,
152662306a36Sopenharmony_ci	SLI4_GEN_REQ64_WQE_HLM	= 0x10,
152762306a36Sopenharmony_ci	SLI4_GEN_REQ64_CT_SHFT	= 2,
152862306a36Sopenharmony_ci};
152962306a36Sopenharmony_ci
153062306a36Sopenharmony_cistruct sli4_gen_request64_wqe {
153162306a36Sopenharmony_ci	struct sli4_bde	bde;
153262306a36Sopenharmony_ci	__le32		request_payload_length;
153362306a36Sopenharmony_ci	__le32		relative_offset;
153462306a36Sopenharmony_ci	u8		rsvd17;
153562306a36Sopenharmony_ci	u8		df_ctl;
153662306a36Sopenharmony_ci	u8		type;
153762306a36Sopenharmony_ci	u8		r_ctl;
153862306a36Sopenharmony_ci	__le16		xri_tag;
153962306a36Sopenharmony_ci	__le16		context_tag;
154062306a36Sopenharmony_ci	u8		ct_byte;
154162306a36Sopenharmony_ci	u8		command;
154262306a36Sopenharmony_ci	u8		class_byte;
154362306a36Sopenharmony_ci	u8		timer;
154462306a36Sopenharmony_ci	__le32		abort_tag;
154562306a36Sopenharmony_ci	__le16		request_tag;
154662306a36Sopenharmony_ci	__le16		rsvd34;
154762306a36Sopenharmony_ci	u8		dw10flags0;
154862306a36Sopenharmony_ci	u8		dw10flags1;
154962306a36Sopenharmony_ci	u8		dw10flags2;
155062306a36Sopenharmony_ci	u8		ccp;
155162306a36Sopenharmony_ci	u8		cmd_type_byte;
155262306a36Sopenharmony_ci	u8		rsvd41;
155362306a36Sopenharmony_ci	__le16		cq_id;
155462306a36Sopenharmony_ci	__le32		remote_n_port_id_dword;
155562306a36Sopenharmony_ci	__le32		rsvd48;
155662306a36Sopenharmony_ci	__le32		rsvd52;
155762306a36Sopenharmony_ci	__le32		max_response_payload_length;
155862306a36Sopenharmony_ci};
155962306a36Sopenharmony_ci
156062306a36Sopenharmony_ci/* WQE used to create a send frame request */
156162306a36Sopenharmony_cienum sli4_sf_wqe_flags {
156262306a36Sopenharmony_ci	SLI4_SF_WQE_DBDE	= 0x40,
156362306a36Sopenharmony_ci	SLI4_SF_PU		= 0x30,
156462306a36Sopenharmony_ci	SLI4_SF_CT		= 0xc,
156562306a36Sopenharmony_ci	SLI4_SF_QOSD		= 0x2,
156662306a36Sopenharmony_ci	SLI4_SF_LEN_LOC_BIT1	= 0x80,
156762306a36Sopenharmony_ci	SLI4_SF_LEN_LOC_BIT2	= 0x1,
156862306a36Sopenharmony_ci	SLI4_SF_XC		= 0x20,
156962306a36Sopenharmony_ci	SLI4_SF_XBL		= 0x8,
157062306a36Sopenharmony_ci};
157162306a36Sopenharmony_ci
157262306a36Sopenharmony_cistruct sli4_send_frame_wqe {
157362306a36Sopenharmony_ci	struct sli4_bde	bde;
157462306a36Sopenharmony_ci	__le32		frame_length;
157562306a36Sopenharmony_ci	__le32		fc_header_0_1[2];
157662306a36Sopenharmony_ci	__le16		xri_tag;
157762306a36Sopenharmony_ci	__le16		context_tag;
157862306a36Sopenharmony_ci	u8		ct_byte;
157962306a36Sopenharmony_ci	u8		command;
158062306a36Sopenharmony_ci	u8		dw7flags0;
158162306a36Sopenharmony_ci	u8		timer;
158262306a36Sopenharmony_ci	__le32		abort_tag;
158362306a36Sopenharmony_ci	__le16		request_tag;
158462306a36Sopenharmony_ci	u8		eof;
158562306a36Sopenharmony_ci	u8		sof;
158662306a36Sopenharmony_ci	u8		dw10flags0;
158762306a36Sopenharmony_ci	u8		dw10flags1;
158862306a36Sopenharmony_ci	u8		dw10flags2;
158962306a36Sopenharmony_ci	u8		ccp;
159062306a36Sopenharmony_ci	u8		cmd_type_byte;
159162306a36Sopenharmony_ci	u8		rsvd41;
159262306a36Sopenharmony_ci	__le16		cq_id;
159362306a36Sopenharmony_ci	__le32		fc_header_2_5[4];
159462306a36Sopenharmony_ci};
159562306a36Sopenharmony_ci
159662306a36Sopenharmony_ci/* WQE used to create a transmit sequence */
159762306a36Sopenharmony_cienum sli4_seq_wqe_flags {
159862306a36Sopenharmony_ci	SLI4_SEQ_WQE_DBDE		= 0x4000,
159962306a36Sopenharmony_ci	SLI4_SEQ_WQE_XBL		= 0x800,
160062306a36Sopenharmony_ci	SLI4_SEQ_WQE_SI			= 0x4,
160162306a36Sopenharmony_ci	SLI4_SEQ_WQE_FT			= 0x8,
160262306a36Sopenharmony_ci	SLI4_SEQ_WQE_XO			= 0x40,
160362306a36Sopenharmony_ci	SLI4_SEQ_WQE_LS			= 0x80,
160462306a36Sopenharmony_ci	SLI4_SEQ_WQE_DIF		= 0x3,
160562306a36Sopenharmony_ci	SLI4_SEQ_WQE_BS			= 0x70,
160662306a36Sopenharmony_ci	SLI4_SEQ_WQE_PU			= 0x30,
160762306a36Sopenharmony_ci	SLI4_SEQ_WQE_HLM		= 0x1000,
160862306a36Sopenharmony_ci	SLI4_SEQ_WQE_IOD_SHIFT		= 13,
160962306a36Sopenharmony_ci	SLI4_SEQ_WQE_CT_SHIFT		= 2,
161062306a36Sopenharmony_ci	SLI4_SEQ_WQE_LEN_LOC_SHIFT	= 7,
161162306a36Sopenharmony_ci};
161262306a36Sopenharmony_ci
161362306a36Sopenharmony_cistruct sli4_xmit_sequence64_wqe {
161462306a36Sopenharmony_ci	struct sli4_bde	bde;
161562306a36Sopenharmony_ci	__le32		remote_n_port_id_dword;
161662306a36Sopenharmony_ci	__le32		relative_offset;
161762306a36Sopenharmony_ci	u8		dw5flags0;
161862306a36Sopenharmony_ci	u8		df_ctl;
161962306a36Sopenharmony_ci	u8		type;
162062306a36Sopenharmony_ci	u8		r_ctl;
162162306a36Sopenharmony_ci	__le16		xri_tag;
162262306a36Sopenharmony_ci	__le16		context_tag;
162362306a36Sopenharmony_ci	u8		dw7flags0;
162462306a36Sopenharmony_ci	u8		command;
162562306a36Sopenharmony_ci	u8		dw7flags1;
162662306a36Sopenharmony_ci	u8		timer;
162762306a36Sopenharmony_ci	__le32		abort_tag;
162862306a36Sopenharmony_ci	__le16		request_tag;
162962306a36Sopenharmony_ci	__le16		remote_xid;
163062306a36Sopenharmony_ci	__le16		dw10w0;
163162306a36Sopenharmony_ci	u8		dw10flags0;
163262306a36Sopenharmony_ci	u8		ccp;
163362306a36Sopenharmony_ci	u8		cmd_type_wqec_byte;
163462306a36Sopenharmony_ci	u8		rsvd45;
163562306a36Sopenharmony_ci	__le16		cq_id;
163662306a36Sopenharmony_ci	__le32		sequence_payload_len;
163762306a36Sopenharmony_ci	__le32		rsvd48;
163862306a36Sopenharmony_ci	__le32		rsvd52;
163962306a36Sopenharmony_ci	__le32		rsvd56;
164062306a36Sopenharmony_ci};
164162306a36Sopenharmony_ci
164262306a36Sopenharmony_ci/*
164362306a36Sopenharmony_ci * WQE used unblock the specified XRI and to release
164462306a36Sopenharmony_ci * it to the SLI Port's free pool.
164562306a36Sopenharmony_ci */
164662306a36Sopenharmony_cienum sli4_requeue_wqe_flags {
164762306a36Sopenharmony_ci	SLI4_REQU_XRI_WQE_XC	= 0x20,
164862306a36Sopenharmony_ci	SLI4_REQU_XRI_WQE_QOSD	= 0x2,
164962306a36Sopenharmony_ci};
165062306a36Sopenharmony_ci
165162306a36Sopenharmony_cistruct sli4_requeue_xri_wqe {
165262306a36Sopenharmony_ci	__le32		rsvd0;
165362306a36Sopenharmony_ci	__le32		rsvd4;
165462306a36Sopenharmony_ci	__le32		rsvd8;
165562306a36Sopenharmony_ci	__le32		rsvd12;
165662306a36Sopenharmony_ci	__le32		rsvd16;
165762306a36Sopenharmony_ci	__le32		rsvd20;
165862306a36Sopenharmony_ci	__le16		xri_tag;
165962306a36Sopenharmony_ci	__le16		context_tag;
166062306a36Sopenharmony_ci	u8		ct_byte;
166162306a36Sopenharmony_ci	u8		command;
166262306a36Sopenharmony_ci	u8		class_byte;
166362306a36Sopenharmony_ci	u8		timer;
166462306a36Sopenharmony_ci	__le32		rsvd32;
166562306a36Sopenharmony_ci	__le16		request_tag;
166662306a36Sopenharmony_ci	__le16		rsvd34;
166762306a36Sopenharmony_ci	__le16		flags0;
166862306a36Sopenharmony_ci	__le16		flags1;
166962306a36Sopenharmony_ci	__le16		flags2;
167062306a36Sopenharmony_ci	u8		ccp;
167162306a36Sopenharmony_ci	u8		cmd_type_wqec_byte;
167262306a36Sopenharmony_ci	u8		rsvd42;
167362306a36Sopenharmony_ci	__le16		cq_id;
167462306a36Sopenharmony_ci	__le32		rsvd44;
167562306a36Sopenharmony_ci	__le32		rsvd48;
167662306a36Sopenharmony_ci	__le32		rsvd52;
167762306a36Sopenharmony_ci	__le32		rsvd56;
167862306a36Sopenharmony_ci};
167962306a36Sopenharmony_ci
168062306a36Sopenharmony_ci/* WQE used to create a BLS response */
168162306a36Sopenharmony_cienum sli4_bls_rsp_wqe_flags {
168262306a36Sopenharmony_ci	SLI4_BLS_RSP_RID		= 0xffffff,
168362306a36Sopenharmony_ci	SLI4_BLS_RSP_WQE_AR		= 0x40000000,
168462306a36Sopenharmony_ci	SLI4_BLS_RSP_WQE_CT_SHFT	= 2,
168562306a36Sopenharmony_ci	SLI4_BLS_RSP_WQE_QOSD		= 0x2,
168662306a36Sopenharmony_ci	SLI4_BLS_RSP_WQE_HLM		= 0x10,
168762306a36Sopenharmony_ci};
168862306a36Sopenharmony_ci
168962306a36Sopenharmony_cistruct sli4_xmit_bls_rsp_wqe {
169062306a36Sopenharmony_ci	__le32		payload_word0;
169162306a36Sopenharmony_ci	__le16		rx_id;
169262306a36Sopenharmony_ci	__le16		ox_id;
169362306a36Sopenharmony_ci	__le16		high_seq_cnt;
169462306a36Sopenharmony_ci	__le16		low_seq_cnt;
169562306a36Sopenharmony_ci	__le32		rsvd12;
169662306a36Sopenharmony_ci	__le32		local_n_port_id_dword;
169762306a36Sopenharmony_ci	__le32		remote_id_dword;
169862306a36Sopenharmony_ci	__le16		xri_tag;
169962306a36Sopenharmony_ci	__le16		context_tag;
170062306a36Sopenharmony_ci	u8		dw8flags0;
170162306a36Sopenharmony_ci	u8		command;
170262306a36Sopenharmony_ci	u8		dw8flags1;
170362306a36Sopenharmony_ci	u8		timer;
170462306a36Sopenharmony_ci	__le32		abort_tag;
170562306a36Sopenharmony_ci	__le16		request_tag;
170662306a36Sopenharmony_ci	__le16		rsvd38;
170762306a36Sopenharmony_ci	u8		dw11flags0;
170862306a36Sopenharmony_ci	u8		dw11flags1;
170962306a36Sopenharmony_ci	u8		dw11flags2;
171062306a36Sopenharmony_ci	u8		ccp;
171162306a36Sopenharmony_ci	u8		dw12flags0;
171262306a36Sopenharmony_ci	u8		rsvd45;
171362306a36Sopenharmony_ci	__le16		cq_id;
171462306a36Sopenharmony_ci	__le16		temporary_rpi;
171562306a36Sopenharmony_ci	u8		rsvd50;
171662306a36Sopenharmony_ci	u8		rsvd51;
171762306a36Sopenharmony_ci	__le32		rsvd52;
171862306a36Sopenharmony_ci	__le32		rsvd56;
171962306a36Sopenharmony_ci	__le32		rsvd60;
172062306a36Sopenharmony_ci};
172162306a36Sopenharmony_ci
172262306a36Sopenharmony_cienum sli_bls_type {
172362306a36Sopenharmony_ci	SLI4_SLI_BLS_ACC,
172462306a36Sopenharmony_ci	SLI4_SLI_BLS_RJT,
172562306a36Sopenharmony_ci	SLI4_SLI_BLS_MAX
172662306a36Sopenharmony_ci};
172762306a36Sopenharmony_ci
172862306a36Sopenharmony_cistruct sli_bls_payload {
172962306a36Sopenharmony_ci	enum sli_bls_type	type;
173062306a36Sopenharmony_ci	__le16			ox_id;
173162306a36Sopenharmony_ci	__le16			rx_id;
173262306a36Sopenharmony_ci	union {
173362306a36Sopenharmony_ci		struct {
173462306a36Sopenharmony_ci			u8	seq_id_validity;
173562306a36Sopenharmony_ci			u8	seq_id_last;
173662306a36Sopenharmony_ci			u8	rsvd2;
173762306a36Sopenharmony_ci			u8	rsvd3;
173862306a36Sopenharmony_ci			u16	ox_id;
173962306a36Sopenharmony_ci			u16	rx_id;
174062306a36Sopenharmony_ci			__le16	low_seq_cnt;
174162306a36Sopenharmony_ci			__le16	high_seq_cnt;
174262306a36Sopenharmony_ci		} acc;
174362306a36Sopenharmony_ci		struct {
174462306a36Sopenharmony_ci			u8	vendor_unique;
174562306a36Sopenharmony_ci			u8	reason_explanation;
174662306a36Sopenharmony_ci			u8	reason_code;
174762306a36Sopenharmony_ci			u8	rsvd3;
174862306a36Sopenharmony_ci		} rjt;
174962306a36Sopenharmony_ci	} u;
175062306a36Sopenharmony_ci};
175162306a36Sopenharmony_ci
175262306a36Sopenharmony_ci/* WQE used to create an ELS response */
175362306a36Sopenharmony_ci
175462306a36Sopenharmony_cienum sli4_els_rsp_flags {
175562306a36Sopenharmony_ci	SLI4_ELS_SID		= 0xffffff,
175662306a36Sopenharmony_ci	SLI4_ELS_RID		= 0xffffff,
175762306a36Sopenharmony_ci	SLI4_ELS_DBDE		= 0x40,
175862306a36Sopenharmony_ci	SLI4_ELS_XBL		= 0x8,
175962306a36Sopenharmony_ci	SLI4_ELS_IOD		= 0x20,
176062306a36Sopenharmony_ci	SLI4_ELS_QOSD		= 0x2,
176162306a36Sopenharmony_ci	SLI4_ELS_XC		= 0x20,
176262306a36Sopenharmony_ci	SLI4_ELS_CT_OFFSET	= 0X2,
176362306a36Sopenharmony_ci	SLI4_ELS_SP		= 0X1000000,
176462306a36Sopenharmony_ci	SLI4_ELS_HLM		= 0X10,
176562306a36Sopenharmony_ci};
176662306a36Sopenharmony_ci
176762306a36Sopenharmony_cistruct sli4_xmit_els_rsp64_wqe {
176862306a36Sopenharmony_ci	struct sli4_bde	els_response_payload;
176962306a36Sopenharmony_ci	__le32		els_response_payload_length;
177062306a36Sopenharmony_ci	__le32		sid_dw;
177162306a36Sopenharmony_ci	__le32		rid_dw;
177262306a36Sopenharmony_ci	__le16		xri_tag;
177362306a36Sopenharmony_ci	__le16		context_tag;
177462306a36Sopenharmony_ci	u8		ct_byte;
177562306a36Sopenharmony_ci	u8		command;
177662306a36Sopenharmony_ci	u8		class_byte;
177762306a36Sopenharmony_ci	u8		timer;
177862306a36Sopenharmony_ci	__le32		abort_tag;
177962306a36Sopenharmony_ci	__le16		request_tag;
178062306a36Sopenharmony_ci	__le16		ox_id;
178162306a36Sopenharmony_ci	u8		flags1;
178262306a36Sopenharmony_ci	u8		flags2;
178362306a36Sopenharmony_ci	u8		flags3;
178462306a36Sopenharmony_ci	u8		flags4;
178562306a36Sopenharmony_ci	u8		cmd_type_wqec;
178662306a36Sopenharmony_ci	u8		rsvd34;
178762306a36Sopenharmony_ci	__le16		cq_id;
178862306a36Sopenharmony_ci	__le16		temporary_rpi;
178962306a36Sopenharmony_ci	__le16		rsvd38;
179062306a36Sopenharmony_ci	u32		rsvd40;
179162306a36Sopenharmony_ci	u32		rsvd44;
179262306a36Sopenharmony_ci	u32		rsvd48;
179362306a36Sopenharmony_ci};
179462306a36Sopenharmony_ci
179562306a36Sopenharmony_ci/* Local Reject Reason Codes */
179662306a36Sopenharmony_cienum sli4_fc_local_rej_codes {
179762306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_UNKNOWN,
179862306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_MISSING_CONTINUE,
179962306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_SEQUENCE_TIMEOUT,
180062306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_INTERNAL_ERROR,
180162306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_INVALID_RPI,
180262306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_NO_XRI,
180362306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_ILLEGAL_COMMAND,
180462306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_XCHG_DROPPED,
180562306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_ILLEGAL_FIELD,
180662306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_RPI_SUSPENDED,
180762306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_RSVD,
180862306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_RSVD1,
180962306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_NO_ABORT_MATCH,
181062306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_TX_DMA_FAILED,
181162306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_RX_DMA_FAILED,
181262306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_ILLEGAL_FRAME,
181362306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_RSVD2,
181462306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_NO_RESOURCES, //0x11
181562306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_FCP_CONF_FAILURE,
181662306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_ILLEGAL_LENGTH,
181762306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_UNSUPPORTED_FEATURE,
181862306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_ABORT_IN_PROGRESS,
181962306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_ABORT_REQUESTED,
182062306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_RCV_BUFFER_TIMEOUT,
182162306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_LOOP_OPEN_FAILURE,
182262306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_RSVD3,
182362306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_LINK_DOWN,
182462306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_CORRUPTED_DATA,
182562306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_CORRUPTED_RPI,
182662306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_OUTOFORDER_DATA,
182762306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_OUTOFORDER_ACK,
182862306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_DUP_FRAME,
182962306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_LINK_CONTROL_FRAME, //0x20
183062306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_BAD_HOST_ADDRESS,
183162306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_RSVD4,
183262306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_MISSING_HDR_BUFFER,
183362306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_MSEQ_CHAIN_CORRUPTED,
183462306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_ABORTMULT_REQUESTED,
183562306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_BUFFER_SHORTAGE	= 0x28,
183662306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_RCV_XRIBUF_WAITING,
183762306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_INVALID_VPI	= 0x2e,
183862306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_NO_FPORT_DETECTED,
183962306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_MISSING_XRIBUF,
184062306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_RSVD5,
184162306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_INVALID_XRI,
184262306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_INVALID_RELOFFSET	= 0x40,
184362306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_MISSING_RELOFFSET,
184462306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_INSUFF_BUFFERSPACE,
184562306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_MISSING_SI,
184662306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_MISSING_ES,
184762306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_INCOMPLETE_XFER,
184862306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_SLER_FAILURE,
184962306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_SLER_CMD_RCV_FAILURE,
185062306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_SLER_REC_RJT_ERR,
185162306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_SLER_REC_SRR_RETRY_ERR,
185262306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_SLER_SRR_RJT_ERR,
185362306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_RSVD6,
185462306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_SLER_RRQ_RJT_ERR,
185562306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_SLER_RRQ_RETRY_ERR,
185662306a36Sopenharmony_ci	SLI4_FC_LOCAL_REJECT_SLER_ABTS_ERR,
185762306a36Sopenharmony_ci};
185862306a36Sopenharmony_ci
185962306a36Sopenharmony_cienum sli4_async_rcqe_flags {
186062306a36Sopenharmony_ci	SLI4_RACQE_RQ_EL_INDX	= 0xfff,
186162306a36Sopenharmony_ci	SLI4_RACQE_FCFI		= 0x3f,
186262306a36Sopenharmony_ci	SLI4_RACQE_HDPL		= 0x3f,
186362306a36Sopenharmony_ci	SLI4_RACQE_RQ_ID	= 0xffc0,
186462306a36Sopenharmony_ci};
186562306a36Sopenharmony_ci
186662306a36Sopenharmony_cistruct sli4_fc_async_rcqe {
186762306a36Sopenharmony_ci	u8		rsvd0;
186862306a36Sopenharmony_ci	u8		status;
186962306a36Sopenharmony_ci	__le16		rq_elmt_indx_word;
187062306a36Sopenharmony_ci	__le32		rsvd4;
187162306a36Sopenharmony_ci	__le16		fcfi_rq_id_word;
187262306a36Sopenharmony_ci	__le16		data_placement_length;
187362306a36Sopenharmony_ci	u8		sof_byte;
187462306a36Sopenharmony_ci	u8		eof_byte;
187562306a36Sopenharmony_ci	u8		code;
187662306a36Sopenharmony_ci	u8		hdpl_byte;
187762306a36Sopenharmony_ci};
187862306a36Sopenharmony_ci
187962306a36Sopenharmony_cistruct sli4_fc_async_rcqe_v1 {
188062306a36Sopenharmony_ci	u8		rsvd0;
188162306a36Sopenharmony_ci	u8		status;
188262306a36Sopenharmony_ci	__le16		rq_elmt_indx_word;
188362306a36Sopenharmony_ci	u8		fcfi_byte;
188462306a36Sopenharmony_ci	u8		rsvd5;
188562306a36Sopenharmony_ci	__le16		rsvd6;
188662306a36Sopenharmony_ci	__le16		rq_id;
188762306a36Sopenharmony_ci	__le16		data_placement_length;
188862306a36Sopenharmony_ci	u8		sof_byte;
188962306a36Sopenharmony_ci	u8		eof_byte;
189062306a36Sopenharmony_ci	u8		code;
189162306a36Sopenharmony_ci	u8		hdpl_byte;
189262306a36Sopenharmony_ci};
189362306a36Sopenharmony_ci
189462306a36Sopenharmony_cienum sli4_fc_async_rq_status {
189562306a36Sopenharmony_ci	SLI4_FC_ASYNC_RQ_SUCCESS = 0x10,
189662306a36Sopenharmony_ci	SLI4_FC_ASYNC_RQ_BUF_LEN_EXCEEDED,
189762306a36Sopenharmony_ci	SLI4_FC_ASYNC_RQ_INSUFF_BUF_NEEDED,
189862306a36Sopenharmony_ci	SLI4_FC_ASYNC_RQ_INSUFF_BUF_FRM_DISC,
189962306a36Sopenharmony_ci	SLI4_FC_ASYNC_RQ_DMA_FAILURE,
190062306a36Sopenharmony_ci};
190162306a36Sopenharmony_ci
190262306a36Sopenharmony_ci#define SLI4_RCQE_RQ_EL_INDX	0xfff
190362306a36Sopenharmony_ci
190462306a36Sopenharmony_cistruct sli4_fc_coalescing_rcqe {
190562306a36Sopenharmony_ci	u8		rsvd0;
190662306a36Sopenharmony_ci	u8		status;
190762306a36Sopenharmony_ci	__le16		rq_elmt_indx_word;
190862306a36Sopenharmony_ci	__le32		rsvd4;
190962306a36Sopenharmony_ci	__le16		rq_id;
191062306a36Sopenharmony_ci	__le16		seq_placement_length;
191162306a36Sopenharmony_ci	__le16		rsvd14;
191262306a36Sopenharmony_ci	u8		code;
191362306a36Sopenharmony_ci	u8		vld_byte;
191462306a36Sopenharmony_ci};
191562306a36Sopenharmony_ci
191662306a36Sopenharmony_ci#define SLI4_FC_COALESCE_RQ_SUCCESS		0x10
191762306a36Sopenharmony_ci#define SLI4_FC_COALESCE_RQ_INSUFF_XRI_NEEDED	0x18
191862306a36Sopenharmony_ci
191962306a36Sopenharmony_cienum sli4_optimized_write_cmd_cqe_flags {
192062306a36Sopenharmony_ci	SLI4_OCQE_RQ_EL_INDX	= 0x7f,		/* DW0 bits 16:30 */
192162306a36Sopenharmony_ci	SLI4_OCQE_FCFI		= 0x3f,		/* DW1 bits 0:6 */
192262306a36Sopenharmony_ci	SLI4_OCQE_OOX		= 1 << 6,	/* DW1 bit 15 */
192362306a36Sopenharmony_ci	SLI4_OCQE_AGXR		= 1 << 7,	/* DW1 bit 16 */
192462306a36Sopenharmony_ci	SLI4_OCQE_HDPL		= 0x3f,		/* DW3 bits 24:29*/
192562306a36Sopenharmony_ci};
192662306a36Sopenharmony_ci
192762306a36Sopenharmony_cistruct sli4_fc_optimized_write_cmd_cqe {
192862306a36Sopenharmony_ci	u8		rsvd0;
192962306a36Sopenharmony_ci	u8		status;
193062306a36Sopenharmony_ci	__le16		w1;
193162306a36Sopenharmony_ci	u8		flags0;
193262306a36Sopenharmony_ci	u8		flags1;
193362306a36Sopenharmony_ci	__le16		xri;
193462306a36Sopenharmony_ci	__le16		rq_id;
193562306a36Sopenharmony_ci	__le16		data_placement_length;
193662306a36Sopenharmony_ci	__le16		rpi;
193762306a36Sopenharmony_ci	u8		code;
193862306a36Sopenharmony_ci	u8		hdpl_vld;
193962306a36Sopenharmony_ci};
194062306a36Sopenharmony_ci
194162306a36Sopenharmony_ci#define	SLI4_OCQE_XB		0x10
194262306a36Sopenharmony_ci
194362306a36Sopenharmony_cistruct sli4_fc_optimized_write_data_cqe {
194462306a36Sopenharmony_ci	u8		hw_status;
194562306a36Sopenharmony_ci	u8		status;
194662306a36Sopenharmony_ci	__le16		xri;
194762306a36Sopenharmony_ci	__le32		total_data_placed;
194862306a36Sopenharmony_ci	__le32		extended_status;
194962306a36Sopenharmony_ci	__le16		rsvd12;
195062306a36Sopenharmony_ci	u8		code;
195162306a36Sopenharmony_ci	u8		flags;
195262306a36Sopenharmony_ci};
195362306a36Sopenharmony_ci
195462306a36Sopenharmony_cistruct sli4_fc_xri_aborted_cqe {
195562306a36Sopenharmony_ci	u8		rsvd0;
195662306a36Sopenharmony_ci	u8		status;
195762306a36Sopenharmony_ci	__le16		rsvd2;
195862306a36Sopenharmony_ci	__le32		extended_status;
195962306a36Sopenharmony_ci	__le16		xri;
196062306a36Sopenharmony_ci	__le16		remote_xid;
196162306a36Sopenharmony_ci	__le16		rsvd12;
196262306a36Sopenharmony_ci	u8		code;
196362306a36Sopenharmony_ci	u8		flags;
196462306a36Sopenharmony_ci};
196562306a36Sopenharmony_ci
196662306a36Sopenharmony_cienum sli4_generic_ctx {
196762306a36Sopenharmony_ci	SLI4_GENERIC_CONTEXT_RPI,
196862306a36Sopenharmony_ci	SLI4_GENERIC_CONTEXT_VPI,
196962306a36Sopenharmony_ci	SLI4_GENERIC_CONTEXT_VFI,
197062306a36Sopenharmony_ci	SLI4_GENERIC_CONTEXT_FCFI,
197162306a36Sopenharmony_ci};
197262306a36Sopenharmony_ci
197362306a36Sopenharmony_ci#define SLI4_GENERIC_CLASS_CLASS_2		0x1
197462306a36Sopenharmony_ci#define SLI4_GENERIC_CLASS_CLASS_3		0x2
197562306a36Sopenharmony_ci
197662306a36Sopenharmony_ci#define SLI4_ELS_REQUEST64_DIR_WRITE		0x0
197762306a36Sopenharmony_ci#define SLI4_ELS_REQUEST64_DIR_READ		0x1
197862306a36Sopenharmony_ci
197962306a36Sopenharmony_cienum sli4_els_request {
198062306a36Sopenharmony_ci	SLI4_ELS_REQUEST64_OTHER,
198162306a36Sopenharmony_ci	SLI4_ELS_REQUEST64_LOGO,
198262306a36Sopenharmony_ci	SLI4_ELS_REQUEST64_FDISC,
198362306a36Sopenharmony_ci	SLI4_ELS_REQUEST64_FLOGIN,
198462306a36Sopenharmony_ci	SLI4_ELS_REQUEST64_PLOGI,
198562306a36Sopenharmony_ci};
198662306a36Sopenharmony_ci
198762306a36Sopenharmony_cienum sli4_els_cmd_type {
198862306a36Sopenharmony_ci	SLI4_ELS_REQUEST64_CMD_GEN		= 0x08,
198962306a36Sopenharmony_ci	SLI4_ELS_REQUEST64_CMD_NON_FABRIC	= 0x0c,
199062306a36Sopenharmony_ci	SLI4_ELS_REQUEST64_CMD_FABRIC		= 0x0d,
199162306a36Sopenharmony_ci};
199262306a36Sopenharmony_ci
199362306a36Sopenharmony_ci#define SLI_PAGE_SIZE				SZ_4K
199462306a36Sopenharmony_ci
199562306a36Sopenharmony_ci#define SLI4_BMBX_TIMEOUT_MSEC			30000
199662306a36Sopenharmony_ci#define SLI4_FW_READY_TIMEOUT_MSEC		30000
199762306a36Sopenharmony_ci
199862306a36Sopenharmony_ci#define SLI4_BMBX_DELAY_US			1000	/* 1 ms */
199962306a36Sopenharmony_ci#define SLI4_INIT_PORT_DELAY_US			10000	/* 10 ms */
200062306a36Sopenharmony_ci
200162306a36Sopenharmony_cistatic inline u32
200262306a36Sopenharmony_cisli_page_count(size_t bytes, u32 page_size)
200362306a36Sopenharmony_ci{
200462306a36Sopenharmony_ci	if (!page_size)
200562306a36Sopenharmony_ci		return 0;
200662306a36Sopenharmony_ci
200762306a36Sopenharmony_ci	return (bytes + (page_size - 1)) >> __ffs(page_size);
200862306a36Sopenharmony_ci}
200962306a36Sopenharmony_ci
201062306a36Sopenharmony_ci/*************************************************************************
201162306a36Sopenharmony_ci * SLI-4 mailbox command formats and definitions
201262306a36Sopenharmony_ci */
201362306a36Sopenharmony_ci
201462306a36Sopenharmony_cistruct sli4_mbox_command_header {
201562306a36Sopenharmony_ci	u8	resvd0;
201662306a36Sopenharmony_ci	u8	command;
201762306a36Sopenharmony_ci	__le16	status;	/* Port writes to indicate success/fail */
201862306a36Sopenharmony_ci};
201962306a36Sopenharmony_ci
202062306a36Sopenharmony_cienum sli4_mbx_cmd_value {
202162306a36Sopenharmony_ci	SLI4_MBX_CMD_CONFIG_LINK	= 0x07,
202262306a36Sopenharmony_ci	SLI4_MBX_CMD_DUMP		= 0x17,
202362306a36Sopenharmony_ci	SLI4_MBX_CMD_DOWN_LINK		= 0x06,
202462306a36Sopenharmony_ci	SLI4_MBX_CMD_INIT_LINK		= 0x05,
202562306a36Sopenharmony_ci	SLI4_MBX_CMD_INIT_VFI		= 0xa3,
202662306a36Sopenharmony_ci	SLI4_MBX_CMD_INIT_VPI		= 0xa4,
202762306a36Sopenharmony_ci	SLI4_MBX_CMD_POST_XRI		= 0xa7,
202862306a36Sopenharmony_ci	SLI4_MBX_CMD_RELEASE_XRI	= 0xac,
202962306a36Sopenharmony_ci	SLI4_MBX_CMD_READ_CONFIG	= 0x0b,
203062306a36Sopenharmony_ci	SLI4_MBX_CMD_READ_STATUS	= 0x0e,
203162306a36Sopenharmony_ci	SLI4_MBX_CMD_READ_NVPARMS	= 0x02,
203262306a36Sopenharmony_ci	SLI4_MBX_CMD_READ_REV		= 0x11,
203362306a36Sopenharmony_ci	SLI4_MBX_CMD_READ_LNK_STAT	= 0x12,
203462306a36Sopenharmony_ci	SLI4_MBX_CMD_READ_SPARM64	= 0x8d,
203562306a36Sopenharmony_ci	SLI4_MBX_CMD_READ_TOPOLOGY	= 0x95,
203662306a36Sopenharmony_ci	SLI4_MBX_CMD_REG_FCFI		= 0xa0,
203762306a36Sopenharmony_ci	SLI4_MBX_CMD_REG_FCFI_MRQ	= 0xaf,
203862306a36Sopenharmony_ci	SLI4_MBX_CMD_REG_RPI		= 0x93,
203962306a36Sopenharmony_ci	SLI4_MBX_CMD_REG_RX_RQ		= 0xa6,
204062306a36Sopenharmony_ci	SLI4_MBX_CMD_REG_VFI		= 0x9f,
204162306a36Sopenharmony_ci	SLI4_MBX_CMD_REG_VPI		= 0x96,
204262306a36Sopenharmony_ci	SLI4_MBX_CMD_RQST_FEATURES	= 0x9d,
204362306a36Sopenharmony_ci	SLI4_MBX_CMD_SLI_CONFIG		= 0x9b,
204462306a36Sopenharmony_ci	SLI4_MBX_CMD_UNREG_FCFI		= 0xa2,
204562306a36Sopenharmony_ci	SLI4_MBX_CMD_UNREG_RPI		= 0x14,
204662306a36Sopenharmony_ci	SLI4_MBX_CMD_UNREG_VFI		= 0xa1,
204762306a36Sopenharmony_ci	SLI4_MBX_CMD_UNREG_VPI		= 0x97,
204862306a36Sopenharmony_ci	SLI4_MBX_CMD_WRITE_NVPARMS	= 0x03,
204962306a36Sopenharmony_ci	SLI4_MBX_CMD_CFG_AUTO_XFER_RDY	= 0xad,
205062306a36Sopenharmony_ci};
205162306a36Sopenharmony_ci
205262306a36Sopenharmony_cienum sli4_mbx_status {
205362306a36Sopenharmony_ci	SLI4_MBX_STATUS_SUCCESS		= 0x0000,
205462306a36Sopenharmony_ci	SLI4_MBX_STATUS_FAILURE		= 0x0001,
205562306a36Sopenharmony_ci	SLI4_MBX_STATUS_RPI_NOT_REG	= 0x1400,
205662306a36Sopenharmony_ci};
205762306a36Sopenharmony_ci
205862306a36Sopenharmony_ci/* CONFIG_LINK - configure link-oriented parameters,
205962306a36Sopenharmony_ci * such as default N_Port_ID address and various timers
206062306a36Sopenharmony_ci */
206162306a36Sopenharmony_cienum sli4_cmd_config_link_flags {
206262306a36Sopenharmony_ci	SLI4_CFG_LINK_BBSCN = 0xf00,
206362306a36Sopenharmony_ci	SLI4_CFG_LINK_CSCN  = 0x1000,
206462306a36Sopenharmony_ci};
206562306a36Sopenharmony_ci
206662306a36Sopenharmony_cistruct sli4_cmd_config_link {
206762306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
206862306a36Sopenharmony_ci	u8		maxbbc;
206962306a36Sopenharmony_ci	u8		rsvd5;
207062306a36Sopenharmony_ci	u8		rsvd6;
207162306a36Sopenharmony_ci	u8		rsvd7;
207262306a36Sopenharmony_ci	u8		alpa;
207362306a36Sopenharmony_ci	__le16		n_port_id;
207462306a36Sopenharmony_ci	u8		rsvd11;
207562306a36Sopenharmony_ci	__le32		rsvd12;
207662306a36Sopenharmony_ci	__le32		e_d_tov;
207762306a36Sopenharmony_ci	__le32		lp_tov;
207862306a36Sopenharmony_ci	__le32		r_a_tov;
207962306a36Sopenharmony_ci	__le32		r_t_tov;
208062306a36Sopenharmony_ci	__le32		al_tov;
208162306a36Sopenharmony_ci	__le32		rsvd36;
208262306a36Sopenharmony_ci	__le32		bbscn_dword;
208362306a36Sopenharmony_ci};
208462306a36Sopenharmony_ci
208562306a36Sopenharmony_ci#define SLI4_DUMP4_TYPE		0xf
208662306a36Sopenharmony_ci
208762306a36Sopenharmony_ci#define SLI4_WKI_TAG_SAT_TEM	0x1040
208862306a36Sopenharmony_ci
208962306a36Sopenharmony_cistruct sli4_cmd_dump4 {
209062306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
209162306a36Sopenharmony_ci	__le32		type_dword;
209262306a36Sopenharmony_ci	__le16		wki_selection;
209362306a36Sopenharmony_ci	__le16		rsvd10;
209462306a36Sopenharmony_ci	__le32		rsvd12;
209562306a36Sopenharmony_ci	__le32		returned_byte_cnt;
209662306a36Sopenharmony_ci	__le32		resp_data[59];
209762306a36Sopenharmony_ci};
209862306a36Sopenharmony_ci
209962306a36Sopenharmony_ci/* INIT_LINK - initialize the link for a FC port */
210062306a36Sopenharmony_cienum sli4_init_link_flags {
210162306a36Sopenharmony_ci	SLI4_INIT_LINK_F_LOOPBACK	= 1 << 0,
210262306a36Sopenharmony_ci
210362306a36Sopenharmony_ci	SLI4_INIT_LINK_F_P2P_ONLY	= 1 << 1,
210462306a36Sopenharmony_ci	SLI4_INIT_LINK_F_FCAL_ONLY	= 2 << 1,
210562306a36Sopenharmony_ci	SLI4_INIT_LINK_F_FCAL_FAIL_OVER	= 0 << 1,
210662306a36Sopenharmony_ci	SLI4_INIT_LINK_F_P2P_FAIL_OVER	= 1 << 1,
210762306a36Sopenharmony_ci
210862306a36Sopenharmony_ci	SLI4_INIT_LINK_F_UNFAIR		= 1 << 6,
210962306a36Sopenharmony_ci	SLI4_INIT_LINK_F_NO_LIRP	= 1 << 7,
211062306a36Sopenharmony_ci	SLI4_INIT_LINK_F_LOOP_VALID_CHK	= 1 << 8,
211162306a36Sopenharmony_ci	SLI4_INIT_LINK_F_NO_LISA	= 1 << 9,
211262306a36Sopenharmony_ci	SLI4_INIT_LINK_F_FAIL_OVER	= 1 << 10,
211362306a36Sopenharmony_ci	SLI4_INIT_LINK_F_FIXED_SPEED	= 1 << 11,
211462306a36Sopenharmony_ci	SLI4_INIT_LINK_F_PICK_HI_ALPA	= 1 << 15,
211562306a36Sopenharmony_ci
211662306a36Sopenharmony_ci};
211762306a36Sopenharmony_ci
211862306a36Sopenharmony_cienum sli4_fc_link_speed {
211962306a36Sopenharmony_ci	SLI4_LINK_SPEED_1G = 1,
212062306a36Sopenharmony_ci	SLI4_LINK_SPEED_2G,
212162306a36Sopenharmony_ci	SLI4_LINK_SPEED_AUTO_1_2,
212262306a36Sopenharmony_ci	SLI4_LINK_SPEED_4G,
212362306a36Sopenharmony_ci	SLI4_LINK_SPEED_AUTO_4_1,
212462306a36Sopenharmony_ci	SLI4_LINK_SPEED_AUTO_4_2,
212562306a36Sopenharmony_ci	SLI4_LINK_SPEED_AUTO_4_2_1,
212662306a36Sopenharmony_ci	SLI4_LINK_SPEED_8G,
212762306a36Sopenharmony_ci	SLI4_LINK_SPEED_AUTO_8_1,
212862306a36Sopenharmony_ci	SLI4_LINK_SPEED_AUTO_8_2,
212962306a36Sopenharmony_ci	SLI4_LINK_SPEED_AUTO_8_2_1,
213062306a36Sopenharmony_ci	SLI4_LINK_SPEED_AUTO_8_4,
213162306a36Sopenharmony_ci	SLI4_LINK_SPEED_AUTO_8_4_1,
213262306a36Sopenharmony_ci	SLI4_LINK_SPEED_AUTO_8_4_2,
213362306a36Sopenharmony_ci	SLI4_LINK_SPEED_10G,
213462306a36Sopenharmony_ci	SLI4_LINK_SPEED_16G,
213562306a36Sopenharmony_ci	SLI4_LINK_SPEED_AUTO_16_8_4,
213662306a36Sopenharmony_ci	SLI4_LINK_SPEED_AUTO_16_8,
213762306a36Sopenharmony_ci	SLI4_LINK_SPEED_32G,
213862306a36Sopenharmony_ci	SLI4_LINK_SPEED_AUTO_32_16_8,
213962306a36Sopenharmony_ci	SLI4_LINK_SPEED_AUTO_32_16,
214062306a36Sopenharmony_ci	SLI4_LINK_SPEED_64G,
214162306a36Sopenharmony_ci	SLI4_LINK_SPEED_AUTO_64_32_16,
214262306a36Sopenharmony_ci	SLI4_LINK_SPEED_AUTO_64_32,
214362306a36Sopenharmony_ci	SLI4_LINK_SPEED_128G,
214462306a36Sopenharmony_ci	SLI4_LINK_SPEED_AUTO_128_64_32,
214562306a36Sopenharmony_ci	SLI4_LINK_SPEED_AUTO_128_64,
214662306a36Sopenharmony_ci};
214762306a36Sopenharmony_ci
214862306a36Sopenharmony_cistruct sli4_cmd_init_link {
214962306a36Sopenharmony_ci	struct sli4_mbox_command_header       hdr;
215062306a36Sopenharmony_ci	__le32	sel_reset_al_pa_dword;
215162306a36Sopenharmony_ci	__le32	flags0;
215262306a36Sopenharmony_ci	__le32	link_speed_sel_code;
215362306a36Sopenharmony_ci};
215462306a36Sopenharmony_ci
215562306a36Sopenharmony_ci/* INIT_VFI - initialize the VFI resource */
215662306a36Sopenharmony_cienum sli4_init_vfi_flags {
215762306a36Sopenharmony_ci	SLI4_INIT_VFI_FLAG_VP	= 0x1000,
215862306a36Sopenharmony_ci	SLI4_INIT_VFI_FLAG_VF	= 0x2000,
215962306a36Sopenharmony_ci	SLI4_INIT_VFI_FLAG_VT	= 0x4000,
216062306a36Sopenharmony_ci	SLI4_INIT_VFI_FLAG_VR	= 0x8000,
216162306a36Sopenharmony_ci
216262306a36Sopenharmony_ci	SLI4_INIT_VFI_VFID	= 0x1fff,
216362306a36Sopenharmony_ci	SLI4_INIT_VFI_PRI	= 0xe000,
216462306a36Sopenharmony_ci
216562306a36Sopenharmony_ci	SLI4_INIT_VFI_HOP_COUNT = 0xff000000,
216662306a36Sopenharmony_ci};
216762306a36Sopenharmony_ci
216862306a36Sopenharmony_cistruct sli4_cmd_init_vfi {
216962306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
217062306a36Sopenharmony_ci	__le16		vfi;
217162306a36Sopenharmony_ci	__le16		flags0_word;
217262306a36Sopenharmony_ci	__le16		fcfi;
217362306a36Sopenharmony_ci	__le16		vpi;
217462306a36Sopenharmony_ci	__le32		vf_id_pri_dword;
217562306a36Sopenharmony_ci	__le32		hop_cnt_dword;
217662306a36Sopenharmony_ci};
217762306a36Sopenharmony_ci
217862306a36Sopenharmony_ci/* INIT_VPI - initialize the VPI resource */
217962306a36Sopenharmony_cistruct sli4_cmd_init_vpi {
218062306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
218162306a36Sopenharmony_ci	__le16		vpi;
218262306a36Sopenharmony_ci	__le16		vfi;
218362306a36Sopenharmony_ci};
218462306a36Sopenharmony_ci
218562306a36Sopenharmony_ci/* POST_XRI - post XRI resources to the SLI Port */
218662306a36Sopenharmony_cienum sli4_post_xri_flags {
218762306a36Sopenharmony_ci	SLI4_POST_XRI_COUNT	= 0xfff,
218862306a36Sopenharmony_ci	SLI4_POST_XRI_FLAG_ENX	= 0x1000,
218962306a36Sopenharmony_ci	SLI4_POST_XRI_FLAG_DL	= 0x2000,
219062306a36Sopenharmony_ci	SLI4_POST_XRI_FLAG_DI	= 0x4000,
219162306a36Sopenharmony_ci	SLI4_POST_XRI_FLAG_VAL	= 0x8000,
219262306a36Sopenharmony_ci};
219362306a36Sopenharmony_ci
219462306a36Sopenharmony_cistruct sli4_cmd_post_xri {
219562306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
219662306a36Sopenharmony_ci	__le16		xri_base;
219762306a36Sopenharmony_ci	__le16		xri_count_flags;
219862306a36Sopenharmony_ci};
219962306a36Sopenharmony_ci
220062306a36Sopenharmony_ci/* RELEASE_XRI - Release XRI resources from the SLI Port */
220162306a36Sopenharmony_cienum sli4_release_xri_flags {
220262306a36Sopenharmony_ci	SLI4_RELEASE_XRI_REL_XRI_CNT	= 0x1f,
220362306a36Sopenharmony_ci	SLI4_RELEASE_XRI_COUNT		= 0x1f,
220462306a36Sopenharmony_ci};
220562306a36Sopenharmony_ci
220662306a36Sopenharmony_cistruct sli4_cmd_release_xri {
220762306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
220862306a36Sopenharmony_ci	__le16		rel_xri_count_word;
220962306a36Sopenharmony_ci	__le16		xri_count_word;
221062306a36Sopenharmony_ci
221162306a36Sopenharmony_ci	struct {
221262306a36Sopenharmony_ci		__le16	xri_tag0;
221362306a36Sopenharmony_ci		__le16	xri_tag1;
221462306a36Sopenharmony_ci	} xri_tbl[62];
221562306a36Sopenharmony_ci};
221662306a36Sopenharmony_ci
221762306a36Sopenharmony_ci/* READ_CONFIG - read SLI port configuration parameters */
221862306a36Sopenharmony_cistruct sli4_cmd_read_config {
221962306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
222062306a36Sopenharmony_ci};
222162306a36Sopenharmony_ci
222262306a36Sopenharmony_cienum sli4_read_cfg_resp_flags {
222362306a36Sopenharmony_ci	SLI4_READ_CFG_RESP_RESOURCE_EXT = 0x80000000,	/* DW1 */
222462306a36Sopenharmony_ci	SLI4_READ_CFG_RESP_TOPOLOGY	= 0xff000000,	/* DW2 */
222562306a36Sopenharmony_ci};
222662306a36Sopenharmony_ci
222762306a36Sopenharmony_cienum sli4_read_cfg_topo {
222862306a36Sopenharmony_ci	SLI4_READ_CFG_TOPO_FC		= 0x1,	/* FC topology unknown */
222962306a36Sopenharmony_ci	SLI4_READ_CFG_TOPO_NON_FC_AL	= 0x2,	/* FC point-to-point or fabric */
223062306a36Sopenharmony_ci	SLI4_READ_CFG_TOPO_FC_AL	= 0x3,	/* FC-AL topology */
223162306a36Sopenharmony_ci};
223262306a36Sopenharmony_ci
223362306a36Sopenharmony_ci/* Link Module Type */
223462306a36Sopenharmony_cienum sli4_read_cfg_lmt {
223562306a36Sopenharmony_ci	SLI4_LINK_MODULE_TYPE_1GB	= 0x0004,
223662306a36Sopenharmony_ci	SLI4_LINK_MODULE_TYPE_2GB	= 0x0008,
223762306a36Sopenharmony_ci	SLI4_LINK_MODULE_TYPE_4GB	= 0x0040,
223862306a36Sopenharmony_ci	SLI4_LINK_MODULE_TYPE_8GB	= 0x0080,
223962306a36Sopenharmony_ci	SLI4_LINK_MODULE_TYPE_16GB	= 0x0200,
224062306a36Sopenharmony_ci	SLI4_LINK_MODULE_TYPE_32GB	= 0x0400,
224162306a36Sopenharmony_ci	SLI4_LINK_MODULE_TYPE_64GB	= 0x0800,
224262306a36Sopenharmony_ci	SLI4_LINK_MODULE_TYPE_128GB	= 0x1000,
224362306a36Sopenharmony_ci};
224462306a36Sopenharmony_ci
224562306a36Sopenharmony_cistruct sli4_rsp_read_config {
224662306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
224762306a36Sopenharmony_ci	__le32		ext_dword;
224862306a36Sopenharmony_ci	__le32		topology_dword;
224962306a36Sopenharmony_ci	__le32		resvd8;
225062306a36Sopenharmony_ci	__le16		e_d_tov;
225162306a36Sopenharmony_ci	__le16		resvd14;
225262306a36Sopenharmony_ci	__le32		resvd16;
225362306a36Sopenharmony_ci	__le16		r_a_tov;
225462306a36Sopenharmony_ci	__le16		resvd22;
225562306a36Sopenharmony_ci	__le32		resvd24;
225662306a36Sopenharmony_ci	__le32		resvd28;
225762306a36Sopenharmony_ci	__le16		lmt;
225862306a36Sopenharmony_ci	__le16		resvd34;
225962306a36Sopenharmony_ci	__le32		resvd36;
226062306a36Sopenharmony_ci	__le32		resvd40;
226162306a36Sopenharmony_ci	__le16		xri_base;
226262306a36Sopenharmony_ci	__le16		xri_count;
226362306a36Sopenharmony_ci	__le16		rpi_base;
226462306a36Sopenharmony_ci	__le16		rpi_count;
226562306a36Sopenharmony_ci	__le16		vpi_base;
226662306a36Sopenharmony_ci	__le16		vpi_count;
226762306a36Sopenharmony_ci	__le16		vfi_base;
226862306a36Sopenharmony_ci	__le16		vfi_count;
226962306a36Sopenharmony_ci	__le16		resvd60;
227062306a36Sopenharmony_ci	__le16		fcfi_count;
227162306a36Sopenharmony_ci	__le16		rq_count;
227262306a36Sopenharmony_ci	__le16		eq_count;
227362306a36Sopenharmony_ci	__le16		wq_count;
227462306a36Sopenharmony_ci	__le16		cq_count;
227562306a36Sopenharmony_ci	__le32		pad[45];
227662306a36Sopenharmony_ci};
227762306a36Sopenharmony_ci
227862306a36Sopenharmony_ci/* READ_NVPARMS - read SLI port configuration parameters */
227962306a36Sopenharmony_cienum sli4_read_nvparms_flags {
228062306a36Sopenharmony_ci	SLI4_READ_NVPARAMS_HARD_ALPA	  = 0xff,
228162306a36Sopenharmony_ci	SLI4_READ_NVPARAMS_PREFERRED_D_ID = 0xffffff00,
228262306a36Sopenharmony_ci};
228362306a36Sopenharmony_ci
228462306a36Sopenharmony_cistruct sli4_cmd_read_nvparms {
228562306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
228662306a36Sopenharmony_ci	__le32		resvd0;
228762306a36Sopenharmony_ci	__le32		resvd4;
228862306a36Sopenharmony_ci	__le32		resvd8;
228962306a36Sopenharmony_ci	__le32		resvd12;
229062306a36Sopenharmony_ci	u8		wwpn[8];
229162306a36Sopenharmony_ci	u8		wwnn[8];
229262306a36Sopenharmony_ci	__le32		hard_alpa_d_id;
229362306a36Sopenharmony_ci};
229462306a36Sopenharmony_ci
229562306a36Sopenharmony_ci/* WRITE_NVPARMS - write SLI port configuration parameters */
229662306a36Sopenharmony_cistruct sli4_cmd_write_nvparms {
229762306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
229862306a36Sopenharmony_ci	__le32		resvd0;
229962306a36Sopenharmony_ci	__le32		resvd4;
230062306a36Sopenharmony_ci	__le32		resvd8;
230162306a36Sopenharmony_ci	__le32		resvd12;
230262306a36Sopenharmony_ci	u8		wwpn[8];
230362306a36Sopenharmony_ci	u8		wwnn[8];
230462306a36Sopenharmony_ci	__le32		hard_alpa_d_id;
230562306a36Sopenharmony_ci};
230662306a36Sopenharmony_ci
230762306a36Sopenharmony_ci/* READ_REV - read the Port revision levels */
230862306a36Sopenharmony_cienum {
230962306a36Sopenharmony_ci	SLI4_READ_REV_FLAG_SLI_LEVEL	= 0xf,
231062306a36Sopenharmony_ci	SLI4_READ_REV_FLAG_FCOEM	= 0x10,
231162306a36Sopenharmony_ci	SLI4_READ_REV_FLAG_CEEV		= 0x60,
231262306a36Sopenharmony_ci	SLI4_READ_REV_FLAG_VPD		= 0x2000,
231362306a36Sopenharmony_ci
231462306a36Sopenharmony_ci	SLI4_READ_REV_AVAILABLE_LENGTH	= 0xffffff,
231562306a36Sopenharmony_ci};
231662306a36Sopenharmony_ci
231762306a36Sopenharmony_cistruct sli4_cmd_read_rev {
231862306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
231962306a36Sopenharmony_ci	__le16			resvd0;
232062306a36Sopenharmony_ci	__le16			flags0_word;
232162306a36Sopenharmony_ci	__le32			first_hw_rev;
232262306a36Sopenharmony_ci	__le32			second_hw_rev;
232362306a36Sopenharmony_ci	__le32			resvd12;
232462306a36Sopenharmony_ci	__le32			third_hw_rev;
232562306a36Sopenharmony_ci	u8			fc_ph_low;
232662306a36Sopenharmony_ci	u8			fc_ph_high;
232762306a36Sopenharmony_ci	u8			feature_level_low;
232862306a36Sopenharmony_ci	u8			feature_level_high;
232962306a36Sopenharmony_ci	__le32			resvd24;
233062306a36Sopenharmony_ci	__le32			first_fw_id;
233162306a36Sopenharmony_ci	u8			first_fw_name[16];
233262306a36Sopenharmony_ci	__le32			second_fw_id;
233362306a36Sopenharmony_ci	u8			second_fw_name[16];
233462306a36Sopenharmony_ci	__le32			rsvd18[30];
233562306a36Sopenharmony_ci	__le32			available_length_dword;
233662306a36Sopenharmony_ci	struct sli4_dmaaddr	hostbuf;
233762306a36Sopenharmony_ci	__le32			returned_vpd_length;
233862306a36Sopenharmony_ci	__le32			actual_vpd_length;
233962306a36Sopenharmony_ci};
234062306a36Sopenharmony_ci
234162306a36Sopenharmony_ci/* READ_SPARM64 - read the Port service parameters */
234262306a36Sopenharmony_ci#define SLI4_READ_SPARM64_WWPN_OFFSET	(4 * sizeof(u32))
234362306a36Sopenharmony_ci#define SLI4_READ_SPARM64_WWNN_OFFSET	(6 * sizeof(u32))
234462306a36Sopenharmony_ci
234562306a36Sopenharmony_cistruct sli4_cmd_read_sparm64 {
234662306a36Sopenharmony_ci	struct sli4_mbox_command_header hdr;
234762306a36Sopenharmony_ci	__le32			resvd0;
234862306a36Sopenharmony_ci	__le32			resvd4;
234962306a36Sopenharmony_ci	struct sli4_bde		bde_64;
235062306a36Sopenharmony_ci	__le16			vpi;
235162306a36Sopenharmony_ci	__le16			resvd22;
235262306a36Sopenharmony_ci	__le16			port_name_start;
235362306a36Sopenharmony_ci	__le16			port_name_len;
235462306a36Sopenharmony_ci	__le16			node_name_start;
235562306a36Sopenharmony_ci	__le16			node_name_len;
235662306a36Sopenharmony_ci};
235762306a36Sopenharmony_ci
235862306a36Sopenharmony_ci/* READ_TOPOLOGY - read the link event information */
235962306a36Sopenharmony_cienum sli4_read_topo_e {
236062306a36Sopenharmony_ci	SLI4_READTOPO_ATTEN_TYPE	= 0xff,
236162306a36Sopenharmony_ci	SLI4_READTOPO_FLAG_IL		= 0x100,
236262306a36Sopenharmony_ci	SLI4_READTOPO_FLAG_PB_RECVD	= 0x200,
236362306a36Sopenharmony_ci
236462306a36Sopenharmony_ci	SLI4_READTOPO_LINKSTATE_RECV	= 0x3,
236562306a36Sopenharmony_ci	SLI4_READTOPO_LINKSTATE_TRANS	= 0xc,
236662306a36Sopenharmony_ci	SLI4_READTOPO_LINKSTATE_MACHINE	= 0xf0,
236762306a36Sopenharmony_ci	SLI4_READTOPO_LINKSTATE_SPEED	= 0xff00,
236862306a36Sopenharmony_ci	SLI4_READTOPO_LINKSTATE_TF	= 0x40000000,
236962306a36Sopenharmony_ci	SLI4_READTOPO_LINKSTATE_LU	= 0x80000000,
237062306a36Sopenharmony_ci
237162306a36Sopenharmony_ci	SLI4_READTOPO_SCN_BBSCN		= 0xf,
237262306a36Sopenharmony_ci	SLI4_READTOPO_SCN_CBBSCN	= 0xf0,
237362306a36Sopenharmony_ci
237462306a36Sopenharmony_ci	SLI4_READTOPO_R_T_TOV		= 0x1ff,
237562306a36Sopenharmony_ci	SLI4_READTOPO_AL_TOV		= 0xf000,
237662306a36Sopenharmony_ci
237762306a36Sopenharmony_ci	SLI4_READTOPO_PB_FLAG		= 0x80,
237862306a36Sopenharmony_ci
237962306a36Sopenharmony_ci	SLI4_READTOPO_INIT_N_PORTID	= 0xffffff,
238062306a36Sopenharmony_ci};
238162306a36Sopenharmony_ci
238262306a36Sopenharmony_ci#define SLI4_MIN_LOOP_MAP_BYTES	128
238362306a36Sopenharmony_ci
238462306a36Sopenharmony_cistruct sli4_cmd_read_topology {
238562306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
238662306a36Sopenharmony_ci	__le32			event_tag;
238762306a36Sopenharmony_ci	__le32			dw2_attentype;
238862306a36Sopenharmony_ci	u8			topology;
238962306a36Sopenharmony_ci	u8			lip_type;
239062306a36Sopenharmony_ci	u8			lip_al_ps;
239162306a36Sopenharmony_ci	u8			al_pa_granted;
239262306a36Sopenharmony_ci	struct sli4_bde		bde_loop_map;
239362306a36Sopenharmony_ci	__le32			linkdown_state;
239462306a36Sopenharmony_ci	__le32			currlink_state;
239562306a36Sopenharmony_ci	u8			max_bbc;
239662306a36Sopenharmony_ci	u8			init_bbc;
239762306a36Sopenharmony_ci	u8			scn_flags;
239862306a36Sopenharmony_ci	u8			rsvd39;
239962306a36Sopenharmony_ci	__le16			dw10w0_al_rt_tov;
240062306a36Sopenharmony_ci	__le16			lp_tov;
240162306a36Sopenharmony_ci	u8			acquired_al_pa;
240262306a36Sopenharmony_ci	u8			pb_flags;
240362306a36Sopenharmony_ci	__le16			specified_al_pa;
240462306a36Sopenharmony_ci	__le32			dw12_init_n_port_id;
240562306a36Sopenharmony_ci};
240662306a36Sopenharmony_ci
240762306a36Sopenharmony_cienum sli4_read_topo_link {
240862306a36Sopenharmony_ci	SLI4_READ_TOPOLOGY_LINK_UP	= 0x1,
240962306a36Sopenharmony_ci	SLI4_READ_TOPOLOGY_LINK_DOWN,
241062306a36Sopenharmony_ci	SLI4_READ_TOPOLOGY_LINK_NO_ALPA,
241162306a36Sopenharmony_ci};
241262306a36Sopenharmony_ci
241362306a36Sopenharmony_cienum sli4_read_topo {
241462306a36Sopenharmony_ci	SLI4_READ_TOPO_UNKNOWN		= 0x0,
241562306a36Sopenharmony_ci	SLI4_READ_TOPO_NON_FC_AL,
241662306a36Sopenharmony_ci	SLI4_READ_TOPO_FC_AL,
241762306a36Sopenharmony_ci};
241862306a36Sopenharmony_ci
241962306a36Sopenharmony_cienum sli4_read_topo_speed {
242062306a36Sopenharmony_ci	SLI4_READ_TOPOLOGY_SPEED_NONE	= 0x00,
242162306a36Sopenharmony_ci	SLI4_READ_TOPOLOGY_SPEED_1G	= 0x04,
242262306a36Sopenharmony_ci	SLI4_READ_TOPOLOGY_SPEED_2G	= 0x08,
242362306a36Sopenharmony_ci	SLI4_READ_TOPOLOGY_SPEED_4G	= 0x10,
242462306a36Sopenharmony_ci	SLI4_READ_TOPOLOGY_SPEED_8G	= 0x20,
242562306a36Sopenharmony_ci	SLI4_READ_TOPOLOGY_SPEED_10G	= 0x40,
242662306a36Sopenharmony_ci	SLI4_READ_TOPOLOGY_SPEED_16G	= 0x80,
242762306a36Sopenharmony_ci	SLI4_READ_TOPOLOGY_SPEED_32G	= 0x90,
242862306a36Sopenharmony_ci	SLI4_READ_TOPOLOGY_SPEED_64G	= 0xa0,
242962306a36Sopenharmony_ci	SLI4_READ_TOPOLOGY_SPEED_128G	= 0xb0,
243062306a36Sopenharmony_ci};
243162306a36Sopenharmony_ci
243262306a36Sopenharmony_ci/* REG_FCFI - activate a FC Forwarder */
243362306a36Sopenharmony_cistruct sli4_cmd_reg_fcfi_rq_cfg {
243462306a36Sopenharmony_ci	u8	r_ctl_mask;
243562306a36Sopenharmony_ci	u8	r_ctl_match;
243662306a36Sopenharmony_ci	u8	type_mask;
243762306a36Sopenharmony_ci	u8	type_match;
243862306a36Sopenharmony_ci};
243962306a36Sopenharmony_ci
244062306a36Sopenharmony_cienum sli4_regfcfi_tag {
244162306a36Sopenharmony_ci	SLI4_REGFCFI_VLAN_TAG		= 0xfff,
244262306a36Sopenharmony_ci	SLI4_REGFCFI_VLANTAG_VALID	= 0x1000,
244362306a36Sopenharmony_ci};
244462306a36Sopenharmony_ci
244562306a36Sopenharmony_ci#define SLI4_CMD_REG_FCFI_NUM_RQ_CFG	4
244662306a36Sopenharmony_cistruct sli4_cmd_reg_fcfi {
244762306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
244862306a36Sopenharmony_ci	__le16		fcf_index;
244962306a36Sopenharmony_ci	__le16		fcfi;
245062306a36Sopenharmony_ci	__le16		rqid1;
245162306a36Sopenharmony_ci	__le16		rqid0;
245262306a36Sopenharmony_ci	__le16		rqid3;
245362306a36Sopenharmony_ci	__le16		rqid2;
245462306a36Sopenharmony_ci	struct sli4_cmd_reg_fcfi_rq_cfg
245562306a36Sopenharmony_ci			rq_cfg[SLI4_CMD_REG_FCFI_NUM_RQ_CFG];
245662306a36Sopenharmony_ci	__le32		dw8_vlan;
245762306a36Sopenharmony_ci};
245862306a36Sopenharmony_ci
245962306a36Sopenharmony_ci#define SLI4_CMD_REG_FCFI_MRQ_NUM_RQ_CFG	4
246062306a36Sopenharmony_ci#define SLI4_CMD_REG_FCFI_MRQ_MAX_NUM_RQ	32
246162306a36Sopenharmony_ci#define SLI4_CMD_REG_FCFI_SET_FCFI_MODE		0
246262306a36Sopenharmony_ci#define SLI4_CMD_REG_FCFI_SET_MRQ_MODE		1
246362306a36Sopenharmony_ci
246462306a36Sopenharmony_cienum sli4_reg_fcfi_mrq {
246562306a36Sopenharmony_ci	SLI4_REGFCFI_MRQ_VLAN_TAG	= 0xfff,
246662306a36Sopenharmony_ci	SLI4_REGFCFI_MRQ_VLANTAG_VALID	= 0x1000,
246762306a36Sopenharmony_ci	SLI4_REGFCFI_MRQ_MODE		= 0x2000,
246862306a36Sopenharmony_ci
246962306a36Sopenharmony_ci	SLI4_REGFCFI_MRQ_MASK_NUM_PAIRS	= 0xff,
247062306a36Sopenharmony_ci	SLI4_REGFCFI_MRQ_FILTER_BITMASK = 0xf00,
247162306a36Sopenharmony_ci	SLI4_REGFCFI_MRQ_RQ_SEL_POLICY	= 0xf000,
247262306a36Sopenharmony_ci};
247362306a36Sopenharmony_ci
247462306a36Sopenharmony_cistruct sli4_cmd_reg_fcfi_mrq {
247562306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
247662306a36Sopenharmony_ci	__le16		fcf_index;
247762306a36Sopenharmony_ci	__le16		fcfi;
247862306a36Sopenharmony_ci	__le16		rqid1;
247962306a36Sopenharmony_ci	__le16		rqid0;
248062306a36Sopenharmony_ci	__le16		rqid3;
248162306a36Sopenharmony_ci	__le16		rqid2;
248262306a36Sopenharmony_ci	struct sli4_cmd_reg_fcfi_rq_cfg
248362306a36Sopenharmony_ci			rq_cfg[SLI4_CMD_REG_FCFI_MRQ_NUM_RQ_CFG];
248462306a36Sopenharmony_ci	__le32		dw8_vlan;
248562306a36Sopenharmony_ci	__le32		dw9_mrqflags;
248662306a36Sopenharmony_ci};
248762306a36Sopenharmony_ci
248862306a36Sopenharmony_cistruct sli4_cmd_rq_cfg {
248962306a36Sopenharmony_ci	__le16	rq_id;
249062306a36Sopenharmony_ci	u8	r_ctl_mask;
249162306a36Sopenharmony_ci	u8	r_ctl_match;
249262306a36Sopenharmony_ci	u8	type_mask;
249362306a36Sopenharmony_ci	u8	type_match;
249462306a36Sopenharmony_ci};
249562306a36Sopenharmony_ci
249662306a36Sopenharmony_ci/* REG_RPI - register a Remote Port Indicator */
249762306a36Sopenharmony_cienum sli4_reg_rpi {
249862306a36Sopenharmony_ci	SLI4_REGRPI_REMOTE_N_PORTID	= 0xffffff,	/* DW2 */
249962306a36Sopenharmony_ci	SLI4_REGRPI_UPD			= 0x1000000,
250062306a36Sopenharmony_ci	SLI4_REGRPI_ETOW		= 0x8000000,
250162306a36Sopenharmony_ci	SLI4_REGRPI_TERP		= 0x20000000,
250262306a36Sopenharmony_ci	SLI4_REGRPI_CI			= 0x80000000,
250362306a36Sopenharmony_ci};
250462306a36Sopenharmony_ci
250562306a36Sopenharmony_cistruct sli4_cmd_reg_rpi {
250662306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
250762306a36Sopenharmony_ci	__le16			rpi;
250862306a36Sopenharmony_ci	__le16			rsvd2;
250962306a36Sopenharmony_ci	__le32			dw2_rportid_flags;
251062306a36Sopenharmony_ci	struct sli4_bde		bde_64;
251162306a36Sopenharmony_ci	__le16			vpi;
251262306a36Sopenharmony_ci	__le16			rsvd26;
251362306a36Sopenharmony_ci};
251462306a36Sopenharmony_ci
251562306a36Sopenharmony_ci#define SLI4_REG_RPI_BUF_LEN		0x70
251662306a36Sopenharmony_ci
251762306a36Sopenharmony_ci/* REG_VFI - register a Virtual Fabric Indicator */
251862306a36Sopenharmony_cienum sli_reg_vfi {
251962306a36Sopenharmony_ci	SLI4_REGVFI_VP			= 0x1000,	/* DW1 */
252062306a36Sopenharmony_ci	SLI4_REGVFI_UPD			= 0x2000,
252162306a36Sopenharmony_ci
252262306a36Sopenharmony_ci	SLI4_REGVFI_LOCAL_N_PORTID	= 0xffffff,	/* DW10 */
252362306a36Sopenharmony_ci};
252462306a36Sopenharmony_ci
252562306a36Sopenharmony_cistruct sli4_cmd_reg_vfi {
252662306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
252762306a36Sopenharmony_ci	__le16			vfi;
252862306a36Sopenharmony_ci	__le16			dw0w1_flags;
252962306a36Sopenharmony_ci	__le16			fcfi;
253062306a36Sopenharmony_ci	__le16			vpi;
253162306a36Sopenharmony_ci	u8			wwpn[8];
253262306a36Sopenharmony_ci	struct sli4_bde		sparm;
253362306a36Sopenharmony_ci	__le32			e_d_tov;
253462306a36Sopenharmony_ci	__le32			r_a_tov;
253562306a36Sopenharmony_ci	__le32			dw10_lportid_flags;
253662306a36Sopenharmony_ci};
253762306a36Sopenharmony_ci
253862306a36Sopenharmony_ci/* REG_VPI - register a Virtual Port Indicator */
253962306a36Sopenharmony_cienum sli4_reg_vpi {
254062306a36Sopenharmony_ci	SLI4_REGVPI_LOCAL_N_PORTID	= 0xffffff,
254162306a36Sopenharmony_ci	SLI4_REGVPI_UPD			= 0x1000000,
254262306a36Sopenharmony_ci};
254362306a36Sopenharmony_ci
254462306a36Sopenharmony_cistruct sli4_cmd_reg_vpi {
254562306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
254662306a36Sopenharmony_ci	__le32		rsvd0;
254762306a36Sopenharmony_ci	__le32		dw2_lportid_flags;
254862306a36Sopenharmony_ci	u8		wwpn[8];
254962306a36Sopenharmony_ci	__le32		rsvd12;
255062306a36Sopenharmony_ci	__le16		vpi;
255162306a36Sopenharmony_ci	__le16		vfi;
255262306a36Sopenharmony_ci};
255362306a36Sopenharmony_ci
255462306a36Sopenharmony_ci/* REQUEST_FEATURES - request / query SLI features */
255562306a36Sopenharmony_cienum sli4_req_features_flags {
255662306a36Sopenharmony_ci	SLI4_REQFEAT_QRY	= 0x1,		/* Dw1 */
255762306a36Sopenharmony_ci
255862306a36Sopenharmony_ci	SLI4_REQFEAT_IAAB	= 1 << 0,	/* DW2 & DW3 */
255962306a36Sopenharmony_ci	SLI4_REQFEAT_NPIV	= 1 << 1,
256062306a36Sopenharmony_ci	SLI4_REQFEAT_DIF	= 1 << 2,
256162306a36Sopenharmony_ci	SLI4_REQFEAT_VF		= 1 << 3,
256262306a36Sopenharmony_ci	SLI4_REQFEAT_FCPI	= 1 << 4,
256362306a36Sopenharmony_ci	SLI4_REQFEAT_FCPT	= 1 << 5,
256462306a36Sopenharmony_ci	SLI4_REQFEAT_FCPC	= 1 << 6,
256562306a36Sopenharmony_ci	SLI4_REQFEAT_RSVD	= 1 << 7,
256662306a36Sopenharmony_ci	SLI4_REQFEAT_RQD	= 1 << 8,
256762306a36Sopenharmony_ci	SLI4_REQFEAT_IAAR	= 1 << 9,
256862306a36Sopenharmony_ci	SLI4_REQFEAT_HLM	= 1 << 10,
256962306a36Sopenharmony_ci	SLI4_REQFEAT_PERFH	= 1 << 11,
257062306a36Sopenharmony_ci	SLI4_REQFEAT_RXSEQ	= 1 << 12,
257162306a36Sopenharmony_ci	SLI4_REQFEAT_RXRI	= 1 << 13,
257262306a36Sopenharmony_ci	SLI4_REQFEAT_DCL2	= 1 << 14,
257362306a36Sopenharmony_ci	SLI4_REQFEAT_RSCO	= 1 << 15,
257462306a36Sopenharmony_ci	SLI4_REQFEAT_MRQP	= 1 << 16,
257562306a36Sopenharmony_ci};
257662306a36Sopenharmony_ci
257762306a36Sopenharmony_cistruct sli4_cmd_request_features {
257862306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
257962306a36Sopenharmony_ci	__le32		dw1_qry;
258062306a36Sopenharmony_ci	__le32		cmd;
258162306a36Sopenharmony_ci	__le32		resp;
258262306a36Sopenharmony_ci};
258362306a36Sopenharmony_ci
258462306a36Sopenharmony_ci/*
258562306a36Sopenharmony_ci * SLI_CONFIG - submit a configuration command to Port
258662306a36Sopenharmony_ci *
258762306a36Sopenharmony_ci * Command is either embedded as part of the payload (embed) or located
258862306a36Sopenharmony_ci * in a separate memory buffer (mem)
258962306a36Sopenharmony_ci */
259062306a36Sopenharmony_cienum sli4_sli_config {
259162306a36Sopenharmony_ci	SLI4_SLICONF_EMB		= 0x1,		/* DW1 */
259262306a36Sopenharmony_ci	SLI4_SLICONF_PMDCMD_SHIFT	= 3,
259362306a36Sopenharmony_ci	SLI4_SLICONF_PMDCMD_MASK	= 0xf8,
259462306a36Sopenharmony_ci	SLI4_SLICONF_PMDCMD_VAL_1	= 8,
259562306a36Sopenharmony_ci	SLI4_SLICONF_PMDCNT		= 0xf8,
259662306a36Sopenharmony_ci
259762306a36Sopenharmony_ci	SLI4_SLICONF_PMD_LEN		= 0x00ffffff,
259862306a36Sopenharmony_ci};
259962306a36Sopenharmony_ci
260062306a36Sopenharmony_cistruct sli4_cmd_sli_config {
260162306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
260262306a36Sopenharmony_ci	__le32		dw1_flags;
260362306a36Sopenharmony_ci	__le32		payload_len;
260462306a36Sopenharmony_ci	__le32		rsvd12[3];
260562306a36Sopenharmony_ci	union {
260662306a36Sopenharmony_ci		u8 embed[58 * sizeof(u32)];
260762306a36Sopenharmony_ci		struct sli4_bufptr mem;
260862306a36Sopenharmony_ci	} payload;
260962306a36Sopenharmony_ci};
261062306a36Sopenharmony_ci
261162306a36Sopenharmony_ci/* READ_STATUS - read tx/rx status of a particular port */
261262306a36Sopenharmony_ci#define SLI4_READSTATUS_CLEAR_COUNTERS	0x1
261362306a36Sopenharmony_ci
261462306a36Sopenharmony_cistruct sli4_cmd_read_status {
261562306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
261662306a36Sopenharmony_ci	__le32		dw1_flags;
261762306a36Sopenharmony_ci	__le32		rsvd4;
261862306a36Sopenharmony_ci	__le32		trans_kbyte_cnt;
261962306a36Sopenharmony_ci	__le32		recv_kbyte_cnt;
262062306a36Sopenharmony_ci	__le32		trans_frame_cnt;
262162306a36Sopenharmony_ci	__le32		recv_frame_cnt;
262262306a36Sopenharmony_ci	__le32		trans_seq_cnt;
262362306a36Sopenharmony_ci	__le32		recv_seq_cnt;
262462306a36Sopenharmony_ci	__le32		tot_exchanges_orig;
262562306a36Sopenharmony_ci	__le32		tot_exchanges_resp;
262662306a36Sopenharmony_ci	__le32		recv_p_bsy_cnt;
262762306a36Sopenharmony_ci	__le32		recv_f_bsy_cnt;
262862306a36Sopenharmony_ci	__le32		no_rq_buf_dropped_frames_cnt;
262962306a36Sopenharmony_ci	__le32		empty_rq_timeout_cnt;
263062306a36Sopenharmony_ci	__le32		no_xri_dropped_frames_cnt;
263162306a36Sopenharmony_ci	__le32		empty_xri_pool_cnt;
263262306a36Sopenharmony_ci};
263362306a36Sopenharmony_ci
263462306a36Sopenharmony_ci/* READ_LNK_STAT - read link status of a particular port */
263562306a36Sopenharmony_cienum sli4_read_link_stats_flags {
263662306a36Sopenharmony_ci	SLI4_READ_LNKSTAT_REC	= 1u << 0,
263762306a36Sopenharmony_ci	SLI4_READ_LNKSTAT_GEC	= 1u << 1,
263862306a36Sopenharmony_ci	SLI4_READ_LNKSTAT_W02OF	= 1u << 2,
263962306a36Sopenharmony_ci	SLI4_READ_LNKSTAT_W03OF	= 1u << 3,
264062306a36Sopenharmony_ci	SLI4_READ_LNKSTAT_W04OF	= 1u << 4,
264162306a36Sopenharmony_ci	SLI4_READ_LNKSTAT_W05OF	= 1u << 5,
264262306a36Sopenharmony_ci	SLI4_READ_LNKSTAT_W06OF	= 1u << 6,
264362306a36Sopenharmony_ci	SLI4_READ_LNKSTAT_W07OF	= 1u << 7,
264462306a36Sopenharmony_ci	SLI4_READ_LNKSTAT_W08OF	= 1u << 8,
264562306a36Sopenharmony_ci	SLI4_READ_LNKSTAT_W09OF	= 1u << 9,
264662306a36Sopenharmony_ci	SLI4_READ_LNKSTAT_W10OF = 1u << 10,
264762306a36Sopenharmony_ci	SLI4_READ_LNKSTAT_W11OF = 1u << 11,
264862306a36Sopenharmony_ci	SLI4_READ_LNKSTAT_W12OF	= 1u << 12,
264962306a36Sopenharmony_ci	SLI4_READ_LNKSTAT_W13OF	= 1u << 13,
265062306a36Sopenharmony_ci	SLI4_READ_LNKSTAT_W14OF	= 1u << 14,
265162306a36Sopenharmony_ci	SLI4_READ_LNKSTAT_W15OF	= 1u << 15,
265262306a36Sopenharmony_ci	SLI4_READ_LNKSTAT_W16OF	= 1u << 16,
265362306a36Sopenharmony_ci	SLI4_READ_LNKSTAT_W17OF	= 1u << 17,
265462306a36Sopenharmony_ci	SLI4_READ_LNKSTAT_W18OF	= 1u << 18,
265562306a36Sopenharmony_ci	SLI4_READ_LNKSTAT_W19OF	= 1u << 19,
265662306a36Sopenharmony_ci	SLI4_READ_LNKSTAT_W20OF	= 1u << 20,
265762306a36Sopenharmony_ci	SLI4_READ_LNKSTAT_W21OF	= 1u << 21,
265862306a36Sopenharmony_ci	SLI4_READ_LNKSTAT_CLRC	= 1u << 30,
265962306a36Sopenharmony_ci	SLI4_READ_LNKSTAT_CLOF	= 1u << 31,
266062306a36Sopenharmony_ci};
266162306a36Sopenharmony_ci
266262306a36Sopenharmony_cistruct sli4_cmd_read_link_stats {
266362306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
266462306a36Sopenharmony_ci	__le32	dw1_flags;
266562306a36Sopenharmony_ci	__le32	linkfail_errcnt;
266662306a36Sopenharmony_ci	__le32	losssync_errcnt;
266762306a36Sopenharmony_ci	__le32	losssignal_errcnt;
266862306a36Sopenharmony_ci	__le32	primseq_errcnt;
266962306a36Sopenharmony_ci	__le32	inval_txword_errcnt;
267062306a36Sopenharmony_ci	__le32	crc_errcnt;
267162306a36Sopenharmony_ci	__le32	primseq_eventtimeout_cnt;
267262306a36Sopenharmony_ci	__le32	elastic_bufoverrun_errcnt;
267362306a36Sopenharmony_ci	__le32	arbit_fc_al_timeout_cnt;
267462306a36Sopenharmony_ci	__le32	adv_rx_buftor_to_buf_credit;
267562306a36Sopenharmony_ci	__le32	curr_rx_buf_to_buf_credit;
267662306a36Sopenharmony_ci	__le32	adv_tx_buf_to_buf_credit;
267762306a36Sopenharmony_ci	__le32	curr_tx_buf_to_buf_credit;
267862306a36Sopenharmony_ci	__le32	rx_eofa_cnt;
267962306a36Sopenharmony_ci	__le32	rx_eofdti_cnt;
268062306a36Sopenharmony_ci	__le32	rx_eofni_cnt;
268162306a36Sopenharmony_ci	__le32	rx_soff_cnt;
268262306a36Sopenharmony_ci	__le32	rx_dropped_no_aer_cnt;
268362306a36Sopenharmony_ci	__le32	rx_dropped_no_avail_rpi_rescnt;
268462306a36Sopenharmony_ci	__le32	rx_dropped_no_avail_xri_rescnt;
268562306a36Sopenharmony_ci};
268662306a36Sopenharmony_ci
268762306a36Sopenharmony_ci/* Format a WQE with WQ_ID Association performance hint */
268862306a36Sopenharmony_cistatic inline void
268962306a36Sopenharmony_cisli_set_wq_id_association(void *entry, u16 q_id)
269062306a36Sopenharmony_ci{
269162306a36Sopenharmony_ci	u32 *wqe = entry;
269262306a36Sopenharmony_ci
269362306a36Sopenharmony_ci	/*
269462306a36Sopenharmony_ci	 * Set Word 10, bit 0 to zero
269562306a36Sopenharmony_ci	 * Set Word 10, bits 15:1 to the WQ ID
269662306a36Sopenharmony_ci	 */
269762306a36Sopenharmony_ci	wqe[10] &= ~0xffff;
269862306a36Sopenharmony_ci	wqe[10] |= q_id << 1;
269962306a36Sopenharmony_ci}
270062306a36Sopenharmony_ci
270162306a36Sopenharmony_ci/* UNREG_FCFI - unregister a FCFI */
270262306a36Sopenharmony_cistruct sli4_cmd_unreg_fcfi {
270362306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
270462306a36Sopenharmony_ci	__le32		rsvd0;
270562306a36Sopenharmony_ci	__le16		fcfi;
270662306a36Sopenharmony_ci	__le16		rsvd6;
270762306a36Sopenharmony_ci};
270862306a36Sopenharmony_ci
270962306a36Sopenharmony_ci/* UNREG_RPI - unregister one or more RPI */
271062306a36Sopenharmony_cienum sli4_unreg_rpi {
271162306a36Sopenharmony_ci	SLI4_UNREG_RPI_DP	= 0x2000,
271262306a36Sopenharmony_ci	SLI4_UNREG_RPI_II_SHIFT	= 14,
271362306a36Sopenharmony_ci	SLI4_UNREG_RPI_II_MASK	= 0xc000,
271462306a36Sopenharmony_ci	SLI4_UNREG_RPI_II_RPI	= 0x0000,
271562306a36Sopenharmony_ci	SLI4_UNREG_RPI_II_VPI	= 0x4000,
271662306a36Sopenharmony_ci	SLI4_UNREG_RPI_II_VFI	= 0x8000,
271762306a36Sopenharmony_ci	SLI4_UNREG_RPI_II_FCFI	= 0xc000,
271862306a36Sopenharmony_ci
271962306a36Sopenharmony_ci	SLI4_UNREG_RPI_DEST_N_PORTID_MASK = 0x00ffffff,
272062306a36Sopenharmony_ci};
272162306a36Sopenharmony_ci
272262306a36Sopenharmony_cistruct sli4_cmd_unreg_rpi {
272362306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
272462306a36Sopenharmony_ci	__le16		index;
272562306a36Sopenharmony_ci	__le16		dw1w1_flags;
272662306a36Sopenharmony_ci	__le32		dw2_dest_n_portid;
272762306a36Sopenharmony_ci};
272862306a36Sopenharmony_ci
272962306a36Sopenharmony_ci/* UNREG_VFI - unregister one or more VFI */
273062306a36Sopenharmony_cienum sli4_unreg_vfi {
273162306a36Sopenharmony_ci	SLI4_UNREG_VFI_II_SHIFT	= 14,
273262306a36Sopenharmony_ci	SLI4_UNREG_VFI_II_MASK	= 0xc000,
273362306a36Sopenharmony_ci	SLI4_UNREG_VFI_II_VFI	= 0x0000,
273462306a36Sopenharmony_ci	SLI4_UNREG_VFI_II_FCFI	= 0xc000,
273562306a36Sopenharmony_ci};
273662306a36Sopenharmony_ci
273762306a36Sopenharmony_cistruct sli4_cmd_unreg_vfi {
273862306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
273962306a36Sopenharmony_ci	__le32		rsvd0;
274062306a36Sopenharmony_ci	__le16		index;
274162306a36Sopenharmony_ci	__le16		dw2_flags;
274262306a36Sopenharmony_ci};
274362306a36Sopenharmony_ci
274462306a36Sopenharmony_cienum sli4_unreg_type {
274562306a36Sopenharmony_ci	SLI4_UNREG_TYPE_PORT,
274662306a36Sopenharmony_ci	SLI4_UNREG_TYPE_DOMAIN,
274762306a36Sopenharmony_ci	SLI4_UNREG_TYPE_FCF,
274862306a36Sopenharmony_ci	SLI4_UNREG_TYPE_ALL
274962306a36Sopenharmony_ci};
275062306a36Sopenharmony_ci
275162306a36Sopenharmony_ci/* UNREG_VPI - unregister one or more VPI */
275262306a36Sopenharmony_cienum sli4_unreg_vpi {
275362306a36Sopenharmony_ci	SLI4_UNREG_VPI_II_SHIFT	= 14,
275462306a36Sopenharmony_ci	SLI4_UNREG_VPI_II_MASK	= 0xc000,
275562306a36Sopenharmony_ci	SLI4_UNREG_VPI_II_VPI	= 0x0000,
275662306a36Sopenharmony_ci	SLI4_UNREG_VPI_II_VFI	= 0x8000,
275762306a36Sopenharmony_ci	SLI4_UNREG_VPI_II_FCFI	= 0xc000,
275862306a36Sopenharmony_ci};
275962306a36Sopenharmony_ci
276062306a36Sopenharmony_cistruct sli4_cmd_unreg_vpi {
276162306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
276262306a36Sopenharmony_ci	__le32		rsvd0;
276362306a36Sopenharmony_ci	__le16		index;
276462306a36Sopenharmony_ci	__le16		dw2w0_flags;
276562306a36Sopenharmony_ci};
276662306a36Sopenharmony_ci
276762306a36Sopenharmony_ci/* AUTO_XFER_RDY - Configure the auto-generate XFER-RDY feature */
276862306a36Sopenharmony_cistruct sli4_cmd_config_auto_xfer_rdy {
276962306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
277062306a36Sopenharmony_ci	__le32		rsvd0;
277162306a36Sopenharmony_ci	__le32		max_burst_len;
277262306a36Sopenharmony_ci};
277362306a36Sopenharmony_ci
277462306a36Sopenharmony_ci#define SLI4_CONFIG_AUTO_XFERRDY_BLKSIZE	0xffff
277562306a36Sopenharmony_ci
277662306a36Sopenharmony_cistruct sli4_cmd_config_auto_xfer_rdy_hp {
277762306a36Sopenharmony_ci	struct sli4_mbox_command_header	hdr;
277862306a36Sopenharmony_ci	__le32		rsvd0;
277962306a36Sopenharmony_ci	__le32		max_burst_len;
278062306a36Sopenharmony_ci	__le32		dw3_esoc_flags;
278162306a36Sopenharmony_ci	__le16		block_size;
278262306a36Sopenharmony_ci	__le16		rsvd14;
278362306a36Sopenharmony_ci};
278462306a36Sopenharmony_ci
278562306a36Sopenharmony_ci/*************************************************************************
278662306a36Sopenharmony_ci * SLI-4 common configuration command formats and definitions
278762306a36Sopenharmony_ci */
278862306a36Sopenharmony_ci
278962306a36Sopenharmony_ci/*
279062306a36Sopenharmony_ci * Subsystem values.
279162306a36Sopenharmony_ci */
279262306a36Sopenharmony_cienum sli4_subsystem {
279362306a36Sopenharmony_ci	SLI4_SUBSYSTEM_COMMON	= 0x01,
279462306a36Sopenharmony_ci	SLI4_SUBSYSTEM_LOWLEVEL	= 0x0b,
279562306a36Sopenharmony_ci	SLI4_SUBSYSTEM_FC	= 0x0c,
279662306a36Sopenharmony_ci	SLI4_SUBSYSTEM_DMTF	= 0x11,
279762306a36Sopenharmony_ci};
279862306a36Sopenharmony_ci
279962306a36Sopenharmony_ci#define	SLI4_OPC_LOWLEVEL_SET_WATCHDOG		0X36
280062306a36Sopenharmony_ci
280162306a36Sopenharmony_ci/*
280262306a36Sopenharmony_ci * Common opcode (OPC) values.
280362306a36Sopenharmony_ci */
280462306a36Sopenharmony_cienum sli4_cmn_opcode {
280562306a36Sopenharmony_ci	SLI4_CMN_FUNCTION_RESET		= 0x3d,
280662306a36Sopenharmony_ci	SLI4_CMN_CREATE_CQ		= 0x0c,
280762306a36Sopenharmony_ci	SLI4_CMN_CREATE_CQ_SET		= 0x1d,
280862306a36Sopenharmony_ci	SLI4_CMN_DESTROY_CQ		= 0x36,
280962306a36Sopenharmony_ci	SLI4_CMN_MODIFY_EQ_DELAY	= 0x29,
281062306a36Sopenharmony_ci	SLI4_CMN_CREATE_EQ		= 0x0d,
281162306a36Sopenharmony_ci	SLI4_CMN_DESTROY_EQ		= 0x37,
281262306a36Sopenharmony_ci	SLI4_CMN_CREATE_MQ_EXT		= 0x5a,
281362306a36Sopenharmony_ci	SLI4_CMN_DESTROY_MQ		= 0x35,
281462306a36Sopenharmony_ci	SLI4_CMN_GET_CNTL_ATTRIBUTES	= 0x20,
281562306a36Sopenharmony_ci	SLI4_CMN_NOP			= 0x21,
281662306a36Sopenharmony_ci	SLI4_CMN_GET_RSC_EXTENT_INFO	= 0x9a,
281762306a36Sopenharmony_ci	SLI4_CMN_GET_SLI4_PARAMS	= 0xb5,
281862306a36Sopenharmony_ci	SLI4_CMN_QUERY_FW_CONFIG	= 0x3a,
281962306a36Sopenharmony_ci	SLI4_CMN_GET_PORT_NAME		= 0x4d,
282062306a36Sopenharmony_ci
282162306a36Sopenharmony_ci	SLI4_CMN_WRITE_FLASHROM		= 0x07,
282262306a36Sopenharmony_ci	/* TRANSCEIVER Data */
282362306a36Sopenharmony_ci	SLI4_CMN_READ_TRANS_DATA	= 0x49,
282462306a36Sopenharmony_ci	SLI4_CMN_GET_CNTL_ADDL_ATTRS	= 0x79,
282562306a36Sopenharmony_ci	SLI4_CMN_GET_FUNCTION_CFG	= 0xa0,
282662306a36Sopenharmony_ci	SLI4_CMN_GET_PROFILE_CFG	= 0xa4,
282762306a36Sopenharmony_ci	SLI4_CMN_SET_PROFILE_CFG	= 0xa5,
282862306a36Sopenharmony_ci	SLI4_CMN_GET_PROFILE_LIST	= 0xa6,
282962306a36Sopenharmony_ci	SLI4_CMN_GET_ACTIVE_PROFILE	= 0xa7,
283062306a36Sopenharmony_ci	SLI4_CMN_SET_ACTIVE_PROFILE	= 0xa8,
283162306a36Sopenharmony_ci	SLI4_CMN_READ_OBJECT		= 0xab,
283262306a36Sopenharmony_ci	SLI4_CMN_WRITE_OBJECT		= 0xac,
283362306a36Sopenharmony_ci	SLI4_CMN_DELETE_OBJECT		= 0xae,
283462306a36Sopenharmony_ci	SLI4_CMN_READ_OBJECT_LIST	= 0xad,
283562306a36Sopenharmony_ci	SLI4_CMN_SET_DUMP_LOCATION	= 0xb8,
283662306a36Sopenharmony_ci	SLI4_CMN_SET_FEATURES		= 0xbf,
283762306a36Sopenharmony_ci	SLI4_CMN_GET_RECFG_LINK_INFO	= 0xc9,
283862306a36Sopenharmony_ci	SLI4_CMN_SET_RECNG_LINK_ID	= 0xca,
283962306a36Sopenharmony_ci};
284062306a36Sopenharmony_ci
284162306a36Sopenharmony_ci/* DMTF opcode (OPC) values */
284262306a36Sopenharmony_ci#define DMTF_EXEC_CLP_CMD 0x01
284362306a36Sopenharmony_ci
284462306a36Sopenharmony_ci/*
284562306a36Sopenharmony_ci * COMMON_FUNCTION_RESET
284662306a36Sopenharmony_ci *
284762306a36Sopenharmony_ci * Resets the Port, returning it to a power-on state. This configuration
284862306a36Sopenharmony_ci * command does not have a payload and should set/expect the lengths to
284962306a36Sopenharmony_ci * be zero.
285062306a36Sopenharmony_ci */
285162306a36Sopenharmony_cistruct sli4_rqst_cmn_function_reset {
285262306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
285362306a36Sopenharmony_ci};
285462306a36Sopenharmony_ci
285562306a36Sopenharmony_cistruct sli4_rsp_cmn_function_reset {
285662306a36Sopenharmony_ci	struct sli4_rsp_hdr	hdr;
285762306a36Sopenharmony_ci};
285862306a36Sopenharmony_ci
285962306a36Sopenharmony_ci/*
286062306a36Sopenharmony_ci * COMMON_GET_CNTL_ATTRIBUTES
286162306a36Sopenharmony_ci *
286262306a36Sopenharmony_ci * Query for information about the SLI Port
286362306a36Sopenharmony_ci */
286462306a36Sopenharmony_cienum sli4_cntrl_attr_flags {
286562306a36Sopenharmony_ci	SLI4_CNTL_ATTR_PORTNUM	= 0x3f,
286662306a36Sopenharmony_ci	SLI4_CNTL_ATTR_PORTTYPE	= 0xc0,
286762306a36Sopenharmony_ci};
286862306a36Sopenharmony_ci
286962306a36Sopenharmony_cistruct sli4_rsp_cmn_get_cntl_attributes {
287062306a36Sopenharmony_ci	struct sli4_rsp_hdr	hdr;
287162306a36Sopenharmony_ci	u8		version_str[32];
287262306a36Sopenharmony_ci	u8		manufacturer_name[32];
287362306a36Sopenharmony_ci	__le32		supported_modes;
287462306a36Sopenharmony_ci	u8		eprom_version_lo;
287562306a36Sopenharmony_ci	u8		eprom_version_hi;
287662306a36Sopenharmony_ci	__le16		rsvd17;
287762306a36Sopenharmony_ci	__le32		mbx_ds_version;
287862306a36Sopenharmony_ci	__le32		ep_fw_ds_version;
287962306a36Sopenharmony_ci	u8		ncsi_version_str[12];
288062306a36Sopenharmony_ci	__le32		def_extended_timeout;
288162306a36Sopenharmony_ci	u8		model_number[32];
288262306a36Sopenharmony_ci	u8		description[64];
288362306a36Sopenharmony_ci	u8		serial_number[32];
288462306a36Sopenharmony_ci	u8		ip_version_str[32];
288562306a36Sopenharmony_ci	u8		fw_version_str[32];
288662306a36Sopenharmony_ci	u8		bios_version_str[32];
288762306a36Sopenharmony_ci	u8		redboot_version_str[32];
288862306a36Sopenharmony_ci	u8		driver_version_str[32];
288962306a36Sopenharmony_ci	u8		fw_on_flash_version_str[32];
289062306a36Sopenharmony_ci	__le32		functionalities_supported;
289162306a36Sopenharmony_ci	__le16		max_cdb_length;
289262306a36Sopenharmony_ci	u8		asic_revision;
289362306a36Sopenharmony_ci	u8		generational_guid0;
289462306a36Sopenharmony_ci	__le32		generational_guid1_12[3];
289562306a36Sopenharmony_ci	__le16		generational_guid13_14;
289662306a36Sopenharmony_ci	u8		generational_guid15;
289762306a36Sopenharmony_ci	u8		hba_port_count;
289862306a36Sopenharmony_ci	__le16		default_link_down_timeout;
289962306a36Sopenharmony_ci	u8		iscsi_version_min_max;
290062306a36Sopenharmony_ci	u8		multifunctional_device;
290162306a36Sopenharmony_ci	u8		cache_valid;
290262306a36Sopenharmony_ci	u8		hba_status;
290362306a36Sopenharmony_ci	u8		max_domains_supported;
290462306a36Sopenharmony_ci	u8		port_num_type_flags;
290562306a36Sopenharmony_ci	__le32		firmware_post_status;
290662306a36Sopenharmony_ci	__le32		hba_mtu;
290762306a36Sopenharmony_ci	u8		iscsi_features;
290862306a36Sopenharmony_ci	u8		rsvd121[3];
290962306a36Sopenharmony_ci	__le16		pci_vendor_id;
291062306a36Sopenharmony_ci	__le16		pci_device_id;
291162306a36Sopenharmony_ci	__le16		pci_sub_vendor_id;
291262306a36Sopenharmony_ci	__le16		pci_sub_system_id;
291362306a36Sopenharmony_ci	u8		pci_bus_number;
291462306a36Sopenharmony_ci	u8		pci_device_number;
291562306a36Sopenharmony_ci	u8		pci_function_number;
291662306a36Sopenharmony_ci	u8		interface_type;
291762306a36Sopenharmony_ci	__le64		unique_identifier;
291862306a36Sopenharmony_ci	u8		number_of_netfilters;
291962306a36Sopenharmony_ci	u8		rsvd122[3];
292062306a36Sopenharmony_ci};
292162306a36Sopenharmony_ci
292262306a36Sopenharmony_ci/*
292362306a36Sopenharmony_ci * COMMON_GET_CNTL_ATTRIBUTES
292462306a36Sopenharmony_ci *
292562306a36Sopenharmony_ci * This command queries the controller information from the Flash ROM.
292662306a36Sopenharmony_ci */
292762306a36Sopenharmony_cistruct sli4_rqst_cmn_get_cntl_addl_attributes {
292862306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
292962306a36Sopenharmony_ci};
293062306a36Sopenharmony_ci
293162306a36Sopenharmony_cistruct sli4_rsp_cmn_get_cntl_addl_attributes {
293262306a36Sopenharmony_ci	struct sli4_rsp_hdr	hdr;
293362306a36Sopenharmony_ci	__le16		ipl_file_number;
293462306a36Sopenharmony_ci	u8		ipl_file_version;
293562306a36Sopenharmony_ci	u8		rsvd4;
293662306a36Sopenharmony_ci	u8		on_die_temperature;
293762306a36Sopenharmony_ci	u8		rsvd5[3];
293862306a36Sopenharmony_ci	__le32		driver_advanced_features_supported;
293962306a36Sopenharmony_ci	__le32		rsvd7[4];
294062306a36Sopenharmony_ci	char		universal_bios_version[32];
294162306a36Sopenharmony_ci	char		x86_bios_version[32];
294262306a36Sopenharmony_ci	char		efi_bios_version[32];
294362306a36Sopenharmony_ci	char		fcode_version[32];
294462306a36Sopenharmony_ci	char		uefi_bios_version[32];
294562306a36Sopenharmony_ci	char		uefi_nic_version[32];
294662306a36Sopenharmony_ci	char		uefi_fcode_version[32];
294762306a36Sopenharmony_ci	char		uefi_iscsi_version[32];
294862306a36Sopenharmony_ci	char		iscsi_x86_bios_version[32];
294962306a36Sopenharmony_ci	char		pxe_x86_bios_version[32];
295062306a36Sopenharmony_ci	u8		default_wwpn[8];
295162306a36Sopenharmony_ci	u8		ext_phy_version[32];
295262306a36Sopenharmony_ci	u8		fc_universal_bios_version[32];
295362306a36Sopenharmony_ci	u8		fc_x86_bios_version[32];
295462306a36Sopenharmony_ci	u8		fc_efi_bios_version[32];
295562306a36Sopenharmony_ci	u8		fc_fcode_version[32];
295662306a36Sopenharmony_ci	u8		ext_phy_crc_label[8];
295762306a36Sopenharmony_ci	u8		ipl_file_name[16];
295862306a36Sopenharmony_ci	u8		rsvd139[72];
295962306a36Sopenharmony_ci};
296062306a36Sopenharmony_ci
296162306a36Sopenharmony_ci/*
296262306a36Sopenharmony_ci * COMMON_NOP
296362306a36Sopenharmony_ci *
296462306a36Sopenharmony_ci * This command does not do anything; it only returns
296562306a36Sopenharmony_ci * the payload in the completion.
296662306a36Sopenharmony_ci */
296762306a36Sopenharmony_cistruct sli4_rqst_cmn_nop {
296862306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
296962306a36Sopenharmony_ci	__le32			context[2];
297062306a36Sopenharmony_ci};
297162306a36Sopenharmony_ci
297262306a36Sopenharmony_cistruct sli4_rsp_cmn_nop {
297362306a36Sopenharmony_ci	struct sli4_rsp_hdr	hdr;
297462306a36Sopenharmony_ci	__le32			context[2];
297562306a36Sopenharmony_ci};
297662306a36Sopenharmony_ci
297762306a36Sopenharmony_cistruct sli4_rqst_cmn_get_resource_extent_info {
297862306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
297962306a36Sopenharmony_ci	__le16	resource_type;
298062306a36Sopenharmony_ci	__le16	rsvd16;
298162306a36Sopenharmony_ci};
298262306a36Sopenharmony_ci
298362306a36Sopenharmony_cienum sli4_rsc_type {
298462306a36Sopenharmony_ci	SLI4_RSC_TYPE_VFI	= 0x20,
298562306a36Sopenharmony_ci	SLI4_RSC_TYPE_VPI	= 0x21,
298662306a36Sopenharmony_ci	SLI4_RSC_TYPE_RPI	= 0x22,
298762306a36Sopenharmony_ci	SLI4_RSC_TYPE_XRI	= 0x23,
298862306a36Sopenharmony_ci};
298962306a36Sopenharmony_ci
299062306a36Sopenharmony_cistruct sli4_rsp_cmn_get_resource_extent_info {
299162306a36Sopenharmony_ci	struct sli4_rsp_hdr	hdr;
299262306a36Sopenharmony_ci	__le16		resource_extent_count;
299362306a36Sopenharmony_ci	__le16		resource_extent_size;
299462306a36Sopenharmony_ci};
299562306a36Sopenharmony_ci
299662306a36Sopenharmony_ci#define SLI4_128BYTE_WQE_SUPPORT	0x02
299762306a36Sopenharmony_ci
299862306a36Sopenharmony_ci#define GET_Q_CNT_METHOD(m) \
299962306a36Sopenharmony_ci	(((m) & SLI4_PARAM_Q_CNT_MTHD_MASK) >> SLI4_PARAM_Q_CNT_MTHD_SHFT)
300062306a36Sopenharmony_ci#define GET_Q_CREATE_VERSION(v) \
300162306a36Sopenharmony_ci	(((v) & SLI4_PARAM_QV_MASK) >> SLI4_PARAM_QV_SHIFT)
300262306a36Sopenharmony_ci
300362306a36Sopenharmony_cienum sli4_rsp_get_params_e {
300462306a36Sopenharmony_ci	/*GENERIC*/
300562306a36Sopenharmony_ci	SLI4_PARAM_Q_CNT_MTHD_SHFT	= 24,
300662306a36Sopenharmony_ci	SLI4_PARAM_Q_CNT_MTHD_MASK	= 0xf << 24,
300762306a36Sopenharmony_ci	SLI4_PARAM_QV_SHIFT		= 14,
300862306a36Sopenharmony_ci	SLI4_PARAM_QV_MASK		= 3 << 14,
300962306a36Sopenharmony_ci
301062306a36Sopenharmony_ci	/* DW4 */
301162306a36Sopenharmony_ci	SLI4_PARAM_PROTO_TYPE_MASK	= 0xff,
301262306a36Sopenharmony_ci	/* DW5 */
301362306a36Sopenharmony_ci	SLI4_PARAM_FT			= 1 << 0,
301462306a36Sopenharmony_ci	SLI4_PARAM_SLI_REV_MASK		= 0xf << 4,
301562306a36Sopenharmony_ci	SLI4_PARAM_SLI_FAM_MASK		= 0xf << 8,
301662306a36Sopenharmony_ci	SLI4_PARAM_IF_TYPE_MASK		= 0xf << 12,
301762306a36Sopenharmony_ci	SLI4_PARAM_SLI_HINT1_MASK	= 0xff << 16,
301862306a36Sopenharmony_ci	SLI4_PARAM_SLI_HINT2_MASK	= 0x1f << 24,
301962306a36Sopenharmony_ci	/* DW6 */
302062306a36Sopenharmony_ci	SLI4_PARAM_EQ_PAGE_CNT_MASK	= 0xf << 0,
302162306a36Sopenharmony_ci	SLI4_PARAM_EQE_SZS_MASK		= 0xf << 8,
302262306a36Sopenharmony_ci	SLI4_PARAM_EQ_PAGE_SZS_MASK	= 0xff << 16,
302362306a36Sopenharmony_ci	/* DW8 */
302462306a36Sopenharmony_ci	SLI4_PARAM_CQ_PAGE_CNT_MASK	= 0xf << 0,
302562306a36Sopenharmony_ci	SLI4_PARAM_CQE_SZS_MASK		= 0xf << 8,
302662306a36Sopenharmony_ci	SLI4_PARAM_CQ_PAGE_SZS_MASK	= 0xff << 16,
302762306a36Sopenharmony_ci	/* DW10 */
302862306a36Sopenharmony_ci	SLI4_PARAM_MQ_PAGE_CNT_MASK	= 0xf << 0,
302962306a36Sopenharmony_ci	SLI4_PARAM_MQ_PAGE_SZS_MASK	= 0xff << 16,
303062306a36Sopenharmony_ci	/* DW12 */
303162306a36Sopenharmony_ci	SLI4_PARAM_WQ_PAGE_CNT_MASK	= 0xf << 0,
303262306a36Sopenharmony_ci	SLI4_PARAM_WQE_SZS_MASK		= 0xf << 8,
303362306a36Sopenharmony_ci	SLI4_PARAM_WQ_PAGE_SZS_MASK	= 0xff << 16,
303462306a36Sopenharmony_ci	/* DW14 */
303562306a36Sopenharmony_ci	SLI4_PARAM_RQ_PAGE_CNT_MASK	= 0xf << 0,
303662306a36Sopenharmony_ci	SLI4_PARAM_RQE_SZS_MASK		= 0xf << 8,
303762306a36Sopenharmony_ci	SLI4_PARAM_RQ_PAGE_SZS_MASK	= 0xff << 16,
303862306a36Sopenharmony_ci	/* DW15W1*/
303962306a36Sopenharmony_ci	SLI4_PARAM_RQ_DB_WINDOW_MASK	= 0xf000,
304062306a36Sopenharmony_ci	/* DW16 */
304162306a36Sopenharmony_ci	SLI4_PARAM_FC			= 1 << 0,
304262306a36Sopenharmony_ci	SLI4_PARAM_EXT			= 1 << 1,
304362306a36Sopenharmony_ci	SLI4_PARAM_HDRR			= 1 << 2,
304462306a36Sopenharmony_ci	SLI4_PARAM_SGLR			= 1 << 3,
304562306a36Sopenharmony_ci	SLI4_PARAM_FBRR			= 1 << 4,
304662306a36Sopenharmony_ci	SLI4_PARAM_AREG			= 1 << 5,
304762306a36Sopenharmony_ci	SLI4_PARAM_TGT			= 1 << 6,
304862306a36Sopenharmony_ci	SLI4_PARAM_TERP			= 1 << 7,
304962306a36Sopenharmony_ci	SLI4_PARAM_ASSI			= 1 << 8,
305062306a36Sopenharmony_ci	SLI4_PARAM_WCHN			= 1 << 9,
305162306a36Sopenharmony_ci	SLI4_PARAM_TCCA			= 1 << 10,
305262306a36Sopenharmony_ci	SLI4_PARAM_TRTY			= 1 << 11,
305362306a36Sopenharmony_ci	SLI4_PARAM_TRIR			= 1 << 12,
305462306a36Sopenharmony_ci	SLI4_PARAM_PHOFF		= 1 << 13,
305562306a36Sopenharmony_ci	SLI4_PARAM_PHON			= 1 << 14,
305662306a36Sopenharmony_ci	SLI4_PARAM_PHWQ			= 1 << 15,
305762306a36Sopenharmony_ci	SLI4_PARAM_BOUND_4GA		= 1 << 16,
305862306a36Sopenharmony_ci	SLI4_PARAM_RXC			= 1 << 17,
305962306a36Sopenharmony_ci	SLI4_PARAM_HLM			= 1 << 18,
306062306a36Sopenharmony_ci	SLI4_PARAM_IPR			= 1 << 19,
306162306a36Sopenharmony_ci	SLI4_PARAM_RXRI			= 1 << 20,
306262306a36Sopenharmony_ci	SLI4_PARAM_SGLC			= 1 << 21,
306362306a36Sopenharmony_ci	SLI4_PARAM_TIMM			= 1 << 22,
306462306a36Sopenharmony_ci	SLI4_PARAM_TSMM			= 1 << 23,
306562306a36Sopenharmony_ci	SLI4_PARAM_OAS			= 1 << 25,
306662306a36Sopenharmony_ci	SLI4_PARAM_LC			= 1 << 26,
306762306a36Sopenharmony_ci	SLI4_PARAM_AGXF			= 1 << 27,
306862306a36Sopenharmony_ci	SLI4_PARAM_LOOPBACK_MASK	= 0xf << 28,
306962306a36Sopenharmony_ci	/* DW18 */
307062306a36Sopenharmony_ci	SLI4_PARAM_SGL_PAGE_CNT_MASK	= 0xf << 0,
307162306a36Sopenharmony_ci	SLI4_PARAM_SGL_PAGE_SZS_MASK	= 0xff << 8,
307262306a36Sopenharmony_ci	SLI4_PARAM_SGL_PP_ALIGN_MASK	= 0xff << 16,
307362306a36Sopenharmony_ci};
307462306a36Sopenharmony_ci
307562306a36Sopenharmony_cistruct sli4_rqst_cmn_get_sli4_params {
307662306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
307762306a36Sopenharmony_ci};
307862306a36Sopenharmony_ci
307962306a36Sopenharmony_cistruct sli4_rsp_cmn_get_sli4_params {
308062306a36Sopenharmony_ci	struct sli4_rsp_hdr	hdr;
308162306a36Sopenharmony_ci	__le32		dw4_protocol_type;
308262306a36Sopenharmony_ci	__le32		dw5_sli;
308362306a36Sopenharmony_ci	__le32		dw6_eq_page_cnt;
308462306a36Sopenharmony_ci	__le16		eqe_count_mask;
308562306a36Sopenharmony_ci	__le16		rsvd26;
308662306a36Sopenharmony_ci	__le32		dw8_cq_page_cnt;
308762306a36Sopenharmony_ci	__le16		cqe_count_mask;
308862306a36Sopenharmony_ci	__le16		rsvd34;
308962306a36Sopenharmony_ci	__le32		dw10_mq_page_cnt;
309062306a36Sopenharmony_ci	__le16		mqe_count_mask;
309162306a36Sopenharmony_ci	__le16		rsvd42;
309262306a36Sopenharmony_ci	__le32		dw12_wq_page_cnt;
309362306a36Sopenharmony_ci	__le16		wqe_count_mask;
309462306a36Sopenharmony_ci	__le16		rsvd50;
309562306a36Sopenharmony_ci	__le32		dw14_rq_page_cnt;
309662306a36Sopenharmony_ci	__le16		rqe_count_mask;
309762306a36Sopenharmony_ci	__le16		dw15w1_rq_db_window;
309862306a36Sopenharmony_ci	__le32		dw16_loopback_scope;
309962306a36Sopenharmony_ci	__le32		sge_supported_length;
310062306a36Sopenharmony_ci	__le32		dw18_sgl_page_cnt;
310162306a36Sopenharmony_ci	__le16		min_rq_buffer_size;
310262306a36Sopenharmony_ci	__le16		rsvd75;
310362306a36Sopenharmony_ci	__le32		max_rq_buffer_size;
310462306a36Sopenharmony_ci	__le16		physical_xri_max;
310562306a36Sopenharmony_ci	__le16		physical_rpi_max;
310662306a36Sopenharmony_ci	__le16		physical_vpi_max;
310762306a36Sopenharmony_ci	__le16		physical_vfi_max;
310862306a36Sopenharmony_ci	__le32		rsvd88;
310962306a36Sopenharmony_ci	__le16		frag_num_field_offset;
311062306a36Sopenharmony_ci	__le16		frag_num_field_size;
311162306a36Sopenharmony_ci	__le16		sgl_index_field_offset;
311262306a36Sopenharmony_ci	__le16		sgl_index_field_size;
311362306a36Sopenharmony_ci	__le32		chain_sge_initial_value_lo;
311462306a36Sopenharmony_ci	__le32		chain_sge_initial_value_hi;
311562306a36Sopenharmony_ci};
311662306a36Sopenharmony_ci
311762306a36Sopenharmony_ci/*Port Types*/
311862306a36Sopenharmony_cienum sli4_port_types {
311962306a36Sopenharmony_ci	SLI4_PORT_TYPE_ETH	= 0,
312062306a36Sopenharmony_ci	SLI4_PORT_TYPE_FC	= 1,
312162306a36Sopenharmony_ci};
312262306a36Sopenharmony_ci
312362306a36Sopenharmony_cistruct sli4_rqst_cmn_get_port_name {
312462306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
312562306a36Sopenharmony_ci	u8	port_type;
312662306a36Sopenharmony_ci	u8	rsvd4[3];
312762306a36Sopenharmony_ci};
312862306a36Sopenharmony_ci
312962306a36Sopenharmony_cistruct sli4_rsp_cmn_get_port_name {
313062306a36Sopenharmony_ci	struct sli4_rsp_hdr	hdr;
313162306a36Sopenharmony_ci	char	port_name[4];
313262306a36Sopenharmony_ci};
313362306a36Sopenharmony_ci
313462306a36Sopenharmony_cistruct sli4_rqst_cmn_write_flashrom {
313562306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
313662306a36Sopenharmony_ci	__le32		flash_rom_access_opcode;
313762306a36Sopenharmony_ci	__le32		flash_rom_access_operation_type;
313862306a36Sopenharmony_ci	__le32		data_buffer_size;
313962306a36Sopenharmony_ci	__le32		offset;
314062306a36Sopenharmony_ci	u8		data_buffer[4];
314162306a36Sopenharmony_ci};
314262306a36Sopenharmony_ci
314362306a36Sopenharmony_ci/*
314462306a36Sopenharmony_ci * COMMON_READ_TRANSCEIVER_DATA
314562306a36Sopenharmony_ci *
314662306a36Sopenharmony_ci * This command reads SFF transceiver data(Format is defined
314762306a36Sopenharmony_ci * by the SFF-8472 specification).
314862306a36Sopenharmony_ci */
314962306a36Sopenharmony_cistruct sli4_rqst_cmn_read_transceiver_data {
315062306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
315162306a36Sopenharmony_ci	__le32			page_number;
315262306a36Sopenharmony_ci	__le32			port;
315362306a36Sopenharmony_ci};
315462306a36Sopenharmony_ci
315562306a36Sopenharmony_cistruct sli4_rsp_cmn_read_transceiver_data {
315662306a36Sopenharmony_ci	struct sli4_rsp_hdr	hdr;
315762306a36Sopenharmony_ci	__le32			page_number;
315862306a36Sopenharmony_ci	__le32			port;
315962306a36Sopenharmony_ci	u8			page_data[128];
316062306a36Sopenharmony_ci	u8			page_data_2[128];
316162306a36Sopenharmony_ci};
316262306a36Sopenharmony_ci
316362306a36Sopenharmony_ci#define SLI4_REQ_DESIRE_READLEN		0xffffff
316462306a36Sopenharmony_ci
316562306a36Sopenharmony_cistruct sli4_rqst_cmn_read_object {
316662306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
316762306a36Sopenharmony_ci	__le32			desired_read_length_dword;
316862306a36Sopenharmony_ci	__le32			read_offset;
316962306a36Sopenharmony_ci	u8			object_name[104];
317062306a36Sopenharmony_ci	__le32			host_buffer_descriptor_count;
317162306a36Sopenharmony_ci	struct sli4_bde		host_buffer_descriptor[];
317262306a36Sopenharmony_ci};
317362306a36Sopenharmony_ci
317462306a36Sopenharmony_ci#define RSP_COM_READ_OBJ_EOF		0x80000000
317562306a36Sopenharmony_ci
317662306a36Sopenharmony_cistruct sli4_rsp_cmn_read_object {
317762306a36Sopenharmony_ci	struct sli4_rsp_hdr	hdr;
317862306a36Sopenharmony_ci	__le32			actual_read_length;
317962306a36Sopenharmony_ci	__le32			eof_dword;
318062306a36Sopenharmony_ci};
318162306a36Sopenharmony_ci
318262306a36Sopenharmony_cienum sli4_rqst_write_object_flags {
318362306a36Sopenharmony_ci	SLI4_RQ_DES_WRITE_LEN		= 0xffffff,
318462306a36Sopenharmony_ci	SLI4_RQ_DES_WRITE_LEN_NOC	= 0x40000000,
318562306a36Sopenharmony_ci	SLI4_RQ_DES_WRITE_LEN_EOF	= 0x80000000,
318662306a36Sopenharmony_ci};
318762306a36Sopenharmony_ci
318862306a36Sopenharmony_cistruct sli4_rqst_cmn_write_object {
318962306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
319062306a36Sopenharmony_ci	__le32			desired_write_len_dword;
319162306a36Sopenharmony_ci	__le32			write_offset;
319262306a36Sopenharmony_ci	u8			object_name[104];
319362306a36Sopenharmony_ci	__le32			host_buffer_descriptor_count;
319462306a36Sopenharmony_ci	struct sli4_bde		host_buffer_descriptor[];
319562306a36Sopenharmony_ci};
319662306a36Sopenharmony_ci
319762306a36Sopenharmony_ci#define	RSP_CHANGE_STATUS		0xff
319862306a36Sopenharmony_ci
319962306a36Sopenharmony_cistruct sli4_rsp_cmn_write_object {
320062306a36Sopenharmony_ci	struct sli4_rsp_hdr	hdr;
320162306a36Sopenharmony_ci	__le32			actual_write_length;
320262306a36Sopenharmony_ci	__le32			change_status_dword;
320362306a36Sopenharmony_ci};
320462306a36Sopenharmony_ci
320562306a36Sopenharmony_cistruct sli4_rqst_cmn_delete_object {
320662306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
320762306a36Sopenharmony_ci	__le32			rsvd4;
320862306a36Sopenharmony_ci	__le32			rsvd5;
320962306a36Sopenharmony_ci	u8			object_name[104];
321062306a36Sopenharmony_ci};
321162306a36Sopenharmony_ci
321262306a36Sopenharmony_ci#define SLI4_RQ_OBJ_LIST_READ_LEN	0xffffff
321362306a36Sopenharmony_ci
321462306a36Sopenharmony_cistruct sli4_rqst_cmn_read_object_list {
321562306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
321662306a36Sopenharmony_ci	__le32			desired_read_length_dword;
321762306a36Sopenharmony_ci	__le32			read_offset;
321862306a36Sopenharmony_ci	u8			object_name[104];
321962306a36Sopenharmony_ci	__le32			host_buffer_descriptor_count;
322062306a36Sopenharmony_ci	struct sli4_bde		host_buffer_descriptor[];
322162306a36Sopenharmony_ci};
322262306a36Sopenharmony_ci
322362306a36Sopenharmony_cienum sli4_rqst_set_dump_flags {
322462306a36Sopenharmony_ci	SLI4_CMN_SET_DUMP_BUFFER_LEN	= 0xffffff,
322562306a36Sopenharmony_ci	SLI4_CMN_SET_DUMP_FDB		= 0x20000000,
322662306a36Sopenharmony_ci	SLI4_CMN_SET_DUMP_BLP		= 0x40000000,
322762306a36Sopenharmony_ci	SLI4_CMN_SET_DUMP_QRY		= 0x80000000,
322862306a36Sopenharmony_ci};
322962306a36Sopenharmony_ci
323062306a36Sopenharmony_cistruct sli4_rqst_cmn_set_dump_location {
323162306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
323262306a36Sopenharmony_ci	__le32			buffer_length_dword;
323362306a36Sopenharmony_ci	__le32			buf_addr_low;
323462306a36Sopenharmony_ci	__le32			buf_addr_high;
323562306a36Sopenharmony_ci};
323662306a36Sopenharmony_ci
323762306a36Sopenharmony_cistruct sli4_rsp_cmn_set_dump_location {
323862306a36Sopenharmony_ci	struct sli4_rsp_hdr	hdr;
323962306a36Sopenharmony_ci	__le32			buffer_length_dword;
324062306a36Sopenharmony_ci};
324162306a36Sopenharmony_ci
324262306a36Sopenharmony_cienum sli4_dump_level {
324362306a36Sopenharmony_ci	SLI4_DUMP_LEVEL_NONE,
324462306a36Sopenharmony_ci	SLI4_CHIP_LEVEL_DUMP,
324562306a36Sopenharmony_ci	SLI4_FUNC_DESC_DUMP,
324662306a36Sopenharmony_ci};
324762306a36Sopenharmony_ci
324862306a36Sopenharmony_cienum sli4_dump_state {
324962306a36Sopenharmony_ci	SLI4_DUMP_STATE_NONE,
325062306a36Sopenharmony_ci	SLI4_CHIP_DUMP_STATE_VALID,
325162306a36Sopenharmony_ci	SLI4_FUNC_DUMP_STATE_VALID,
325262306a36Sopenharmony_ci};
325362306a36Sopenharmony_ci
325462306a36Sopenharmony_cienum sli4_dump_status {
325562306a36Sopenharmony_ci	SLI4_DUMP_READY_STATUS_NOT_READY,
325662306a36Sopenharmony_ci	SLI4_DUMP_READY_STATUS_DD_PRESENT,
325762306a36Sopenharmony_ci	SLI4_DUMP_READY_STATUS_FDB_PRESENT,
325862306a36Sopenharmony_ci	SLI4_DUMP_READY_STATUS_SKIP_DUMP,
325962306a36Sopenharmony_ci	SLI4_DUMP_READY_STATUS_FAILED = -1,
326062306a36Sopenharmony_ci};
326162306a36Sopenharmony_ci
326262306a36Sopenharmony_cienum sli4_set_features {
326362306a36Sopenharmony_ci	SLI4_SET_FEATURES_DIF_SEED			= 0x01,
326462306a36Sopenharmony_ci	SLI4_SET_FEATURES_XRI_TIMER			= 0x03,
326562306a36Sopenharmony_ci	SLI4_SET_FEATURES_MAX_PCIE_SPEED		= 0x04,
326662306a36Sopenharmony_ci	SLI4_SET_FEATURES_FCTL_CHECK			= 0x05,
326762306a36Sopenharmony_ci	SLI4_SET_FEATURES_FEC				= 0x06,
326862306a36Sopenharmony_ci	SLI4_SET_FEATURES_PCIE_RECV_DETECT		= 0x07,
326962306a36Sopenharmony_ci	SLI4_SET_FEATURES_DIF_MEMORY_MODE		= 0x08,
327062306a36Sopenharmony_ci	SLI4_SET_FEATURES_DISABLE_SLI_PORT_PAUSE_STATE	= 0x09,
327162306a36Sopenharmony_ci	SLI4_SET_FEATURES_ENABLE_PCIE_OPTIONS		= 0x0a,
327262306a36Sopenharmony_ci	SLI4_SET_FEAT_CFG_AUTO_XFER_RDY_T10PI		= 0x0c,
327362306a36Sopenharmony_ci	SLI4_SET_FEATURES_ENABLE_MULTI_RECEIVE_QUEUE	= 0x0d,
327462306a36Sopenharmony_ci	SLI4_SET_FEATURES_SET_FTD_XFER_HINT		= 0x0f,
327562306a36Sopenharmony_ci	SLI4_SET_FEATURES_SLI_PORT_HEALTH_CHECK		= 0x11,
327662306a36Sopenharmony_ci};
327762306a36Sopenharmony_ci
327862306a36Sopenharmony_cistruct sli4_rqst_cmn_set_features {
327962306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
328062306a36Sopenharmony_ci	__le32			feature;
328162306a36Sopenharmony_ci	__le32			param_len;
328262306a36Sopenharmony_ci	__le32			params[8];
328362306a36Sopenharmony_ci};
328462306a36Sopenharmony_ci
328562306a36Sopenharmony_cistruct sli4_rqst_cmn_set_features_dif_seed {
328662306a36Sopenharmony_ci	__le16		seed;
328762306a36Sopenharmony_ci	__le16		rsvd16;
328862306a36Sopenharmony_ci};
328962306a36Sopenharmony_ci
329062306a36Sopenharmony_cienum sli4_rqst_set_mrq_features {
329162306a36Sopenharmony_ci	SLI4_RQ_MULTIRQ_ISR		 = 0x1,
329262306a36Sopenharmony_ci	SLI4_RQ_MULTIRQ_AUTOGEN_XFER_RDY = 0x2,
329362306a36Sopenharmony_ci
329462306a36Sopenharmony_ci	SLI4_RQ_MULTIRQ_NUM_RQS		 = 0xff,
329562306a36Sopenharmony_ci	SLI4_RQ_MULTIRQ_RQ_SELECT	 = 0xf00,
329662306a36Sopenharmony_ci};
329762306a36Sopenharmony_ci
329862306a36Sopenharmony_cistruct sli4_rqst_cmn_set_features_multirq {
329962306a36Sopenharmony_ci	__le32		auto_gen_xfer_dword;
330062306a36Sopenharmony_ci	__le32		num_rqs_dword;
330162306a36Sopenharmony_ci};
330262306a36Sopenharmony_ci
330362306a36Sopenharmony_cienum sli4_rqst_health_check_flags {
330462306a36Sopenharmony_ci	SLI4_RQ_HEALTH_CHECK_ENABLE	= 0x1,
330562306a36Sopenharmony_ci	SLI4_RQ_HEALTH_CHECK_QUERY	= 0x2,
330662306a36Sopenharmony_ci};
330762306a36Sopenharmony_ci
330862306a36Sopenharmony_cistruct sli4_rqst_cmn_set_features_health_check {
330962306a36Sopenharmony_ci	__le32		health_check_dword;
331062306a36Sopenharmony_ci};
331162306a36Sopenharmony_ci
331262306a36Sopenharmony_cistruct sli4_rqst_cmn_set_features_set_fdt_xfer_hint {
331362306a36Sopenharmony_ci	__le32		fdt_xfer_hint;
331462306a36Sopenharmony_ci};
331562306a36Sopenharmony_ci
331662306a36Sopenharmony_cistruct sli4_rqst_dmtf_exec_clp_cmd {
331762306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
331862306a36Sopenharmony_ci	__le32			cmd_buf_length;
331962306a36Sopenharmony_ci	__le32			resp_buf_length;
332062306a36Sopenharmony_ci	__le32			cmd_buf_addr_low;
332162306a36Sopenharmony_ci	__le32			cmd_buf_addr_high;
332262306a36Sopenharmony_ci	__le32			resp_buf_addr_low;
332362306a36Sopenharmony_ci	__le32			resp_buf_addr_high;
332462306a36Sopenharmony_ci};
332562306a36Sopenharmony_ci
332662306a36Sopenharmony_cistruct sli4_rsp_dmtf_exec_clp_cmd {
332762306a36Sopenharmony_ci	struct sli4_rsp_hdr	hdr;
332862306a36Sopenharmony_ci	__le32			rsvd4;
332962306a36Sopenharmony_ci	__le32			resp_length;
333062306a36Sopenharmony_ci	__le32			rsvd6;
333162306a36Sopenharmony_ci	__le32			rsvd7;
333262306a36Sopenharmony_ci	__le32			rsvd8;
333362306a36Sopenharmony_ci	__le32			rsvd9;
333462306a36Sopenharmony_ci	__le32			clp_status;
333562306a36Sopenharmony_ci	__le32			clp_detailed_status;
333662306a36Sopenharmony_ci};
333762306a36Sopenharmony_ci
333862306a36Sopenharmony_ci#define SLI4_PROTOCOL_FC		0x10
333962306a36Sopenharmony_ci#define SLI4_PROTOCOL_DEFAULT		0xff
334062306a36Sopenharmony_ci
334162306a36Sopenharmony_cistruct sli4_rspource_descriptor_v1 {
334262306a36Sopenharmony_ci	u8		descriptor_type;
334362306a36Sopenharmony_ci	u8		descriptor_length;
334462306a36Sopenharmony_ci	__le16		rsvd16;
334562306a36Sopenharmony_ci	__le32		type_specific[];
334662306a36Sopenharmony_ci};
334762306a36Sopenharmony_ci
334862306a36Sopenharmony_cienum sli4_pcie_desc_flags {
334962306a36Sopenharmony_ci	SLI4_PCIE_DESC_IMM		= 0x4000,
335062306a36Sopenharmony_ci	SLI4_PCIE_DESC_NOSV		= 0x8000,
335162306a36Sopenharmony_ci
335262306a36Sopenharmony_ci	SLI4_PCIE_DESC_PF_NO		= 0x3ff0000,
335362306a36Sopenharmony_ci
335462306a36Sopenharmony_ci	SLI4_PCIE_DESC_MISSN_ROLE	= 0xff,
335562306a36Sopenharmony_ci	SLI4_PCIE_DESC_PCHG		= 0x8000000,
335662306a36Sopenharmony_ci	SLI4_PCIE_DESC_SCHG		= 0x10000000,
335762306a36Sopenharmony_ci	SLI4_PCIE_DESC_XCHG		= 0x20000000,
335862306a36Sopenharmony_ci	SLI4_PCIE_DESC_XROM		= 0xc0000000
335962306a36Sopenharmony_ci};
336062306a36Sopenharmony_ci
336162306a36Sopenharmony_cistruct sli4_pcie_resource_descriptor_v1 {
336262306a36Sopenharmony_ci	u8		descriptor_type;
336362306a36Sopenharmony_ci	u8		descriptor_length;
336462306a36Sopenharmony_ci	__le16		imm_nosv_dword;
336562306a36Sopenharmony_ci	__le32		pf_number_dword;
336662306a36Sopenharmony_ci	__le32		rsvd3;
336762306a36Sopenharmony_ci	u8		sriov_state;
336862306a36Sopenharmony_ci	u8		pf_state;
336962306a36Sopenharmony_ci	u8		pf_type;
337062306a36Sopenharmony_ci	u8		rsvd4;
337162306a36Sopenharmony_ci	__le16		number_of_vfs;
337262306a36Sopenharmony_ci	__le16		rsvd5;
337362306a36Sopenharmony_ci	__le32		mission_roles_dword;
337462306a36Sopenharmony_ci	__le32		rsvd7[16];
337562306a36Sopenharmony_ci};
337662306a36Sopenharmony_ci
337762306a36Sopenharmony_cistruct sli4_rqst_cmn_get_function_config {
337862306a36Sopenharmony_ci	struct sli4_rqst_hdr  hdr;
337962306a36Sopenharmony_ci};
338062306a36Sopenharmony_ci
338162306a36Sopenharmony_cistruct sli4_rsp_cmn_get_function_config {
338262306a36Sopenharmony_ci	struct sli4_rsp_hdr	hdr;
338362306a36Sopenharmony_ci	__le32			desc_count;
338462306a36Sopenharmony_ci	__le32			desc[54];
338562306a36Sopenharmony_ci};
338662306a36Sopenharmony_ci
338762306a36Sopenharmony_ci/* Link Config Descriptor for link config functions */
338862306a36Sopenharmony_cistruct sli4_link_config_descriptor {
338962306a36Sopenharmony_ci	u8		link_config_id;
339062306a36Sopenharmony_ci	u8		rsvd1[3];
339162306a36Sopenharmony_ci	__le32		config_description[8];
339262306a36Sopenharmony_ci};
339362306a36Sopenharmony_ci
339462306a36Sopenharmony_ci#define MAX_LINK_DES	10
339562306a36Sopenharmony_ci
339662306a36Sopenharmony_cistruct sli4_rqst_cmn_get_reconfig_link_info {
339762306a36Sopenharmony_ci	struct sli4_rqst_hdr  hdr;
339862306a36Sopenharmony_ci};
339962306a36Sopenharmony_ci
340062306a36Sopenharmony_cistruct sli4_rsp_cmn_get_reconfig_link_info {
340162306a36Sopenharmony_ci	struct sli4_rsp_hdr	hdr;
340262306a36Sopenharmony_ci	u8			active_link_config_id;
340362306a36Sopenharmony_ci	u8			rsvd17;
340462306a36Sopenharmony_ci	u8			next_link_config_id;
340562306a36Sopenharmony_ci	u8			rsvd19;
340662306a36Sopenharmony_ci	__le32			link_configuration_descriptor_count;
340762306a36Sopenharmony_ci	struct sli4_link_config_descriptor
340862306a36Sopenharmony_ci				desc[MAX_LINK_DES];
340962306a36Sopenharmony_ci};
341062306a36Sopenharmony_ci
341162306a36Sopenharmony_cienum sli4_set_reconfig_link_flags {
341262306a36Sopenharmony_ci	SLI4_SET_RECONFIG_LINKID_NEXT	= 0xff,
341362306a36Sopenharmony_ci	SLI4_SET_RECONFIG_LINKID_FD	= 1u << 31,
341462306a36Sopenharmony_ci};
341562306a36Sopenharmony_ci
341662306a36Sopenharmony_cistruct sli4_rqst_cmn_set_reconfig_link_id {
341762306a36Sopenharmony_ci	struct sli4_rqst_hdr  hdr;
341862306a36Sopenharmony_ci	__le32			dw4_flags;
341962306a36Sopenharmony_ci};
342062306a36Sopenharmony_ci
342162306a36Sopenharmony_cistruct sli4_rsp_cmn_set_reconfig_link_id {
342262306a36Sopenharmony_ci	struct sli4_rsp_hdr	hdr;
342362306a36Sopenharmony_ci};
342462306a36Sopenharmony_ci
342562306a36Sopenharmony_cistruct sli4_rqst_lowlevel_set_watchdog {
342662306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
342762306a36Sopenharmony_ci	__le16			watchdog_timeout;
342862306a36Sopenharmony_ci	__le16			rsvd18;
342962306a36Sopenharmony_ci};
343062306a36Sopenharmony_ci
343162306a36Sopenharmony_cistruct sli4_rsp_lowlevel_set_watchdog {
343262306a36Sopenharmony_ci	struct sli4_rsp_hdr	hdr;
343362306a36Sopenharmony_ci	__le32			rsvd;
343462306a36Sopenharmony_ci};
343562306a36Sopenharmony_ci
343662306a36Sopenharmony_ci/* FC opcode (OPC) values */
343762306a36Sopenharmony_cienum sli4_fc_opcodes {
343862306a36Sopenharmony_ci	SLI4_OPC_WQ_CREATE		= 0x1,
343962306a36Sopenharmony_ci	SLI4_OPC_WQ_DESTROY		= 0x2,
344062306a36Sopenharmony_ci	SLI4_OPC_POST_SGL_PAGES		= 0x3,
344162306a36Sopenharmony_ci	SLI4_OPC_RQ_CREATE		= 0x5,
344262306a36Sopenharmony_ci	SLI4_OPC_RQ_DESTROY		= 0x6,
344362306a36Sopenharmony_ci	SLI4_OPC_READ_FCF_TABLE		= 0x8,
344462306a36Sopenharmony_ci	SLI4_OPC_POST_HDR_TEMPLATES	= 0xb,
344562306a36Sopenharmony_ci	SLI4_OPC_REDISCOVER_FCF		= 0x10,
344662306a36Sopenharmony_ci};
344762306a36Sopenharmony_ci
344862306a36Sopenharmony_ci/* Use the default CQ associated with the WQ */
344962306a36Sopenharmony_ci#define SLI4_CQ_DEFAULT 0xffff
345062306a36Sopenharmony_ci
345162306a36Sopenharmony_ci/*
345262306a36Sopenharmony_ci * POST_SGL_PAGES
345362306a36Sopenharmony_ci *
345462306a36Sopenharmony_ci * Register the scatter gather list (SGL) memory and
345562306a36Sopenharmony_ci * associate it with an XRI.
345662306a36Sopenharmony_ci */
345762306a36Sopenharmony_cistruct sli4_rqst_post_sgl_pages {
345862306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
345962306a36Sopenharmony_ci	__le16			xri_start;
346062306a36Sopenharmony_ci	__le16			xri_count;
346162306a36Sopenharmony_ci	struct {
346262306a36Sopenharmony_ci		__le32		page0_low;
346362306a36Sopenharmony_ci		__le32		page0_high;
346462306a36Sopenharmony_ci		__le32		page1_low;
346562306a36Sopenharmony_ci		__le32		page1_high;
346662306a36Sopenharmony_ci	} page_set[10];
346762306a36Sopenharmony_ci};
346862306a36Sopenharmony_ci
346962306a36Sopenharmony_cistruct sli4_rsp_post_sgl_pages {
347062306a36Sopenharmony_ci	struct sli4_rsp_hdr	hdr;
347162306a36Sopenharmony_ci};
347262306a36Sopenharmony_ci
347362306a36Sopenharmony_cistruct sli4_rqst_post_hdr_templates {
347462306a36Sopenharmony_ci	struct sli4_rqst_hdr	hdr;
347562306a36Sopenharmony_ci	__le16			rpi_offset;
347662306a36Sopenharmony_ci	__le16			page_count;
347762306a36Sopenharmony_ci	struct sli4_dmaaddr	page_descriptor[];
347862306a36Sopenharmony_ci};
347962306a36Sopenharmony_ci
348062306a36Sopenharmony_ci#define SLI4_HDR_TEMPLATE_SIZE		64
348162306a36Sopenharmony_ci
348262306a36Sopenharmony_cienum sli4_io_flags {
348362306a36Sopenharmony_ci/* The XRI associated with this IO is already active */
348462306a36Sopenharmony_ci	SLI4_IO_CONTINUATION		= 1 << 0,
348562306a36Sopenharmony_ci/* Automatically generate a good RSP frame */
348662306a36Sopenharmony_ci	SLI4_IO_AUTO_GOOD_RESPONSE	= 1 << 1,
348762306a36Sopenharmony_ci	SLI4_IO_NO_ABORT		= 1 << 2,
348862306a36Sopenharmony_ci/* Set the DNRX bit because no auto xref rdy buffer is posted */
348962306a36Sopenharmony_ci	SLI4_IO_DNRX			= 1 << 3,
349062306a36Sopenharmony_ci};
349162306a36Sopenharmony_ci
349262306a36Sopenharmony_cienum sli4_callback {
349362306a36Sopenharmony_ci	SLI4_CB_LINK,
349462306a36Sopenharmony_ci	SLI4_CB_MAX,
349562306a36Sopenharmony_ci};
349662306a36Sopenharmony_ci
349762306a36Sopenharmony_cienum sli4_link_status {
349862306a36Sopenharmony_ci	SLI4_LINK_STATUS_UP,
349962306a36Sopenharmony_ci	SLI4_LINK_STATUS_DOWN,
350062306a36Sopenharmony_ci	SLI4_LINK_STATUS_NO_ALPA,
350162306a36Sopenharmony_ci	SLI4_LINK_STATUS_MAX,
350262306a36Sopenharmony_ci};
350362306a36Sopenharmony_ci
350462306a36Sopenharmony_cienum sli4_link_topology {
350562306a36Sopenharmony_ci	SLI4_LINK_TOPO_NON_FC_AL = 1,
350662306a36Sopenharmony_ci	SLI4_LINK_TOPO_FC_AL,
350762306a36Sopenharmony_ci	SLI4_LINK_TOPO_LOOPBACK_INTERNAL,
350862306a36Sopenharmony_ci	SLI4_LINK_TOPO_LOOPBACK_EXTERNAL,
350962306a36Sopenharmony_ci	SLI4_LINK_TOPO_NONE,
351062306a36Sopenharmony_ci	SLI4_LINK_TOPO_MAX,
351162306a36Sopenharmony_ci};
351262306a36Sopenharmony_ci
351362306a36Sopenharmony_cienum sli4_link_medium {
351462306a36Sopenharmony_ci	SLI4_LINK_MEDIUM_ETHERNET,
351562306a36Sopenharmony_ci	SLI4_LINK_MEDIUM_FC,
351662306a36Sopenharmony_ci	SLI4_LINK_MEDIUM_MAX,
351762306a36Sopenharmony_ci};
351862306a36Sopenharmony_ci/******Driver specific structures******/
351962306a36Sopenharmony_ci
352062306a36Sopenharmony_cistruct sli4_queue {
352162306a36Sopenharmony_ci	/* Common to all queue types */
352262306a36Sopenharmony_ci	struct efc_dma	dma;
352362306a36Sopenharmony_ci	spinlock_t	lock;		/* Lock to protect the doorbell register
352462306a36Sopenharmony_ci					 * writes and queue reads
352562306a36Sopenharmony_ci					 */
352662306a36Sopenharmony_ci	u32		index;		/* current host entry index */
352762306a36Sopenharmony_ci	u16		size;		/* entry size */
352862306a36Sopenharmony_ci	u16		length;		/* number of entries */
352962306a36Sopenharmony_ci	u16		n_posted;	/* number entries posted for CQ, EQ */
353062306a36Sopenharmony_ci	u16		id;		/* Port assigned xQ_ID */
353162306a36Sopenharmony_ci	u8		type;		/* queue type ie EQ, CQ, ... */
353262306a36Sopenharmony_ci	void __iomem    *db_regaddr;	/* register address for the doorbell */
353362306a36Sopenharmony_ci	u16		phase;		/* For if_type = 6, this value toggle
353462306a36Sopenharmony_ci					 * for each iteration of the queue,
353562306a36Sopenharmony_ci					 * a queue entry is valid when a cqe
353662306a36Sopenharmony_ci					 * valid bit matches this value
353762306a36Sopenharmony_ci					 */
353862306a36Sopenharmony_ci	u32		proc_limit;	/* limit CQE processed per iteration */
353962306a36Sopenharmony_ci	u32		posted_limit;	/* CQE/EQE process before ring db */
354062306a36Sopenharmony_ci	u32		max_num_processed;
354162306a36Sopenharmony_ci	u64		max_process_time;
354262306a36Sopenharmony_ci	union {
354362306a36Sopenharmony_ci		u32	r_idx;		/* "read" index (MQ only) */
354462306a36Sopenharmony_ci		u32	flag;
354562306a36Sopenharmony_ci	} u;
354662306a36Sopenharmony_ci};
354762306a36Sopenharmony_ci
354862306a36Sopenharmony_ci/* Parameters used to populate WQE*/
354962306a36Sopenharmony_cistruct sli_bls_params {
355062306a36Sopenharmony_ci	u32		s_id;
355162306a36Sopenharmony_ci	u32		d_id;
355262306a36Sopenharmony_ci	u16		ox_id;
355362306a36Sopenharmony_ci	u16		rx_id;
355462306a36Sopenharmony_ci	u32		rpi;
355562306a36Sopenharmony_ci	u32		vpi;
355662306a36Sopenharmony_ci	bool		rpi_registered;
355762306a36Sopenharmony_ci	u8		payload[12];
355862306a36Sopenharmony_ci	u16		xri;
355962306a36Sopenharmony_ci	u16		tag;
356062306a36Sopenharmony_ci};
356162306a36Sopenharmony_ci
356262306a36Sopenharmony_cistruct sli_els_params {
356362306a36Sopenharmony_ci	u32		s_id;
356462306a36Sopenharmony_ci	u32		d_id;
356562306a36Sopenharmony_ci	u16		ox_id;
356662306a36Sopenharmony_ci	u32		rpi;
356762306a36Sopenharmony_ci	u32		vpi;
356862306a36Sopenharmony_ci	bool		rpi_registered;
356962306a36Sopenharmony_ci	u32		xmit_len;
357062306a36Sopenharmony_ci	u32		rsp_len;
357162306a36Sopenharmony_ci	u8		timeout;
357262306a36Sopenharmony_ci	u8		cmd;
357362306a36Sopenharmony_ci	u16		xri;
357462306a36Sopenharmony_ci	u16		tag;
357562306a36Sopenharmony_ci};
357662306a36Sopenharmony_ci
357762306a36Sopenharmony_cistruct sli_ct_params {
357862306a36Sopenharmony_ci	u8		r_ctl;
357962306a36Sopenharmony_ci	u8		type;
358062306a36Sopenharmony_ci	u8		df_ctl;
358162306a36Sopenharmony_ci	u8		timeout;
358262306a36Sopenharmony_ci	u16		ox_id;
358362306a36Sopenharmony_ci	u32		d_id;
358462306a36Sopenharmony_ci	u32		rpi;
358562306a36Sopenharmony_ci	u32		vpi;
358662306a36Sopenharmony_ci	bool		rpi_registered;
358762306a36Sopenharmony_ci	u32		xmit_len;
358862306a36Sopenharmony_ci	u32		rsp_len;
358962306a36Sopenharmony_ci	u16		xri;
359062306a36Sopenharmony_ci	u16		tag;
359162306a36Sopenharmony_ci};
359262306a36Sopenharmony_ci
359362306a36Sopenharmony_cistruct sli_fcp_tgt_params {
359462306a36Sopenharmony_ci	u32		s_id;
359562306a36Sopenharmony_ci	u32		d_id;
359662306a36Sopenharmony_ci	u32		rpi;
359762306a36Sopenharmony_ci	u32		vpi;
359862306a36Sopenharmony_ci	u32		offset;
359962306a36Sopenharmony_ci	u16		ox_id;
360062306a36Sopenharmony_ci	u16		flags;
360162306a36Sopenharmony_ci	u8		cs_ctl;
360262306a36Sopenharmony_ci	u8		timeout;
360362306a36Sopenharmony_ci	u32		app_id;
360462306a36Sopenharmony_ci	u32		xmit_len;
360562306a36Sopenharmony_ci	u16		xri;
360662306a36Sopenharmony_ci	u16		tag;
360762306a36Sopenharmony_ci};
360862306a36Sopenharmony_ci
360962306a36Sopenharmony_cistruct sli4_link_event {
361062306a36Sopenharmony_ci	enum sli4_link_status	status;
361162306a36Sopenharmony_ci	enum sli4_link_topology	topology;
361262306a36Sopenharmony_ci	enum sli4_link_medium	medium;
361362306a36Sopenharmony_ci	u32			speed;
361462306a36Sopenharmony_ci	u8			*loop_map;
361562306a36Sopenharmony_ci	u32			fc_id;
361662306a36Sopenharmony_ci};
361762306a36Sopenharmony_ci
361862306a36Sopenharmony_cienum sli4_resource {
361962306a36Sopenharmony_ci	SLI4_RSRC_VFI,
362062306a36Sopenharmony_ci	SLI4_RSRC_VPI,
362162306a36Sopenharmony_ci	SLI4_RSRC_RPI,
362262306a36Sopenharmony_ci	SLI4_RSRC_XRI,
362362306a36Sopenharmony_ci	SLI4_RSRC_FCFI,
362462306a36Sopenharmony_ci	SLI4_RSRC_MAX,
362562306a36Sopenharmony_ci};
362662306a36Sopenharmony_ci
362762306a36Sopenharmony_cistruct sli4_extent {
362862306a36Sopenharmony_ci	u32		number;
362962306a36Sopenharmony_ci	u32		size;
363062306a36Sopenharmony_ci	u32		n_alloc;
363162306a36Sopenharmony_ci	u32		*base;
363262306a36Sopenharmony_ci	unsigned long	*use_map;
363362306a36Sopenharmony_ci	u32		map_size;
363462306a36Sopenharmony_ci};
363562306a36Sopenharmony_ci
363662306a36Sopenharmony_cistruct sli4_queue_info {
363762306a36Sopenharmony_ci	u16	max_qcount[SLI4_QTYPE_MAX];
363862306a36Sopenharmony_ci	u32	max_qentries[SLI4_QTYPE_MAX];
363962306a36Sopenharmony_ci	u16	count_mask[SLI4_QTYPE_MAX];
364062306a36Sopenharmony_ci	u16	count_method[SLI4_QTYPE_MAX];
364162306a36Sopenharmony_ci	u32	qpage_count[SLI4_QTYPE_MAX];
364262306a36Sopenharmony_ci};
364362306a36Sopenharmony_ci
364462306a36Sopenharmony_cistruct sli4_params {
364562306a36Sopenharmony_ci	u8	has_extents;
364662306a36Sopenharmony_ci	u8	auto_reg;
364762306a36Sopenharmony_ci	u8	auto_xfer_rdy;
364862306a36Sopenharmony_ci	u8	hdr_template_req;
364962306a36Sopenharmony_ci	u8	perf_hint;
365062306a36Sopenharmony_ci	u8	perf_wq_id_association;
365162306a36Sopenharmony_ci	u8	cq_create_version;
365262306a36Sopenharmony_ci	u8	mq_create_version;
365362306a36Sopenharmony_ci	u8	high_login_mode;
365462306a36Sopenharmony_ci	u8	sgl_pre_registered;
365562306a36Sopenharmony_ci	u8	sgl_pre_reg_required;
365662306a36Sopenharmony_ci	u8	t10_dif_inline_capable;
365762306a36Sopenharmony_ci	u8	t10_dif_separate_capable;
365862306a36Sopenharmony_ci};
365962306a36Sopenharmony_ci
366062306a36Sopenharmony_cistruct sli4 {
366162306a36Sopenharmony_ci	void			*os;
366262306a36Sopenharmony_ci	struct pci_dev		*pci;
366362306a36Sopenharmony_ci	void __iomem		*reg[PCI_STD_NUM_BARS];
366462306a36Sopenharmony_ci
366562306a36Sopenharmony_ci	u32			sli_rev;
366662306a36Sopenharmony_ci	u32			sli_family;
366762306a36Sopenharmony_ci	u32			if_type;
366862306a36Sopenharmony_ci
366962306a36Sopenharmony_ci	u16			asic_type;
367062306a36Sopenharmony_ci	u16			asic_rev;
367162306a36Sopenharmony_ci
367262306a36Sopenharmony_ci	u16			e_d_tov;
367362306a36Sopenharmony_ci	u16			r_a_tov;
367462306a36Sopenharmony_ci	struct sli4_queue_info	qinfo;
367562306a36Sopenharmony_ci	u16			link_module_type;
367662306a36Sopenharmony_ci	u8			rq_batch;
367762306a36Sopenharmony_ci	u8			port_number;
367862306a36Sopenharmony_ci	char			port_name[2];
367962306a36Sopenharmony_ci	u16			rq_min_buf_size;
368062306a36Sopenharmony_ci	u32			rq_max_buf_size;
368162306a36Sopenharmony_ci	u8			topology;
368262306a36Sopenharmony_ci	u8			wwpn[8];
368362306a36Sopenharmony_ci	u8			wwnn[8];
368462306a36Sopenharmony_ci	u32			fw_rev[2];
368562306a36Sopenharmony_ci	u8			fw_name[2][16];
368662306a36Sopenharmony_ci	char			ipl_name[16];
368762306a36Sopenharmony_ci	u32			hw_rev[3];
368862306a36Sopenharmony_ci	char			modeldesc[64];
368962306a36Sopenharmony_ci	char			bios_version_string[32];
369062306a36Sopenharmony_ci	u32			wqe_size;
369162306a36Sopenharmony_ci	u32			vpd_length;
369262306a36Sopenharmony_ci	/*
369362306a36Sopenharmony_ci	 * Tracks the port resources using extents metaphor. For
369462306a36Sopenharmony_ci	 * devices that don't implement extents (i.e.
369562306a36Sopenharmony_ci	 * has_extents == FALSE), the code models each resource as
369662306a36Sopenharmony_ci	 * a single large extent.
369762306a36Sopenharmony_ci	 */
369862306a36Sopenharmony_ci	struct sli4_extent	ext[SLI4_RSRC_MAX];
369962306a36Sopenharmony_ci	u32			features;
370062306a36Sopenharmony_ci	struct sli4_params	params;
370162306a36Sopenharmony_ci	u32			sge_supported_length;
370262306a36Sopenharmony_ci	u32			sgl_page_sizes;
370362306a36Sopenharmony_ci	u32			max_sgl_pages;
370462306a36Sopenharmony_ci
370562306a36Sopenharmony_ci	/*
370662306a36Sopenharmony_ci	 * Callback functions
370762306a36Sopenharmony_ci	 */
370862306a36Sopenharmony_ci	int			(*link)(void *ctx, void *event);
370962306a36Sopenharmony_ci	void			*link_arg;
371062306a36Sopenharmony_ci
371162306a36Sopenharmony_ci	struct efc_dma		bmbx;
371262306a36Sopenharmony_ci
371362306a36Sopenharmony_ci	/* Save pointer to physical memory descriptor for non-embedded
371462306a36Sopenharmony_ci	 * SLI_CONFIG commands for BMBX dumping purposes
371562306a36Sopenharmony_ci	 */
371662306a36Sopenharmony_ci	struct efc_dma		*bmbx_non_emb_pmd;
371762306a36Sopenharmony_ci
371862306a36Sopenharmony_ci	struct efc_dma		vpd_data;
371962306a36Sopenharmony_ci};
372062306a36Sopenharmony_ci
372162306a36Sopenharmony_cistatic inline void
372262306a36Sopenharmony_cisli_cmd_fill_hdr(struct sli4_rqst_hdr *hdr, u8 opc, u8 sub, u32 ver, __le32 len)
372362306a36Sopenharmony_ci{
372462306a36Sopenharmony_ci	hdr->opcode = opc;
372562306a36Sopenharmony_ci	hdr->subsystem = sub;
372662306a36Sopenharmony_ci	hdr->dw3_version = cpu_to_le32(ver);
372762306a36Sopenharmony_ci	hdr->request_length = len;
372862306a36Sopenharmony_ci}
372962306a36Sopenharmony_ci
373062306a36Sopenharmony_ci/**
373162306a36Sopenharmony_ci * Get / set parameter functions
373262306a36Sopenharmony_ci */
373362306a36Sopenharmony_ci
373462306a36Sopenharmony_cistatic inline u32
373562306a36Sopenharmony_cisli_get_max_sge(struct sli4 *sli4)
373662306a36Sopenharmony_ci{
373762306a36Sopenharmony_ci	return sli4->sge_supported_length;
373862306a36Sopenharmony_ci}
373962306a36Sopenharmony_ci
374062306a36Sopenharmony_cistatic inline u32
374162306a36Sopenharmony_cisli_get_max_sgl(struct sli4 *sli4)
374262306a36Sopenharmony_ci{
374362306a36Sopenharmony_ci	if (sli4->sgl_page_sizes != 1) {
374462306a36Sopenharmony_ci		efc_log_err(sli4, "unsupported SGL page sizes %#x\n",
374562306a36Sopenharmony_ci			    sli4->sgl_page_sizes);
374662306a36Sopenharmony_ci		return 0;
374762306a36Sopenharmony_ci	}
374862306a36Sopenharmony_ci
374962306a36Sopenharmony_ci	return (sli4->max_sgl_pages * SLI_PAGE_SIZE) / sizeof(struct sli4_sge);
375062306a36Sopenharmony_ci}
375162306a36Sopenharmony_ci
375262306a36Sopenharmony_cistatic inline enum sli4_link_medium
375362306a36Sopenharmony_cisli_get_medium(struct sli4 *sli4)
375462306a36Sopenharmony_ci{
375562306a36Sopenharmony_ci	switch (sli4->topology) {
375662306a36Sopenharmony_ci	case SLI4_READ_CFG_TOPO_FC:
375762306a36Sopenharmony_ci	case SLI4_READ_CFG_TOPO_FC_AL:
375862306a36Sopenharmony_ci	case SLI4_READ_CFG_TOPO_NON_FC_AL:
375962306a36Sopenharmony_ci		return SLI4_LINK_MEDIUM_FC;
376062306a36Sopenharmony_ci	default:
376162306a36Sopenharmony_ci		return SLI4_LINK_MEDIUM_MAX;
376262306a36Sopenharmony_ci	}
376362306a36Sopenharmony_ci}
376462306a36Sopenharmony_ci
376562306a36Sopenharmony_cistatic inline u32
376662306a36Sopenharmony_cisli_get_lmt(struct sli4 *sli4)
376762306a36Sopenharmony_ci{
376862306a36Sopenharmony_ci	return sli4->link_module_type;
376962306a36Sopenharmony_ci}
377062306a36Sopenharmony_ci
377162306a36Sopenharmony_cistatic inline int
377262306a36Sopenharmony_cisli_set_topology(struct sli4 *sli4, u32 value)
377362306a36Sopenharmony_ci{
377462306a36Sopenharmony_ci	int	rc = 0;
377562306a36Sopenharmony_ci
377662306a36Sopenharmony_ci	switch (value) {
377762306a36Sopenharmony_ci	case SLI4_READ_CFG_TOPO_FC:
377862306a36Sopenharmony_ci	case SLI4_READ_CFG_TOPO_FC_AL:
377962306a36Sopenharmony_ci	case SLI4_READ_CFG_TOPO_NON_FC_AL:
378062306a36Sopenharmony_ci		sli4->topology = value;
378162306a36Sopenharmony_ci		break;
378262306a36Sopenharmony_ci	default:
378362306a36Sopenharmony_ci		efc_log_err(sli4, "unsupported topology %#x\n", value);
378462306a36Sopenharmony_ci		rc = -1;
378562306a36Sopenharmony_ci	}
378662306a36Sopenharmony_ci
378762306a36Sopenharmony_ci	return rc;
378862306a36Sopenharmony_ci}
378962306a36Sopenharmony_ci
379062306a36Sopenharmony_cistatic inline u32
379162306a36Sopenharmony_cisli_convert_mask_to_count(u32 method, u32 mask)
379262306a36Sopenharmony_ci{
379362306a36Sopenharmony_ci	u32 count = 0;
379462306a36Sopenharmony_ci
379562306a36Sopenharmony_ci	if (method) {
379662306a36Sopenharmony_ci		count = 1 << (31 - __builtin_clz(mask));
379762306a36Sopenharmony_ci		count *= 16;
379862306a36Sopenharmony_ci	} else {
379962306a36Sopenharmony_ci		count = mask;
380062306a36Sopenharmony_ci	}
380162306a36Sopenharmony_ci
380262306a36Sopenharmony_ci	return count;
380362306a36Sopenharmony_ci}
380462306a36Sopenharmony_ci
380562306a36Sopenharmony_cistatic inline u32
380662306a36Sopenharmony_cisli_reg_read_status(struct sli4 *sli)
380762306a36Sopenharmony_ci{
380862306a36Sopenharmony_ci	return readl(sli->reg[0] + SLI4_PORT_STATUS_REGOFF);
380962306a36Sopenharmony_ci}
381062306a36Sopenharmony_ci
381162306a36Sopenharmony_cistatic inline int
381262306a36Sopenharmony_cisli_fw_error_status(struct sli4 *sli4)
381362306a36Sopenharmony_ci{
381462306a36Sopenharmony_ci	return (sli_reg_read_status(sli4) & SLI4_PORT_STATUS_ERR) ? 1 : 0;
381562306a36Sopenharmony_ci}
381662306a36Sopenharmony_ci
381762306a36Sopenharmony_cistatic inline u32
381862306a36Sopenharmony_cisli_reg_read_err1(struct sli4 *sli)
381962306a36Sopenharmony_ci{
382062306a36Sopenharmony_ci	return readl(sli->reg[0] + SLI4_PORT_ERROR1);
382162306a36Sopenharmony_ci}
382262306a36Sopenharmony_ci
382362306a36Sopenharmony_cistatic inline u32
382462306a36Sopenharmony_cisli_reg_read_err2(struct sli4 *sli)
382562306a36Sopenharmony_ci{
382662306a36Sopenharmony_ci	return readl(sli->reg[0] + SLI4_PORT_ERROR2);
382762306a36Sopenharmony_ci}
382862306a36Sopenharmony_ci
382962306a36Sopenharmony_cistatic inline int
383062306a36Sopenharmony_cisli_fc_rqe_length(struct sli4 *sli4, void *cqe, u32 *len_hdr,
383162306a36Sopenharmony_ci		  u32 *len_data)
383262306a36Sopenharmony_ci{
383362306a36Sopenharmony_ci	struct sli4_fc_async_rcqe	*rcqe = cqe;
383462306a36Sopenharmony_ci
383562306a36Sopenharmony_ci	*len_hdr = *len_data = 0;
383662306a36Sopenharmony_ci
383762306a36Sopenharmony_ci	if (rcqe->status == SLI4_FC_ASYNC_RQ_SUCCESS) {
383862306a36Sopenharmony_ci		*len_hdr  = rcqe->hdpl_byte & SLI4_RACQE_HDPL;
383962306a36Sopenharmony_ci		*len_data = le16_to_cpu(rcqe->data_placement_length);
384062306a36Sopenharmony_ci		return 0;
384162306a36Sopenharmony_ci	} else {
384262306a36Sopenharmony_ci		return -1;
384362306a36Sopenharmony_ci	}
384462306a36Sopenharmony_ci}
384562306a36Sopenharmony_ci
384662306a36Sopenharmony_cistatic inline u8
384762306a36Sopenharmony_cisli_fc_rqe_fcfi(struct sli4 *sli4, void *cqe)
384862306a36Sopenharmony_ci{
384962306a36Sopenharmony_ci	u8 code = ((u8 *)cqe)[SLI4_CQE_CODE_OFFSET];
385062306a36Sopenharmony_ci	u8 fcfi = U8_MAX;
385162306a36Sopenharmony_ci
385262306a36Sopenharmony_ci	switch (code) {
385362306a36Sopenharmony_ci	case SLI4_CQE_CODE_RQ_ASYNC: {
385462306a36Sopenharmony_ci		struct sli4_fc_async_rcqe *rcqe = cqe;
385562306a36Sopenharmony_ci
385662306a36Sopenharmony_ci		fcfi = le16_to_cpu(rcqe->fcfi_rq_id_word) & SLI4_RACQE_FCFI;
385762306a36Sopenharmony_ci		break;
385862306a36Sopenharmony_ci	}
385962306a36Sopenharmony_ci	case SLI4_CQE_CODE_RQ_ASYNC_V1: {
386062306a36Sopenharmony_ci		struct sli4_fc_async_rcqe_v1 *rcqev1 = cqe;
386162306a36Sopenharmony_ci
386262306a36Sopenharmony_ci		fcfi = rcqev1->fcfi_byte & SLI4_RACQE_FCFI;
386362306a36Sopenharmony_ci		break;
386462306a36Sopenharmony_ci	}
386562306a36Sopenharmony_ci	case SLI4_CQE_CODE_OPTIMIZED_WRITE_CMD: {
386662306a36Sopenharmony_ci		struct sli4_fc_optimized_write_cmd_cqe *opt_wr = cqe;
386762306a36Sopenharmony_ci
386862306a36Sopenharmony_ci		fcfi = opt_wr->flags0 & SLI4_OCQE_FCFI;
386962306a36Sopenharmony_ci		break;
387062306a36Sopenharmony_ci	}
387162306a36Sopenharmony_ci	}
387262306a36Sopenharmony_ci
387362306a36Sopenharmony_ci	return fcfi;
387462306a36Sopenharmony_ci}
387562306a36Sopenharmony_ci
387662306a36Sopenharmony_ci/****************************************************************************
387762306a36Sopenharmony_ci * Function prototypes
387862306a36Sopenharmony_ci */
387962306a36Sopenharmony_ciint
388062306a36Sopenharmony_cisli_cmd_config_link(struct sli4 *sli4, void *buf);
388162306a36Sopenharmony_ciint
388262306a36Sopenharmony_cisli_cmd_down_link(struct sli4 *sli4, void *buf);
388362306a36Sopenharmony_ciint
388462306a36Sopenharmony_cisli_cmd_dump_type4(struct sli4 *sli4, void *buf, u16 wki);
388562306a36Sopenharmony_ciint
388662306a36Sopenharmony_cisli_cmd_common_read_transceiver_data(struct sli4 *sli4, void *buf,
388762306a36Sopenharmony_ci				     u32 page_num, struct efc_dma *dma);
388862306a36Sopenharmony_ciint
388962306a36Sopenharmony_cisli_cmd_read_link_stats(struct sli4 *sli4, void *buf, u8 req_stats,
389062306a36Sopenharmony_ci			u8 clear_overflow_flags, u8 clear_all_counters);
389162306a36Sopenharmony_ciint
389262306a36Sopenharmony_cisli_cmd_read_status(struct sli4 *sli4, void *buf, u8 clear);
389362306a36Sopenharmony_ciint
389462306a36Sopenharmony_cisli_cmd_init_link(struct sli4 *sli4, void *buf, u32 speed,
389562306a36Sopenharmony_ci		  u8 reset_alpa);
389662306a36Sopenharmony_ciint
389762306a36Sopenharmony_cisli_cmd_init_vfi(struct sli4 *sli4, void *buf, u16 vfi, u16 fcfi,
389862306a36Sopenharmony_ci		 u16 vpi);
389962306a36Sopenharmony_ciint
390062306a36Sopenharmony_cisli_cmd_init_vpi(struct sli4 *sli4, void *buf, u16 vpi, u16 vfi);
390162306a36Sopenharmony_ciint
390262306a36Sopenharmony_cisli_cmd_post_xri(struct sli4 *sli4, void *buf, u16 base, u16 cnt);
390362306a36Sopenharmony_ciint
390462306a36Sopenharmony_cisli_cmd_release_xri(struct sli4 *sli4, void *buf, u8 num_xri);
390562306a36Sopenharmony_ciint
390662306a36Sopenharmony_cisli_cmd_read_sparm64(struct sli4 *sli4, void *buf,
390762306a36Sopenharmony_ci		     struct efc_dma *dma, u16 vpi);
390862306a36Sopenharmony_ciint
390962306a36Sopenharmony_cisli_cmd_read_topology(struct sli4 *sli4, void *buf, struct efc_dma *dma);
391062306a36Sopenharmony_ciint
391162306a36Sopenharmony_cisli_cmd_read_nvparms(struct sli4 *sli4, void *buf);
391262306a36Sopenharmony_ciint
391362306a36Sopenharmony_cisli_cmd_write_nvparms(struct sli4 *sli4, void *buf, u8 *wwpn,
391462306a36Sopenharmony_ci		      u8 *wwnn, u8 hard_alpa, u32 preferred_d_id);
391562306a36Sopenharmony_ciint
391662306a36Sopenharmony_cisli_cmd_reg_fcfi(struct sli4 *sli4, void *buf, u16 index,
391762306a36Sopenharmony_ci		 struct sli4_cmd_rq_cfg *rq_cfg);
391862306a36Sopenharmony_ciint
391962306a36Sopenharmony_cisli_cmd_reg_fcfi_mrq(struct sli4 *sli4, void *buf, u8 mode, u16 index,
392062306a36Sopenharmony_ci		     u8 rq_selection_policy, u8 mrq_bit_mask, u16 num_mrqs,
392162306a36Sopenharmony_ci		     struct sli4_cmd_rq_cfg *rq_cfg);
392262306a36Sopenharmony_ciint
392362306a36Sopenharmony_cisli_cmd_reg_rpi(struct sli4 *sli4, void *buf, u32 rpi, u32 vpi, u32 fc_id,
392462306a36Sopenharmony_ci		struct efc_dma *dma, u8 update, u8 enable_t10_pi);
392562306a36Sopenharmony_ciint
392662306a36Sopenharmony_cisli_cmd_unreg_fcfi(struct sli4 *sli4, void *buf, u16 indicator);
392762306a36Sopenharmony_ciint
392862306a36Sopenharmony_cisli_cmd_unreg_rpi(struct sli4 *sli4, void *buf, u16 indicator,
392962306a36Sopenharmony_ci		  enum sli4_resource which, u32 fc_id);
393062306a36Sopenharmony_ciint
393162306a36Sopenharmony_cisli_cmd_reg_vpi(struct sli4 *sli4, void *buf, u32 fc_id,
393262306a36Sopenharmony_ci		__be64 sli_wwpn, u16 vpi, u16 vfi, bool update);
393362306a36Sopenharmony_ciint
393462306a36Sopenharmony_cisli_cmd_reg_vfi(struct sli4 *sli4, void *buf, size_t size,
393562306a36Sopenharmony_ci		u16 vfi, u16 fcfi, struct efc_dma dma,
393662306a36Sopenharmony_ci		u16 vpi, __be64 sli_wwpn, u32 fc_id);
393762306a36Sopenharmony_ciint
393862306a36Sopenharmony_cisli_cmd_unreg_vpi(struct sli4 *sli4, void *buf, u16 id, u32 type);
393962306a36Sopenharmony_ciint
394062306a36Sopenharmony_cisli_cmd_unreg_vfi(struct sli4 *sli4, void *buf, u16 idx, u32 type);
394162306a36Sopenharmony_ciint
394262306a36Sopenharmony_cisli_cmd_common_nop(struct sli4 *sli4, void *buf, uint64_t context);
394362306a36Sopenharmony_ciint
394462306a36Sopenharmony_cisli_cmd_common_get_resource_extent_info(struct sli4 *sli4, void *buf,
394562306a36Sopenharmony_ci					u16 rtype);
394662306a36Sopenharmony_ciint
394762306a36Sopenharmony_cisli_cmd_common_get_sli4_parameters(struct sli4 *sli4, void *buf);
394862306a36Sopenharmony_ciint
394962306a36Sopenharmony_cisli_cmd_common_write_object(struct sli4 *sli4, void *buf, u16 noc,
395062306a36Sopenharmony_ci		u16 eof, u32 len, u32 offset, char *name, struct efc_dma *dma);
395162306a36Sopenharmony_ciint
395262306a36Sopenharmony_cisli_cmd_common_delete_object(struct sli4 *sli4, void *buf, char *object_name);
395362306a36Sopenharmony_ciint
395462306a36Sopenharmony_cisli_cmd_common_read_object(struct sli4 *sli4, void *buf,
395562306a36Sopenharmony_ci		u32 length, u32 offset, char *name, struct efc_dma *dma);
395662306a36Sopenharmony_ciint
395762306a36Sopenharmony_cisli_cmd_dmtf_exec_clp_cmd(struct sli4 *sli4, void *buf,
395862306a36Sopenharmony_ci		struct efc_dma *cmd, struct efc_dma *resp);
395962306a36Sopenharmony_ciint
396062306a36Sopenharmony_cisli_cmd_common_set_dump_location(struct sli4 *sli4, void *buf,
396162306a36Sopenharmony_ci		bool query, bool is_buffer_list, struct efc_dma *dma, u8 fdb);
396262306a36Sopenharmony_ciint
396362306a36Sopenharmony_cisli_cmd_common_set_features(struct sli4 *sli4, void *buf,
396462306a36Sopenharmony_ci			    u32 feature, u32 param_len, void *parameter);
396562306a36Sopenharmony_ci
396662306a36Sopenharmony_ciint sli_cqe_mq(struct sli4 *sli4, void *buf);
396762306a36Sopenharmony_ciint sli_cqe_async(struct sli4 *sli4, void *buf);
396862306a36Sopenharmony_ci
396962306a36Sopenharmony_ciint
397062306a36Sopenharmony_cisli_setup(struct sli4 *sli4, void *os, struct pci_dev *pdev, void __iomem *r[]);
397162306a36Sopenharmony_civoid sli_calc_max_qentries(struct sli4 *sli4);
397262306a36Sopenharmony_ciint sli_init(struct sli4 *sli4);
397362306a36Sopenharmony_ciint sli_reset(struct sli4 *sli4);
397462306a36Sopenharmony_ciint sli_fw_reset(struct sli4 *sli4);
397562306a36Sopenharmony_civoid sli_teardown(struct sli4 *sli4);
397662306a36Sopenharmony_ciint
397762306a36Sopenharmony_cisli_callback(struct sli4 *sli4, enum sli4_callback cb, void *func, void *arg);
397862306a36Sopenharmony_ciint
397962306a36Sopenharmony_cisli_bmbx_command(struct sli4 *sli4);
398062306a36Sopenharmony_ciint
398162306a36Sopenharmony_ci__sli_queue_init(struct sli4 *sli4, struct sli4_queue *q, u32 qtype,
398262306a36Sopenharmony_ci		 size_t size, u32 n_entries, u32 align);
398362306a36Sopenharmony_ciint
398462306a36Sopenharmony_ci__sli_create_queue(struct sli4 *sli4, struct sli4_queue *q);
398562306a36Sopenharmony_ciint
398662306a36Sopenharmony_cisli_eq_modify_delay(struct sli4 *sli4, struct sli4_queue *eq, u32 num_eq,
398762306a36Sopenharmony_ci		    u32 shift, u32 delay_mult);
398862306a36Sopenharmony_ciint
398962306a36Sopenharmony_cisli_queue_alloc(struct sli4 *sli4, u32 qtype, struct sli4_queue *q,
399062306a36Sopenharmony_ci		u32 n_entries, struct sli4_queue *assoc);
399162306a36Sopenharmony_ciint
399262306a36Sopenharmony_cisli_cq_alloc_set(struct sli4 *sli4, struct sli4_queue *qs[], u32 num_cqs,
399362306a36Sopenharmony_ci		 u32 n_entries, struct sli4_queue *eqs[]);
399462306a36Sopenharmony_ciint
399562306a36Sopenharmony_cisli_get_queue_entry_size(struct sli4 *sli4, u32 qtype);
399662306a36Sopenharmony_ciint
399762306a36Sopenharmony_cisli_queue_free(struct sli4 *sli4, struct sli4_queue *q, u32 destroy_queues,
399862306a36Sopenharmony_ci	       u32 free_memory);
399962306a36Sopenharmony_ciint
400062306a36Sopenharmony_cisli_queue_eq_arm(struct sli4 *sli4, struct sli4_queue *q, bool arm);
400162306a36Sopenharmony_ciint
400262306a36Sopenharmony_cisli_queue_arm(struct sli4 *sli4, struct sli4_queue *q, bool arm);
400362306a36Sopenharmony_ci
400462306a36Sopenharmony_ciint
400562306a36Sopenharmony_cisli_wq_write(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
400662306a36Sopenharmony_ciint
400762306a36Sopenharmony_cisli_mq_write(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
400862306a36Sopenharmony_ciint
400962306a36Sopenharmony_cisli_rq_write(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
401062306a36Sopenharmony_ciint
401162306a36Sopenharmony_cisli_eq_read(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
401262306a36Sopenharmony_ciint
401362306a36Sopenharmony_cisli_cq_read(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
401462306a36Sopenharmony_ciint
401562306a36Sopenharmony_cisli_mq_read(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
401662306a36Sopenharmony_ciint
401762306a36Sopenharmony_cisli_resource_alloc(struct sli4 *sli4, enum sli4_resource rtype, u32 *rid,
401862306a36Sopenharmony_ci		   u32 *index);
401962306a36Sopenharmony_ciint
402062306a36Sopenharmony_cisli_resource_free(struct sli4 *sli4, enum sli4_resource rtype, u32 rid);
402162306a36Sopenharmony_ciint
402262306a36Sopenharmony_cisli_resource_reset(struct sli4 *sli4, enum sli4_resource rtype);
402362306a36Sopenharmony_ciint
402462306a36Sopenharmony_cisli_eq_parse(struct sli4 *sli4, u8 *buf, u16 *cq_id);
402562306a36Sopenharmony_ciint
402662306a36Sopenharmony_cisli_cq_parse(struct sli4 *sli4, struct sli4_queue *cq, u8 *cqe,
402762306a36Sopenharmony_ci	     enum sli4_qentry *etype, u16 *q_id);
402862306a36Sopenharmony_ci
402962306a36Sopenharmony_ciint sli_raise_ue(struct sli4 *sli4, u8 dump);
403062306a36Sopenharmony_ciint sli_dump_is_ready(struct sli4 *sli4);
403162306a36Sopenharmony_cibool sli_reset_required(struct sli4 *sli4);
403262306a36Sopenharmony_cibool sli_fw_ready(struct sli4 *sli4);
403362306a36Sopenharmony_ci
403462306a36Sopenharmony_ciint
403562306a36Sopenharmony_cisli_fc_process_link_attention(struct sli4 *sli4, void *acqe);
403662306a36Sopenharmony_ciint
403762306a36Sopenharmony_cisli_fc_cqe_parse(struct sli4 *sli4, struct sli4_queue *cq,
403862306a36Sopenharmony_ci		 u8 *cqe, enum sli4_qentry *etype,
403962306a36Sopenharmony_ci		 u16 *rid);
404062306a36Sopenharmony_ciu32 sli_fc_response_length(struct sli4 *sli4, u8 *cqe);
404162306a36Sopenharmony_ciu32 sli_fc_io_length(struct sli4 *sli4, u8 *cqe);
404262306a36Sopenharmony_ciint sli_fc_els_did(struct sli4 *sli4, u8 *cqe, u32 *d_id);
404362306a36Sopenharmony_ciu32 sli_fc_ext_status(struct sli4 *sli4, u8 *cqe);
404462306a36Sopenharmony_ciint
404562306a36Sopenharmony_cisli_fc_rqe_rqid_and_index(struct sli4 *sli4, u8 *cqe, u16 *rq_id, u32 *index);
404662306a36Sopenharmony_ciint
404762306a36Sopenharmony_cisli_cmd_wq_create(struct sli4 *sli4, void *buf,
404862306a36Sopenharmony_ci		  struct efc_dma *qmem, u16 cq_id);
404962306a36Sopenharmony_ciint sli_cmd_post_sgl_pages(struct sli4 *sli4, void *buf, u16 xri,
405062306a36Sopenharmony_ci		u32 xri_count, struct efc_dma *page0[], struct efc_dma *page1[],
405162306a36Sopenharmony_ci		struct efc_dma *dma);
405262306a36Sopenharmony_ciint
405362306a36Sopenharmony_cisli_cmd_post_hdr_templates(struct sli4 *sli4, void *buf,
405462306a36Sopenharmony_ci		struct efc_dma *dma, u16 rpi, struct efc_dma *payload_dma);
405562306a36Sopenharmony_ciint
405662306a36Sopenharmony_cisli_fc_rq_alloc(struct sli4 *sli4, struct sli4_queue *q, u32 n_entries,
405762306a36Sopenharmony_ci		u32 buffer_size, struct sli4_queue *cq, bool is_hdr);
405862306a36Sopenharmony_ciint
405962306a36Sopenharmony_cisli_fc_rq_set_alloc(struct sli4 *sli4, u32 num_rq_pairs, struct sli4_queue *q[],
406062306a36Sopenharmony_ci		u32 base_cq_id, u32 num, u32 hdr_buf_size, u32 data_buf_size);
406162306a36Sopenharmony_ciu32 sli_fc_get_rpi_requirements(struct sli4 *sli4, u32 n_rpi);
406262306a36Sopenharmony_ciint
406362306a36Sopenharmony_cisli_abort_wqe(struct sli4 *sli4, void *buf, enum sli4_abort_type type,
406462306a36Sopenharmony_ci	      bool send_abts, u32 ids, u32 mask, u16 tag, u16 cq_id);
406562306a36Sopenharmony_ci
406662306a36Sopenharmony_ciint
406762306a36Sopenharmony_cisli_send_frame_wqe(struct sli4 *sli4, void *buf, u8 sof, u8 eof,
406862306a36Sopenharmony_ci		   u32 *hdr, struct efc_dma *payload, u32 req_len, u8 timeout,
406962306a36Sopenharmony_ci		   u16 xri, u16 req_tag);
407062306a36Sopenharmony_ci
407162306a36Sopenharmony_ciint
407262306a36Sopenharmony_cisli_xmit_els_rsp64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *rsp,
407362306a36Sopenharmony_ci		       struct sli_els_params *params);
407462306a36Sopenharmony_ci
407562306a36Sopenharmony_ciint
407662306a36Sopenharmony_cisli_els_request64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
407762306a36Sopenharmony_ci		      struct sli_els_params *params);
407862306a36Sopenharmony_ci
407962306a36Sopenharmony_ciint
408062306a36Sopenharmony_cisli_fcp_icmnd64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl, u16 xri,
408162306a36Sopenharmony_ci		    u16 tag, u16 cq_id, u32 rpi, u32 rnode_fcid, u8 timeout);
408262306a36Sopenharmony_ci
408362306a36Sopenharmony_ciint
408462306a36Sopenharmony_cisli_fcp_iread64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
408562306a36Sopenharmony_ci		    u32 first_data_sge, u32 xfer_len, u16 xri,
408662306a36Sopenharmony_ci		    u16 tag, u16 cq_id, u32 rpi, u32 rnode_fcid, u8 dif, u8 bs,
408762306a36Sopenharmony_ci		    u8 timeout);
408862306a36Sopenharmony_ci
408962306a36Sopenharmony_ciint
409062306a36Sopenharmony_cisli_fcp_iwrite64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
409162306a36Sopenharmony_ci		     u32 first_data_sge, u32 xfer_len,
409262306a36Sopenharmony_ci		     u32 first_burst, u16 xri, u16 tag, u16 cq_id, u32 rpi,
409362306a36Sopenharmony_ci		     u32 rnode_fcid, u8 dif, u8 bs, u8 timeout);
409462306a36Sopenharmony_ci
409562306a36Sopenharmony_ciint
409662306a36Sopenharmony_cisli_fcp_treceive64_wqe(struct sli4 *sli, void *buf, struct efc_dma *sgl,
409762306a36Sopenharmony_ci		       u32 first_data_sge, u16 cq_id, u8 dif, u8 bs,
409862306a36Sopenharmony_ci		       struct sli_fcp_tgt_params *params);
409962306a36Sopenharmony_ciint
410062306a36Sopenharmony_cisli_fcp_cont_treceive64_wqe(struct sli4 *sli, void *buf, struct efc_dma *sgl,
410162306a36Sopenharmony_ci			    u32 first_data_sge, u16 sec_xri, u16 cq_id, u8 dif,
410262306a36Sopenharmony_ci			    u8 bs, struct sli_fcp_tgt_params *params);
410362306a36Sopenharmony_ci
410462306a36Sopenharmony_ciint
410562306a36Sopenharmony_cisli_fcp_trsp64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
410662306a36Sopenharmony_ci		   u16 cq_id, u8 port_owned, struct sli_fcp_tgt_params *params);
410762306a36Sopenharmony_ci
410862306a36Sopenharmony_ciint
410962306a36Sopenharmony_cisli_fcp_tsend64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
411062306a36Sopenharmony_ci		    u32 first_data_sge, u16 cq_id, u8 dif, u8 bs,
411162306a36Sopenharmony_ci		    struct sli_fcp_tgt_params *params);
411262306a36Sopenharmony_ciint
411362306a36Sopenharmony_cisli_gen_request64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
411462306a36Sopenharmony_ci		      struct sli_ct_params *params);
411562306a36Sopenharmony_ci
411662306a36Sopenharmony_ciint
411762306a36Sopenharmony_cisli_xmit_bls_rsp64_wqe(struct sli4 *sli4, void *buf,
411862306a36Sopenharmony_ci		struct sli_bls_payload *payload, struct sli_bls_params *params);
411962306a36Sopenharmony_ci
412062306a36Sopenharmony_ciint
412162306a36Sopenharmony_cisli_xmit_sequence64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *payload,
412262306a36Sopenharmony_ci			struct sli_ct_params *params);
412362306a36Sopenharmony_ci
412462306a36Sopenharmony_ciint
412562306a36Sopenharmony_cisli_requeue_xri_wqe(struct sli4 *sli4, void *buf, u16 xri, u16 tag, u16 cq_id);
412662306a36Sopenharmony_civoid
412762306a36Sopenharmony_cisli4_cmd_lowlevel_set_watchdog(struct sli4 *sli4, void *buf, size_t size,
412862306a36Sopenharmony_ci			       u16 timeout);
412962306a36Sopenharmony_ci
413062306a36Sopenharmony_ciconst char *sli_fc_get_status_string(u32 status);
413162306a36Sopenharmony_ci
413262306a36Sopenharmony_ci#endif /* !_SLI4_H */
4133