diff mbox series

[v4,03/31] elx: libefc_sli: Data structures and defines for mbox commands

Message ID 20201012225147.54404-4-james.smart@broadcom.com
State New
Headers show
Series [v4,01/31] elx: libefc_sli: SLI-4 register offsets and field definitions | expand

Commit Message

James Smart Oct. 12, 2020, 10:51 p.m. UTC
This patch continues the libefc_sli SLI-4 library population.

This patch adds definitions for SLI-4 mailbox commands
and responses.

Co-developed-by: Ram Vegesna <ram.vegesna@broadcom.com>
Signed-off-by: Ram Vegesna <ram.vegesna@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>

---
v4:
  Indentation changes
  Page size calculation changes
  Added SLI4_ prefix to missing defines
---
 drivers/scsi/elx/libefc_sli/sli4.h | 1624 ++++++++++++++++++++++++++++
 1 file changed, 1624 insertions(+)

Comments

Hannes Reinecke Oct. 19, 2020, 6:46 p.m. UTC | #1
On 10/13/20 12:51 AM, James Smart wrote:
> This patch continues the libefc_sli SLI-4 library population.

> 

> This patch adds definitions for SLI-4 mailbox commands

> and responses.

> 

> Co-developed-by: Ram Vegesna <ram.vegesna@broadcom.com>

> Signed-off-by: Ram Vegesna <ram.vegesna@broadcom.com>

> Signed-off-by: James Smart <james.smart@broadcom.com>

> 

> ---

> v4:

>    Indentation changes

>    Page size calculation changes

>    Added SLI4_ prefix to missing defines

> ---

>   drivers/scsi/elx/libefc_sli/sli4.h | 1624 ++++++++++++++++++++++++++++

>   1 file changed, 1624 insertions(+)

> 

> diff --git a/drivers/scsi/elx/libefc_sli/sli4.h b/drivers/scsi/elx/libefc_sli/sli4.h

> index b63fca0c2dfe..2960a6cb082f 100644

> --- a/drivers/scsi/elx/libefc_sli/sli4.h

> +++ b/drivers/scsi/elx/libefc_sli/sli4.h

> @@ -1983,6 +1983,1518 @@ enum sli4_els_cmd_type {

>   	SLI4_ELS_REQUEST64_CMD_FABRIC		= 0x0d,

>   };

>   

> +#define SLI_PAGE_SIZE				SZ_4K

> +

> +#define SLI4_BMBX_TIMEOUT_MSEC			30000

> +#define SLI4_FW_READY_TIMEOUT_MSEC		30000

> +

> +#define SLI4_BMBX_DELAY_US			1000	/* 1 ms */

> +#define SLI4_INIT_PORT_DELAY_US			10000	/* 10 ms */

> +

> +static inline u32

> +sli_page_count(size_t bytes, u32 page_size)

> +{

> +	if (!page_size)

> +		return 0;

> +

> +	return (bytes + (page_size - 1)) >> __ffs(page_size);

> +}

> +

> +/*************************************************************************

> + * SLI-4 mailbox command formats and definitions

> + */

> +

> +struct sli4_mbox_command_header {

> +	u8	resvd0;

> +	u8	command;

> +	__le16	status;	/* Port writes to indicate success/fail */

> +};

> +

> +enum sli4_mbx_cmd_value {

> +	SLI4_MBX_CMD_CONFIG_LINK	= 0x07,

> +	SLI4_MBX_CMD_DUMP		= 0x17,

> +	SLI4_MBX_CMD_DOWN_LINK		= 0x06,

> +	SLI4_MBX_CMD_INIT_LINK		= 0x05,

> +	SLI4_MBX_CMD_INIT_VFI		= 0xa3,

> +	SLI4_MBX_CMD_INIT_VPI		= 0xa4,

> +	SLI4_MBX_CMD_POST_XRI		= 0xa7,

> +	SLI4_MBX_CMD_RELEASE_XRI	= 0xac,

> +	SLI4_MBX_CMD_READ_CONFIG	= 0x0b,

> +	SLI4_MBX_CMD_READ_STATUS	= 0x0e,

> +	SLI4_MBX_CMD_READ_NVPARMS	= 0x02,

> +	SLI4_MBX_CMD_READ_REV		= 0x11,

> +	SLI4_MBX_CMD_READ_LNK_STAT	= 0x12,

> +	SLI4_MBX_CMD_READ_SPARM64	= 0x8d,

> +	SLI4_MBX_CMD_READ_TOPOLOGY	= 0x95,

> +	SLI4_MBX_CMD_REG_FCFI		= 0xa0,

> +	SLI4_MBX_CMD_REG_FCFI_MRQ	= 0xaf,

> +	SLI4_MBX_CMD_REG_RPI		= 0x93,

> +	SLI4_MBX_CMD_REG_RX_RQ		= 0xa6,

> +	SLI4_MBX_CMD_REG_VFI		= 0x9f,

> +	SLI4_MBX_CMD_REG_VPI		= 0x96,

> +	SLI4_MBX_CMD_RQST_FEATURES	= 0x9d,

> +	SLI4_MBX_CMD_SLI_CONFIG		= 0x9b,

> +	SLI4_MBX_CMD_UNREG_FCFI		= 0xa2,

> +	SLI4_MBX_CMD_UNREG_RPI		= 0x14,

> +	SLI4_MBX_CMD_UNREG_VFI		= 0xa1,

> +	SLI4_MBX_CMD_UNREG_VPI		= 0x97,

> +	SLI4_MBX_CMD_WRITE_NVPARMS	= 0x03,

> +	SLI4_MBX_CMD_CFG_AUTO_XFER_RDY	= 0xad,

> +};

> +

> +enum sli4_mbx_status {

> +	SLI4_MBX_STATUS_SUCCESS		= 0x0000,

> +	SLI4_MBX_STATUS_FAILURE		= 0x0001,

> +	SLI4_MBX_STATUS_RPI_NOT_REG	= 0x1400,

> +};

> +

> +/* CONFIG_LINK - configure link-oriented parameters,

> + * such as default N_Port_ID address and various timers

> + */

> +enum sli4_cmd_config_link_flags {

> +	SLI4_CFG_LINK_BBSCN = 0xf00,

> +	SLI4_CFG_LINK_CSCN  = 0x1000,

> +};

> +

> +struct sli4_cmd_config_link {

> +	struct sli4_mbox_command_header	hdr;

> +	u8		maxbbc;

> +	u8		rsvd5;

> +	u8		rsvd6;

> +	u8		rsvd7;

> +	u8		alpa;

> +	__le16		n_port_id;

> +	u8		rsvd11;

> +	__le32		rsvd12;

> +	__le32		e_d_tov;

> +	__le32		lp_tov;

> +	__le32		r_a_tov;

> +	__le32		r_t_tov;

> +	__le32		al_tov;

> +	__le32		rsvd36;

> +	__le32		bbscn_dword;

> +};

> +

> +#define SLI4_DUMP4_TYPE		0xf

> +

> +#define SLI4_WKI_TAG_SAT_TEM	0x1040

> +

> +struct sli4_cmd_dump4 {

> +	struct sli4_mbox_command_header	hdr;

> +	__le32		type_dword;

> +	__le16		wki_selection;

> +	__le16		rsvd10;

> +	__le32		rsvd12;

> +	__le32		returned_byte_cnt;

> +	__le32		resp_data[59];

> +};

> +

> +/* INIT_LINK - initialize the link for a FC port */

> +enum sli4_init_link_flags {

> +	SLI4_INIT_LINK_F_LOOPBACK	= 1 << 0,

> +

> +	SLI4_INIT_LINK_F_P2P_ONLY	= 1 << 1,

> +	SLI4_INIT_LINK_F_FCAL_ONLY	= 2 << 1,

> +	SLI4_INIT_LINK_F_FCAL_FAIL_OVER	= 0 << 1,

> +	SLI4_INIT_LINK_F_P2P_FAIL_OVER	= 1 << 1,

> +

> +	SLI4_INIT_LINK_F_UNFAIR		= 1 << 6,

> +	SLI4_INIT_LINK_F_NO_LIRP	= 1 << 7,

> +	SLI4_INIT_LINK_F_LOOP_VALID_CHK	= 1 << 8,

> +	SLI4_INIT_LINK_F_NO_LISA	= 1 << 9,

> +	SLI4_INIT_LINK_F_FAIL_OVER	= 1 << 10,

> +	SLI4_INIT_LINK_F_FIXED_SPEED	= 1 << 11,

> +	SLI4_INIT_LINK_F_PICK_HI_ALPA	= 1 << 15,

> +

> +};

> +

> +enum sli4_fc_link_speed {

> +	SLI4_LINK_SPEED_1G = 1,

> +	SLI4_LINK_SPEED_2G,

> +	SLI4_LINK_SPEED_AUTO_1_2,

> +	SLI4_LINK_SPEED_4G,

> +	SLI4_LINK_SPEED_AUTO_4_1,

> +	SLI4_LINK_SPEED_AUTO_4_2,

> +	SLI4_LINK_SPEED_AUTO_4_2_1,

> +	SLI4_LINK_SPEED_8G,

> +	SLI4_LINK_SPEED_AUTO_8_1,

> +	SLI4_LINK_SPEED_AUTO_8_2,

> +	SLI4_LINK_SPEED_AUTO_8_2_1,

> +	SLI4_LINK_SPEED_AUTO_8_4,

> +	SLI4_LINK_SPEED_AUTO_8_4_1,

> +	SLI4_LINK_SPEED_AUTO_8_4_2,

> +	SLI4_LINK_SPEED_10G,

> +	SLI4_LINK_SPEED_16G,

> +	SLI4_LINK_SPEED_AUTO_16_8_4,

> +	SLI4_LINK_SPEED_AUTO_16_8,

> +	SLI4_LINK_SPEED_32G,

> +	SLI4_LINK_SPEED_AUTO_32_16_8,

> +	SLI4_LINK_SPEED_AUTO_32_16,

> +	SLI4_LINK_SPEED_64G,

> +	SLI4_LINK_SPEED_AUTO_64_32_16,

> +	SLI4_LINK_SPEED_AUTO_64_32,

> +	SLI4_LINK_SPEED_128G,

> +	SLI4_LINK_SPEED_AUTO_128_64_32,

> +	SLI4_LINK_SPEED_AUTO_128_64,

> +};

> +

> +struct sli4_cmd_init_link {

> +	struct sli4_mbox_command_header       hdr;

> +	__le32	sel_reset_al_pa_dword;

> +	__le32	flags0;

> +	__le32	link_speed_sel_code;

> +};

> +

> +/* INIT_VFI - initialize the VFI resource */

> +enum sli4_init_vfi_flags {

> +	SLI4_INIT_VFI_FLAG_VP	= 0x1000,

> +	SLI4_INIT_VFI_FLAG_VF	= 0x2000,

> +	SLI4_INIT_VFI_FLAG_VT	= 0x4000,

> +	SLI4_INIT_VFI_FLAG_VR	= 0x8000,

> +

> +	SLI4_INIT_VFI_VFID	= 0x1fff,

> +	SLI4_INIT_VFI_PRI	= 0xe000,

> +

> +	SLI4_INIT_VFI_HOP_COUNT = 0xff000000,

> +};

> +

> +struct sli4_cmd_init_vfi {

> +	struct sli4_mbox_command_header	hdr;

> +	__le16		vfi;

> +	__le16		flags0_word;

> +	__le16		fcfi;

> +	__le16		vpi;

> +	__le32		vf_id_pri_dword;

> +	__le32		hop_cnt_dword;

> +};

> +

> +/* INIT_VPI - initialize the VPI resource */

> +struct sli4_cmd_init_vpi {

> +	struct sli4_mbox_command_header	hdr;

> +	__le16		vpi;

> +	__le16		vfi;

> +};

> +

> +/* POST_XRI - post XRI resources to the SLI Port */

> +enum sli4_post_xri_flags {

> +	SLI4_POST_XRI_COUNT	= 0xfff,

> +	SLI4_POST_XRI_FLAG_ENX	= 0x1000,

> +	SLI4_POST_XRI_FLAG_DL	= 0x2000,

> +	SLI4_POST_XRI_FLAG_DI	= 0x4000,

> +	SLI4_POST_XRI_FLAG_VAL	= 0x8000,

> +};

> +

> +struct sli4_cmd_post_xri {

> +	struct sli4_mbox_command_header	hdr;

> +	__le16		xri_base;

> +	__le16		xri_count_flags;

> +};

> +

> +/* RELEASE_XRI - Release XRI resources from the SLI Port */

> +enum sli4_release_xri_flags {

> +	SLI4_RELEASE_XRI_REL_XRI_CNT	= 0x1f,

> +	SLI4_RELEASE_XRI_COUNT		= 0x1f,

> +};

> +

> +struct sli4_cmd_release_xri {

> +	struct sli4_mbox_command_header	hdr;

> +	__le16		rel_xri_count_word;

> +	__le16		xri_count_word;

> +

> +	struct {

> +		__le16	xri_tag0;

> +		__le16	xri_tag1;

> +	} xri_tbl[62];

> +};

> +

> +/* READ_CONFIG - read SLI port configuration parameters */

> +struct sli4_cmd_read_config {

> +	struct sli4_mbox_command_header	hdr;

> +};

> +

> +enum sli4_read_cfg_resp_flags {

> +	SLI4_READ_CFG_RESP_RESOURCE_EXT = 0x80000000,	/* DW1 */

> +	SLI4_READ_CFG_RESP_TOPOLOGY	= 0xff000000,	/* DW2 */

> +};

> +

> +enum sli4_read_cfg_topo {

> +	SLI4_READ_CFG_TOPO_FC		= 0x1,	/* FC topology unknown */

> +	SLI4_READ_CFG_TOPO_FC_DA	= 0x2,	/* FC Direct Attach */

> +	SLI4_READ_CFG_TOPO_FC_AL	= 0x3,	/* FC-AL topology */

> +};


One should settle on common names for the topology; see further down.

> +

> +struct sli4_rsp_read_config {

> +	struct sli4_mbox_command_header	hdr;

> +	__le32		ext_dword;

> +	__le32		topology_dword;

> +	__le32		resvd8;

> +	__le16		e_d_tov;

> +	__le16		resvd14;

> +	__le32		resvd16;

> +	__le16		r_a_tov;

> +	__le16		resvd22;

> +	__le32		resvd24;

> +	__le32		resvd28;

> +	__le16		lmt;

> +	__le16		resvd34;

> +	__le32		resvd36;

> +	__le32		resvd40;

> +	__le16		xri_base;

> +	__le16		xri_count;

> +	__le16		rpi_base;

> +	__le16		rpi_count;

> +	__le16		vpi_base;

> +	__le16		vpi_count;

> +	__le16		vfi_base;

> +	__le16		vfi_count;

> +	__le16		resvd60;

> +	__le16		fcfi_count;

> +	__le16		rq_count;

> +	__le16		eq_count;

> +	__le16		wq_count;

> +	__le16		cq_count;

> +	__le32		pad[45];

> +};

> +

> +/* READ_NVPARMS - read SLI port configuration parameters */

> +enum sli4_read_nvparms_flags {

> +	SLI4_READ_NVPARAMS_HARD_ALPA	  = 0xff,

> +	SLI4_READ_NVPARAMS_PREFERRED_D_ID = 0xffffff00,

> +};

> +

> +struct sli4_cmd_read_nvparms {

> +	struct sli4_mbox_command_header	hdr;

> +	__le32		resvd0;

> +	__le32		resvd4;

> +	__le32		resvd8;

> +	__le32		resvd12;

> +	u8		wwpn[8];

> +	u8		wwnn[8];

> +	__le32		hard_alpa_d_id;

> +};

> +

> +/* WRITE_NVPARMS - write SLI port configuration parameters */

> +struct sli4_cmd_write_nvparms {

> +	struct sli4_mbox_command_header	hdr;

> +	__le32		resvd0;

> +	__le32		resvd4;

> +	__le32		resvd8;

> +	__le32		resvd12;

> +	u8		wwpn[8];

> +	u8		wwnn[8];

> +	__le32		hard_alpa_d_id;

> +};

> +

> +/* READ_REV - read the Port revision levels */

> +enum {

> +	SLI4_READ_REV_FLAG_SLI_LEVEL	= 0xf,

> +	SLI4_READ_REV_FLAG_FCOEM	= 0x10,

> +	SLI4_READ_REV_FLAG_CEEV		= 0x60,

> +	SLI4_READ_REV_FLAG_VPD		= 0x2000,

> +

> +	SLI4_READ_REV_AVAILABLE_LENGTH	= 0xffffff,

> +};

> +

> +struct sli4_cmd_read_rev {

> +	struct sli4_mbox_command_header	hdr;

> +	__le16			resvd0;

> +	__le16			flags0_word;

> +	__le32			first_hw_rev;

> +	__le32			second_hw_rev;

> +	__le32			resvd12;

> +	__le32			third_hw_rev;

> +	u8			fc_ph_low;

> +	u8			fc_ph_high;

> +	u8			feature_level_low;

> +	u8			feature_level_high;

> +	__le32			resvd24;

> +	__le32			first_fw_id;

> +	u8			first_fw_name[16];

> +	__le32			second_fw_id;

> +	u8			second_fw_name[16];

> +	__le32			rsvd18[30];

> +	__le32			available_length_dword;

> +	struct sli4_dmaaddr	hostbuf;

> +	__le32			returned_vpd_length;

> +	__le32			actual_vpd_length;

> +};

> +

> +/* READ_SPARM64 - read the Port service parameters */

> +#define SLI4_READ_SPARM64_WWPN_OFFSET	(4 * sizeof(u32))

> +#define SLI4_READ_SPARM64_WWNN_OFFSET	(6 * sizeof(u32))

> +

> +struct sli4_cmd_read_sparm64 {

> +	struct sli4_mbox_command_header hdr;

> +	__le32			resvd0;

> +	__le32			resvd4;

> +	struct sli4_bde		bde_64;

> +	__le16			vpi;

> +	__le16			resvd22;

> +	__le16			port_name_start;

> +	__le16			port_name_len;

> +	__le16			node_name_start;

> +	__le16			node_name_len;

> +};

