cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

sli4.h (96038B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * Copyright (C) 2021 Broadcom. All Rights Reserved. The term
      4 * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
      5 *
      6 */
      7
      8/*
      9 * All common SLI-4 structures and function prototypes.
     10 */
     11
     12#ifndef _SLI4_H
     13#define _SLI4_H
     14
     15#include <linux/pci.h>
     16#include <linux/delay.h>
     17#include "scsi/fc/fc_els.h"
     18#include "scsi/fc/fc_fs.h"
     19#include "../include/efc_common.h"
     20
     21/*************************************************************************
     22 * Common SLI-4 register offsets and field definitions
     23 */
     24
     25/* SLI_INTF - SLI Interface Definition Register */
     26#define SLI4_INTF_REG			0x0058
     27enum sli4_intf {
     28	SLI4_INTF_REV_SHIFT		= 4,
     29	SLI4_INTF_REV_MASK		= 0xf0,
     30
     31	SLI4_INTF_REV_S3		= 0x30,
     32	SLI4_INTF_REV_S4		= 0x40,
     33
     34	SLI4_INTF_FAMILY_SHIFT		= 8,
     35	SLI4_INTF_FAMILY_MASK		= 0x0f00,
     36
     37	SLI4_FAMILY_CHECK_ASIC_TYPE	= 0x0f00,
     38
     39	SLI4_INTF_IF_TYPE_SHIFT		= 12,
     40	SLI4_INTF_IF_TYPE_MASK		= 0xf000,
     41
     42	SLI4_INTF_IF_TYPE_2		= 0x2000,
     43	SLI4_INTF_IF_TYPE_6		= 0x6000,
     44
     45	SLI4_INTF_VALID_SHIFT		= 29,
     46	SLI4_INTF_VALID_MASK		= 0xe0000000,
     47
     48	SLI4_INTF_VALID_VALUE		= 0xc0000000,
     49};
     50
     51/* ASIC_ID - SLI ASIC Type and Revision Register */
     52#define SLI4_ASIC_ID_REG	0x009c
     53enum sli4_asic {
     54	SLI4_ASIC_GEN_SHIFT	= 8,
     55	SLI4_ASIC_GEN_MASK	= 0xff00,
     56	SLI4_ASIC_GEN_5		= 0x0b00,
     57	SLI4_ASIC_GEN_6		= 0x0c00,
     58	SLI4_ASIC_GEN_7		= 0x0d00,
     59};
     60
     61enum sli4_acic_revisions {
     62	SLI4_ASIC_REV_A0	= 0x00,
     63	SLI4_ASIC_REV_A1	= 0x01,
     64	SLI4_ASIC_REV_A2	= 0x02,
     65	SLI4_ASIC_REV_A3	= 0x03,
     66	SLI4_ASIC_REV_B0	= 0x10,
     67	SLI4_ASIC_REV_B1	= 0x11,
     68	SLI4_ASIC_REV_B2	= 0x12,
     69	SLI4_ASIC_REV_C0	= 0x20,
     70	SLI4_ASIC_REV_C1	= 0x21,
     71	SLI4_ASIC_REV_C2	= 0x22,
     72	SLI4_ASIC_REV_D0	= 0x30,
     73};
     74
     75struct sli4_asic_entry_t {
     76	u32 rev_id;
     77	u32 family;
     78};
     79
     80/* BMBX - Bootstrap Mailbox Register */
     81#define SLI4_BMBX_REG		0x0160
     82enum sli4_bmbx {
     83	SLI4_BMBX_MASK_HI	= 0x3,
     84	SLI4_BMBX_MASK_LO	= 0xf,
     85	SLI4_BMBX_RDY		= 1 << 0,
     86	SLI4_BMBX_HI		= 1 << 1,
     87	SLI4_BMBX_SIZE		= 256,
     88};
     89
     90static inline u32
     91sli_bmbx_write_hi(u64 addr) {
     92	u32 val;
     93
     94	val = upper_32_bits(addr) & ~SLI4_BMBX_MASK_HI;
     95	val |= SLI4_BMBX_HI;
     96
     97	return val;
     98}
     99
    100static inline u32
    101sli_bmbx_write_lo(u64 addr) {
    102	u32 val;
    103
    104	val = (upper_32_bits(addr) & SLI4_BMBX_MASK_HI) << 30;
    105	val |= ((addr) & ~SLI4_BMBX_MASK_LO) >> 2;
    106
    107	return val;
    108}
    109
    110/* SLIPORT_CONTROL - SLI Port Control Register */
    111#define SLI4_PORT_CTRL_REG	0x0408
    112enum sli4_port_ctrl {
    113	SLI4_PORT_CTRL_IP	= 1u << 27,
    114	SLI4_PORT_CTRL_IDIS	= 1u << 22,
    115	SLI4_PORT_CTRL_FDD	= 1u << 31,
    116};
    117
    118/* SLI4_SLIPORT_ERROR - SLI Port Error Register */
    119#define SLI4_PORT_ERROR1	0x040c
    120#define SLI4_PORT_ERROR2	0x0410
    121
    122/* EQCQ_DOORBELL - EQ and CQ Doorbell Register */
    123#define SLI4_EQCQ_DB_REG	0x120
    124enum sli4_eqcq_e {
    125	SLI4_EQ_ID_LO_MASK	= 0x01ff,
    126
    127	SLI4_CQ_ID_LO_MASK	= 0x03ff,
    128
    129	SLI4_EQCQ_CI_EQ		= 0x0200,
    130
    131	SLI4_EQCQ_QT_EQ		= 0x00000400,
    132	SLI4_EQCQ_QT_CQ		= 0x00000000,
    133
    134	SLI4_EQCQ_ID_HI_SHIFT	= 11,
    135	SLI4_EQCQ_ID_HI_MASK	= 0xf800,
    136
    137	SLI4_EQCQ_NUM_SHIFT	= 16,
    138	SLI4_EQCQ_NUM_MASK	= 0x1fff0000,
    139
    140	SLI4_EQCQ_ARM		= 0x20000000,
    141	SLI4_EQCQ_UNARM		= 0x00000000,
    142};
    143
    144static inline u32
    145sli_format_eq_db_data(u16 num_popped, u16 id, u32 arm) {
    146	u32 reg;
    147
    148	reg = (id & SLI4_EQ_ID_LO_MASK) | SLI4_EQCQ_QT_EQ;
    149	reg |= (((id) >> 9) << SLI4_EQCQ_ID_HI_SHIFT) & SLI4_EQCQ_ID_HI_MASK;
    150	reg |= ((num_popped) << SLI4_EQCQ_NUM_SHIFT) & SLI4_EQCQ_NUM_MASK;
    151	reg |= arm | SLI4_EQCQ_CI_EQ;
    152
    153	return reg;
    154}
    155
    156static inline u32
    157sli_format_cq_db_data(u16 num_popped, u16 id, u32 arm) {
    158	u32 reg;
    159
    160	reg = ((id) & SLI4_CQ_ID_LO_MASK) | SLI4_EQCQ_QT_CQ;
    161	reg |= (((id) >> 10) << SLI4_EQCQ_ID_HI_SHIFT) & SLI4_EQCQ_ID_HI_MASK;
    162	reg |= ((num_popped) << SLI4_EQCQ_NUM_SHIFT) & SLI4_EQCQ_NUM_MASK;
    163	reg |= arm;
    164
    165	return reg;
    166}
    167
    168/* EQ_DOORBELL - EQ Doorbell Register for IF_TYPE = 6*/
    169#define SLI4_IF6_EQ_DB_REG	0x120
    170enum sli4_eq_e {
    171	SLI4_IF6_EQ_ID_MASK	= 0x0fff,
    172
    173	SLI4_IF6_EQ_NUM_SHIFT	= 16,
    174	SLI4_IF6_EQ_NUM_MASK	= 0x1fff0000,
    175};
    176
    177static inline u32
    178sli_format_if6_eq_db_data(u16 num_popped, u16 id, u32 arm) {
    179	u32 reg;
    180
    181	reg = id & SLI4_IF6_EQ_ID_MASK;
    182	reg |= (num_popped << SLI4_IF6_EQ_NUM_SHIFT) & SLI4_IF6_EQ_NUM_MASK;
    183	reg |= arm;
    184
    185	return reg;
    186}
    187
    188/* CQ_DOORBELL - CQ Doorbell Register for IF_TYPE = 6 */
    189#define SLI4_IF6_CQ_DB_REG	0xc0
    190enum sli4_cq_e {
    191	SLI4_IF6_CQ_ID_MASK	= 0xffff,
    192
    193	SLI4_IF6_CQ_NUM_SHIFT	= 16,
    194	SLI4_IF6_CQ_NUM_MASK	= 0x1fff0000,
    195};
    196
    197static inline u32
    198sli_format_if6_cq_db_data(u16 num_popped, u16 id, u32 arm) {
    199	u32 reg;
    200
    201	reg = id & SLI4_IF6_CQ_ID_MASK;
    202	reg |= ((num_popped) << SLI4_IF6_CQ_NUM_SHIFT) & SLI4_IF6_CQ_NUM_MASK;
    203	reg |= arm;
    204
    205	return reg;
    206}
    207
    208/* MQ_DOORBELL - MQ Doorbell Register */
    209#define SLI4_MQ_DB_REG		0x0140
    210#define SLI4_IF6_MQ_DB_REG	0x0160
    211enum sli4_mq_e {
    212	SLI4_MQ_ID_MASK		= 0xffff,
    213
    214	SLI4_MQ_NUM_SHIFT	= 16,
    215	SLI4_MQ_NUM_MASK	= 0x3fff0000,
    216};
    217
    218static inline u32
    219sli_format_mq_db_data(u16 id) {
    220	u32 reg;
    221
    222	reg = id & SLI4_MQ_ID_MASK;
    223	reg |= (1 << SLI4_MQ_NUM_SHIFT) & SLI4_MQ_NUM_MASK;
    224
    225	return reg;
    226}
    227
    228/* RQ_DOORBELL - RQ Doorbell Register */
    229#define SLI4_RQ_DB_REG		0x0a0
    230#define SLI4_IF6_RQ_DB_REG	0x0080
    231enum sli4_rq_e {
    232	SLI4_RQ_DB_ID_MASK	= 0xffff,
    233
    234	SLI4_RQ_DB_NUM_SHIFT	= 16,
    235	SLI4_RQ_DB_NUM_MASK	= 0x3fff0000,
    236};
    237
    238static inline u32
    239sli_format_rq_db_data(u16 id) {
    240	u32 reg;
    241
    242	reg = id & SLI4_RQ_DB_ID_MASK;
    243	reg |= (1 << SLI4_RQ_DB_NUM_SHIFT) & SLI4_RQ_DB_NUM_MASK;
    244
    245	return reg;
    246}
    247
    248/* WQ_DOORBELL - WQ Doorbell Register */
    249#define SLI4_IO_WQ_DB_REG	0x040
    250#define SLI4_IF6_WQ_DB_REG	0x040
    251enum sli4_wq_e {
    252	SLI4_WQ_ID_MASK		= 0xffff,
    253
    254	SLI4_WQ_IDX_SHIFT	= 16,
    255	SLI4_WQ_IDX_MASK	= 0xff0000,
    256
    257	SLI4_WQ_NUM_SHIFT	= 24,
    258	SLI4_WQ_NUM_MASK	= 0x0ff00000,
    259};
    260
    261static inline u32
    262sli_format_wq_db_data(u16 id) {
    263	u32 reg;
    264
    265	reg = id & SLI4_WQ_ID_MASK;
    266	reg |= (1 << SLI4_WQ_NUM_SHIFT) & SLI4_WQ_NUM_MASK;
    267
    268	return reg;
    269}
    270
    271/* SLIPORT_STATUS - SLI Port Status Register */
    272#define SLI4_PORT_STATUS_REGOFF	0x0404
    273enum sli4_port_status {
    274	SLI4_PORT_STATUS_FDP	= 1u << 21,
    275	SLI4_PORT_STATUS_RDY	= 1u << 23,
    276	SLI4_PORT_STATUS_RN	= 1u << 24,
    277	SLI4_PORT_STATUS_DIP	= 1u << 25,
    278	SLI4_PORT_STATUS_OTI	= 1u << 29,
    279	SLI4_PORT_STATUS_ERR	= 1u << 31,
    280};
    281
    282#define SLI4_PHYDEV_CTRL_REG	0x0414
    283#define SLI4_PHYDEV_CTRL_FRST	(1 << 1)
    284#define SLI4_PHYDEV_CTRL_DD	(1 << 2)
    285
    286/* Register name enums */
    287enum sli4_regname_en {
    288	SLI4_REG_BMBX,
    289	SLI4_REG_EQ_DOORBELL,
    290	SLI4_REG_CQ_DOORBELL,
    291	SLI4_REG_RQ_DOORBELL,
    292	SLI4_REG_IO_WQ_DOORBELL,
    293	SLI4_REG_MQ_DOORBELL,
    294	SLI4_REG_PHYSDEV_CONTROL,
    295	SLI4_REG_PORT_CONTROL,
    296	SLI4_REG_PORT_ERROR1,
    297	SLI4_REG_PORT_ERROR2,
    298	SLI4_REG_PORT_SEMAPHORE,
    299	SLI4_REG_PORT_STATUS,
    300	SLI4_REG_UNKWOWN			/* must be last */
    301};
    302
    303struct sli4_reg {
    304	u32	rset;
    305	u32	off;
    306};
    307
    308struct sli4_dmaaddr {
    309	__le32 low;
    310	__le32 high;
    311};
    312
    313/*
    314 * a 3-word Buffer Descriptor Entry with
    315 * address 1st 2 words, length last word
    316 */
    317struct sli4_bufptr {
    318	struct sli4_dmaaddr addr;
    319	__le32 length;
    320};
    321
    322/* Buffer Descriptor Entry (BDE) */
    323enum sli4_bde_e {
    324	SLI4_BDE_LEN_MASK	= 0x00ffffff,
    325	SLI4_BDE_TYPE_MASK	= 0xff000000,
    326};
    327
    328struct sli4_bde {
    329	__le32		bde_type_buflen;
    330	union {
    331		struct sli4_dmaaddr data;
    332		struct {
    333			__le32	offset;
    334			__le32	rsvd2;
    335		} imm;
    336		struct sli4_dmaaddr blp;
    337	} u;
    338};
    339
    340/* Buffer Descriptors */
    341enum sli4_bde_type {
    342	SLI4_BDE_TYPE_SHIFT	= 24,
    343	SLI4_BDE_TYPE_64	= 0x00,	/* Generic 64-bit data */
    344	SLI4_BDE_TYPE_IMM	= 0x01,	/* Immediate data */
    345	SLI4_BDE_TYPE_BLP	= 0x40,	/* Buffer List Pointer */
    346};
    347
    348#define SLI4_BDE_TYPE_VAL(type) \
    349	(SLI4_BDE_TYPE_##type << SLI4_BDE_TYPE_SHIFT)
    350
    351/* Scatter-Gather Entry (SGE) */
    352#define SLI4_SGE_MAX_RESERVED		3
    353
    354enum sli4_sge_type {
    355	/* DW2 */
    356	SLI4_SGE_DATA_OFFSET_MASK	= 0x07ffffff,
    357	/*DW2W1*/
    358	SLI4_SGE_TYPE_SHIFT		= 27,
    359	SLI4_SGE_TYPE_MASK		= 0x78000000,
    360	/*SGE Types*/
    361	SLI4_SGE_TYPE_DATA		= 0x00,
    362	SLI4_SGE_TYPE_DIF		= 0x04,	/* Data Integrity Field */
    363	SLI4_SGE_TYPE_LSP		= 0x05,	/* List Segment Pointer */
    364	SLI4_SGE_TYPE_PEDIF		= 0x06,	/* Post Encryption Engine DIF */
    365	SLI4_SGE_TYPE_PESEED		= 0x07,	/* Post Encryption DIF Seed */
    366	SLI4_SGE_TYPE_DISEED		= 0x08,	/* DIF Seed */
    367	SLI4_SGE_TYPE_ENC		= 0x09,	/* Encryption */
    368	SLI4_SGE_TYPE_ATM		= 0x0a,	/* DIF Application Tag Mask */
    369	SLI4_SGE_TYPE_SKIP		= 0x0c,	/* SKIP */
    370
    371	SLI4_SGE_LAST			= 1u << 31,
    372};
    373
    374struct sli4_sge {
    375	__le32		buffer_address_high;
    376	__le32		buffer_address_low;
    377	__le32		dw2_flags;
    378	__le32		buffer_length;
    379};
    380
    381/* T10 DIF Scatter-Gather Entry (SGE) */
    382struct sli4_dif_sge {
    383	__le32		buffer_address_high;
    384	__le32		buffer_address_low;
    385	__le32		dw2_flags;
    386	__le32		rsvd12;
    387};
    388
    389/* Data Integrity Seed (DISEED) SGE */
    390enum sli4_diseed_sge_flags {
    391	/* DW2W1 */
    392	SLI4_DISEED_SGE_HS		= 1 << 2,
    393	SLI4_DISEED_SGE_WS		= 1 << 3,
    394	SLI4_DISEED_SGE_IC		= 1 << 4,
    395	SLI4_DISEED_SGE_ICS		= 1 << 5,
    396	SLI4_DISEED_SGE_ATRT		= 1 << 6,
    397	SLI4_DISEED_SGE_AT		= 1 << 7,
    398	SLI4_DISEED_SGE_FAT		= 1 << 8,
    399	SLI4_DISEED_SGE_NA		= 1 << 9,
    400	SLI4_DISEED_SGE_HI		= 1 << 10,
    401
    402	/* DW3W1 */
    403	SLI4_DISEED_SGE_BS_MASK		= 0x0007,
    404	SLI4_DISEED_SGE_AI		= 1 << 3,
    405	SLI4_DISEED_SGE_ME		= 1 << 4,
    406	SLI4_DISEED_SGE_RE		= 1 << 5,
    407	SLI4_DISEED_SGE_CE		= 1 << 6,
    408	SLI4_DISEED_SGE_NR		= 1 << 7,
    409
    410	SLI4_DISEED_SGE_OP_RX_SHIFT	= 8,
    411	SLI4_DISEED_SGE_OP_RX_MASK	= 0x0f00,
    412	SLI4_DISEED_SGE_OP_TX_SHIFT	= 12,
    413	SLI4_DISEED_SGE_OP_TX_MASK	= 0xf000,
    414};
    415
    416/* Opcode values */
    417enum sli4_diseed_sge_opcodes {
    418	SLI4_DISEED_SGE_OP_IN_NODIF_OUT_CRC,
    419	SLI4_DISEED_SGE_OP_IN_CRC_OUT_NODIF,
    420	SLI4_DISEED_SGE_OP_IN_NODIF_OUT_CSUM,
    421	SLI4_DISEED_SGE_OP_IN_CSUM_OUT_NODIF,
    422	SLI4_DISEED_SGE_OP_IN_CRC_OUT_CRC,
    423	SLI4_DISEED_SGE_OP_IN_CSUM_OUT_CSUM,
    424	SLI4_DISEED_SGE_OP_IN_CRC_OUT_CSUM,
    425	SLI4_DISEED_SGE_OP_IN_CSUM_OUT_CRC,
    426	SLI4_DISEED_SGE_OP_IN_RAW_OUT_RAW,
    427};
    428
    429#define SLI4_DISEED_SGE_OP_RX_VALUE(stype) \
    430	(SLI4_DISEED_SGE_OP_##stype << SLI4_DISEED_SGE_OP_RX_SHIFT)
    431#define SLI4_DISEED_SGE_OP_TX_VALUE(stype) \
    432	(SLI4_DISEED_SGE_OP_##stype << SLI4_DISEED_SGE_OP_TX_SHIFT)
    433
    434struct sli4_diseed_sge {
    435	__le32		ref_tag_cmp;
    436	__le32		ref_tag_repl;
    437	__le16		app_tag_repl;
    438	__le16		dw2w1_flags;
    439	__le16		app_tag_cmp;
    440	__le16		dw3w1_flags;
    441};
    442
    443/* List Segment Pointer Scatter-Gather Entry (SGE) */
    444#define SLI4_LSP_SGE_SEGLEN	0x00ffffff
    445
    446struct sli4_lsp_sge {
    447	__le32		buffer_address_high;
    448	__le32		buffer_address_low;
    449	__le32		dw2_flags;
    450	__le32		dw3_seglen;
    451};
    452
    453enum sli4_eqe_e {
    454	SLI4_EQE_VALID	= 1,
    455	SLI4_EQE_MJCODE	= 0xe,
    456	SLI4_EQE_MNCODE	= 0xfff0,
    457};
    458
    459struct sli4_eqe {
    460	__le16		dw0w0_flags;
    461	__le16		resource_id;
    462};
    463
    464#define SLI4_MAJOR_CODE_STANDARD	0
    465#define SLI4_MAJOR_CODE_SENTINEL	1
    466
    467/* Sentinel EQE indicating the EQ is full */
    468#define SLI4_EQE_STATUS_EQ_FULL		2
    469
    470enum sli4_mcqe_e {
    471	SLI4_MCQE_CONSUMED	= 1u << 27,
    472	SLI4_MCQE_COMPLETED	= 1u << 28,
    473	SLI4_MCQE_AE		= 1u << 30,
    474	SLI4_MCQE_VALID		= 1u << 31,
    475};
    476
    477/* Entry was consumed but not completed */
    478#define SLI4_MCQE_STATUS_NOT_COMPLETED	-2
    479
    480struct sli4_mcqe {
    481	__le16		completion_status;
    482	__le16		extended_status;
    483	__le32		mqe_tag_low;
    484	__le32		mqe_tag_high;
    485	__le32		dw3_flags;
    486};
    487
    488enum sli4_acqe_e {
    489	SLI4_ACQE_AE	= 1 << 6, /* async event - this is an ACQE */
    490	SLI4_ACQE_VAL	= 1 << 7, /* valid - contents of CQE are valid */
    491};
    492
    493struct sli4_acqe {
    494	__le32		event_data[3];
    495	u8		rsvd12;
    496	u8		event_code;
    497	u8		event_type;
    498	u8		ae_val;
    499};
    500
    501enum sli4_acqe_event_code {
    502	SLI4_ACQE_EVENT_CODE_LINK_STATE		= 0x01,
    503	SLI4_ACQE_EVENT_CODE_FIP		= 0x02,
    504	SLI4_ACQE_EVENT_CODE_DCBX		= 0x03,
    505	SLI4_ACQE_EVENT_CODE_ISCSI		= 0x04,
    506	SLI4_ACQE_EVENT_CODE_GRP_5		= 0x05,
    507	SLI4_ACQE_EVENT_CODE_FC_LINK_EVENT	= 0x10,
    508	SLI4_ACQE_EVENT_CODE_SLI_PORT_EVENT	= 0x11,
    509	SLI4_ACQE_EVENT_CODE_VF_EVENT		= 0x12,
    510	SLI4_ACQE_EVENT_CODE_MR_EVENT		= 0x13,
    511};
    512
    513enum sli4_qtype {
    514	SLI4_QTYPE_EQ,
    515	SLI4_QTYPE_CQ,
    516	SLI4_QTYPE_MQ,
    517	SLI4_QTYPE_WQ,
    518	SLI4_QTYPE_RQ,
    519	SLI4_QTYPE_MAX,			/* must be last */
    520};
    521
    522#define SLI4_USER_MQ_COUNT	1
    523#define SLI4_MAX_CQ_SET_COUNT	16
    524#define SLI4_MAX_RQ_SET_COUNT	16
    525
    526enum sli4_qentry {
    527	SLI4_QENTRY_ASYNC,
    528	SLI4_QENTRY_MQ,
    529	SLI4_QENTRY_RQ,
    530	SLI4_QENTRY_WQ,
    531	SLI4_QENTRY_WQ_RELEASE,
    532	SLI4_QENTRY_OPT_WRITE_CMD,
    533	SLI4_QENTRY_OPT_WRITE_DATA,
    534	SLI4_QENTRY_XABT,
    535	SLI4_QENTRY_MAX			/* must be last */
    536};
    537
    538enum sli4_queue_flags {
    539	SLI4_QUEUE_FLAG_MQ	= 1 << 0,	/* CQ has MQ/Async completion */
    540	SLI4_QUEUE_FLAG_HDR	= 1 << 1,	/* RQ for packet headers */
    541	SLI4_QUEUE_FLAG_RQBATCH	= 1 << 2,	/* RQ index increment by 8 */
    542};
    543
    544/* Generic Command Request header */
    545enum sli4_cmd_version {
    546	CMD_V0,
    547	CMD_V1,
    548	CMD_V2,
    549};
    550
    551struct sli4_rqst_hdr {
    552	u8		opcode;
    553	u8		subsystem;
    554	__le16		rsvd2;
    555	__le32		timeout;
    556	__le32		request_length;
    557	__le32		dw3_version;
    558};
    559
    560/* Generic Command Response header */
    561struct sli4_rsp_hdr {
    562	u8		opcode;
    563	u8		subsystem;
    564	__le16		rsvd2;
    565	u8		status;
    566	u8		additional_status;
    567	__le16		rsvd6;
    568	__le32		response_length;
    569	__le32		actual_response_length;
    570};
    571
    572#define SLI4_QUEUE_RQ_BATCH	8
    573
    574#define SZ_DMAADDR		sizeof(struct sli4_dmaaddr)
    575#define SLI4_RQST_CMDSZ(stype)	sizeof(struct sli4_rqst_##stype)
    576
    577#define SLI4_RQST_PYLD_LEN(stype) \
    578		cpu_to_le32(sizeof(struct sli4_rqst_##stype) - \
    579			sizeof(struct sli4_rqst_hdr))
    580
    581#define SLI4_RQST_PYLD_LEN_VAR(stype, varpyld) \
    582		cpu_to_le32((sizeof(struct sli4_rqst_##stype) + \
    583			varpyld) - sizeof(struct sli4_rqst_hdr))
    584
    585#define SLI4_CFG_PYLD_LENGTH(stype) \
    586		max(sizeof(struct sli4_rqst_##stype), \
    587		sizeof(struct sli4_rsp_##stype))
    588
    589enum sli4_create_cqv2_e {
    590	/* DW5_flags values*/
    591	SLI4_CREATE_CQV2_CLSWM_MASK	= 0x00003000,
    592	SLI4_CREATE_CQV2_NODELAY	= 0x00004000,
    593	SLI4_CREATE_CQV2_AUTOVALID	= 0x00008000,
    594	SLI4_CREATE_CQV2_CQECNT_MASK	= 0x18000000,
    595	SLI4_CREATE_CQV2_VALID		= 0x20000000,
    596	SLI4_CREATE_CQV2_EVT		= 0x80000000,
    597	/* DW6W1_flags values*/
    598	SLI4_CREATE_CQV2_ARM		= 0x8000,
    599};
    600
    601struct sli4_rqst_cmn_create_cq_v2 {
    602	struct sli4_rqst_hdr	hdr;
    603	__le16			num_pages;
    604	u8			page_size;
    605	u8			rsvd19;
    606	__le32			dw5_flags;
    607	__le16			eq_id;
    608	__le16			dw6w1_arm;
    609	__le16			cqe_count;
    610	__le16			rsvd30;
    611	__le32			rsvd32;
    612	struct sli4_dmaaddr	page_phys_addr[];
    613};
    614
    615enum sli4_create_cqset_e {
    616	/* DW5_flags values*/
    617	SLI4_CREATE_CQSETV0_CLSWM_MASK	= 0x00003000,
    618	SLI4_CREATE_CQSETV0_NODELAY	= 0x00004000,
    619	SLI4_CREATE_CQSETV0_AUTOVALID	= 0x00008000,
    620	SLI4_CREATE_CQSETV0_CQECNT_MASK	= 0x18000000,
    621	SLI4_CREATE_CQSETV0_VALID	= 0x20000000,
    622	SLI4_CREATE_CQSETV0_EVT		= 0x80000000,
    623	/* DW5W1_flags values */
    624	SLI4_CREATE_CQSETV0_CQE_COUNT	= 0x7fff,
    625	SLI4_CREATE_CQSETV0_ARM		= 0x8000,
    626};
    627
    628struct sli4_rqst_cmn_create_cq_set_v0 {
    629	struct sli4_rqst_hdr	hdr;
    630	__le16			num_pages;
    631	u8			page_size;
    632	u8			rsvd19;
    633	__le32			dw5_flags;
    634	__le16			num_cq_req;
    635	__le16			dw6w1_flags;
    636	__le16			eq_id[16];
    637	struct sli4_dmaaddr	page_phys_addr[];
    638};
    639
    640/* CQE count */
    641enum sli4_cq_cnt {
    642	SLI4_CQ_CNT_256,
    643	SLI4_CQ_CNT_512,
    644	SLI4_CQ_CNT_1024,
    645	SLI4_CQ_CNT_LARGE,
    646};
    647
    648#define SLI4_CQ_CNT_SHIFT	27
    649#define SLI4_CQ_CNT_VAL(type)	(SLI4_CQ_CNT_##type << SLI4_CQ_CNT_SHIFT)
    650
    651#define SLI4_CQE_BYTES		(4 * sizeof(u32))
    652
    653#define SLI4_CREATE_CQV2_MAX_PAGES	8
    654
    655/* Generic Common Create EQ/CQ/MQ/WQ/RQ Queue completion */
    656struct sli4_rsp_cmn_create_queue {
    657	struct sli4_rsp_hdr	hdr;
    658	__le16	q_id;
    659	u8	rsvd18;
    660	u8	ulp;
    661	__le32	db_offset;
    662	__le16	db_rs;
    663	__le16	db_fmt;
    664};
    665
    666struct sli4_rsp_cmn_create_queue_set {
    667	struct sli4_rsp_hdr	hdr;
    668	__le16	q_id;
    669	__le16	num_q_allocated;
    670};
    671
    672/* Common Destroy Queue */
    673struct sli4_rqst_cmn_destroy_q {
    674	struct sli4_rqst_hdr	hdr;
    675	__le16	q_id;
    676	__le16	rsvd;
    677};
    678
    679struct sli4_rsp_cmn_destroy_q {
    680	struct sli4_rsp_hdr	hdr;
    681};
    682
    683/* Modify the delay multiplier for EQs */
    684struct sli4_eqdelay_rec {
    685	__le32  eq_id;
    686	__le32  phase;
    687	__le32  delay_multiplier;
    688};
    689
    690struct sli4_rqst_cmn_modify_eq_delay {
    691	struct sli4_rqst_hdr	hdr;
    692	__le32			num_eq;
    693	struct sli4_eqdelay_rec eq_delay_record[8];
    694};
    695
    696struct sli4_rsp_cmn_modify_eq_delay {
    697	struct sli4_rsp_hdr	hdr;
    698};
    699
    700enum sli4_create_cq_e {
    701	/* DW5 */
    702	SLI4_CREATE_EQ_AUTOVALID		= 1u << 28,
    703	SLI4_CREATE_EQ_VALID			= 1u << 29,
    704	SLI4_CREATE_EQ_EQESZ			= 1u << 31,
    705	/* DW6 */
    706	SLI4_CREATE_EQ_COUNT			= 7 << 26,
    707	SLI4_CREATE_EQ_ARM			= 1u << 31,
    708	/* DW7 */
    709	SLI4_CREATE_EQ_DELAYMULTI_SHIFT		= 13,
    710	SLI4_CREATE_EQ_DELAYMULTI_MASK		= 0x007fe000,
    711	SLI4_CREATE_EQ_DELAYMULTI		= 0x00040000,
    712};
    713
    714struct sli4_rqst_cmn_create_eq {
    715	struct sli4_rqst_hdr	hdr;
    716	__le16			num_pages;
    717	__le16			rsvd18;
    718	__le32			dw5_flags;
    719	__le32			dw6_flags;
    720	__le32			dw7_delaymulti;
    721	__le32			rsvd32;
    722	struct sli4_dmaaddr	page_address[8];
    723};
    724
    725struct sli4_rsp_cmn_create_eq {
    726	struct sli4_rsp_cmn_create_queue q_rsp;
    727};
    728
    729/* EQ count */
    730enum sli4_eq_cnt {
    731	SLI4_EQ_CNT_256,
    732	SLI4_EQ_CNT_512,
    733	SLI4_EQ_CNT_1024,
    734	SLI4_EQ_CNT_2048,
    735	SLI4_EQ_CNT_4096 = 3,
    736};
    737
    738#define SLI4_EQ_CNT_SHIFT	26
    739#define SLI4_EQ_CNT_VAL(type)	(SLI4_EQ_CNT_##type << SLI4_EQ_CNT_SHIFT)
    740
    741#define SLI4_EQE_SIZE_4		0
    742#define SLI4_EQE_SIZE_16	1
    743
    744/* Create a Mailbox Queue; accommodate v0 and v1 forms. */
    745enum sli4_create_mq_flags {
    746	/* DW6W1 */
    747	SLI4_CREATE_MQEXT_RINGSIZE	= 0xf,
    748	SLI4_CREATE_MQEXT_CQID_SHIFT	= 6,
    749	SLI4_CREATE_MQEXT_CQIDV0_MASK	= 0xffc0,
    750	/* DW7 */
    751	SLI4_CREATE_MQEXT_VAL		= 1u << 31,
    752	/* DW8 */
    753	SLI4_CREATE_MQEXT_ACQV		= 1u << 0,
    754	SLI4_CREATE_MQEXT_ASYNC_CQIDV0	= 0x7fe,
    755};
    756
    757struct sli4_rqst_cmn_create_mq_ext {
    758	struct sli4_rqst_hdr	hdr;
    759	__le16			num_pages;
    760	__le16			cq_id_v1;
    761	__le32			async_event_bitmap;
    762	__le16			async_cq_id_v1;
    763	__le16			dw6w1_flags;
    764	__le32			dw7_val;
    765	__le32			dw8_flags;
    766	__le32			rsvd36;
    767	struct sli4_dmaaddr	page_phys_addr[];
    768};
    769
    770struct sli4_rsp_cmn_create_mq_ext {
    771	struct sli4_rsp_cmn_create_queue q_rsp;
    772};
    773
    774enum sli4_mqe_size {
    775	SLI4_MQE_SIZE_16 = 0x05,
    776	SLI4_MQE_SIZE_32,
    777	SLI4_MQE_SIZE_64,
    778	SLI4_MQE_SIZE_128,
    779};
    780
    781enum sli4_async_evt {
    782	SLI4_ASYNC_EVT_LINK_STATE	= 1 << 1,
    783	SLI4_ASYNC_EVT_FIP		= 1 << 2,
    784	SLI4_ASYNC_EVT_GRP5		= 1 << 5,
    785	SLI4_ASYNC_EVT_FC		= 1 << 16,
    786	SLI4_ASYNC_EVT_SLI_PORT		= 1 << 17,
    787};
    788
    789#define	SLI4_ASYNC_EVT_FC_ALL \
    790		(SLI4_ASYNC_EVT_LINK_STATE	| \
    791		 SLI4_ASYNC_EVT_FIP		| \
    792		 SLI4_ASYNC_EVT_GRP5		| \
    793		 SLI4_ASYNC_EVT_FC		| \
    794		 SLI4_ASYNC_EVT_SLI_PORT)
    795
    796/* Create a Completion Queue. */
    797struct sli4_rqst_cmn_create_cq_v0 {
    798	struct sli4_rqst_hdr	hdr;
    799	__le16			num_pages;
    800	__le16			rsvd18;
    801	__le32			dw5_flags;
    802	__le32			dw6_flags;
    803	__le32			rsvd28;
    804	__le32			rsvd32;
    805	struct sli4_dmaaddr	page_phys_addr[];
    806};
    807
    808enum sli4_create_rq_e {
    809	SLI4_RQ_CREATE_DUA		= 0x1,
    810	SLI4_RQ_CREATE_BQU		= 0x2,
    811
    812	SLI4_RQE_SIZE			= 8,
    813	SLI4_RQE_SIZE_8			= 0x2,
    814	SLI4_RQE_SIZE_16		= 0x3,
    815	SLI4_RQE_SIZE_32		= 0x4,
    816	SLI4_RQE_SIZE_64		= 0x5,
    817	SLI4_RQE_SIZE_128		= 0x6,
    818
    819	SLI4_RQ_PAGE_SIZE_4096		= 0x1,
    820	SLI4_RQ_PAGE_SIZE_8192		= 0x2,
    821	SLI4_RQ_PAGE_SIZE_16384		= 0x4,
    822	SLI4_RQ_PAGE_SIZE_32768		= 0x8,
    823	SLI4_RQ_PAGE_SIZE_64536		= 0x10,
    824
    825	SLI4_RQ_CREATE_V0_MAX_PAGES	= 8,
    826	SLI4_RQ_CREATE_V0_MIN_BUF_SIZE	= 128,
    827	SLI4_RQ_CREATE_V0_MAX_BUF_SIZE	= 2048,
    828};
    829
    830struct sli4_rqst_rq_create {
    831	struct sli4_rqst_hdr	hdr;
    832	__le16			num_pages;
    833	u8			dua_bqu_byte;
    834	u8			ulp;
    835	__le16			rsvd16;
    836	u8			rqe_count_byte;
    837	u8			rsvd19;
    838	__le32			rsvd20;
    839	__le16			buffer_size;
    840	__le16			cq_id;
    841	__le32			rsvd28;
    842	struct sli4_dmaaddr	page_phys_addr[SLI4_RQ_CREATE_V0_MAX_PAGES];
    843};
    844
    845struct sli4_rsp_rq_create {
    846	struct sli4_rsp_cmn_create_queue rsp;
    847};
    848
    849enum sli4_create_rqv1_e {
    850	SLI4_RQ_CREATE_V1_DNB		= 0x80,
    851	SLI4_RQ_CREATE_V1_MAX_PAGES	= 8,
    852	SLI4_RQ_CREATE_V1_MIN_BUF_SIZE	= 64,
    853	SLI4_RQ_CREATE_V1_MAX_BUF_SIZE	= 2048,
    854};
    855
    856struct sli4_rqst_rq_create_v1 {
    857	struct sli4_rqst_hdr	hdr;
    858	__le16			num_pages;
    859	u8			rsvd14;
    860	u8			dim_dfd_dnb;
    861	u8			page_size;
    862	u8			rqe_size_byte;
    863	__le16			rqe_count;
    864	__le32			rsvd20;
    865	__le16			rsvd24;
    866	__le16			cq_id;
    867	__le32			buffer_size;
    868	struct sli4_dmaaddr	page_phys_addr[SLI4_RQ_CREATE_V1_MAX_PAGES];
    869};
    870
    871struct sli4_rsp_rq_create_v1 {
    872	struct sli4_rsp_cmn_create_queue rsp;
    873};
    874
    875#define	SLI4_RQCREATEV2_DNB	0x80
    876
    877struct sli4_rqst_rq_create_v2 {
    878	struct sli4_rqst_hdr	hdr;
    879	__le16			num_pages;
    880	u8			rq_count;
    881	u8			dim_dfd_dnb;
    882	u8			page_size;
    883	u8			rqe_size_byte;
    884	__le16			rqe_count;
    885	__le16			hdr_buffer_size;
    886	__le16			payload_buffer_size;
    887	__le16			base_cq_id;
    888	__le16			rsvd26;
    889	__le32			rsvd42;
    890	struct sli4_dmaaddr	page_phys_addr[];
    891};
    892
    893struct sli4_rsp_rq_create_v2 {
    894	struct sli4_rsp_cmn_create_queue rsp;
    895};
    896
    897#define SLI4_CQE_CODE_OFFSET	14
    898
    899enum sli4_cqe_code {
    900	SLI4_CQE_CODE_WORK_REQUEST_COMPLETION = 0x01,
    901	SLI4_CQE_CODE_RELEASE_WQE,
    902	SLI4_CQE_CODE_RSVD,
    903	SLI4_CQE_CODE_RQ_ASYNC,
    904	SLI4_CQE_CODE_XRI_ABORTED,
    905	SLI4_CQE_CODE_RQ_COALESCING,
    906	SLI4_CQE_CODE_RQ_CONSUMPTION,
    907	SLI4_CQE_CODE_MEASUREMENT_REPORTING,
    908	SLI4_CQE_CODE_RQ_ASYNC_V1,
    909	SLI4_CQE_CODE_RQ_COALESCING_V1,
    910	SLI4_CQE_CODE_OPTIMIZED_WRITE_CMD,
    911	SLI4_CQE_CODE_OPTIMIZED_WRITE_DATA,
    912};
    913
    914#define SLI4_WQ_CREATE_MAX_PAGES		8
    915
    916struct sli4_rqst_wq_create {
    917	struct sli4_rqst_hdr	hdr;
    918	__le16			num_pages;
    919	__le16			cq_id;
    920	u8			page_size;
    921	u8			wqe_size_byte;
    922	__le16			wqe_count;
    923	__le32			rsvd;
    924	struct	sli4_dmaaddr	page_phys_addr[SLI4_WQ_CREATE_MAX_PAGES];
    925};
    926
    927struct sli4_rsp_wq_create {
    928	struct sli4_rsp_cmn_create_queue rsp;
    929};
    930
    931enum sli4_link_attention_flags {
    932	SLI4_LNK_ATTN_TYPE_LINK_UP		= 0x01,
    933	SLI4_LNK_ATTN_TYPE_LINK_DOWN		= 0x02,
    934	SLI4_LNK_ATTN_TYPE_NO_HARD_ALPA		= 0x03,
    935
    936	SLI4_LNK_ATTN_P2P			= 0x01,
    937	SLI4_LNK_ATTN_FC_AL			= 0x02,
    938	SLI4_LNK_ATTN_INTERNAL_LOOPBACK		= 0x03,
    939	SLI4_LNK_ATTN_SERDES_LOOPBACK		= 0x04,
    940};
    941
    942struct sli4_link_attention {
    943	u8		link_number;
    944	u8		attn_type;
    945	u8		topology;
    946	u8		port_speed;
    947	u8		port_fault;
    948	u8		shared_link_status;
    949	__le16		logical_link_speed;
    950	__le32		event_tag;
    951	u8		rsvd12;
    952	u8		event_code;
    953	u8		event_type;
    954	u8		flags;
    955};
    956
    957enum sli4_link_event_type {
    958	SLI4_EVENT_LINK_ATTENTION		= 0x01,
    959	SLI4_EVENT_SHARED_LINK_ATTENTION	= 0x02,
    960};
    961
    962enum sli4_wcqe_flags {
    963	SLI4_WCQE_XB = 0x10,
    964	SLI4_WCQE_QX = 0x80,
    965};
    966
    967struct sli4_fc_wcqe {
    968	u8		hw_status;
    969	u8		status;
    970	__le16		request_tag;
    971	__le32		wqe_specific_1;
    972	__le32		wqe_specific_2;
    973	u8		rsvd12;
    974	u8		qx_byte;
    975	u8		code;
    976	u8		flags;
    977};
    978
    979/* FC WQ consumed CQ queue entry */
    980struct sli4_fc_wqec {
    981	__le32		rsvd0;
    982	__le32		rsvd1;
    983	__le16		wqe_index;
    984	__le16		wq_id;
    985	__le16		rsvd12;
    986	u8		code;
    987	u8		vld_byte;
    988};
    989
    990/* FC Completion Status Codes. */
    991enum sli4_wcqe_status {
    992	SLI4_FC_WCQE_STATUS_SUCCESS,
    993	SLI4_FC_WCQE_STATUS_FCP_RSP_FAILURE,
    994	SLI4_FC_WCQE_STATUS_REMOTE_STOP,
    995	SLI4_FC_WCQE_STATUS_LOCAL_REJECT,
    996	SLI4_FC_WCQE_STATUS_NPORT_RJT,
    997	SLI4_FC_WCQE_STATUS_FABRIC_RJT,
    998	SLI4_FC_WCQE_STATUS_NPORT_BSY,
    999	SLI4_FC_WCQE_STATUS_FABRIC_BSY,
   1000	SLI4_FC_WCQE_STATUS_RSVD,
   1001	SLI4_FC_WCQE_STATUS_LS_RJT,
   1002	SLI4_FC_WCQE_STATUS_RX_BUF_OVERRUN,
   1003	SLI4_FC_WCQE_STATUS_CMD_REJECT,
   1004	SLI4_FC_WCQE_STATUS_FCP_TGT_LENCHECK,
   1005	SLI4_FC_WCQE_STATUS_RSVD1,
   1006	SLI4_FC_WCQE_STATUS_ELS_CMPLT_NO_AUTOREG,
   1007	SLI4_FC_WCQE_STATUS_RSVD2,
   1008	SLI4_FC_WCQE_STATUS_RQ_SUCCESS,
   1009	SLI4_FC_WCQE_STATUS_RQ_BUF_LEN_EXCEEDED,
   1010	SLI4_FC_WCQE_STATUS_RQ_INSUFF_BUF_NEEDED,
   1011	SLI4_FC_WCQE_STATUS_RQ_INSUFF_FRM_DISC,
   1012	SLI4_FC_WCQE_STATUS_RQ_DMA_FAILURE,
   1013	SLI4_FC_WCQE_STATUS_FCP_RSP_TRUNCATE,
   1014	SLI4_FC_WCQE_STATUS_DI_ERROR,
   1015	SLI4_FC_WCQE_STATUS_BA_RJT,
   1016	SLI4_FC_WCQE_STATUS_RQ_INSUFF_XRI_NEEDED,
   1017	SLI4_FC_WCQE_STATUS_RQ_INSUFF_XRI_DISC,
   1018	SLI4_FC_WCQE_STATUS_RX_ERROR_DETECT,
   1019	SLI4_FC_WCQE_STATUS_RX_ABORT_REQUEST,
   1020
   1021	/* driver generated status codes */
   1022	SLI4_FC_WCQE_STATUS_DISPATCH_ERROR	= 0xfd,
   1023	SLI4_FC_WCQE_STATUS_SHUTDOWN		= 0xfe,
   1024	SLI4_FC_WCQE_STATUS_TARGET_WQE_TIMEOUT	= 0xff,
   1025};
   1026
   1027/* DI_ERROR Extended Status */
   1028enum sli4_fc_di_error_status {
   1029	SLI4_FC_DI_ERROR_GE			= 1 << 0,
   1030	SLI4_FC_DI_ERROR_AE			= 1 << 1,
   1031	SLI4_FC_DI_ERROR_RE			= 1 << 2,
   1032	SLI4_FC_DI_ERROR_TDPV			= 1 << 3,
   1033	SLI4_FC_DI_ERROR_UDB			= 1 << 4,
   1034	SLI4_FC_DI_ERROR_EDIR			= 1 << 5,
   1035};
   1036
   1037/* WQE DIF field contents */
   1038enum sli4_dif_fields {
   1039	SLI4_DIF_DISABLED,
   1040	SLI4_DIF_PASS_THROUGH,
   1041	SLI4_DIF_STRIP,
   1042	SLI4_DIF_INSERT,
   1043};
   1044
   1045/* Work Queue Entry (WQE) types */
   1046enum sli4_wqe_types {
   1047	SLI4_WQE_ABORT				= 0x0f,
   1048	SLI4_WQE_ELS_REQUEST64			= 0x8a,
   1049	SLI4_WQE_FCP_IBIDIR64			= 0xac,
   1050	SLI4_WQE_FCP_IREAD64			= 0x9a,
   1051	SLI4_WQE_FCP_IWRITE64			= 0x98,
   1052	SLI4_WQE_FCP_ICMND64			= 0x9c,
   1053	SLI4_WQE_FCP_TRECEIVE64			= 0xa1,
   1054	SLI4_WQE_FCP_CONT_TRECEIVE64		= 0xe5,
   1055	SLI4_WQE_FCP_TRSP64			= 0xa3,
   1056	SLI4_WQE_FCP_TSEND64			= 0x9f,
   1057	SLI4_WQE_GEN_REQUEST64			= 0xc2,
   1058	SLI4_WQE_SEND_FRAME			= 0xe1,
   1059	SLI4_WQE_XMIT_BCAST64			= 0x84,
   1060	SLI4_WQE_XMIT_BLS_RSP			= 0x97,
   1061	SLI4_WQE_ELS_RSP64			= 0x95,
   1062	SLI4_WQE_XMIT_SEQUENCE64		= 0x82,
   1063	SLI4_WQE_REQUEUE_XRI			= 0x93,
   1064};
   1065
   1066/* WQE command types */
   1067enum sli4_wqe_cmds {
   1068	SLI4_CMD_FCP_IREAD64_WQE		= 0x00,
   1069	SLI4_CMD_FCP_ICMND64_WQE		= 0x00,
   1070	SLI4_CMD_FCP_IWRITE64_WQE		= 0x01,
   1071	SLI4_CMD_FCP_TRECEIVE64_WQE		= 0x02,
   1072	SLI4_CMD_FCP_TRSP64_WQE			= 0x03,
   1073	SLI4_CMD_FCP_TSEND64_WQE		= 0x07,
   1074	SLI4_CMD_GEN_REQUEST64_WQE		= 0x08,
   1075	SLI4_CMD_XMIT_BCAST64_WQE		= 0x08,
   1076	SLI4_CMD_XMIT_BLS_RSP64_WQE		= 0x08,
   1077	SLI4_CMD_ABORT_WQE			= 0x08,
   1078	SLI4_CMD_XMIT_SEQUENCE64_WQE		= 0x08,
   1079	SLI4_CMD_REQUEUE_XRI_WQE		= 0x0a,
   1080	SLI4_CMD_SEND_FRAME_WQE			= 0x0a,
   1081};
   1082
   1083#define SLI4_WQE_SIZE		0x05
   1084#define SLI4_WQE_EXT_SIZE	0x06
   1085
   1086#define SLI4_WQE_BYTES		(16 * sizeof(u32))
   1087#define SLI4_WQE_EXT_BYTES	(32 * sizeof(u32))
   1088
   1089/* Mask for ccp (CS_CTL) */
   1090#define SLI4_MASK_CCP		0xfe
   1091
   1092/* Generic WQE */
   1093enum sli4_gen_wqe_flags {
   1094	SLI4_GEN_WQE_EBDECNT	= 0xf,
   1095	SLI4_GEN_WQE_LEN_LOC	= 0x3 << 7,
   1096	SLI4_GEN_WQE_QOSD	= 1 << 9,
   1097	SLI4_GEN_WQE_XBL	= 1 << 11,
   1098	SLI4_GEN_WQE_HLM	= 1 << 12,
   1099	SLI4_GEN_WQE_IOD	= 1 << 13,
   1100	SLI4_GEN_WQE_DBDE	= 1 << 14,
   1101	SLI4_GEN_WQE_WQES	= 1 << 15,
   1102
   1103	SLI4_GEN_WQE_PRI	= 0x7,
   1104	SLI4_GEN_WQE_PV		= 1 << 3,
   1105	SLI4_GEN_WQE_EAT	= 1 << 4,
   1106	SLI4_GEN_WQE_XC		= 1 << 5,
   1107	SLI4_GEN_WQE_CCPE	= 1 << 7,
   1108
   1109	SLI4_GEN_WQE_CMDTYPE	= 0xf,
   1110	SLI4_GEN_WQE_WQEC	= 1 << 7,
   1111};
   1112
   1113struct sli4_generic_wqe {
   1114	__le32		cmd_spec0_5[6];
   1115	__le16		xri_tag;
   1116	__le16		context_tag;
   1117	u8		ct_byte;
   1118	u8		command;
   1119	u8		class_byte;
   1120	u8		timer;
   1121	__le32		abort_tag;
   1122	__le16		request_tag;
   1123	__le16		rsvd34;
   1124	__le16		dw10w0_flags;
   1125	u8		eat_xc_ccpe;
   1126	u8		ccp;
   1127	u8		cmdtype_wqec_byte;
   1128	u8		rsvd41;
   1129	__le16		cq_id;
   1130};
   1131
   1132/* WQE used to abort exchanges. */
   1133enum sli4_abort_wqe_flags {
   1134	SLI4_ABRT_WQE_IR	= 0x02,
   1135
   1136	SLI4_ABRT_WQE_EBDECNT	= 0xf,
   1137	SLI4_ABRT_WQE_LEN_LOC	= 0x3 << 7,
   1138	SLI4_ABRT_WQE_QOSD	= 1 << 9,
   1139	SLI4_ABRT_WQE_XBL	= 1 << 11,
   1140	SLI4_ABRT_WQE_IOD	= 1 << 13,
   1141	SLI4_ABRT_WQE_DBDE	= 1 << 14,
   1142	SLI4_ABRT_WQE_WQES	= 1 << 15,
   1143
   1144	SLI4_ABRT_WQE_PRI	= 0x7,
   1145	SLI4_ABRT_WQE_PV	= 1 << 3,
   1146	SLI4_ABRT_WQE_EAT	= 1 << 4,
   1147	SLI4_ABRT_WQE_XC	= 1 << 5,
   1148	SLI4_ABRT_WQE_CCPE	= 1 << 7,
   1149
   1150	SLI4_ABRT_WQE_CMDTYPE	= 0xf,
   1151	SLI4_ABRT_WQE_WQEC	= 1 << 7,
   1152};
   1153
   1154struct sli4_abort_wqe {
   1155	__le32		rsvd0;
   1156	__le32		rsvd4;
   1157	__le32		ext_t_tag;
   1158	u8		ia_ir_byte;
   1159	u8		criteria;
   1160	__le16		rsvd10;
   1161	__le32		ext_t_mask;
   1162	__le32		t_mask;
   1163	__le16		xri_tag;
   1164	__le16		context_tag;
   1165	u8		ct_byte;
   1166	u8		command;
   1167	u8		class_byte;
   1168	u8		timer;
   1169	__le32		t_tag;
   1170	__le16		request_tag;
   1171	__le16		rsvd34;
   1172	__le16		dw10w0_flags;
   1173	u8		eat_xc_ccpe;
   1174	u8		ccp;
   1175	u8		cmdtype_wqec_byte;
   1176	u8		rsvd41;
   1177	__le16		cq_id;
   1178};
   1179
   1180enum sli4_abort_criteria {
   1181	SLI4_ABORT_CRITERIA_XRI_TAG = 0x01,
   1182	SLI4_ABORT_CRITERIA_ABORT_TAG,
   1183	SLI4_ABORT_CRITERIA_REQUEST_TAG,
   1184	SLI4_ABORT_CRITERIA_EXT_ABORT_TAG,
   1185};
   1186
   1187enum sli4_abort_type {
   1188	SLI4_ABORT_XRI,
   1189	SLI4_ABORT_ABORT_ID,
   1190	SLI4_ABORT_REQUEST_ID,
   1191	SLI4_ABORT_MAX,		/* must be last */
   1192};
   1193
   1194/* WQE used to create an ELS request. */
   1195enum sli4_els_req_wqe_flags {
   1196	SLI4_REQ_WQE_QOSD		= 0x2,
   1197	SLI4_REQ_WQE_DBDE		= 0x40,
   1198	SLI4_REQ_WQE_XBL		= 0x8,
   1199	SLI4_REQ_WQE_XC			= 0x20,
   1200	SLI4_REQ_WQE_IOD		= 0x20,
   1201	SLI4_REQ_WQE_HLM		= 0x10,
   1202	SLI4_REQ_WQE_CCPE		= 0x80,
   1203	SLI4_REQ_WQE_EAT		= 0x10,
   1204	SLI4_REQ_WQE_WQES		= 0x80,
   1205	SLI4_REQ_WQE_PU_SHFT		= 4,
   1206	SLI4_REQ_WQE_CT_SHFT		= 2,
   1207	SLI4_REQ_WQE_CT			= 0xc,
   1208	SLI4_REQ_WQE_ELSID_SHFT		= 4,
   1209	SLI4_REQ_WQE_SP_SHFT		= 24,
   1210	SLI4_REQ_WQE_LEN_LOC_BIT1	= 0x80,
   1211	SLI4_REQ_WQE_LEN_LOC_BIT2	= 0x1,
   1212};
   1213
   1214struct sli4_els_request64_wqe {
   1215	struct sli4_bde	els_request_payload;
   1216	__le32		els_request_payload_length;
   1217	__le32		sid_sp_dword;
   1218	__le32		remote_id_dword;
   1219	__le16		xri_tag;
   1220	__le16		context_tag;
   1221	u8		ct_byte;
   1222	u8		command;
   1223	u8		class_byte;
   1224	u8		timer;
   1225	__le32		abort_tag;
   1226	__le16		request_tag;
   1227	__le16		temporary_rpi;
   1228	u8		len_loc1_byte;
   1229	u8		qosd_xbl_hlm_iod_dbde_wqes;
   1230	u8		eat_xc_ccpe;
   1231	u8		ccp;
   1232	u8		cmdtype_elsid_byte;
   1233	u8		rsvd41;
   1234	__le16		cq_id;
   1235	struct sli4_bde	els_response_payload_bde;
   1236	__le32		max_response_payload_length;
   1237};
   1238
   1239/* WQE used to create an FCP initiator no data command. */
   1240enum sli4_icmd_wqe_flags {
   1241	SLI4_ICMD_WQE_DBDE		= 0x40,
   1242	SLI4_ICMD_WQE_XBL		= 0x8,
   1243	SLI4_ICMD_WQE_XC		= 0x20,
   1244	SLI4_ICMD_WQE_IOD		= 0x20,
   1245	SLI4_ICMD_WQE_HLM		= 0x10,
   1246	SLI4_ICMD_WQE_CCPE		= 0x80,
   1247	SLI4_ICMD_WQE_EAT		= 0x10,
   1248	SLI4_ICMD_WQE_APPID		= 0x10,
   1249	SLI4_ICMD_WQE_WQES		= 0x80,
   1250	SLI4_ICMD_WQE_PU_SHFT		= 4,
   1251	SLI4_ICMD_WQE_CT_SHFT		= 2,
   1252	SLI4_ICMD_WQE_BS_SHFT		= 4,
   1253	SLI4_ICMD_WQE_LEN_LOC_BIT1	= 0x80,
   1254	SLI4_ICMD_WQE_LEN_LOC_BIT2	= 0x1,
   1255};
   1256
   1257struct sli4_fcp_icmnd64_wqe {
   1258	struct sli4_bde	bde;
   1259	__le16		payload_offset_length;
   1260	__le16		fcp_cmd_buffer_length;
   1261	__le32		rsvd12;
   1262	__le32		remote_n_port_id_dword;
   1263	__le16		xri_tag;
   1264	__le16		context_tag;
   1265	u8		dif_ct_bs_byte;
   1266	u8		command;
   1267	u8		class_pu_byte;
   1268	u8		timer;
   1269	__le32		abort_tag;
   1270	__le16		request_tag;
   1271	__le16		rsvd34;
   1272	u8		len_loc1_byte;
   1273	u8		qosd_xbl_hlm_iod_dbde_wqes;
   1274	u8		eat_xc_ccpe;
   1275	u8		ccp;
   1276	u8		cmd_type_byte;
   1277	u8		rsvd41;
   1278	__le16		cq_id;
   1279	__le32		rsvd44;
   1280	__le32		rsvd48;
   1281	__le32		rsvd52;
   1282	__le32		rsvd56;
   1283};
   1284
   1285/* WQE used to create an FCP initiator read. */
   1286enum sli4_ir_wqe_flags {
   1287	SLI4_IR_WQE_DBDE		= 0x40,
   1288	SLI4_IR_WQE_XBL			= 0x8,
   1289	SLI4_IR_WQE_XC			= 0x20,
   1290	SLI4_IR_WQE_IOD			= 0x20,
   1291	SLI4_IR_WQE_HLM			= 0x10,
   1292	SLI4_IR_WQE_CCPE		= 0x80,
   1293	SLI4_IR_WQE_EAT			= 0x10,
   1294	SLI4_IR_WQE_APPID		= 0x10,
   1295	SLI4_IR_WQE_WQES		= 0x80,
   1296	SLI4_IR_WQE_PU_SHFT		= 4,
   1297	SLI4_IR_WQE_CT_SHFT		= 2,
   1298	SLI4_IR_WQE_BS_SHFT		= 4,
   1299	SLI4_IR_WQE_LEN_LOC_BIT1	= 0x80,
   1300	SLI4_IR_WQE_LEN_LOC_BIT2	= 0x1,
   1301};
   1302
   1303struct sli4_fcp_iread64_wqe {
   1304	struct sli4_bde	bde;
   1305	__le16		payload_offset_length;
   1306	__le16		fcp_cmd_buffer_length;
   1307
   1308	__le32		total_transfer_length;
   1309
   1310	__le32		remote_n_port_id_dword;
   1311
   1312	__le16		xri_tag;
   1313	__le16		context_tag;
   1314
   1315	u8		dif_ct_bs_byte;
   1316	u8		command;
   1317	u8		class_pu_byte;
   1318	u8		timer;
   1319
   1320	__le32		abort_tag;
   1321
   1322	__le16		request_tag;
   1323	__le16		rsvd34;
   1324
   1325	u8		len_loc1_byte;
   1326	u8		qosd_xbl_hlm_iod_dbde_wqes;
   1327	u8		eat_xc_ccpe;
   1328	u8		ccp;
   1329
   1330	u8		cmd_type_byte;
   1331	u8		rsvd41;
   1332	__le16		cq_id;
   1333
   1334	__le32		rsvd44;
   1335	struct sli4_bde	first_data_bde;
   1336};
   1337
   1338/* WQE used to create an FCP initiator write. */
   1339enum sli4_iwr_wqe_flags {
   1340	SLI4_IWR_WQE_DBDE		= 0x40,
   1341	SLI4_IWR_WQE_XBL		= 0x8,
   1342	SLI4_IWR_WQE_XC			= 0x20,
   1343	SLI4_IWR_WQE_IOD		= 0x20,
   1344	SLI4_IWR_WQE_HLM		= 0x10,
   1345	SLI4_IWR_WQE_DNRX		= 0x10,
   1346	SLI4_IWR_WQE_CCPE		= 0x80,
   1347	SLI4_IWR_WQE_EAT		= 0x10,
   1348	SLI4_IWR_WQE_APPID		= 0x10,
   1349	SLI4_IWR_WQE_WQES		= 0x80,
   1350	SLI4_IWR_WQE_PU_SHFT		= 4,
   1351	SLI4_IWR_WQE_CT_SHFT		= 2,
   1352	SLI4_IWR_WQE_BS_SHFT		= 4,
   1353	SLI4_IWR_WQE_LEN_LOC_BIT1	= 0x80,
   1354	SLI4_IWR_WQE_LEN_LOC_BIT2	= 0x1,
   1355};
   1356
   1357struct sli4_fcp_iwrite64_wqe {
   1358	struct sli4_bde	bde;
   1359	__le16		payload_offset_length;
   1360	__le16		fcp_cmd_buffer_length;
   1361	__le16		total_transfer_length;
   1362	__le16		initial_transfer_length;
   1363	__le16		xri_tag;
   1364	__le16		context_tag;
   1365	u8		dif_ct_bs_byte;
   1366	u8		command;
   1367	u8		class_pu_byte;
   1368	u8		timer;
   1369	__le32		abort_tag;
   1370	__le16		request_tag;
   1371	__le16		rsvd34;
   1372	u8		len_loc1_byte;
   1373	u8		qosd_xbl_hlm_iod_dbde_wqes;
   1374	u8		eat_xc_ccpe;
   1375	u8		ccp;
   1376	u8		cmd_type_byte;
   1377	u8		rsvd41;
   1378	__le16		cq_id;
   1379	__le32		remote_n_port_id_dword;
   1380	struct sli4_bde	first_data_bde;
   1381};
   1382
   1383struct sli4_fcp_128byte_wqe {
   1384	u32 dw[32];
   1385};
   1386
   1387/* WQE used to create an FCP target receive */
   1388enum sli4_trcv_wqe_flags {
   1389	SLI4_TRCV_WQE_DBDE		= 0x40,
   1390	SLI4_TRCV_WQE_XBL		= 0x8,
   1391	SLI4_TRCV_WQE_AR		= 0x8,
   1392	SLI4_TRCV_WQE_XC		= 0x20,
   1393	SLI4_TRCV_WQE_IOD		= 0x20,
   1394	SLI4_TRCV_WQE_HLM		= 0x10,
   1395	SLI4_TRCV_WQE_DNRX		= 0x10,
   1396	SLI4_TRCV_WQE_CCPE		= 0x80,
   1397	SLI4_TRCV_WQE_EAT		= 0x10,
   1398	SLI4_TRCV_WQE_APPID		= 0x10,
   1399	SLI4_TRCV_WQE_WQES		= 0x80,
   1400	SLI4_TRCV_WQE_PU_SHFT		= 4,
   1401	SLI4_TRCV_WQE_CT_SHFT		= 2,
   1402	SLI4_TRCV_WQE_BS_SHFT		= 4,
   1403	SLI4_TRCV_WQE_LEN_LOC_BIT2	= 0x1,
   1404};
   1405
   1406struct sli4_fcp_treceive64_wqe {
   1407	struct sli4_bde	bde;
   1408	__le32		payload_offset_length;
   1409	__le32		relative_offset;
   1410	union {
   1411		__le16	sec_xri_tag;
   1412		__le16	rsvd;
   1413		__le32	dword;
   1414	} dword5;
   1415	__le16		xri_tag;
   1416	__le16		context_tag;
   1417	u8		dif_ct_bs_byte;
   1418	u8		command;
   1419	u8		class_ar_pu_byte;
   1420	u8		timer;
   1421	__le32		abort_tag;
   1422	__le16		request_tag;
   1423	__le16		remote_xid;
   1424	u8		lloc1_appid;
   1425	u8		qosd_xbl_hlm_iod_dbde_wqes;
   1426	u8		eat_xc_ccpe;
   1427	u8		ccp;
   1428	u8		cmd_type_byte;
   1429	u8		rsvd41;
   1430	__le16		cq_id;
   1431	__le32		fcp_data_receive_length;
   1432	struct sli4_bde	first_data_bde;
   1433};
   1434
   1435/* WQE used to create an FCP target response */
   1436enum sli4_trsp_wqe_flags {
   1437	SLI4_TRSP_WQE_AG	= 0x8,
   1438	SLI4_TRSP_WQE_DBDE	= 0x40,
   1439	SLI4_TRSP_WQE_XBL	= 0x8,
   1440	SLI4_TRSP_WQE_XC	= 0x20,
   1441	SLI4_TRSP_WQE_HLM	= 0x10,
   1442	SLI4_TRSP_WQE_DNRX	= 0x10,
   1443	SLI4_TRSP_WQE_CCPE	= 0x80,
   1444	SLI4_TRSP_WQE_EAT	= 0x10,
   1445	SLI4_TRSP_WQE_APPID	= 0x10,
   1446	SLI4_TRSP_WQE_WQES	= 0x80,
   1447};
   1448
   1449struct sli4_fcp_trsp64_wqe {
   1450	struct sli4_bde	bde;
   1451	__le32		fcp_response_length;
   1452	__le32		rsvd12;
   1453	__le32		dword5;
   1454	__le16		xri_tag;
   1455	__le16		rpi;
   1456	u8		ct_dnrx_byte;
   1457	u8		command;
   1458	u8		class_ag_byte;
   1459	u8		timer;
   1460	__le32		abort_tag;
   1461	__le16		request_tag;
   1462	__le16		remote_xid;
   1463	u8		lloc1_appid;
   1464	u8		qosd_xbl_hlm_dbde_wqes;
   1465	u8		eat_xc_ccpe;
   1466	u8		ccp;
   1467	u8		cmd_type_byte;
   1468	u8		rsvd41;
   1469	__le16		cq_id;
   1470	__le32		rsvd44;
   1471	__le32		rsvd48;
   1472	__le32		rsvd52;
   1473	__le32		rsvd56;
   1474};
   1475
   1476/* WQE used to create an FCP target send (DATA IN). */
   1477enum sli4_tsend_wqe_flags {
   1478	SLI4_TSEND_WQE_XBL	= 0x8,
   1479	SLI4_TSEND_WQE_DBDE	= 0x40,
   1480	SLI4_TSEND_WQE_IOD	= 0x20,
   1481	SLI4_TSEND_WQE_QOSD	= 0x2,
   1482	SLI4_TSEND_WQE_HLM	= 0x10,
   1483	SLI4_TSEND_WQE_PU_SHFT	= 4,
   1484	SLI4_TSEND_WQE_AR	= 0x8,
   1485	SLI4_TSEND_CT_SHFT	= 2,
   1486	SLI4_TSEND_BS_SHFT	= 4,
   1487	SLI4_TSEND_LEN_LOC_BIT2 = 0x1,
   1488	SLI4_TSEND_CCPE		= 0x80,
   1489	SLI4_TSEND_APPID_VALID	= 0x20,
   1490	SLI4_TSEND_WQES		= 0x80,
   1491	SLI4_TSEND_XC		= 0x20,
   1492	SLI4_TSEND_EAT		= 0x10,
   1493};
   1494
   1495struct sli4_fcp_tsend64_wqe {
   1496	struct sli4_bde	bde;
   1497	__le32		payload_offset_length;
   1498	__le32		relative_offset;
   1499	__le32		dword5;
   1500	__le16		xri_tag;
   1501	__le16		rpi;
   1502	u8		ct_byte;
   1503	u8		command;
   1504	u8		class_pu_ar_byte;
   1505	u8		timer;
   1506	__le32		abort_tag;
   1507	__le16		request_tag;
   1508	__le16		remote_xid;
   1509	u8		dw10byte0;
   1510	u8		ll_qd_xbl_hlm_iod_dbde;
   1511	u8		dw10byte2;
   1512	u8		ccp;
   1513	u8		cmd_type_byte;
   1514	u8		rsvd45;
   1515	__le16		cq_id;
   1516	__le32		fcp_data_transmit_length;
   1517	struct sli4_bde	first_data_bde;
   1518};
   1519
   1520/* WQE used to create a general request. */
   1521enum sli4_gen_req_wqe_flags {
   1522	SLI4_GEN_REQ64_WQE_XBL	= 0x8,
   1523	SLI4_GEN_REQ64_WQE_DBDE	= 0x40,
   1524	SLI4_GEN_REQ64_WQE_IOD	= 0x20,
   1525	SLI4_GEN_REQ64_WQE_QOSD	= 0x2,
   1526	SLI4_GEN_REQ64_WQE_HLM	= 0x10,
   1527	SLI4_GEN_REQ64_CT_SHFT	= 2,
   1528};
   1529
   1530struct sli4_gen_request64_wqe {
   1531	struct sli4_bde	bde;
   1532	__le32		request_payload_length;
   1533	__le32		relative_offset;
   1534	u8		rsvd17;
   1535	u8		df_ctl;
   1536	u8		type;
   1537	u8		r_ctl;
   1538	__le16		xri_tag;
   1539	__le16		context_tag;
   1540	u8		ct_byte;
   1541	u8		command;
   1542	u8		class_byte;
   1543	u8		timer;
   1544	__le32		abort_tag;
   1545	__le16		request_tag;
   1546	__le16		rsvd34;
   1547	u8		dw10flags0;
   1548	u8		dw10flags1;
   1549	u8		dw10flags2;
   1550	u8		ccp;
   1551	u8		cmd_type_byte;
   1552	u8		rsvd41;
   1553	__le16		cq_id;
   1554	__le32		remote_n_port_id_dword;
   1555	__le32		rsvd48;
   1556	__le32		rsvd52;
   1557	__le32		max_response_payload_length;
   1558};
   1559
   1560/* WQE used to create a send frame request */
   1561enum sli4_sf_wqe_flags {
   1562	SLI4_SF_WQE_DBDE	= 0x40,
   1563	SLI4_SF_PU		= 0x30,
   1564	SLI4_SF_CT		= 0xc,
   1565	SLI4_SF_QOSD		= 0x2,
   1566	SLI4_SF_LEN_LOC_BIT1	= 0x80,
   1567	SLI4_SF_LEN_LOC_BIT2	= 0x1,
   1568	SLI4_SF_XC		= 0x20,
   1569	SLI4_SF_XBL		= 0x8,
   1570};
   1571
   1572struct sli4_send_frame_wqe {
   1573	struct sli4_bde	bde;
   1574	__le32		frame_length;
   1575	__le32		fc_header_0_1[2];
   1576	__le16		xri_tag;
   1577	__le16		context_tag;
   1578	u8		ct_byte;
   1579	u8		command;
   1580	u8		dw7flags0;
   1581	u8		timer;
   1582	__le32		abort_tag;
   1583	__le16		request_tag;
   1584	u8		eof;
   1585	u8		sof;
   1586	u8		dw10flags0;
   1587	u8		dw10flags1;
   1588	u8		dw10flags2;
   1589	u8		ccp;
   1590	u8		cmd_type_byte;
   1591	u8		rsvd41;
   1592	__le16		cq_id;
   1593	__le32		fc_header_2_5[4];
   1594};
   1595
   1596/* WQE used to create a transmit sequence */
   1597enum sli4_seq_wqe_flags {
   1598	SLI4_SEQ_WQE_DBDE		= 0x4000,
   1599	SLI4_SEQ_WQE_XBL		= 0x800,
   1600	SLI4_SEQ_WQE_SI			= 0x4,
   1601	SLI4_SEQ_WQE_FT			= 0x8,
   1602	SLI4_SEQ_WQE_XO			= 0x40,
   1603	SLI4_SEQ_WQE_LS			= 0x80,
   1604	SLI4_SEQ_WQE_DIF		= 0x3,
   1605	SLI4_SEQ_WQE_BS			= 0x70,
   1606	SLI4_SEQ_WQE_PU			= 0x30,
   1607	SLI4_SEQ_WQE_HLM		= 0x1000,
   1608	SLI4_SEQ_WQE_IOD_SHIFT		= 13,
   1609	SLI4_SEQ_WQE_CT_SHIFT		= 2,
   1610	SLI4_SEQ_WQE_LEN_LOC_SHIFT	= 7,
   1611};
   1612
   1613struct sli4_xmit_sequence64_wqe {
   1614	struct sli4_bde	bde;
   1615	__le32		remote_n_port_id_dword;
   1616	__le32		relative_offset;
   1617	u8		dw5flags0;
   1618	u8		df_ctl;
   1619	u8		type;
   1620	u8		r_ctl;
   1621	__le16		xri_tag;
   1622	__le16		context_tag;
   1623	u8		dw7flags0;
   1624	u8		command;
   1625	u8		dw7flags1;
   1626	u8		timer;
   1627	__le32		abort_tag;
   1628	__le16		request_tag;
   1629	__le16		remote_xid;
   1630	__le16		dw10w0;
   1631	u8		dw10flags0;
   1632	u8		ccp;
   1633	u8		cmd_type_wqec_byte;
   1634	u8		rsvd45;
   1635	__le16		cq_id;
   1636	__le32		sequence_payload_len;
   1637	__le32		rsvd48;
   1638	__le32		rsvd52;
   1639	__le32		rsvd56;
   1640};
   1641
   1642/*
   1643 * WQE used unblock the specified XRI and to release
   1644 * it to the SLI Port's free pool.
   1645 */
   1646enum sli4_requeue_wqe_flags {
   1647	SLI4_REQU_XRI_WQE_XC	= 0x20,
   1648	SLI4_REQU_XRI_WQE_QOSD	= 0x2,
   1649};
   1650
   1651struct sli4_requeue_xri_wqe {
   1652	__le32		rsvd0;
   1653	__le32		rsvd4;
   1654	__le32		rsvd8;
   1655	__le32		rsvd12;
   1656	__le32		rsvd16;
   1657	__le32		rsvd20;
   1658	__le16		xri_tag;
   1659	__le16		context_tag;
   1660	u8		ct_byte;
   1661	u8		command;
   1662	u8		class_byte;
   1663	u8		timer;
   1664	__le32		rsvd32;
   1665	__le16		request_tag;
   1666	__le16		rsvd34;
   1667	__le16		flags0;
   1668	__le16		flags1;
   1669	__le16		flags2;
   1670	u8		ccp;
   1671	u8		cmd_type_wqec_byte;
   1672	u8		rsvd42;
   1673	__le16		cq_id;
   1674	__le32		rsvd44;
   1675	__le32		rsvd48;
   1676	__le32		rsvd52;
   1677	__le32		rsvd56;
   1678};
   1679
   1680/* WQE used to create a BLS response */
   1681enum sli4_bls_rsp_wqe_flags {
   1682	SLI4_BLS_RSP_RID		= 0xffffff,
   1683	SLI4_BLS_RSP_WQE_AR		= 0x40000000,
   1684	SLI4_BLS_RSP_WQE_CT_SHFT	= 2,
   1685	SLI4_BLS_RSP_WQE_QOSD		= 0x2,
   1686	SLI4_BLS_RSP_WQE_HLM		= 0x10,
   1687};
   1688
   1689struct sli4_xmit_bls_rsp_wqe {
   1690	__le32		payload_word0;
   1691	__le16		rx_id;
   1692	__le16		ox_id;
   1693	__le16		high_seq_cnt;
   1694	__le16		low_seq_cnt;
   1695	__le32		rsvd12;
   1696	__le32		local_n_port_id_dword;
   1697	__le32		remote_id_dword;
   1698	__le16		xri_tag;
   1699	__le16		context_tag;
   1700	u8		dw8flags0;
   1701	u8		command;
   1702	u8		dw8flags1;
   1703	u8		timer;
   1704	__le32		abort_tag;
   1705	__le16		request_tag;
   1706	__le16		rsvd38;
   1707	u8		dw11flags0;
   1708	u8		dw11flags1;
   1709	u8		dw11flags2;
   1710	u8		ccp;
   1711	u8		dw12flags0;
   1712	u8		rsvd45;
   1713	__le16		cq_id;
   1714	__le16		temporary_rpi;
   1715	u8		rsvd50;
   1716	u8		rsvd51;
   1717	__le32		rsvd52;
   1718	__le32		rsvd56;
   1719	__le32		rsvd60;
   1720};
   1721
   1722enum sli_bls_type {
   1723	SLI4_SLI_BLS_ACC,
   1724	SLI4_SLI_BLS_RJT,
   1725	SLI4_SLI_BLS_MAX
   1726};
   1727
   1728struct sli_bls_payload {
   1729	enum sli_bls_type	type;
   1730	__le16			ox_id;
   1731	__le16			rx_id;
   1732	union {
   1733		struct {
   1734			u8	seq_id_validity;
   1735			u8	seq_id_last;
   1736			u8	rsvd2;
   1737			u8	rsvd3;
   1738			u16	ox_id;
   1739			u16	rx_id;
   1740			__le16	low_seq_cnt;
   1741			__le16	high_seq_cnt;
   1742		} acc;
   1743		struct {
   1744			u8	vendor_unique;
   1745			u8	reason_explanation;
   1746			u8	reason_code;
   1747			u8	rsvd3;
   1748		} rjt;
   1749	} u;
   1750};
   1751
   1752/* WQE used to create an ELS response */
   1753
   1754enum sli4_els_rsp_flags {
   1755	SLI4_ELS_SID		= 0xffffff,
   1756	SLI4_ELS_RID		= 0xffffff,
   1757	SLI4_ELS_DBDE		= 0x40,
   1758	SLI4_ELS_XBL		= 0x8,
   1759	SLI4_ELS_IOD		= 0x20,
   1760	SLI4_ELS_QOSD		= 0x2,
   1761	SLI4_ELS_XC		= 0x20,
   1762	SLI4_ELS_CT_OFFSET	= 0X2,
   1763	SLI4_ELS_SP		= 0X1000000,
   1764	SLI4_ELS_HLM		= 0X10,
   1765};
   1766
   1767struct sli4_xmit_els_rsp64_wqe {
   1768	struct sli4_bde	els_response_payload;
   1769	__le32		els_response_payload_length;
   1770	__le32		sid_dw;
   1771	__le32		rid_dw;
   1772	__le16		xri_tag;
   1773	__le16		context_tag;
   1774	u8		ct_byte;
   1775	u8		command;
   1776	u8		class_byte;
   1777	u8		timer;
   1778	__le32		abort_tag;
   1779	__le16		request_tag;
   1780	__le16		ox_id;
   1781	u8		flags1;
   1782	u8		flags2;
   1783	u8		flags3;
   1784	u8		flags4;
   1785	u8		cmd_type_wqec;
   1786	u8		rsvd34;
   1787	__le16		cq_id;
   1788	__le16		temporary_rpi;
   1789	__le16		rsvd38;
   1790	u32		rsvd40;
   1791	u32		rsvd44;
   1792	u32		rsvd48;
   1793};
   1794
   1795/* Local Reject Reason Codes */
   1796enum sli4_fc_local_rej_codes {
   1797	SLI4_FC_LOCAL_REJECT_UNKNOWN,
   1798	SLI4_FC_LOCAL_REJECT_MISSING_CONTINUE,
   1799	SLI4_FC_LOCAL_REJECT_SEQUENCE_TIMEOUT,
   1800	SLI4_FC_LOCAL_REJECT_INTERNAL_ERROR,
   1801	SLI4_FC_LOCAL_REJECT_INVALID_RPI,
   1802	SLI4_FC_LOCAL_REJECT_NO_XRI,
   1803	SLI4_FC_LOCAL_REJECT_ILLEGAL_COMMAND,
   1804	SLI4_FC_LOCAL_REJECT_XCHG_DROPPED,
   1805	SLI4_FC_LOCAL_REJECT_ILLEGAL_FIELD,
   1806	SLI4_FC_LOCAL_REJECT_RPI_SUSPENDED,
   1807	SLI4_FC_LOCAL_REJECT_RSVD,
   1808	SLI4_FC_LOCAL_REJECT_RSVD1,
   1809	SLI4_FC_LOCAL_REJECT_NO_ABORT_MATCH,
   1810	SLI4_FC_LOCAL_REJECT_TX_DMA_FAILED,
   1811	SLI4_FC_LOCAL_REJECT_RX_DMA_FAILED,
   1812	SLI4_FC_LOCAL_REJECT_ILLEGAL_FRAME,
   1813	SLI4_FC_LOCAL_REJECT_RSVD2,
   1814	SLI4_FC_LOCAL_REJECT_NO_RESOURCES, //0x11
   1815	SLI4_FC_LOCAL_REJECT_FCP_CONF_FAILURE,
   1816	SLI4_FC_LOCAL_REJECT_ILLEGAL_LENGTH,
   1817	SLI4_FC_LOCAL_REJECT_UNSUPPORTED_FEATURE,
   1818	SLI4_FC_LOCAL_REJECT_ABORT_IN_PROGRESS,
   1819	SLI4_FC_LOCAL_REJECT_ABORT_REQUESTED,
   1820	SLI4_FC_LOCAL_REJECT_RCV_BUFFER_TIMEOUT,
   1821	SLI4_FC_LOCAL_REJECT_LOOP_OPEN_FAILURE,
   1822	SLI4_FC_LOCAL_REJECT_RSVD3,
   1823	SLI4_FC_LOCAL_REJECT_LINK_DOWN,
   1824	SLI4_FC_LOCAL_REJECT_CORRUPTED_DATA,
   1825	SLI4_FC_LOCAL_REJECT_CORRUPTED_RPI,
   1826	SLI4_FC_LOCAL_REJECT_OUTOFORDER_DATA,
   1827	SLI4_FC_LOCAL_REJECT_OUTOFORDER_ACK,
   1828	SLI4_FC_LOCAL_REJECT_DUP_FRAME,
   1829	SLI4_FC_LOCAL_REJECT_LINK_CONTROL_FRAME, //0x20
   1830	SLI4_FC_LOCAL_REJECT_BAD_HOST_ADDRESS,
   1831	SLI4_FC_LOCAL_REJECT_RSVD4,
   1832	SLI4_FC_LOCAL_REJECT_MISSING_HDR_BUFFER,
   1833	SLI4_FC_LOCAL_REJECT_MSEQ_CHAIN_CORRUPTED,
   1834	SLI4_FC_LOCAL_REJECT_ABORTMULT_REQUESTED,
   1835	SLI4_FC_LOCAL_REJECT_BUFFER_SHORTAGE	= 0x28,
   1836	SLI4_FC_LOCAL_REJECT_RCV_XRIBUF_WAITING,
   1837	SLI4_FC_LOCAL_REJECT_INVALID_VPI	= 0x2e,
   1838	SLI4_FC_LOCAL_REJECT_NO_FPORT_DETECTED,
   1839	SLI4_FC_LOCAL_REJECT_MISSING_XRIBUF,
   1840	SLI4_FC_LOCAL_REJECT_RSVD5,
   1841	SLI4_FC_LOCAL_REJECT_INVALID_XRI,
   1842	SLI4_FC_LOCAL_REJECT_INVALID_RELOFFSET	= 0x40,
   1843	SLI4_FC_LOCAL_REJECT_MISSING_RELOFFSET,
   1844	SLI4_FC_LOCAL_REJECT_INSUFF_BUFFERSPACE,
   1845	SLI4_FC_LOCAL_REJECT_MISSING_SI,
   1846	SLI4_FC_LOCAL_REJECT_MISSING_ES,
   1847	SLI4_FC_LOCAL_REJECT_INCOMPLETE_XFER,
   1848	SLI4_FC_LOCAL_REJECT_SLER_FAILURE,
   1849	SLI4_FC_LOCAL_REJECT_SLER_CMD_RCV_FAILURE,
   1850	SLI4_FC_LOCAL_REJECT_SLER_REC_RJT_ERR,
   1851	SLI4_FC_LOCAL_REJECT_SLER_REC_SRR_RETRY_ERR,
   1852	SLI4_FC_LOCAL_REJECT_SLER_SRR_RJT_ERR,
   1853	SLI4_FC_LOCAL_REJECT_RSVD6,
   1854	SLI4_FC_LOCAL_REJECT_SLER_RRQ_RJT_ERR,
   1855	SLI4_FC_LOCAL_REJECT_SLER_RRQ_RETRY_ERR,
   1856	SLI4_FC_LOCAL_REJECT_SLER_ABTS_ERR,
   1857};
   1858
   1859enum sli4_async_rcqe_flags {
   1860	SLI4_RACQE_RQ_EL_INDX	= 0xfff,
   1861	SLI4_RACQE_FCFI		= 0x3f,
   1862	SLI4_RACQE_HDPL		= 0x3f,
   1863	SLI4_RACQE_RQ_ID	= 0xffc0,
   1864};
   1865
   1866struct sli4_fc_async_rcqe {
   1867	u8		rsvd0;
   1868	u8		status;
   1869	__le16		rq_elmt_indx_word;
   1870	__le32		rsvd4;
   1871	__le16		fcfi_rq_id_word;
   1872	__le16		data_placement_length;
   1873	u8		sof_byte;
   1874	u8		eof_byte;
   1875	u8		code;
   1876	u8		hdpl_byte;
   1877};
   1878
   1879struct sli4_fc_async_rcqe_v1 {
   1880	u8		rsvd0;
   1881	u8		status;
   1882	__le16		rq_elmt_indx_word;
   1883	u8		fcfi_byte;
   1884	u8		rsvd5;
   1885	__le16		rsvd6;
   1886	__le16		rq_id;
   1887	__le16		data_placement_length;
   1888	u8		sof_byte;
   1889	u8		eof_byte;
   1890	u8		code;
   1891	u8		hdpl_byte;
   1892};
   1893
   1894enum sli4_fc_async_rq_status {
   1895	SLI4_FC_ASYNC_RQ_SUCCESS = 0x10,
   1896	SLI4_FC_ASYNC_RQ_BUF_LEN_EXCEEDED,
   1897	SLI4_FC_ASYNC_RQ_INSUFF_BUF_NEEDED,
   1898	SLI4_FC_ASYNC_RQ_INSUFF_BUF_FRM_DISC,
   1899	SLI4_FC_ASYNC_RQ_DMA_FAILURE,
   1900};
   1901
   1902#define SLI4_RCQE_RQ_EL_INDX	0xfff
   1903
   1904struct sli4_fc_coalescing_rcqe {
   1905	u8		rsvd0;
   1906	u8		status;
   1907	__le16		rq_elmt_indx_word;
   1908	__le32		rsvd4;
   1909	__le16		rq_id;
   1910	__le16		seq_placement_length;
   1911	__le16		rsvd14;
   1912	u8		code;
   1913	u8		vld_byte;
   1914};
   1915
   1916#define SLI4_FC_COALESCE_RQ_SUCCESS		0x10
   1917#define SLI4_FC_COALESCE_RQ_INSUFF_XRI_NEEDED	0x18
   1918
   1919enum sli4_optimized_write_cmd_cqe_flags {
   1920	SLI4_OCQE_RQ_EL_INDX	= 0x7f,		/* DW0 bits 16:30 */
   1921	SLI4_OCQE_FCFI		= 0x3f,		/* DW1 bits 0:6 */
   1922	SLI4_OCQE_OOX		= 1 << 6,	/* DW1 bit 15 */
   1923	SLI4_OCQE_AGXR		= 1 << 7,	/* DW1 bit 16 */
   1924	SLI4_OCQE_HDPL		= 0x3f,		/* DW3 bits 24:29*/
   1925};
   1926
   1927struct sli4_fc_optimized_write_cmd_cqe {
   1928	u8		rsvd0;
   1929	u8		status;
   1930	__le16		w1;
   1931	u8		flags0;
   1932	u8		flags1;
   1933	__le16		xri;
   1934	__le16		rq_id;
   1935	__le16		data_placement_length;
   1936	__le16		rpi;
   1937	u8		code;
   1938	u8		hdpl_vld;
   1939};
   1940
   1941#define	SLI4_OCQE_XB		0x10
   1942
   1943struct sli4_fc_optimized_write_data_cqe {
   1944	u8		hw_status;
   1945	u8		status;
   1946	__le16		xri;
   1947	__le32		total_data_placed;
   1948	__le32		extended_status;
   1949	__le16		rsvd12;
   1950	u8		code;
   1951	u8		flags;
   1952};
   1953
   1954struct sli4_fc_xri_aborted_cqe {
   1955	u8		rsvd0;
   1956	u8		status;
   1957	__le16		rsvd2;
   1958	__le32		extended_status;
   1959	__le16		xri;
   1960	__le16		remote_xid;
   1961	__le16		rsvd12;
   1962	u8		code;
   1963	u8		flags;
   1964};
   1965
   1966enum sli4_generic_ctx {
   1967	SLI4_GENERIC_CONTEXT_RPI,
   1968	SLI4_GENERIC_CONTEXT_VPI,
   1969	SLI4_GENERIC_CONTEXT_VFI,
   1970	SLI4_GENERIC_CONTEXT_FCFI,
   1971};
   1972
   1973#define SLI4_GENERIC_CLASS_CLASS_2		0x1
   1974#define SLI4_GENERIC_CLASS_CLASS_3		0x2
   1975
   1976#define SLI4_ELS_REQUEST64_DIR_WRITE		0x0
   1977#define SLI4_ELS_REQUEST64_DIR_READ		0x1
   1978
   1979enum sli4_els_request {
   1980	SLI4_ELS_REQUEST64_OTHER,
   1981	SLI4_ELS_REQUEST64_LOGO,
   1982	SLI4_ELS_REQUEST64_FDISC,
   1983	SLI4_ELS_REQUEST64_FLOGIN,
   1984	SLI4_ELS_REQUEST64_PLOGI,
   1985};
   1986
   1987enum sli4_els_cmd_type {
   1988	SLI4_ELS_REQUEST64_CMD_GEN		= 0x08,
   1989	SLI4_ELS_REQUEST64_CMD_NON_FABRIC	= 0x0c,
   1990	SLI4_ELS_REQUEST64_CMD_FABRIC		= 0x0d,
   1991};
   1992
   1993#define SLI_PAGE_SIZE				SZ_4K
   1994
   1995#define SLI4_BMBX_TIMEOUT_MSEC			30000
   1996#define SLI4_FW_READY_TIMEOUT_MSEC		30000
   1997
   1998#define SLI4_BMBX_DELAY_US			1000	/* 1 ms */
   1999#define SLI4_INIT_PORT_DELAY_US			10000	/* 10 ms */
   2000
   2001static inline u32
   2002sli_page_count(size_t bytes, u32 page_size)
   2003{
   2004	if (!page_size)
   2005		return 0;
   2006
   2007	return (bytes + (page_size - 1)) >> __ffs(page_size);
   2008}
   2009
   2010/*************************************************************************
   2011 * SLI-4 mailbox command formats and definitions
   2012 */
   2013
   2014struct sli4_mbox_command_header {
   2015	u8	resvd0;
   2016	u8	command;
   2017	__le16	status;	/* Port writes to indicate success/fail */
   2018};
   2019
   2020enum sli4_mbx_cmd_value {
   2021	SLI4_MBX_CMD_CONFIG_LINK	= 0x07,
   2022	SLI4_MBX_CMD_DUMP		= 0x17,
   2023	SLI4_MBX_CMD_DOWN_LINK		= 0x06,
   2024	SLI4_MBX_CMD_INIT_LINK		= 0x05,
   2025	SLI4_MBX_CMD_INIT_VFI		= 0xa3,
   2026	SLI4_MBX_CMD_INIT_VPI		= 0xa4,
   2027	SLI4_MBX_CMD_POST_XRI		= 0xa7,
   2028	SLI4_MBX_CMD_RELEASE_XRI	= 0xac,
   2029	SLI4_MBX_CMD_READ_CONFIG	= 0x0b,
   2030	SLI4_MBX_CMD_READ_STATUS	= 0x0e,
   2031	SLI4_MBX_CMD_READ_NVPARMS	= 0x02,
   2032	SLI4_MBX_CMD_READ_REV		= 0x11,
   2033	SLI4_MBX_CMD_READ_LNK_STAT	= 0x12,
   2034	SLI4_MBX_CMD_READ_SPARM64	= 0x8d,
   2035	SLI4_MBX_CMD_READ_TOPOLOGY	= 0x95,
   2036	SLI4_MBX_CMD_REG_FCFI		= 0xa0,
   2037	SLI4_MBX_CMD_REG_FCFI_MRQ	= 0xaf,
   2038	SLI4_MBX_CMD_REG_RPI		= 0x93,
   2039	SLI4_MBX_CMD_REG_RX_RQ		= 0xa6,
   2040	SLI4_MBX_CMD_REG_VFI		= 0x9f,
   2041	SLI4_MBX_CMD_REG_VPI		= 0x96,
   2042	SLI4_MBX_CMD_RQST_FEATURES	= 0x9d,
   2043	SLI4_MBX_CMD_SLI_CONFIG		= 0x9b,
   2044	SLI4_MBX_CMD_UNREG_FCFI		= 0xa2,
   2045	SLI4_MBX_CMD_UNREG_RPI		= 0x14,
   2046	SLI4_MBX_CMD_UNREG_VFI		= 0xa1,
   2047	SLI4_MBX_CMD_UNREG_VPI		= 0x97,
   2048	SLI4_MBX_CMD_WRITE_NVPARMS	= 0x03,
   2049	SLI4_MBX_CMD_CFG_AUTO_XFER_RDY	= 0xad,
   2050};
   2051
   2052enum sli4_mbx_status {
   2053	SLI4_MBX_STATUS_SUCCESS		= 0x0000,
   2054	SLI4_MBX_STATUS_FAILURE		= 0x0001,
   2055	SLI4_MBX_STATUS_RPI_NOT_REG	= 0x1400,
   2056};
   2057
   2058/* CONFIG_LINK - configure link-oriented parameters,
   2059 * such as default N_Port_ID address and various timers
   2060 */
   2061enum sli4_cmd_config_link_flags {
   2062	SLI4_CFG_LINK_BBSCN = 0xf00,
   2063	SLI4_CFG_LINK_CSCN  = 0x1000,
   2064};
   2065
   2066struct sli4_cmd_config_link {
   2067	struct sli4_mbox_command_header	hdr;
   2068	u8		maxbbc;
   2069	u8		rsvd5;
   2070	u8		rsvd6;
   2071	u8		rsvd7;
   2072	u8		alpa;
   2073	__le16		n_port_id;
   2074	u8		rsvd11;
   2075	__le32		rsvd12;
   2076	__le32		e_d_tov;
   2077	__le32		lp_tov;
   2078	__le32		r_a_tov;
   2079	__le32		r_t_tov;
   2080	__le32		al_tov;
   2081	__le32		rsvd36;
   2082	__le32		bbscn_dword;
   2083};
   2084
   2085#define SLI4_DUMP4_TYPE		0xf
   2086
   2087#define SLI4_WKI_TAG_SAT_TEM	0x1040
   2088
   2089struct sli4_cmd_dump4 {
   2090	struct sli4_mbox_command_header	hdr;
   2091	__le32		type_dword;
   2092	__le16		wki_selection;
   2093	__le16		rsvd10;
   2094	__le32		rsvd12;
   2095	__le32		returned_byte_cnt;
   2096	__le32		resp_data[59];
   2097};
   2098
   2099/* INIT_LINK - initialize the link for a FC port */
   2100enum sli4_init_link_flags {
   2101	SLI4_INIT_LINK_F_LOOPBACK	= 1 << 0,
   2102
   2103	SLI4_INIT_LINK_F_P2P_ONLY	= 1 << 1,
   2104	SLI4_INIT_LINK_F_FCAL_ONLY	= 2 << 1,
   2105	SLI4_INIT_LINK_F_FCAL_FAIL_OVER	= 0 << 1,
   2106	SLI4_INIT_LINK_F_P2P_FAIL_OVER	= 1 << 1,
   2107
   2108	SLI4_INIT_LINK_F_UNFAIR		= 1 << 6,
   2109	SLI4_INIT_LINK_F_NO_LIRP	= 1 << 7,
   2110	SLI4_INIT_LINK_F_LOOP_VALID_CHK	= 1 << 8,
   2111	SLI4_INIT_LINK_F_NO_LISA	= 1 << 9,
   2112	SLI4_INIT_LINK_F_FAIL_OVER	= 1 << 10,
   2113	SLI4_INIT_LINK_F_FIXED_SPEED	= 1 << 11,
   2114	SLI4_INIT_LINK_F_PICK_HI_ALPA	= 1 << 15,
   2115
   2116};
   2117
   2118enum sli4_fc_link_speed {
   2119	SLI4_LINK_SPEED_1G = 1,
   2120	SLI4_LINK_SPEED_2G,
   2121	SLI4_LINK_SPEED_AUTO_1_2,
   2122	SLI4_LINK_SPEED_4G,
   2123	SLI4_LINK_SPEED_AUTO_4_1,
   2124	SLI4_LINK_SPEED_AUTO_4_2,
   2125	SLI4_LINK_SPEED_AUTO_4_2_1,
   2126	SLI4_LINK_SPEED_8G,
   2127	SLI4_LINK_SPEED_AUTO_8_1,
   2128	SLI4_LINK_SPEED_AUTO_8_2,
   2129	SLI4_LINK_SPEED_AUTO_8_2_1,
   2130	SLI4_LINK_SPEED_AUTO_8_4,
   2131	SLI4_LINK_SPEED_AUTO_8_4_1,
   2132	SLI4_LINK_SPEED_AUTO_8_4_2,
   2133	SLI4_LINK_SPEED_10G,
   2134	SLI4_LINK_SPEED_16G,
   2135	SLI4_LINK_SPEED_AUTO_16_8_4,
   2136	SLI4_LINK_SPEED_AUTO_16_8,
   2137	SLI4_LINK_SPEED_32G,
   2138	SLI4_LINK_SPEED_AUTO_32_16_8,
   2139	SLI4_LINK_SPEED_AUTO_32_16,
   2140	SLI4_LINK_SPEED_64G,
   2141	SLI4_LINK_SPEED_AUTO_64_32_16,
   2142	SLI4_LINK_SPEED_AUTO_64_32,
   2143	SLI4_LINK_SPEED_128G,
   2144	SLI4_LINK_SPEED_AUTO_128_64_32,
   2145	SLI4_LINK_SPEED_AUTO_128_64,
   2146};
   2147
   2148struct sli4_cmd_init_link {
   2149	struct sli4_mbox_command_header       hdr;
   2150	__le32	sel_reset_al_pa_dword;
   2151	__le32	flags0;
   2152	__le32	link_speed_sel_code;
   2153};
   2154
   2155/* INIT_VFI - initialize the VFI resource */
   2156enum sli4_init_vfi_flags {
   2157	SLI4_INIT_VFI_FLAG_VP	= 0x1000,
   2158	SLI4_INIT_VFI_FLAG_VF	= 0x2000,
   2159	SLI4_INIT_VFI_FLAG_VT	= 0x4000,
   2160	SLI4_INIT_VFI_FLAG_VR	= 0x8000,
   2161
   2162	SLI4_INIT_VFI_VFID	= 0x1fff,
   2163	SLI4_INIT_VFI_PRI	= 0xe000,
   2164
   2165	SLI4_INIT_VFI_HOP_COUNT = 0xff000000,
   2166};
   2167
   2168struct sli4_cmd_init_vfi {
   2169	struct sli4_mbox_command_header	hdr;
   2170	__le16		vfi;
   2171	__le16		flags0_word;
   2172	__le16		fcfi;
   2173	__le16		vpi;
   2174	__le32		vf_id_pri_dword;
   2175	__le32		hop_cnt_dword;
   2176};
   2177
   2178/* INIT_VPI - initialize the VPI resource */
   2179struct sli4_cmd_init_vpi {
   2180	struct sli4_mbox_command_header	hdr;
   2181	__le16		vpi;
   2182	__le16		vfi;
   2183};
   2184
   2185/* POST_XRI - post XRI resources to the SLI Port */
   2186enum sli4_post_xri_flags {
   2187	SLI4_POST_XRI_COUNT	= 0xfff,
   2188	SLI4_POST_XRI_FLAG_ENX	= 0x1000,
   2189	SLI4_POST_XRI_FLAG_DL	= 0x2000,
   2190	SLI4_POST_XRI_FLAG_DI	= 0x4000,
   2191	SLI4_POST_XRI_FLAG_VAL	= 0x8000,
   2192};
   2193
   2194struct sli4_cmd_post_xri {
   2195	struct sli4_mbox_command_header	hdr;
   2196	__le16		xri_base;
   2197	__le16		xri_count_flags;
   2198};
   2199
   2200/* RELEASE_XRI - Release XRI resources from the SLI Port */
   2201enum sli4_release_xri_flags {
   2202	SLI4_RELEASE_XRI_REL_XRI_CNT	= 0x1f,
   2203	SLI4_RELEASE_XRI_COUNT		= 0x1f,
   2204};
   2205
   2206struct sli4_cmd_release_xri {
   2207	struct sli4_mbox_command_header	hdr;
   2208	__le16		rel_xri_count_word;
   2209	__le16		xri_count_word;
   2210
   2211	struct {
   2212		__le16	xri_tag0;
   2213		__le16	xri_tag1;
   2214	} xri_tbl[62];
   2215};
   2216
   2217/* READ_CONFIG - read SLI port configuration parameters */
   2218struct sli4_cmd_read_config {
   2219	struct sli4_mbox_command_header	hdr;
   2220};
   2221
   2222enum sli4_read_cfg_resp_flags {
   2223	SLI4_READ_CFG_RESP_RESOURCE_EXT = 0x80000000,	/* DW1 */
   2224	SLI4_READ_CFG_RESP_TOPOLOGY	= 0xff000000,	/* DW2 */
   2225};
   2226
   2227enum sli4_read_cfg_topo {
   2228	SLI4_READ_CFG_TOPO_FC		= 0x1,	/* FC topology unknown */
   2229	SLI4_READ_CFG_TOPO_NON_FC_AL	= 0x2,	/* FC point-to-point or fabric */
   2230	SLI4_READ_CFG_TOPO_FC_AL	= 0x3,	/* FC-AL topology */
   2231};
   2232
   2233/* Link Module Type */
   2234enum sli4_read_cfg_lmt {
   2235	SLI4_LINK_MODULE_TYPE_1GB	= 0x0004,
   2236	SLI4_LINK_MODULE_TYPE_2GB	= 0x0008,
   2237	SLI4_LINK_MODULE_TYPE_4GB	= 0x0040,
   2238	SLI4_LINK_MODULE_TYPE_8GB	= 0x0080,
   2239	SLI4_LINK_MODULE_TYPE_16GB	= 0x0200,
   2240	SLI4_LINK_MODULE_TYPE_32GB	= 0x0400,
   2241	SLI4_LINK_MODULE_TYPE_64GB	= 0x0800,
   2242	SLI4_LINK_MODULE_TYPE_128GB	= 0x1000,
   2243};
   2244
   2245struct sli4_rsp_read_config {
   2246	struct sli4_mbox_command_header	hdr;
   2247	__le32		ext_dword;
   2248	__le32		topology_dword;
   2249	__le32		resvd8;
   2250	__le16		e_d_tov;
   2251	__le16		resvd14;
   2252	__le32		resvd16;
   2253	__le16		r_a_tov;
   2254	__le16		resvd22;
   2255	__le32		resvd24;
   2256	__le32		resvd28;
   2257	__le16		lmt;
   2258	__le16		resvd34;
   2259	__le32		resvd36;
   2260	__le32		resvd40;
   2261	__le16		xri_base;
   2262	__le16		xri_count;
   2263	__le16		rpi_base;
   2264	__le16		rpi_count;
   2265	__le16		vpi_base;
   2266	__le16		vpi_count;
   2267	__le16		vfi_base;
   2268	__le16		vfi_count;
   2269	__le16		resvd60;
   2270	__le16		fcfi_count;
   2271	__le16		rq_count;
   2272	__le16		eq_count;
   2273	__le16		wq_count;
   2274	__le16		cq_count;
   2275	__le32		pad[45];
   2276};
   2277
   2278/* READ_NVPARMS - read SLI port configuration parameters */
   2279enum sli4_read_nvparms_flags {
   2280	SLI4_READ_NVPARAMS_HARD_ALPA	  = 0xff,
   2281	SLI4_READ_NVPARAMS_PREFERRED_D_ID = 0xffffff00,
   2282};
   2283
   2284struct sli4_cmd_read_nvparms {
   2285	struct sli4_mbox_command_header	hdr;
   2286	__le32		resvd0;
   2287	__le32		resvd4;
   2288	__le32		resvd8;
   2289	__le32		resvd12;
   2290	u8		wwpn[8];
   2291	u8		wwnn[8];
   2292	__le32		hard_alpa_d_id;
   2293};
   2294
   2295/* WRITE_NVPARMS - write SLI port configuration parameters */
   2296struct sli4_cmd_write_nvparms {
   2297	struct sli4_mbox_command_header	hdr;
   2298	__le32		resvd0;
   2299	__le32		resvd4;
   2300	__le32		resvd8;
   2301	__le32		resvd12;
   2302	u8		wwpn[8];
   2303	u8		wwnn[8];
   2304	__le32		hard_alpa_d_id;
   2305};
   2306
   2307/* READ_REV - read the Port revision levels */
   2308enum {
   2309	SLI4_READ_REV_FLAG_SLI_LEVEL	= 0xf,
   2310	SLI4_READ_REV_FLAG_FCOEM	= 0x10,
   2311	SLI4_READ_REV_FLAG_CEEV		= 0x60,
   2312	SLI4_READ_REV_FLAG_VPD		= 0x2000,
   2313
   2314	SLI4_READ_REV_AVAILABLE_LENGTH	= 0xffffff,
   2315};
   2316
   2317struct sli4_cmd_read_rev {
   2318	struct sli4_mbox_command_header	hdr;
   2319	__le16			resvd0;
   2320	__le16			flags0_word;
   2321	__le32			first_hw_rev;
   2322	__le32			second_hw_rev;
   2323	__le32			resvd12;
   2324	__le32			third_hw_rev;
   2325	u8			fc_ph_low;
   2326	u8			fc_ph_high;
   2327	u8			feature_level_low;
   2328	u8			feature_level_high;
   2329	__le32			resvd24;
   2330	__le32			first_fw_id;
   2331	u8			first_fw_name[16];
   2332	__le32			second_fw_id;
   2333	u8			second_fw_name[16];
   2334	__le32			rsvd18[30];
   2335	__le32			available_length_dword;
   2336	struct sli4_dmaaddr	hostbuf;
   2337	__le32			returned_vpd_length;
   2338	__le32			actual_vpd_length;
   2339};
   2340
   2341/* READ_SPARM64 - read the Port service parameters */
   2342#define SLI4_READ_SPARM64_WWPN_OFFSET	(4 * sizeof(u32))
   2343#define SLI4_READ_SPARM64_WWNN_OFFSET	(6 * sizeof(u32))
   2344
   2345struct sli4_cmd_read_sparm64 {
   2346	struct sli4_mbox_command_header hdr;
   2347	__le32			resvd0;
   2348	__le32			resvd4;
   2349	struct sli4_bde		bde_64;
   2350	__le16			vpi;
   2351	__le16			resvd22;
   2352	__le16			port_name_start;
   2353	__le16			port_name_len;
   2354	__le16			node_name_start;
   2355	__le16			node_name_len;
   2356};
   2357
   2358/* READ_TOPOLOGY - read the link event information */
   2359enum sli4_read_topo_e {
   2360	SLI4_READTOPO_ATTEN_TYPE	= 0xff,
   2361	SLI4_READTOPO_FLAG_IL		= 0x100,
   2362	SLI4_READTOPO_FLAG_PB_RECVD	= 0x200,
   2363
   2364	SLI4_READTOPO_LINKSTATE_RECV	= 0x3,
   2365	SLI4_READTOPO_LINKSTATE_TRANS	= 0xc,
   2366	SLI4_READTOPO_LINKSTATE_MACHINE	= 0xf0,
   2367	SLI4_READTOPO_LINKSTATE_SPEED	= 0xff00,
   2368	SLI4_READTOPO_LINKSTATE_TF	= 0x40000000,
   2369	SLI4_READTOPO_LINKSTATE_LU	= 0x80000000,
   2370
   2371	SLI4_READTOPO_SCN_BBSCN		= 0xf,
   2372	SLI4_READTOPO_SCN_CBBSCN	= 0xf0,
   2373
   2374	SLI4_READTOPO_R_T_TOV		= 0x1ff,
   2375	SLI4_READTOPO_AL_TOV		= 0xf000,
   2376
   2377	SLI4_READTOPO_PB_FLAG		= 0x80,
   2378
   2379	SLI4_READTOPO_INIT_N_PORTID	= 0xffffff,
   2380};
   2381
   2382#define SLI4_MIN_LOOP_MAP_BYTES	128
   2383
   2384struct sli4_cmd_read_topology {
   2385	struct sli4_mbox_command_header	hdr;
   2386	__le32			event_tag;
   2387	__le32			dw2_attentype;
   2388	u8			topology;
   2389	u8			lip_type;
   2390	u8			lip_al_ps;
   2391	u8			al_pa_granted;
   2392	struct sli4_bde		bde_loop_map;
   2393	__le32			linkdown_state;
   2394	__le32			currlink_state;
   2395	u8			max_bbc;
   2396	u8			init_bbc;
   2397	u8			scn_flags;
   2398	u8			rsvd39;
   2399	__le16			dw10w0_al_rt_tov;
   2400	__le16			lp_tov;
   2401	u8			acquired_al_pa;
   2402	u8			pb_flags;
   2403	__le16			specified_al_pa;
   2404	__le32			dw12_init_n_port_id;
   2405};
   2406
   2407enum sli4_read_topo_link {
   2408	SLI4_READ_TOPOLOGY_LINK_UP	= 0x1,
   2409	SLI4_READ_TOPOLOGY_LINK_DOWN,
   2410	SLI4_READ_TOPOLOGY_LINK_NO_ALPA,
   2411};
   2412
   2413enum sli4_read_topo {
   2414	SLI4_READ_TOPO_UNKNOWN		= 0x0,
   2415	SLI4_READ_TOPO_NON_FC_AL,
   2416	SLI4_READ_TOPO_FC_AL,
   2417};
   2418
   2419enum sli4_read_topo_speed {
   2420	SLI4_READ_TOPOLOGY_SPEED_NONE	= 0x00,
   2421	SLI4_READ_TOPOLOGY_SPEED_1G	= 0x04,
   2422	SLI4_READ_TOPOLOGY_SPEED_2G	= 0x08,
   2423	SLI4_READ_TOPOLOGY_SPEED_4G	= 0x10,
   2424	SLI4_READ_TOPOLOGY_SPEED_8G	= 0x20,
   2425	SLI4_READ_TOPOLOGY_SPEED_10G	= 0x40,
   2426	SLI4_READ_TOPOLOGY_SPEED_16G	= 0x80,
   2427	SLI4_READ_TOPOLOGY_SPEED_32G	= 0x90,
   2428	SLI4_READ_TOPOLOGY_SPEED_64G	= 0xa0,
   2429	SLI4_READ_TOPOLOGY_SPEED_128G	= 0xb0,
   2430};
   2431
   2432/* REG_FCFI - activate a FC Forwarder */
   2433struct sli4_cmd_reg_fcfi_rq_cfg {
   2434	u8	r_ctl_mask;
   2435	u8	r_ctl_match;
   2436	u8	type_mask;
   2437	u8	type_match;
   2438};
   2439
   2440enum sli4_regfcfi_tag {
   2441	SLI4_REGFCFI_VLAN_TAG		= 0xfff,
   2442	SLI4_REGFCFI_VLANTAG_VALID	= 0x1000,
   2443};
   2444
   2445#define SLI4_CMD_REG_FCFI_NUM_RQ_CFG	4
   2446struct sli4_cmd_reg_fcfi {
   2447	struct sli4_mbox_command_header	hdr;
   2448	__le16		fcf_index;
   2449	__le16		fcfi;
   2450	__le16		rqid1;
   2451	__le16		rqid0;
   2452	__le16		rqid3;
   2453	__le16		rqid2;
   2454	struct sli4_cmd_reg_fcfi_rq_cfg
   2455			rq_cfg[SLI4_CMD_REG_FCFI_NUM_RQ_CFG];
   2456	__le32		dw8_vlan;
   2457};
   2458
   2459#define SLI4_CMD_REG_FCFI_MRQ_NUM_RQ_CFG	4
   2460#define SLI4_CMD_REG_FCFI_MRQ_MAX_NUM_RQ	32
   2461#define SLI4_CMD_REG_FCFI_SET_FCFI_MODE		0
   2462#define SLI4_CMD_REG_FCFI_SET_MRQ_MODE		1
   2463
   2464enum sli4_reg_fcfi_mrq {
   2465	SLI4_REGFCFI_MRQ_VLAN_TAG	= 0xfff,
   2466	SLI4_REGFCFI_MRQ_VLANTAG_VALID	= 0x1000,
   2467	SLI4_REGFCFI_MRQ_MODE		= 0x2000,
   2468
   2469	SLI4_REGFCFI_MRQ_MASK_NUM_PAIRS	= 0xff,
   2470	SLI4_REGFCFI_MRQ_FILTER_BITMASK = 0xf00,
   2471	SLI4_REGFCFI_MRQ_RQ_SEL_POLICY	= 0xf000,
   2472};
   2473
   2474struct sli4_cmd_reg_fcfi_mrq {
   2475	struct sli4_mbox_command_header	hdr;
   2476	__le16		fcf_index;
   2477	__le16		fcfi;
   2478	__le16		rqid1;
   2479	__le16		rqid0;
   2480	__le16		rqid3;
   2481	__le16		rqid2;
   2482	struct sli4_cmd_reg_fcfi_rq_cfg
   2483			rq_cfg[SLI4_CMD_REG_FCFI_MRQ_NUM_RQ_CFG];
   2484	__le32		dw8_vlan;
   2485	__le32		dw9_mrqflags;
   2486};
   2487
   2488struct sli4_cmd_rq_cfg {
   2489	__le16	rq_id;
   2490	u8	r_ctl_mask;
   2491	u8	r_ctl_match;
   2492	u8	type_mask;
   2493	u8	type_match;
   2494};
   2495
   2496/* REG_RPI - register a Remote Port Indicator */
   2497enum sli4_reg_rpi {
   2498	SLI4_REGRPI_REMOTE_N_PORTID	= 0xffffff,	/* DW2 */
   2499	SLI4_REGRPI_UPD			= 0x1000000,
   2500	SLI4_REGRPI_ETOW		= 0x8000000,
   2501	SLI4_REGRPI_TERP		= 0x20000000,
   2502	SLI4_REGRPI_CI			= 0x80000000,
   2503};
   2504
   2505struct sli4_cmd_reg_rpi {
   2506	struct sli4_mbox_command_header	hdr;
   2507	__le16			rpi;
   2508	__le16			rsvd2;
   2509	__le32			dw2_rportid_flags;
   2510	struct sli4_bde		bde_64;
   2511	__le16			vpi;
   2512	__le16			rsvd26;
   2513};
   2514
   2515#define SLI4_REG_RPI_BUF_LEN		0x70
   2516
   2517/* REG_VFI - register a Virtual Fabric Indicator */
   2518enum sli_reg_vfi {
   2519	SLI4_REGVFI_VP			= 0x1000,	/* DW1 */
   2520	SLI4_REGVFI_UPD			= 0x2000,
   2521
   2522	SLI4_REGVFI_LOCAL_N_PORTID	= 0xffffff,	/* DW10 */
   2523};
   2524
   2525struct sli4_cmd_reg_vfi {
   2526	struct sli4_mbox_command_header	hdr;
   2527	__le16			vfi;
   2528	__le16			dw0w1_flags;
   2529	__le16			fcfi;
   2530	__le16			vpi;
   2531	u8			wwpn[8];
   2532	struct sli4_bde		sparm;
   2533	__le32			e_d_tov;
   2534	__le32			r_a_tov;
   2535	__le32			dw10_lportid_flags;
   2536};
   2537
   2538/* REG_VPI - register a Virtual Port Indicator */
   2539enum sli4_reg_vpi {
   2540	SLI4_REGVPI_LOCAL_N_PORTID	= 0xffffff,
   2541	SLI4_REGVPI_UPD			= 0x1000000,
   2542};
   2543
   2544struct sli4_cmd_reg_vpi {
   2545	struct sli4_mbox_command_header	hdr;
   2546	__le32		rsvd0;
   2547	__le32		dw2_lportid_flags;
   2548	u8		wwpn[8];
   2549	__le32		rsvd12;
   2550	__le16		vpi;
   2551	__le16		vfi;
   2552};
   2553
   2554/* REQUEST_FEATURES - request / query SLI features */
   2555enum sli4_req_features_flags {
   2556	SLI4_REQFEAT_QRY	= 0x1,		/* Dw1 */
   2557
   2558	SLI4_REQFEAT_IAAB	= 1 << 0,	/* DW2 & DW3 */
   2559	SLI4_REQFEAT_NPIV	= 1 << 1,
   2560	SLI4_REQFEAT_DIF	= 1 << 2,
   2561	SLI4_REQFEAT_VF		= 1 << 3,
   2562	SLI4_REQFEAT_FCPI	= 1 << 4,
   2563	SLI4_REQFEAT_FCPT	= 1 << 5,
   2564	SLI4_REQFEAT_FCPC	= 1 << 6,
   2565	SLI4_REQFEAT_RSVD	= 1 << 7,
   2566	SLI4_REQFEAT_RQD	= 1 << 8,
   2567	SLI4_REQFEAT_IAAR	= 1 << 9,
   2568	SLI4_REQFEAT_HLM	= 1 << 10,
   2569	SLI4_REQFEAT_PERFH	= 1 << 11,
   2570	SLI4_REQFEAT_RXSEQ	= 1 << 12,
   2571	SLI4_REQFEAT_RXRI	= 1 << 13,
   2572	SLI4_REQFEAT_DCL2	= 1 << 14,
   2573	SLI4_REQFEAT_RSCO	= 1 << 15,
   2574	SLI4_REQFEAT_MRQP	= 1 << 16,
   2575};
   2576
   2577struct sli4_cmd_request_features {
   2578	struct sli4_mbox_command_header	hdr;
   2579	__le32		dw1_qry;
   2580	__le32		cmd;
   2581	__le32		resp;
   2582};
   2583
   2584/*
   2585 * SLI_CONFIG - submit a configuration command to Port
   2586 *
   2587 * Command is either embedded as part of the payload (embed) or located
   2588 * in a separate memory buffer (mem)
   2589 */
   2590enum sli4_sli_config {
   2591	SLI4_SLICONF_EMB		= 0x1,		/* DW1 */
   2592	SLI4_SLICONF_PMDCMD_SHIFT	= 3,
   2593	SLI4_SLICONF_PMDCMD_MASK	= 0xf8,
   2594	SLI4_SLICONF_PMDCMD_VAL_1	= 8,
   2595	SLI4_SLICONF_PMDCNT		= 0xf8,
   2596
   2597	SLI4_SLICONF_PMD_LEN		= 0x00ffffff,
   2598};
   2599
   2600struct sli4_cmd_sli_config {
   2601	struct sli4_mbox_command_header	hdr;
   2602	__le32		dw1_flags;
   2603	__le32		payload_len;
   2604	__le32		rsvd12[3];
   2605	union {
   2606		u8 embed[58 * sizeof(u32)];
   2607		struct sli4_bufptr mem;
   2608	} payload;
   2609};
   2610
   2611/* READ_STATUS - read tx/rx status of a particular port */
   2612#define SLI4_READSTATUS_CLEAR_COUNTERS	0x1
   2613
   2614struct sli4_cmd_read_status {
   2615	struct sli4_mbox_command_header	hdr;
   2616	__le32		dw1_flags;
   2617	__le32		rsvd4;
   2618	__le32		trans_kbyte_cnt;
   2619	__le32		recv_kbyte_cnt;
   2620	__le32		trans_frame_cnt;
   2621	__le32		recv_frame_cnt;
   2622	__le32		trans_seq_cnt;
   2623	__le32		recv_seq_cnt;
   2624	__le32		tot_exchanges_orig;
   2625	__le32		tot_exchanges_resp;
   2626	__le32		recv_p_bsy_cnt;
   2627	__le32		recv_f_bsy_cnt;
   2628	__le32		no_rq_buf_dropped_frames_cnt;
   2629	__le32		empty_rq_timeout_cnt;
   2630	__le32		no_xri_dropped_frames_cnt;
   2631	__le32		empty_xri_pool_cnt;
   2632};
   2633
   2634/* READ_LNK_STAT - read link status of a particular port */
   2635enum sli4_read_link_stats_flags {
   2636	SLI4_READ_LNKSTAT_REC	= 1u << 0,
   2637	SLI4_READ_LNKSTAT_GEC	= 1u << 1,
   2638	SLI4_READ_LNKSTAT_W02OF	= 1u << 2,
   2639	SLI4_READ_LNKSTAT_W03OF	= 1u << 3,
   2640	SLI4_READ_LNKSTAT_W04OF	= 1u << 4,
   2641	SLI4_READ_LNKSTAT_W05OF	= 1u << 5,
   2642	SLI4_READ_LNKSTAT_W06OF	= 1u << 6,
   2643	SLI4_READ_LNKSTAT_W07OF	= 1u << 7,
   2644	SLI4_READ_LNKSTAT_W08OF	= 1u << 8,
   2645	SLI4_READ_LNKSTAT_W09OF	= 1u << 9,
   2646	SLI4_READ_LNKSTAT_W10OF = 1u << 10,
   2647	SLI4_READ_LNKSTAT_W11OF = 1u << 11,
   2648	SLI4_READ_LNKSTAT_W12OF	= 1u << 12,
   2649	SLI4_READ_LNKSTAT_W13OF	= 1u << 13,
   2650	SLI4_READ_LNKSTAT_W14OF	= 1u << 14,
   2651	SLI4_READ_LNKSTAT_W15OF	= 1u << 15,
   2652	SLI4_READ_LNKSTAT_W16OF	= 1u << 16,
   2653	SLI4_READ_LNKSTAT_W17OF	= 1u << 17,
   2654	SLI4_READ_LNKSTAT_W18OF	= 1u << 18,
   2655	SLI4_READ_LNKSTAT_W19OF	= 1u << 19,
   2656	SLI4_READ_LNKSTAT_W20OF	= 1u << 20,
   2657	SLI4_READ_LNKSTAT_W21OF	= 1u << 21,
   2658	SLI4_READ_LNKSTAT_CLRC	= 1u << 30,
   2659	SLI4_READ_LNKSTAT_CLOF	= 1u << 31,
   2660};
   2661
   2662struct sli4_cmd_read_link_stats {
   2663	struct sli4_mbox_command_header	hdr;
   2664	__le32	dw1_flags;
   2665	__le32	linkfail_errcnt;
   2666	__le32	losssync_errcnt;
   2667	__le32	losssignal_errcnt;
   2668	__le32	primseq_errcnt;
   2669	__le32	inval_txword_errcnt;
   2670	__le32	crc_errcnt;
   2671	__le32	primseq_eventtimeout_cnt;
   2672	__le32	elastic_bufoverrun_errcnt;
   2673	__le32	arbit_fc_al_timeout_cnt;
   2674	__le32	adv_rx_buftor_to_buf_credit;
   2675	__le32	curr_rx_buf_to_buf_credit;
   2676	__le32	adv_tx_buf_to_buf_credit;
   2677	__le32	curr_tx_buf_to_buf_credit;
   2678	__le32	rx_eofa_cnt;
   2679	__le32	rx_eofdti_cnt;
   2680	__le32	rx_eofni_cnt;
   2681	__le32	rx_soff_cnt;
   2682	__le32	rx_dropped_no_aer_cnt;
   2683	__le32	rx_dropped_no_avail_rpi_rescnt;
   2684	__le32	rx_dropped_no_avail_xri_rescnt;
   2685};
   2686
   2687/* Format a WQE with WQ_ID Association performance hint */
   2688static inline void
   2689sli_set_wq_id_association(void *entry, u16 q_id)
   2690{
   2691	u32 *wqe = entry;
   2692
   2693	/*
   2694	 * Set Word 10, bit 0 to zero
   2695	 * Set Word 10, bits 15:1 to the WQ ID
   2696	 */
   2697	wqe[10] &= ~0xffff;
   2698	wqe[10] |= q_id << 1;
   2699}
   2700
   2701/* UNREG_FCFI - unregister a FCFI */
   2702struct sli4_cmd_unreg_fcfi {
   2703	struct sli4_mbox_command_header	hdr;
   2704	__le32		rsvd0;
   2705	__le16		fcfi;
   2706	__le16		rsvd6;
   2707};
   2708
   2709/* UNREG_RPI - unregister one or more RPI */
   2710enum sli4_unreg_rpi {
   2711	SLI4_UNREG_RPI_DP	= 0x2000,
   2712	SLI4_UNREG_RPI_II_SHIFT	= 14,
   2713	SLI4_UNREG_RPI_II_MASK	= 0xc000,
   2714	SLI4_UNREG_RPI_II_RPI	= 0x0000,
   2715	SLI4_UNREG_RPI_II_VPI	= 0x4000,
   2716	SLI4_UNREG_RPI_II_VFI	= 0x8000,
   2717	SLI4_UNREG_RPI_II_FCFI	= 0xc000,
   2718
   2719	SLI4_UNREG_RPI_DEST_N_PORTID_MASK = 0x00ffffff,
   2720};
   2721
   2722struct sli4_cmd_unreg_rpi {
   2723	struct sli4_mbox_command_header	hdr;
   2724	__le16		index;
   2725	__le16		dw1w1_flags;
   2726	__le32		dw2_dest_n_portid;
   2727};
   2728
   2729/* UNREG_VFI - unregister one or more VFI */
   2730enum sli4_unreg_vfi {
   2731	SLI4_UNREG_VFI_II_SHIFT	= 14,
   2732	SLI4_UNREG_VFI_II_MASK	= 0xc000,
   2733	SLI4_UNREG_VFI_II_VFI	= 0x0000,
   2734	SLI4_UNREG_VFI_II_FCFI	= 0xc000,
   2735};
   2736
   2737struct sli4_cmd_unreg_vfi {
   2738	struct sli4_mbox_command_header	hdr;
   2739	__le32		rsvd0;
   2740	__le16		index;
   2741	__le16		dw2_flags;
   2742};
   2743
   2744enum sli4_unreg_type {
   2745	SLI4_UNREG_TYPE_PORT,
   2746	SLI4_UNREG_TYPE_DOMAIN,
   2747	SLI4_UNREG_TYPE_FCF,
   2748	SLI4_UNREG_TYPE_ALL
   2749};
   2750
   2751/* UNREG_VPI - unregister one or more VPI */
   2752enum sli4_unreg_vpi {
   2753	SLI4_UNREG_VPI_II_SHIFT	= 14,
   2754	SLI4_UNREG_VPI_II_MASK	= 0xc000,
   2755	SLI4_UNREG_VPI_II_VPI	= 0x0000,
   2756	SLI4_UNREG_VPI_II_VFI	= 0x8000,
   2757	SLI4_UNREG_VPI_II_FCFI	= 0xc000,
   2758};
   2759
   2760struct sli4_cmd_unreg_vpi {
   2761	struct sli4_mbox_command_header	hdr;
   2762	__le32		rsvd0;
   2763	__le16		index;
   2764	__le16		dw2w0_flags;
   2765};
   2766
   2767/* AUTO_XFER_RDY - Configure the auto-generate XFER-RDY feature */
   2768struct sli4_cmd_config_auto_xfer_rdy {
   2769	struct sli4_mbox_command_header	hdr;
   2770	__le32		rsvd0;
   2771	__le32		max_burst_len;
   2772};
   2773
   2774#define SLI4_CONFIG_AUTO_XFERRDY_BLKSIZE	0xffff
   2775
   2776struct sli4_cmd_config_auto_xfer_rdy_hp {
   2777	struct sli4_mbox_command_header	hdr;
   2778	__le32		rsvd0;
   2779	__le32		max_burst_len;
   2780	__le32		dw3_esoc_flags;
   2781	__le16		block_size;
   2782	__le16		rsvd14;
   2783};
   2784
   2785/*************************************************************************
   2786 * SLI-4 common configuration command formats and definitions
   2787 */
   2788
   2789/*
   2790 * Subsystem values.
   2791 */
   2792enum sli4_subsystem {
   2793	SLI4_SUBSYSTEM_COMMON	= 0x01,
   2794	SLI4_SUBSYSTEM_LOWLEVEL	= 0x0b,
   2795	SLI4_SUBSYSTEM_FC	= 0x0c,
   2796	SLI4_SUBSYSTEM_DMTF	= 0x11,
   2797};
   2798
   2799#define	SLI4_OPC_LOWLEVEL_SET_WATCHDOG		0X36
   2800
   2801/*
   2802 * Common opcode (OPC) values.
   2803 */
   2804enum sli4_cmn_opcode {
   2805	SLI4_CMN_FUNCTION_RESET		= 0x3d,
   2806	SLI4_CMN_CREATE_CQ		= 0x0c,
   2807	SLI4_CMN_CREATE_CQ_SET		= 0x1d,
   2808	SLI4_CMN_DESTROY_CQ		= 0x36,
   2809	SLI4_CMN_MODIFY_EQ_DELAY	= 0x29,
   2810	SLI4_CMN_CREATE_EQ		= 0x0d,
   2811	SLI4_CMN_DESTROY_EQ		= 0x37,
   2812	SLI4_CMN_CREATE_MQ_EXT		= 0x5a,
   2813	SLI4_CMN_DESTROY_MQ		= 0x35,
   2814	SLI4_CMN_GET_CNTL_ATTRIBUTES	= 0x20,
   2815	SLI4_CMN_NOP			= 0x21,
   2816	SLI4_CMN_GET_RSC_EXTENT_INFO	= 0x9a,
   2817	SLI4_CMN_GET_SLI4_PARAMS	= 0xb5,
   2818	SLI4_CMN_QUERY_FW_CONFIG	= 0x3a,
   2819	SLI4_CMN_GET_PORT_NAME		= 0x4d,
   2820
   2821	SLI4_CMN_WRITE_FLASHROM		= 0x07,
   2822	/* TRANSCEIVER Data */
   2823	SLI4_CMN_READ_TRANS_DATA	= 0x49,
   2824	SLI4_CMN_GET_CNTL_ADDL_ATTRS	= 0x79,
   2825	SLI4_CMN_GET_FUNCTION_CFG	= 0xa0,
   2826	SLI4_CMN_GET_PROFILE_CFG	= 0xa4,
   2827	SLI4_CMN_SET_PROFILE_CFG	= 0xa5,
   2828	SLI4_CMN_GET_PROFILE_LIST	= 0xa6,
   2829	SLI4_CMN_GET_ACTIVE_PROFILE	= 0xa7,
   2830	SLI4_CMN_SET_ACTIVE_PROFILE	= 0xa8,
   2831	SLI4_CMN_READ_OBJECT		= 0xab,
   2832	SLI4_CMN_WRITE_OBJECT		= 0xac,
   2833	SLI4_CMN_DELETE_OBJECT		= 0xae,
   2834	SLI4_CMN_READ_OBJECT_LIST	= 0xad,
   2835	SLI4_CMN_SET_DUMP_LOCATION	= 0xb8,
   2836	SLI4_CMN_SET_FEATURES		= 0xbf,
   2837	SLI4_CMN_GET_RECFG_LINK_INFO	= 0xc9,
   2838	SLI4_CMN_SET_RECNG_LINK_ID	= 0xca,
   2839};
   2840
   2841/* DMTF opcode (OPC) values */
   2842#define DMTF_EXEC_CLP_CMD 0x01
   2843
   2844/*
   2845 * COMMON_FUNCTION_RESET
   2846 *
   2847 * Resets the Port, returning it to a power-on state. This configuration
   2848 * command does not have a payload and should set/expect the lengths to
   2849 * be zero.
   2850 */
   2851struct sli4_rqst_cmn_function_reset {
   2852	struct sli4_rqst_hdr	hdr;
   2853};
   2854
   2855struct sli4_rsp_cmn_function_reset {
   2856	struct sli4_rsp_hdr	hdr;
   2857};
   2858
   2859/*
   2860 * COMMON_GET_CNTL_ATTRIBUTES
   2861 *
   2862 * Query for information about the SLI Port
   2863 */
   2864enum sli4_cntrl_attr_flags {
   2865	SLI4_CNTL_ATTR_PORTNUM	= 0x3f,
   2866	SLI4_CNTL_ATTR_PORTTYPE	= 0xc0,
   2867};
   2868
   2869struct sli4_rsp_cmn_get_cntl_attributes {
   2870	struct sli4_rsp_hdr	hdr;
   2871	u8		version_str[32];
   2872	u8		manufacturer_name[32];
   2873	__le32		supported_modes;
   2874	u8		eprom_version_lo;
   2875	u8		eprom_version_hi;
   2876	__le16		rsvd17;
   2877	__le32		mbx_ds_version;
   2878	__le32		ep_fw_ds_version;
   2879	u8		ncsi_version_str[12];
   2880	__le32		def_extended_timeout;
   2881	u8		model_number[32];
   2882	u8		description[64];
   2883	u8		serial_number[32];
   2884	u8		ip_version_str[32];
   2885	u8		fw_version_str[32];
   2886	u8		bios_version_str[32];
   2887	u8		redboot_version_str[32];
   2888	u8		driver_version_str[32];
   2889	u8		fw_on_flash_version_str[32];
   2890	__le32		functionalities_supported;
   2891	__le16		max_cdb_length;
   2892	u8		asic_revision;
   2893	u8		generational_guid0;
   2894	__le32		generational_guid1_12[3];
   2895	__le16		generational_guid13_14;
   2896	u8		generational_guid15;
   2897	u8		hba_port_count;
   2898	__le16		default_link_down_timeout;
   2899	u8		iscsi_version_min_max;
   2900	u8		multifunctional_device;
   2901	u8		cache_valid;
   2902	u8		hba_status;
   2903	u8		max_domains_supported;
   2904	u8		port_num_type_flags;
   2905	__le32		firmware_post_status;
   2906	__le32		hba_mtu;
   2907	u8		iscsi_features;
   2908	u8		rsvd121[3];
   2909	__le16		pci_vendor_id;
   2910	__le16		pci_device_id;
   2911	__le16		pci_sub_vendor_id;
   2912	__le16		pci_sub_system_id;
   2913	u8		pci_bus_number;
   2914	u8		pci_device_number;
   2915	u8		pci_function_number;
   2916	u8		interface_type;
   2917	__le64		unique_identifier;
   2918	u8		number_of_netfilters;
   2919	u8		rsvd122[3];
   2920};
   2921
   2922/*
   2923 * COMMON_GET_CNTL_ATTRIBUTES
   2924 *
   2925 * This command queries the controller information from the Flash ROM.
   2926 */
   2927struct sli4_rqst_cmn_get_cntl_addl_attributes {
   2928	struct sli4_rqst_hdr	hdr;
   2929};
   2930
   2931struct sli4_rsp_cmn_get_cntl_addl_attributes {
   2932	struct sli4_rsp_hdr	hdr;
   2933	__le16		ipl_file_number;
   2934	u8		ipl_file_version;
   2935	u8		rsvd4;
   2936	u8		on_die_temperature;
   2937	u8		rsvd5[3];
   2938	__le32		driver_advanced_features_supported;
   2939	__le32		rsvd7[4];
   2940	char		universal_bios_version[32];
   2941	char		x86_bios_version[32];
   2942	char		efi_bios_version[32];
   2943	char		fcode_version[32];
   2944	char		uefi_bios_version[32];
   2945	char		uefi_nic_version[32];
   2946	char		uefi_fcode_version[32];
   2947	char		uefi_iscsi_version[32];
   2948	char		iscsi_x86_bios_version[32];
   2949	char		pxe_x86_bios_version[32];
   2950	u8		default_wwpn[8];
   2951	u8		ext_phy_version[32];
   2952	u8		fc_universal_bios_version[32];
   2953	u8		fc_x86_bios_version[32];
   2954	u8		fc_efi_bios_version[32];
   2955	u8		fc_fcode_version[32];
   2956	u8		ext_phy_crc_label[8];
   2957	u8		ipl_file_name[16];
   2958	u8		rsvd139[72];
   2959};
   2960
   2961/*
   2962 * COMMON_NOP
   2963 *
   2964 * This command does not do anything; it only returns
   2965 * the payload in the completion.
   2966 */
   2967struct sli4_rqst_cmn_nop {
   2968	struct sli4_rqst_hdr	hdr;
   2969	__le32			context[2];
   2970};
   2971
   2972struct sli4_rsp_cmn_nop {
   2973	struct sli4_rsp_hdr	hdr;
   2974	__le32			context[2];
   2975};
   2976
   2977struct sli4_rqst_cmn_get_resource_extent_info {
   2978	struct sli4_rqst_hdr	hdr;
   2979	__le16	resource_type;
   2980	__le16	rsvd16;
   2981};
   2982
   2983enum sli4_rsc_type {
   2984	SLI4_RSC_TYPE_VFI	= 0x20,
   2985	SLI4_RSC_TYPE_VPI	= 0x21,
   2986	SLI4_RSC_TYPE_RPI	= 0x22,
   2987	SLI4_RSC_TYPE_XRI	= 0x23,
   2988};
   2989
   2990struct sli4_rsp_cmn_get_resource_extent_info {
   2991	struct sli4_rsp_hdr	hdr;
   2992	__le16		resource_extent_count;
   2993	__le16		resource_extent_size;
   2994};
   2995
   2996#define SLI4_128BYTE_WQE_SUPPORT	0x02
   2997
   2998#define GET_Q_CNT_METHOD(m) \
   2999	(((m) & SLI4_PARAM_Q_CNT_MTHD_MASK) >> SLI4_PARAM_Q_CNT_MTHD_SHFT)
   3000#define GET_Q_CREATE_VERSION(v) \
   3001	(((v) & SLI4_PARAM_QV_MASK) >> SLI4_PARAM_QV_SHIFT)
   3002
   3003enum sli4_rsp_get_params_e {
   3004	/*GENERIC*/
   3005	SLI4_PARAM_Q_CNT_MTHD_SHFT	= 24,
   3006	SLI4_PARAM_Q_CNT_MTHD_MASK	= 0xf << 24,
   3007	SLI4_PARAM_QV_SHIFT		= 14,
   3008	SLI4_PARAM_QV_MASK		= 3 << 14,
   3009
   3010	/* DW4 */
   3011	SLI4_PARAM_PROTO_TYPE_MASK	= 0xff,
   3012	/* DW5 */
   3013	SLI4_PARAM_FT			= 1 << 0,
   3014	SLI4_PARAM_SLI_REV_MASK		= 0xf << 4,
   3015	SLI4_PARAM_SLI_FAM_MASK		= 0xf << 8,
   3016	SLI4_PARAM_IF_TYPE_MASK		= 0xf << 12,
   3017	SLI4_PARAM_SLI_HINT1_MASK	= 0xff << 16,
   3018	SLI4_PARAM_SLI_HINT2_MASK	= 0x1f << 24,
   3019	/* DW6 */
   3020	SLI4_PARAM_EQ_PAGE_CNT_MASK	= 0xf << 0,
   3021	SLI4_PARAM_EQE_SZS_MASK		= 0xf << 8,
   3022	SLI4_PARAM_EQ_PAGE_SZS_MASK	= 0xff << 16,
   3023	/* DW8 */
   3024	SLI4_PARAM_CQ_PAGE_CNT_MASK	= 0xf << 0,
   3025	SLI4_PARAM_CQE_SZS_MASK		= 0xf << 8,
   3026	SLI4_PARAM_CQ_PAGE_SZS_MASK	= 0xff << 16,
   3027	/* DW10 */
   3028	SLI4_PARAM_MQ_PAGE_CNT_MASK	= 0xf << 0,
   3029	SLI4_PARAM_MQ_PAGE_SZS_MASK	= 0xff << 16,
   3030	/* DW12 */
   3031	SLI4_PARAM_WQ_PAGE_CNT_MASK	= 0xf << 0,
   3032	SLI4_PARAM_WQE_SZS_MASK		= 0xf << 8,
   3033	SLI4_PARAM_WQ_PAGE_SZS_MASK	= 0xff << 16,
   3034	/* DW14 */
   3035	SLI4_PARAM_RQ_PAGE_CNT_MASK	= 0xf << 0,
   3036	SLI4_PARAM_RQE_SZS_MASK		= 0xf << 8,
   3037	SLI4_PARAM_RQ_PAGE_SZS_MASK	= 0xff << 16,
   3038	/* DW15W1*/
   3039	SLI4_PARAM_RQ_DB_WINDOW_MASK	= 0xf000,
   3040	/* DW16 */
   3041	SLI4_PARAM_FC			= 1 << 0,
   3042	SLI4_PARAM_EXT			= 1 << 1,
   3043	SLI4_PARAM_HDRR			= 1 << 2,
   3044	SLI4_PARAM_SGLR			= 1 << 3,
   3045	SLI4_PARAM_FBRR			= 1 << 4,
   3046	SLI4_PARAM_AREG			= 1 << 5,
   3047	SLI4_PARAM_TGT			= 1 << 6,
   3048	SLI4_PARAM_TERP			= 1 << 7,
   3049	SLI4_PARAM_ASSI			= 1 << 8,
   3050	SLI4_PARAM_WCHN			= 1 << 9,
   3051	SLI4_PARAM_TCCA			= 1 << 10,
   3052	SLI4_PARAM_TRTY			= 1 << 11,
   3053	SLI4_PARAM_TRIR			= 1 << 12,
   3054	SLI4_PARAM_PHOFF		= 1 << 13,
   3055	SLI4_PARAM_PHON			= 1 << 14,
   3056	SLI4_PARAM_PHWQ			= 1 << 15,
   3057	SLI4_PARAM_BOUND_4GA		= 1 << 16,
   3058	SLI4_PARAM_RXC			= 1 << 17,
   3059	SLI4_PARAM_HLM			= 1 << 18,
   3060	SLI4_PARAM_IPR			= 1 << 19,
   3061	SLI4_PARAM_RXRI			= 1 << 20,
   3062	SLI4_PARAM_SGLC			= 1 << 21,
   3063	SLI4_PARAM_TIMM			= 1 << 22,
   3064	SLI4_PARAM_TSMM			= 1 << 23,
   3065	SLI4_PARAM_OAS			= 1 << 25,
   3066	SLI4_PARAM_LC			= 1 << 26,
   3067	SLI4_PARAM_AGXF			= 1 << 27,
   3068	SLI4_PARAM_LOOPBACK_MASK	= 0xf << 28,
   3069	/* DW18 */
   3070	SLI4_PARAM_SGL_PAGE_CNT_MASK	= 0xf << 0,
   3071	SLI4_PARAM_SGL_PAGE_SZS_MASK	= 0xff << 8,
   3072	SLI4_PARAM_SGL_PP_ALIGN_MASK	= 0xff << 16,
   3073};
   3074
   3075struct sli4_rqst_cmn_get_sli4_params {
   3076	struct sli4_rqst_hdr	hdr;
   3077};
   3078
   3079struct sli4_rsp_cmn_get_sli4_params {
   3080	struct sli4_rsp_hdr	hdr;
   3081	__le32		dw4_protocol_type;
   3082	__le32		dw5_sli;
   3083	__le32		dw6_eq_page_cnt;
   3084	__le16		eqe_count_mask;
   3085	__le16		rsvd26;
   3086	__le32		dw8_cq_page_cnt;
   3087	__le16		cqe_count_mask;
   3088	__le16		rsvd34;
   3089	__le32		dw10_mq_page_cnt;
   3090	__le16		mqe_count_mask;
   3091	__le16		rsvd42;
   3092	__le32		dw12_wq_page_cnt;
   3093	__le16		wqe_count_mask;
   3094	__le16		rsvd50;
   3095	__le32		dw14_rq_page_cnt;
   3096	__le16		rqe_count_mask;
   3097	__le16		dw15w1_rq_db_window;
   3098	__le32		dw16_loopback_scope;
   3099	__le32		sge_supported_length;
   3100	__le32		dw18_sgl_page_cnt;
   3101	__le16		min_rq_buffer_size;
   3102	__le16		rsvd75;
   3103	__le32		max_rq_buffer_size;
   3104	__le16		physical_xri_max;
   3105	__le16		physical_rpi_max;
   3106	__le16		physical_vpi_max;
   3107	__le16		physical_vfi_max;
   3108	__le32		rsvd88;
   3109	__le16		frag_num_field_offset;
   3110	__le16		frag_num_field_size;
   3111	__le16		sgl_index_field_offset;
   3112	__le16		sgl_index_field_size;
   3113	__le32		chain_sge_initial_value_lo;
   3114	__le32		chain_sge_initial_value_hi;
   3115};
   3116
   3117/*Port Types*/
   3118enum sli4_port_types {
   3119	SLI4_PORT_TYPE_ETH	= 0,
   3120	SLI4_PORT_TYPE_FC	= 1,
   3121};
   3122
   3123struct sli4_rqst_cmn_get_port_name {
   3124	struct sli4_rqst_hdr	hdr;
   3125	u8	port_type;
   3126	u8	rsvd4[3];
   3127};
   3128
   3129struct sli4_rsp_cmn_get_port_name {
   3130	struct sli4_rsp_hdr	hdr;
   3131	char	port_name[4];
   3132};
   3133
   3134struct sli4_rqst_cmn_write_flashrom {
   3135	struct sli4_rqst_hdr	hdr;
   3136	__le32		flash_rom_access_opcode;
   3137	__le32		flash_rom_access_operation_type;
   3138	__le32		data_buffer_size;
   3139	__le32		offset;
   3140	u8		data_buffer[4];
   3141};
   3142
   3143/*
   3144 * COMMON_READ_TRANSCEIVER_DATA
   3145 *
   3146 * This command reads SFF transceiver data(Format is defined
   3147 * by the SFF-8472 specification).
   3148 */
   3149struct sli4_rqst_cmn_read_transceiver_data {
   3150	struct sli4_rqst_hdr	hdr;
   3151	__le32			page_number;
   3152	__le32			port;
   3153};
   3154
   3155struct sli4_rsp_cmn_read_transceiver_data {
   3156	struct sli4_rsp_hdr	hdr;
   3157	__le32			page_number;
   3158	__le32			port;
   3159	u8			page_data[128];
   3160	u8			page_data_2[128];
   3161};
   3162
   3163#define SLI4_REQ_DESIRE_READLEN		0xffffff
   3164
   3165struct sli4_rqst_cmn_read_object {
   3166	struct sli4_rqst_hdr	hdr;
   3167	__le32			desired_read_length_dword;
   3168	__le32			read_offset;
   3169	u8			object_name[104];
   3170	__le32			host_buffer_descriptor_count;
   3171	struct sli4_bde		host_buffer_descriptor[];
   3172};
   3173
   3174#define RSP_COM_READ_OBJ_EOF		0x80000000
   3175
   3176struct sli4_rsp_cmn_read_object {
   3177	struct sli4_rsp_hdr	hdr;
   3178	__le32			actual_read_length;
   3179	__le32			eof_dword;
   3180};
   3181
   3182enum sli4_rqst_write_object_flags {
   3183	SLI4_RQ_DES_WRITE_LEN		= 0xffffff,
   3184	SLI4_RQ_DES_WRITE_LEN_NOC	= 0x40000000,
   3185	SLI4_RQ_DES_WRITE_LEN_EOF	= 0x80000000,
   3186};
   3187
   3188struct sli4_rqst_cmn_write_object {
   3189	struct sli4_rqst_hdr	hdr;
   3190	__le32			desired_write_len_dword;
   3191	__le32			write_offset;
   3192	u8			object_name[104];
   3193	__le32			host_buffer_descriptor_count;
   3194	struct sli4_bde		host_buffer_descriptor[];
   3195};
   3196
   3197#define	RSP_CHANGE_STATUS		0xff
   3198
   3199struct sli4_rsp_cmn_write_object {
   3200	struct sli4_rsp_hdr	hdr;
   3201	__le32			actual_write_length;
   3202	__le32			change_status_dword;
   3203};
   3204
   3205struct sli4_rqst_cmn_delete_object {
   3206	struct sli4_rqst_hdr	hdr;
   3207	__le32			rsvd4;
   3208	__le32			rsvd5;
   3209	u8			object_name[104];
   3210};
   3211
   3212#define SLI4_RQ_OBJ_LIST_READ_LEN	0xffffff
   3213
   3214struct sli4_rqst_cmn_read_object_list {
   3215	struct sli4_rqst_hdr	hdr;
   3216	__le32			desired_read_length_dword;
   3217	__le32			read_offset;
   3218	u8			object_name[104];
   3219	__le32			host_buffer_descriptor_count;
   3220	struct sli4_bde		host_buffer_descriptor[];
   3221};
   3222
   3223enum sli4_rqst_set_dump_flags {
   3224	SLI4_CMN_SET_DUMP_BUFFER_LEN	= 0xffffff,
   3225	SLI4_CMN_SET_DUMP_FDB		= 0x20000000,
   3226	SLI4_CMN_SET_DUMP_BLP		= 0x40000000,
   3227	SLI4_CMN_SET_DUMP_QRY		= 0x80000000,
   3228};
   3229
   3230struct sli4_rqst_cmn_set_dump_location {
   3231	struct sli4_rqst_hdr	hdr;
   3232	__le32			buffer_length_dword;
   3233	__le32			buf_addr_low;
   3234	__le32			buf_addr_high;
   3235};
   3236
   3237struct sli4_rsp_cmn_set_dump_location {
   3238	struct sli4_rsp_hdr	hdr;
   3239	__le32			buffer_length_dword;
   3240};
   3241
   3242enum sli4_dump_level {
   3243	SLI4_DUMP_LEVEL_NONE,
   3244	SLI4_CHIP_LEVEL_DUMP,
   3245	SLI4_FUNC_DESC_DUMP,
   3246};
   3247
   3248enum sli4_dump_state {
   3249	SLI4_DUMP_STATE_NONE,
   3250	SLI4_CHIP_DUMP_STATE_VALID,
   3251	SLI4_FUNC_DUMP_STATE_VALID,
   3252};
   3253
   3254enum sli4_dump_status {
   3255	SLI4_DUMP_READY_STATUS_NOT_READY,
   3256	SLI4_DUMP_READY_STATUS_DD_PRESENT,
   3257	SLI4_DUMP_READY_STATUS_FDB_PRESENT,
   3258	SLI4_DUMP_READY_STATUS_SKIP_DUMP,
   3259	SLI4_DUMP_READY_STATUS_FAILED = -1,
   3260};
   3261
   3262enum sli4_set_features {
   3263	SLI4_SET_FEATURES_DIF_SEED			= 0x01,
   3264	SLI4_SET_FEATURES_XRI_TIMER			= 0x03,
   3265	SLI4_SET_FEATURES_MAX_PCIE_SPEED		= 0x04,
   3266	SLI4_SET_FEATURES_FCTL_CHECK			= 0x05,
   3267	SLI4_SET_FEATURES_FEC				= 0x06,
   3268	SLI4_SET_FEATURES_PCIE_RECV_DETECT		= 0x07,
   3269	SLI4_SET_FEATURES_DIF_MEMORY_MODE		= 0x08,
   3270	SLI4_SET_FEATURES_DISABLE_SLI_PORT_PAUSE_STATE	= 0x09,
   3271	SLI4_SET_FEATURES_ENABLE_PCIE_OPTIONS		= 0x0a,
   3272	SLI4_SET_FEAT_CFG_AUTO_XFER_RDY_T10PI		= 0x0c,
   3273	SLI4_SET_FEATURES_ENABLE_MULTI_RECEIVE_QUEUE	= 0x0d,
   3274	SLI4_SET_FEATURES_SET_FTD_XFER_HINT		= 0x0f,
   3275	SLI4_SET_FEATURES_SLI_PORT_HEALTH_CHECK		= 0x11,
   3276};
   3277
   3278struct sli4_rqst_cmn_set_features {
   3279	struct sli4_rqst_hdr	hdr;
   3280	__le32			feature;
   3281	__le32			param_len;
   3282	__le32			params[8];
   3283};
   3284
   3285struct sli4_rqst_cmn_set_features_dif_seed {
   3286	__le16		seed;
   3287	__le16		rsvd16;
   3288};
   3289
   3290enum sli4_rqst_set_mrq_features {
   3291	SLI4_RQ_MULTIRQ_ISR		 = 0x1,
   3292	SLI4_RQ_MULTIRQ_AUTOGEN_XFER_RDY = 0x2,
   3293
   3294	SLI4_RQ_MULTIRQ_NUM_RQS		 = 0xff,
   3295	SLI4_RQ_MULTIRQ_RQ_SELECT	 = 0xf00,
   3296};
   3297
   3298struct sli4_rqst_cmn_set_features_multirq {
   3299	__le32		auto_gen_xfer_dword;
   3300	__le32		num_rqs_dword;
   3301};
   3302
   3303enum sli4_rqst_health_check_flags {
   3304	SLI4_RQ_HEALTH_CHECK_ENABLE	= 0x1,
   3305	SLI4_RQ_HEALTH_CHECK_QUERY	= 0x2,
   3306};
   3307
   3308struct sli4_rqst_cmn_set_features_health_check {
   3309	__le32		health_check_dword;
   3310};
   3311
   3312struct sli4_rqst_cmn_set_features_set_fdt_xfer_hint {
   3313	__le32		fdt_xfer_hint;
   3314};
   3315
   3316struct sli4_rqst_dmtf_exec_clp_cmd {
   3317	struct sli4_rqst_hdr	hdr;
   3318	__le32			cmd_buf_length;
   3319	__le32			resp_buf_length;
   3320	__le32			cmd_buf_addr_low;
   3321	__le32			cmd_buf_addr_high;
   3322	__le32			resp_buf_addr_low;
   3323	__le32			resp_buf_addr_high;
   3324};
   3325
   3326struct sli4_rsp_dmtf_exec_clp_cmd {
   3327	struct sli4_rsp_hdr	hdr;
   3328	__le32			rsvd4;
   3329	__le32			resp_length;
   3330	__le32			rsvd6;
   3331	__le32			rsvd7;
   3332	__le32			rsvd8;
   3333	__le32			rsvd9;
   3334	__le32			clp_status;
   3335	__le32			clp_detailed_status;
   3336};
   3337
   3338#define SLI4_PROTOCOL_FC		0x10
   3339#define SLI4_PROTOCOL_DEFAULT		0xff
   3340
   3341struct sli4_rspource_descriptor_v1 {
   3342	u8		descriptor_type;
   3343	u8		descriptor_length;
   3344	__le16		rsvd16;
   3345	__le32		type_specific[];
   3346};
   3347
   3348enum sli4_pcie_desc_flags {
   3349	SLI4_PCIE_DESC_IMM		= 0x4000,
   3350	SLI4_PCIE_DESC_NOSV		= 0x8000,
   3351
   3352	SLI4_PCIE_DESC_PF_NO		= 0x3ff0000,
   3353
   3354	SLI4_PCIE_DESC_MISSN_ROLE	= 0xff,
   3355	SLI4_PCIE_DESC_PCHG		= 0x8000000,
   3356	SLI4_PCIE_DESC_SCHG		= 0x10000000,
   3357	SLI4_PCIE_DESC_XCHG		= 0x20000000,
   3358	SLI4_PCIE_DESC_XROM		= 0xc0000000
   3359};
   3360
   3361struct sli4_pcie_resource_descriptor_v1 {
   3362	u8		descriptor_type;
   3363	u8		descriptor_length;
   3364	__le16		imm_nosv_dword;
   3365	__le32		pf_number_dword;
   3366	__le32		rsvd3;
   3367	u8		sriov_state;
   3368	u8		pf_state;
   3369	u8		pf_type;
   3370	u8		rsvd4;
   3371	__le16		number_of_vfs;
   3372	__le16		rsvd5;
   3373	__le32		mission_roles_dword;
   3374	__le32		rsvd7[16];
   3375};
   3376
   3377struct sli4_rqst_cmn_get_function_config {
   3378	struct sli4_rqst_hdr  hdr;
   3379};
   3380
   3381struct sli4_rsp_cmn_get_function_config {
   3382	struct sli4_rsp_hdr	hdr;
   3383	__le32			desc_count;
   3384	__le32			desc[54];
   3385};
   3386
   3387/* Link Config Descriptor for link config functions */
   3388struct sli4_link_config_descriptor {
   3389	u8		link_config_id;
   3390	u8		rsvd1[3];
   3391	__le32		config_description[8];
   3392};
   3393
   3394#define MAX_LINK_DES	10
   3395
   3396struct sli4_rqst_cmn_get_reconfig_link_info {
   3397	struct sli4_rqst_hdr  hdr;
   3398};
   3399
   3400struct sli4_rsp_cmn_get_reconfig_link_info {
   3401	struct sli4_rsp_hdr	hdr;
   3402	u8			active_link_config_id;
   3403	u8			rsvd17;
   3404	u8			next_link_config_id;
   3405	u8			rsvd19;
   3406	__le32			link_configuration_descriptor_count;
   3407	struct sli4_link_config_descriptor
   3408				desc[MAX_LINK_DES];
   3409};
   3410
   3411enum sli4_set_reconfig_link_flags {
   3412	SLI4_SET_RECONFIG_LINKID_NEXT	= 0xff,
   3413	SLI4_SET_RECONFIG_LINKID_FD	= 1u << 31,
   3414};
   3415
   3416struct sli4_rqst_cmn_set_reconfig_link_id {
   3417	struct sli4_rqst_hdr  hdr;
   3418	__le32			dw4_flags;
   3419};
   3420
   3421struct sli4_rsp_cmn_set_reconfig_link_id {
   3422	struct sli4_rsp_hdr	hdr;
   3423};
   3424
   3425struct sli4_rqst_lowlevel_set_watchdog {
   3426	struct sli4_rqst_hdr	hdr;
   3427	__le16			watchdog_timeout;
   3428	__le16			rsvd18;
   3429};
   3430
   3431struct sli4_rsp_lowlevel_set_watchdog {
   3432	struct sli4_rsp_hdr	hdr;
   3433	__le32			rsvd;
   3434};
   3435
   3436/* FC opcode (OPC) values */
   3437enum sli4_fc_opcodes {
   3438	SLI4_OPC_WQ_CREATE		= 0x1,
   3439	SLI4_OPC_WQ_DESTROY		= 0x2,
   3440	SLI4_OPC_POST_SGL_PAGES		= 0x3,
   3441	SLI4_OPC_RQ_CREATE		= 0x5,
   3442	SLI4_OPC_RQ_DESTROY		= 0x6,
   3443	SLI4_OPC_READ_FCF_TABLE		= 0x8,
   3444	SLI4_OPC_POST_HDR_TEMPLATES	= 0xb,
   3445	SLI4_OPC_REDISCOVER_FCF		= 0x10,
   3446};
   3447
   3448/* Use the default CQ associated with the WQ */
   3449#define SLI4_CQ_DEFAULT 0xffff
   3450
   3451/*
   3452 * POST_SGL_PAGES
   3453 *
   3454 * Register the scatter gather list (SGL) memory and
   3455 * associate it with an XRI.
   3456 */
   3457struct sli4_rqst_post_sgl_pages {
   3458	struct sli4_rqst_hdr	hdr;
   3459	__le16			xri_start;
   3460	__le16			xri_count;
   3461	struct {
   3462		__le32		page0_low;
   3463		__le32		page0_high;
   3464		__le32		page1_low;
   3465		__le32		page1_high;
   3466	} page_set[10];
   3467};
   3468
   3469struct sli4_rsp_post_sgl_pages {
   3470	struct sli4_rsp_hdr	hdr;
   3471};
   3472
   3473struct sli4_rqst_post_hdr_templates {
   3474	struct sli4_rqst_hdr	hdr;
   3475	__le16			rpi_offset;
   3476	__le16			page_count;
   3477	struct sli4_dmaaddr	page_descriptor[];
   3478};
   3479
   3480#define SLI4_HDR_TEMPLATE_SIZE		64
   3481
   3482enum sli4_io_flags {
   3483/* The XRI associated with this IO is already active */
   3484	SLI4_IO_CONTINUATION		= 1 << 0,
   3485/* Automatically generate a good RSP frame */
   3486	SLI4_IO_AUTO_GOOD_RESPONSE	= 1 << 1,
   3487	SLI4_IO_NO_ABORT		= 1 << 2,
   3488/* Set the DNRX bit because no auto xref rdy buffer is posted */
   3489	SLI4_IO_DNRX			= 1 << 3,
   3490};
   3491
   3492enum sli4_callback {
   3493	SLI4_CB_LINK,
   3494	SLI4_CB_MAX,
   3495};
   3496
   3497enum sli4_link_status {
   3498	SLI4_LINK_STATUS_UP,
   3499	SLI4_LINK_STATUS_DOWN,
   3500	SLI4_LINK_STATUS_NO_ALPA,
   3501	SLI4_LINK_STATUS_MAX,
   3502};
   3503
   3504enum sli4_link_topology {
   3505	SLI4_LINK_TOPO_NON_FC_AL = 1,
   3506	SLI4_LINK_TOPO_FC_AL,
   3507	SLI4_LINK_TOPO_LOOPBACK_INTERNAL,
   3508	SLI4_LINK_TOPO_LOOPBACK_EXTERNAL,
   3509	SLI4_LINK_TOPO_NONE,
   3510	SLI4_LINK_TOPO_MAX,
   3511};
   3512
   3513enum sli4_link_medium {
   3514	SLI4_LINK_MEDIUM_ETHERNET,
   3515	SLI4_LINK_MEDIUM_FC,
   3516	SLI4_LINK_MEDIUM_MAX,
   3517};
   3518/******Driver specific structures******/
   3519
   3520struct sli4_queue {
   3521	/* Common to all queue types */
   3522	struct efc_dma	dma;
   3523	spinlock_t	lock;		/* Lock to protect the doorbell register
   3524					 * writes and queue reads
   3525					 */
   3526	u32		index;		/* current host entry index */
   3527	u16		size;		/* entry size */
   3528	u16		length;		/* number of entries */
   3529	u16		n_posted;	/* number entries posted for CQ, EQ */
   3530	u16		id;		/* Port assigned xQ_ID */
   3531	u8		type;		/* queue type ie EQ, CQ, ... */
   3532	void __iomem    *db_regaddr;	/* register address for the doorbell */
   3533	u16		phase;		/* For if_type = 6, this value toggle
   3534					 * for each iteration of the queue,
   3535					 * a queue entry is valid when a cqe
   3536					 * valid bit matches this value
   3537					 */
   3538	u32		proc_limit;	/* limit CQE processed per iteration */
   3539	u32		posted_limit;	/* CQE/EQE process before ring db */
   3540	u32		max_num_processed;
   3541	u64		max_process_time;
   3542	union {
   3543		u32	r_idx;		/* "read" index (MQ only) */
   3544		u32	flag;
   3545	} u;
   3546};
   3547
   3548/* Parameters used to populate WQE*/
   3549struct sli_bls_params {
   3550	u32		s_id;
   3551	u32		d_id;
   3552	u16		ox_id;
   3553	u16		rx_id;
   3554	u32		rpi;
   3555	u32		vpi;
   3556	bool		rpi_registered;
   3557	u8		payload[12];
   3558	u16		xri;
   3559	u16		tag;
   3560};
   3561
   3562struct sli_els_params {
   3563	u32		s_id;
   3564	u32		d_id;
   3565	u16		ox_id;
   3566	u32		rpi;
   3567	u32		vpi;
   3568	bool		rpi_registered;
   3569	u32		xmit_len;
   3570	u32		rsp_len;
   3571	u8		timeout;
   3572	u8		cmd;
   3573	u16		xri;
   3574	u16		tag;
   3575};
   3576
   3577struct sli_ct_params {
   3578	u8		r_ctl;
   3579	u8		type;
   3580	u8		df_ctl;
   3581	u8		timeout;
   3582	u16		ox_id;
   3583	u32		d_id;
   3584	u32		rpi;
   3585	u32		vpi;
   3586	bool		rpi_registered;
   3587	u32		xmit_len;
   3588	u32		rsp_len;
   3589	u16		xri;
   3590	u16		tag;
   3591};
   3592
   3593struct sli_fcp_tgt_params {
   3594	u32		s_id;
   3595	u32		d_id;
   3596	u32		rpi;
   3597	u32		vpi;
   3598	u32		offset;
   3599	u16		ox_id;
   3600	u16		flags;
   3601	u8		cs_ctl;
   3602	u8		timeout;
   3603	u32		app_id;
   3604	u32		xmit_len;
   3605	u16		xri;
   3606	u16		tag;
   3607};
   3608
   3609struct sli4_link_event {
   3610	enum sli4_link_status	status;
   3611	enum sli4_link_topology	topology;
   3612	enum sli4_link_medium	medium;
   3613	u32			speed;
   3614	u8			*loop_map;
   3615	u32			fc_id;
   3616};
   3617
   3618enum sli4_resource {
   3619	SLI4_RSRC_VFI,
   3620	SLI4_RSRC_VPI,
   3621	SLI4_RSRC_RPI,
   3622	SLI4_RSRC_XRI,
   3623	SLI4_RSRC_FCFI,
   3624	SLI4_RSRC_MAX,
   3625};
   3626
   3627struct sli4_extent {
   3628	u32		number;
   3629	u32		size;
   3630	u32		n_alloc;
   3631	u32		*base;
   3632	unsigned long	*use_map;
   3633	u32		map_size;
   3634};
   3635
   3636struct sli4_queue_info {
   3637	u16	max_qcount[SLI4_QTYPE_MAX];
   3638	u32	max_qentries[SLI4_QTYPE_MAX];
   3639	u16	count_mask[SLI4_QTYPE_MAX];
   3640	u16	count_method[SLI4_QTYPE_MAX];
   3641	u32	qpage_count[SLI4_QTYPE_MAX];
   3642};
   3643
   3644struct sli4_params {
   3645	u8	has_extents;
   3646	u8	auto_reg;
   3647	u8	auto_xfer_rdy;
   3648	u8	hdr_template_req;
   3649	u8	perf_hint;
   3650	u8	perf_wq_id_association;
   3651	u8	cq_create_version;
   3652	u8	mq_create_version;
   3653	u8	high_login_mode;
   3654	u8	sgl_pre_registered;
   3655	u8	sgl_pre_reg_required;
   3656	u8	t10_dif_inline_capable;
   3657	u8	t10_dif_separate_capable;
   3658};
   3659
   3660struct sli4 {
   3661	void			*os;
   3662	struct pci_dev		*pci;
   3663	void __iomem		*reg[PCI_STD_NUM_BARS];
   3664
   3665	u32			sli_rev;
   3666	u32			sli_family;
   3667	u32			if_type;
   3668
   3669	u16			asic_type;
   3670	u16			asic_rev;
   3671
   3672	u16			e_d_tov;
   3673	u16			r_a_tov;
   3674	struct sli4_queue_info	qinfo;
   3675	u16			link_module_type;
   3676	u8			rq_batch;
   3677	u8			port_number;
   3678	char			port_name[2];
   3679	u16			rq_min_buf_size;
   3680	u32			rq_max_buf_size;
   3681	u8			topology;
   3682	u8			wwpn[8];
   3683	u8			wwnn[8];
   3684	u32			fw_rev[2];
   3685	u8			fw_name[2][16];
   3686	char			ipl_name[16];
   3687	u32			hw_rev[3];
   3688	char			modeldesc[64];
   3689	char			bios_version_string[32];
   3690	u32			wqe_size;
   3691	u32			vpd_length;
   3692	/*
   3693	 * Tracks the port resources using extents metaphor. For
   3694	 * devices that don't implement extents (i.e.
   3695	 * has_extents == FALSE), the code models each resource as
   3696	 * a single large extent.
   3697	 */
   3698	struct sli4_extent	ext[SLI4_RSRC_MAX];
   3699	u32			features;
   3700	struct sli4_params	params;
   3701	u32			sge_supported_length;
   3702	u32			sgl_page_sizes;
   3703	u32			max_sgl_pages;
   3704
   3705	/*
   3706	 * Callback functions
   3707	 */
   3708	int			(*link)(void *ctx, void *event);
   3709	void			*link_arg;
   3710
   3711	struct efc_dma		bmbx;
   3712
   3713	/* Save pointer to physical memory descriptor for non-embedded
   3714	 * SLI_CONFIG commands for BMBX dumping purposes
   3715	 */
   3716	struct efc_dma		*bmbx_non_emb_pmd;
   3717
   3718	struct efc_dma		vpd_data;
   3719};
   3720
   3721static inline void
   3722sli_cmd_fill_hdr(struct sli4_rqst_hdr *hdr, u8 opc, u8 sub, u32 ver, __le32 len)
   3723{
   3724	hdr->opcode = opc;
   3725	hdr->subsystem = sub;
   3726	hdr->dw3_version = cpu_to_le32(ver);
   3727	hdr->request_length = len;
   3728}
   3729
   3730/**
   3731 * Get / set parameter functions
   3732 */
   3733
   3734static inline u32
   3735sli_get_max_sge(struct sli4 *sli4)
   3736{
   3737	return sli4->sge_supported_length;
   3738}
   3739
   3740static inline u32
   3741sli_get_max_sgl(struct sli4 *sli4)
   3742{
   3743	if (sli4->sgl_page_sizes != 1) {
   3744		efc_log_err(sli4, "unsupported SGL page sizes %#x\n",
   3745			    sli4->sgl_page_sizes);
   3746		return 0;
   3747	}
   3748
   3749	return (sli4->max_sgl_pages * SLI_PAGE_SIZE) / sizeof(struct sli4_sge);
   3750}
   3751
   3752static inline enum sli4_link_medium
   3753sli_get_medium(struct sli4 *sli4)
   3754{
   3755	switch (sli4->topology) {
   3756	case SLI4_READ_CFG_TOPO_FC:
   3757	case SLI4_READ_CFG_TOPO_FC_AL:
   3758	case SLI4_READ_CFG_TOPO_NON_FC_AL:
   3759		return SLI4_LINK_MEDIUM_FC;
   3760	default:
   3761		return SLI4_LINK_MEDIUM_MAX;
   3762	}
   3763}
   3764
   3765static inline u32
   3766sli_get_lmt(struct sli4 *sli4)
   3767{
   3768	return sli4->link_module_type;
   3769}
   3770
   3771static inline int
   3772sli_set_topology(struct sli4 *sli4, u32 value)
   3773{
   3774	int	rc = 0;
   3775
   3776	switch (value) {
   3777	case SLI4_READ_CFG_TOPO_FC:
   3778	case SLI4_READ_CFG_TOPO_FC_AL:
   3779	case SLI4_READ_CFG_TOPO_NON_FC_AL:
   3780		sli4->topology = value;
   3781		break;
   3782	default:
   3783		efc_log_err(sli4, "unsupported topology %#x\n", value);
   3784		rc = -1;
   3785	}
   3786
   3787	return rc;
   3788}
   3789
   3790static inline u32
   3791sli_convert_mask_to_count(u32 method, u32 mask)
   3792{
   3793	u32 count = 0;
   3794
   3795	if (method) {
   3796		count = 1 << (31 - __builtin_clz(mask));
   3797		count *= 16;
   3798	} else {
   3799		count = mask;
   3800	}
   3801
   3802	return count;
   3803}
   3804
   3805static inline u32
   3806sli_reg_read_status(struct sli4 *sli)
   3807{
   3808	return readl(sli->reg[0] + SLI4_PORT_STATUS_REGOFF);
   3809}
   3810
   3811static inline int
   3812sli_fw_error_status(struct sli4 *sli4)
   3813{
   3814	return (sli_reg_read_status(sli4) & SLI4_PORT_STATUS_ERR) ? 1 : 0;
   3815}
   3816
   3817static inline u32
   3818sli_reg_read_err1(struct sli4 *sli)
   3819{
   3820	return readl(sli->reg[0] + SLI4_PORT_ERROR1);
   3821}
   3822
   3823static inline u32
   3824sli_reg_read_err2(struct sli4 *sli)
   3825{
   3826	return readl(sli->reg[0] + SLI4_PORT_ERROR2);
   3827}
   3828
   3829static inline int
   3830sli_fc_rqe_length(struct sli4 *sli4, void *cqe, u32 *len_hdr,
   3831		  u32 *len_data)
   3832{
   3833	struct sli4_fc_async_rcqe	*rcqe = cqe;
   3834
   3835	*len_hdr = *len_data = 0;
   3836
   3837	if (rcqe->status == SLI4_FC_ASYNC_RQ_SUCCESS) {
   3838		*len_hdr  = rcqe->hdpl_byte & SLI4_RACQE_HDPL;
   3839		*len_data = le16_to_cpu(rcqe->data_placement_length);
   3840		return 0;
   3841	} else {
   3842		return -1;
   3843	}
   3844}
   3845
   3846static inline u8
   3847sli_fc_rqe_fcfi(struct sli4 *sli4, void *cqe)
   3848{
   3849	u8 code = ((u8 *)cqe)[SLI4_CQE_CODE_OFFSET];
   3850	u8 fcfi = U8_MAX;
   3851
   3852	switch (code) {
   3853	case SLI4_CQE_CODE_RQ_ASYNC: {
   3854		struct sli4_fc_async_rcqe *rcqe = cqe;
   3855
   3856		fcfi = le16_to_cpu(rcqe->fcfi_rq_id_word) & SLI4_RACQE_FCFI;
   3857		break;
   3858	}
   3859	case SLI4_CQE_CODE_RQ_ASYNC_V1: {
   3860		struct sli4_fc_async_rcqe_v1 *rcqev1 = cqe;
   3861
   3862		fcfi = rcqev1->fcfi_byte & SLI4_RACQE_FCFI;
   3863		break;
   3864	}
   3865	case SLI4_CQE_CODE_OPTIMIZED_WRITE_CMD: {
   3866		struct sli4_fc_optimized_write_cmd_cqe *opt_wr = cqe;
   3867
   3868		fcfi = opt_wr->flags0 & SLI4_OCQE_FCFI;
   3869		break;
   3870	}
   3871	}
   3872
   3873	return fcfi;
   3874}
   3875
   3876/****************************************************************************
   3877 * Function prototypes
   3878 */
   3879int
   3880sli_cmd_config_link(struct sli4 *sli4, void *buf);
   3881int
   3882sli_cmd_down_link(struct sli4 *sli4, void *buf);
   3883int
   3884sli_cmd_dump_type4(struct sli4 *sli4, void *buf, u16 wki);
   3885int
   3886sli_cmd_common_read_transceiver_data(struct sli4 *sli4, void *buf,
   3887				     u32 page_num, struct efc_dma *dma);
   3888int
   3889sli_cmd_read_link_stats(struct sli4 *sli4, void *buf, u8 req_stats,
   3890			u8 clear_overflow_flags, u8 clear_all_counters);
   3891int
   3892sli_cmd_read_status(struct sli4 *sli4, void *buf, u8 clear);
   3893int
   3894sli_cmd_init_link(struct sli4 *sli4, void *buf, u32 speed,
   3895		  u8 reset_alpa);
   3896int
   3897sli_cmd_init_vfi(struct sli4 *sli4, void *buf, u16 vfi, u16 fcfi,
   3898		 u16 vpi);
   3899int
   3900sli_cmd_init_vpi(struct sli4 *sli4, void *buf, u16 vpi, u16 vfi);
   3901int
   3902sli_cmd_post_xri(struct sli4 *sli4, void *buf, u16 base, u16 cnt);
   3903int
   3904sli_cmd_release_xri(struct sli4 *sli4, void *buf, u8 num_xri);
   3905int
   3906sli_cmd_read_sparm64(struct sli4 *sli4, void *buf,
   3907		     struct efc_dma *dma, u16 vpi);
   3908int
   3909sli_cmd_read_topology(struct sli4 *sli4, void *buf, struct efc_dma *dma);
   3910int
   3911sli_cmd_read_nvparms(struct sli4 *sli4, void *buf);
   3912int
   3913sli_cmd_write_nvparms(struct sli4 *sli4, void *buf, u8 *wwpn,
   3914		      u8 *wwnn, u8 hard_alpa, u32 preferred_d_id);
   3915int
   3916sli_cmd_reg_fcfi(struct sli4 *sli4, void *buf, u16 index,
   3917		 struct sli4_cmd_rq_cfg *rq_cfg);
   3918int
   3919sli_cmd_reg_fcfi_mrq(struct sli4 *sli4, void *buf, u8 mode, u16 index,
   3920		     u8 rq_selection_policy, u8 mrq_bit_mask, u16 num_mrqs,
   3921		     struct sli4_cmd_rq_cfg *rq_cfg);
   3922int
   3923sli_cmd_reg_rpi(struct sli4 *sli4, void *buf, u32 rpi, u32 vpi, u32 fc_id,
   3924		struct efc_dma *dma, u8 update, u8 enable_t10_pi);
   3925int
   3926sli_cmd_unreg_fcfi(struct sli4 *sli4, void *buf, u16 indicator);
   3927int
   3928sli_cmd_unreg_rpi(struct sli4 *sli4, void *buf, u16 indicator,
   3929		  enum sli4_resource which, u32 fc_id);
   3930int
   3931sli_cmd_reg_vpi(struct sli4 *sli4, void *buf, u32 fc_id,
   3932		__be64 sli_wwpn, u16 vpi, u16 vfi, bool update);
   3933int
   3934sli_cmd_reg_vfi(struct sli4 *sli4, void *buf, size_t size,
   3935		u16 vfi, u16 fcfi, struct efc_dma dma,
   3936		u16 vpi, __be64 sli_wwpn, u32 fc_id);
   3937int
   3938sli_cmd_unreg_vpi(struct sli4 *sli4, void *buf, u16 id, u32 type);
   3939int
   3940sli_cmd_unreg_vfi(struct sli4 *sli4, void *buf, u16 idx, u32 type);
   3941int
   3942sli_cmd_common_nop(struct sli4 *sli4, void *buf, uint64_t context);
   3943int
   3944sli_cmd_common_get_resource_extent_info(struct sli4 *sli4, void *buf,
   3945					u16 rtype);
   3946int
   3947sli_cmd_common_get_sli4_parameters(struct sli4 *sli4, void *buf);
   3948int
   3949sli_cmd_common_write_object(struct sli4 *sli4, void *buf, u16 noc,
   3950		u16 eof, u32 len, u32 offset, char *name, struct efc_dma *dma);
   3951int
   3952sli_cmd_common_delete_object(struct sli4 *sli4, void *buf, char *object_name);
   3953int
   3954sli_cmd_common_read_object(struct sli4 *sli4, void *buf,
   3955		u32 length, u32 offset, char *name, struct efc_dma *dma);
   3956int
   3957sli_cmd_dmtf_exec_clp_cmd(struct sli4 *sli4, void *buf,
   3958		struct efc_dma *cmd, struct efc_dma *resp);
   3959int
   3960sli_cmd_common_set_dump_location(struct sli4 *sli4, void *buf,
   3961		bool query, bool is_buffer_list, struct efc_dma *dma, u8 fdb);
   3962int
   3963sli_cmd_common_set_features(struct sli4 *sli4, void *buf,
   3964			    u32 feature, u32 param_len, void *parameter);
   3965
   3966int sli_cqe_mq(struct sli4 *sli4, void *buf);
   3967int sli_cqe_async(struct sli4 *sli4, void *buf);
   3968
   3969int
   3970sli_setup(struct sli4 *sli4, void *os, struct pci_dev *pdev, void __iomem *r[]);
   3971void sli_calc_max_qentries(struct sli4 *sli4);
   3972int sli_init(struct sli4 *sli4);
   3973int sli_reset(struct sli4 *sli4);
   3974int sli_fw_reset(struct sli4 *sli4);
   3975void sli_teardown(struct sli4 *sli4);
   3976int
   3977sli_callback(struct sli4 *sli4, enum sli4_callback cb, void *func, void *arg);
   3978int
   3979sli_bmbx_command(struct sli4 *sli4);
   3980int
   3981__sli_queue_init(struct sli4 *sli4, struct sli4_queue *q, u32 qtype,
   3982		 size_t size, u32 n_entries, u32 align);
   3983int
   3984__sli_create_queue(struct sli4 *sli4, struct sli4_queue *q);
   3985int
   3986sli_eq_modify_delay(struct sli4 *sli4, struct sli4_queue *eq, u32 num_eq,
   3987		    u32 shift, u32 delay_mult);
   3988int
   3989sli_queue_alloc(struct sli4 *sli4, u32 qtype, struct sli4_queue *q,
   3990		u32 n_entries, struct sli4_queue *assoc);
   3991int
   3992sli_cq_alloc_set(struct sli4 *sli4, struct sli4_queue *qs[], u32 num_cqs,
   3993		 u32 n_entries, struct sli4_queue *eqs[]);
   3994int
   3995sli_get_queue_entry_size(struct sli4 *sli4, u32 qtype);
   3996int
   3997sli_queue_free(struct sli4 *sli4, struct sli4_queue *q, u32 destroy_queues,
   3998	       u32 free_memory);
   3999int
   4000sli_queue_eq_arm(struct sli4 *sli4, struct sli4_queue *q, bool arm);
   4001int
   4002sli_queue_arm(struct sli4 *sli4, struct sli4_queue *q, bool arm);
   4003
   4004int
   4005sli_wq_write(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
   4006int
   4007sli_mq_write(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
   4008int
   4009sli_rq_write(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
   4010int
   4011sli_eq_read(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
   4012int
   4013sli_cq_read(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
   4014int
   4015sli_mq_read(struct sli4 *sli4, struct sli4_queue *q, u8 *entry);
   4016int
   4017sli_resource_alloc(struct sli4 *sli4, enum sli4_resource rtype, u32 *rid,
   4018		   u32 *index);
   4019int
   4020sli_resource_free(struct sli4 *sli4, enum sli4_resource rtype, u32 rid);
   4021int
   4022sli_resource_reset(struct sli4 *sli4, enum sli4_resource rtype);
   4023int
   4024sli_eq_parse(struct sli4 *sli4, u8 *buf, u16 *cq_id);
   4025int
   4026sli_cq_parse(struct sli4 *sli4, struct sli4_queue *cq, u8 *cqe,
   4027	     enum sli4_qentry *etype, u16 *q_id);
   4028
   4029int sli_raise_ue(struct sli4 *sli4, u8 dump);
   4030int sli_dump_is_ready(struct sli4 *sli4);
   4031bool sli_reset_required(struct sli4 *sli4);
   4032bool sli_fw_ready(struct sli4 *sli4);
   4033
   4034int
   4035sli_fc_process_link_attention(struct sli4 *sli4, void *acqe);
   4036int
   4037sli_fc_cqe_parse(struct sli4 *sli4, struct sli4_queue *cq,
   4038		 u8 *cqe, enum sli4_qentry *etype,
   4039		 u16 *rid);
   4040u32 sli_fc_response_length(struct sli4 *sli4, u8 *cqe);
   4041u32 sli_fc_io_length(struct sli4 *sli4, u8 *cqe);
   4042int sli_fc_els_did(struct sli4 *sli4, u8 *cqe, u32 *d_id);
   4043u32 sli_fc_ext_status(struct sli4 *sli4, u8 *cqe);
   4044int
   4045sli_fc_rqe_rqid_and_index(struct sli4 *sli4, u8 *cqe, u16 *rq_id, u32 *index);
   4046int
   4047sli_cmd_wq_create(struct sli4 *sli4, void *buf,
   4048		  struct efc_dma *qmem, u16 cq_id);
   4049int sli_cmd_post_sgl_pages(struct sli4 *sli4, void *buf, u16 xri,
   4050		u32 xri_count, struct efc_dma *page0[], struct efc_dma *page1[],
   4051		struct efc_dma *dma);
   4052int
   4053sli_cmd_post_hdr_templates(struct sli4 *sli4, void *buf,
   4054		struct efc_dma *dma, u16 rpi, struct efc_dma *payload_dma);
   4055int
   4056sli_fc_rq_alloc(struct sli4 *sli4, struct sli4_queue *q, u32 n_entries,
   4057		u32 buffer_size, struct sli4_queue *cq, bool is_hdr);
   4058int
   4059sli_fc_rq_set_alloc(struct sli4 *sli4, u32 num_rq_pairs, struct sli4_queue *q[],
   4060		u32 base_cq_id, u32 num, u32 hdr_buf_size, u32 data_buf_size);
   4061u32 sli_fc_get_rpi_requirements(struct sli4 *sli4, u32 n_rpi);
   4062int
   4063sli_abort_wqe(struct sli4 *sli4, void *buf, enum sli4_abort_type type,
   4064	      bool send_abts, u32 ids, u32 mask, u16 tag, u16 cq_id);
   4065
   4066int
   4067sli_send_frame_wqe(struct sli4 *sli4, void *buf, u8 sof, u8 eof,
   4068		   u32 *hdr, struct efc_dma *payload, u32 req_len, u8 timeout,
   4069		   u16 xri, u16 req_tag);
   4070
   4071int
   4072sli_xmit_els_rsp64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *rsp,
   4073		       struct sli_els_params *params);
   4074
   4075int
   4076sli_els_request64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
   4077		      struct sli_els_params *params);
   4078
   4079int
   4080sli_fcp_icmnd64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl, u16 xri,
   4081		    u16 tag, u16 cq_id, u32 rpi, u32 rnode_fcid, u8 timeout);
   4082
   4083int
   4084sli_fcp_iread64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
   4085		    u32 first_data_sge, u32 xfer_len, u16 xri,
   4086		    u16 tag, u16 cq_id, u32 rpi, u32 rnode_fcid, u8 dif, u8 bs,
   4087		    u8 timeout);
   4088
   4089int
   4090sli_fcp_iwrite64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
   4091		     u32 first_data_sge, u32 xfer_len,
   4092		     u32 first_burst, u16 xri, u16 tag, u16 cq_id, u32 rpi,
   4093		     u32 rnode_fcid, u8 dif, u8 bs, u8 timeout);
   4094
   4095int
   4096sli_fcp_treceive64_wqe(struct sli4 *sli, void *buf, struct efc_dma *sgl,
   4097		       u32 first_data_sge, u16 cq_id, u8 dif, u8 bs,
   4098		       struct sli_fcp_tgt_params *params);
   4099int
   4100sli_fcp_cont_treceive64_wqe(struct sli4 *sli, void *buf, struct efc_dma *sgl,
   4101			    u32 first_data_sge, u16 sec_xri, u16 cq_id, u8 dif,
   4102			    u8 bs, struct sli_fcp_tgt_params *params);
   4103
   4104int
   4105sli_fcp_trsp64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
   4106		   u16 cq_id, u8 port_owned, struct sli_fcp_tgt_params *params);
   4107
   4108int
   4109sli_fcp_tsend64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
   4110		    u32 first_data_sge, u16 cq_id, u8 dif, u8 bs,
   4111		    struct sli_fcp_tgt_params *params);
   4112int
   4113sli_gen_request64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *sgl,
   4114		      struct sli_ct_params *params);
   4115
   4116int
   4117sli_xmit_bls_rsp64_wqe(struct sli4 *sli4, void *buf,
   4118		struct sli_bls_payload *payload, struct sli_bls_params *params);
   4119
   4120int
   4121sli_xmit_sequence64_wqe(struct sli4 *sli4, void *buf, struct efc_dma *payload,
   4122			struct sli_ct_params *params);
   4123
   4124int
   4125sli_requeue_xri_wqe(struct sli4 *sli4, void *buf, u16 xri, u16 tag, u16 cq_id);
   4126void
   4127sli4_cmd_lowlevel_set_watchdog(struct sli4 *sli4, void *buf, size_t size,
   4128			       u16 timeout);
   4129
   4130const char *sli_fc_get_status_string(u32 status);
   4131
   4132#endif /* !_SLI4_H */