All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Wagner <dwagner@suse.de>
To: James Smart <jsmart2021@gmail.com>
Cc: linux-scsi@vger.kernel.org, maier@linux.ibm.com,
	bvanassche@acm.org, herbszt@gmx.de, natechancellor@gmail.com,
	rdunlap@infradead.org, hare@suse.de,
	Ram Vegesna <ram.vegesna@broadcom.com>
Subject: Re: [PATCH v3 02/31] elx: libefc_sli: SLI Descriptors and Queue entries
Date: Tue, 14 Apr 2020 20:02:21 +0200	[thread overview]
Message-ID: <20200414180221.3n2eqicptmh3gsyt@carbon.lan> (raw)
In-Reply-To: <20200412033303.29574-3-jsmart2021@gmail.com>

Hi,

On Sat, Apr 11, 2020 at 08:32:34PM -0700, James Smart wrote:
> This patch continues the libefc_sli SLI-4 library population.
> 
> This patch add SLI-4 Data structures and defines for:
> - Buffer Descriptors (BDEs)
> - Scatter/Gather List elements (SGEs)
> - Queues and their Entry Descriptions for:
>    Event Queues (EQs), Completion Queues (CQs),
>    Receive Queues (RQs), and the Mailbox Queue (MQ).

There are a definitions which are not used at all,
e.g. DISEED_SGE_OP_RX_VALUE, sli4_acqe_e, sli4_acqe_event_code,
etc. What are the plans with those?

> Signed-off-by: Ram Vegesna <ram.vegesna@broadcom.com>
> Signed-off-by: James Smart <jsmart2021@gmail.com>
> 
> ---
> v3:
>   Changed anonymous enums to named.
>   SLI defines to spell out _MASK value directly.
>   Change multiple defines to named Enums for consistency.
>   Single Enum to #define.
> ---
>  drivers/scsi/elx/include/efc_common.h |   25 +
>  drivers/scsi/elx/libefc_sli/sli4.h    | 1761 +++++++++++++++++++++++++++++++++
>  2 files changed, 1786 insertions(+)
>  create mode 100644 drivers/scsi/elx/include/efc_common.h
> 
> diff --git a/drivers/scsi/elx/include/efc_common.h b/drivers/scsi/elx/include/efc_common.h
> new file mode 100644
> index 000000000000..c427f75da4d5
> --- /dev/null
> +++ b/drivers/scsi/elx/include/efc_common.h
> @@ -0,0 +1,25 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + * Copyright (C) 2019 Broadcom. All Rights Reserved. The term
> + * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
> + */
> +
> +#ifndef __EFC_COMMON_H__
> +#define __EFC_COMMON_H__
> +
> +#include <linux/pci.h>
> +
> +#define EFC_SUCCESS	0
> +#define EFC_FAIL	1
> +
> +struct efc_dma {
> +	void		*virt;
> +	void            *alloc;
> +	dma_addr_t	phys;
> +
> +	size_t		size;
> +	size_t          len;
> +	struct pci_dev	*pdev;
> +};
> +
> +#endif /* __EFC_COMMON_H__ */
> diff --git a/drivers/scsi/elx/libefc_sli/sli4.h b/drivers/scsi/elx/libefc_sli/sli4.h
> index 1fad48643f94..07eef8df9690 100644
> --- a/drivers/scsi/elx/libefc_sli/sli4.h
> +++ b/drivers/scsi/elx/libefc_sli/sli4.h
> @@ -249,4 +249,1765 @@ struct sli4_reg {
>  	u32	off;
>  };
>  
> +struct sli4_dmaaddr {
> +	__le32 low;
> +	__le32 high;
> +};
> +
> +/* a 3-word BDE with address 1st 2 words, length last word */

Maybe expand BDE here as it is the first time the acrynom is
used. Please 'with address 1st 2 words,....' since this is redunant.

> +struct sli4_bufptr {
> +	struct sli4_dmaaddr addr;
> +	__le32 length;
> +};
> +
> +/* a 3-word BDE with length as first word, address last 2 words */
> +struct sli4_bufptr_len1st {
> +	__le32 length0;
> +	struct sli4_dmaaddr addr;
> +};

This struct is unused. Remove it please.