> +

> +/* READ_TOPOLOGY - read the link event information */

> +enum sli4_read_topo_e {

> +	SLI4_READTOPO_ATTEN_TYPE	= 0xff,

> +	SLI4_READTOPO_FLAG_IL		= 0x100,

> +	SLI4_READTOPO_FLAG_PB_RECVD	= 0x200,

> +

> +	SLI4_READTOPO_LINKSTATE_RECV	= 0x3,

> +	SLI4_READTOPO_LINKSTATE_TRANS	= 0xc,

> +	SLI4_READTOPO_LINKSTATE_MACHINE	= 0xf0,

> +	SLI4_READTOPO_LINKSTATE_SPEED	= 0xff00,

> +	SLI4_READTOPO_LINKSTATE_TF	= 0x40000000,

> +	SLI4_READTOPO_LINKSTATE_LU	= 0x80000000,

> +

> +	SLI4_READTOPO_SCN_BBSCN		= 0xf,

> +	SLI4_READTOPO_SCN_CBBSCN	= 0xf0,

> +

> +	SLI4_READTOPO_R_T_TOV		= 0x1ff,

> +	SLI4_READTOPO_AL_TOV		= 0xf000,

> +

> +	SLI4_READTOPO_PB_FLAG		= 0x80,

> +

> +	SLI4_READTOPO_INIT_N_PORTID	= 0xffffff,

> +};

> +

> +#define SLI4_MIN_LOOP_MAP_BYTES	128

> +

> +struct sli4_cmd_read_topology {

> +	struct sli4_mbox_command_header	hdr;

> +	__le32			event_tag;

> +	__le32			dw2_attentype;

> +	u8			topology;

> +	u8			lip_type;

> +	u8			lip_al_ps;

> +	u8			al_pa_granted;

> +	struct sli4_bde		bde_loop_map;

> +	__le32			linkdown_state;

> +	__le32			currlink_state;

> +	u8			max_bbc;

> +	u8			init_bbc;

> +	u8			scn_flags;

> +	u8			rsvd39;

> +	__le16			dw10w0_al_rt_tov;

> +	__le16			lp_tov;

> +	u8			acquired_al_pa;

> +	u8			pb_flags;

> +	__le16			specified_al_pa;

> +	__le32			dw12_init_n_port_id;

> +};

> +

> +enum sli4_read_topo_link {

> +	SLI4_READ_TOPOLOGY_LINK_UP	= 0x1,

> +	SLI4_READ_TOPOLOGY_LINK_DOWN,

> +	SLI4_READ_TOPOLOGY_LINK_NO_ALPA,

> +};

> +

> +enum sli4_read_topo {

> +	SLI4_READ_TOPOLOGY_UNKNOWN	= 0x0,

> +	SLI4_READ_TOPOLOGY_NPORT,

> +	SLI4_READ_TOPOLOGY_FC_AL,

> +};

> +


Can we have some common wording on how to describe the topology?
In sli4_init_link we have 'F_P2P' and 'F_FCAL'.
In sli4_read_cfg_type we have 'TOPO_FC_DA' and 'TOPO_FC_AL'.
Here we have 'TOPOLOGY_NPORT' and 'TOPOLOGY_FC_AL'.
So is 'P2P' identical to 'DA'? Or are these different?
And is 'DA' (which presumeably stands for 'direct attach') the _actual_ 
direct attach (ie no switch present), or does a connection to a switch 
also count as 'direct attach'?
And what about 'NPort'; I was under the impression that nport was a port 
type, not a topology.

Can we please have some common naming scheme (and possibly a short 
comment what this actually is) to avoid the confusion here?

> +enum sli4_read_topo_speed {

> +	SLI4_READ_TOPOLOGY_SPEED_NONE	= 0x00,

> +	SLI4_READ_TOPOLOGY_SPEED_1G	= 0x04,

> +	SLI4_READ_TOPOLOGY_SPEED_2G	= 0x08,

> +	SLI4_READ_TOPOLOGY_SPEED_4G	= 0x10,

> +	SLI4_READ_TOPOLOGY_SPEED_8G	= 0x20,

> +	SLI4_READ_TOPOLOGY_SPEED_10G	= 0x40,

> +	SLI4_READ_TOPOLOGY_SPEED_16G	= 0x80,

> +	SLI4_READ_TOPOLOGY_SPEED_32G	= 0x90,

> +};

> +


In earlier enums the speed went up to 128G ...

> +/* REG_FCFI - activate a FC Forwarder */

> +struct sli4_cmd_reg_fcfi_rq_cfg {

> +	u8	r_ctl_mask;

> +	u8	r_ctl_match;

> +	u8	type_mask;

> +	u8	type_match;

> +};

> +

> +enum sli4_regfcfi_tag {

> +	SLI4_REGFCFI_VLAN_TAG		= 0xfff,

> +	SLI4_REGFCFI_VLANTAG_VALID	= 0x1000,

> +};

> +

> +#define SLI4_CMD_REG_FCFI_NUM_RQ_CFG	4

> +struct sli4_cmd_reg_fcfi {

> +	struct sli4_mbox_command_header	hdr;

> +	__le16		fcf_index;

> +	__le16		fcfi;

> +	__le16		rqid1;

> +	__le16		rqid0;

> +	__le16		rqid3;

> +	__le16		rqid2;

> +	struct sli4_cmd_reg_fcfi_rq_cfg

> +			rq_cfg[SLI4_CMD_REG_FCFI_NUM_RQ_CFG];

> +	__le32		dw8_vlan;

> +};

> +

> +#define SLI4_CMD_REG_FCFI_MRQ_NUM_RQ_CFG	4

> +#define SLI4_CMD_REG_FCFI_MRQ_MAX_NUM_RQ	32

> +#define SLI4_CMD_REG_FCFI_SET_FCFI_MODE		0

> +#define SLI4_CMD_REG_FCFI_SET_MRQ_MODE		1

> +

> +enum sli4_reg_fcfi_mrq {

> +	SLI4_REGFCFI_MRQ_VLAN_TAG	= 0xfff,

> +	SLI4_REGFCFI_MRQ_VLANTAG_VALID	= 0x1000,

> +	SLI4_REGFCFI_MRQ_MODE		= 0x2000,

> +

> +	SLI4_REGFCFI_MRQ_MASK_NUM_PAIRS	= 0xff,

> +	SLI4_REGFCFI_MRQ_FILTER_BITMASK = 0xf00,

> +	SLI4_REGFCFI_MRQ_RQ_SEL_POLICY	= 0xf000,

> +};

> +

> +struct sli4_cmd_reg_fcfi_mrq {

> +	struct sli4_mbox_command_header	hdr;

> +	__le16		fcf_index;

> +	__le16		fcfi;

> +	__le16		rqid1;

> +	__le16		rqid0;

> +	__le16		rqid3;

> +	__le16		rqid2;

> +	struct sli4_cmd_reg_fcfi_rq_cfg

> +			rq_cfg[SLI4_CMD_REG_FCFI_MRQ_NUM_RQ_CFG];

> +	__le32		dw8_vlan;

> +	__le32		dw9_mrqflags;

> +};

> +

> +struct sli4_cmd_rq_cfg {

> +	__le16	rq_id;

> +	u8	r_ctl_mask;

> +	u8	r_ctl_match;

> +	u8	type_mask;

> +	u8	type_match;

> +};

> +

> +/* REG_RPI - register a Remote Port Indicator */

> +enum sli4_reg_rpi {

> +	SLI4_REGRPI_REMOTE_N_PORTID	= 0xffffff,	/* DW2 */

> +	SLI4_REGRPI_UPD			= 0x1000000,

> +	SLI4_REGRPI_ETOW		= 0x8000000,

> +	SLI4_REGRPI_TERP		= 0x20000000,

> +	SLI4_REGRPI_CI			= 0x80000000,

> +};

> +

> +struct sli4_cmd_reg_rpi {

> +	struct sli4_mbox_command_header	hdr;

> +	__le16			rpi;

> +	__le16			rsvd2;

> +	__le32			dw2_rportid_flags;

> +	struct sli4_bde		bde_64;

> +	__le16			vpi;

> +	__le16			rsvd26;

> +};

> +

> +#define SLI4_REG_RPI_BUF_LEN		0x70

> +

> +/* REG_VFI - register a Virtual Fabric Indicator */

> +enum sli_reg_vfi {

> +	SLI4_REGVFI_VP			= 0x1000,	/* DW1 */

> +	SLI4_REGVFI_UPD			= 0x2000,

> +

> +	SLI4_REGVFI_LOCAL_N_PORTID	= 0xffffff,	/* DW10 */

> +};

> +

> +struct sli4_cmd_reg_vfi {

> +	struct sli4_mbox_command_header	hdr;

> +	__le16			vfi;

> +	__le16			dw0w1_flags;

> +	__le16			fcfi;

> +	__le16			vpi;

> +	u8			wwpn[8];

> +	struct sli4_bde		sparm;

> +	__le32			e_d_tov;

> +	__le32			r_a_tov;

> +	__le32			dw10_lportid_flags;

> +};

> +

> +/* REG_VPI - register a Virtual Port Indicator */

> +enum sli4_reg_vpi {

> +	SLI4_REGVPI_LOCAL_N_PORTID	= 0xffffff,

> +	SLI4_REGVPI_UPD			= 0x1000000,

> +};

> +

> +struct sli4_cmd_reg_vpi {

> +	struct sli4_mbox_command_header	hdr;

> +	__le32		rsvd0;

> +	__le32		dw2_lportid_flags;

> +	u8		wwpn[8];

> +	__le32		rsvd12;

> +	__le16		vpi;

> +	__le16		vfi;

> +};

> +

> +/* REQUEST_FEATURES - request / query SLI features */

> +enum sli4_req_features_flags {

> +	SLI4_REQFEAT_QRY	= 0x1,		/* Dw1 */

> +

> +	SLI4_REQFEAT_IAAB	= 1 << 0,	/* DW2 & DW3 */

> +	SLI4_REQFEAT_NPIV	= 1 << 1,

> +	SLI4_REQFEAT_DIF	= 1 << 2,

> +	SLI4_REQFEAT_VF		= 1 << 3,

> +	SLI4_REQFEAT_FCPI	= 1 << 4,

> +	SLI4_REQFEAT_FCPT	= 1 << 5,

> +	SLI4_REQFEAT_FCPC	= 1 << 6,

> +	SLI4_REQFEAT_RSVD	= 1 << 7,

> +	SLI4_REQFEAT_RQD	= 1 << 8,

> +	SLI4_REQFEAT_IAAR	= 1 << 9,

> +	SLI4_REQFEAT_HLM	= 1 << 10,

> +	SLI4_REQFEAT_PERFH	= 1 << 11,

> +	SLI4_REQFEAT_RXSEQ	= 1 << 12,

> +	SLI4_REQFEAT_RXRI	= 1 << 13,

> +	SLI4_REQFEAT_DCL2	= 1 << 14,

> +	SLI4_REQFEAT_RSCO	= 1 << 15,

> +	SLI4_REQFEAT_MRQP	= 1 << 16,

> +};

> +

> +struct sli4_cmd_request_features {

> +	struct sli4_mbox_command_header	hdr;

> +	__le32		dw1_qry;

> +	__le32		cmd;

> +	__le32		resp;

> +};

> +

> +/*

> + * SLI_CONFIG - submit a configuration command to Port

> + *

> + * Command is either embedded as part of the payload (embed) or located

> + * in a separate memory buffer (mem)

> + */

> +enum sli4_sli_config {

> +	SLI4_SLICONF_EMB		= 0x1,		/* DW1 */

> +	SLI4_SLICONF_PMDCMD_SHIFT	= 3,

> +	SLI4_SLICONF_PMDCMD_MASK	= 0xf8,

> +	SLI4_SLICONF_PMDCMD_VAL_1	= 8,

> +	SLI4_SLICONF_PMDCNT		= 0xf8,

> +

> +	SLI4_SLICONF_PMD_LEN		= 0x00ffffff,

> +};

> +

> +struct sli4_cmd_sli_config {

> +	struct sli4_mbox_command_header	hdr;

> +	__le32		dw1_flags;

> +	__le32		payload_len;

> +	__le32		rsvd12[3];

> +	union {

> +		u8 embed[58 * sizeof(u32)];

> +		struct sli4_bufptr mem;

> +	} payload;

> +};

> +

> +/* READ_STATUS - read tx/rx status of a particular port */

> +#define SLI4_READSTATUS_CLEAR_COUNTERS	0x1

> +

> +struct sli4_cmd_read_status {

> +	struct sli4_mbox_command_header	hdr;

> +	__le32		dw1_flags;

> +	__le32		rsvd4;

> +	__le32		trans_kbyte_cnt;

> +	__le32		recv_kbyte_cnt;

> +	__le32		trans_frame_cnt;

> +	__le32		recv_frame_cnt;

> +	__le32		trans_seq_cnt;

> +	__le32		recv_seq_cnt;

> +	__le32		tot_exchanges_orig;

> +	__le32		tot_exchanges_resp;

> +	__le32		recv_p_bsy_cnt;

> +	__le32		recv_f_bsy_cnt;

> +	__le32		no_rq_buf_dropped_frames_cnt;

> +	__le32		empty_rq_timeout_cnt;

> +	__le32		no_xri_dropped_frames_cnt;

> +	__le32		empty_xri_pool_cnt;

> +};

> +

> +/* READ_LNK_STAT - read link status of a particular port */

> +enum sli4_read_link_stats_flags {

> +	SLI4_READ_LNKSTAT_REC	= 1u << 0,

> +	SLI4_READ_LNKSTAT_GEC	= 1u << 1,

> +	SLI4_READ_LNKSTAT_W02OF	= 1u << 2,

> +	SLI4_READ_LNKSTAT_W03OF	= 1u << 3,

> +	SLI4_READ_LNKSTAT_W04OF	= 1u << 4,

> +	SLI4_READ_LNKSTAT_W05OF	= 1u << 5,

> +	SLI4_READ_LNKSTAT_W06OF	= 1u << 6,

> +	SLI4_READ_LNKSTAT_W07OF	= 1u << 7,

> +	SLI4_READ_LNKSTAT_W08OF	= 1u << 8,

> +	SLI4_READ_LNKSTAT_W09OF	= 1u << 9,

> +	SLI4_READ_LNKSTAT_W10OF = 1u << 10,

> +	SLI4_READ_LNKSTAT_W11OF = 1u << 11,

> +	SLI4_READ_LNKSTAT_W12OF	= 1u << 12,

> +	SLI4_READ_LNKSTAT_W13OF	= 1u << 13,

> +	SLI4_READ_LNKSTAT_W14OF	= 1u << 14,

> +	SLI4_READ_LNKSTAT_W15OF	= 1u << 15,

> +	SLI4_READ_LNKSTAT_W16OF	= 1u << 16,

> +	SLI4_READ_LNKSTAT_W17OF	= 1u << 17,

> +	SLI4_READ_LNKSTAT_W18OF	= 1u << 18,

> +	SLI4_READ_LNKSTAT_W19OF	= 1u << 19,

> +	SLI4_READ_LNKSTAT_W20OF	= 1u << 20,

> +	SLI4_READ_LNKSTAT_W21OF	= 1u << 21,

> +	SLI4_READ_LNKSTAT_CLRC	= 1u << 30,

> +	SLI4_READ_LNKSTAT_CLOF	= 1u << 31,

> +};

> +

> +struct sli4_cmd_read_link_stats {

> +	struct sli4_mbox_command_header	hdr;

> +	__le32	dw1_flags;

> +	__le32	linkfail_errcnt;

> +	__le32	losssync_errcnt;

> +	__le32	losssignal_errcnt;

> +	__le32	primseq_errcnt;

> +	__le32	inval_txword_errcnt;

> +	__le32	crc_errcnt;

> +	__le32	primseq_eventtimeout_cnt;

> +	__le32	elastic_bufoverrun_errcnt;

> +	__le32	arbit_fc_al_timeout_cnt;

> +	__le32	adv_rx_buftor_to_buf_credit;

> +	__le32	curr_rx_buf_to_buf_credit;

> +	__le32	adv_tx_buf_to_buf_credit;

> +	__le32	curr_tx_buf_to_buf_credit;

> +	__le32	rx_eofa_cnt;

> +	__le32	rx_eofdti_cnt;

> +	__le32	rx_eofni_cnt;

> +	__le32	rx_soff_cnt;

> +	__le32	rx_dropped_no_aer_cnt;

> +	__le32	rx_dropped_no_avail_rpi_rescnt;

> +	__le32	rx_dropped_no_avail_xri_rescnt;

> +};

> +

> +/* Format a WQE with WQ_ID Association performance hint */

> +static inline void

> +sli_set_wq_id_association(void *entry, u16 q_id)

> +{

> +	u32 *wqe = entry;

> +

> +	/*

> +	 * Set Word 10, bit 0 to zero

> +	 * Set Word 10, bits 15:1 to the WQ ID

> +	 */

> +	wqe[10] &= ~0xffff;

> +	wqe[10] |= q_id << 1;

> +}

> +

> +/* UNREG_FCFI - unregister a FCFI */

> +struct sli4_cmd_unreg_fcfi {

> +	struct sli4_mbox_command_header	hdr;

> +	__le32		rsvd0;

> +	__le16		fcfi;

> +	__le16		rsvd6;

> +};

> +

> +/* UNREG_RPI - unregister one or more RPI */

> +enum sli4_unreg_rpi {

> +	SLI4_UNREG_RPI_DP	= 0x2000,

> +	SLI4_UNREG_RPI_II_SHIFT	= 14,

> +	SLI4_UNREG_RPI_II_MASK	= 0xc000,

> +	SLI4_UNREG_RPI_II_RPI	= 0x0000,

> +	SLI4_UNREG_RPI_II_VPI	= 0x4000,

> +	SLI4_UNREG_RPI_II_VFI	= 0x8000,

> +	SLI4_UNREG_RPI_II_FCFI	= 0xc000,

> +

> +	SLI4_UNREG_RPI_DEST_N_PORTID_MASK = 0x00ffffff,

> +};

> +

> +struct sli4_cmd_unreg_rpi {

> +	struct sli4_mbox_command_header	hdr;

> +	__le16		index;

> +	__le16		dw1w1_flags;

> +	__le32		dw2_dest_n_portid;

> +};

> +

> +/* UNREG_VFI - unregister one or more VFI */

> +enum sli4_unreg_vfi {

> +	SLI4_UNREG_VFI_II_SHIFT	= 14,

> +	SLI4_UNREG_VFI_II_MASK	= 0xc000,

> +	SLI4_UNREG_VFI_II_VFI	= 0x0000,

> +	SLI4_UNREG_VFI_II_FCFI	= 0xc000,

> +};

> +

> +struct sli4_cmd_unreg_vfi {

> +	struct sli4_mbox_command_header	hdr;

> +	__le32		rsvd0;

> +	__le16		index;

> +	__le16		dw2_flags;

> +};

> +

> +enum sli4_unreg_type {

> +	SLI4_UNREG_TYPE_PORT,

> +	SLI4_UNREG_TYPE_DOMAIN,

> +	SLI4_UNREG_TYPE_FCF,

> +	SLI4_UNREG_TYPE_ALL

> +};

> +

> +/* UNREG_VPI - unregister one or more VPI */

> +enum sli4_unreg_vpi {

> +	SLI4_UNREG_VPI_II_SHIFT	= 14,

> +	SLI4_UNREG_VPI_II_MASK	= 0xc000,

> +	SLI4_UNREG_VPI_II_VPI	= 0x0000,

> +	SLI4_UNREG_VPI_II_VFI	= 0x8000,

> +	SLI4_UNREG_VPI_II_FCFI	= 0xc000,

> +};

> +

> +struct sli4_cmd_unreg_vpi {

> +	struct sli4_mbox_command_header	hdr;

> +	__le32		rsvd0;

> +	__le16		index;

> +	__le16		dw2w0_flags;

> +};

> +

> +/* AUTO_XFER_RDY - Configure the auto-generate XFER-RDY feature */

> +struct sli4_cmd_config_auto_xfer_rdy {

> +	struct sli4_mbox_command_header	hdr;

> +	__le32		rsvd0;

> +	__le32		max_burst_len;

> +};

> +

> +#define SLI4_CONFIG_AUTO_XFERRDY_BLKSIZE	0xffff

> +

> +struct sli4_cmd_config_auto_xfer_rdy_hp {

> +	struct sli4_mbox_command_header	hdr;

> +	__le32		rsvd0;

> +	__le32		max_burst_len;

> +	__le32		dw3_esoc_flags;

> +	__le16		block_size;

> +	__le16		rsvd14;

> +};

> +

> +/*************************************************************************

> + * SLI-4 common configuration command formats and definitions

> + */

> +

> +/*

> + * Subsystem values.

> + */

> +enum sli4_subsystem {

> +	SLI4_SUBSYSTEM_COMMON	= 0x01,

> +	SLI4_SUBSYSTEM_LOWLEVEL	= 0x0b,

> +	SLI4_SUBSYSTEM_FC	= 0x0c,

> +	SLI4_SUBSYSTEM_DMTF	= 0x11,

> +};

> +

> +#define	SLI4_OPC_LOWLEVEL_SET_WATCHDOG		0X36

> +

> +/*

> + * Common opcode (OPC) values.

> + */

> +enum sli4_cmn_opcode {

> +	SLI4_CMN_FUNCTION_RESET		= 0x3d,

> +	SLI4_CMN_CREATE_CQ		= 0x0c,

> +	SLI4_CMN_CREATE_CQ_SET		= 0x1d,

> +	SLI4_CMN_DESTROY_CQ		= 0x36,

> +	SLI4_CMN_MODIFY_EQ_DELAY	= 0x29,

> +	SLI4_CMN_CREATE_EQ		= 0x0d,

> +	SLI4_CMN_DESTROY_EQ		= 0x37,

> +	SLI4_CMN_CREATE_MQ_EXT		= 0x5a,

> +	SLI4_CMN_DESTROY_MQ		= 0x35,

> +	SLI4_CMN_GET_CNTL_ATTRIBUTES	= 0x20,

> +	SLI4_CMN_NOP			= 0x21,

> +	SLI4_CMN_GET_RSC_EXTENT_INFO	= 0x9a,

> +	SLI4_CMN_GET_SLI4_PARAMS	= 0xb5,

> +	SLI4_CMN_QUERY_FW_CONFIG	= 0x3a,

> +	SLI4_CMN_GET_PORT_NAME		= 0x4d,

> +

> +	SLI4_CMN_WRITE_FLASHROM		= 0x07,

> +	/* TRANSCEIVER Data */

> +	SLI4_CMN_READ_TRANS_DATA	= 0x49,

> +	SLI4_CMN_GET_CNTL_ADDL_ATTRS	= 0x79,

> +	SLI4_CMN_GET_FUNCTION_CFG	= 0xa0,

> +	SLI4_CMN_GET_PROFILE_CFG	= 0xa4,

> +	SLI4_CMN_SET_PROFILE_CFG	= 0xa5,

> +	SLI4_CMN_GET_PROFILE_LIST	= 0xa6,

> +	SLI4_CMN_GET_ACTIVE_PROFILE	= 0xa7,

> +	SLI4_CMN_SET_ACTIVE_PROFILE	= 0xa8,

> +	SLI4_CMN_READ_OBJECT		= 0xab,

> +	SLI4_CMN_WRITE_OBJECT		= 0xac,

> +	SLI4_CMN_DELETE_OBJECT		= 0xae,

> +	SLI4_CMN_READ_OBJECT_LIST	= 0xad,

> +	SLI4_CMN_SET_DUMP_LOCATION	= 0xb8,

> +	SLI4_CMN_SET_FEATURES		= 0xbf,

> +	SLI4_CMN_GET_RECFG_LINK_INFO	= 0xc9,

> +	SLI4_CMN_SET_RECNG_LINK_ID	= 0xca,

> +};

> +

> +/* DMTF opcode (OPC) values */

> +#define DMTF_EXEC_CLP_CMD 0x01

> +

> +/*

> + * COMMON_FUNCTION_RESET

> + *

> + * Resets the Port, returning it to a power-on state. This configuration

> + * command does not have a payload and should set/expect the lengths to

> + * be zero.

> + */

> +struct sli4_rqst_cmn_function_reset {

> +	struct sli4_rqst_hdr	hdr;

> +};

> +

> +struct sli4_rsp_cmn_function_reset {

> +	struct sli4_rsp_hdr	hdr;

> +};

> +

> +

> +/*

> + * COMMON_GET_CNTL_ATTRIBUTES

> + *

> + * Query for information about the SLI Port

> + */

> +enum sli4_cntrl_attr_flags {

> +	SLI4_CNTL_ATTR_PORTNUM	= 0x3f,

> +	SLI4_CNTL_ATTR_PORTTYPE	= 0xc0,

> +};

> +

> +struct sli4_rsp_cmn_get_cntl_attributes {

> +	struct sli4_rsp_hdr	hdr;

> +	u8		version_str[32];

> +	u8		manufacturer_name[32];

> +	__le32		supported_modes;

> +	u8		eprom_version_lo;

> +	u8		eprom_version_hi;

> +	__le16		rsvd17;

> +	__le32		mbx_ds_version;

> +	__le32		ep_fw_ds_version;

> +	u8		ncsi_version_str[12];

> +	__le32		def_extended_timeout;

> +	u8		model_number[32];

> +	u8		description[64];

> +	u8		serial_number[32];

> +	u8		ip_version_str[32];

> +	u8		fw_version_str[32];

> +	u8		bios_version_str[32];

> +	u8		redboot_version_str[32];

> +	u8		driver_version_str[32];

> +	u8		fw_on_flash_version_str[32];

> +	__le32		functionalities_supported;

> +	__le16		max_cdb_length;

> +	u8		asic_revision;

> +	u8		generational_guid0;

> +	__le32		generational_guid1_12[3];

> +	__le16		generational_guid13_14;

> +	u8		generational_guid15;

> +	u8		hba_port_count;

> +	__le16		default_link_down_timeout;

> +	u8		iscsi_version_min_max;

> +	u8		multifunctional_device;

> +	u8		cache_valid;

> +	u8		hba_status;

> +	u8		max_domains_supported;

> +	u8		port_num_type_flags;

> +	__le32		firmware_post_status;

> +	__le32		hba_mtu;

> +	u8		iscsi_features;

> +	u8		rsvd121[3];

> +	__le16		pci_vendor_id;

> +	__le16		pci_device_id;

> +	__le16		pci_sub_vendor_id;

> +	__le16		pci_sub_system_id;

> +	u8		pci_bus_number;

> +	u8		pci_device_number;

> +	u8		pci_function_number;

> +	u8		interface_type;

> +	__le64		unique_identifier;

> +	u8		number_of_netfilters;

> +	u8		rsvd122[3];

> +};

> +

> +/*

> + * COMMON_GET_CNTL_ATTRIBUTES

> + *

> + * This command queries the controller information from the Flash ROM.

> + */

> +struct sli4_rqst_cmn_get_cntl_addl_attributes {

> +	struct sli4_rqst_hdr	hdr;

> +};

> +

> +struct sli4_rsp_cmn_get_cntl_addl_attributes {

> +	struct sli4_rsp_hdr	hdr;

> +	__le16		ipl_file_number;

> +	u8		ipl_file_version;

> +	u8		rsvd4;

> +	u8		on_die_temperature;

> +	u8		rsvd5[3];

> +	__le32		driver_advanced_features_supported;

> +	__le32		rsvd7[4];

> +	char		universal_bios_version[32];

> +	char		x86_bios_version[32];

> +	char		efi_bios_version[32];

> +	char		fcode_version[32];

> +	char		uefi_bios_version[32];

> +	char		uefi_nic_version[32];

> +	char		uefi_fcode_version[32];

> +	char		uefi_iscsi_version[32];

> +	char		iscsi_x86_bios_version[32];

> +	char		pxe_x86_bios_version[32];

> +	u8		default_wwpn[8];

> +	u8		ext_phy_version[32];

> +	u8		fc_universal_bios_version[32];

> +	u8		fc_x86_bios_version[32];

> +	u8		fc_efi_bios_version[32];

> +	u8		fc_fcode_version[32];

> +	u8		ext_phy_crc_label[8];

> +	u8		ipl_file_name[16];

> +	u8		rsvd139[72];

> +};

> +

> +/*

> + * COMMON_NOP

> + *

> + * This command does not do anything; it only returns

> + * the payload in the completion.

> + */

> +struct sli4_rqst_cmn_nop {

> +	struct sli4_rqst_hdr	hdr;

> +	__le32			context[2];

> +};

> +

> +struct sli4_rsp_cmn_nop {

> +	struct sli4_rsp_hdr	hdr;

> +	__le32			context[2];

> +};

> +

> +struct sli4_rqst_cmn_get_resource_extent_info {

> +	struct sli4_rqst_hdr	hdr;

> +	__le16	resource_type;

> +	__le16	rsvd16;

> +};

> +

> +enum sli4_rsc_type {

> +	SLI4_RSC_TYPE_VFI	= 0x20,

> +	SLI4_RSC_TYPE_VPI	= 0x21,

> +	SLI4_RSC_TYPE_RPI	= 0x22,

> +	SLI4_RSC_TYPE_XRI	= 0x23,

> +};

> +

> +struct sli4_rsp_cmn_get_resource_extent_info {

> +	struct sli4_rsp_hdr	hdr;

> +	__le16		resource_extent_count;

> +	__le16		resource_extent_size;

> +};

> +

> +#define SLI4_128BYTE_WQE_SUPPORT	0x02

> +

> +#define GET_Q_CNT_METHOD(m) \

> +	(((m) & SLI4_PARAM_Q_CNT_MTHD_MASK) >> SLI4_PARAM_Q_CNT_MTHD_SHFT)

> +#define GET_Q_CREATE_VERSION(v) \

> +	(((v) & SLI4_PARAM_QV_MASK) >> SLI4_PARAM_QV_SHIFT)

> +

> +enum sli4_rsp_get_params_e {

> +	/*GENERIC*/

> +	SLI4_PARAM_Q_CNT_MTHD_SHFT	= 24,

> +	SLI4_PARAM_Q_CNT_MTHD_MASK	= 0xf << 24,

> +	SLI4_PARAM_QV_SHIFT		= 14,

> +	SLI4_PARAM_QV_MASK		= 3 << 14,

> +

> +	/* DW4 */

> +	SLI4_PARAM_PROTO_TYPE_MASK	= 0xff,

> +	/* DW5 */

> +	SLI4_PARAM_FT			= 1 << 0,

> +	SLI4_PARAM_SLI_REV_MASK		= 0xf << 4,

> +	SLI4_PARAM_SLI_FAM_MASK		= 0xf << 8,

> +	SLI4_PARAM_IF_TYPE_MASK		= 0xf << 12,

> +	SLI4_PARAM_SLI_HINT1_MASK	= 0xff << 16,

> +	SLI4_PARAM_SLI_HINT2_MASK	= 0x1f << 24,

> +	/* DW6 */

> +	SLI4_PARAM_EQ_PAGE_CNT_MASK	= 0xf << 0,

> +	SLI4_PARAM_EQE_SZS_MASK		= 0xf << 8,

> +	SLI4_PARAM_EQ_PAGE_SZS_MASK	= 0xff << 16,

> +	/* DW8 */

> +	SLI4_PARAM_CQ_PAGE_CNT_MASK	= 0xf << 0,

> +	SLI4_PARAM_CQE_SZS_MASK		= 0xf << 8,

> +	SLI4_PARAM_CQ_PAGE_SZS_MASK	= 0xff << 16,

> +	/* DW10 */

> +	SLI4_PARAM_MQ_PAGE_CNT_MASK	= 0xf << 0,

> +	SLI4_PARAM_MQ_PAGE_SZS_MASK	= 0xff << 16,

> +	/* DW12 */

> +	SLI4_PARAM_WQ_PAGE_CNT_MASK	= 0xf << 0,

> +	SLI4_PARAM_WQE_SZS_MASK		= 0xf << 8,

> +	SLI4_PARAM_WQ_PAGE_SZS_MASK	= 0xff << 16,

> +	/* DW14 */

> +	SLI4_PARAM_RQ_PAGE_CNT_MASK	= 0xf << 0,

> +	SLI4_PARAM_RQE_SZS_MASK		= 0xf << 8,

> +	SLI4_PARAM_RQ_PAGE_SZS_MASK	= 0xff << 16,

> +	/* DW15W1*/

> +	SLI4_PARAM_RQ_DB_WINDOW_MASK	= 0xf000,

> +	/* DW16 */

> +	SLI4_PARAM_FC			= 1 << 0,

> +	SLI4_PARAM_EXT			= 1 << 1,

> +	SLI4_PARAM_HDRR			= 1 << 2,

> +	SLI4_PARAM_SGLR			= 1 << 3,

> +	SLI4_PARAM_FBRR			= 1 << 4,

> +	SLI4_PARAM_AREG			= 1 << 5,

> +	SLI4_PARAM_TGT			= 1 << 6,

> +	SLI4_PARAM_TERP			= 1 << 7,

> +	SLI4_PARAM_ASSI			= 1 << 8,

> +	SLI4_PARAM_WCHN			= 1 << 9,

> +	SLI4_PARAM_TCCA			= 1 << 10,

> +	SLI4_PARAM_TRTY			= 1 << 11,

> +	SLI4_PARAM_TRIR			= 1 << 12,

> +	SLI4_PARAM_PHOFF		= 1 << 13,

> +	SLI4_PARAM_PHON			= 1 << 14,

> +	SLI4_PARAM_PHWQ			= 1 << 15,

> +	SLI4_PARAM_BOUND_4GA		= 1 << 16,

> +	SLI4_PARAM_RXC			= 1 << 17,

> +	SLI4_PARAM_HLM			= 1 << 18,

> +	SLI4_PARAM_IPR			= 1 << 19,

> +	SLI4_PARAM_RXRI			= 1 << 20,

> +	SLI4_PARAM_SGLC			= 1 << 21,

> +	SLI4_PARAM_TIMM			= 1 << 22,

> +	SLI4_PARAM_TSMM			= 1 << 23,

> +	SLI4_PARAM_OAS			= 1 << 25,

> +	SLI4_PARAM_LC			= 1 << 26,

> +	SLI4_PARAM_AGXF			= 1 << 27,

> +	SLI4_PARAM_LOOPBACK_MASK	= 0xf << 28,

> +	/* DW18 */

> +	SLI4_PARAM_SGL_PAGE_CNT_MASK	= 0xf << 0,

> +	SLI4_PARAM_SGL_PAGE_SZS_MASK	= 0xff << 8,

> +	SLI4_PARAM_SGL_PP_ALIGN_MASK	= 0xff << 16,

> +};

> +

> +struct sli4_rqst_cmn_get_sli4_params {

> +	struct sli4_rqst_hdr	hdr;

> +};

> +