> +
> +/* Buffer Descriptor Entry (BDE) */
> +enum sli4_bde_e {
> +	SLI4_BDE_MASK_BUFFER_LEN	= 0x00ffffff,
> +	SLI4_BDE_MASK_BDE_TYPE		= 0xff000000,
> +};
> +
> +struct sli4_bde {
> +	__le32		bde_type_buflen;
> +	union {
> +		struct sli4_dmaaddr data;
> +		struct {
> +			__le32	offset;
> +			__le32	rsvd2;
> +		} imm;
> +		struct sli4_dmaaddr blp;
> +	} u;
> +};
> +
> +/* Buffer Descriptors */
> +enum sli4_bde_type {
> +	BDE_TYPE_SHIFT		= 24,
> +	BDE_TYPE_BDE_64		= 0x00,	/* Generic 64-bit data */
> +	BDE_TYPE_BDE_IMM	= 0x01,	/* Immediate data */
> +	BDE_TYPE_BLP		= 0x40,	/* Buffer List Pointer */
> +};
> +
> +/* Scatter-Gather Entry (SGE) */
> +#define SLI4_SGE_MAX_RESERVED			3
> +
> +enum sli4_sge_type {
> +	/* DW2 */
> +	SLI4_SGE_DATA_OFFSET_MASK	= 0x07FFFFFF,

Nitpick: some of the hex values are in small letters some as here use
large letters.

> +	/*DW2W1*/
> +	SLI4_SGE_TYPE_SHIFT		= 27,
> +	SLI4_SGE_TYPE_MASK		= 0x78000000,
> +	/*SGE Types*/
> +	SLI4_SGE_TYPE_DATA		= 0x00,
> +	SLI4_SGE_TYPE_DIF		= 0x04,	/* Data Integrity Field */
> +	SLI4_SGE_TYPE_LSP		= 0x05,	/* List Segment Pointer */
> +	SLI4_SGE_TYPE_PEDIF		= 0x06,	/* Post Encryption Engine DIF */
> +	SLI4_SGE_TYPE_PESEED		= 0x07,	/* Post Encryption DIF Seed */
> +	SLI4_SGE_TYPE_DISEED		= 0x08,	/* DIF Seed */
> +	SLI4_SGE_TYPE_ENC		= 0x09,	/* Encryption */
> +	SLI4_SGE_TYPE_ATM		= 0x0a,	/* DIF Application Tag Mask */
> +	SLI4_SGE_TYPE_SKIP		= 0x0c,	/* SKIP */
> +
> +	SLI4_SGE_LAST			= (1 << 31),
> +};
> +
> +struct sli4_sge {
> +	__le32		buffer_address_high;
> +	__le32		buffer_address_low;
> +	__le32		dw2_flags;
> +	__le32		buffer_length;
> +};
> +
> +/* T10 DIF Scatter-Gather Entry (SGE) */
> +struct sli4_dif_sge {
> +	__le32		buffer_address_high;
> +	__le32		buffer_address_low;
> +	__le32		dw2_flags;
> +	__le32		rsvd12;
> +};
> +
> +/* Data Integrity Seed (DISEED) SGE */
> +enum sli4_diseed_sge_flags {
> +	/* DW2W1 */
> +	DISEED_SGE_HS			= (1 << 2),
> +	DISEED_SGE_WS			= (1 << 3),
> +	DISEED_SGE_IC			= (1 << 4),
> +	DISEED_SGE_ICS			= (1 << 5),
> +	DISEED_SGE_ATRT			= (1 << 6),
> +	DISEED_SGE_AT			= (1 << 7),
> +	DISEED_SGE_FAT			= (1 << 8),
> +	DISEED_SGE_NA			= (1 << 9),
> +	DISEED_SGE_HI			= (1 << 10),
> +
> +	/* DW3W1 */
> +	DISEED_SGE_BS_MASK		= 0x0007,
> +	DISEED_SGE_AI			= (1 << 3),
> +	DISEED_SGE_ME			= (1 << 4),
> +	DISEED_SGE_RE			= (1 << 5),
> +	DISEED_SGE_CE			= (1 << 6),
> +	DISEED_SGE_NR			= (1 << 7),
> +
> +	DISEED_SGE_OP_RX_SHIFT		= 8,
> +	DISEED_SGE_OP_RX_MASK		= 0x0F00,
> +	DISEED_SGE_OP_TX_SHIFT		= 12,
> +	DISEED_SGE_OP_TX_MASK		= 0xF000,
> +};
> +
> +/* Opcode values */
> +enum sli4_diseed_sge_opcodes {
> +	DISEED_SGE_OP_IN_NODIF_OUT_CRC,
> +	DISEED_SGE_OP_IN_CRC_OUT_NODIF,
> +	DISEED_SGE_OP_IN_NODIF_OUT_CSUM,
> +	DISEED_SGE_OP_IN_CSUM_OUT_NODIF,
> +	DISEED_SGE_OP_IN_CRC_OUT_CRC,
> +	DISEED_SGE_OP_IN_CSUM_OUT_CSUM,
> +	DISEED_SGE_OP_IN_CRC_OUT_CSUM,
> +	DISEED_SGE_OP_IN_CSUM_OUT_CRC,
> +	DISEED_SGE_OP_IN_RAW_OUT_RAW,
> +};
> +
> +#define DISEED_SGE_OP_RX_VALUE(stype) \
> +	(DISEED_SGE_OP_##stype << DISEED_SGE_OP_RX_SHIFT)
> +#define DISEED_SGE_OP_TX_VALUE(stype) \
> +	(DISEED_SGE_OP_##stype << DISEED_SGE_OP_TX_SHIFT)

empty line

> +struct sli4_diseed_sge {
> +	__le32		ref_tag_cmp;
> +	__le32		ref_tag_repl;
> +	__le16		app_tag_repl;
> +	__le16		dw2w1_flags;
> +	__le16		app_tag_cmp;
> +	__le16		dw3w1_flags;
> +};
> +
> +/* List Segment Pointer Scatter-Gather Entry (SGE) */
> +#define SLI4_LSP_SGE_SEGLEN	0x00ffffff
> +
> +struct sli4_lsp_sge {
> +	__le32		buffer_address_high;
> +	__le32		buffer_address_low;
> +	__le32		dw2_flags;
> +	__le32		dw3_seglen;
> +};
> +
> +enum sli4_eqe_e {
> +	SLI4_EQE_VALID	= 1,
> +	SLI4_EQE_MJCODE	= 0xe,
> +	SLI4_EQE_MNCODE	= 0xfff0,
> +};
> +
> +struct sli4_eqe {
> +	__le16		dw0w0_flags;
> +	__le16		resource_id;
> +};
> +
> +#define SLI4_MAJOR_CODE_STANDARD	0
> +#define SLI4_MAJOR_CODE_SENTINEL	1
> +
> +/* Sentinel EQE indicating the EQ is full */
> +#define SLI4_EQE_STATUS_EQ_FULL		2
> +
> +enum sli4_mcqe_e {
> +	SLI4_MCQE_CONSUMED	= (1 << 27),
> +	SLI4_MCQE_COMPLETED	= (1 << 28),
> +	SLI4_MCQE_AE		= (1 << 30),
> +	SLI4_MCQE_VALID		= (1 << 31),
> +};
> +
> +/* Entry was consumed but not completed */
> +#define SLI4_MCQE_STATUS_NOT_COMPLETED	-2
> +
> +struct sli4_mcqe {
> +	__le16		completion_status;
> +	__le16		extended_status;
> +	__le32		mqe_tag_low;
> +	__le32		mqe_tag_high;
> +	__le32		dw3_flags;
> +};
> +
> +enum sli4_acqe_e {
> +	SLI4_ACQE_AE	= (1 << 6), /* async event - this is an ACQE */
> +	SLI4_ACQE_VAL	= (1 << 7), /* valid - contents of CQE are valid */
> +};
> +
> +struct sli4_acqe {
> +	__le32		event_data[3];
> +	u8		rsvd12;
> +	u8		event_code;
> +	u8		event_type;
> +	u8		ae_val;
> +};
> +
> +enum sli4_acqe_event_code {
> +	SLI4_ACQE_EVENT_CODE_LINK_STATE		= 0x01,
> +	SLI4_ACQE_EVENT_CODE_FIP		= 0x02,
> +	SLI4_ACQE_EVENT_CODE_DCBX		= 0x03,
> +	SLI4_ACQE_EVENT_CODE_ISCSI		= 0x04,
> +	SLI4_ACQE_EVENT_CODE_GRP_5		= 0x05,
> +	SLI4_ACQE_EVENT_CODE_FC_LINK_EVENT	= 0x10,
> +	SLI4_ACQE_EVENT_CODE_SLI_PORT_EVENT	= 0x11,
> +	SLI4_ACQE_EVENT_CODE_VF_EVENT		= 0x12,
> +	SLI4_ACQE_EVENT_CODE_MR_EVENT		= 0x13,
> +};
> +
> +enum sli4_qtype {
> +	SLI_QTYPE_EQ,
> +	SLI_QTYPE_CQ,
> +	SLI_QTYPE_MQ,
> +	SLI_QTYPE_WQ,
> +	SLI_QTYPE_RQ,
> +	SLI_QTYPE_MAX,			/* must be last */
> +};
> +
> +#define SLI_USER_MQ_COUNT	1
> +#define SLI_MAX_CQ_SET_COUNT	16
> +#define SLI_MAX_RQ_SET_COUNT	16
> +
> +enum sli4_qentry {
> +	SLI_QENTRY_ASYNC,
> +	SLI_QENTRY_MQ,
> +	SLI_QENTRY_RQ,
> +	SLI_QENTRY_WQ,
> +	SLI_QENTRY_WQ_RELEASE,
> +	SLI_QENTRY_OPT_WRITE_CMD,
> +	SLI_QENTRY_OPT_WRITE_DATA,
> +	SLI_QENTRY_XABT,
> +	SLI_QENTRY_MAX			/* must be last */
> +};
> +
> +enum sli4_queue_flags {
> +	/* CQ has MQ/Async completion */
> +	SLI4_QUEUE_FLAG_MQ	= (1 << 0),
> +
> +	/* RQ for packet headers */
> +	SLI4_QUEUE_FLAG_HDR	= (1 << 1),
> +
> +	/* RQ index increment by 8 */
> +	SLI4_QUEUE_FLAG_RQBATCH	= (1 << 2),
> +};

There are several styles of documention and comments in this header. I
suggest to streamline them all and use kernel doc style?

> +struct sli4_queue {
> +	/* Common to all queue types */
> +	struct efc_dma	dma;
> +	spinlock_t	lock;	/* protect the queue operations */

I really would love the have some documentation on the locking concept
of the driver. From my very limited experience so far with the FC
drivers, this is one of the areas which are hard to review if there is
no documentation on the design and rules. For example 'protect the
queue operations' is pretty much an useless comment.

> +	u32	index;		/* current host entry index */
> +	u16	size;		/* entry size */
> +	u16	length;		/* number of entries */
> +	u16	n_posted;	/* number entries posted */
> +	u16	id;		/* Port assigned xQ_ID */
> +	u16	ulp;		/* ULP assigned to this queue */
> +	void __iomem    *db_regaddr;	/* register address for the doorbell */
> +	u8		type;		/* queue type ie EQ, CQ, ... */
> +	u32	proc_limit;	/* limit CQE processed per iteration */
> +	u32	posted_limit;	/* CQE/EQE process before ring doorbel */
> +	u32	max_num_processed;
> +	time_t		max_process_time;
> +	u16	phase;		/* For if_type = 6, this value toggle
                                       ^^^^^^^
Is this the type member? What does the value 6 mean?

> +				 * for each iteration of the queue,
> +				 * a queue entry is valid when a cqe
> +				 * valid bit matches this value
> +				 */
> +
> +	union {
> +		u32	r_idx;	/* "read" index (MQ only) */
> +		struct {
> +			u32	dword;
> +		} flag;

Is this struct really neccessary?

> +	} u;
> +};
> +
> +/* Generic Command Request header */
> +enum sli4_cmd_version {
> +	CMD_V0,
> +	CMD_V1,
> +	CMD_V2,
> +};
> +
> +struct sli4_rqst_hdr {
> +	u8		opcode;
> +	u8		subsystem;
> +	__le16		rsvd2;
> +	__le32		timeout;
> +	__le32		request_length;
> +	__le32		dw3_version;
> +};
> +
> +/* Generic Command Response header */
> +struct sli4_rsp_hdr {
> +	u8		opcode;
> +	u8		subsystem;
> +	__le16		rsvd2;
> +	u8		status;
> +	u8		additional_status;
> +	__le16		rsvd6;
> +	__le32		response_length;
> +	__le32		actual_response_length;
> +};
> +
> +#define SLI4_QUEUE_RQ_BATCH	8
> +
> +#define CFG_RQST_CMDSZ(stype)	sizeof(struct sli4_rqst_##stype)
> +
> +#define CFG_RQST_PYLD_LEN(stype) \
> +		cpu_to_le32(sizeof(struct sli4_rqst_##stype) - \
> +			sizeof(struct sli4_rqst_hdr))
> +
> +#define CFG_RQST_PYLD_LEN_VAR(stype, varpyld) \
> +		cpu_to_le32((sizeof(struct sli4_rqst_##stype) + \
> +			varpyld) - sizeof(struct sli4_rqst_hdr))
> +
> +#define SZ_DMAADDR		sizeof(struct sli4_dmaaddr)
> +
> +#define SLI_CONFIG_PYLD_LENGTH(stype) \
> +		max(sizeof(struct sli4_rqst_##stype), \
> +		sizeof(struct sli4_rsp_##stype))
> +
> +enum sli4_create_cqv2_e {
> +	/* DW5_flags values*/
> +	CREATE_CQV2_CLSWM_MASK	= 0x00003000,
> +	CREATE_CQV2_NODELAY	= 0x00004000,
> +	CREATE_CQV2_AUTOVALID	= 0x00008000,
> +	CREATE_CQV2_CQECNT_MASK	= 0x18000000,
> +	CREATE_CQV2_VALID	= 0x20000000,
> +	CREATE_CQV2_EVT		= 0x80000000,
> +	/* DW6W1_flags values*/
> +	CREATE_CQV2_ARM		= 0x8000,
> +};
> +
> +struct sli4_rqst_cmn_create_cq_v2 {
> +	struct sli4_rqst_hdr	hdr;
> +	__le16		num_pages;
> +	u8		page_size;
> +	u8		rsvd19;
> +	__le32		dw5_flags;
> +	__le16		eq_id;
> +	__le16		dw6w1_arm;
> +	__le16		cqe_count;
> +	__le16		rsvd30;
> +	__le32		rsvd32;
> +	struct sli4_dmaaddr page_phys_addr[0];
> +};
> +
> +enum sli4_create_cqset_e {
> +	/* DW5_flags values*/
> +	CREATE_CQSETV0_CLSWM_MASK  = 0x00003000,
> +	CREATE_CQSETV0_NODELAY	   = 0x00004000,
> +	CREATE_CQSETV0_AUTOVALID   = 0x00008000,
> +	CREATE_CQSETV0_CQECNT_MASK = 0x18000000,
> +	CREATE_CQSETV0_VALID	   = 0x20000000,
> +	CREATE_CQSETV0_EVT	   = 0x80000000,
> +	/* DW5W1_flags values */
> +	CREATE_CQSETV0_CQE_COUNT   = 0x7fff,
> +	CREATE_CQSETV0_ARM	   = 0x8000,
> +};
> +
> +struct sli4_rqst_cmn_create_cq_set_v0 {
> +	struct sli4_rqst_hdr	hdr;
> +	__le16		num_pages;
> +	u8		page_size;
> +	u8		rsvd19;
> +	__le32		dw5_flags;
> +	__le16		num_cq_req;
> +	__le16		dw6w1_flags;
> +	__le16		eq_id[16];
> +	struct sli4_dmaaddr page_phys_addr[0];
> +};
> +
> +/* CQE count */
> +enum sli4_cq_cnt {
> +	CQ_CNT_256,
> +	CQ_CNT_512,
> +	CQ_CNT_1024,
> +	CQ_CNT_LARGE,
> +};
> +
> +#define CQ_CNT_SHIFT			27
> +#define CQ_CNT_VAL(type)		(CQ_CNT_##type << CQ_CNT_SHIFT)
> +
> +#define SLI4_CQE_BYTES			(4 * sizeof(u32))
> +
> +#define SLI4_CMN_CREATE_CQ_V2_MAX_PAGES	8
> +
> +/* Generic Common Create EQ/CQ/MQ/WQ/RQ Queue completion */
> +struct sli4_rsp_cmn_create_queue {
> +	struct sli4_rsp_hdr	hdr;
> +	__le16	q_id;
> +	u8	rsvd18;
> +	u8	ulp;
> +	__le32	db_offset;
> +	__le16	db_rs;
> +	__le16	db_fmt;
> +};
> +
> +struct sli4_rsp_cmn_create_queue_set {
> +	struct sli4_rsp_hdr	hdr;
> +	__le16	q_id;
> +	__le16	num_q_allocated;
> +};
> +
> +/* Common Destroy Queue */
> +struct sli4_rqst_cmn_destroy_q {
> +	struct sli4_rqst_hdr	hdr;
> +	__le16	q_id;
> +	__le16	rsvd;
> +};
> +
> +struct sli4_rsp_cmn_destroy_q {
> +	struct sli4_rsp_hdr	hdr;
> +};
> +
> +/* Modify the delay multiplier for EQs */
> +struct sli4_rqst_cmn_modify_eq_delay {
> +	struct sli4_rqst_hdr	hdr;
> +	__le32	num_eq;
> +	struct {
> +		__le32	eq_id;
> +		__le32	phase;
> +		__le32	delay_multiplier;
> +	} eq_delay_record[8];
> +};
> +
> +struct sli4_rsp_cmn_modify_eq_delay {
> +	struct sli4_rsp_hdr	hdr;
> +};
> +
> +enum sli4_create_cq_e {
> +	/* DW5 */
> +	CREATE_EQ_AUTOVALID		= (1 << 28),
> +	CREATE_EQ_VALID			= (1 << 29),
> +	CREATE_EQ_EQESZ			= (1 << 31),
> +	/* DW6 */
> +	CREATE_EQ_COUNT			= (7 << 26),
> +	CREATE_EQ_ARM			= (1 << 31),
> +	/* DW7 */
> +	CREATE_EQ_DELAYMULTI_SHIFT	= 13,
> +	CREATE_EQ_DELAYMULTI_MASK	= 0x007FE000,
> +	CREATE_EQ_DELAYMULTI		= 0x00040000,
> +};
> +
> +struct sli4_rqst_cmn_create_eq {
> +	struct sli4_rqst_hdr	hdr;
> +	__le16	num_pages;
> +	__le16	rsvd18;
> +	__le32	dw5_flags;
> +	__le32	dw6_flags;
> +	__le32	dw7_delaymulti;
> +	__le32	rsvd32;
> +	struct sli4_dmaaddr page_address[8];
> +};
> +
> +struct sli4_rsp_cmn_create_eq {
> +	struct sli4_rsp_cmn_create_queue q_rsp;
> +};
> +
> +/* EQ count */
> +enum sli4_eq_cnt {
> +	EQ_CNT_256,
> +	EQ_CNT_512,
> +	EQ_CNT_1024,
> +	EQ_CNT_2048,
> +	EQ_CNT_4096 = 3,
> +};
> +
> +#define EQ_CNT_SHIFT			26
> +#define EQ_CNT_VAL(type)		(EQ_CNT_##type << EQ_CNT_SHIFT)
> +
> +#define SLI4_EQE_SIZE_4			0
> +#define SLI4_EQE_SIZE_16		1
> +
> +/* Create a Mailbox Queue; accommodate v0 and v1 forms. */
> +enum sli4_create_mq_flags {
> +	/* DW6W1 */
> +	CREATE_MQEXT_RINGSIZE		= 0xf,
> +	CREATE_MQEXT_CQID_SHIFT		= 6,
> +	CREATE_MQEXT_CQIDV0_MASK	= 0xffc0,
> +	/* DW7 */
> +	CREATE_MQEXT_VAL		= (1 << 31),
> +	/* DW8 */
> +	CREATE_MQEXT_ACQV		= (1 << 0),
> +	CREATE_MQEXT_ASYNC_CQIDV0	= 0x7fe,
> +};
> +
> +struct sli4_rqst_cmn_create_mq_ext {
> +	struct sli4_rqst_hdr	hdr;
> +	__le16		num_pages;
> +	__le16		cq_id_v1;
> +	__le32		async_event_bitmap;
> +	__le16		async_cq_id_v1;
> +	__le16		dw6w1_flags;
> +	__le32		dw7_val;
> +	__le32		dw8_flags;
> +	__le32		rsvd36;

Nitpick: The code intentions for all these definitions are not
consistent. For example above struct sli4_rqst_cmn_create_eq uses a
different pattern. Please pick one and stick to it.


> +	struct sli4_dmaaddr page_phys_addr[0];
> +};
> +
> +struct sli4_rsp_cmn_create_mq_ext {
> +	struct sli4_rsp_cmn_create_queue q_rsp;
> +};
> +
> +enum sli4_mqe_size {
> +	SLI4_MQE_SIZE_16 = 0x05,
> +	SLI4_MQE_SIZE_32,
> +	SLI4_MQE_SIZE_64,
> +	SLI4_MQE_SIZE_128,
> +};
> +
> +enum sli4_async_evt {
> +	SLI4_ASYNC_EVT_LINK_STATE	= (1 << 1),
> +	SLI4_ASYNC_EVT_FIP		= (1 << 2),
> +	SLI4_ASYNC_EVT_GRP5		= (1 << 5),
> +	SLI4_ASYNC_EVT_FC		= (1 << 16),
> +	SLI4_ASYNC_EVT_SLI_PORT		= (1 << 17),
> +};
> +
> +#define	SLI4_ASYNC_EVT_FC_ALL \
> +		(SLI4_ASYNC_EVT_LINK_STATE	| \
> +		 SLI4_ASYNC_EVT_FIP		| \
> +		 SLI4_ASYNC_EVT_GRP5		| \
> +		 SLI4_ASYNC_EVT_FC		| \
> +		 SLI4_ASYNC_EVT_SLI_PORT)
> +
> +/* Create a Completion Queue. */
> +struct sli4_rqst_cmn_create_cq_v0 {
> +	struct sli4_rqst_hdr	hdr;
> +	__le16		num_pages;
> +	__le16		rsvd18;
> +	__le32		dw5_flags;
> +	__le32		dw6_flags;
> +	__le32		rsvd28;
> +	__le32		rsvd32;
> +	struct sli4_dmaaddr page_phys_addr[0];
> +};
> +
> +enum sli4_create_rq_e {
> +	SLI4_RQ_CREATE_DUA		= 0x1,
> +	SLI4_RQ_CREATE_BQU		= 0x2,
> +
> +	SLI4_RQE_SIZE			= 8,
> +	SLI4_RQE_SIZE_8			= 0x2,
> +	SLI4_RQE_SIZE_16		= 0x3,
> +	SLI4_RQE_SIZE_32		= 0x4,
> +	SLI4_RQE_SIZE_64		= 0x5,
> +	SLI4_RQE_SIZE_128		= 0x6,
> +
> +	SLI4_RQ_PAGE_SIZE_4096		= 0x1,
> +	SLI4_RQ_PAGE_SIZE_8192		= 0x2,
> +	SLI4_RQ_PAGE_SIZE_16384		= 0x4,
> +	SLI4_RQ_PAGE_SIZE_32768		= 0x8,
> +	SLI4_RQ_PAGE_SIZE_64536		= 0x10,
> +
> +	SLI4_RQ_CREATE_V0_MAX_PAGES	= 8,
> +	SLI4_RQ_CREATE_V0_MIN_BUF_SIZE	= 128,
> +	SLI4_RQ_CREATE_V0_MAX_BUF_SIZE	= 2048,
> +};
> +
> +struct sli4_rqst_rq_create {
> +	struct sli4_rqst_hdr	hdr;
> +	__le16		num_pages;
> +	u8		dua_bqu_byte;
> +	u8		ulp;
> +	__le16		rsvd16;
> +	u8		rqe_count_byte;
> +	u8		rsvd19;
> +	__le32		rsvd20;
> +	__le16		buffer_size;
> +	__le16		cq_id;
> +	__le32		rsvd28;
> +	struct sli4_dmaaddr page_phys_addr[SLI4_RQ_CREATE_V0_MAX_PAGES];
> +};
> +
> +struct sli4_rsp_rq_create {
> +	struct sli4_rsp_cmn_create_queue rsp;
> +};
> +
> +enum sli4_create_rqv1_e {
> +	SLI4_RQ_CREATE_V1_DNB		= 0x80,
> +	SLI4_RQ_CREATE_V1_MAX_PAGES	= 8,
> +	SLI4_RQ_CREATE_V1_MIN_BUF_SIZE	= 64,
> +	SLI4_RQ_CREATE_V1_MAX_BUF_SIZE	= 2048,
> +};
> +
> +struct sli4_rqst_rq_create_v1 {
> +	struct sli4_rqst_hdr	hdr;
> +	__le16		num_pages;
> +	u8		rsvd14;
> +	u8		dim_dfd_dnb;
> +	u8		page_size;
> +	u8		rqe_size_byte;
> +	__le16		rqe_count;
> +	__le32		rsvd20;
> +	__le16		rsvd24;
> +	__le16		cq_id;
> +	__le32		buffer_size;
> +	struct sli4_dmaaddr page_phys_addr[SLI4_RQ_CREATE_V1_MAX_PAGES];
> +};
> +
> +struct sli4_rsp_rq_create_v1 {
> +	struct sli4_rsp_cmn_create_queue rsp;
> +};
> +
> +#define	SLI4_RQCREATEV2_DNB	0x80
> +
> +struct sli4_rqst_rq_create_v2 {
> +	struct sli4_rqst_hdr	hdr;
> +	__le16		num_pages;
> +	u8		rq_count;
> +	u8		dim_dfd_dnb;
> +	u8		page_size;
> +	u8		rqe_size_byte;
> +	__le16		rqe_count;
> +	__le16		hdr_buffer_size;
> +	__le16		payload_buffer_size;
> +	__le16		base_cq_id;
> +	__le16		rsvd26;
> +	__le32		rsvd42;
> +	struct sli4_dmaaddr page_phys_addr[0];
> +};
> +
> +struct sli4_rsp_rq_create_v2 {
> +	struct sli4_rsp_cmn_create_queue rsp;
> +};
> +
> +#define SLI4_CQE_CODE_OFFSET	14

empty line

> +enum sli4_cqe_code {
> +	SLI4_CQE_CODE_WORK_REQUEST_COMPLETION = 0x01,
> +	SLI4_CQE_CODE_RELEASE_WQE,
> +	SLI4_CQE_CODE_RSVD,
> +	SLI4_CQE_CODE_RQ_ASYNC,
> +	SLI4_CQE_CODE_XRI_ABORTED,
> +	SLI4_CQE_CODE_RQ_COALESCING,
> +	SLI4_CQE_CODE_RQ_CONSUMPTION,
> +	SLI4_CQE_CODE_MEASUREMENT_REPORTING,
> +	SLI4_CQE_CODE_RQ_ASYNC_V1,
> +	SLI4_CQE_CODE_RQ_COALESCING_V1,
> +	SLI4_CQE_CODE_OPTIMIZED_WRITE_CMD,
> +	SLI4_CQE_CODE_OPTIMIZED_WRITE_DATA,
> +};
> +
> +#define SLI4_WQ_CREATE_MAX_PAGES		8
> +struct sli4_rqst_wq_create {
> +	struct sli4_rqst_hdr	hdr;
> +	__le16		num_pages;
> +	__le16		cq_id;
> +	u8		page_size;
> +	u8		wqe_size_byte;
> +	__le16		wqe_count;
> +	__le32		rsvd;
> +	struct	sli4_dmaaddr
> +			page_phys_addr[SLI4_WQ_CREATE_MAX_PAGES];
> +};
> +
> +struct sli4_rsp_wq_create {
> +	struct sli4_rsp_cmn_create_queue rsp;
> +};
> +
> +enum sli4_link_attention_flags {
> +	LINK_ATTN_TYPE_LINK_UP		= 0x01,
> +	LINK_ATTN_TYPE_LINK_DOWN	= 0x02,
> +	LINK_ATTN_TYPE_NO_HARD_ALPA	= 0x03,
> +
> +	LINK_ATTN_P2P			= 0x01,
> +	LINK_ATTN_FC_AL			= 0x02,
> +	LINK_ATTN_INTERNAL_LOOPBACK	= 0x03,
> +	LINK_ATTN_SERDES_LOOPBACK	= 0x04,
> +
> +	LINK_ATTN_1G			= 0x01,
> +	LINK_ATTN_2G			= 0x02,
> +	LINK_ATTN_4G			= 0x04,
> +	LINK_ATTN_8G			= 0x08,
> +	LINK_ATTN_10G			= 0x0a,
> +	LINK_ATTN_16G			= 0x10,
> +};
> +
> +struct sli4_link_attention {
> +	u8		link_number;
> +	u8		attn_type;
> +	u8		topology;
> +	u8		port_speed;
> +	u8		port_fault;
> +	u8		shared_link_status;
> +	__le16		logical_link_speed;
> +	__le32		event_tag;
> +	u8		rsvd12;
> +	u8		event_code;
> +	u8		event_type;
> +	u8		flags;
> +};
> +
> +enum sli4_link_event_type {
> +	FC_EVENT_LINK_ATTENTION		= 0x01,
> +	FC_EVENT_SHARED_LINK_ATTENTION	= 0x02,
> +};
> +
> +enum sli4_wcqe_flags {
> +	SLI4_WCQE_XB = 0x10,
> +	SLI4_WCQE_QX = 0x80,
> +};
> +
> +struct sli4_fc_wcqe {
> +	u8		hw_status;
> +	u8		status;
> +	__le16		request_tag;
> +	__le32		wqe_specific_1;
> +	__le32		wqe_specific_2;
> +	u8		rsvd12;
> +	u8		qx_byte;
> +	u8		code;
> +	u8		flags;
> +};
> +
> +/* FC WQ consumed CQ queue entry */
> +struct sli4_fc_wqec {
> +	__le32		rsvd0;
> +	__le32		rsvd1;
> +	__le16		wqe_index;
> +	__le16		wq_id;
> +	__le16		rsvd12;
> +	u8		code;
> +	u8		vld_byte;
> +};
> +
> +/* FC Completion Status Codes. */
> +enum sli4_wcqe_status {
> +	SLI4_FC_WCQE_STATUS_SUCCESS,
> +	SLI4_FC_WCQE_STATUS_FCP_RSP_FAILURE,
> +	SLI4_FC_WCQE_STATUS_REMOTE_STOP,
> +	SLI4_FC_WCQE_STATUS_LOCAL_REJECT,
> +	SLI4_FC_WCQE_STATUS_NPORT_RJT,
> +	SLI4_FC_WCQE_STATUS_FABRIC_RJT,
> +	SLI4_FC_WCQE_STATUS_NPORT_BSY,
> +	SLI4_FC_WCQE_STATUS_FABRIC_BSY,
> +	SLI4_FC_WCQE_STATUS_RSVD,
> +	SLI4_FC_WCQE_STATUS_LS_RJT,
> +	SLI4_FC_WCQE_STATUS_RX_BUF_OVERRUN,
> +	SLI4_FC_WCQE_STATUS_CMD_REJECT,
> +	SLI4_FC_WCQE_STATUS_FCP_TGT_LENCHECK,
> +	SLI4_FC_WCQE_STATUS_RSVD1,
> +	SLI4_FC_WCQE_STATUS_ELS_CMPLT_NO_AUTOREG,
> +	SLI4_FC_WCQE_STATUS_RSVD2,
> +	SLI4_FC_WCQE_STATUS_RQ_SUCCESS, //0x10
> +	SLI4_FC_WCQE_STATUS_RQ_BUF_LEN_EXCEEDED,
> +	SLI4_FC_WCQE_STATUS_RQ_INSUFF_BUF_NEEDED,
> +	SLI4_FC_WCQE_STATUS_RQ_INSUFF_FRM_DISC,
> +	SLI4_FC_WCQE_STATUS_RQ_DMA_FAILURE,
> +	SLI4_FC_WCQE_STATUS_FCP_RSP_TRUNCATE,
> +	SLI4_FC_WCQE_STATUS_DI_ERROR,
> +	SLI4_FC_WCQE_STATUS_BA_RJT,
> +	SLI4_FC_WCQE_STATUS_RQ_INSUFF_XRI_NEEDED,
> +	SLI4_FC_WCQE_STATUS_RQ_INSUFF_XRI_DISC,
> +	SLI4_FC_WCQE_STATUS_RX_ERROR_DETECT,
> +	SLI4_FC_WCQE_STATUS_RX_ABORT_REQUEST,
> +
> +	/* driver generated status codes */
> +	SLI4_FC_WCQE_STATUS_DISPATCH_ERROR	= 0xfd,
> +	SLI4_FC_WCQE_STATUS_SHUTDOWN		= 0xfe,
> +	SLI4_FC_WCQE_STATUS_TARGET_WQE_TIMEOUT	= 0xff,
> +};
> +
> +/* DI_ERROR Extended Status */
> +enum sli4_fc_di_error_status {
> +	SLI4_FC_DI_ERROR_GE			= (1 << 0),
> +	SLI4_FC_DI_ERROR_AE			= (1 << 1),
> +	SLI4_FC_DI_ERROR_RE			= (1 << 2),
> +	SLI4_FC_DI_ERROR_TDPV			= (1 << 3),
> +	SLI4_FC_DI_ERROR_UDB			= (1 << 4),
> +	SLI4_FC_DI_ERROR_EDIR			= (1 << 5),
> +};
> +
> +/* WQE DIF field contents */
> +enum sli4_dif_fields {
> +	SLI4_DIF_DISABLED,
> +	SLI4_DIF_PASS_THROUGH,
> +	SLI4_DIF_STRIP,
> +	SLI4_DIF_INSERT,
> +};
> +
> +/* Work Queue Entry (WQE) types */
> +enum sli4_wqe_types {
> +	SLI4_WQE_ABORT				= 0x0f,
> +	SLI4_WQE_ELS_REQUEST64			= 0x8a,
> +	SLI4_WQE_FCP_IBIDIR64			= 0xac,
> +	SLI4_WQE_FCP_IREAD64			= 0x9a,
> +	SLI4_WQE_FCP_IWRITE64			= 0x98,
> +	SLI4_WQE_FCP_ICMND64			= 0x9c,
> +	SLI4_WQE_FCP_TRECEIVE64			= 0xa1,
> +	SLI4_WQE_FCP_CONT_TRECEIVE64		= 0xe5,
> +	SLI4_WQE_FCP_TRSP64			= 0xa3,
> +	SLI4_WQE_FCP_TSEND64			= 0x9f,
> +	SLI4_WQE_GEN_REQUEST64			= 0xc2,
> +	SLI4_WQE_SEND_FRAME			= 0xe1,
> +	SLI4_WQE_XMIT_BCAST64			= 0x84,
> +	SLI4_WQE_XMIT_BLS_RSP			= 0x97,
> +	SLI4_WQE_ELS_RSP64			= 0x95,
> +	SLI4_WQE_XMIT_SEQUENCE64		= 0x82,
> +	SLI4_WQE_REQUEUE_XRI			= 0x93,
> +};
> +
> +/* WQE command types */
> +enum sli4_wqe_cmds {
> +	SLI4_CMD_FCP_IREAD64_WQE		= 0x00,
> +	SLI4_CMD_FCP_ICMND64_WQE		= 0x00,
> +	SLI4_CMD_FCP_IWRITE64_WQE		= 0x01,
> +	SLI4_CMD_FCP_TRECEIVE64_WQE		= 0x02,
> +	SLI4_CMD_FCP_TRSP64_WQE			= 0x03,
> +	SLI4_CMD_FCP_TSEND64_WQE		= 0x07,
> +	SLI4_CMD_GEN_REQUEST64_WQE		= 0x08,
> +	SLI4_CMD_XMIT_BCAST64_WQE		= 0x08,
> +	SLI4_CMD_XMIT_BLS_RSP64_WQE		= 0x08,
> +	SLI4_CMD_ABORT_WQE			= 0x08,
> +	SLI4_CMD_XMIT_SEQUENCE64_WQE		= 0x08,
> +	SLI4_CMD_REQUEUE_XRI_WQE		= 0x0A,
> +	SLI4_CMD_SEND_FRAME_WQE			= 0x0a,
> +};
> +
> +#define SLI4_WQE_SIZE				0x05
> +#define SLI4_WQE_EXT_SIZE			0x06
> +
> +#define SLI4_WQE_BYTES				(16 * sizeof(u32))
> +#define SLI4_WQE_EXT_BYTES			(32 * sizeof(u32))
> +
> +/* Mask for ccp (CS_CTL) */
> +#define SLI4_MASK_CCP				0xfe
> +
> +/* Generic WQE */
> +enum sli4_gen_wqe_flags {
> +	SLI4_GEN_WQE_EBDECNT	= (0xf << 0),
> +	SLI4_GEN_WQE_LEN_LOC	= (0x3 << 7),
> +	SLI4_GEN_WQE_QOSD	= (1 << 9),
> +	SLI4_GEN_WQE_XBL	= (1 << 11),
> +	SLI4_GEN_WQE_HLM	= (1 << 12),
> +	SLI4_GEN_WQE_IOD	= (1 << 13),
> +	SLI4_GEN_WQE_DBDE	= (1 << 14),
> +	SLI4_GEN_WQE_WQES	= (1 << 15),
> +
> +	SLI4_GEN_WQE_PRI	= (0x7),
> +	SLI4_GEN_WQE_PV		= (1 << 3),
> +	SLI4_GEN_WQE_EAT	= (1 << 4),
> +	SLI4_GEN_WQE_XC		= (1 << 5),
> +	SLI4_GEN_WQE_CCPE	= (1 << 7),
> +
> +	SLI4_GEN_WQE_CMDTYPE	= (0xf),
> +	SLI4_GEN_WQE_WQEC	= (1 << 7),
> +};
> +
> +struct sli4_generic_wqe {
> +	__le32		cmd_spec0_5[6];
> +	__le16		xri_tag;
> +	__le16		context_tag;
> +	u8		ct_byte;
> +	u8		command;
> +	u8		class_byte;
> +	u8		timer;
> +	__le32		abort_tag;
> +	__le16		request_tag;
> +	__le16		rsvd34;
> +	__le16		dw10w0_flags;
> +	u8		eat_xc_ccpe;
> +	u8		ccp;
> +	u8		cmdtype_wqec_byte;
> +	u8		rsvd41;
> +	__le16		cq_id;
> +};
> +
> +/* WQE used to abort exchanges. */
> +enum sli4_abort_wqe_flags {
> +	SLI4_ABRT_WQE_IR	= 0x02,
> +
> +	SLI4_ABRT_WQE_EBDECNT	= (0xf << 0),
> +	SLI4_ABRT_WQE_LEN_LOC	= (0x3 << 7),
> +	SLI4_ABRT_WQE_QOSD	= (1 << 9),
> +	SLI4_ABRT_WQE_XBL	= (1 << 11),
> +	SLI4_ABRT_WQE_IOD	= (1 << 13),
> +	SLI4_ABRT_WQE_DBDE	= (1 << 14),
> +	SLI4_ABRT_WQE_WQES	= (1 << 15),
> +
> +	SLI4_ABRT_WQE_PRI	= (0x7),
> +	SLI4_ABRT_WQE_PV	= (1 << 3),
> +	SLI4_ABRT_WQE_EAT	= (1 << 4),
> +	SLI4_ABRT_WQE_XC	= (1 << 5),
> +	SLI4_ABRT_WQE_CCPE	= (1 << 7),
> +
> +	SLI4_ABRT_WQE_CMDTYPE	= (0xf),
> +	SLI4_ABRT_WQE_WQEC	= (1 << 7),
> +};
> +
> +struct sli4_abort_wqe {
> +	__le32		rsvd0;
> +	__le32		rsvd4;
> +	__le32		ext_t_tag;
> +	u8		ia_ir_byte;
> +	u8		criteria;
> +	__le16		rsvd10;
> +	__le32		ext_t_mask;
> +	__le32		t_mask;
> +	__le16		xri_tag;
> +	__le16		context_tag;
> +	u8		ct_byte;
> +	u8		command;
> +	u8		class_byte;
> +	u8		timer;
> +	__le32		t_tag;
> +	__le16		request_tag;
> +	__le16		rsvd34;
> +	__le16		dw10w0_flags;
> +	u8		eat_xc_ccpe;
> +	u8		ccp;
> +	u8		cmdtype_wqec_byte;
> +	u8		rsvd41;
> +	__le16		cq_id;
> +};
> +
> +enum sli4_abort_criteria {
> +	SLI4_ABORT_CRITERIA_XRI_TAG = 0x01,
> +	SLI4_ABORT_CRITERIA_ABORT_TAG,
> +	SLI4_ABORT_CRITERIA_REQUEST_TAG,
> +	SLI4_ABORT_CRITERIA_EXT_ABORT_TAG,
> +};
> +
> +enum sli4_abort_type {
> +	SLI_ABORT_XRI,
> +	SLI_ABORT_ABORT_ID,
> +	SLI_ABORT_REQUEST_ID,
> +	SLI_ABORT_MAX,		/* must be last */
> +};
> +
> +/* WQE used to create an ELS request. */
> +enum sli4_els_req_wqe_flags {
> +	SLI4_REQ_WQE_QOSD		= 0x2,
> +	SLI4_REQ_WQE_DBDE		= 0x40,
> +	SLI4_REQ_WQE_XBL		= 0x8,
> +	SLI4_REQ_WQE_XC			= 0x20,
> +	SLI4_REQ_WQE_IOD		= 0x20,
> +	SLI4_REQ_WQE_HLM		= 0x10,
> +	SLI4_REQ_WQE_CCPE		= 0x80,
> +	SLI4_REQ_WQE_EAT		= 0x10,
> +	SLI4_REQ_WQE_WQES		= 0x80,
> +	SLI4_REQ_WQE_PU_SHFT		= 4,
> +	SLI4_REQ_WQE_CT_SHFT		= 2,
> +	SLI4_REQ_WQE_CT			= 0xc,
> +	SLI4_REQ_WQE_ELSID_SHFT		= 4,
> +	SLI4_REQ_WQE_SP_SHFT		= 24,
> +	SLI4_REQ_WQE_LEN_LOC_BIT1	= 0x80,
> +	SLI4_REQ_WQE_LEN_LOC_BIT2	= 0x1,
> +};
> +
> +struct sli4_els_request64_wqe {
> +	struct sli4_bde	els_request_payload;
> +	__le32		els_request_payload_length;
> +	__le32		sid_sp_dword;
> +	__le32		remote_id_dword;
> +	__le16		xri_tag;
> +	__le16		context_tag;
> +	u8		ct_byte;
> +	u8		command;
> +	u8		class_byte;
> +	u8		timer;
> +	__le32		abort_tag;
> +	__le16		request_tag;
> +	__le16		temporary_rpi;
> +	u8		len_loc1_byte;
> +	u8		qosd_xbl_hlm_iod_dbde_wqes;
> +	u8		eat_xc_ccpe;
> +	u8		ccp;
> +	u8		cmdtype_elsid_byte;
> +	u8		rsvd41;
> +	__le16		cq_id;
> +	struct sli4_bde	els_response_payload_bde;
> +	__le32		max_response_payload_length;
> +};
> +
> +/* WQE used to create an FCP initiator no data command. */
> +enum sli4_icmd_wqe_flags {
> +	SLI4_ICMD_WQE_DBDE		= 0x40,
> +	SLI4_ICMD_WQE_XBL		= 0x8,
> +	SLI4_ICMD_WQE_XC		= 0x20,
> +	SLI4_ICMD_WQE_IOD		= 0x20,
> +	SLI4_ICMD_WQE_HLM		= 0x10,
> +	SLI4_ICMD_WQE_CCPE		= 0x80,
> +	SLI4_ICMD_WQE_EAT		= 0x10,
> +	SLI4_ICMD_WQE_APPID		= 0x10,
> +	SLI4_ICMD_WQE_WQES		= 0x80,
> +	SLI4_ICMD_WQE_PU_SHFT		= 4,
> +	SLI4_ICMD_WQE_CT_SHFT		= 2,
> +	SLI4_ICMD_WQE_BS_SHFT		= 4,
> +	SLI4_ICMD_WQE_LEN_LOC_BIT1	= 0x80,
> +	SLI4_ICMD_WQE_LEN_LOC_BIT2	= 0x1,
> +};
> +
> +struct sli4_fcp_icmnd64_wqe {
> +	struct sli4_bde	bde;
> +	__le16		payload_offset_length;
> +	__le16		fcp_cmd_buffer_length;
> +	__le32		rsvd12;
> +	__le32		remote_n_port_id_dword;
> +	__le16		xri_tag;
> +	__le16		context_tag;
> +	u8		dif_ct_bs_byte;
> +	u8		command;
> +	u8		class_pu_byte;
> +	u8		timer;
> +	__le32		abort_tag;
> +	__le16		request_tag;
> +	__le16		rsvd34;
> +	u8		len_loc1_byte;
> +	u8		qosd_xbl_hlm_iod_dbde_wqes;
> +	u8		eat_xc_ccpe;
> +	u8		ccp;
> +	u8		cmd_type_byte;
> +	u8		rsvd41;
> +	__le16		cq_id;
> +	__le32		rsvd44;
> +	__le32		rsvd48;
> +	__le32		rsvd52;
> +	__le32		rsvd56;
> +};
> +
> +/* WQE used to create an FCP initiator read. */
> +enum sli4_ir_wqe_flags {
> +	SLI4_IR_WQE_DBDE		= 0x40,
> +	SLI4_IR_WQE_XBL			= 0x8,
> +	SLI4_IR_WQE_XC			= 0x20,
> +	SLI4_IR_WQE_IOD			= 0x20,
> +	SLI4_IR_WQE_HLM			= 0x10,
> +	SLI4_IR_WQE_CCPE		= 0x80,
> +	SLI4_IR_WQE_EAT			= 0x10,
> +	SLI4_IR_WQE_APPID		= 0x10,
> +	SLI4_IR_WQE_WQES		= 0x80,
> +	SLI4_IR_WQE_PU_SHFT		= 4,
> +	SLI4_IR_WQE_CT_SHFT		= 2,
> +	SLI4_IR_WQE_BS_SHFT		= 4,
> +	SLI4_IR_WQE_LEN_LOC_BIT1	= 0x80,
> +	SLI4_IR_WQE_LEN_LOC_BIT2	= 0x1,
> +};
> +
> +struct sli4_fcp_iread64_wqe {
> +	struct sli4_bde	bde;
> +	__le16		payload_offset_length;
> +	__le16		fcp_cmd_buffer_length;
> +
> +	__le32		total_transfer_length;
> +
> +	__le32		remote_n_port_id_dword;
> +
> +	__le16		xri_tag;
> +	__le16		context_tag;
> +
> +	u8		dif_ct_bs_byte;
> +	u8		command;
> +	u8		class_pu_byte;
> +	u8		timer;
> +
> +	__le32		abort_tag;
> +
> +	__le16		request_tag;
> +	__le16		rsvd34;
> +
> +	u8		len_loc1_byte;
> +	u8		qosd_xbl_hlm_iod_dbde_wqes;
> +	u8		eat_xc_ccpe;
> +	u8		ccp;
> +
> +	u8		cmd_type_byte;
> +	u8		rsvd41;
> +	__le16		cq_id;
> +
> +	__le32		rsvd44;
> +	struct sli4_bde	first_data_bde;
> +};
> +
> +/* WQE used to create an FCP initiator write. */
> +enum sli4_iwr_wqe_flags {
> +	SLI4_IWR_WQE_DBDE		= 0x40,
> +	SLI4_IWR_WQE_XBL		= 0x8,
> +	SLI4_IWR_WQE_XC			= 0x20,
> +	SLI4_IWR_WQE_IOD		= 0x20,
> +	SLI4_IWR_WQE_HLM		= 0x10,
> +	SLI4_IWR_WQE_DNRX		= 0x10,
> +	SLI4_IWR_WQE_CCPE		= 0x80,
> +	SLI4_IWR_WQE_EAT		= 0x10,
> +	SLI4_IWR_WQE_APPID		= 0x10,
> +	SLI4_IWR_WQE_WQES		= 0x80,
> +	SLI4_IWR_WQE_PU_SHFT		= 4,
> +	SLI4_IWR_WQE_CT_SHFT		= 2,
> +	SLI4_IWR_WQE_BS_SHFT		= 4,
> +	SLI4_IWR_WQE_LEN_LOC_BIT1	= 0x80,
> +	SLI4_IWR_WQE_LEN_LOC_BIT2	= 0x1,
> +};
> +
> +struct sli4_fcp_iwrite64_wqe {
> +	struct sli4_bde	bde;
> +	__le16		payload_offset_length;
> +	__le16		fcp_cmd_buffer_length;
> +	__le16		total_transfer_length;
> +	__le16		initial_transfer_length;
> +	__le16		xri_tag;
> +	__le16		context_tag;
> +	u8		dif_ct_bs_byte;
> +	u8		command;
> +	u8		class_pu_byte;
> +	u8		timer;
> +	__le32		abort_tag;
> +	__le16		request_tag;
> +	__le16		rsvd34;
> +	u8		len_loc1_byte;
> +	u8		qosd_xbl_hlm_iod_dbde_wqes;
> +	u8		eat_xc_ccpe;
> +	u8		ccp;
> +	u8		cmd_type_byte;
> +	u8		rsvd41;
> +	__le16		cq_id;
> +	__le32		remote_n_port_id_dword;
> +	struct sli4_bde	first_data_bde;
> +};
> +
> +struct sli4_fcp_128byte_wqe {
> +	u32 dw[32];
> +};
> +
> +/* WQE used to create an FCP target receive */
> +enum sli4_trcv_wqe_flags {
> +	SLI4_TRCV_WQE_DBDE		= 0x40,
> +	SLI4_TRCV_WQE_XBL		= 0x8,
> +	SLI4_TRCV_WQE_AR		= 0x8,
> +	SLI4_TRCV_WQE_XC		= 0x20,
> +	SLI4_TRCV_WQE_IOD		= 0x20,
> +	SLI4_TRCV_WQE_HLM		= 0x10,
> +	SLI4_TRCV_WQE_DNRX		= 0x10,
> +	SLI4_TRCV_WQE_CCPE		= 0x80,
> +	SLI4_TRCV_WQE_EAT		= 0x10,
> +	SLI4_TRCV_WQE_APPID		= 0x10,
> +	SLI4_TRCV_WQE_WQES		= 0x80,
> +	SLI4_TRCV_WQE_PU_SHFT		= 4,
> +	SLI4_TRCV_WQE_CT_SHFT		= 2,
> +	SLI4_TRCV_WQE_BS_SHFT		= 4,
> +	SLI4_TRCV_WQE_LEN_LOC_BIT2	= 0x1,
> +};
> +
> +struct sli4_fcp_treceive64_wqe {
> +	struct sli4_bde	bde;
> +	__le32		payload_offset_length;
> +	__le32		relative_offset;
> +	union {
> +		__le16		sec_xri_tag;
> +		__le16		rsvd;
> +		__le32		dword;
> +	} dword5;
> +	__le16		xri_tag;
> +	__le16		context_tag;
> +	u8		dif_ct_bs_byte;
> +	u8		command;
> +	u8		class_ar_pu_byte;
> +	u8		timer;
> +	__le32		abort_tag;
> +	__le16		request_tag;
> +	__le16		remote_xid;
> +	u8		lloc1_appid;
> +	u8		qosd_xbl_hlm_iod_dbde_wqes;
> +	u8		eat_xc_ccpe;
> +	u8		ccp;
> +	u8		cmd_type_byte;
> +	u8		rsvd41;
> +	__le16		cq_id;
> +	__le32		fcp_data_receive_length;
> +	struct sli4_bde	first_data_bde;
> +};
> +
> +/* WQE used to create an FCP target response */
> +enum sli4_trsp_wqe_flags {
> +	SLI4_TRSP_WQE_AG	= 0x8,
> +	SLI4_TRSP_WQE_DBDE	= 0x40,
> +	SLI4_TRSP_WQE_XBL	= 0x8,
> +	SLI4_TRSP_WQE_XC	= 0x20,
> +	SLI4_TRSP_WQE_HLM	= 0x10,
> +	SLI4_TRSP_WQE_DNRX	= 0x10,
> +	SLI4_TRSP_WQE_CCPE	= 0x80,
> +	SLI4_TRSP_WQE_EAT	= 0x10,
> +	SLI4_TRSP_WQE_APPID	= 0x10,
> +	SLI4_TRSP_WQE_WQES	= 0x80,
> +};
> +
> +struct sli4_fcp_trsp64_wqe {
> +	struct sli4_bde	bde;
> +	__le32		fcp_response_length;
> +	__le32		rsvd12;
> +	__le32		dword5;
> +	__le16		xri_tag;
> +	__le16		rpi;
> +	u8		ct_dnrx_byte;
> +	u8		command;
> +	u8		class_ag_byte;
> +	u8		timer;
> +	__le32		abort_tag;
> +	__le16		request_tag;
> +	__le16		remote_xid;
> +	u8		lloc1_appid;
> +	u8		qosd_xbl_hlm_dbde_wqes;
> +	u8		eat_xc_ccpe;
> +	u8		ccp;
> +	u8		cmd_type_byte;
> +	u8		rsvd41;
> +	__le16		cq_id;
> +	__le32		rsvd44;
> +	__le32		rsvd48;
> +	__le32		rsvd52;
> +	__le32		rsvd56;
> +};
> +
> +/* WQE used to create an FCP target send (DATA IN). */
> +enum sli4_tsend_wqe_flags {
> +	SLI4_TSEND_WQE_XBL	= 0x8,
> +	SLI4_TSEND_WQE_DBDE	= 0x40,
> +	SLI4_TSEND_WQE_IOD	= 0x20,
> +	SLI4_TSEND_WQE_QOSD	= 0x2,
> +	SLI4_TSEND_WQE_HLM	= 0x10,
> +	SLI4_TSEND_WQE_PU_SHFT	= 4,
> +	SLI4_TSEND_WQE_AR	= 0x8,
> +	SLI4_TSEND_CT_SHFT	= 2,
> +	SLI4_TSEND_BS_SHFT	= 4,
> +	SLI4_TSEND_LEN_LOC_BIT2 = 0x1,
> +	SLI4_TSEND_CCPE		= 0x80,
> +	SLI4_TSEND_APPID_VALID	= 0x20,
> +	SLI4_TSEND_WQES		= 0x80,
> +	SLI4_TSEND_XC		= 0x20,
> +	SLI4_TSEND_EAT		= 0x10,
> +};
> +
> +struct sli4_fcp_tsend64_wqe {
> +	struct sli4_bde	bde;
> +	__le32		payload_offset_length;
> +	__le32		relative_offset;
> +	__le32		dword5;
> +	__le16		xri_tag;
> +	__le16		rpi;
> +	u8		ct_byte;
> +	u8		command;
> +	u8		class_pu_ar_byte;
> +	u8		timer;
> +	__le32		abort_tag;
> +	__le16		request_tag;
> +	__le16		remote_xid;
> +	u8		dw10byte0;
> +	u8		ll_qd_xbl_hlm_iod_dbde;
> +	u8		dw10byte2;
> +	u8		ccp;
> +	u8		cmd_type_byte;
> +	u8		rsvd45;
> +	__le16		cq_id;
> +	__le32		fcp_data_transmit_length;
> +	struct sli4_bde	first_data_bde;
> +};
> +
> +/* WQE used to create a general request. */
> +enum sli4_gen_req_wqe_flags {
> +	SLI4_GEN_REQ64_WQE_XBL	= 0x8,
> +	SLI4_GEN_REQ64_WQE_DBDE	= 0x40,
> +	SLI4_GEN_REQ64_WQE_IOD	= 0x20,
> +	SLI4_GEN_REQ64_WQE_QOSD	= 0x2,
> +	SLI4_GEN_REQ64_WQE_HLM	= 0x10,
> +	SLI4_GEN_REQ64_CT_SHFT	= 2,
> +};
> +
> +struct sli4_gen_request64_wqe {
> +	struct sli4_bde	bde;
> +	__le32		request_payload_length;
> +	__le32		relative_offset;
> +	u8		rsvd17;
> +	u8		df_ctl;
> +	u8		type;
> +	u8		r_ctl;
> +	__le16		xri_tag;
> +	__le16		context_tag;
> +	u8		ct_byte;
> +	u8		command;
> +	u8		class_byte;
> +	u8		timer;
> +	__le32		abort_tag;
> +	__le16		request_tag;
> +	__le16		rsvd34;
> +	u8		dw10flags0;
> +	u8		dw10flags1;
> +	u8		dw10flags2;
> +	u8		ccp;
> +	u8		cmd_type_byte;
> +	u8		rsvd41;
> +	__le16		cq_id;
> +	__le32		remote_n_port_id_dword;
> +	__le32		rsvd48;
> +	__le32		rsvd52;
> +	__le32		max_response_payload_length;
> +};
> +
> +/* WQE used to create a send frame request */
> +enum sli4_sf_wqe_flags {
> +	SLI4_SF_WQE_DBDE	= 0x40,
> +	SLI4_SF_PU		= 0x30,
> +	SLI4_SF_CT		= 0xc,
> +	SLI4_SF_QOSD		= 0x2,
> +	SLI4_SF_LEN_LOC_BIT1	= 0x80,
> +	SLI4_SF_LEN_LOC_BIT2	= 0x1,
> +	SLI4_SF_XC		= 0x20,
> +	SLI4_SF_XBL		= 0x8,
> +};
> +
> +struct sli4_send_frame_wqe {
> +	struct sli4_bde	bde;
> +	__le32		frame_length;
> +	__le32		fc_header_0_1[2];
> +	__le16		xri_tag;
> +	__le16		context_tag;
> +	u8		ct_byte;
> +	u8		command;
> +	u8		dw7flags0;
> +	u8		timer;
> +	__le32		abort_tag;
> +	__le16		request_tag;
> +	u8		eof;
> +	u8		sof;
> +	u8		dw10flags0;
> +	u8		dw10flags1;
> +	u8		dw10flags2;
> +	u8		ccp;
> +	u8		cmd_type_byte;
> +	u8		rsvd41;
> +	__le16		cq_id;
> +	__le32		fc_header_2_5[4];
> +};
> +
> +/* WQE used to create a transmit sequence */
> +enum sli4_seq_wqe_flags {
> +	SLI4_SEQ_WQE_DBDE		= 0x4000,
> +	SLI4_SEQ_WQE_XBL		= 0x800,
> +	SLI4_SEQ_WQE_SI			= 0x4,
> +	SLI4_SEQ_WQE_FT			= 0x8,
> +	SLI4_SEQ_WQE_XO			= 0x40,
> +	SLI4_SEQ_WQE_LS			= 0x80,
> +	SLI4_SEQ_WQE_DIF		= 0x3,
> +	SLI4_SEQ_WQE_BS			= 0x70,
> +	SLI4_SEQ_WQE_PU			= 0x30,
> +	SLI4_SEQ_WQE_HLM		= 0x1000,
> +	SLI4_SEQ_WQE_IOD_SHIFT		= 13,
> +	SLI4_SEQ_WQE_CT_SHIFT		= 2,
> +	SLI4_SEQ_WQE_LEN_LOC_SHIFT	= 7,
> +};
> +
> +struct sli4_xmit_sequence64_wqe {
> +	struct sli4_bde	bde;
> +	__le32		remote_n_port_id_dword;
> +	__le32		relative_offset;
> +	u8		dw5flags0;
> +	u8		df_ctl;
> +	u8		type;
> +	u8		r_ctl;
> +	__le16		xri_tag;
> +	__le16		context_tag;
> +	u8		dw7flags0;
> +	u8		command;
> +	u8		dw7flags1;
> +	u8		timer;
> +	__le32		abort_tag;
> +	__le16		request_tag;
> +	__le16		remote_xid;
> +	__le16		dw10w0;
> +	u8		dw10flags0;
> +	u8		ccp;
> +	u8		cmd_type_wqec_byte;
> +	u8		rsvd45;
> +	__le16		cq_id;
> +	__le32		sequence_payload_len;
> +	__le32		rsvd48;
> +	__le32		rsvd52;
> +	__le32		rsvd56;
> +};
> +
> +/*
> + * WQE used unblock the specified XRI and to release
> + * it to the SLI Port's free pool.
> + */
> +enum sli4_requeue_wqe_flags {
> +	SLI4_REQU_XRI_WQE_XC	= 0x20,
> +	SLI4_REQU_XRI_WQE_QOSD	= 0x2,
> +};
> +
> +struct sli4_requeue_xri_wqe {
> +	__le32		rsvd0;
> +	__le32		rsvd4;
> +	__le32		rsvd8;
> +	__le32		rsvd12;
> +	__le32		rsvd16;
> +	__le32		rsvd20;
> +	__le16		xri_tag;
> +	__le16		context_tag;
> +	u8		ct_byte;
> +	u8		command;
> +	u8		class_byte;
> +	u8		timer;
> +	__le32		rsvd32;
> +	__le16		request_tag;
> +	__le16		rsvd34;
> +	__le16		flags0;
> +	__le16		flags1;
> +	__le16		flags2;
> +	u8		ccp;
> +	u8		cmd_type_wqec_byte;
> +	u8		rsvd42;
> +	__le16		cq_id;
> +	__le32		rsvd44;
> +	__le32		rsvd48;
> +	__le32		rsvd52;
> +	__le32		rsvd56;
> +};
> +
> +/* WQE used to create a BLS response */
> +enum sli4_bls_rsp_wqe_flags {
> +	SLI4_BLS_RSP_RID		= 0xffffff,
> +	SLI4_BLS_RSP_WQE_AR		= 0x40000000,
> +	SLI4_BLS_RSP_WQE_CT_SHFT	= 2,
> +	SLI4_BLS_RSP_WQE_QOSD		= 0x2,
> +	SLI4_BLS_RSP_WQE_HLM		= 0x10,
> +};
> +
> +struct sli4_xmit_bls_rsp_wqe {
> +	__le32		payload_word0;
> +	__le16		rx_id;
> +	__le16		ox_id;
> +	__le16		high_seq_cnt;
> +	__le16		low_seq_cnt;
> +	__le32		rsvd12;
> +	__le32		local_n_port_id_dword;
> +	__le32		remote_id_dword;
> +	__le16		xri_tag;
> +	__le16		context_tag;
> +	u8		dw8flags0;
> +	u8		command;
> +	u8		dw8flags1;
> +	u8		timer;
> +	__le32		abort_tag;
> +	__le16		request_tag;
> +	__le16		rsvd38;
> +	u8		dw11flags0;
> +	u8		dw11flags1;
> +	u8		dw11flags2;
> +	u8		ccp;
> +	u8		dw12flags0;
> +	u8		rsvd45;
> +	__le16		cq_id;
> +	__le16		temporary_rpi;
> +	u8		rsvd50;
> +	u8		rsvd51;
> +	__le32		rsvd52;
> +	__le32		rsvd56;
> +	__le32		rsvd60;
> +};
> +
> +enum sli_bls_type {
> +	SLI4_SLI_BLS_ACC,
> +	SLI4_SLI_BLS_RJT,
> +	SLI4_SLI_BLS_MAX
> +};
> +
> +struct sli_bls_payload {
> +	enum sli_bls_type	type;
> +	__le16			ox_id;
> +	__le16			rx_id;
> +	union {
> +		struct {
> +			u8	seq_id_validity;
> +			u8	seq_id_last;
> +			u8	rsvd2;
> +			u8	rsvd3;
> +			u16	ox_id;
> +			u16	rx_id;
> +			__le16	low_seq_cnt;
> +			__le16	high_seq_cnt;
> +		} acc;
> +		struct {
> +			u8	vendor_unique;
> +			u8	reason_explanation;
> +			u8	reason_code;
> +			u8	rsvd3;
> +		} rjt;
> +	} u;
> +};
> +
> +/* WQE used to create an ELS response */
> +
> +enum sli4_els_rsp_flags {
> +	SLI4_ELS_SID		= 0xffffff,
> +	SLI4_ELS_RID		= 0xffffff,
> +	SLI4_ELS_DBDE		= 0x40,
> +	SLI4_ELS_XBL		= 0x8,
> +	SLI4_ELS_IOD		= 0x20,
> +	SLI4_ELS_QOSD		= 0x2,
> +	SLI4_ELS_XC		= 0x20,
> +	SLI4_ELS_CT_OFFSET	= 0X2,
> +	SLI4_ELS_SP		= 0X1000000,
> +	SLI4_ELS_HLM		= 0X10,
> +};
> +
> +struct sli4_xmit_els_rsp64_wqe {
> +	struct sli4_bde	els_response_payload;
> +	__le32		els_response_payload_length;
> +	__le32		sid_dw;
> +	__le32		rid_dw;
> +	__le16		xri_tag;
> +	__le16		context_tag;
> +	u8		ct_byte;
> +	u8		command;
> +	u8		class_byte;
> +	u8		timer;
> +	__le32		abort_tag;
> +	__le16		request_tag;
> +	__le16		ox_id;
> +	u8		flags1;
> +	u8		flags2;
> +	u8		flags3;
> +	u8		flags4;
> +	u8		cmd_type_wqec;
> +	u8		rsvd34;
> +	__le16		cq_id;
> +	__le16		temporary_rpi;
> +	__le16		rsvd38;
> +	u32		rsvd40;
> +	u32		rsvd44;
> +	u32		rsvd48;
> +};
> +
> +/* Prameters used to populate WQE*/
> +struct sli_bls_params {
> +	u32		s_id;
> +	u16		ox_id;
> +	u16		rx_id;
> +	u8		payload[12];
> +};
> +
> +struct sli_els_params {
> +	u32		s_id;
> +	u16		ox_id;
> +	u8		timeout;
> +};
> +
> +struct sli_ct_params {
> +	u8		r_ctl;
> +	u8		type;
> +	u8		df_ctl;
> +	u8		timeout;
> +	u16		ox_id;
> +};
> +
> +struct sli_fcp_tgt_params {
> +	u32		offset;
> +	u16		ox_id;
> +	u16		flags;
> +	u8		cs_ctl;
> +	u8		timeout;
> +	u32		app_id;
> +};
> +
> +/* Local Reject Reason Codes */
> +enum sli4_fc_local_rej_codes {
> +	SLI4_FC_LOCAL_REJECT_UNKNOWN,
> +	SLI4_FC_LOCAL_REJECT_MISSING_CONTINUE,
> +	SLI4_FC_LOCAL_REJECT_SEQUENCE_TIMEOUT,
> +	SLI4_FC_LOCAL_REJECT_INTERNAL_ERROR,
> +	SLI4_FC_LOCAL_REJECT_INVALID_RPI,
> +	SLI4_FC_LOCAL_REJECT_NO_XRI,
> +	SLI4_FC_LOCAL_REJECT_ILLEGAL_COMMAND,
> +	SLI4_FC_LOCAL_REJECT_XCHG_DROPPED,
> +	SLI4_FC_LOCAL_REJECT_ILLEGAL_FIELD,
> +	SLI4_FC_LOCAL_REJECT_RPI_SUSPENDED,
> +	SLI4_FC_LOCAL_REJECT_RSVD,
> +	SLI4_FC_LOCAL_REJECT_RSVD1,
> +	SLI4_FC_LOCAL_REJECT_NO_ABORT_MATCH,
> +	SLI4_FC_LOCAL_REJECT_TX_DMA_FAILED,
> +	SLI4_FC_LOCAL_REJECT_RX_DMA_FAILED,
> +	SLI4_FC_LOCAL_REJECT_ILLEGAL_FRAME,
> +	SLI4_FC_LOCAL_REJECT_RSVD2,
> +	SLI4_FC_LOCAL_REJECT_NO_RESOURCES, //0x11
> +	SLI4_FC_LOCAL_REJECT_FCP_CONF_FAILURE,
> +	SLI4_FC_LOCAL_REJECT_ILLEGAL_LENGTH,
> +	SLI4_FC_LOCAL_REJECT_UNSUPPORTED_FEATURE,
> +	SLI4_FC_LOCAL_REJECT_ABORT_IN_PROGRESS,
> +	SLI4_FC_LOCAL_REJECT_ABORT_REQUESTED,
> +	SLI4_FC_LOCAL_REJECT_RCV_BUFFER_TIMEOUT,
> +	SLI4_FC_LOCAL_REJECT_LOOP_OPEN_FAILURE,
> +	SLI4_FC_LOCAL_REJECT_RSVD3,
> +	SLI4_FC_LOCAL_REJECT_LINK_DOWN,
> +	SLI4_FC_LOCAL_REJECT_CORRUPTED_DATA,
> +	SLI4_FC_LOCAL_REJECT_CORRUPTED_RPI,
> +	SLI4_FC_LOCAL_REJECT_OUTOFORDER_DATA,
> +	SLI4_FC_LOCAL_REJECT_OUTOFORDER_ACK,
> +	SLI4_FC_LOCAL_REJECT_DUP_FRAME,
> +	SLI4_FC_LOCAL_REJECT_LINK_CONTROL_FRAME, //0x20
> +	SLI4_FC_LOCAL_REJECT_BAD_HOST_ADDRESS,
> +	SLI4_FC_LOCAL_REJECT_RSVD4,
> +	SLI4_FC_LOCAL_REJECT_MISSING_HDR_BUFFER,
> +	SLI4_FC_LOCAL_REJECT_MSEQ_CHAIN_CORRUPTED,
> +	SLI4_FC_LOCAL_REJECT_ABORTMULT_REQUESTED,
> +	SLI4_FC_LOCAL_REJECT_BUFFER_SHORTAGE	= 0x28,
> +	SLI4_FC_LOCAL_REJECT_RCV_XRIBUF_WAITING,
> +	SLI4_FC_LOCAL_REJECT_INVALID_VPI	= 0x2e,
> +	SLI4_FC_LOCAL_REJECT_NO_FPORT_DETECTED,
> +	SLI4_FC_LOCAL_REJECT_MISSING_XRIBUF,
> +	SLI4_FC_LOCAL_REJECT_RSVD5,
> +	SLI4_FC_LOCAL_REJECT_INVALID_XRI,
> +	SLI4_FC_LOCAL_REJECT_INVALID_RELOFFSET	= 0x40,
> +	SLI4_FC_LOCAL_REJECT_MISSING_RELOFFSET,
> +	SLI4_FC_LOCAL_REJECT_INSUFF_BUFFERSPACE,
> +	SLI4_FC_LOCAL_REJECT_MISSING_SI,
> +	SLI4_FC_LOCAL_REJECT_MISSING_ES,
> +	SLI4_FC_LOCAL_REJECT_INCOMPLETE_XFER,
> +	SLI4_FC_LOCAL_REJECT_SLER_FAILURE,
> +	SLI4_FC_LOCAL_REJECT_SLER_CMD_RCV_FAILURE,
> +	SLI4_FC_LOCAL_REJECT_SLER_REC_RJT_ERR,
> +	SLI4_FC_LOCAL_REJECT_SLER_REC_SRR_RETRY_ERR,
> +	SLI4_FC_LOCAL_REJECT_SLER_SRR_RJT_ERR,
> +	SLI4_FC_LOCAL_REJECT_RSVD6,
> +	SLI4_FC_LOCAL_REJECT_SLER_RRQ_RJT_ERR,
> +	SLI4_FC_LOCAL_REJECT_SLER_RRQ_RETRY_ERR,
> +	SLI4_FC_LOCAL_REJECT_SLER_ABTS_ERR,
> +};
> +
> +enum sli4_async_rcqe_flags {
> +	SLI4_RACQE_RQ_EL_INDX	= 0xfff,
> +	SLI4_RACQE_FCFI		= 0x3f,
> +	SLI4_RACQE_HDPL		= 0x3f,
> +	SLI4_RACQE_RQ_ID	= 0xffc0,
> +};
> +
> +struct sli4_fc_async_rcqe {
> +	u8		rsvd0;
> +	u8		status;
> +	__le16		rq_elmt_indx_word;
> +	__le32		rsvd4;
> +	__le16		fcfi_rq_id_word;
> +	__le16		data_placement_length;
> +	u8		sof_byte;
> +	u8		eof_byte;
> +	u8		code;
> +	u8		hdpl_byte;
> +};
> +
> +struct sli4_fc_async_rcqe_v1 {
> +	u8		rsvd0;
> +	u8		status;
> +	__le16		rq_elmt_indx_word;
> +	u8		fcfi_byte;
> +	u8		rsvd5;
> +	__le16		rsvd6;
> +	__le16		rq_id;
> +	__le16		data_placement_length;
> +	u8		sof_byte;
> +	u8		eof_byte;
> +	u8		code;
> +	u8		hdpl_byte;
> +};
> +
> +enum sli4_fc_async_rq_status {
> +	SLI4_FC_ASYNC_RQ_SUCCESS = 0x10,
> +	SLI4_FC_ASYNC_RQ_BUF_LEN_EXCEEDED,
> +	SLI4_FC_ASYNC_RQ_INSUFF_BUF_NEEDED,
> +	SLI4_FC_ASYNC_RQ_INSUFF_BUF_FRM_DISC,
> +	SLI4_FC_ASYNC_RQ_DMA_FAILURE,
> +};
> +
> +#define SLI4_RCQE_RQ_EL_INDX	0xfff
> +
> +struct sli4_fc_coalescing_rcqe {
> +	u8		rsvd0;
> +	u8		status;
> +	__le16		rq_elmt_indx_word;
> +	__le32		rsvd4;
> +	__le16		rq_id;
> +	__le16		sequence_reporting_placement_length;
> +	__le16		rsvd14;
> +	u8		code;
> +	u8		vld_byte;
> +};
> +
> +#define SLI4_FC_COALESCE_RQ_SUCCESS		0x10
> +#define SLI4_FC_COALESCE_RQ_INSUFF_XRI_NEEDED	0x18

empty line missing

> +/*
> + * @SLI4_OCQE_RQ_EL_INDX: bits 0 to 15 in word1
> + * @SLI4_OCQE_FCFI: bits 0 to 6 in dw1
> + * @SLI4_OCQE_OOX: bit 15 in dw1
> + * @SLI4_OCQE_AGXR: bit 16 in dw1
> + */

Maybe make a proper kernel doc out of this?

> +enum sli4_optimized_write_cmd_cqe_flags {
> +	SLI4_OCQE_RQ_EL_INDX = 0x7f,
> +	SLI4_OCQE_FCFI = 0x3f,
> +	SLI4_OCQE_OOX = (1 << 6),
> +	SLI4_OCQE_AGXR = (1 << 7),
> +	SLI4_OCQE_HDPL = 0x3f,

Code aligment is not consistent with the rest.

> +};
> +
> +struct sli4_fc_optimized_write_cmd_cqe {
> +	u8		rsvd0;
> +	u8		status;
> +	__le16		w1;
> +	u8		flags0;
> +	u8		flags1;
> +	__le16		xri;
> +	__le16		rq_id;
> +	__le16		data_placement_length;
> +	__le16		rpi;
> +	u8		code;
> +	u8		hdpl_vld;
> +};
> +
> +#define	SLI4_OCQE_XB		0x10
> +
> +struct sli4_fc_optimized_write_data_cqe {
> +	u8		hw_status;
> +	u8		status;
> +	__le16		xri;
> +	__le32		total_data_placed;
> +	__le32		extended_status;
> +	__le16		rsvd12;
> +	u8		code;
> +	u8		flags;
> +};
> +
> +struct sli4_fc_xri_aborted_cqe {
> +	u8		rsvd0;
> +	u8		status;
> +	__le16		rsvd2;
> +	__le32		extended_status;
> +	__le16		xri;
> +	__le16		remote_xid;
> +	__le16		rsvd12;
> +	u8		code;
> +	u8		flags;
> +};
> +
> +enum sli4_generic_ctx {
> +	SLI4_GENERIC_CONTEXT_RPI,
> +	SLI4_GENERIC_CONTEXT_VPI,
> +	SLI4_GENERIC_CONTEXT_VFI,
> +	SLI4_GENERIC_CONTEXT_FCFI,
> +};
> +
> +#define SLI4_GENERIC_CLASS_CLASS_2		0x1
> +#define SLI4_GENERIC_CLASS_CLASS_3		0x2
> +
> +#define SLI4_ELS_REQUEST64_DIR_WRITE		0x0
> +#define SLI4_ELS_REQUEST64_DIR_READ		0x1
> +
> +enum sli4_els_request {
> +	SLI4_ELS_REQUEST64_OTHER,
> +	SLI4_ELS_REQUEST64_LOGO,
> +	SLI4_ELS_REQUEST64_FDISC,
> +	SLI4_ELS_REQUEST64_FLOGIN,
> +	SLI4_ELS_REQUEST64_PLOGI,
> +};
> +
> +enum sli4_els_cmd_type {
> +	SLI4_ELS_REQUEST64_CMD_GEN		= 0x08,
> +	SLI4_ELS_REQUEST64_CMD_NON_FABRIC	= 0x0c,
> +	SLI4_ELS_REQUEST64_CMD_FABRIC		= 0x0d,
> +};
> +
>  #endif /* !_SLI4_H */
> -- 
> 2.16.4
> 
> 

Thanks,
Daniel

  reply	other threads:[~2020-04-14 18:02 UTC|newest]

Thread overview: 124+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-12  3:32 [PATCH v3 00/31] [NEW] efct: Broadcom (Emulex) FC Target driver James Smart
2020-04-12  3:32 ` [PATCH v3 01/31] elx: libefc_sli: SLI-4 register offsets and field definitions James Smart
2020-04-14 15:23   ` Daniel Wagner
2020-04-22  4:28     ` James Smart
2020-04-15 12:06   ` Hannes Reinecke
2020-04-23  1:52   ` Roman Bolshakov
2020-04-12  3:32 ` [PATCH v3 02/31] elx: libefc_sli: SLI Descriptors and Queue entries James Smart
2020-04-14 18:02   ` Daniel Wagner [this message]
2020-04-22  4:41     ` James Smart
2020-04-15 12:14   ` Hannes Reinecke
2020-04-15 17:43     ` James Bottomley
2020-04-22  4:44     ` James Smart
2020-04-12  3:32 ` [PATCH v3 03/31] elx: libefc_sli: Data structures and defines for mbox commands James Smart
2020-04-14 19:01   ` Daniel Wagner
2020-04-15 12:22   ` Hannes Reinecke
2020-04-12  3:32 ` [PATCH v3 04/31] elx: libefc_sli: queue create/destroy/parse routines James Smart
2020-04-15 10:04   ` Daniel Wagner
2020-04-22  5:05     ` James Smart
2020-04-24  7:29       ` Daniel Wagner
2020-04-24 15:21         ` James Smart
2020-04-15 12:27   ` Hannes Reinecke
2020-04-12  3:32 ` [PATCH v3 05/31] elx: libefc_sli: Populate and post different WQEs James Smart
2020-04-15 14:34   ` Daniel Wagner
2020-04-22  5:08     ` James Smart
2020-04-12  3:32 ` [PATCH v3 06/31] elx: libefc_sli: bmbx routines and SLI config commands James Smart
2020-04-15 16:10   ` Daniel Wagner
2020-04-22  5:12     ` James Smart
2020-04-12  3:32 ` [PATCH v3 07/31] elx: libefc_sli: APIs to setup SLI library James Smart
2020-04-15 12:49   ` Hannes Reinecke
2020-04-15 17:06   ` Daniel Wagner
2020-04-12  3:32 ` [PATCH v3 08/31] elx: libefc: Generic state machine framework James Smart
2020-04-15 12:37   ` Hannes Reinecke
2020-04-15 17:20   ` Daniel Wagner
2020-04-12  3:32 ` [PATCH v3 09/31] elx: libefc: Emulex FC discovery library APIs and definitions James Smart
2020-04-15 12:41   ` Hannes Reinecke
2020-04-15 17:32   ` Daniel Wagner
2020-04-12  3:32 ` [PATCH v3 10/31] elx: libefc: FC Domain state machine interfaces James Smart
2020-04-15 12:50   ` Hannes Reinecke
2020-04-15 17:50   ` Daniel Wagner
2020-04-12  3:32 ` [PATCH v3 11/31] elx: libefc: SLI and FC PORT " James Smart
2020-04-15 15:38   ` Hannes Reinecke
2020-04-22 23:12     ` James Smart
2020-04-15 18:04   ` Daniel Wagner
2020-04-12  3:32 ` [PATCH v3 12/31] elx: libefc: Remote node " James Smart
2020-04-15 15:51   ` Hannes Reinecke
2020-04-23  1:35     ` James Smart
2020-04-23  8:02       ` Daniel Wagner
2020-04-23 18:24         ` James Smart
2020-04-15 18:19   ` Daniel Wagner
2020-04-23  1:32     ` James Smart
2020-04-23  7:49       ` Daniel Wagner
2020-04-12  3:32 ` [PATCH v3 13/31] elx: libefc: Fabric " James Smart
2020-04-15 18:51   ` Daniel Wagner
2020-04-16  6:37   ` Hannes Reinecke
2020-04-23  1:38     ` James Smart
2020-04-12  3:32 ` [PATCH v3 14/31] elx: libefc: FC node ELS and state handling James Smart
2020-04-15 18:56   ` Daniel Wagner
2020-04-23  2:50     ` James Smart
2020-04-23  8:05       ` Daniel Wagner
2020-04-23  8:12         ` Nathan Chancellor
2020-04-16  6:47   ` Hannes Reinecke
2020-04-23  2:55     ` James Smart
2020-04-12  3:32 ` [PATCH v3 15/31] elx: efct: Data structures and defines for hw operations James Smart
2020-04-16  6:51   ` Hannes Reinecke
2020-04-23  2:57     ` James Smart
2020-04-16  7:22   ` Daniel Wagner
2020-04-23  2:59     ` James Smart
2020-04-12  3:32 ` [PATCH v3 16/31] elx: efct: Driver initialization routines James Smart
2020-04-16  7:11   ` Hannes Reinecke
2020-04-23  3:09     ` James Smart
2020-04-16  8:03   ` Daniel Wagner
2020-04-12  3:32 ` [PATCH v3 17/31] elx: efct: Hardware queues creation and deletion James Smart
2020-04-16  7:14   ` Hannes Reinecke
2020-04-16  8:24   ` Daniel Wagner
2020-04-12  3:32 ` [PATCH v3 18/31] elx: efct: RQ buffer, memory pool allocation and deallocation APIs James Smart
2020-04-16  7:24   ` Hannes Reinecke
2020-04-23  3:16     ` James Smart
2020-04-16  8:41   ` Daniel Wagner
2020-04-12  3:32 ` [PATCH v3 19/31] elx: efct: Hardware IO and SGL initialization James Smart
2020-04-16  7:32   ` Hannes Reinecke
2020-04-16  8:47   ` Daniel Wagner
2020-04-12  3:32 ` [PATCH v3 20/31] elx: efct: Hardware queues processing James Smart
2020-04-16  7:37   ` Hannes Reinecke
2020-04-16  9:17   ` Daniel Wagner
2020-04-12  3:32 ` [PATCH v3 21/31] elx: efct: Unsolicited FC frame processing routines James Smart
2020-04-16  9:36   ` Daniel Wagner
2020-04-12  3:32 ` [PATCH v3 22/31] elx: efct: Extended link Service IO handling James Smart
2020-04-16  7:58   ` Hannes Reinecke
2020-04-23  3:30     ` James Smart
2020-04-16  9:49   ` Daniel Wagner
2020-04-12  3:32 ` [PATCH v3 23/31] elx: efct: SCSI IO handling routines James Smart
2020-04-16 11:40   ` Daniel Wagner
2020-04-12  3:32 ` [PATCH v3 24/31] elx: efct: LIO backend interface routines James Smart
2020-04-12  4:57   ` Bart Van Assche
2020-04-16 11:48     ` Daniel Wagner
2020-04-22  4:20     ` James Smart
2020-04-22  5:09       ` Bart Van Assche
2020-04-23  1:39         ` James Smart
2020-04-16  8:02   ` Hannes Reinecke
2020-04-16 12:34   ` Daniel Wagner
2020-04-22  4:20     ` James Smart
2020-04-12  3:32 ` [PATCH v3 25/31] elx: efct: Hardware IO submission routines James Smart
2020-04-16  8:10   ` Hannes Reinecke
2020-04-16 12:45     ` Daniel Wagner
2020-04-23  3:37       ` James Smart
2020-04-16 12:44   ` Daniel Wagner
2020-04-12  3:32 ` [PATCH v3 26/31] elx: efct: link statistics and SFP data James Smart
2020-04-16 12:55   ` Daniel Wagner
2020-04-12  3:32 ` [PATCH v3 27/31] elx: efct: xport and hardware teardown routines James Smart
2020-04-16  9:45   ` Hannes Reinecke
2020-04-16 13:01   ` Daniel Wagner
2020-04-12  3:33 ` [PATCH v3 28/31] elx: efct: Firmware update, async link processing James Smart
2020-04-16 10:01   ` Hannes Reinecke
2020-04-16 13:10   ` Daniel Wagner
2020-04-12  3:33 ` [PATCH v3 29/31] elx: efct: scsi_transport_fc host interface support James Smart
2020-04-12  3:33 ` [PATCH v3 30/31] elx: efct: Add Makefile and Kconfig for efct driver James Smart
2020-04-16 10:02   ` Hannes Reinecke
2020-04-16 13:15   ` Daniel Wagner
2020-04-12  3:33 ` [PATCH v3 31/31] elx: efct: Tie into kernel Kconfig and build process James Smart
2020-04-12  6:16   ` kbuild test robot
2020-04-12  6:16     ` kbuild test robot
2020-04-12  7:56   ` kbuild test robot
2020-04-12  7:56     ` kbuild test robot
2020-04-16 13:15   ` Daniel Wagner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200414180221.3n2eqicptmh3gsyt@carbon.lan \
    --to=dwagner@suse.de \
    --cc=bvanassche@acm.org \
    --cc=hare@suse.de \
    --cc=herbszt@gmx.de \
    --cc=jsmart2021@gmail.com \
    --cc=linux-scsi@vger.kernel.org \
    --cc=maier@linux.ibm.com \
    --cc=natechancellor@gmail.com \
    --cc=ram.vegesna@broadcom.com \
    --cc=rdunlap@infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.