> +struct sli4_rsp_cmn_get_sli4_params {

> +	struct sli4_rsp_hdr	hdr;

> +	__le32		dw4_protocol_type;

> +	__le32		dw5_sli;

> +	__le32		dw6_eq_page_cnt;

> +	__le16		eqe_count_mask;

> +	__le16		rsvd26;

> +	__le32		dw8_cq_page_cnt;

> +	__le16		cqe_count_mask;

> +	__le16		rsvd34;

> +	__le32		dw10_mq_page_cnt;

> +	__le16		mqe_count_mask;

> +	__le16		rsvd42;

> +	__le32		dw12_wq_page_cnt;

> +	__le16		wqe_count_mask;

> +	__le16		rsvd50;

> +	__le32		dw14_rq_page_cnt;

> +	__le16		rqe_count_mask;

> +	__le16		dw15w1_rq_db_window;

> +	__le32		dw16_loopback_scope;

> +	__le32		sge_supported_length;

> +	__le32		dw18_sgl_page_cnt;

> +	__le16		min_rq_buffer_size;

> +	__le16		rsvd75;

> +	__le32		max_rq_buffer_size;

> +	__le16		physical_xri_max;

> +	__le16		physical_rpi_max;

> +	__le16		physical_vpi_max;

> +	__le16		physical_vfi_max;

> +	__le32		rsvd88;

> +	__le16		frag_num_field_offset;

> +	__le16		frag_num_field_size;

> +	__le16		sgl_index_field_offset;

> +	__le16		sgl_index_field_size;

> +	__le32		chain_sge_initial_value_lo;

> +	__le32		chain_sge_initial_value_hi;

> +};

> +

> +/*Port Types*/

> +enum sli4_port_types {

> +	SLI4_PORT_TYPE_ETH	= 0,

> +	SLI4_PORT_TYPE_FC	= 1,

> +};

> +

> +struct sli4_rqst_cmn_get_port_name {

> +	struct sli4_rqst_hdr	hdr;

> +	u8	port_type;

> +	u8	rsvd4[3];

> +};

> +

> +struct sli4_rsp_cmn_get_port_name {

> +	struct sli4_rsp_hdr	hdr;

> +	char	port_name[4];

> +};

> +

> +struct sli4_rqst_cmn_write_flashrom {

> +	struct sli4_rqst_hdr	hdr;

> +	__le32		flash_rom_access_opcode;

> +	__le32		flash_rom_access_operation_type;

> +	__le32		data_buffer_size;

> +	__le32		offset;

> +	u8		data_buffer[4];

> +};

> +

> +/*

> + * COMMON_READ_TRANSCEIVER_DATA

> + *

> + * This command reads SFF transceiver data(Format is defined

> + * by the SFF-8472 specification).

> + */

> +struct sli4_rqst_cmn_read_transceiver_data {

> +	struct sli4_rqst_hdr	hdr;

> +	__le32			page_number;

> +	__le32			port;

> +};

> +

> +struct sli4_rsp_cmn_read_transceiver_data {

> +	struct sli4_rsp_hdr	hdr;

> +	__le32			page_number;

> +	__le32			port;

> +	u8			page_data[128];

> +	u8			page_data_2[128];

> +};

> +

> +#define SLI4_REQ_DESIRE_READLEN		0xffffff

> +

> +struct sli4_rqst_cmn_read_object {

> +	struct sli4_rqst_hdr	hdr;

> +	__le32			desired_read_length_dword;

> +	__le32			read_offset;

> +	u8			object_name[104];

> +	__le32			host_buffer_descriptor_count;

> +	struct sli4_bde		host_buffer_descriptor[0];

> +};

> +

> +#define RSP_COM_READ_OBJ_EOF		0x80000000

> +

> +struct sli4_rsp_cmn_read_object {

> +	struct sli4_rsp_hdr	hdr;

> +	__le32			actual_read_length;

> +	__le32			eof_dword;

> +};

> +

> +enum sli4_rqst_write_object_flags {

> +	SLI4_RQ_DES_WRITE_LEN		= 0xffffff,

> +	SLI4_RQ_DES_WRITE_LEN_NOC	= 0x40000000,

> +	SLI4_RQ_DES_WRITE_LEN_EOF	= 0x80000000,

> +};

> +

> +struct sli4_rqst_cmn_write_object {

> +	struct sli4_rqst_hdr	hdr;

> +	__le32			desired_write_len_dword;

> +	__le32			write_offset;

> +	u8			object_name[104];

> +	__le32			host_buffer_descriptor_count;

> +	struct sli4_bde		host_buffer_descriptor[0];

> +};

> +

> +#define	RSP_CHANGE_STATUS		0xff

> +

> +struct sli4_rsp_cmn_write_object {

> +	struct sli4_rsp_hdr	hdr;

> +	__le32			actual_write_length;

> +	__le32			change_status_dword;

> +};

> +

> +struct sli4_rqst_cmn_delete_object {

> +	struct sli4_rqst_hdr	hdr;

> +	__le32			rsvd4;

> +	__le32			rsvd5;

> +	u8			object_name[104];

> +};

> +

> +#define SLI4_RQ_OBJ_LIST_READ_LEN	0xffffff

> +

> +struct sli4_rqst_cmn_read_object_list {

> +	struct sli4_rqst_hdr	hdr;

> +	__le32			desired_read_length_dword;

> +	__le32			read_offset;

> +	u8			object_name[104];

> +	__le32			host_buffer_descriptor_count;

> +	struct sli4_bde		host_buffer_descriptor[0];

> +};

> +

> +enum sli4_rqst_set_dump_flags {

> +	SLI4_CMN_SET_DUMP_BUFFER_LEN	= 0xffffff,

> +	SLI4_CMN_SET_DUMP_FDB		= 0x20000000,

> +	SLI4_CMN_SET_DUMP_BLP		= 0x40000000,

> +	SLI4_CMN_SET_DUMP_QRY		= 0x80000000,

> +};

> +

> +struct sli4_rqst_cmn_set_dump_location {

> +	struct sli4_rqst_hdr	hdr;

> +	__le32			buffer_length_dword;

> +	__le32			buf_addr_low;

> +	__le32			buf_addr_high;

> +};

> +

> +struct sli4_rsp_cmn_set_dump_location {

> +	struct sli4_rsp_hdr	hdr;

> +	__le32			buffer_length_dword;

> +};

> +

> +enum sli4_dump_level {

> +	SLI4_DUMP_LEVEL_NONE,

> +	SLI4_CHIP_LEVEL_DUMP,

> +	SLI4_FUNC_DESC_DUMP,

> +};

> +

> +enum sli4_dump_state {

> +	SLI4_DUMP_STATE_NONE,

> +	SLI4_CHIP_DUMP_STATE_VALID,

> +	SLI4_FUNC_DUMP_STATE_VALID,

> +};

> +

> +enum sli4_dump_status {

> +	SLI4_DUMP_READY_STATUS_NOT_READY,

> +	SLI4_DUMP_READY_STATUS_DD_PRESENT,

> +	SLI4_DUMP_READY_STATUS_FDB_PRESENT,

> +	SLI4_DUMP_READY_STATUS_SKIP_DUMP,

> +	SLI4_DUMP_READY_STATUS_FAILED = -1,

> +};

> +

> +enum sli4_set_features {

> +	SLI4_SET_FEATURES_DIF_SEED			= 0x01,

> +	SLI4_SET_FEATURES_XRI_TIMER			= 0x03,

> +	SLI4_SET_FEATURES_MAX_PCIE_SPEED		= 0x04,

> +	SLI4_SET_FEATURES_FCTL_CHECK			= 0x05,

> +	SLI4_SET_FEATURES_FEC				= 0x06,

> +	SLI4_SET_FEATURES_PCIE_RECV_DETECT		= 0x07,

> +	SLI4_SET_FEATURES_DIF_MEMORY_MODE		= 0x08,

> +	SLI4_SET_FEATURES_DISABLE_SLI_PORT_PAUSE_STATE	= 0x09,

> +	SLI4_SET_FEATURES_ENABLE_PCIE_OPTIONS		= 0x0a,

> +	SLI4_SET_FEAT_CFG_AUTO_XFER_RDY_T10PI		= 0x0c,

> +	SLI4_SET_FEATURES_ENABLE_MULTI_RECEIVE_QUEUE	= 0x0d,

> +	SLI4_SET_FEATURES_SET_FTD_XFER_HINT		= 0x0f,

> +	SLI4_SET_FEATURES_SLI_PORT_HEALTH_CHECK		= 0x11,

> +};

> +

> +struct sli4_rqst_cmn_set_features {

> +	struct sli4_rqst_hdr	hdr;

> +	__le32			feature;

> +	__le32			param_len;

> +	__le32			params[8];

> +};

> +

> +struct sli4_rqst_cmn_set_features_dif_seed {

> +	__le16		seed;

> +	__le16		rsvd16;

> +};

> +

> +enum sli4_rqst_set_mrq_features {

> +	SLI4_RQ_MULTIRQ_ISR		 = 0x1,

> +	SLI4_RQ_MULTIRQ_AUTOGEN_XFER_RDY = 0x2,

> +

> +	SLI4_RQ_MULTIRQ_NUM_RQS		 = 0xff,

> +	SLI4_RQ_MULTIRQ_RQ_SELECT	 = 0xf00,

> +};

> +

> +struct sli4_rqst_cmn_set_features_multirq {

> +	__le32		auto_gen_xfer_dword;

> +	__le32		num_rqs_dword;

> +};

> +

> +enum sli4_rqst_health_check_flags {

> +	SLI4_RQ_HEALTH_CHECK_ENABLE	= 0x1,

> +	SLI4_RQ_HEALTH_CHECK_QUERY	= 0x2,

> +};

> +

> +struct sli4_rqst_cmn_set_features_health_check {

> +	__le32		health_check_dword;

> +};

> +

> +struct sli4_rqst_cmn_set_features_set_fdt_xfer_hint {

> +	__le32		fdt_xfer_hint;

> +};

> +

> +struct sli4_rqst_dmtf_exec_clp_cmd {

> +	struct sli4_rqst_hdr	hdr;

> +	__le32			cmd_buf_length;

> +	__le32			resp_buf_length;

> +	__le32			cmd_buf_addr_low;

> +	__le32			cmd_buf_addr_high;

> +	__le32			resp_buf_addr_low;

> +	__le32			resp_buf_addr_high;

> +};

> +

> +struct sli4_rsp_dmtf_exec_clp_cmd {

> +	struct sli4_rsp_hdr	hdr;

> +	__le32			rsvd4;

> +	__le32			resp_length;

> +	__le32			rsvd6;

> +	__le32			rsvd7;

> +	__le32			rsvd8;

> +	__le32			rsvd9;

> +	__le32			clp_status;

> +	__le32			clp_detailed_status;

> +};

> +

> +#define SLI4_PROTOCOL_FC		0x10

> +#define SLI4_PROTOCOL_DEFAULT		0xff

> +

> +struct sli4_rspource_descriptor_v1 {

> +	u8		descriptor_type;

> +	u8		descriptor_length;

> +	__le16		rsvd16;

> +	__le32		type_specific[0];

> +};

> +

> +enum sli4_pcie_desc_flags {

> +	SLI4_PCIE_DESC_IMM		= 0x4000,

> +	SLI4_PCIE_DESC_NOSV		= 0x8000,

> +

> +	SLI4_PCIE_DESC_PF_NO		= 0x3ff0000,

> +

> +	SLI4_PCIE_DESC_MISSN_ROLE	= 0xff,

> +	SLI4_PCIE_DESC_PCHG		= 0x8000000,

> +	SLI4_PCIE_DESC_SCHG		= 0x10000000,

> +	SLI4_PCIE_DESC_XCHG		= 0x20000000,

> +	SLI4_PCIE_DESC_XROM		= 0xc0000000

> +};

> +

> +struct sli4_pcie_resource_descriptor_v1 {

> +	u8		descriptor_type;

> +	u8		descriptor_length;

> +	__le16		imm_nosv_dword;

> +	__le32		pf_number_dword;

> +	__le32		rsvd3;

> +	u8		sriov_state;

> +	u8		pf_state;

> +	u8		pf_type;

> +	u8		rsvd4;

> +	__le16		number_of_vfs;

> +	__le16		rsvd5;

> +	__le32		mission_roles_dword;

> +	__le32		rsvd7[16];

> +};

> +

> +struct sli4_rqst_cmn_get_function_config {

> +	struct sli4_rqst_hdr  hdr;

> +};

> +

> +struct sli4_rsp_cmn_get_function_config {

> +	struct sli4_rsp_hdr	hdr;

> +	__le32			desc_count;

> +	__le32			desc[54];

> +};

> +

> +/* Link Config Descriptor for link config functions */

> +struct sli4_link_config_descriptor {

> +	u8		link_config_id;

> +	u8		rsvd1[3];

> +	__le32		config_description[8];

> +};

> +

> +#define MAX_LINK_DES	10

> +

> +struct sli4_rqst_cmn_get_reconfig_link_info {

> +	struct sli4_rqst_hdr  hdr;

> +};

> +

> +struct sli4_rsp_cmn_get_reconfig_link_info {

> +	struct sli4_rsp_hdr	hdr;

> +	u8			active_link_config_id;

> +	u8			rsvd17;

> +	u8			next_link_config_id;

> +	u8			rsvd19;

> +	__le32			link_configuration_descriptor_count;

> +	struct sli4_link_config_descriptor

> +				desc[MAX_LINK_DES];

> +};

> +

> +enum sli4_set_reconfig_link_flags {

> +	SLI4_SET_RECONFIG_LINKID_NEXT	= 0xff,

> +	SLI4_SET_RECONFIG_LINKID_FD	= 1u << 31,

> +};

> +

> +struct sli4_rqst_cmn_set_reconfig_link_id {

> +	struct sli4_rqst_hdr  hdr;

> +	__le32			dw4_flags;

> +};

> +

> +struct sli4_rsp_cmn_set_reconfig_link_id {

> +	struct sli4_rsp_hdr	hdr;

> +};

> +

> +struct sli4_rqst_lowlevel_set_watchdog {

> +	struct sli4_rqst_hdr	hdr;

> +	__le16			watchdog_timeout;

> +	__le16			rsvd18;

> +};

> +

> +struct sli4_rsp_lowlevel_set_watchdog {

> +	struct sli4_rsp_hdr	hdr;

> +	__le32			rsvd;

> +};

> +

> +/* FC opcode (OPC) values */

> +enum sli4_fc_opcodes {

> +	SLI4_OPC_WQ_CREATE		= 0x1,

> +	SLI4_OPC_WQ_DESTROY		= 0x2,

> +	SLI4_OPC_POST_SGL_PAGES		= 0x3,

> +	SLI4_OPC_RQ_CREATE		= 0x5,

> +	SLI4_OPC_RQ_DESTROY		= 0x6,

> +	SLI4_OPC_READ_FCF_TABLE		= 0x8,

> +	SLI4_OPC_POST_HDR_TEMPLATES	= 0xb,

> +	SLI4_OPC_REDISCOVER_FCF		= 0x10,

> +};

> +

> +/* Use the default CQ associated with the WQ */

> +#define SLI4_CQ_DEFAULT 0xffff

> +

> +/*

> + * POST_SGL_PAGES

> + *

> + * Register the scatter gather list (SGL) memory and

> + * associate it with an XRI.

> + */

> +struct sli4_rqst_post_sgl_pages {

> +	struct sli4_rqst_hdr	hdr;

> +	__le16			xri_start;

> +	__le16			xri_count;

> +	struct {

> +		__le32		page0_low;

> +		__le32		page0_high;

> +		__le32		page1_low;

> +		__le32		page1_high;

> +	} page_set[10];

> +};

> +

> +struct sli4_rsp_post_sgl_pages {

> +	struct sli4_rsp_hdr	hdr;

> +};

> +

> +struct sli4_rqst_post_hdr_templates {

> +	struct sli4_rqst_hdr	hdr;

> +	__le16			rpi_offset;

> +	__le16			page_count;

> +	struct sli4_dmaaddr	page_descriptor[0];

> +};

> +

> +#define SLI4_HDR_TEMPLATE_SIZE		64

> +

> +enum sli4_io_flags {

> +/* The XRI associated with this IO is already active */

> +	SLI4_IO_CONTINUATION		= 1 << 0,

> +/* Automatically generate a good RSP frame */

> +	SLI4_IO_AUTO_GOOD_RESPONSE	= 1 << 1,

> +	SLI4_IO_NO_ABORT		= 1 << 2,

> +/* Set the DNRX bit because no auto xref rdy buffer is posted */

> +	SLI4_IO_DNRX			= 1 << 3,

> +};

> +

> +enum sli4_callback {

> +	SLI4_CB_LINK,

> +	SLI4_CB_MAX,

> +};

> +

> +enum sli4_link_status {

> +	SLI4_LINK_STATUS_UP,

> +	SLI4_LINK_STATUS_DOWN,

> +	SLI4_LINK_STATUS_NO_ALPA,

> +	SLI4_LINK_STATUS_MAX,

> +};

> +

> +enum sli4_link_topology {

> +	SLI4_LINK_TOPO_NPORT = 1,

> +	SLI4_LINK_TOPO_LOOP,

> +	SLI4_LINK_TOPO_LOOPBACK_INTERNAL,

> +	SLI4_LINK_TOPO_LOOPBACK_EXTERNAL,

> +	SLI4_LINK_TOPO_NONE,

> +	SLI4_LINK_TOPO_MAX,

> +};

> +


Oh, no. Not _another_ topology naming scheme ..

> +enum sli4_link_medium {

> +	SLI4_LINK_MEDIUM_ETHERNET,

> +	SLI4_LINK_MEDIUM_FC,

> +	SLI4_LINK_MEDIUM_MAX,

> +};

>   /******Driver specific structures******/

>   

>   struct sli4_queue {

> @@ -2074,4 +3586,116 @@ struct sli_fcp_tgt_params {

>   	u16		tag;

>   };

>   

> +struct sli4_link_event {

> +	enum sli4_link_status	status;

> +	enum sli4_link_topology	topology;

> +	enum sli4_link_medium	medium;

> +	u32			speed;

> +	u8			*loop_map;

> +	u32			fc_id;

> +};

> +

> +enum sli4_resource {

> +	SLI4_RSRC_VFI,

> +	SLI4_RSRC_VPI,

> +	SLI4_RSRC_RPI,

> +	SLI4_RSRC_XRI,

> +	SLI4_RSRC_FCFI,

> +	SLI4_RSRC_MAX,

> +};

> +

> +struct sli4_extent {

> +	u32		number;

> +	u32		size;

> +	u32		n_alloc;

> +	u32		*base;

> +	unsigned long	*use_map;

> +	u32		map_size;

> +};

> +

> +struct sli4_queue_info {

> +	u16	max_qcount[SLI4_QTYPE_MAX];

> +	u32	max_qentries[SLI4_QTYPE_MAX];

> +	u16	count_mask[SLI4_QTYPE_MAX];

> +	u16	count_method[SLI4_QTYPE_MAX];

> +	u32	qpage_count[SLI4_QTYPE_MAX];

> +};

> +

> +struct sli4_params {

> +	u8	has_extents;

> +	u8	auto_reg;

> +	u8	auto_xfer_rdy;

> +	u8	hdr_template_req;

> +	u8	perf_hint;

> +	u8	perf_wq_id_association;

> +	u8	cq_create_version;

> +	u8	mq_create_version;

> +	u8	high_login_mode;

> +	u8	sgl_pre_registered;

> +	u8	sgl_pre_reg_required;

> +	u8	t10_dif_inline_capable;

> +	u8	t10_dif_separate_capable;

> +};

> +

> +struct sli4 {

> +	void			*os;

> +	struct pci_dev		*pci;

> +	void __iomem		*reg[PCI_STD_NUM_BARS];

> +

> +	u32			sli_rev;

> +	u32			sli_family;

> +	u32			if_type;

> +

> +	u16			asic_type;

> +	u16			asic_rev;

> +

> +	u16			e_d_tov;

> +	u16			r_a_tov;

> +	struct sli4_queue_info	qinfo;

> +	u16			link_module_type;

> +	u8			rq_batch;

> +	u8			port_number;

> +	char			port_name[2];

> +	u16			rq_min_buf_size;

> +	u32			rq_max_buf_size;

> +	u8			topology;

> +	u8			wwpn[8];

> +	u8			wwnn[8];

> +	u32			fw_rev[2];

> +	u8			fw_name[2][16];

> +	char			ipl_name[16];

> +	u32			hw_rev[3];

> +	char			modeldesc[64];

> +	char			bios_version_string[32];

> +	u32			wqe_size;

> +	u32			vpd_length;

> +	/*

> +	 * Tracks the port resources using extents metaphor. For

> +	 * devices that don't implement extents (i.e.

> +	 * has_extents == FALSE), the code models each resource as

> +	 * a single large extent.

> +	 */

> +	struct sli4_extent	ext[SLI4_RSRC_MAX];

> +	u32			features;

> +	struct sli4_params	params;

> +	u32			sge_supported_length;

> +	u32			sgl_page_sizes;

> +	u32			max_sgl_pages;

> +

> +	/*

> +	 * Callback functions

> +	 */

> +	int			(*link)(void *ctx, void *event);

> +	void			*link_arg;

> +

> +	struct efc_dma		bmbx;

> +

> +	/* Save pointer to physical memory descriptor for non-embedded

> +	 * SLI_CONFIG commands for BMBX dumping purposes

> +	 */

> +	struct efc_dma		*bmbx_non_emb_pmd;

> +

> +	struct efc_dma		vpd_data;

> +};

> +

>   #endif /* !_SLI4_H */

> 

Cheers,

Hannes
-- 
Dr. Hannes Reinecke                Kernel Storage Architect
hare@suse.de                              +49 911 74053 688
SUSE Software Solutions GmbH, Maxfeldstr. 5, 90409 Nürnberg
HRB 36809 (AG Nürnberg), Geschäftsführer: Felix Imendörffer
diff mbox series

Patch

diff --git a/drivers/scsi/elx/libefc_sli/sli4.h b/drivers/scsi/elx/libefc_sli/sli4.h
index b63fca0c2dfe..2960a6cb082f 100644
--- a/drivers/scsi/elx/libefc_sli/sli4.h
+++ b/drivers/scsi/elx/libefc_sli/sli4.h
@@ -1983,6 +1983,1518 @@  enum sli4_els_cmd_type {
 	SLI4_ELS_REQUEST64_CMD_FABRIC		= 0x0d,
 };
 
+#define SLI_PAGE_SIZE				SZ_4K
+
+#define SLI4_BMBX_TIMEOUT_MSEC			30000
+#define SLI4_FW_READY_TIMEOUT_MSEC		30000
+
+#define SLI4_BMBX_DELAY_US			1000	/* 1 ms */
+#define SLI4_INIT_PORT_DELAY_US			10000	/* 10 ms */
+
+static inline u32
+sli_page_count(size_t bytes, u32 page_size)
+{
+	if (!page_size)
+		return 0;
+
+	return (bytes + (page_size - 1)) >> __ffs(page_size);
+}
+
+/*************************************************************************
+ * SLI-4 mailbox command formats and definitions
+ */
+
+struct sli4_mbox_command_header {
+	u8	resvd0;
+	u8	command;
+	__le16	status;	/* Port writes to indicate success/fail */
+};
+
+enum sli4_mbx_cmd_value {
+	SLI4_MBX_CMD_CONFIG_LINK	= 0x07,
+	SLI4_MBX_CMD_DUMP		= 0x17,
+	SLI4_MBX_CMD_DOWN_LINK		= 0x06,
+	SLI4_MBX_CMD_INIT_LINK		= 0x05,
+	SLI4_MBX_CMD_INIT_VFI		= 0xa3,
+	SLI4_MBX_CMD_INIT_VPI		= 0xa4,
+	SLI4_MBX_CMD_POST_XRI		= 0xa7,
+	SLI4_MBX_CMD_RELEASE_XRI	= 0xac,
+	SLI4_MBX_CMD_READ_CONFIG	= 0x0b,
+	SLI4_MBX_CMD_READ_STATUS	= 0x0e,
+	SLI4_MBX_CMD_READ_NVPARMS	= 0x02,
+	SLI4_MBX_CMD_READ_REV		= 0x11,
+	SLI4_MBX_CMD_READ_LNK_STAT	= 0x12,
+	SLI4_MBX_CMD_READ_SPARM64	= 0x8d,
+	SLI4_MBX_CMD_READ_TOPOLOGY	= 0x95,
+	SLI4_MBX_CMD_REG_FCFI		= 0xa0,
+	SLI4_MBX_CMD_REG_FCFI_MRQ	= 0xaf,
+	SLI4_MBX_CMD_REG_RPI		= 0x93,
+	SLI4_MBX_CMD_REG_RX_RQ		= 0xa6,
+	SLI4_MBX_CMD_REG_VFI		= 0x9f,
+	SLI4_MBX_CMD_REG_VPI		= 0x96,
+	SLI4_MBX_CMD_RQST_FEATURES	= 0x9d,
+	SLI4_MBX_CMD_SLI_CONFIG		= 0x9b,
+	SLI4_MBX_CMD_UNREG_FCFI		= 0xa2,
+	SLI4_MBX_CMD_UNREG_RPI		= 0x14,
+	SLI4_MBX_CMD_UNREG_VFI		= 0xa1,
+	SLI4_MBX_CMD_UNREG_VPI		= 0x97,
+	SLI4_MBX_CMD_WRITE_NVPARMS	= 0x03,
+	SLI4_MBX_CMD_CFG_AUTO_XFER_RDY	= 0xad,
+};
+
+enum sli4_mbx_status {
+	SLI4_MBX_STATUS_SUCCESS		= 0x0000,
+	SLI4_MBX_STATUS_FAILURE		= 0x0001,
+	SLI4_MBX_STATUS_RPI_NOT_REG	= 0x1400,
+};
+
+/* CONFIG_LINK - configure link-oriented parameters,
+ * such as default N_Port_ID address and various timers
+ */
+enum sli4_cmd_config_link_flags {
+	SLI4_CFG_LINK_BBSCN = 0xf00,
+	SLI4_CFG_LINK_CSCN  = 0x1000,
+};
+
+struct sli4_cmd_config_link {
+	struct sli4_mbox_command_header	hdr;
+	u8		maxbbc;
+	u8		rsvd5;
+	u8		rsvd6;
+	u8		rsvd7;
+	u8		alpa;
+	__le16		n_port_id;
+	u8		rsvd11;
+	__le32		rsvd12;
+	__le32		e_d_tov;
+	__le32		lp_tov;
+	__le32		r_a_tov;
+	__le32		r_t_tov;
+	__le32		al_tov;
+	__le32		rsvd36;
+	__le32		bbscn_dword;
+};
+
+#define SLI4_DUMP4_TYPE		0xf
+
+#define SLI4_WKI_TAG_SAT_TEM	0x1040
+
+struct sli4_cmd_dump4 {
+	struct sli4_mbox_command_header	hdr;
+	__le32		type_dword;
+	__le16		wki_selection;
+	__le16		rsvd10;
+	__le32		rsvd12;
+	__le32		returned_byte_cnt;
+	__le32		resp_data[59];
+};
+
+/* INIT_LINK - initialize the link for a FC port */
+enum sli4_init_link_flags {
+	SLI4_INIT_LINK_F_LOOPBACK	= 1 << 0,
+
+	SLI4_INIT_LINK_F_P2P_ONLY	= 1 << 1,
+	SLI4_INIT_LINK_F_FCAL_ONLY	= 2 << 1,
+	SLI4_INIT_LINK_F_FCAL_FAIL_OVER	= 0 << 1,
+	SLI4_INIT_LINK_F_P2P_FAIL_OVER	= 1 << 1,
+
+	SLI4_INIT_LINK_F_UNFAIR		= 1 << 6,
+	SLI4_INIT_LINK_F_NO_LIRP	= 1 << 7,
+	SLI4_INIT_LINK_F_LOOP_VALID_CHK	= 1 << 8,
+	SLI4_INIT_LINK_F_NO_LISA	= 1 << 9,
+	SLI4_INIT_LINK_F_FAIL_OVER	= 1 << 10,
+	SLI4_INIT_LINK_F_FIXED_SPEED	= 1 << 11,
+	SLI4_INIT_LINK_F_PICK_HI_ALPA	= 1 << 15,
+
+};
+
+enum sli4_fc_link_speed {
+	SLI4_LINK_SPEED_1G = 1,
+	SLI4_LINK_SPEED_2G,
+	SLI4_LINK_SPEED_AUTO_1_2,
+	SLI4_LINK_SPEED_4G,
+	SLI4_LINK_SPEED_AUTO_4_1,
+	SLI4_LINK_SPEED_AUTO_4_2,
+	SLI4_LINK_SPEED_AUTO_4_2_1,
+	SLI4_LINK_SPEED_8G,
+	SLI4_LINK_SPEED_AUTO_8_1,
+	SLI4_LINK_SPEED_AUTO_8_2,
+	SLI4_LINK_SPEED_AUTO_8_2_1,
+	SLI4_LINK_SPEED_AUTO_8_4,
+	SLI4_LINK_SPEED_AUTO_8_4_1,
+	SLI4_LINK_SPEED_AUTO_8_4_2,
+	SLI4_LINK_SPEED_10G,
+	SLI4_LINK_SPEED_16G,
+	SLI4_LINK_SPEED_AUTO_16_8_4,
+	SLI4_LINK_SPEED_AUTO_16_8,
+	SLI4_LINK_SPEED_32G,
+	SLI4_LINK_SPEED_AUTO_32_16_8,
+	SLI4_LINK_SPEED_AUTO_32_16,
+	SLI4_LINK_SPEED_64G,
+	SLI4_LINK_SPEED_AUTO_64_32_16,
+	SLI4_LINK_SPEED_AUTO_64_32,
+	SLI4_LINK_SPEED_128G,
+	SLI4_LINK_SPEED_AUTO_128_64_32,
+	SLI4_LINK_SPEED_AUTO_128_64,
+};
+
+struct sli4_cmd_init_link {
+	struct sli4_mbox_command_header       hdr;
+	__le32	sel_reset_al_pa_dword;
+	__le32	flags0;
+	__le32	link_speed_sel_code;
+};
+
+/* INIT_VFI - initialize the VFI resource */
+enum sli4_init_vfi_flags {
+	SLI4_INIT_VFI_FLAG_VP	= 0x1000,
+	SLI4_INIT_VFI_FLAG_VF	= 0x2000,
+	SLI4_INIT_VFI_FLAG_VT	= 0x4000,
+	SLI4_INIT_VFI_FLAG_VR	= 0x8000,
+
+	SLI4_INIT_VFI_VFID	= 0x1fff,
+	SLI4_INIT_VFI_PRI	= 0xe000,
+
+	SLI4_INIT_VFI_HOP_COUNT = 0xff000000,
+};
+
+struct sli4_cmd_init_vfi {
+	struct sli4_mbox_command_header	hdr;
+	__le16		vfi;
+	__le16		flags0_word;
+	__le16		fcfi;
+	__le16		vpi;
+	__le32		vf_id_pri_dword;
+	__le32		hop_cnt_dword;
+};
+
+/* INIT_VPI - initialize the VPI resource */
+struct sli4_cmd_init_vpi {
+	struct sli4_mbox_command_header	hdr;
+	__le16		vpi;
+	__le16		vfi;
+};
+
+/* POST_XRI - post XRI resources to the SLI Port */
+enum sli4_post_xri_flags {
+	SLI4_POST_XRI_COUNT	= 0xfff,
+	SLI4_POST_XRI_FLAG_ENX	= 0x1000,
+	SLI4_POST_XRI_FLAG_DL	= 0x2000,
+	SLI4_POST_XRI_FLAG_DI	= 0x4000,
+	SLI4_POST_XRI_FLAG_VAL	= 0x8000,
+};
+
+struct sli4_cmd_post_xri {
+	struct sli4_mbox_command_header	hdr;
+	__le16		xri_base;
+	__le16		xri_count_flags;
+};
+
+/* RELEASE_XRI - Release XRI resources from the SLI Port */
+enum sli4_release_xri_flags {
+	SLI4_RELEASE_XRI_REL_XRI_CNT	= 0x1f,
+	SLI4_RELEASE_XRI_COUNT		= 0x1f,
+};
+
+struct sli4_cmd_release_xri {
+	struct sli4_mbox_command_header	hdr;
+	__le16		rel_xri_count_word;
+	__le16		xri_count_word;
+
+	struct {
+		__le16	xri_tag0;
+		__le16	xri_tag1;
+	} xri_tbl[62];
+};
+
+/* READ_CONFIG - read SLI port configuration parameters */
+struct sli4_cmd_read_config {
+	struct sli4_mbox_command_header	hdr;
+};
+
+enum sli4_read_cfg_resp_flags {
+	SLI4_READ_CFG_RESP_RESOURCE_EXT = 0x80000000,	/* DW1 */
+	SLI4_READ_CFG_RESP_TOPOLOGY	= 0xff000000,	/* DW2 */
+};
+
+enum sli4_read_cfg_topo {
+	SLI4_READ_CFG_TOPO_FC		= 0x1,	/* FC topology unknown */
+	SLI4_READ_CFG_TOPO_FC_DA	= 0x2,	/* FC Direct Attach */
+	SLI4_READ_CFG_TOPO_FC_AL	= 0x3,	/* FC-AL topology */
+};
+
+struct sli4_rsp_read_config {
+	struct sli4_mbox_command_header	hdr;
+	__le32		ext_dword;
+	__le32		topology_dword;
+	__le32		resvd8;
+	__le16		e_d_tov;
+	__le16		resvd14;
+	__le32		resvd16;
+	__le16		r_a_tov;
+	__le16		resvd22;
+	__le32		resvd24;
+	__le32		resvd28;
+	__le16		lmt;
+	__le16		resvd34;
+	__le32		resvd36;
+	__le32		resvd40;
+	__le16		xri_base;
+	__le16		xri_count;
+	__le16		rpi_base;
+	__le16		rpi_count;
+	__le16		vpi_base;
+	__le16		vpi_count;
+	__le16		vfi_base;
+	__le16		vfi_count;
+	__le16		resvd60;
+	__le16		fcfi_count;
+	__le16		rq_count;
+	__le16		eq_count;
+	__le16		wq_count;
+	__le16		cq_count;
+	__le32		pad[45];
+};
+
+/* READ_NVPARMS - read SLI port configuration parameters */
+enum sli4_read_nvparms_flags {
+	SLI4_READ_NVPARAMS_HARD_ALPA	  = 0xff,
+	SLI4_READ_NVPARAMS_PREFERRED_D_ID = 0xffffff00,
+};
+
+struct sli4_cmd_read_nvparms {
+	struct sli4_mbox_command_header	hdr;
+	__le32		resvd0;
+	__le32		resvd4;
+	__le32		resvd8;
+	__le32		resvd12;
+	u8		wwpn[8];
+	u8		wwnn[8];
+	__le32		hard_alpa_d_id;
+};
+
+/* WRITE_NVPARMS - write SLI port configuration parameters */
+struct sli4_cmd_write_nvparms {
+	struct sli4_mbox_command_header	hdr;
+	__le32		resvd0;
+	__le32		resvd4;
+	__le32		resvd8;
+	__le32		resvd12;
+	u8		wwpn[8];
+	u8		wwnn[8];
+	__le32		hard_alpa_d_id;
+};
+
+/* READ_REV - read the Port revision levels */
+enum {
+	SLI4_READ_REV_FLAG_SLI_LEVEL	= 0xf,
+	SLI4_READ_REV_FLAG_FCOEM	= 0x10,
+	SLI4_READ_REV_FLAG_CEEV		= 0x60,
+	SLI4_READ_REV_FLAG_VPD		= 0x2000,
+
+	SLI4_READ_REV_AVAILABLE_LENGTH	= 0xffffff,
+};
+
+struct sli4_cmd_read_rev {
+	struct sli4_mbox_command_header	hdr;
+	__le16			resvd0;
+	__le16			flags0_word;
+	__le32			first_hw_rev;
+	__le32			second_hw_rev;
+	__le32			resvd12;
+	__le32			third_hw_rev;
+	u8			fc_ph_low;
+	u8			fc_ph_high;
+	u8			feature_level_low;
+	u8			feature_level_high;
+	__le32			resvd24;
+	__le32			first_fw_id;
+	u8			first_fw_name[16];
+	__le32			second_fw_id;
+	u8			second_fw_name[16];
+	__le32			rsvd18[30];
+	__le32			available_length_dword;
+	struct sli4_dmaaddr	hostbuf;
+	__le32			returned_vpd_length;
+	__le32			actual_vpd_length;
+};
+
+/* READ_SPARM64 - read the Port service parameters */
+#define SLI4_READ_SPARM64_WWPN_OFFSET	(4 * sizeof(u32))
+#define SLI4_READ_SPARM64_WWNN_OFFSET	(6 * sizeof(u32))
+
+struct sli4_cmd_read_sparm64 {
+	struct sli4_mbox_command_header hdr;
+	__le32			resvd0;
+	__le32			resvd4;
+	struct sli4_bde		bde_64;
+	__le16			vpi;
+	__le16			resvd22;
+	__le16			port_name_start;
+	__le16			port_name_len;
+	__le16			node_name_start;
+	__le16			node_name_len;
+};
+
+/* READ_TOPOLOGY - read the link event information */
+enum sli4_read_topo_e {
+	SLI4_READTOPO_ATTEN_TYPE	= 0xff,
+	SLI4_READTOPO_FLAG_IL		= 0x100,
+	SLI4_READTOPO_FLAG_PB_RECVD	= 0x200,
+
+	SLI4_READTOPO_LINKSTATE_RECV	= 0x3,
+	SLI4_READTOPO_LINKSTATE_TRANS	= 0xc,
+	SLI4_READTOPO_LINKSTATE_MACHINE	= 0xf0,
+	SLI4_READTOPO_LINKSTATE_SPEED	= 0xff00,
+	SLI4_READTOPO_LINKSTATE_TF	= 0x40000000,
+	SLI4_READTOPO_LINKSTATE_LU	= 0x80000000,
+
+	SLI4_READTOPO_SCN_BBSCN		= 0xf,
+	SLI4_READTOPO_SCN_CBBSCN	= 0xf0,
+
+	SLI4_READTOPO_R_T_TOV		= 0x1ff,
+	SLI4_READTOPO_AL_TOV		= 0xf000,
+
+	SLI4_READTOPO_PB_FLAG		= 0x80,
+
+	SLI4_READTOPO_INIT_N_PORTID	= 0xffffff,
+};
+
+#define SLI4_MIN_LOOP_MAP_BYTES	128
+
+struct sli4_cmd_read_topology {
+	struct sli4_mbox_command_header	hdr;
+	__le32			event_tag;
+	__le32			dw2_attentype;
+	u8			topology;
+	u8			lip_type;
+	u8			lip_al_ps;
+	u8			al_pa_granted;
+	struct sli4_bde		bde_loop_map;
+	__le32			linkdown_state;
+	__le32			currlink_state;
+	u8			max_bbc;
+	u8			init_bbc;
+	u8			scn_flags;
+	u8			rsvd39;
+	__le16			dw10w0_al_rt_tov;
+	__le16			lp_tov;
+	u8			acquired_al_pa;
+	u8			pb_flags;
+	__le16			specified_al_pa;
+	__le32			dw12_init_n_port_id;
+};
+
+enum sli4_read_topo_link {
+	SLI4_READ_TOPOLOGY_LINK_UP	= 0x1,
+	SLI4_READ_TOPOLOGY_LINK_DOWN,
+	SLI4_READ_TOPOLOGY_LINK_NO_ALPA,
+};
+
+enum sli4_read_topo {
+	SLI4_READ_TOPOLOGY_UNKNOWN	= 0x0,
+	SLI4_READ_TOPOLOGY_NPORT,
+	SLI4_READ_TOPOLOGY_FC_AL,
+};
+
+enum sli4_read_topo_speed {
+	SLI4_READ_TOPOLOGY_SPEED_NONE	= 0x00,
+	SLI4_READ_TOPOLOGY_SPEED_1G	= 0x04,
+	SLI4_READ_TOPOLOGY_SPEED_2G	= 0x08,
+	SLI4_READ_TOPOLOGY_SPEED_4G	= 0x10,
+	SLI4_READ_TOPOLOGY_SPEED_8G	= 0x20,
+	SLI4_READ_TOPOLOGY_SPEED_10G	= 0x40,
+	SLI4_READ_TOPOLOGY_SPEED_16G	= 0x80,
+	SLI4_READ_TOPOLOGY_SPEED_32G	= 0x90,
+};
+
+/* REG_FCFI - activate a FC Forwarder */
+struct sli4_cmd_reg_fcfi_rq_cfg {
+	u8	r_ctl_mask;
+	u8	r_ctl_match;
+	u8	type_mask;
+	u8	type_match;
+};
+
+enum sli4_regfcfi_tag {
+	SLI4_REGFCFI_VLAN_TAG		= 0xfff,
+	SLI4_REGFCFI_VLANTAG_VALID	= 0x1000,
+};
+
+#define SLI4_CMD_REG_FCFI_NUM_RQ_CFG	4
+struct sli4_cmd_reg_fcfi {
+	struct sli4_mbox_command_header	hdr;
+	__le16		fcf_index;
+	__le16		fcfi;
+	__le16		rqid1;
+	__le16		rqid0;
+	__le16		rqid3;
+	__le16		rqid2;
+	struct sli4_cmd_reg_fcfi_rq_cfg
+			rq_cfg[SLI4_CMD_REG_FCFI_NUM_RQ_CFG];
+	__le32		dw8_vlan;
+};
+
+#define SLI4_CMD_REG_FCFI_MRQ_NUM_RQ_CFG	4
+#define SLI4_CMD_REG_FCFI_MRQ_MAX_NUM_RQ	32
+#define SLI4_CMD_REG_FCFI_SET_FCFI_MODE		0
+#define SLI4_CMD_REG_FCFI_SET_MRQ_MODE		1
+
+enum sli4_reg_fcfi_mrq {
+	SLI4_REGFCFI_MRQ_VLAN_TAG	= 0xfff,
+	SLI4_REGFCFI_MRQ_VLANTAG_VALID	= 0x1000,
+	SLI4_REGFCFI_MRQ_MODE		= 0x2000,
+
+	SLI4_REGFCFI_MRQ_MASK_NUM_PAIRS	= 0xff,
+	SLI4_REGFCFI_MRQ_FILTER_BITMASK = 0xf00,
+	SLI4_REGFCFI_MRQ_RQ_SEL_POLICY	= 0xf000,
+};
+
+struct sli4_cmd_reg_fcfi_mrq {
+	struct sli4_mbox_command_header	hdr;
+	__le16		fcf_index;
+	__le16		fcfi;
+	__le16		rqid1;
+	__le16		rqid0;
+	__le16		rqid3;
+	__le16		rqid2;
+	struct sli4_cmd_reg_fcfi_rq_cfg
+			rq_cfg[SLI4_CMD_REG_FCFI_MRQ_NUM_RQ_CFG];
+	__le32		dw8_vlan;
+	__le32		dw9_mrqflags;
+};
+
+struct sli4_cmd_rq_cfg {
+	__le16	rq_id;
+	u8	r_ctl_mask;
+	u8	r_ctl_match;
+	u8	type_mask;
+	u8	type_match;
+};
+
+/* REG_RPI - register a Remote Port Indicator */
+enum sli4_reg_rpi {
+	SLI4_REGRPI_REMOTE_N_PORTID	= 0xffffff,	/* DW2 */
+	SLI4_REGRPI_UPD			= 0x1000000,
+	SLI4_REGRPI_ETOW		= 0x8000000,
+	SLI4_REGRPI_TERP		= 0x20000000,
+	SLI4_REGRPI_CI			= 0x80000000,
+};
+
+struct sli4_cmd_reg_rpi {
+	struct sli4_mbox_command_header	hdr;
+	__le16			rpi;
+	__le16			rsvd2;
+	__le32			dw2_rportid_flags;
+	struct sli4_bde		bde_64;
+	__le16			vpi;
+	__le16			rsvd26;
+};
+
+#define SLI4_REG_RPI_BUF_LEN		0x70
+
+/* REG_VFI - register a Virtual Fabric Indicator */
+enum sli_reg_vfi {
+	SLI4_REGVFI_VP			= 0x1000,	/* DW1 */
+	SLI4_REGVFI_UPD			= 0x2000,
+
+	SLI4_REGVFI_LOCAL_N_PORTID	= 0xffffff,	/* DW10 */
+};
+
+struct sli4_cmd_reg_vfi {
+	struct sli4_mbox_command_header	hdr;
+	__le16			vfi;
+	__le16			dw0w1_flags;
+	__le16			fcfi;
+	__le16			vpi;
+	u8			wwpn[8];
+	struct sli4_bde		sparm;
+	__le32			e_d_tov;
+	__le32			r_a_tov;
+	__le32			dw10_lportid_flags;
+};
+
+/* REG_VPI - register a Virtual Port Indicator */
+enum sli4_reg_vpi {
+	SLI4_REGVPI_LOCAL_N_PORTID	= 0xffffff,
+	SLI4_REGVPI_UPD			= 0x1000000,
+};
+
+struct sli4_cmd_reg_vpi {
+	struct sli4_mbox_command_header	hdr;
+	__le32		rsvd0;
+	__le32		dw2_lportid_flags;
+	u8		wwpn[8];
+	__le32		rsvd12;
+	__le16		vpi;
+	__le16		vfi;
+};
+
+/* REQUEST_FEATURES - request / query SLI features */
+enum sli4_req_features_flags {
+	SLI4_REQFEAT_QRY	= 0x1,		/* Dw1 */
+
+	SLI4_REQFEAT_IAAB	= 1 << 0,	/* DW2 & DW3 */
+	SLI4_REQFEAT_NPIV	= 1 << 1,
+	SLI4_REQFEAT_DIF	= 1 << 2,
+	SLI4_REQFEAT_VF		= 1 << 3,
+	SLI4_REQFEAT_FCPI	= 1 << 4,
+	SLI4_REQFEAT_FCPT	= 1 << 5,
+	SLI4_REQFEAT_FCPC	= 1 << 6,
+	SLI4_REQFEAT_RSVD	= 1 << 7,
+	SLI4_REQFEAT_RQD	= 1 << 8,
+	SLI4_REQFEAT_IAAR	= 1 << 9,
+	SLI4_REQFEAT_HLM	= 1 << 10,
+	SLI4_REQFEAT_PERFH	= 1 << 11,
+	SLI4_REQFEAT_RXSEQ	= 1 << 12,
+	SLI4_REQFEAT_RXRI	= 1 << 13,
+	SLI4_REQFEAT_DCL2	= 1 << 14,
+	SLI4_REQFEAT_RSCO	= 1 << 15,
+	SLI4_REQFEAT_MRQP	= 1 << 16,
+};
+
+struct sli4_cmd_request_features {
+	struct sli4_mbox_command_header	hdr;
+	__le32		dw1_qry;
+	__le32		cmd;
+	__le32		resp;
+};
+
+/*
+ * SLI_CONFIG - submit a configuration command to Port
+ *
+ * Command is either embedded as part of the payload (embed) or located
+ * in a separate memory buffer (mem)
+ */
+enum sli4_sli_config {
+	SLI4_SLICONF_EMB		= 0x1,		/* DW1 */
+	SLI4_SLICONF_PMDCMD_SHIFT	= 3,
+	SLI4_SLICONF_PMDCMD_MASK	= 0xf8,
+	SLI4_SLICONF_PMDCMD_VAL_1	= 8,
+	SLI4_SLICONF_PMDCNT		= 0xf8,
+
+	SLI4_SLICONF_PMD_LEN		= 0x00ffffff,
+};
+
+struct sli4_cmd_sli_config {
+	struct sli4_mbox_command_header	hdr;
+	__le32		dw1_flags;
+	__le32		payload_len;
+	__le32		rsvd12[3];
+	union {
+		u8 embed[58 * sizeof(u32)];
+		struct sli4_bufptr mem;
+	} payload;
+};
+
+/* READ_STATUS - read tx/rx status of a particular port */
+#define SLI4_READSTATUS_CLEAR_COUNTERS	0x1
+
+struct sli4_cmd_read_status {
+	struct sli4_mbox_command_header	hdr;
+	__le32		dw1_flags;
+	__le32		rsvd4;
+	__le32		trans_kbyte_cnt;
+	__le32		recv_kbyte_cnt;
+	__le32		trans_frame_cnt;
+	__le32		recv_frame_cnt;
+	__le32		trans_seq_cnt;
+	__le32		recv_seq_cnt;
+	__le32		tot_exchanges_orig;
+	__le32		tot_exchanges_resp;
+	__le32		recv_p_bsy_cnt;
+	__le32		recv_f_bsy_cnt;
+	__le32		no_rq_buf_dropped_frames_cnt;
+	__le32		empty_rq_timeout_cnt;
+	__le32		no_xri_dropped_frames_cnt;
+	__le32		empty_xri_pool_cnt;
+};
+
+/* READ_LNK_STAT - read link status of a particular port */
+enum sli4_read_link_stats_flags {
+	SLI4_READ_LNKSTAT_REC	= 1u << 0,
+	SLI4_READ_LNKSTAT_GEC	= 1u << 1,
+	SLI4_READ_LNKSTAT_W02OF	= 1u << 2,
+	SLI4_READ_LNKSTAT_W03OF	= 1u << 3,
+	SLI4_READ_LNKSTAT_W04OF	= 1u << 4,
+	SLI4_READ_LNKSTAT_W05OF	= 1u << 5,
+	SLI4_READ_LNKSTAT_W06OF	= 1u << 6,
+	SLI4_READ_LNKSTAT_W07OF	= 1u << 7,
+	SLI4_READ_LNKSTAT_W08OF	= 1u << 8,
+	SLI4_READ_LNKSTAT_W09OF	= 1u << 9,
+	SLI4_READ_LNKSTAT_W10OF = 1u << 10,
+	SLI4_READ_LNKSTAT_W11OF = 1u << 11,
+	SLI4_READ_LNKSTAT_W12OF	= 1u << 12,
+	SLI4_READ_LNKSTAT_W13OF	= 1u << 13,
+	SLI4_READ_LNKSTAT_W14OF	= 1u << 14,
+	SLI4_READ_LNKSTAT_W15OF	= 1u << 15,
+	SLI4_READ_LNKSTAT_W16OF	= 1u << 16,
+	SLI4_READ_LNKSTAT_W17OF	= 1u << 17,
+	SLI4_READ_LNKSTAT_W18OF	= 1u << 18,
+	SLI4_READ_LNKSTAT_W19OF	= 1u << 19,
+	SLI4_READ_LNKSTAT_W20OF	= 1u << 20,
+	SLI4_READ_LNKSTAT_W21OF	= 1u << 21,
+	SLI4_READ_LNKSTAT_CLRC	= 1u << 30,
+	SLI4_READ_LNKSTAT_CLOF	= 1u << 31,
+};
+
+struct sli4_cmd_read_link_stats {
+	struct sli4_mbox_command_header	hdr;
+	__le32	dw1_flags;
+	__le32	linkfail_errcnt;
+	__le32	losssync_errcnt;
+	__le32	losssignal_errcnt;
+	__le32	primseq_errcnt;
+	__le32	inval_txword_errcnt;
+	__le32	crc_errcnt;
+	__le32	primseq_eventtimeout_cnt;
+	__le32	elastic_bufoverrun_errcnt;
+	__le32	arbit_fc_al_timeout_cnt;
+	__le32	adv_rx_buftor_to_buf_credit;
+	__le32	curr_rx_buf_to_buf_credit;
+	__le32	adv_tx_buf_to_buf_credit;
+	__le32	curr_tx_buf_to_buf_credit;
+	__le32	rx_eofa_cnt;
+	__le32	rx_eofdti_cnt;
+	__le32	rx_eofni_cnt;
+	__le32	rx_soff_cnt;
+	__le32	rx_dropped_no_aer_cnt;
+	__le32	rx_dropped_no_avail_rpi_rescnt;
+	__le32	rx_dropped_no_avail_xri_rescnt;
+};
+
+/* Format a WQE with WQ_ID Association performance hint */
+static inline void
+sli_set_wq_id_association(void *entry, u16 q_id)
+{
+	u32 *wqe = entry;
+
+	/*
+	 * Set Word 10, bit 0 to zero
+	 * Set Word 10, bits 15:1 to the WQ ID
+	 */
+	wqe[10] &= ~0xffff;
+	wqe[10] |= q_id << 1;
+}
+
+/* UNREG_FCFI - unregister a FCFI */
+struct sli4_cmd_unreg_fcfi {
+	struct sli4_mbox_command_header	hdr;
+	__le32		rsvd0;
+	__le16		fcfi;
+	__le16		rsvd6;
+};
+
+/* UNREG_RPI - unregister one or more RPI */
+enum sli4_unreg_rpi {
+	SLI4_UNREG_RPI_DP	= 0x2000,
+	SLI4_UNREG_RPI_II_SHIFT	= 14,
+	SLI4_UNREG_RPI_II_MASK	= 0xc000,
+	SLI4_UNREG_RPI_II_RPI	= 0x0000,
+	SLI4_UNREG_RPI_II_VPI	= 0x4000,
+	SLI4_UNREG_RPI_II_VFI	= 0x8000,
+	SLI4_UNREG_RPI_II_FCFI	= 0xc000,
+
+	SLI4_UNREG_RPI_DEST_N_PORTID_MASK = 0x00ffffff,
+};
+
+struct sli4_cmd_unreg_rpi {
+	struct sli4_mbox_command_header	hdr;
+	__le16		index;
+	__le16		dw1w1_flags;
+	__le32		dw2_dest_n_portid;
+};
+
+/* UNREG_VFI - unregister one or more VFI */
+enum sli4_unreg_vfi {
+	SLI4_UNREG_VFI_II_SHIFT	= 14,
+	SLI4_UNREG_VFI_II_MASK	= 0xc000,
+	SLI4_UNREG_VFI_II_VFI	= 0x0000,
+	SLI4_UNREG_VFI_II_FCFI	= 0xc000,
+};
+
+struct sli4_cmd_unreg_vfi {
+	struct sli4_mbox_command_header	hdr;
+	__le32		rsvd0;
+	__le16		index;
+	__le16		dw2_flags;
+};
+
+enum sli4_unreg_type {
+	SLI4_UNREG_TYPE_PORT,
+	SLI4_UNREG_TYPE_DOMAIN,
+	SLI4_UNREG_TYPE_FCF,
+	SLI4_UNREG_TYPE_ALL
+};
+
+/* UNREG_VPI - unregister one or more VPI */
+enum sli4_unreg_vpi {
+	SLI4_UNREG_VPI_II_SHIFT	= 14,
+	SLI4_UNREG_VPI_II_MASK	= 0xc000,
+	SLI4_UNREG_VPI_II_VPI	= 0x0000,
+	SLI4_UNREG_VPI_II_VFI	= 0x8000,
+	SLI4_UNREG_VPI_II_FCFI	= 0xc000,
+};
+
+struct sli4_cmd_unreg_vpi {
+	struct sli4_mbox_command_header	hdr;
+	__le32		rsvd0;
+	__le16		index;
+	__le16		dw2w0_flags;
+};
+
+/* AUTO_XFER_RDY - Configure the auto-generate XFER-RDY feature */
+struct sli4_cmd_config_auto_xfer_rdy {
+	struct sli4_mbox_command_header	hdr;
+	__le32		rsvd0;
+	__le32		max_burst_len;
+};
+
+#define SLI4_CONFIG_AUTO_XFERRDY_BLKSIZE	0xffff
+
+struct sli4_cmd_config_auto_xfer_rdy_hp {
+	struct sli4_mbox_command_header	hdr;
+	__le32		rsvd0;
+	__le32		max_burst_len;
+	__le32		dw3_esoc_flags;
+	__le16		block_size;
+	__le16		rsvd14;
+};
+
+/*************************************************************************
+ * SLI-4 common configuration command formats and definitions
+ */
+
+/*
+ * Subsystem values.
+ */
+enum sli4_subsystem {
+	SLI4_SUBSYSTEM_COMMON	= 0x01,
+	SLI4_SUBSYSTEM_LOWLEVEL	= 0x0b,
+	SLI4_SUBSYSTEM_FC	= 0x0c,
+	SLI4_SUBSYSTEM_DMTF	= 0x11,
+};
+
+#define	SLI4_OPC_LOWLEVEL_SET_WATCHDOG		0X36
+
+/*
+ * Common opcode (OPC) values.
+ */
+enum sli4_cmn_opcode {
+	SLI4_CMN_FUNCTION_RESET		= 0x3d,
+	SLI4_CMN_CREATE_CQ		= 0x0c,
+	SLI4_CMN_CREATE_CQ_SET		= 0x1d,
+	SLI4_CMN_DESTROY_CQ		= 0x36,
+	SLI4_CMN_MODIFY_EQ_DELAY	= 0x29,
+	SLI4_CMN_CREATE_EQ		= 0x0d,
+	SLI4_CMN_DESTROY_EQ		= 0x37,
+	SLI4_CMN_CREATE_MQ_EXT		= 0x5a,
+	SLI4_CMN_DESTROY_MQ		= 0x35,
+	SLI4_CMN_GET_CNTL_ATTRIBUTES	= 0x20,
+	SLI4_CMN_NOP			= 0x21,
+	SLI4_CMN_GET_RSC_EXTENT_INFO	= 0x9a,
+	SLI4_CMN_GET_SLI4_PARAMS	= 0xb5,
+	SLI4_CMN_QUERY_FW_CONFIG	= 0x3a,
+	SLI4_CMN_GET_PORT_NAME		= 0x4d,
+
+	SLI4_CMN_WRITE_FLASHROM		= 0x07,
+	/* TRANSCEIVER Data */
+	SLI4_CMN_READ_TRANS_DATA	= 0x49,
+	SLI4_CMN_GET_CNTL_ADDL_ATTRS	= 0x79,
+	SLI4_CMN_GET_FUNCTION_CFG	= 0xa0,
+	SLI4_CMN_GET_PROFILE_CFG	= 0xa4,
+	SLI4_CMN_SET_PROFILE_CFG	= 0xa5,
+	SLI4_CMN_GET_PROFILE_LIST	= 0xa6,
+	SLI4_CMN_GET_ACTIVE_PROFILE	= 0xa7,
+	SLI4_CMN_SET_ACTIVE_PROFILE	= 0xa8,
+	SLI4_CMN_READ_OBJECT		= 0xab,
+	SLI4_CMN_WRITE_OBJECT		= 0xac,
+	SLI4_CMN_DELETE_OBJECT		= 0xae,
+	SLI4_CMN_READ_OBJECT_LIST	= 0xad,
+	SLI4_CMN_SET_DUMP_LOCATION	= 0xb8,
+	SLI4_CMN_SET_FEATURES		= 0xbf,
+	SLI4_CMN_GET_RECFG_LINK_INFO	= 0xc9,
+	SLI4_CMN_SET_RECNG_LINK_ID	= 0xca,
+};
+
+/* DMTF opcode (OPC) values */
+#define DMTF_EXEC_CLP_CMD 0x01
+
+/*
+ * COMMON_FUNCTION_RESET
+ *
+ * Resets the Port, returning it to a power-on state. This configuration
+ * command does not have a payload and should set/expect the lengths to
+ * be zero.
+ */
+struct sli4_rqst_cmn_function_reset {
+	struct sli4_rqst_hdr	hdr;
+};
+
+struct sli4_rsp_cmn_function_reset {
+	struct sli4_rsp_hdr	hdr;
+};
+
+
+/*
+ * COMMON_GET_CNTL_ATTRIBUTES
+ *
+ * Query for information about the SLI Port
+ */
+enum sli4_cntrl_attr_flags {
+	SLI4_CNTL_ATTR_PORTNUM	= 0x3f,
+	SLI4_CNTL_ATTR_PORTTYPE	= 0xc0,
+};
+
+struct sli4_rsp_cmn_get_cntl_attributes {
+	struct sli4_rsp_hdr	hdr;
+	u8		version_str[32];
+	u8		manufacturer_name[32];
+	__le32		supported_modes;
+	u8		eprom_version_lo;
+	u8		eprom_version_hi;
+	__le16		rsvd17;
+	__le32		mbx_ds_version;
+	__le32		ep_fw_ds_version;
+	u8		ncsi_version_str[12];
+	__le32		def_extended_timeout;
+	u8		model_number[32];
+	u8		description[64];
+	u8		serial_number[32];
+	u8		ip_version_str[32];
+	u8		fw_version_str[32];
+	u8		bios_version_str[32];
+	u8		redboot_version_str[32];
+	u8		driver_version_str[32];
+	u8		fw_on_flash_version_str[32];
+	__le32		functionalities_supported;
+	__le16		max_cdb_length;
+	u8		asic_revision;
+	u8		generational_guid0;
+	__le32		generational_guid1_12[3];
+	__le16		generational_guid13_14;
+	u8		generational_guid15;
+	u8		hba_port_count;
+	__le16		default_link_down_timeout;
+	u8		iscsi_version_min_max;
+	u8		multifunctional_device;
+	u8		cache_valid;
+	u8		hba_status;
+	u8		max_domains_supported;
+	u8		port_num_type_flags;
+	__le32		firmware_post_status;
+	__le32		hba_mtu;
+	u8		iscsi_features;
+	u8		rsvd121[3];
+	__le16		pci_vendor_id;
+	__le16		pci_device_id;
+	__le16		pci_sub_vendor_id;
+	__le16		pci_sub_system_id;
+	u8		pci_bus_number;
+	u8		pci_device_number;
+	u8		pci_function_number;
+	u8		interface_type;
+	__le64		unique_identifier;
+	u8		number_of_netfilters;
+	u8		rsvd122[3];
+};
+
+/*
+ * COMMON_GET_CNTL_ATTRIBUTES
+ *
+ * This command queries the controller information from the Flash ROM.
+ */
+struct sli4_rqst_cmn_get_cntl_addl_attributes {
+	struct sli4_rqst_hdr	hdr;
+};
+
+struct sli4_rsp_cmn_get_cntl_addl_attributes {
+	struct sli4_rsp_hdr	hdr;
+	__le16		ipl_file_number;
+	u8		ipl_file_version;
+	u8		rsvd4;
+	u8		on_die_temperature;
+	u8		rsvd5[3];
+	__le32		driver_advanced_features_supported;
+	__le32		rsvd7[4];
+	char		universal_bios_version[32];
+	char		x86_bios_version[32];
+	char		efi_bios_version[32];
+	char		fcode_version[32];
+	char		uefi_bios_version[32];
+	char		uefi_nic_version[32];
+	char		uefi_fcode_version[32];
+	char		uefi_iscsi_version[32];
+	char		iscsi_x86_bios_version[32];
+	char		pxe_x86_bios_version[32];
+	u8		default_wwpn[8];
+	u8		ext_phy_version[32];
+	u8		fc_universal_bios_version[32];
+	u8		fc_x86_bios_version[32];
+	u8		fc_efi_bios_version[32];
+	u8		fc_fcode_version[32];
+	u8		ext_phy_crc_label[8];
+	u8		ipl_file_name[16];
+	u8		rsvd139[72];
+};
+
+/*
+ * COMMON_NOP
+ *
+ * This command does not do anything; it only returns
+ * the payload in the completion.
+ */
+struct sli4_rqst_cmn_nop {
+	struct sli4_rqst_hdr	hdr;
+	__le32			context[2];
+};
+
+struct sli4_rsp_cmn_nop {
+	struct sli4_rsp_hdr	hdr;
+	__le32			context[2];
+};
+
+struct sli4_rqst_cmn_get_resource_extent_info {
+	struct sli4_rqst_hdr	hdr;
+	__le16	resource_type;
+	__le16	rsvd16;
+};
+
+enum sli4_rsc_type {
+	SLI4_RSC_TYPE_VFI	= 0x20,
+	SLI4_RSC_TYPE_VPI	= 0x21,
+	SLI4_RSC_TYPE_RPI	= 0x22,
+	SLI4_RSC_TYPE_XRI	= 0x23,
+};
+
+struct sli4_rsp_cmn_get_resource_extent_info {
+	struct sli4_rsp_hdr	hdr;
+	__le16		resource_extent_count;
+	__le16		resource_extent_size;
+};
+
+#define SLI4_128BYTE_WQE_SUPPORT	0x02
+
+#define GET_Q_CNT_METHOD(m) \
+	(((m) & SLI4_PARAM_Q_CNT_MTHD_MASK) >> SLI4_PARAM_Q_CNT_MTHD_SHFT)
+#define GET_Q_CREATE_VERSION(v) \
+	(((v) & SLI4_PARAM_QV_MASK) >> SLI4_PARAM_QV_SHIFT)
+
+enum sli4_rsp_get_params_e {
+	/*GENERIC*/
+	SLI4_PARAM_Q_CNT_MTHD_SHFT	= 24,
+	SLI4_PARAM_Q_CNT_MTHD_MASK	= 0xf << 24,
+	SLI4_PARAM_QV_SHIFT		= 14,
+	SLI4_PARAM_QV_MASK		= 3 << 14,
+
+	/* DW4 */
+	SLI4_PARAM_PROTO_TYPE_MASK	= 0xff,
+	/* DW5 */
+	SLI4_PARAM_FT			= 1 << 0,
+	SLI4_PARAM_SLI_REV_MASK		= 0xf << 4,
+	SLI4_PARAM_SLI_FAM_MASK		= 0xf << 8,
+	SLI4_PARAM_IF_TYPE_MASK		= 0xf << 12,
+	SLI4_PARAM_SLI_HINT1_MASK	= 0xff << 16,
+	SLI4_PARAM_SLI_HINT2_MASK	= 0x1f << 24,
+	/* DW6 */
+	SLI4_PARAM_EQ_PAGE_CNT_MASK	= 0xf << 0,
+	SLI4_PARAM_EQE_SZS_MASK		= 0xf << 8,
+	SLI4_PARAM_EQ_PAGE_SZS_MASK	= 0xff << 16,
+	/* DW8 */
+	SLI4_PARAM_CQ_PAGE_CNT_MASK	= 0xf << 0,
+	SLI4_PARAM_CQE_SZS_MASK		= 0xf << 8,
+	SLI4_PARAM_CQ_PAGE_SZS_MASK	= 0xff << 16,
+	/* DW10 */
+	SLI4_PARAM_MQ_PAGE_CNT_MASK	= 0xf << 0,
+	SLI4_PARAM_MQ_PAGE_SZS_MASK	= 0xff << 16,
+	/* DW12 */
+	SLI4_PARAM_WQ_PAGE_CNT_MASK	= 0xf << 0,
+	SLI4_PARAM_WQE_SZS_MASK		= 0xf << 8,
+	SLI4_PARAM_WQ_PAGE_SZS_MASK	= 0xff << 16,
+	/* DW14 */
+	SLI4_PARAM_RQ_PAGE_CNT_MASK	= 0xf << 0,
+	SLI4_PARAM_RQE_SZS_MASK		= 0xf << 8,
+	SLI4_PARAM_RQ_PAGE_SZS_MASK	= 0xff << 16,
+	/* DW15W1*/
+	SLI4_PARAM_RQ_DB_WINDOW_MASK	= 0xf000,
+	/* DW16 */
+	SLI4_PARAM_FC			= 1 << 0,
+	SLI4_PARAM_EXT			= 1 << 1,
+	SLI4_PARAM_HDRR			= 1 << 2,
+	SLI4_PARAM_SGLR			= 1 << 3,
+	SLI4_PARAM_FBRR			= 1 << 4,
+	SLI4_PARAM_AREG			= 1 << 5,
+	SLI4_PARAM_TGT			= 1 << 6,
+	SLI4_PARAM_TERP			= 1 << 7,
+	SLI4_PARAM_ASSI			= 1 << 8,
+	SLI4_PARAM_WCHN			= 1 << 9,
+	SLI4_PARAM_TCCA			= 1 << 10,
+	SLI4_PARAM_TRTY			= 1 << 11,
+	SLI4_PARAM_TRIR			= 1 << 12,
+	SLI4_PARAM_PHOFF		= 1 << 13,
+	SLI4_PARAM_PHON			= 1 << 14,
+	SLI4_PARAM_PHWQ			= 1 << 15,
+	SLI4_PARAM_BOUND_4GA		= 1 << 16,
+	SLI4_PARAM_RXC			= 1 << 17,
+	SLI4_PARAM_HLM			= 1 << 18,
+	SLI4_PARAM_IPR			= 1 << 19,
+	SLI4_PARAM_RXRI			= 1 << 20,
+	SLI4_PARAM_SGLC			= 1 << 21,
+	SLI4_PARAM_TIMM			= 1 << 22,
+	SLI4_PARAM_TSMM			= 1 << 23,
+	SLI4_PARAM_OAS			= 1 << 25,
+	SLI4_PARAM_LC			= 1 << 26,
+	SLI4_PARAM_AGXF			= 1 << 27,
+	SLI4_PARAM_LOOPBACK_MASK	= 0xf << 28,
+	/* DW18 */
+	SLI4_PARAM_SGL_PAGE_CNT_MASK	= 0xf << 0,
+	SLI4_PARAM_SGL_PAGE_SZS_MASK	= 0xff << 8,
+	SLI4_PARAM_SGL_PP_ALIGN_MASK	= 0xff << 16,
+};
+
+struct sli4_rqst_cmn_get_sli4_params {
+	struct sli4_rqst_hdr	hdr;
+};
+
+struct sli4_rsp_cmn_get_sli4_params {
+	struct sli4_rsp_hdr	hdr;
+	__le32		dw4_protocol_type;
+	__le32		dw5_sli;
+	__le32		dw6_eq_page_cnt;
+	__le16		eqe_count_mask;
+	__le16		rsvd26;
+	__le32		dw8_cq_page_cnt;
+	__le16		cqe_count_mask;
+	__le16		rsvd34;
+	__le32		dw10_mq_page_cnt;
+	__le16		mqe_count_mask;
+	__le16		rsvd42;
+	__le32		dw12_wq_page_cnt;
+	__le16		wqe_count_mask;
+	__le16		rsvd50;
+	__le32		dw14_rq_page_cnt;
+	__le16		rqe_count_mask;
+	__le16		dw15w1_rq_db_window;
+	__le32		dw16_loopback_scope;
+	__le32		sge_supported_length;
+	__le32		dw18_sgl_page_cnt;
+	__le16		min_rq_buffer_size;
+	__le16		rsvd75;
+	__le32		max_rq_buffer_size;
+	__le16		physical_xri_max;
+	__le16		physical_rpi_max;
+	__le16		physical_vpi_max;
+	__le16		physical_vfi_max;
+	__le32		rsvd88;
+	__le16		frag_num_field_offset;
+	__le16		frag_num_field_size;
+	__le16		sgl_index_field_offset;
+	__le16		sgl_index_field_size;
+	__le32		chain_sge_initial_value_lo;
+	__le32		chain_sge_initial_value_hi;
+};
+
+/*Port Types*/
+enum sli4_port_types {
+	SLI4_PORT_TYPE_ETH	= 0,
+	SLI4_PORT_TYPE_FC	= 1,
+};
+
+struct sli4_rqst_cmn_get_port_name {
+	struct sli4_rqst_hdr	hdr;
+	u8	port_type;
+	u8	rsvd4[3];
+};
+
+struct sli4_rsp_cmn_get_port_name {
+	struct sli4_rsp_hdr	hdr;
+	char	port_name[4];
+};
+
+struct sli4_rqst_cmn_write_flashrom {
+	struct sli4_rqst_hdr	hdr;
+	__le32		flash_rom_access_opcode;
+	__le32		flash_rom_access_operation_type;
+	__le32		data_buffer_size;
+	__le32		offset;
+	u8		data_buffer[4];
+};
+
+/*
+ * COMMON_READ_TRANSCEIVER_DATA
+ *
+ * This command reads SFF transceiver data(Format is defined
+ * by the SFF-8472 specification).
+ */
+struct sli4_rqst_cmn_read_transceiver_data {
+	struct sli4_rqst_hdr	hdr;
+	__le32			page_number;
+	__le32			port;
+};
+
+struct sli4_rsp_cmn_read_transceiver_data {
+	struct sli4_rsp_hdr	hdr;
+	__le32			page_number;
+	__le32			port;
+	u8			page_data[128];
+	u8			page_data_2[128];
+};
+
+#define SLI4_REQ_DESIRE_READLEN		0xffffff
+
+struct sli4_rqst_cmn_read_object {
+	struct sli4_rqst_hdr	hdr;
+	__le32			desired_read_length_dword;
+	__le32			read_offset;
+	u8			object_name[104];
+	__le32			host_buffer_descriptor_count;
+	struct sli4_bde		host_buffer_descriptor[0];
+};
+
+#define RSP_COM_READ_OBJ_EOF		0x80000000
+
+struct sli4_rsp_cmn_read_object {
+	struct sli4_rsp_hdr	hdr;
+	__le32			actual_read_length;
+	__le32			eof_dword;
+};
+
+enum sli4_rqst_write_object_flags {
+	SLI4_RQ_DES_WRITE_LEN		= 0xffffff,
+	SLI4_RQ_DES_WRITE_LEN_NOC	= 0x40000000,
+	SLI4_RQ_DES_WRITE_LEN_EOF	= 0x80000000,
+};
+
+struct sli4_rqst_cmn_write_object {
+	struct sli4_rqst_hdr	hdr;
+	__le32			desired_write_len_dword;
+	__le32			write_offset;
+	u8			object_name[104];
+	__le32			host_buffer_descriptor_count;
+	struct sli4_bde		host_buffer_descriptor[0];
+};
+
+#define	RSP_CHANGE_STATUS		0xff
+
+struct sli4_rsp_cmn_write_object {
+	struct sli4_rsp_hdr	hdr;
+	__le32			actual_write_length;
+	__le32			change_status_dword;
+};
+
+struct sli4_rqst_cmn_delete_object {
+	struct sli4_rqst_hdr	hdr;
+	__le32			rsvd4;
+	__le32			rsvd5;
+	u8			object_name[104];
+};
+
+#define SLI4_RQ_OBJ_LIST_READ_LEN	0xffffff
+
+struct sli4_rqst_cmn_read_object_list {
+	struct sli4_rqst_hdr	hdr;
+	__le32			desired_read_length_dword;
+	__le32			read_offset;
+	u8			object_name[104];
+	__le32			host_buffer_descriptor_count;
+	struct sli4_bde		host_buffer_descriptor[0];
+};
+
+enum sli4_rqst_set_dump_flags {
+	SLI4_CMN_SET_DUMP_BUFFER_LEN	= 0xffffff,
+	SLI4_CMN_SET_DUMP_FDB		= 0x20000000,
+	SLI4_CMN_SET_DUMP_BLP		= 0x40000000,
+	SLI4_CMN_SET_DUMP_QRY		= 0x80000000,
+};
+
+struct sli4_rqst_cmn_set_dump_location {
+	struct sli4_rqst_hdr	hdr;
+	__le32			buffer_length_dword;
+	__le32			buf_addr_low;
+	__le32			buf_addr_high;
+};
+
+struct sli4_rsp_cmn_set_dump_location {
+	struct sli4_rsp_hdr	hdr;
+	__le32			buffer_length_dword;
+};
+
+enum sli4_dump_level {
+	SLI4_DUMP_LEVEL_NONE,
+	SLI4_CHIP_LEVEL_DUMP,
+	SLI4_FUNC_DESC_DUMP,
+};
+
+enum sli4_dump_state {
+	SLI4_DUMP_STATE_NONE,
+	SLI4_CHIP_DUMP_STATE_VALID,
+	SLI4_FUNC_DUMP_STATE_VALID,
+};
+
+enum sli4_dump_status {
+	SLI4_DUMP_READY_STATUS_NOT_READY,
+	SLI4_DUMP_READY_STATUS_DD_PRESENT,
+	SLI4_DUMP_READY_STATUS_FDB_PRESENT,
+	SLI4_DUMP_READY_STATUS_SKIP_DUMP,
+	SLI4_DUMP_READY_STATUS_FAILED = -1,
+};
+
+enum sli4_set_features {
+	SLI4_SET_FEATURES_DIF_SEED			= 0x01,
+	SLI4_SET_FEATURES_XRI_TIMER			= 0x03,
+	SLI4_SET_FEATURES_MAX_PCIE_SPEED		= 0x04,
+	SLI4_SET_FEATURES_FCTL_CHECK			= 0x05,
+	SLI4_SET_FEATURES_FEC				= 0x06,
+	SLI4_SET_FEATURES_PCIE_RECV_DETECT		= 0x07,
+	SLI4_SET_FEATURES_DIF_MEMORY_MODE		= 0x08,
+	SLI4_SET_FEATURES_DISABLE_SLI_PORT_PAUSE_STATE	= 0x09,
+	SLI4_SET_FEATURES_ENABLE_PCIE_OPTIONS		= 0x0a,
+	SLI4_SET_FEAT_CFG_AUTO_XFER_RDY_T10PI		= 0x0c,
+	SLI4_SET_FEATURES_ENABLE_MULTI_RECEIVE_QUEUE	= 0x0d,
+	SLI4_SET_FEATURES_SET_FTD_XFER_HINT		= 0x0f,
+	SLI4_SET_FEATURES_SLI_PORT_HEALTH_CHECK		= 0x11,
+};
+
+struct sli4_rqst_cmn_set_features {
+	struct sli4_rqst_hdr	hdr;
+	__le32			feature;
+	__le32			param_len;
+	__le32			params[8];
+};
+
+struct sli4_rqst_cmn_set_features_dif_seed {
+	__le16		seed;
+	__le16		rsvd16;
+};
+
+enum sli4_rqst_set_mrq_features {
+	SLI4_RQ_MULTIRQ_ISR		 = 0x1,
+	SLI4_RQ_MULTIRQ_AUTOGEN_XFER_RDY = 0x2,
+
+	SLI4_RQ_MULTIRQ_NUM_RQS		 = 0xff,
+	SLI4_RQ_MULTIRQ_RQ_SELECT	 = 0xf00,
+};
+
+struct sli4_rqst_cmn_set_features_multirq {
+	__le32		auto_gen_xfer_dword;
+	__le32		num_rqs_dword;
+};
+
+enum sli4_rqst_health_check_flags {
+	SLI4_RQ_HEALTH_CHECK_ENABLE	= 0x1,
+	SLI4_RQ_HEALTH_CHECK_QUERY	= 0x2,
+};
+
+struct sli4_rqst_cmn_set_features_health_check {
+	__le32		health_check_dword;
+};
+
+struct sli4_rqst_cmn_set_features_set_fdt_xfer_hint {
+	__le32		fdt_xfer_hint;
+};
+
+struct sli4_rqst_dmtf_exec_clp_cmd {
+	struct sli4_rqst_hdr	hdr;
+	__le32			cmd_buf_length;
+	__le32			resp_buf_length;
+	__le32			cmd_buf_addr_low;
+	__le32			cmd_buf_addr_high;
+	__le32			resp_buf_addr_low;
+	__le32			resp_buf_addr_high;
+};
+
+struct sli4_rsp_dmtf_exec_clp_cmd {
+	struct sli4_rsp_hdr	hdr;
+	__le32			rsvd4;
+	__le32			resp_length;
+	__le32			rsvd6;
+	__le32			rsvd7;
+	__le32			rsvd8;
+	__le32			rsvd9;
+	__le32			clp_status;
+	__le32			clp_detailed_status;
+};
+
+#define SLI4_PROTOCOL_FC		0x10
+#define SLI4_PROTOCOL_DEFAULT		0xff
+
+struct sli4_rspource_descriptor_v1 {
+	u8		descriptor_type;
+	u8		descriptor_length;
+	__le16		rsvd16;
+	__le32		type_specific[0];
+};
+
+enum sli4_pcie_desc_flags {
+	SLI4_PCIE_DESC_IMM		= 0x4000,
+	SLI4_PCIE_DESC_NOSV		= 0x8000,
+
+	SLI4_PCIE_DESC_PF_NO		= 0x3ff0000,
+
+	SLI4_PCIE_DESC_MISSN_ROLE	= 0xff,
+	SLI4_PCIE_DESC_PCHG		= 0x8000000,
+	SLI4_PCIE_DESC_SCHG		= 0x10000000,
+	SLI4_PCIE_DESC_XCHG		= 0x20000000,
+	SLI4_PCIE_DESC_XROM		= 0xc0000000
+};
+
+struct sli4_pcie_resource_descriptor_v1 {
+	u8		descriptor_type;
+	u8		descriptor_length;
+	__le16		imm_nosv_dword;
+	__le32		pf_number_dword;
+	__le32		rsvd3;
+	u8		sriov_state;
+	u8		pf_state;
+	u8		pf_type;
+	u8		rsvd4;
+	__le16		number_of_vfs;
+	__le16		rsvd5;
+	__le32		mission_roles_dword;
+	__le32		rsvd7[16];
+};
+
+struct sli4_rqst_cmn_get_function_config {
+	struct sli4_rqst_hdr  hdr;
+};
+
+struct sli4_rsp_cmn_get_function_config {
+	struct sli4_rsp_hdr	hdr;
+	__le32			desc_count;
+	__le32			desc[54];
+};
+
+/* Link Config Descriptor for link config functions */
+struct sli4_link_config_descriptor {
+	u8		link_config_id;
+	u8		rsvd1[3];
+	__le32		config_description[8];
+};
+
+#define MAX_LINK_DES	10
+
+struct sli4_rqst_cmn_get_reconfig_link_info {
+	struct sli4_rqst_hdr  hdr;
+};
+
+struct sli4_rsp_cmn_get_reconfig_link_info {
+	struct sli4_rsp_hdr	hdr;
+	u8			active_link_config_id;
+	u8			rsvd17;
+	u8			next_link_config_id;
+	u8			rsvd19;
+	__le32			link_configuration_descriptor_count;
+	struct sli4_link_config_descriptor
+				desc[MAX_LINK_DES];
+};
+
+enum sli4_set_reconfig_link_flags {
+	SLI4_SET_RECONFIG_LINKID_NEXT	= 0xff,
+	SLI4_SET_RECONFIG_LINKID_FD	= 1u << 31,
+};
+
+struct sli4_rqst_cmn_set_reconfig_link_id {
+	struct sli4_rqst_hdr  hdr;
+	__le32			dw4_flags;
+};
+
+struct sli4_rsp_cmn_set_reconfig_link_id {
+	struct sli4_rsp_hdr	hdr;
+};
+
+struct sli4_rqst_lowlevel_set_watchdog {
+	struct sli4_rqst_hdr	hdr;
+	__le16			watchdog_timeout;
+	__le16			rsvd18;
+};
+
+struct sli4_rsp_lowlevel_set_watchdog {
+	struct sli4_rsp_hdr	hdr;
+	__le32			rsvd;
+};
+
+/* FC opcode (OPC) values */
+enum sli4_fc_opcodes {
+	SLI4_OPC_WQ_CREATE		= 0x1,
+	SLI4_OPC_WQ_DESTROY		= 0x2,
+	SLI4_OPC_POST_SGL_PAGES		= 0x3,
+	SLI4_OPC_RQ_CREATE		= 0x5,
+	SLI4_OPC_RQ_DESTROY		= 0x6,
+	SLI4_OPC_READ_FCF_TABLE		= 0x8,
+	SLI4_OPC_POST_HDR_TEMPLATES	= 0xb,
+	SLI4_OPC_REDISCOVER_FCF		= 0x10,
+};
+
+/* Use the default CQ associated with the WQ */
+#define SLI4_CQ_DEFAULT 0xffff
+
+/*
+ * POST_SGL_PAGES
+ *
+ * Register the scatter gather list (SGL) memory and
+ * associate it with an XRI.
+ */
+struct sli4_rqst_post_sgl_pages {
+	struct sli4_rqst_hdr	hdr;
+	__le16			xri_start;
+	__le16			xri_count;
+	struct {
+		__le32		page0_low;
+		__le32		page0_high;
+		__le32		page1_low;
+		__le32		page1_high;
+	} page_set[10];
+};
+
+struct sli4_rsp_post_sgl_pages {
+	struct sli4_rsp_hdr	hdr;
+};
+
+struct sli4_rqst_post_hdr_templates {
+	struct sli4_rqst_hdr	hdr;
+	__le16			rpi_offset;
+	__le16			page_count;
+	struct sli4_dmaaddr	page_descriptor[0];
+};
+
+#define SLI4_HDR_TEMPLATE_SIZE		64
+
+enum sli4_io_flags {
+/* The XRI associated with this IO is already active */
+	SLI4_IO_CONTINUATION		= 1 << 0,
+/* Automatically generate a good RSP frame */
+	SLI4_IO_AUTO_GOOD_RESPONSE	= 1 << 1,
+	SLI4_IO_NO_ABORT		= 1 << 2,
+/* Set the DNRX bit because no auto xref rdy buffer is posted */
+	SLI4_IO_DNRX			= 1 << 3,
+};
+
+enum sli4_callback {
+	SLI4_CB_LINK,
+	SLI4_CB_MAX,
+};
+
+enum sli4_link_status {
+	SLI4_LINK_STATUS_UP,
+	SLI4_LINK_STATUS_DOWN,
+	SLI4_LINK_STATUS_NO_ALPA,
+	SLI4_LINK_STATUS_MAX,
+};
+
+enum sli4_link_topology {
+	SLI4_LINK_TOPO_NPORT = 1,
+	SLI4_LINK_TOPO_LOOP,
+	SLI4_LINK_TOPO_LOOPBACK_INTERNAL,
+	SLI4_LINK_TOPO_LOOPBACK_EXTERNAL,
+	SLI4_LINK_TOPO_NONE,
+	SLI4_LINK_TOPO_MAX,
+};
+
+enum sli4_link_medium {
+	SLI4_LINK_MEDIUM_ETHERNET,
+	SLI4_LINK_MEDIUM_FC,
+	SLI4_LINK_MEDIUM_MAX,
+};
 /******Driver specific structures******/
 
 struct sli4_queue {
@@ -2074,4 +3586,116 @@  struct sli_fcp_tgt_params {
 	u16		tag;
 };
 
+struct sli4_link_event {
+	enum sli4_link_status	status;
+	enum sli4_link_topology	topology;
+	enum sli4_link_medium	medium;
+	u32			speed;
+	u8			*loop_map;
+	u32			fc_id;
+};
+
+enum sli4_resource {
+	SLI4_RSRC_VFI,
+	SLI4_RSRC_VPI,
+	SLI4_RSRC_RPI,
+	SLI4_RSRC_XRI,
+	SLI4_RSRC_FCFI,
+	SLI4_RSRC_MAX,
+};
+
+struct sli4_extent {
+	u32		number;
+	u32		size;
+	u32		n_alloc;
+	u32		*base;
+	unsigned long	*use_map;
+	u32		map_size;
+};
+
+struct sli4_queue_info {
+	u16	max_qcount[SLI4_QTYPE_MAX];
+	u32	max_qentries[SLI4_QTYPE_MAX];
+	u16	count_mask[SLI4_QTYPE_MAX];
+	u16	count_method[SLI4_QTYPE_MAX];
+	u32	qpage_count[SLI4_QTYPE_MAX];
+};
+
+struct sli4_params {
+	u8	has_extents;
+	u8	auto_reg;
+	u8	auto_xfer_rdy;
+	u8	hdr_template_req;
+	u8	perf_hint;
+	u8	perf_wq_id_association;
+	u8	cq_create_version;
+	u8	mq_create_version;
+	u8	high_login_mode;
+	u8	sgl_pre_registered;
+	u8	sgl_pre_reg_required;
+	u8	t10_dif_inline_capable;
+	u8	t10_dif_separate_capable;
+};
+
+struct sli4 {
+	void			*os;
+	struct pci_dev		*pci;
+	void __iomem		*reg[PCI_STD_NUM_BARS];
+
+	u32			sli_rev;
+	u32			sli_family;
+	u32			if_type;
+
+	u16			asic_type;
+	u16			asic_rev;
+
+	u16			e_d_tov;
+	u16			r_a_tov;
+	struct sli4_queue_info	qinfo;
+	u16			link_module_type;
+	u8			rq_batch;
+	u8			port_number;
+	char			port_name[2];
+	u16			rq_min_buf_size;
+	u32			rq_max_buf_size;
+	u8			topology;
+	u8			wwpn[8];
+	u8			wwnn[8];
+	u32			fw_rev[2];
+	u8			fw_name[2][16];
+	char			ipl_name[16];
+	u32			hw_rev[3];
+	char			modeldesc[64];
+	char			bios_version_string[32];
+	u32			wqe_size;
+	u32			vpd_length;
+	/*
+	 * Tracks the port resources using extents metaphor. For
+	 * devices that don't implement extents (i.e.
+	 * has_extents == FALSE), the code models each resource as
+	 * a single large extent.
+	 */
+	struct sli4_extent	ext[SLI4_RSRC_MAX];
+	u32			features;
+	struct sli4_params	params;
+	u32			sge_supported_length;
+	u32			sgl_page_sizes;
+	u32			max_sgl_pages;
+
+	/*
+	 * Callback functions
+	 */
+	int			(*link)(void *ctx, void *event);
+	void			*link_arg;
+
+	struct efc_dma		bmbx;
+
+	/* Save pointer to physical memory descriptor for non-embedded
+	 * SLI_CONFIG commands for BMBX dumping purposes
+	 */
+	struct efc_dma		*bmbx_non_emb_pmd;
+
+	struct efc_dma		vpd_data;
+};
+
 #endif /* !_SLI4_H */