diff options
Diffstat (limited to 'include/linux/qed')
| -rw-r--r-- | include/linux/qed/common_hsi.h | 397 | ||||
| -rw-r--r-- | include/linux/qed/eth_common.h | 124 | ||||
| -rw-r--r-- | include/linux/qed/iscsi_common.h | 1439 | ||||
| -rw-r--r-- | include/linux/qed/qed_chain.h | 556 | ||||
| -rw-r--r-- | include/linux/qed/qed_eth_if.h | 64 | ||||
| -rw-r--r-- | include/linux/qed/qed_if.h | 182 | ||||
| -rw-r--r-- | include/linux/qed/rdma_common.h | 44 | ||||
| -rw-r--r-- | include/linux/qed/roce_common.h | 17 | ||||
| -rw-r--r-- | include/linux/qed/storage_common.h | 91 | ||||
| -rw-r--r-- | include/linux/qed/tcp_common.h | 226 | 
10 files changed, 2808 insertions, 332 deletions
| diff --git a/include/linux/qed/common_hsi.h b/include/linux/qed/common_hsi.h index 3f14c7efe68f..40c0ada01806 100644 --- a/include/linux/qed/common_hsi.h +++ b/include/linux/qed/common_hsi.h @@ -12,10 +12,21 @@  #define CORE_SPQE_PAGE_SIZE_BYTES                       4096  #define X_FINAL_CLEANUP_AGG_INT 1 +#define NUM_OF_GLOBAL_QUEUES                            128 + +/* Queue Zone sizes in bytes */ +#define TSTORM_QZONE_SIZE 8 +#define MSTORM_QZONE_SIZE 0 +#define USTORM_QZONE_SIZE 8 +#define XSTORM_QZONE_SIZE 8 +#define YSTORM_QZONE_SIZE 0 +#define PSTORM_QZONE_SIZE 0 + +#define ETH_MAX_NUM_RX_QUEUES_PER_VF 16  #define FW_MAJOR_VERSION	8 -#define FW_MINOR_VERSION	7 -#define FW_REVISION_VERSION	3 +#define FW_MINOR_VERSION	10 +#define FW_REVISION_VERSION	5  #define FW_ENGINEERING_VERSION	0  /***********************/ @@ -97,45 +108,86 @@  #define DQ_XCM_AGG_VAL_SEL_REG6   7  /* XCM agg val selection */ -#define DQ_XCM_ETH_EDPM_NUM_BDS_CMD \ -	DQ_XCM_AGG_VAL_SEL_WORD2 -#define DQ_XCM_ETH_TX_BD_CONS_CMD \ -	DQ_XCM_AGG_VAL_SEL_WORD3 -#define DQ_XCM_CORE_TX_BD_CONS_CMD \ -	DQ_XCM_AGG_VAL_SEL_WORD3 -#define DQ_XCM_ETH_TX_BD_PROD_CMD \ -	DQ_XCM_AGG_VAL_SEL_WORD4 -#define DQ_XCM_CORE_TX_BD_PROD_CMD \ -	DQ_XCM_AGG_VAL_SEL_WORD4 -#define DQ_XCM_CORE_SPQ_PROD_CMD \ -	DQ_XCM_AGG_VAL_SEL_WORD4 -#define DQ_XCM_ETH_GO_TO_BD_CONS_CMD            DQ_XCM_AGG_VAL_SEL_WORD5 +#define	DQ_XCM_CORE_TX_BD_CONS_CMD	DQ_XCM_AGG_VAL_SEL_WORD3 +#define	DQ_XCM_CORE_TX_BD_PROD_CMD	DQ_XCM_AGG_VAL_SEL_WORD4 +#define	DQ_XCM_CORE_SPQ_PROD_CMD	DQ_XCM_AGG_VAL_SEL_WORD4 +#define	DQ_XCM_ETH_EDPM_NUM_BDS_CMD	DQ_XCM_AGG_VAL_SEL_WORD2 +#define	DQ_XCM_ETH_TX_BD_CONS_CMD	DQ_XCM_AGG_VAL_SEL_WORD3 +#define	DQ_XCM_ETH_TX_BD_PROD_CMD	DQ_XCM_AGG_VAL_SEL_WORD4 +#define	DQ_XCM_ETH_GO_TO_BD_CONS_CMD	DQ_XCM_AGG_VAL_SEL_WORD5 + +/* UCM agg val selection (HW) */ +#define	DQ_UCM_AGG_VAL_SEL_WORD0	0 +#define	DQ_UCM_AGG_VAL_SEL_WORD1	1 +#define	DQ_UCM_AGG_VAL_SEL_WORD2	2 +#define	DQ_UCM_AGG_VAL_SEL_WORD3	3 +#define	DQ_UCM_AGG_VAL_SEL_REG0	4 +#define	DQ_UCM_AGG_VAL_SEL_REG1	5 +#define	DQ_UCM_AGG_VAL_SEL_REG2	6 +#define	DQ_UCM_AGG_VAL_SEL_REG3	7 + +/* UCM agg val selection (FW) */ +#define DQ_UCM_ETH_PMD_TX_CONS_CMD	DQ_UCM_AGG_VAL_SEL_WORD2 +#define DQ_UCM_ETH_PMD_RX_CONS_CMD	DQ_UCM_AGG_VAL_SEL_WORD3 +#define DQ_UCM_ROCE_CQ_CONS_CMD		DQ_UCM_AGG_VAL_SEL_REG0 +#define DQ_UCM_ROCE_CQ_PROD_CMD		DQ_UCM_AGG_VAL_SEL_REG2 + +/* TCM agg val selection (HW) */ +#define	DQ_TCM_AGG_VAL_SEL_WORD0	0 +#define	DQ_TCM_AGG_VAL_SEL_WORD1	1 +#define	DQ_TCM_AGG_VAL_SEL_WORD2	2 +#define	DQ_TCM_AGG_VAL_SEL_WORD3	3 +#define	DQ_TCM_AGG_VAL_SEL_REG1		4 +#define	DQ_TCM_AGG_VAL_SEL_REG2		5 +#define	DQ_TCM_AGG_VAL_SEL_REG6		6 +#define	DQ_TCM_AGG_VAL_SEL_REG9		7 + +/* TCM agg val selection (FW) */ +#define DQ_TCM_L2B_BD_PROD_CMD \ +	DQ_TCM_AGG_VAL_SEL_WORD1 +#define DQ_TCM_ROCE_RQ_PROD_CMD	\ +	DQ_TCM_AGG_VAL_SEL_WORD0  /* XCM agg counter flag selection */ -#define DQ_XCM_AGG_FLG_SHIFT_BIT14  0 -#define DQ_XCM_AGG_FLG_SHIFT_BIT15  1 -#define DQ_XCM_AGG_FLG_SHIFT_CF12   2 -#define DQ_XCM_AGG_FLG_SHIFT_CF13   3 -#define DQ_XCM_AGG_FLG_SHIFT_CF18   4 -#define DQ_XCM_AGG_FLG_SHIFT_CF19   5 -#define DQ_XCM_AGG_FLG_SHIFT_CF22   6 -#define DQ_XCM_AGG_FLG_SHIFT_CF23   7 +#define	DQ_XCM_AGG_FLG_SHIFT_BIT14	0 +#define	DQ_XCM_AGG_FLG_SHIFT_BIT15	1 +#define	DQ_XCM_AGG_FLG_SHIFT_CF12	2 +#define	DQ_XCM_AGG_FLG_SHIFT_CF13	3 +#define	DQ_XCM_AGG_FLG_SHIFT_CF18	4 +#define	DQ_XCM_AGG_FLG_SHIFT_CF19	5 +#define	DQ_XCM_AGG_FLG_SHIFT_CF22	6 +#define	DQ_XCM_AGG_FLG_SHIFT_CF23	7  /* XCM agg counter flag selection */ -#define DQ_XCM_ETH_DQ_CF_CMD		(1 << \ -					DQ_XCM_AGG_FLG_SHIFT_CF18) -#define DQ_XCM_CORE_DQ_CF_CMD		(1 << \ -					DQ_XCM_AGG_FLG_SHIFT_CF18) -#define DQ_XCM_ETH_TERMINATE_CMD	(1 << \ -					DQ_XCM_AGG_FLG_SHIFT_CF19) -#define DQ_XCM_CORE_TERMINATE_CMD	(1 << \ -					DQ_XCM_AGG_FLG_SHIFT_CF19) -#define DQ_XCM_ETH_SLOW_PATH_CMD	(1 << \ -					DQ_XCM_AGG_FLG_SHIFT_CF22) -#define DQ_XCM_CORE_SLOW_PATH_CMD	(1 << \ -					DQ_XCM_AGG_FLG_SHIFT_CF22) -#define DQ_XCM_ETH_TPH_EN_CMD		(1 << \ -					DQ_XCM_AGG_FLG_SHIFT_CF23) +#define DQ_XCM_CORE_DQ_CF_CMD		(1 << DQ_XCM_AGG_FLG_SHIFT_CF18) +#define DQ_XCM_CORE_TERMINATE_CMD	(1 << DQ_XCM_AGG_FLG_SHIFT_CF19) +#define DQ_XCM_CORE_SLOW_PATH_CMD	(1 << DQ_XCM_AGG_FLG_SHIFT_CF22) +#define DQ_XCM_ETH_DQ_CF_CMD		(1 << DQ_XCM_AGG_FLG_SHIFT_CF18) +#define DQ_XCM_ETH_TERMINATE_CMD	(1 << DQ_XCM_AGG_FLG_SHIFT_CF19) +#define DQ_XCM_ETH_SLOW_PATH_CMD	(1 << DQ_XCM_AGG_FLG_SHIFT_CF22) +#define DQ_XCM_ETH_TPH_EN_CMD		(1 << DQ_XCM_AGG_FLG_SHIFT_CF23) + +/* UCM agg counter flag selection (HW) */ +#define	DQ_UCM_AGG_FLG_SHIFT_CF0	0 +#define	DQ_UCM_AGG_FLG_SHIFT_CF1	1 +#define	DQ_UCM_AGG_FLG_SHIFT_CF3	2 +#define	DQ_UCM_AGG_FLG_SHIFT_CF4	3 +#define	DQ_UCM_AGG_FLG_SHIFT_CF5	4 +#define	DQ_UCM_AGG_FLG_SHIFT_CF6	5 +#define	DQ_UCM_AGG_FLG_SHIFT_RULE0EN	6 +#define	DQ_UCM_AGG_FLG_SHIFT_RULE1EN	7 + +/* UCM agg counter flag selection (FW) */ +#define DQ_UCM_ETH_PMD_TX_ARM_CMD	(1 << DQ_UCM_AGG_FLG_SHIFT_CF4) +#define DQ_UCM_ETH_PMD_RX_ARM_CMD	(1 << DQ_UCM_AGG_FLG_SHIFT_CF5) + +#define	DQ_REGION_SHIFT	(12) + +/* DPM */ +#define	DQ_DPM_WQE_BUFF_SIZE	(320) + +/* Conn type ranges */ +#define	DQ_CONN_TYPE_RANGE_SHIFT	(4)  /*****************/  /* QM CONSTANTS  */ @@ -282,8 +334,6 @@  	(PXP_EXTERNAL_BAR_GLOBAL_WINDOW_START + \  	 PXP_EXTERNAL_BAR_GLOBAL_WINDOW_LENGTH - 1) -#define PXP_ILT_PAGE_SIZE_NUM_BITS_MIN	12 -#define PXP_ILT_BLOCK_FACTOR_MULTIPLIER	1024  #define PXP_VF_BAR0_START_IGU                   0  #define PXP_VF_BAR0_IGU_LENGTH                  0x3000 @@ -342,6 +392,9 @@  #define PXP_VF_BAR0_GRC_WINDOW_LENGTH           32 +#define PXP_ILT_PAGE_SIZE_NUM_BITS_MIN		12 +#define PXP_ILT_BLOCK_FACTOR_MULTIPLIER		1024 +  /* ILT Records */  #define PXP_NUM_ILT_RECORDS_BB 7600  #define PXP_NUM_ILT_RECORDS_K2 11000 @@ -379,6 +432,38 @@ struct async_data {  	u8	fw_debug_param;  }; +struct coalescing_timeset { +	u8 value; +#define	COALESCING_TIMESET_TIMESET_MASK		0x7F +#define	COALESCING_TIMESET_TIMESET_SHIFT	0 +#define	COALESCING_TIMESET_VALID_MASK		0x1 +#define	COALESCING_TIMESET_VALID_SHIFT		7 +}; + +struct common_prs_pf_msg_info { +	__le32 value; +#define	COMMON_PRS_PF_MSG_INFO_NPAR_DEFAULT_PF_MASK	0x1 +#define	COMMON_PRS_PF_MSG_INFO_NPAR_DEFAULT_PF_SHIFT	0 +#define	COMMON_PRS_PF_MSG_INFO_FW_DEBUG_1_MASK		0x1 +#define	COMMON_PRS_PF_MSG_INFO_FW_DEBUG_1_SHIFT		1 +#define	COMMON_PRS_PF_MSG_INFO_FW_DEBUG_2_MASK		0x1 +#define	COMMON_PRS_PF_MSG_INFO_FW_DEBUG_2_SHIFT		2 +#define	COMMON_PRS_PF_MSG_INFO_FW_DEBUG_3_MASK		0x1 +#define	COMMON_PRS_PF_MSG_INFO_FW_DEBUG_3_SHIFT		3 +#define	COMMON_PRS_PF_MSG_INFO_RESERVED_MASK		0xFFFFFFF +#define	COMMON_PRS_PF_MSG_INFO_RESERVED_SHIFT		4 +}; + +struct common_queue_zone { +	__le16 ring_drv_data_consumer; +	__le16 reserved; +}; + +struct eth_rx_prod_data { +	__le16 bd_prod; +	__le16 cqe_prod; +}; +  struct regpair {  	__le32	lo;  	__le32	hi; @@ -388,11 +473,23 @@ struct vf_pf_channel_eqe_data {  	struct regpair msg_addr;  }; +struct malicious_vf_eqe_data { +	u8 vf_id; +	u8 err_id; +	__le16 reserved[3]; +}; + +struct initial_cleanup_eqe_data { +	u8 vf_id; +	u8 reserved[7]; +}; +  /* Event Data Union */  union event_ring_data { -	u8				bytes[8]; -	struct vf_pf_channel_eqe_data	vf_pf_channel; -	struct async_data		async_info; +	u8 bytes[8]; +	struct vf_pf_channel_eqe_data vf_pf_channel; +	struct malicious_vf_eqe_data malicious_vf; +	struct initial_cleanup_eqe_data vf_init_cleanup;  };  /* Event Ring Entry */ @@ -420,9 +517,9 @@ enum mf_mode {  /* Per-protocol connection types */  enum protocol_type { -	PROTOCOLID_RESERVED1, +	PROTOCOLID_ISCSI,  	PROTOCOLID_RESERVED2, -	PROTOCOLID_RESERVED3, +	PROTOCOLID_ROCE,  	PROTOCOLID_CORE,  	PROTOCOLID_ETH,  	PROTOCOLID_RESERVED4, @@ -433,6 +530,16 @@ enum protocol_type {  	MAX_PROTOCOL_TYPE  }; +struct ustorm_eth_queue_zone { +	struct coalescing_timeset int_coalescing_timeset; +	u8 reserved[3]; +}; + +struct ustorm_queue_zone { +	struct ustorm_eth_queue_zone eth; +	struct common_queue_zone common; +}; +  /* status block structure */  struct cau_pi_entry {  	u32 prod; @@ -588,7 +695,10 @@ struct parsing_and_err_flags {  #define PARSING_AND_ERR_FLAGS_TUNNELL4CHKSMERROR_SHIFT         15  }; -/* Concrete Function ID. */ +struct pb_context { +	__le32 crc[4]; +}; +  struct pxp_concrete_fid {  	__le16 fid;  #define PXP_CONCRETE_FID_PFID_MASK     0xF @@ -655,6 +765,72 @@ struct pxp_ptt_entry {  };  /* RSS hash type */ +struct rdif_task_context { +	__le32 initial_ref_tag; +	__le16 app_tag_value; +	__le16 app_tag_mask; +	u8 flags0; +#define RDIF_TASK_CONTEXT_IGNOREAPPTAG_MASK            0x1 +#define RDIF_TASK_CONTEXT_IGNOREAPPTAG_SHIFT           0 +#define RDIF_TASK_CONTEXT_INITIALREFTAGVALID_MASK      0x1 +#define RDIF_TASK_CONTEXT_INITIALREFTAGVALID_SHIFT     1 +#define RDIF_TASK_CONTEXT_HOSTGUARDTYPE_MASK           0x1 +#define RDIF_TASK_CONTEXT_HOSTGUARDTYPE_SHIFT          2 +#define RDIF_TASK_CONTEXT_SETERRORWITHEOP_MASK         0x1 +#define RDIF_TASK_CONTEXT_SETERRORWITHEOP_SHIFT        3 +#define RDIF_TASK_CONTEXT_PROTECTIONTYPE_MASK          0x3 +#define RDIF_TASK_CONTEXT_PROTECTIONTYPE_SHIFT         4 +#define RDIF_TASK_CONTEXT_CRC_SEED_MASK                0x1 +#define RDIF_TASK_CONTEXT_CRC_SEED_SHIFT               6 +#define RDIF_TASK_CONTEXT_KEEPREFTAGCONST_MASK         0x1 +#define RDIF_TASK_CONTEXT_KEEPREFTAGCONST_SHIFT        7 +	u8 partial_dif_data[7]; +	__le16 partial_crc_value; +	__le16 partial_checksum_value; +	__le32 offset_in_io; +	__le16 flags1; +#define RDIF_TASK_CONTEXT_VALIDATEGUARD_MASK           0x1 +#define RDIF_TASK_CONTEXT_VALIDATEGUARD_SHIFT          0 +#define RDIF_TASK_CONTEXT_VALIDATEAPPTAG_MASK          0x1 +#define RDIF_TASK_CONTEXT_VALIDATEAPPTAG_SHIFT         1 +#define RDIF_TASK_CONTEXT_VALIDATEREFTAG_MASK          0x1 +#define RDIF_TASK_CONTEXT_VALIDATEREFTAG_SHIFT         2 +#define RDIF_TASK_CONTEXT_FORWARDGUARD_MASK            0x1 +#define RDIF_TASK_CONTEXT_FORWARDGUARD_SHIFT           3 +#define RDIF_TASK_CONTEXT_FORWARDAPPTAG_MASK           0x1 +#define RDIF_TASK_CONTEXT_FORWARDAPPTAG_SHIFT          4 +#define RDIF_TASK_CONTEXT_FORWARDREFTAG_MASK           0x1 +#define RDIF_TASK_CONTEXT_FORWARDREFTAG_SHIFT          5 +#define RDIF_TASK_CONTEXT_INTERVALSIZE_MASK            0x7 +#define RDIF_TASK_CONTEXT_INTERVALSIZE_SHIFT           6 +#define RDIF_TASK_CONTEXT_HOSTINTERFACE_MASK           0x3 +#define RDIF_TASK_CONTEXT_HOSTINTERFACE_SHIFT          9 +#define RDIF_TASK_CONTEXT_DIFBEFOREDATA_MASK           0x1 +#define RDIF_TASK_CONTEXT_DIFBEFOREDATA_SHIFT          11 +#define RDIF_TASK_CONTEXT_RESERVED0_MASK               0x1 +#define RDIF_TASK_CONTEXT_RESERVED0_SHIFT              12 +#define RDIF_TASK_CONTEXT_NETWORKINTERFACE_MASK        0x1 +#define RDIF_TASK_CONTEXT_NETWORKINTERFACE_SHIFT       13 +#define RDIF_TASK_CONTEXT_FORWARDAPPTAGWITHMASK_MASK   0x1 +#define RDIF_TASK_CONTEXT_FORWARDAPPTAGWITHMASK_SHIFT  14 +#define RDIF_TASK_CONTEXT_FORWARDREFTAGWITHMASK_MASK   0x1 +#define RDIF_TASK_CONTEXT_FORWARDREFTAGWITHMASK_SHIFT  15 +	__le16 state; +#define RDIF_TASK_CONTEXT_RECEIVEDDIFBYTESLEFT_MASK    0xF +#define RDIF_TASK_CONTEXT_RECEIVEDDIFBYTESLEFT_SHIFT   0 +#define RDIF_TASK_CONTEXT_TRANSMITEDDIFBYTESLEFT_MASK  0xF +#define RDIF_TASK_CONTEXT_TRANSMITEDDIFBYTESLEFT_SHIFT 4 +#define RDIF_TASK_CONTEXT_ERRORINIO_MASK               0x1 +#define RDIF_TASK_CONTEXT_ERRORINIO_SHIFT              8 +#define RDIF_TASK_CONTEXT_CHECKSUMOVERFLOW_MASK        0x1 +#define RDIF_TASK_CONTEXT_CHECKSUMOVERFLOW_SHIFT       9 +#define RDIF_TASK_CONTEXT_REFTAGMASK_MASK              0xF +#define RDIF_TASK_CONTEXT_REFTAGMASK_SHIFT             10 +#define RDIF_TASK_CONTEXT_RESERVED1_MASK               0x3 +#define RDIF_TASK_CONTEXT_RESERVED1_SHIFT              14 +	__le32 reserved2; +}; +  enum rss_hash_type {  	RSS_HASH_TYPE_DEFAULT	= 0,  	RSS_HASH_TYPE_IPV4	= 1, @@ -683,19 +859,122 @@ struct status_block {  #define STATUS_BLOCK_ZERO_PAD3_SHIFT  24  }; -struct tunnel_parsing_flags { -	u8 flags; -#define TUNNEL_PARSING_FLAGS_TYPE_MASK              0x3 -#define TUNNEL_PARSING_FLAGS_TYPE_SHIFT             0 -#define TUNNEL_PARSING_FLAGS_TENNANT_ID_EXIST_MASK  0x1 -#define TUNNEL_PARSING_FLAGS_TENNANT_ID_EXIST_SHIFT 2 -#define TUNNEL_PARSING_FLAGS_NEXT_PROTOCOL_MASK     0x3 -#define TUNNEL_PARSING_FLAGS_NEXT_PROTOCOL_SHIFT    3 -#define TUNNEL_PARSING_FLAGS_FIRSTHDRIPMATCH_MASK   0x1 -#define TUNNEL_PARSING_FLAGS_FIRSTHDRIPMATCH_SHIFT  5 -#define TUNNEL_PARSING_FLAGS_IPV4_FRAGMENT_MASK     0x1 -#define TUNNEL_PARSING_FLAGS_IPV4_FRAGMENT_SHIFT    6 -#define TUNNEL_PARSING_FLAGS_IPV4_OPTIONS_MASK      0x1 -#define TUNNEL_PARSING_FLAGS_IPV4_OPTIONS_SHIFT     7 +struct tdif_task_context { +	__le32 initial_ref_tag; +	__le16 app_tag_value; +	__le16 app_tag_mask; +	__le16 partial_crc_valueB; +	__le16 partial_checksum_valueB; +	__le16 stateB; +#define TDIF_TASK_CONTEXT_RECEIVEDDIFBYTESLEFTB_MASK    0xF +#define TDIF_TASK_CONTEXT_RECEIVEDDIFBYTESLEFTB_SHIFT   0 +#define TDIF_TASK_CONTEXT_TRANSMITEDDIFBYTESLEFTB_MASK  0xF +#define TDIF_TASK_CONTEXT_TRANSMITEDDIFBYTESLEFTB_SHIFT 4 +#define TDIF_TASK_CONTEXT_ERRORINIOB_MASK               0x1 +#define TDIF_TASK_CONTEXT_ERRORINIOB_SHIFT              8 +#define TDIF_TASK_CONTEXT_CHECKSUMOVERFLOW_MASK         0x1 +#define TDIF_TASK_CONTEXT_CHECKSUMOVERFLOW_SHIFT        9 +#define TDIF_TASK_CONTEXT_RESERVED0_MASK                0x3F +#define TDIF_TASK_CONTEXT_RESERVED0_SHIFT               10 +	u8 reserved1; +	u8 flags0; +#define TDIF_TASK_CONTEXT_IGNOREAPPTAG_MASK             0x1 +#define TDIF_TASK_CONTEXT_IGNOREAPPTAG_SHIFT            0 +#define TDIF_TASK_CONTEXT_INITIALREFTAGVALID_MASK       0x1 +#define TDIF_TASK_CONTEXT_INITIALREFTAGVALID_SHIFT      1 +#define TDIF_TASK_CONTEXT_HOSTGUARDTYPE_MASK            0x1 +#define TDIF_TASK_CONTEXT_HOSTGUARDTYPE_SHIFT           2 +#define TDIF_TASK_CONTEXT_SETERRORWITHEOP_MASK          0x1 +#define TDIF_TASK_CONTEXT_SETERRORWITHEOP_SHIFT         3 +#define TDIF_TASK_CONTEXT_PROTECTIONTYPE_MASK           0x3 +#define TDIF_TASK_CONTEXT_PROTECTIONTYPE_SHIFT          4 +#define TDIF_TASK_CONTEXT_CRC_SEED_MASK                 0x1 +#define TDIF_TASK_CONTEXT_CRC_SEED_SHIFT                6 +#define TDIF_TASK_CONTEXT_RESERVED2_MASK                0x1 +#define TDIF_TASK_CONTEXT_RESERVED2_SHIFT               7 +	__le32 flags1; +#define TDIF_TASK_CONTEXT_VALIDATEGUARD_MASK            0x1 +#define TDIF_TASK_CONTEXT_VALIDATEGUARD_SHIFT           0 +#define TDIF_TASK_CONTEXT_VALIDATEAPPTAG_MASK           0x1 +#define TDIF_TASK_CONTEXT_VALIDATEAPPTAG_SHIFT          1 +#define TDIF_TASK_CONTEXT_VALIDATEREFTAG_MASK           0x1 +#define TDIF_TASK_CONTEXT_VALIDATEREFTAG_SHIFT          2 +#define TDIF_TASK_CONTEXT_FORWARDGUARD_MASK             0x1 +#define TDIF_TASK_CONTEXT_FORWARDGUARD_SHIFT            3 +#define TDIF_TASK_CONTEXT_FORWARDAPPTAG_MASK            0x1 +#define TDIF_TASK_CONTEXT_FORWARDAPPTAG_SHIFT           4 +#define TDIF_TASK_CONTEXT_FORWARDREFTAG_MASK            0x1 +#define TDIF_TASK_CONTEXT_FORWARDREFTAG_SHIFT           5 +#define TDIF_TASK_CONTEXT_INTERVALSIZE_MASK             0x7 +#define TDIF_TASK_CONTEXT_INTERVALSIZE_SHIFT            6 +#define TDIF_TASK_CONTEXT_HOSTINTERFACE_MASK            0x3 +#define TDIF_TASK_CONTEXT_HOSTINTERFACE_SHIFT           9 +#define TDIF_TASK_CONTEXT_DIFBEFOREDATA_MASK            0x1 +#define TDIF_TASK_CONTEXT_DIFBEFOREDATA_SHIFT           11 +#define TDIF_TASK_CONTEXT_RESERVED3_MASK                0x1 +#define TDIF_TASK_CONTEXT_RESERVED3_SHIFT               12 +#define TDIF_TASK_CONTEXT_NETWORKINTERFACE_MASK         0x1 +#define TDIF_TASK_CONTEXT_NETWORKINTERFACE_SHIFT        13 +#define TDIF_TASK_CONTEXT_RECEIVEDDIFBYTESLEFTA_MASK    0xF +#define TDIF_TASK_CONTEXT_RECEIVEDDIFBYTESLEFTA_SHIFT   14 +#define TDIF_TASK_CONTEXT_TRANSMITEDDIFBYTESLEFTA_MASK  0xF +#define TDIF_TASK_CONTEXT_TRANSMITEDDIFBYTESLEFTA_SHIFT 18 +#define TDIF_TASK_CONTEXT_ERRORINIOA_MASK               0x1 +#define TDIF_TASK_CONTEXT_ERRORINIOA_SHIFT              22 +#define TDIF_TASK_CONTEXT_CHECKSUMOVERFLOWA_MASK        0x1 +#define TDIF_TASK_CONTEXT_CHECKSUMOVERFLOWA_SHIFT       23 +#define TDIF_TASK_CONTEXT_REFTAGMASK_MASK               0xF +#define TDIF_TASK_CONTEXT_REFTAGMASK_SHIFT              24 +#define TDIF_TASK_CONTEXT_FORWARDAPPTAGWITHMASK_MASK    0x1 +#define TDIF_TASK_CONTEXT_FORWARDAPPTAGWITHMASK_SHIFT   28 +#define TDIF_TASK_CONTEXT_FORWARDREFTAGWITHMASK_MASK    0x1 +#define TDIF_TASK_CONTEXT_FORWARDREFTAGWITHMASK_SHIFT   29 +#define TDIF_TASK_CONTEXT_KEEPREFTAGCONST_MASK          0x1 +#define TDIF_TASK_CONTEXT_KEEPREFTAGCONST_SHIFT         30 +#define TDIF_TASK_CONTEXT_RESERVED4_MASK                0x1 +#define TDIF_TASK_CONTEXT_RESERVED4_SHIFT               31 +	__le32 offset_in_iob; +	__le16 partial_crc_value_a; +	__le16 partial_checksum_valuea_; +	__le32 offset_in_ioa; +	u8 partial_dif_data_a[8]; +	u8 partial_dif_data_b[8]; +}; + +struct timers_context { +	__le32 logical_client0; +#define TIMERS_CONTEXT_EXPIRATIONTIMELC0_MASK     0xFFFFFFF +#define TIMERS_CONTEXT_EXPIRATIONTIMELC0_SHIFT    0 +#define TIMERS_CONTEXT_VALIDLC0_MASK              0x1 +#define TIMERS_CONTEXT_VALIDLC0_SHIFT             28 +#define TIMERS_CONTEXT_ACTIVELC0_MASK             0x1 +#define TIMERS_CONTEXT_ACTIVELC0_SHIFT            29 +#define TIMERS_CONTEXT_RESERVED0_MASK             0x3 +#define TIMERS_CONTEXT_RESERVED0_SHIFT            30 +	__le32 logical_client1; +#define TIMERS_CONTEXT_EXPIRATIONTIMELC1_MASK     0xFFFFFFF +#define TIMERS_CONTEXT_EXPIRATIONTIMELC1_SHIFT    0 +#define TIMERS_CONTEXT_VALIDLC1_MASK              0x1 +#define TIMERS_CONTEXT_VALIDLC1_SHIFT             28 +#define TIMERS_CONTEXT_ACTIVELC1_MASK             0x1 +#define TIMERS_CONTEXT_ACTIVELC1_SHIFT            29 +#define TIMERS_CONTEXT_RESERVED1_MASK             0x3 +#define TIMERS_CONTEXT_RESERVED1_SHIFT            30 +	__le32 logical_client2; +#define TIMERS_CONTEXT_EXPIRATIONTIMELC2_MASK     0xFFFFFFF +#define TIMERS_CONTEXT_EXPIRATIONTIMELC2_SHIFT    0 +#define TIMERS_CONTEXT_VALIDLC2_MASK              0x1 +#define TIMERS_CONTEXT_VALIDLC2_SHIFT             28 +#define TIMERS_CONTEXT_ACTIVELC2_MASK             0x1 +#define TIMERS_CONTEXT_ACTIVELC2_SHIFT            29 +#define TIMERS_CONTEXT_RESERVED2_MASK             0x3 +#define TIMERS_CONTEXT_RESERVED2_SHIFT            30 +	__le32 host_expiration_fields; +#define TIMERS_CONTEXT_HOSTEXPRIRATIONVALUE_MASK  0xFFFFFFF +#define TIMERS_CONTEXT_HOSTEXPRIRATIONVALUE_SHIFT 0 +#define TIMERS_CONTEXT_HOSTEXPRIRATIONVALID_MASK  0x1 +#define TIMERS_CONTEXT_HOSTEXPRIRATIONVALID_SHIFT 28 +#define TIMERS_CONTEXT_RESERVED3_MASK             0x7 +#define TIMERS_CONTEXT_RESERVED3_SHIFT            29  };  #endif /* __COMMON_HSI__ */ diff --git a/include/linux/qed/eth_common.h b/include/linux/qed/eth_common.h index 092cb0c1afcb..b5ebc697d05f 100644 --- a/include/linux/qed/eth_common.h +++ b/include/linux/qed/eth_common.h @@ -12,6 +12,8 @@  /********************/  /* ETH FW CONSTANTS */  /********************/ +#define ETH_HSI_VER_MAJOR                   3 +#define ETH_HSI_VER_MINOR                   0  #define ETH_CACHE_LINE_SIZE                 64  #define ETH_MAX_RAMROD_PER_CON                          8 @@ -57,19 +59,6 @@  #define ETH_TPA_CQE_CONT_LEN_LIST_SIZE    6  #define ETH_TPA_CQE_END_LEN_LIST_SIZE     4 -/* Queue Zone sizes */ -#define TSTORM_QZONE_SIZE    0 -#define MSTORM_QZONE_SIZE    sizeof(struct mstorm_eth_queue_zone) -#define USTORM_QZONE_SIZE    sizeof(struct ustorm_eth_queue_zone) -#define XSTORM_QZONE_SIZE    0 -#define YSTORM_QZONE_SIZE    sizeof(struct ystorm_eth_queue_zone) -#define PSTORM_QZONE_SIZE    0 - -/* Interrupt coalescing TimeSet */ -struct coalescing_timeset { -	u8	timeset; -	u8	valid; -};  struct eth_tx_1st_bd_flags {  	u8 bitfields; @@ -97,12 +86,12 @@ struct eth_tx_data_1st_bd {  	u8				nbds;  	struct eth_tx_1st_bd_flags	bd_flags;  	__le16				bitfields; -#define ETH_TX_DATA_1ST_BD_TUNN_CFG_OVERRIDE_MASK  0x1 -#define ETH_TX_DATA_1ST_BD_TUNN_CFG_OVERRIDE_SHIFT 0 +#define ETH_TX_DATA_1ST_BD_TUNN_FLAG_MASK  0x1 +#define ETH_TX_DATA_1ST_BD_TUNN_FLAG_SHIFT 0  #define ETH_TX_DATA_1ST_BD_RESERVED0_MASK          0x1  #define ETH_TX_DATA_1ST_BD_RESERVED0_SHIFT         1 -#define ETH_TX_DATA_1ST_BD_FW_USE_ONLY_MASK        0x3FFF -#define ETH_TX_DATA_1ST_BD_FW_USE_ONLY_SHIFT       2 +#define ETH_TX_DATA_1ST_BD_PKT_LEN_MASK    0x3FFF +#define ETH_TX_DATA_1ST_BD_PKT_LEN_SHIFT   2  };  /* The parsing information data for the second tx bd of a given packet. */ @@ -136,28 +125,51 @@ struct eth_tx_data_2nd_bd {  #define ETH_TX_DATA_2ND_BD_RESERVED0_SHIFT                13  }; +struct eth_fast_path_cqe_fw_debug { +	u8 reserved0; +	u8 reserved1; +	__le16 reserved2; +}; + +/*  tunneling parsing flags */ +struct eth_tunnel_parsing_flags { +	u8 flags; +#define	ETH_TUNNEL_PARSING_FLAGS_TYPE_MASK		0x3 +#define	ETH_TUNNEL_PARSING_FLAGS_TYPE_SHIFT		0 +#define	ETH_TUNNEL_PARSING_FLAGS_TENNANT_ID_EXIST_MASK	0x1 +#define	ETH_TUNNEL_PARSING_FLAGS_TENNANT_ID_EXIST_SHIFT	2 +#define	ETH_TUNNEL_PARSING_FLAGS_NEXT_PROTOCOL_MASK	0x3 +#define	ETH_TUNNEL_PARSING_FLAGS_NEXT_PROTOCOL_SHIFT	3 +#define	ETH_TUNNEL_PARSING_FLAGS_FIRSTHDRIPMATCH_MASK	0x1 +#define	ETH_TUNNEL_PARSING_FLAGS_FIRSTHDRIPMATCH_SHIFT	5 +#define	ETH_TUNNEL_PARSING_FLAGS_IPV4_FRAGMENT_MASK	0x1 +#define	ETH_TUNNEL_PARSING_FLAGS_IPV4_FRAGMENT_SHIFT	6 +#define	ETH_TUNNEL_PARSING_FLAGS_IPV4_OPTIONS_MASK	0x1 +#define	ETH_TUNNEL_PARSING_FLAGS_IPV4_OPTIONS_SHIFT	7 +}; +  /* Regular ETH Rx FP CQE. */  struct eth_fast_path_rx_reg_cqe { -	u8	type; -	u8	bitfields; +	u8 type; +	u8 bitfields;  #define ETH_FAST_PATH_RX_REG_CQE_RSS_HASH_TYPE_MASK  0x7  #define ETH_FAST_PATH_RX_REG_CQE_RSS_HASH_TYPE_SHIFT 0  #define ETH_FAST_PATH_RX_REG_CQE_TC_MASK             0xF  #define ETH_FAST_PATH_RX_REG_CQE_TC_SHIFT            3  #define ETH_FAST_PATH_RX_REG_CQE_RESERVED0_MASK      0x1  #define ETH_FAST_PATH_RX_REG_CQE_RESERVED0_SHIFT     7 -	__le16				pkt_len; -	struct parsing_and_err_flags	pars_flags; -	__le16				vlan_tag; -	__le32				rss_hash; -	__le16				len_on_first_bd; -	u8				placement_offset; -	struct tunnel_parsing_flags	tunnel_pars_flags; -	u8				bd_num; -	u8				reserved[7]; -	u32				fw_debug; -	u8				reserved1[3]; -	u8				flags; +	__le16 pkt_len; +	struct parsing_and_err_flags pars_flags; +	__le16 vlan_tag; +	__le32 rss_hash; +	__le16 len_on_first_bd; +	u8 placement_offset; +	struct eth_tunnel_parsing_flags tunnel_pars_flags; +	u8 bd_num; +	u8 reserved[7]; +	struct eth_fast_path_cqe_fw_debug fw_debug; +	u8 reserved1[3]; +	u8 flags;  #define ETH_FAST_PATH_RX_REG_CQE_VALID_MASK          0x1  #define ETH_FAST_PATH_RX_REG_CQE_VALID_SHIFT         0  #define ETH_FAST_PATH_RX_REG_CQE_VALID_TOGGLE_MASK   0x1 @@ -207,11 +219,11 @@ struct eth_fast_path_rx_tpa_start_cqe {  	__le32	rss_hash;  	__le16	len_on_first_bd;  	u8	placement_offset; -	struct tunnel_parsing_flags tunnel_pars_flags; +	struct eth_tunnel_parsing_flags tunnel_pars_flags;  	u8	tpa_agg_index;  	u8	header_len;  	__le16	ext_bd_len_list[ETH_TPA_CQE_START_LEN_LIST_SIZE]; -	u32	fw_debug; +	struct eth_fast_path_cqe_fw_debug fw_debug;  };  /* The L4 pseudo checksum mode for Ethernet */ @@ -264,12 +276,25 @@ enum eth_rx_cqe_type {  	MAX_ETH_RX_CQE_TYPE  }; -/* ETH Rx producers data */ -struct eth_rx_prod_data { -	__le16	bd_prod; -	__le16	cqe_prod; -	__le16	reserved; -	__le16	reserved1; +enum eth_rx_tunn_type { +	ETH_RX_NO_TUNN, +	ETH_RX_TUNN_GENEVE, +	ETH_RX_TUNN_GRE, +	ETH_RX_TUNN_VXLAN, +	MAX_ETH_RX_TUNN_TYPE +}; + +/*  Aggregation end reason. */ +enum eth_tpa_end_reason { +	ETH_AGG_END_UNUSED, +	ETH_AGG_END_SP_UPDATE, +	ETH_AGG_END_MAX_LEN, +	ETH_AGG_END_LAST_SEG, +	ETH_AGG_END_TIMEOUT, +	ETH_AGG_END_NOT_CONSISTENT, +	ETH_AGG_END_OUT_OF_ORDER, +	ETH_AGG_END_NON_TPA_SEG, +	MAX_ETH_TPA_END_REASON  };  /* The first tx bd of a given packet */ @@ -337,21 +362,18 @@ union eth_tx_bd_types {  };  /* Mstorm Queue Zone */ -struct mstorm_eth_queue_zone { -	struct eth_rx_prod_data rx_producers; -	__le32			reserved[2]; -}; - -/* Ustorm Queue Zone */ -struct ustorm_eth_queue_zone { -	struct coalescing_timeset	int_coalescing_timeset; -	__le16				reserved[3]; +enum eth_tx_tunn_type { +	ETH_TX_TUNN_GENEVE, +	ETH_TX_TUNN_TTAG, +	ETH_TX_TUNN_GRE, +	ETH_TX_TUNN_VXLAN, +	MAX_ETH_TX_TUNN_TYPE  };  /* Ystorm Queue Zone */ -struct ystorm_eth_queue_zone { -	struct coalescing_timeset	int_coalescing_timeset; -	__le16				reserved[3]; +struct xstorm_eth_queue_zone { +	struct coalescing_timeset int_coalescing_timeset; +	u8 reserved[7];  };  /* ETH doorbell data */ diff --git a/include/linux/qed/iscsi_common.h b/include/linux/qed/iscsi_common.h new file mode 100644 index 000000000000..b3c0feb15ae9 --- /dev/null +++ b/include/linux/qed/iscsi_common.h @@ -0,0 +1,1439 @@ +/* QLogic qed NIC Driver + * Copyright (c) 2015 QLogic Corporation + * + * This software is available under the terms of the GNU General Public License + * (GPL) Version 2, available from the file COPYING in the main directory of + * this source tree. + */ + +#ifndef __ISCSI_COMMON__ +#define __ISCSI_COMMON__ +/**********************/ +/* ISCSI FW CONSTANTS */ +/**********************/ + +/* iSCSI HSI constants */ +#define ISCSI_DEFAULT_MTU       (1500) + +/* Current iSCSI HSI version number composed of two fields (16 bit) */ +#define ISCSI_HSI_MAJOR_VERSION (0) +#define ISCSI_HSI_MINOR_VERSION (0) + +/* KWQ (kernel work queue) layer codes */ +#define ISCSI_SLOW_PATH_LAYER_CODE   (6) + +/* CQE completion status */ +#define ISCSI_EQE_COMPLETION_SUCCESS (0x0) +#define ISCSI_EQE_RST_CONN_RCVD (0x1) + +/* iSCSI parameter defaults */ +#define ISCSI_DEFAULT_HEADER_DIGEST         (0) +#define ISCSI_DEFAULT_DATA_DIGEST           (0) +#define ISCSI_DEFAULT_INITIAL_R2T           (1) +#define ISCSI_DEFAULT_IMMEDIATE_DATA        (1) +#define ISCSI_DEFAULT_MAX_PDU_LENGTH        (0x2000) +#define ISCSI_DEFAULT_FIRST_BURST_LENGTH    (0x10000) +#define ISCSI_DEFAULT_MAX_BURST_LENGTH      (0x40000) +#define ISCSI_DEFAULT_MAX_OUTSTANDING_R2T   (1) + +/* iSCSI parameter limits */ +#define ISCSI_MIN_VAL_MAX_PDU_LENGTH        (0x200) +#define ISCSI_MAX_VAL_MAX_PDU_LENGTH        (0xffffff) +#define ISCSI_MIN_VAL_BURST_LENGTH          (0x200) +#define ISCSI_MAX_VAL_BURST_LENGTH          (0xffffff) +#define ISCSI_MIN_VAL_MAX_OUTSTANDING_R2T   (1) +#define ISCSI_MAX_VAL_MAX_OUTSTANDING_R2T   (0xff) + +/* iSCSI reserved params */ +#define ISCSI_ITT_ALL_ONES	(0xffffffff) +#define ISCSI_TTT_ALL_ONES	(0xffffffff) + +#define ISCSI_OPTION_1_OFF_CHIP_TCP 1 +#define ISCSI_OPTION_2_ON_CHIP_TCP 2 + +#define ISCSI_INITIATOR_MODE 0 +#define ISCSI_TARGET_MODE 1 + +/* iSCSI request op codes */ +#define ISCSI_OPCODE_NOP_OUT_NO_IMM                     (0) +#define ISCSI_OPCODE_NOP_OUT                            ( \ +		ISCSI_OPCODE_NOP_OUT_NO_IMM | 0x40) +#define ISCSI_OPCODE_SCSI_CMD_NO_IMM            (1) +#define ISCSI_OPCODE_SCSI_CMD                           ( \ +		ISCSI_OPCODE_SCSI_CMD_NO_IMM | 0x40) +#define ISCSI_OPCODE_TMF_REQUEST_NO_IMM         (2) +#define ISCSI_OPCODE_TMF_REQUEST                        ( \ +		ISCSI_OPCODE_TMF_REQUEST_NO_IMM | 0x40) +#define ISCSI_OPCODE_LOGIN_REQUEST_NO_IMM       (3) +#define ISCSI_OPCODE_LOGIN_REQUEST                      ( \ +		ISCSI_OPCODE_LOGIN_REQUEST_NO_IMM | 0x40) +#define ISCSI_OPCODE_TEXT_REQUEST_NO_IMM        (4) +#define ISCSI_OPCODE_TEXT_REQUEST                       ( \ +		ISCSI_OPCODE_TEXT_REQUEST_NO_IMM | 0x40) +#define ISCSI_OPCODE_DATA_OUT                           (5) +#define ISCSI_OPCODE_LOGOUT_REQUEST_NO_IMM      (6) +#define ISCSI_OPCODE_LOGOUT_REQUEST                     ( \ +		ISCSI_OPCODE_LOGOUT_REQUEST_NO_IMM | 0x40) + +/* iSCSI response/messages op codes */ +#define ISCSI_OPCODE_NOP_IN             (0x20) +#define ISCSI_OPCODE_SCSI_RESPONSE      (0x21) +#define ISCSI_OPCODE_TMF_RESPONSE       (0x22) +#define ISCSI_OPCODE_LOGIN_RESPONSE     (0x23) +#define ISCSI_OPCODE_TEXT_RESPONSE      (0x24) +#define ISCSI_OPCODE_DATA_IN            (0x25) +#define ISCSI_OPCODE_LOGOUT_RESPONSE    (0x26) +#define ISCSI_OPCODE_R2T                (0x31) +#define ISCSI_OPCODE_ASYNC_MSG          (0x32) +#define ISCSI_OPCODE_REJECT             (0x3f) + +/* iSCSI stages */ +#define ISCSI_STAGE_SECURITY_NEGOTIATION            (0) +#define ISCSI_STAGE_LOGIN_OPERATIONAL_NEGOTIATION   (1) +#define ISCSI_STAGE_FULL_FEATURE_PHASE              (3) + +/* iSCSI CQE errors */ +#define CQE_ERROR_BITMAP_DATA_DIGEST          (0x08) +#define CQE_ERROR_BITMAP_RCV_ON_INVALID_CONN  (0x10) +#define CQE_ERROR_BITMAP_DATA_TRUNCATED       (0x20) + +struct cqe_error_bitmap { +	u8 cqe_error_status_bits; +#define CQE_ERROR_BITMAP_DIF_ERR_BITS_MASK         0x7 +#define CQE_ERROR_BITMAP_DIF_ERR_BITS_SHIFT        0 +#define CQE_ERROR_BITMAP_DATA_DIGEST_ERR_MASK      0x1 +#define CQE_ERROR_BITMAP_DATA_DIGEST_ERR_SHIFT     3 +#define CQE_ERROR_BITMAP_RCV_ON_INVALID_CONN_MASK  0x1 +#define CQE_ERROR_BITMAP_RCV_ON_INVALID_CONN_SHIFT 4 +#define CQE_ERROR_BITMAP_DATA_TRUNCATED_ERR_MASK   0x1 +#define CQE_ERROR_BITMAP_DATA_TRUNCATED_ERR_SHIFT  5 +#define CQE_ERROR_BITMAP_UNDER_RUN_ERR_MASK        0x1 +#define CQE_ERROR_BITMAP_UNDER_RUN_ERR_SHIFT       6 +#define CQE_ERROR_BITMAP_RESERVED2_MASK            0x1 +#define CQE_ERROR_BITMAP_RESERVED2_SHIFT           7 +}; + +union cqe_error_status { +	u8 error_status; +	struct cqe_error_bitmap error_bits; +}; + +struct data_hdr { +	__le32 data[12]; +}; + +struct iscsi_async_msg_hdr { +	__le16 reserved0; +	u8 flags_attr; +#define ISCSI_ASYNC_MSG_HDR_RSRV_MASK           0x7F +#define ISCSI_ASYNC_MSG_HDR_RSRV_SHIFT          0 +#define ISCSI_ASYNC_MSG_HDR_CONST1_MASK         0x1 +#define ISCSI_ASYNC_MSG_HDR_CONST1_SHIFT        7 +	u8 opcode; +	__le32 hdr_second_dword; +#define ISCSI_ASYNC_MSG_HDR_DATA_SEG_LEN_MASK   0xFFFFFF +#define ISCSI_ASYNC_MSG_HDR_DATA_SEG_LEN_SHIFT  0 +#define ISCSI_ASYNC_MSG_HDR_TOTAL_AHS_LEN_MASK  0xFF +#define ISCSI_ASYNC_MSG_HDR_TOTAL_AHS_LEN_SHIFT 24 +	struct regpair lun; +	__le32 all_ones; +	__le32 reserved1; +	__le32 stat_sn; +	__le32 exp_cmd_sn; +	__le32 max_cmd_sn; +	__le16 param1_rsrv; +	u8 async_vcode; +	u8 async_event; +	__le16 param3_rsrv; +	__le16 param2_rsrv; +	__le32 reserved7; +}; + +struct iscsi_sge { +	struct regpair sge_addr; +	__le16 sge_len; +	__le16 reserved0; +	__le32 reserved1; +}; + +struct iscsi_cached_sge_ctx { +	struct iscsi_sge sge; +	struct regpair reserved; +	__le32 dsgl_curr_offset[2]; +}; + +struct iscsi_cmd_hdr { +	__le16 reserved1; +	u8 flags_attr; +#define ISCSI_CMD_HDR_ATTR_MASK           0x7 +#define ISCSI_CMD_HDR_ATTR_SHIFT          0 +#define ISCSI_CMD_HDR_RSRV_MASK           0x3 +#define ISCSI_CMD_HDR_RSRV_SHIFT          3 +#define ISCSI_CMD_HDR_WRITE_MASK          0x1 +#define ISCSI_CMD_HDR_WRITE_SHIFT         5 +#define ISCSI_CMD_HDR_READ_MASK           0x1 +#define ISCSI_CMD_HDR_READ_SHIFT          6 +#define ISCSI_CMD_HDR_FINAL_MASK          0x1 +#define ISCSI_CMD_HDR_FINAL_SHIFT         7 +	u8 opcode; +	__le32 hdr_second_dword; +#define ISCSI_CMD_HDR_DATA_SEG_LEN_MASK   0xFFFFFF +#define ISCSI_CMD_HDR_DATA_SEG_LEN_SHIFT  0 +#define ISCSI_CMD_HDR_TOTAL_AHS_LEN_MASK  0xFF +#define ISCSI_CMD_HDR_TOTAL_AHS_LEN_SHIFT 24 +	struct regpair lun; +	__le32 itt; +	__le32 expected_transfer_length; +	__le32 cmd_sn; +	__le32 exp_stat_sn; +	__le32 cdb[4]; +}; + +struct iscsi_common_hdr { +	u8 hdr_status; +	u8 hdr_response; +	u8 hdr_flags; +	u8 hdr_first_byte; +#define ISCSI_COMMON_HDR_OPCODE_MASK         0x3F +#define ISCSI_COMMON_HDR_OPCODE_SHIFT        0 +#define ISCSI_COMMON_HDR_IMM_MASK            0x1 +#define ISCSI_COMMON_HDR_IMM_SHIFT           6 +#define ISCSI_COMMON_HDR_RSRV_MASK           0x1 +#define ISCSI_COMMON_HDR_RSRV_SHIFT          7 +	__le32 hdr_second_dword; +#define ISCSI_COMMON_HDR_DATA_SEG_LEN_MASK   0xFFFFFF +#define ISCSI_COMMON_HDR_DATA_SEG_LEN_SHIFT  0 +#define ISCSI_COMMON_HDR_TOTAL_AHS_LEN_MASK  0xFF +#define ISCSI_COMMON_HDR_TOTAL_AHS_LEN_SHIFT 24 +	__le32 lun_reserved[4]; +	__le32 data[6]; +}; + +struct iscsi_conn_offload_params { +	struct regpair sq_pbl_addr; +	struct regpair r2tq_pbl_addr; +	struct regpair xhq_pbl_addr; +	struct regpair uhq_pbl_addr; +	__le32 initial_ack; +	__le16 physical_q0; +	__le16 physical_q1; +	u8 flags; +#define ISCSI_CONN_OFFLOAD_PARAMS_TCP_ON_CHIP_1B_MASK  0x1 +#define ISCSI_CONN_OFFLOAD_PARAMS_TCP_ON_CHIP_1B_SHIFT 0 +#define ISCSI_CONN_OFFLOAD_PARAMS_TARGET_MODE_MASK     0x1 +#define ISCSI_CONN_OFFLOAD_PARAMS_TARGET_MODE_SHIFT    1 +#define ISCSI_CONN_OFFLOAD_PARAMS_RESERVED1_MASK       0x3F +#define ISCSI_CONN_OFFLOAD_PARAMS_RESERVED1_SHIFT      2 +	u8 pbl_page_size_log; +	u8 pbe_page_size_log; +	u8 default_cq; +	__le32 stat_sn; +}; + +struct iscsi_slow_path_hdr { +	u8 op_code; +	u8 flags; +#define ISCSI_SLOW_PATH_HDR_RESERVED0_MASK   0xF +#define ISCSI_SLOW_PATH_HDR_RESERVED0_SHIFT  0 +#define ISCSI_SLOW_PATH_HDR_LAYER_CODE_MASK  0x7 +#define ISCSI_SLOW_PATH_HDR_LAYER_CODE_SHIFT 4 +#define ISCSI_SLOW_PATH_HDR_RESERVED1_MASK   0x1 +#define ISCSI_SLOW_PATH_HDR_RESERVED1_SHIFT  7 +}; + +struct iscsi_conn_update_ramrod_params { +	struct iscsi_slow_path_hdr hdr; +	__le16 conn_id; +	__le32 fw_cid; +	u8 flags; +#define ISCSI_CONN_UPDATE_RAMROD_PARAMS_HD_EN_MASK           0x1 +#define ISCSI_CONN_UPDATE_RAMROD_PARAMS_HD_EN_SHIFT          0 +#define ISCSI_CONN_UPDATE_RAMROD_PARAMS_DD_EN_MASK           0x1 +#define ISCSI_CONN_UPDATE_RAMROD_PARAMS_DD_EN_SHIFT          1 +#define ISCSI_CONN_UPDATE_RAMROD_PARAMS_INITIAL_R2T_MASK     0x1 +#define ISCSI_CONN_UPDATE_RAMROD_PARAMS_INITIAL_R2T_SHIFT    2 +#define ISCSI_CONN_UPDATE_RAMROD_PARAMS_IMMEDIATE_DATA_MASK  0x1 +#define ISCSI_CONN_UPDATE_RAMROD_PARAMS_IMMEDIATE_DATA_SHIFT 3 +#define ISCSI_CONN_UPDATE_RAMROD_PARAMS_RESERVED1_MASK       0xF +#define ISCSI_CONN_UPDATE_RAMROD_PARAMS_RESERVED1_SHIFT      4 +	u8 reserved0[3]; +	__le32 max_seq_size; +	__le32 max_send_pdu_length; +	__le32 max_recv_pdu_length; +	__le32 first_seq_length; +	__le32 exp_stat_sn; +}; + +struct iscsi_ext_cdb_cmd_hdr { +	__le16 reserved1; +	u8 flags_attr; +#define ISCSI_EXT_CDB_CMD_HDR_ATTR_MASK          0x7 +#define ISCSI_EXT_CDB_CMD_HDR_ATTR_SHIFT         0 +#define ISCSI_EXT_CDB_CMD_HDR_RSRV_MASK          0x3 +#define ISCSI_EXT_CDB_CMD_HDR_RSRV_SHIFT         3 +#define ISCSI_EXT_CDB_CMD_HDR_WRITE_MASK         0x1 +#define ISCSI_EXT_CDB_CMD_HDR_WRITE_SHIFT        5 +#define ISCSI_EXT_CDB_CMD_HDR_READ_MASK          0x1 +#define ISCSI_EXT_CDB_CMD_HDR_READ_SHIFT         6 +#define ISCSI_EXT_CDB_CMD_HDR_FINAL_MASK         0x1 +#define ISCSI_EXT_CDB_CMD_HDR_FINAL_SHIFT        7 +	u8 opcode; +	__le32 hdr_second_dword; +#define ISCSI_EXT_CDB_CMD_HDR_DATA_SEG_LEN_MASK  0xFFFFFF +#define ISCSI_EXT_CDB_CMD_HDR_DATA_SEG_LEN_SHIFT 0 +#define ISCSI_EXT_CDB_CMD_HDR_CDB_SIZE_MASK      0xFF +#define ISCSI_EXT_CDB_CMD_HDR_CDB_SIZE_SHIFT     24 +	struct regpair lun; +	__le32 itt; +	__le32 expected_transfer_length; +	__le32 cmd_sn; +	__le32 exp_stat_sn; +	struct iscsi_sge cdb_sge; +}; + +struct iscsi_login_req_hdr { +	u8 version_min; +	u8 version_max; +	u8 flags_attr; +#define ISCSI_LOGIN_REQ_HDR_NSG_MASK            0x3 +#define ISCSI_LOGIN_REQ_HDR_NSG_SHIFT           0 +#define ISCSI_LOGIN_REQ_HDR_CSG_MASK            0x3 +#define ISCSI_LOGIN_REQ_HDR_CSG_SHIFT           2 +#define ISCSI_LOGIN_REQ_HDR_RSRV_MASK           0x3 +#define ISCSI_LOGIN_REQ_HDR_RSRV_SHIFT          4 +#define ISCSI_LOGIN_REQ_HDR_C_MASK              0x1 +#define ISCSI_LOGIN_REQ_HDR_C_SHIFT             6 +#define ISCSI_LOGIN_REQ_HDR_T_MASK              0x1 +#define ISCSI_LOGIN_REQ_HDR_T_SHIFT             7 +	u8 opcode; +	__le32 hdr_second_dword; +#define ISCSI_LOGIN_REQ_HDR_DATA_SEG_LEN_MASK   0xFFFFFF +#define ISCSI_LOGIN_REQ_HDR_DATA_SEG_LEN_SHIFT  0 +#define ISCSI_LOGIN_REQ_HDR_TOTAL_AHS_LEN_MASK  0xFF +#define ISCSI_LOGIN_REQ_HDR_TOTAL_AHS_LEN_SHIFT 24 +	__le32 isid_TABC; +	__le16 tsih; +	__le16 isid_d; +	__le32 itt; +	__le16 reserved1; +	__le16 cid; +	__le32 cmd_sn; +	__le32 exp_stat_sn; +	__le32 reserved2[4]; +}; + +struct iscsi_logout_req_hdr { +	__le16 reserved0; +	u8 reason_code; +	u8 opcode; +	__le32 reserved1; +	__le32 reserved2[2]; +	__le32 itt; +	__le16 reserved3; +	__le16 cid; +	__le32 cmd_sn; +	__le32 exp_stat_sn; +	__le32 reserved4[4]; +}; + +struct iscsi_data_out_hdr { +	__le16 reserved1; +	u8 flags_attr; +#define ISCSI_DATA_OUT_HDR_RSRV_MASK   0x7F +#define ISCSI_DATA_OUT_HDR_RSRV_SHIFT  0 +#define ISCSI_DATA_OUT_HDR_FINAL_MASK  0x1 +#define ISCSI_DATA_OUT_HDR_FINAL_SHIFT 7 +	u8 opcode; +	__le32 reserved2; +	struct regpair lun; +	__le32 itt; +	__le32 ttt; +	__le32 reserved3; +	__le32 exp_stat_sn; +	__le32 reserved4; +	__le32 data_sn; +	__le32 buffer_offset; +	__le32 reserved5; +}; + +struct iscsi_data_in_hdr { +	u8 status_rsvd; +	u8 reserved1; +	u8 flags; +#define ISCSI_DATA_IN_HDR_STATUS_MASK     0x1 +#define ISCSI_DATA_IN_HDR_STATUS_SHIFT    0 +#define ISCSI_DATA_IN_HDR_UNDERFLOW_MASK  0x1 +#define ISCSI_DATA_IN_HDR_UNDERFLOW_SHIFT 1 +#define ISCSI_DATA_IN_HDR_OVERFLOW_MASK   0x1 +#define ISCSI_DATA_IN_HDR_OVERFLOW_SHIFT  2 +#define ISCSI_DATA_IN_HDR_RSRV_MASK       0x7 +#define ISCSI_DATA_IN_HDR_RSRV_SHIFT      3 +#define ISCSI_DATA_IN_HDR_ACK_MASK        0x1 +#define ISCSI_DATA_IN_HDR_ACK_SHIFT       6 +#define ISCSI_DATA_IN_HDR_FINAL_MASK      0x1 +#define ISCSI_DATA_IN_HDR_FINAL_SHIFT     7 +	u8 opcode; +	__le32 reserved2; +	struct regpair lun; +	__le32 itt; +	__le32 ttt; +	__le32 stat_sn; +	__le32 exp_cmd_sn; +	__le32 max_cmd_sn; +	__le32 data_sn; +	__le32 buffer_offset; +	__le32 residual_count; +}; + +struct iscsi_r2t_hdr { +	u8 reserved0[3]; +	u8 opcode; +	__le32 reserved2; +	struct regpair lun; +	__le32 itt; +	__le32 ttt; +	__le32 stat_sn; +	__le32 exp_cmd_sn; +	__le32 max_cmd_sn; +	__le32 r2t_sn; +	__le32 buffer_offset; +	__le32 desired_data_trns_len; +}; + +struct iscsi_nop_out_hdr { +	__le16 reserved1; +	u8 flags_attr; +#define ISCSI_NOP_OUT_HDR_RSRV_MASK    0x7F +#define ISCSI_NOP_OUT_HDR_RSRV_SHIFT   0 +#define ISCSI_NOP_OUT_HDR_CONST1_MASK  0x1 +#define ISCSI_NOP_OUT_HDR_CONST1_SHIFT 7 +	u8 opcode; +	__le32 reserved2; +	struct regpair lun; +	__le32 itt; +	__le32 ttt; +	__le32 cmd_sn; +	__le32 exp_stat_sn; +	__le32 reserved3; +	__le32 reserved4; +	__le32 reserved5; +	__le32 reserved6; +}; + +struct iscsi_nop_in_hdr { +	__le16 reserved0; +	u8 flags_attr; +#define ISCSI_NOP_IN_HDR_RSRV_MASK           0x7F +#define ISCSI_NOP_IN_HDR_RSRV_SHIFT          0 +#define ISCSI_NOP_IN_HDR_CONST1_MASK         0x1 +#define ISCSI_NOP_IN_HDR_CONST1_SHIFT        7 +	u8 opcode; +	__le32 hdr_second_dword; +#define ISCSI_NOP_IN_HDR_DATA_SEG_LEN_MASK   0xFFFFFF +#define ISCSI_NOP_IN_HDR_DATA_SEG_LEN_SHIFT  0 +#define ISCSI_NOP_IN_HDR_TOTAL_AHS_LEN_MASK  0xFF +#define ISCSI_NOP_IN_HDR_TOTAL_AHS_LEN_SHIFT 24 +	struct regpair lun; +	__le32 itt; +	__le32 ttt; +	__le32 stat_sn; +	__le32 exp_cmd_sn; +	__le32 max_cmd_sn; +	__le32 reserved5; +	__le32 reserved6; +	__le32 reserved7; +}; + +struct iscsi_login_response_hdr { +	u8 version_active; +	u8 version_max; +	u8 flags_attr; +#define ISCSI_LOGIN_RESPONSE_HDR_NSG_MASK            0x3 +#define ISCSI_LOGIN_RESPONSE_HDR_NSG_SHIFT           0 +#define ISCSI_LOGIN_RESPONSE_HDR_CSG_MASK            0x3 +#define ISCSI_LOGIN_RESPONSE_HDR_CSG_SHIFT           2 +#define ISCSI_LOGIN_RESPONSE_HDR_RSRV_MASK           0x3 +#define ISCSI_LOGIN_RESPONSE_HDR_RSRV_SHIFT          4 +#define ISCSI_LOGIN_RESPONSE_HDR_C_MASK              0x1 +#define ISCSI_LOGIN_RESPONSE_HDR_C_SHIFT             6 +#define ISCSI_LOGIN_RESPONSE_HDR_T_MASK              0x1 +#define ISCSI_LOGIN_RESPONSE_HDR_T_SHIFT             7 +	u8 opcode; +	__le32 hdr_second_dword; +#define ISCSI_LOGIN_RESPONSE_HDR_DATA_SEG_LEN_MASK   0xFFFFFF +#define ISCSI_LOGIN_RESPONSE_HDR_DATA_SEG_LEN_SHIFT  0 +#define ISCSI_LOGIN_RESPONSE_HDR_TOTAL_AHS_LEN_MASK  0xFF +#define ISCSI_LOGIN_RESPONSE_HDR_TOTAL_AHS_LEN_SHIFT 24 +	__le32 isid_TABC; +	__le16 tsih; +	__le16 isid_d; +	__le32 itt; +	__le32 reserved1; +	__le32 stat_sn; +	__le32 exp_cmd_sn; +	__le32 max_cmd_sn; +	__le16 reserved2; +	u8 status_detail; +	u8 status_class; +	__le32 reserved4[2]; +}; + +struct iscsi_logout_response_hdr { +	u8 reserved1; +	u8 response; +	u8 flags; +	u8 opcode; +	__le32 hdr_second_dword; +#define ISCSI_LOGOUT_RESPONSE_HDR_DATA_SEG_LEN_MASK   0xFFFFFF +#define ISCSI_LOGOUT_RESPONSE_HDR_DATA_SEG_LEN_SHIFT  0 +#define ISCSI_LOGOUT_RESPONSE_HDR_TOTAL_AHS_LEN_MASK  0xFF +#define ISCSI_LOGOUT_RESPONSE_HDR_TOTAL_AHS_LEN_SHIFT 24 +	__le32 reserved2[2]; +	__le32 itt; +	__le32 reserved3; +	__le32 stat_sn; +	__le32 exp_cmd_sn; +	__le32 max_cmd_sn; +	__le32 reserved4; +	__le16 time2retain; +	__le16 time2wait; +	__le32 reserved5[1]; +}; + +struct iscsi_text_request_hdr { +	__le16 reserved0; +	u8 flags_attr; +#define ISCSI_TEXT_REQUEST_HDR_RSRV_MASK           0x3F +#define ISCSI_TEXT_REQUEST_HDR_RSRV_SHIFT          0 +#define ISCSI_TEXT_REQUEST_HDR_C_MASK              0x1 +#define ISCSI_TEXT_REQUEST_HDR_C_SHIFT             6 +#define ISCSI_TEXT_REQUEST_HDR_F_MASK              0x1 +#define ISCSI_TEXT_REQUEST_HDR_F_SHIFT             7 +	u8 opcode; +	__le32 hdr_second_dword; +#define ISCSI_TEXT_REQUEST_HDR_DATA_SEG_LEN_MASK   0xFFFFFF +#define ISCSI_TEXT_REQUEST_HDR_DATA_SEG_LEN_SHIFT  0 +#define ISCSI_TEXT_REQUEST_HDR_TOTAL_AHS_LEN_MASK  0xFF +#define ISCSI_TEXT_REQUEST_HDR_TOTAL_AHS_LEN_SHIFT 24 +	struct regpair lun; +	__le32 itt; +	__le32 ttt; +	__le32 cmd_sn; +	__le32 exp_stat_sn; +	__le32 reserved4[4]; +}; + +struct iscsi_text_response_hdr { +	__le16 reserved1; +	u8 flags; +#define ISCSI_TEXT_RESPONSE_HDR_RSRV_MASK           0x3F +#define ISCSI_TEXT_RESPONSE_HDR_RSRV_SHIFT          0 +#define ISCSI_TEXT_RESPONSE_HDR_C_MASK              0x1 +#define ISCSI_TEXT_RESPONSE_HDR_C_SHIFT             6 +#define ISCSI_TEXT_RESPONSE_HDR_F_MASK              0x1 +#define ISCSI_TEXT_RESPONSE_HDR_F_SHIFT             7 +	u8 opcode; +	__le32 hdr_second_dword; +#define ISCSI_TEXT_RESPONSE_HDR_DATA_SEG_LEN_MASK   0xFFFFFF +#define ISCSI_TEXT_RESPONSE_HDR_DATA_SEG_LEN_SHIFT  0 +#define ISCSI_TEXT_RESPONSE_HDR_TOTAL_AHS_LEN_MASK  0xFF +#define ISCSI_TEXT_RESPONSE_HDR_TOTAL_AHS_LEN_SHIFT 24 +	struct regpair lun; +	__le32 itt; +	__le32 ttt; +	__le32 stat_sn; +	__le32 exp_cmd_sn; +	__le32 max_cmd_sn; +	__le32 reserved4[3]; +}; + +struct iscsi_tmf_request_hdr { +	__le16 reserved0; +	u8 function; +	u8 opcode; +	__le32 hdr_second_dword; +#define ISCSI_TMF_REQUEST_HDR_DATA_SEG_LEN_MASK   0xFFFFFF +#define ISCSI_TMF_REQUEST_HDR_DATA_SEG_LEN_SHIFT  0 +#define ISCSI_TMF_REQUEST_HDR_TOTAL_AHS_LEN_MASK  0xFF +#define ISCSI_TMF_REQUEST_HDR_TOTAL_AHS_LEN_SHIFT 24 +	struct regpair lun; +	__le32 itt; +	__le32 rtt; +	__le32 cmd_sn; +	__le32 exp_stat_sn; +	__le32 ref_cmd_sn; +	__le32 exp_data_sn; +	__le32 reserved4[2]; +}; + +struct iscsi_tmf_response_hdr { +	u8 reserved2; +	u8 hdr_response; +	u8 hdr_flags; +	u8 opcode; +	__le32 hdr_second_dword; +#define ISCSI_TMF_RESPONSE_HDR_DATA_SEG_LEN_MASK   0xFFFFFF +#define ISCSI_TMF_RESPONSE_HDR_DATA_SEG_LEN_SHIFT  0 +#define ISCSI_TMF_RESPONSE_HDR_TOTAL_AHS_LEN_MASK  0xFF +#define ISCSI_TMF_RESPONSE_HDR_TOTAL_AHS_LEN_SHIFT 24 +	struct regpair reserved0; +	__le32 itt; +	__le32 rtt; +	__le32 stat_sn; +	__le32 exp_cmd_sn; +	__le32 max_cmd_sn; +	__le32 reserved4[3]; +}; + +struct iscsi_response_hdr { +	u8 hdr_status; +	u8 hdr_response; +	u8 hdr_flags; +	u8 opcode; +	__le32 hdr_second_dword; +#define ISCSI_RESPONSE_HDR_DATA_SEG_LEN_MASK   0xFFFFFF +#define ISCSI_RESPONSE_HDR_DATA_SEG_LEN_SHIFT  0 +#define ISCSI_RESPONSE_HDR_TOTAL_AHS_LEN_MASK  0xFF +#define ISCSI_RESPONSE_HDR_TOTAL_AHS_LEN_SHIFT 24 +	struct regpair lun; +	__le32 itt; +	__le32 snack_tag; +	__le32 stat_sn; +	__le32 exp_cmd_sn; +	__le32 max_cmd_sn; +	__le32 exp_data_sn; +	__le32 bi_residual_count; +	__le32 residual_count; +}; + +struct iscsi_reject_hdr { +	u8 reserved4; +	u8 hdr_reason; +	u8 hdr_flags; +	u8 opcode; +	__le32 hdr_second_dword; +#define ISCSI_REJECT_HDR_DATA_SEG_LEN_MASK   0xFFFFFF +#define ISCSI_REJECT_HDR_DATA_SEG_LEN_SHIFT  0 +#define ISCSI_REJECT_HDR_TOTAL_AHS_LEN_MASK  0xFF +#define ISCSI_REJECT_HDR_TOTAL_AHS_LEN_SHIFT 24 +	struct regpair reserved0; +	__le32 reserved1; +	__le32 reserved2; +	__le32 stat_sn; +	__le32 exp_cmd_sn; +	__le32 max_cmd_sn; +	__le32 data_sn; +	__le32 reserved3[2]; +}; + +union iscsi_task_hdr { +	struct iscsi_common_hdr common; +	struct data_hdr data; +	struct iscsi_cmd_hdr cmd; +	struct iscsi_ext_cdb_cmd_hdr ext_cdb_cmd; +	struct iscsi_login_req_hdr login_req; +	struct iscsi_logout_req_hdr logout_req; +	struct iscsi_data_out_hdr data_out; +	struct iscsi_data_in_hdr data_in; +	struct iscsi_r2t_hdr r2t; +	struct iscsi_nop_out_hdr nop_out; +	struct iscsi_nop_in_hdr nop_in; +	struct iscsi_login_response_hdr login_response; +	struct iscsi_logout_response_hdr logout_response; +	struct iscsi_text_request_hdr text_request; +	struct iscsi_text_response_hdr text_response; +	struct iscsi_tmf_request_hdr tmf_request; +	struct iscsi_tmf_response_hdr tmf_response; +	struct iscsi_response_hdr response; +	struct iscsi_reject_hdr reject; +	struct iscsi_async_msg_hdr async_msg; +}; + +struct iscsi_cqe_common { +	__le16 conn_id; +	u8 cqe_type; +	union cqe_error_status error_bitmap; +	__le32 reserved[3]; +	union iscsi_task_hdr iscsi_hdr; +}; + +struct iscsi_cqe_solicited { +	__le16 conn_id; +	u8 cqe_type; +	union cqe_error_status error_bitmap; +	__le16 itid; +	u8 task_type; +	u8 fw_dbg_field; +	__le32 reserved1[2]; +	union iscsi_task_hdr iscsi_hdr; +}; + +struct iscsi_cqe_unsolicited { +	__le16 conn_id; +	u8 cqe_type; +	union cqe_error_status error_bitmap; +	__le16 reserved0; +	u8 reserved1; +	u8 unsol_cqe_type; +	struct regpair rqe_opaque; +	union iscsi_task_hdr iscsi_hdr; +}; + +union iscsi_cqe { +	struct iscsi_cqe_common cqe_common; +	struct iscsi_cqe_solicited cqe_solicited; +	struct iscsi_cqe_unsolicited cqe_unsolicited; +}; + +enum iscsi_cqes_type { +	ISCSI_CQE_TYPE_SOLICITED = 1, +	ISCSI_CQE_TYPE_UNSOLICITED, +	ISCSI_CQE_TYPE_SOLICITED_WITH_SENSE +	   , +	ISCSI_CQE_TYPE_TASK_CLEANUP, +	ISCSI_CQE_TYPE_DUMMY, +	MAX_ISCSI_CQES_TYPE +}; + +enum iscsi_cqe_unsolicited_type { +	ISCSI_CQE_UNSOLICITED_NONE, +	ISCSI_CQE_UNSOLICITED_SINGLE, +	ISCSI_CQE_UNSOLICITED_FIRST, +	ISCSI_CQE_UNSOLICITED_MIDDLE, +	ISCSI_CQE_UNSOLICITED_LAST, +	MAX_ISCSI_CQE_UNSOLICITED_TYPE +}; + +struct iscsi_virt_sgl_ctx { +	struct regpair sgl_base; +	struct regpair dsgl_base; +	__le32 sgl_initial_offset; +	__le32 dsgl_initial_offset; +	__le32 dsgl_curr_offset[2]; +}; + +struct iscsi_sgl_var_params { +	u8 sgl_ptr; +	u8 dsgl_ptr; +	__le16 sge_offset; +	__le16 dsge_offset; +}; + +struct iscsi_phys_sgl_ctx { +	struct regpair sgl_base; +	struct regpair dsgl_base; +	u8 sgl_size; +	u8 dsgl_size; +	__le16 reserved; +	struct iscsi_sgl_var_params var_params[2]; +}; + +union iscsi_data_desc_ctx { +	struct iscsi_virt_sgl_ctx virt_sgl; +	struct iscsi_phys_sgl_ctx phys_sgl; +	struct iscsi_cached_sge_ctx cached_sge; +}; + +struct iscsi_debug_modes { +	u8 flags; +#define ISCSI_DEBUG_MODES_ASSERT_IF_RX_CONN_ERROR_MASK         0x1 +#define ISCSI_DEBUG_MODES_ASSERT_IF_RX_CONN_ERROR_SHIFT        0 +#define ISCSI_DEBUG_MODES_ASSERT_IF_RECV_RESET_MASK            0x1 +#define ISCSI_DEBUG_MODES_ASSERT_IF_RECV_RESET_SHIFT           1 +#define ISCSI_DEBUG_MODES_ASSERT_IF_RECV_FIN_MASK              0x1 +#define ISCSI_DEBUG_MODES_ASSERT_IF_RECV_FIN_SHIFT             2 +#define ISCSI_DEBUG_MODES_ASSERT_IF_RECV_CLEANUP_MASK          0x1 +#define ISCSI_DEBUG_MODES_ASSERT_IF_RECV_CLEANUP_SHIFT         3 +#define ISCSI_DEBUG_MODES_ASSERT_IF_RECV_REJECT_OR_ASYNC_MASK  0x1 +#define ISCSI_DEBUG_MODES_ASSERT_IF_RECV_REJECT_OR_ASYNC_SHIFT 4 +#define ISCSI_DEBUG_MODES_ASSERT_IF_RECV_NOP_MASK              0x1 +#define ISCSI_DEBUG_MODES_ASSERT_IF_RECV_NOP_SHIFT             5 +#define ISCSI_DEBUG_MODES_RESERVED0_MASK                       0x3 +#define ISCSI_DEBUG_MODES_RESERVED0_SHIFT                      6 +}; + +struct iscsi_dif_flags { +	u8 flags; +#define ISCSI_DIF_FLAGS_PROT_INTERVAL_SIZE_LOG_MASK  0xF +#define ISCSI_DIF_FLAGS_PROT_INTERVAL_SIZE_LOG_SHIFT 0 +#define ISCSI_DIF_FLAGS_DIF_TO_PEER_MASK             0x1 +#define ISCSI_DIF_FLAGS_DIF_TO_PEER_SHIFT            4 +#define ISCSI_DIF_FLAGS_HOST_INTERFACE_MASK          0x7 +#define ISCSI_DIF_FLAGS_HOST_INTERFACE_SHIFT         5 +}; + +enum iscsi_eqe_opcode { +	ISCSI_EVENT_TYPE_INIT_FUNC = 0, +	ISCSI_EVENT_TYPE_DESTROY_FUNC, +	ISCSI_EVENT_TYPE_OFFLOAD_CONN, +	ISCSI_EVENT_TYPE_UPDATE_CONN, +	ISCSI_EVENT_TYPE_CLEAR_SQ, +	ISCSI_EVENT_TYPE_TERMINATE_CONN, +	ISCSI_EVENT_TYPE_ASYN_CONNECT_COMPLETE, +	ISCSI_EVENT_TYPE_ASYN_TERMINATE_DONE, +	RESERVED8, +	RESERVED9, +	ISCSI_EVENT_TYPE_START_OF_ERROR_TYPES = 10, +	ISCSI_EVENT_TYPE_ASYN_ABORT_RCVD, +	ISCSI_EVENT_TYPE_ASYN_CLOSE_RCVD, +	ISCSI_EVENT_TYPE_ASYN_SYN_RCVD, +	ISCSI_EVENT_TYPE_ASYN_MAX_RT_TIME, +	ISCSI_EVENT_TYPE_ASYN_MAX_RT_CNT, +	ISCSI_EVENT_TYPE_ASYN_MAX_KA_PROBES_CNT, +	ISCSI_EVENT_TYPE_ASYN_FIN_WAIT2, +	ISCSI_EVENT_TYPE_ISCSI_CONN_ERROR, +	ISCSI_EVENT_TYPE_TCP_CONN_ERROR, +	ISCSI_EVENT_TYPE_ASYN_DELETE_OOO_ISLES, +	MAX_ISCSI_EQE_OPCODE +}; + +enum iscsi_error_types { +	ISCSI_STATUS_NONE = 0, +	ISCSI_CQE_ERROR_UNSOLICITED_RCV_ON_INVALID_CONN = 1, +	ISCSI_CONN_ERROR_TASK_CID_MISMATCH, +	ISCSI_CONN_ERROR_TASK_NOT_VALID, +	ISCSI_CONN_ERROR_RQ_RING_IS_FULL, +	ISCSI_CONN_ERROR_CMDQ_RING_IS_FULL, +	ISCSI_CONN_ERROR_HQE_CACHING_FAILED, +	ISCSI_CONN_ERROR_HEADER_DIGEST_ERROR, +	ISCSI_CONN_ERROR_LOCAL_COMPLETION_ERROR, +	ISCSI_CONN_ERROR_DATA_OVERRUN, +	ISCSI_CONN_ERROR_OUT_OF_SGES_ERROR, +	ISCSI_CONN_ERROR_TCP_SEG_PROC_URG_ERROR, +	ISCSI_CONN_ERROR_TCP_SEG_PROC_IP_OPTIONS_ERROR, +	ISCSI_CONN_ERROR_TCP_SEG_PROC_CONNECT_INVALID_WS_OPTION, +	ISCSI_CONN_ERROR_TCP_IP_FRAGMENT_ERROR, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_AHS_LEN, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_AHS_TYPE, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_ITT_OUT_OF_RANGE, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_TTT_OUT_OF_RANGE, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_DATA_SEG_LEN_EXCEEDS_PDU_SIZE, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_INVALID_OPCODE, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_INVALID_OPCODE_BEFORE_UPDATE, +	ISCSI_CONN_ERROR_UNVALID_NOPIN_DSL, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_R2T_CARRIES_NO_DATA, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_DATA_SN, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_DATA_IN_TTT, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_DATA_OUT_ITT, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_R2T_TTT, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_R2T_BUFFER_OFFSET, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_BUFFER_OFFSET_OOO, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_R2T_SN, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_DESIRED_DATA_TRNS_LEN_0, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_DESIRED_DATA_TRNS_LEN_1, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_DESIRED_DATA_TRNS_LEN_2, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_LUN, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_F_BIT_ZERO, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_F_BIT_ZERO_S_BIT_ONE, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_EXP_STAT_SN, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_DSL_NOT_ZERO, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_INVALID_DSL, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_DATA_SEG_LEN_TOO_BIG, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_OUTSTANDING_R2T_COUNT, +	ISCSI_CONN_ERROR_PROTOCOL_ERR_DIF_TX, +	ISCSI_CONN_ERROR_SENSE_DATA_LENGTH, +	ISCSI_CONN_ERROR_DATA_PLACEMENT_ERROR, +	ISCSI_ERROR_UNKNOWN, +	MAX_ISCSI_ERROR_TYPES +}; + +struct iscsi_mflags { +	u8 mflags; +#define ISCSI_MFLAGS_SLOW_IO_MASK     0x1 +#define ISCSI_MFLAGS_SLOW_IO_SHIFT    0 +#define ISCSI_MFLAGS_SINGLE_SGE_MASK  0x1 +#define ISCSI_MFLAGS_SINGLE_SGE_SHIFT 1 +#define ISCSI_MFLAGS_RESERVED_MASK    0x3F +#define ISCSI_MFLAGS_RESERVED_SHIFT   2 +}; + +struct iscsi_sgl { +	struct regpair sgl_addr; +	__le16 updated_sge_size; +	__le16 updated_sge_offset; +	__le32 byte_offset; +}; + +union iscsi_mstorm_sgl { +	struct iscsi_sgl sgl_struct; +	struct iscsi_sge single_sge; +}; + +enum iscsi_ramrod_cmd_id { +	ISCSI_RAMROD_CMD_ID_UNUSED = 0, +	ISCSI_RAMROD_CMD_ID_INIT_FUNC = 1, +	ISCSI_RAMROD_CMD_ID_DESTROY_FUNC = 2, +	ISCSI_RAMROD_CMD_ID_OFFLOAD_CONN = 3, +	ISCSI_RAMROD_CMD_ID_UPDATE_CONN = 4, +	ISCSI_RAMROD_CMD_ID_TERMINATION_CONN = 5, +	ISCSI_RAMROD_CMD_ID_CLEAR_SQ = 6, +	MAX_ISCSI_RAMROD_CMD_ID +}; + +struct iscsi_reg1 { +	__le32 reg1_map; +#define ISCSI_REG1_NUM_FAST_SGES_MASK  0x7 +#define ISCSI_REG1_NUM_FAST_SGES_SHIFT 0 +#define ISCSI_REG1_RESERVED1_MASK      0x1FFFFFFF +#define ISCSI_REG1_RESERVED1_SHIFT     3 +}; + +union iscsi_seq_num { +	__le16 data_sn; +	__le16 r2t_sn; +}; + +struct iscsi_spe_conn_offload { +	struct iscsi_slow_path_hdr hdr; +	__le16 conn_id; +	__le32 fw_cid; +	struct iscsi_conn_offload_params iscsi; +	struct tcp_offload_params tcp; +}; + +struct iscsi_spe_conn_offload_option2 { +	struct iscsi_slow_path_hdr hdr; +	__le16 conn_id; +	__le32 fw_cid; +	struct iscsi_conn_offload_params iscsi; +	struct tcp_offload_params_opt2 tcp; +}; + +struct iscsi_spe_conn_termination { +	struct iscsi_slow_path_hdr hdr; +	__le16 conn_id; +	__le32 fw_cid; +	u8 abortive; +	u8 reserved0[7]; +	struct regpair queue_cnts_addr; +	struct regpair query_params_addr; +}; + +struct iscsi_spe_func_dstry { +	struct iscsi_slow_path_hdr hdr; +	__le16 reserved0; +	__le32 reserved1; +}; + +struct iscsi_spe_func_init { +	struct iscsi_slow_path_hdr hdr; +	__le16 half_way_close_timeout; +	u8 num_sq_pages_in_ring; +	u8 num_r2tq_pages_in_ring; +	u8 num_uhq_pages_in_ring; +	u8 ll2_rx_queue_id; +	u8 ooo_enable; +	struct iscsi_debug_modes debug_mode; +	__le16 reserved1; +	__le32 reserved2; +	__le32 reserved3; +	__le32 reserved4; +	struct scsi_init_func_params func_params; +	struct scsi_init_func_queues q_params; +}; + +struct ystorm_iscsi_task_state { +	union iscsi_data_desc_ctx sgl_ctx_union; +	__le32 buffer_offset[2]; +	__le16 bytes_nxt_dif; +	__le16 rxmit_bytes_nxt_dif; +	union iscsi_seq_num seq_num_union; +	u8 dif_bytes_leftover; +	u8 rxmit_dif_bytes_leftover; +	__le16 reuse_count; +	struct iscsi_dif_flags dif_flags; +	u8 local_comp; +	__le32 exp_r2t_sn; +	__le32 sgl_offset[2]; +}; + +struct ystorm_iscsi_task_st_ctx { +	struct ystorm_iscsi_task_state state; +	union iscsi_task_hdr pdu_hdr; +}; + +struct ystorm_iscsi_task_ag_ctx { +	u8 reserved; +	u8 byte1; +	__le16 word0; +	u8 flags0; +#define YSTORM_ISCSI_TASK_AG_CTX_NIBBLE0_MASK     0xF +#define YSTORM_ISCSI_TASK_AG_CTX_NIBBLE0_SHIFT    0 +#define YSTORM_ISCSI_TASK_AG_CTX_BIT0_MASK        0x1 +#define YSTORM_ISCSI_TASK_AG_CTX_BIT0_SHIFT       4 +#define YSTORM_ISCSI_TASK_AG_CTX_BIT1_MASK        0x1 +#define YSTORM_ISCSI_TASK_AG_CTX_BIT1_SHIFT       5 +#define YSTORM_ISCSI_TASK_AG_CTX_VALID_MASK       0x1 +#define YSTORM_ISCSI_TASK_AG_CTX_VALID_SHIFT      6 +#define YSTORM_ISCSI_TASK_AG_CTX_BIT3_MASK        0x1 +#define YSTORM_ISCSI_TASK_AG_CTX_BIT3_SHIFT       7 +	u8 flags1; +#define YSTORM_ISCSI_TASK_AG_CTX_CF0_MASK         0x3 +#define YSTORM_ISCSI_TASK_AG_CTX_CF0_SHIFT        0 +#define YSTORM_ISCSI_TASK_AG_CTX_CF1_MASK         0x3 +#define YSTORM_ISCSI_TASK_AG_CTX_CF1_SHIFT        2 +#define YSTORM_ISCSI_TASK_AG_CTX_CF2SPECIAL_MASK  0x3 +#define YSTORM_ISCSI_TASK_AG_CTX_CF2SPECIAL_SHIFT 4 +#define YSTORM_ISCSI_TASK_AG_CTX_CF0EN_MASK       0x1 +#define YSTORM_ISCSI_TASK_AG_CTX_CF0EN_SHIFT      6 +#define YSTORM_ISCSI_TASK_AG_CTX_CF1EN_MASK       0x1 +#define YSTORM_ISCSI_TASK_AG_CTX_CF1EN_SHIFT      7 +	u8 flags2; +#define YSTORM_ISCSI_TASK_AG_CTX_BIT4_MASK        0x1 +#define YSTORM_ISCSI_TASK_AG_CTX_BIT4_SHIFT       0 +#define YSTORM_ISCSI_TASK_AG_CTX_RULE0EN_MASK     0x1 +#define YSTORM_ISCSI_TASK_AG_CTX_RULE0EN_SHIFT    1 +#define YSTORM_ISCSI_TASK_AG_CTX_RULE1EN_MASK     0x1 +#define YSTORM_ISCSI_TASK_AG_CTX_RULE1EN_SHIFT    2 +#define YSTORM_ISCSI_TASK_AG_CTX_RULE2EN_MASK     0x1 +#define YSTORM_ISCSI_TASK_AG_CTX_RULE2EN_SHIFT    3 +#define YSTORM_ISCSI_TASK_AG_CTX_RULE3EN_MASK     0x1 +#define YSTORM_ISCSI_TASK_AG_CTX_RULE3EN_SHIFT    4 +#define YSTORM_ISCSI_TASK_AG_CTX_RULE4EN_MASK     0x1 +#define YSTORM_ISCSI_TASK_AG_CTX_RULE4EN_SHIFT    5 +#define YSTORM_ISCSI_TASK_AG_CTX_RULE5EN_MASK     0x1 +#define YSTORM_ISCSI_TASK_AG_CTX_RULE5EN_SHIFT    6 +#define YSTORM_ISCSI_TASK_AG_CTX_RULE6EN_MASK     0x1 +#define YSTORM_ISCSI_TASK_AG_CTX_RULE6EN_SHIFT    7 +	u8 byte2; +	__le32 TTT; +	u8 byte3; +	u8 byte4; +	__le16 word1; +}; + +struct mstorm_iscsi_task_ag_ctx { +	u8 cdu_validation; +	u8 byte1; +	__le16 task_cid; +	u8 flags0; +#define MSTORM_ISCSI_TASK_AG_CTX_CONNECTION_TYPE_MASK     0xF +#define MSTORM_ISCSI_TASK_AG_CTX_CONNECTION_TYPE_SHIFT    0 +#define MSTORM_ISCSI_TASK_AG_CTX_EXIST_IN_QM0_MASK        0x1 +#define MSTORM_ISCSI_TASK_AG_CTX_EXIST_IN_QM0_SHIFT       4 +#define MSTORM_ISCSI_TASK_AG_CTX_BIT1_MASK                0x1 +#define MSTORM_ISCSI_TASK_AG_CTX_BIT1_SHIFT               5 +#define MSTORM_ISCSI_TASK_AG_CTX_VALID_MASK               0x1 +#define MSTORM_ISCSI_TASK_AG_CTX_VALID_SHIFT              6 +#define MSTORM_ISCSI_TASK_AG_CTX_TASK_CLEANUP_FLAG_MASK   0x1 +#define MSTORM_ISCSI_TASK_AG_CTX_TASK_CLEANUP_FLAG_SHIFT  7 +	u8 flags1; +#define MSTORM_ISCSI_TASK_AG_CTX_TASK_CLEANUP_CF_MASK     0x3 +#define MSTORM_ISCSI_TASK_AG_CTX_TASK_CLEANUP_CF_SHIFT    0 +#define MSTORM_ISCSI_TASK_AG_CTX_CF1_MASK                 0x3 +#define MSTORM_ISCSI_TASK_AG_CTX_CF1_SHIFT                2 +#define MSTORM_ISCSI_TASK_AG_CTX_CF2_MASK                 0x3 +#define MSTORM_ISCSI_TASK_AG_CTX_CF2_SHIFT                4 +#define MSTORM_ISCSI_TASK_AG_CTX_TASK_CLEANUP_CF_EN_MASK  0x1 +#define MSTORM_ISCSI_TASK_AG_CTX_TASK_CLEANUP_CF_EN_SHIFT 6 +#define MSTORM_ISCSI_TASK_AG_CTX_CF1EN_MASK               0x1 +#define MSTORM_ISCSI_TASK_AG_CTX_CF1EN_SHIFT              7 +	u8 flags2; +#define MSTORM_ISCSI_TASK_AG_CTX_CF2EN_MASK               0x1 +#define MSTORM_ISCSI_TASK_AG_CTX_CF2EN_SHIFT              0 +#define MSTORM_ISCSI_TASK_AG_CTX_RULE0EN_MASK             0x1 +#define MSTORM_ISCSI_TASK_AG_CTX_RULE0EN_SHIFT            1 +#define MSTORM_ISCSI_TASK_AG_CTX_RULE1EN_MASK             0x1 +#define MSTORM_ISCSI_TASK_AG_CTX_RULE1EN_SHIFT            2 +#define MSTORM_ISCSI_TASK_AG_CTX_RULE2EN_MASK             0x1 +#define MSTORM_ISCSI_TASK_AG_CTX_RULE2EN_SHIFT            3 +#define MSTORM_ISCSI_TASK_AG_CTX_RULE3EN_MASK             0x1 +#define MSTORM_ISCSI_TASK_AG_CTX_RULE3EN_SHIFT            4 +#define MSTORM_ISCSI_TASK_AG_CTX_RULE4EN_MASK             0x1 +#define MSTORM_ISCSI_TASK_AG_CTX_RULE4EN_SHIFT            5 +#define MSTORM_ISCSI_TASK_AG_CTX_RULE5EN_MASK             0x1 +#define MSTORM_ISCSI_TASK_AG_CTX_RULE5EN_SHIFT            6 +#define MSTORM_ISCSI_TASK_AG_CTX_RULE6EN_MASK             0x1 +#define MSTORM_ISCSI_TASK_AG_CTX_RULE6EN_SHIFT            7 +	u8 byte2; +	__le32 reg0; +	u8 byte3; +	u8 byte4; +	__le16 word1; +}; + +struct ustorm_iscsi_task_ag_ctx { +	u8 reserved; +	u8 state; +	__le16 icid; +	u8 flags0; +#define USTORM_ISCSI_TASK_AG_CTX_CONNECTION_TYPE_MASK        0xF +#define USTORM_ISCSI_TASK_AG_CTX_CONNECTION_TYPE_SHIFT       0 +#define USTORM_ISCSI_TASK_AG_CTX_EXIST_IN_QM0_MASK           0x1 +#define USTORM_ISCSI_TASK_AG_CTX_EXIST_IN_QM0_SHIFT          4 +#define USTORM_ISCSI_TASK_AG_CTX_BIT1_MASK                   0x1 +#define USTORM_ISCSI_TASK_AG_CTX_BIT1_SHIFT                  5 +#define USTORM_ISCSI_TASK_AG_CTX_HQ_SCANNED_CF_MASK          0x3 +#define USTORM_ISCSI_TASK_AG_CTX_HQ_SCANNED_CF_SHIFT         6 +	u8 flags1; +#define USTORM_ISCSI_TASK_AG_CTX_RESERVED1_MASK              0x3 +#define USTORM_ISCSI_TASK_AG_CTX_RESERVED1_SHIFT             0 +#define USTORM_ISCSI_TASK_AG_CTX_R2T2RECV_MASK               0x3 +#define USTORM_ISCSI_TASK_AG_CTX_R2T2RECV_SHIFT              2 +#define USTORM_ISCSI_TASK_AG_CTX_CF3_MASK                    0x3 +#define USTORM_ISCSI_TASK_AG_CTX_CF3_SHIFT                   4 +#define USTORM_ISCSI_TASK_AG_CTX_DIF_ERROR_CF_MASK           0x3 +#define USTORM_ISCSI_TASK_AG_CTX_DIF_ERROR_CF_SHIFT          6 +	u8 flags2; +#define USTORM_ISCSI_TASK_AG_CTX_HQ_SCANNED_CF_EN_MASK       0x1 +#define USTORM_ISCSI_TASK_AG_CTX_HQ_SCANNED_CF_EN_SHIFT      0 +#define USTORM_ISCSI_TASK_AG_CTX_DISABLE_DATA_ACKED_MASK     0x1 +#define USTORM_ISCSI_TASK_AG_CTX_DISABLE_DATA_ACKED_SHIFT    1 +#define USTORM_ISCSI_TASK_AG_CTX_R2T2RECV_EN_MASK            0x1 +#define USTORM_ISCSI_TASK_AG_CTX_R2T2RECV_EN_SHIFT           2 +#define USTORM_ISCSI_TASK_AG_CTX_CF3EN_MASK                  0x1 +#define USTORM_ISCSI_TASK_AG_CTX_CF3EN_SHIFT                 3 +#define USTORM_ISCSI_TASK_AG_CTX_DIF_ERROR_CF_EN_MASK        0x1 +#define USTORM_ISCSI_TASK_AG_CTX_DIF_ERROR_CF_EN_SHIFT       4 +#define USTORM_ISCSI_TASK_AG_CTX_CMP_DATA_TOTAL_EXP_EN_MASK  0x1 +#define USTORM_ISCSI_TASK_AG_CTX_CMP_DATA_TOTAL_EXP_EN_SHIFT 5 +#define USTORM_ISCSI_TASK_AG_CTX_RULE1EN_MASK                0x1 +#define USTORM_ISCSI_TASK_AG_CTX_RULE1EN_SHIFT               6 +#define USTORM_ISCSI_TASK_AG_CTX_CMP_CONT_RCV_EXP_EN_MASK    0x1 +#define USTORM_ISCSI_TASK_AG_CTX_CMP_CONT_RCV_EXP_EN_SHIFT   7 +	u8 flags3; +#define USTORM_ISCSI_TASK_AG_CTX_RULE3EN_MASK                0x1 +#define USTORM_ISCSI_TASK_AG_CTX_RULE3EN_SHIFT               0 +#define USTORM_ISCSI_TASK_AG_CTX_RULE4EN_MASK                0x1 +#define USTORM_ISCSI_TASK_AG_CTX_RULE4EN_SHIFT               1 +#define USTORM_ISCSI_TASK_AG_CTX_RULE5EN_MASK                0x1 +#define USTORM_ISCSI_TASK_AG_CTX_RULE5EN_SHIFT               2 +#define USTORM_ISCSI_TASK_AG_CTX_RULE6EN_MASK                0x1 +#define USTORM_ISCSI_TASK_AG_CTX_RULE6EN_SHIFT               3 +#define USTORM_ISCSI_TASK_AG_CTX_DIF_ERROR_TYPE_MASK         0xF +#define USTORM_ISCSI_TASK_AG_CTX_DIF_ERROR_TYPE_SHIFT        4 +	__le32 dif_err_intervals; +	__le32 dif_error_1st_interval; +	__le32 rcv_cont_len; +	__le32 exp_cont_len; +	__le32 total_data_acked; +	__le32 exp_data_acked; +	u8 next_tid_valid; +	u8 byte3; +	__le16 word1; +	__le16 next_tid; +	__le16 word3; +	__le32 hdr_residual_count; +	__le32 exp_r2t_sn; +}; + +struct mstorm_iscsi_task_st_ctx { +	union iscsi_mstorm_sgl sgl_union; +	struct iscsi_dif_flags dif_flags; +	struct iscsi_mflags flags; +	u8 sgl_size; +	u8 host_sge_index; +	__le16 dix_cur_sge_offset; +	__le16 dix_cur_sge_size; +	__le32 data_offset_rtid; +	u8 dif_offset; +	u8 dix_sgl_size; +	u8 dix_sge_index; +	u8 task_type; +	struct regpair sense_db; +	struct regpair dix_sgl_cur_sge; +	__le32 rem_task_size; +	__le16 reuse_count; +	__le16 dif_data_residue; +	u8 reserved0[4]; +	__le32 reserved1[1]; +}; + +struct ustorm_iscsi_task_st_ctx { +	__le32 rem_rcv_len; +	__le32 exp_data_transfer_len; +	__le32 exp_data_sn; +	struct regpair lun; +	struct iscsi_reg1 reg1; +	u8 flags2; +#define USTORM_ISCSI_TASK_ST_CTX_AHS_EXIST_MASK             0x1 +#define USTORM_ISCSI_TASK_ST_CTX_AHS_EXIST_SHIFT            0 +#define USTORM_ISCSI_TASK_ST_CTX_RESERVED1_MASK             0x7F +#define USTORM_ISCSI_TASK_ST_CTX_RESERVED1_SHIFT            1 +	u8 reserved2; +	__le16 reserved3; +	__le32 reserved4; +	__le32 reserved5; +	__le32 reserved6; +	__le32 reserved7; +	u8 task_type; +	u8 error_flags; +#define USTORM_ISCSI_TASK_ST_CTX_DATA_DIGEST_ERROR_MASK     0x1 +#define USTORM_ISCSI_TASK_ST_CTX_DATA_DIGEST_ERROR_SHIFT    0 +#define USTORM_ISCSI_TASK_ST_CTX_DATA_TRUNCATED_ERROR_MASK  0x1 +#define USTORM_ISCSI_TASK_ST_CTX_DATA_TRUNCATED_ERROR_SHIFT 1 +#define USTORM_ISCSI_TASK_ST_CTX_UNDER_RUN_ERROR_MASK       0x1 +#define USTORM_ISCSI_TASK_ST_CTX_UNDER_RUN_ERROR_SHIFT      2 +#define USTORM_ISCSI_TASK_ST_CTX_RESERVED8_MASK             0x1F +#define USTORM_ISCSI_TASK_ST_CTX_RESERVED8_SHIFT            3 +	u8 flags; +#define USTORM_ISCSI_TASK_ST_CTX_CQE_WRITE_MASK             0x3 +#define USTORM_ISCSI_TASK_ST_CTX_CQE_WRITE_SHIFT            0 +#define USTORM_ISCSI_TASK_ST_CTX_LOCAL_COMP_MASK            0x1 +#define USTORM_ISCSI_TASK_ST_CTX_LOCAL_COMP_SHIFT           2 +#define USTORM_ISCSI_TASK_ST_CTX_Q0_R2TQE_WRITE_MASK        0x1 +#define USTORM_ISCSI_TASK_ST_CTX_Q0_R2TQE_WRITE_SHIFT       3 +#define USTORM_ISCSI_TASK_ST_CTX_TOTALDATAACKED_DONE_MASK   0x1 +#define USTORM_ISCSI_TASK_ST_CTX_TOTALDATAACKED_DONE_SHIFT  4 +#define USTORM_ISCSI_TASK_ST_CTX_HQSCANNED_DONE_MASK        0x1 +#define USTORM_ISCSI_TASK_ST_CTX_HQSCANNED_DONE_SHIFT       5 +#define USTORM_ISCSI_TASK_ST_CTX_R2T2RECV_DONE_MASK         0x1 +#define USTORM_ISCSI_TASK_ST_CTX_R2T2RECV_DONE_SHIFT        6 +#define USTORM_ISCSI_TASK_ST_CTX_RESERVED0_MASK             0x1 +#define USTORM_ISCSI_TASK_ST_CTX_RESERVED0_SHIFT            7 +	u8 cq_rss_number; +}; + +struct iscsi_task_context { +	struct ystorm_iscsi_task_st_ctx ystorm_st_context; +	struct regpair ystorm_st_padding[2]; +	struct ystorm_iscsi_task_ag_ctx ystorm_ag_context; +	struct regpair ystorm_ag_padding[2]; +	struct tdif_task_context tdif_context; +	struct mstorm_iscsi_task_ag_ctx mstorm_ag_context; +	struct regpair mstorm_ag_padding[2]; +	struct ustorm_iscsi_task_ag_ctx ustorm_ag_context; +	struct mstorm_iscsi_task_st_ctx mstorm_st_context; +	struct ustorm_iscsi_task_st_ctx ustorm_st_context; +	struct rdif_task_context rdif_context; +}; + +enum iscsi_task_type { +	ISCSI_TASK_TYPE_INITIATOR_WRITE, +	ISCSI_TASK_TYPE_INITIATOR_READ, +	ISCSI_TASK_TYPE_MIDPATH, +	ISCSI_TASK_TYPE_UNSOLIC, +	ISCSI_TASK_TYPE_EXCHCLEANUP, +	ISCSI_TASK_TYPE_IRRELEVANT, +	ISCSI_TASK_TYPE_TARGET_WRITE, +	ISCSI_TASK_TYPE_TARGET_READ, +	ISCSI_TASK_TYPE_TARGET_RESPONSE, +	ISCSI_TASK_TYPE_LOGIN_RESPONSE, +	MAX_ISCSI_TASK_TYPE +}; + +union iscsi_ttt_txlen_union { +	__le32 desired_tx_len; +	__le32 ttt; +}; + +struct iscsi_uhqe { +	__le32 reg1; +#define ISCSI_UHQE_PDU_PAYLOAD_LEN_MASK     0xFFFFF +#define ISCSI_UHQE_PDU_PAYLOAD_LEN_SHIFT    0 +#define ISCSI_UHQE_LOCAL_COMP_MASK          0x1 +#define ISCSI_UHQE_LOCAL_COMP_SHIFT         20 +#define ISCSI_UHQE_TOGGLE_BIT_MASK          0x1 +#define ISCSI_UHQE_TOGGLE_BIT_SHIFT         21 +#define ISCSI_UHQE_PURE_PAYLOAD_MASK        0x1 +#define ISCSI_UHQE_PURE_PAYLOAD_SHIFT       22 +#define ISCSI_UHQE_LOGIN_RESPONSE_PDU_MASK  0x1 +#define ISCSI_UHQE_LOGIN_RESPONSE_PDU_SHIFT 23 +#define ISCSI_UHQE_TASK_ID_HI_MASK          0xFF +#define ISCSI_UHQE_TASK_ID_HI_SHIFT         24 +	__le32 reg2; +#define ISCSI_UHQE_BUFFER_OFFSET_MASK       0xFFFFFF +#define ISCSI_UHQE_BUFFER_OFFSET_SHIFT      0 +#define ISCSI_UHQE_TASK_ID_LO_MASK          0xFF +#define ISCSI_UHQE_TASK_ID_LO_SHIFT         24 +}; + +struct iscsi_wqe_field { +	__le32 contlen_cdbsize_field; +#define ISCSI_WQE_FIELD_CONT_LEN_MASK  0xFFFFFF +#define ISCSI_WQE_FIELD_CONT_LEN_SHIFT 0 +#define ISCSI_WQE_FIELD_CDB_SIZE_MASK  0xFF +#define ISCSI_WQE_FIELD_CDB_SIZE_SHIFT 24 +}; + +union iscsi_wqe_field_union { +	struct iscsi_wqe_field cont_field; +	__le32 prev_tid; +}; + +struct iscsi_wqe { +	__le16 task_id; +	u8 flags; +#define ISCSI_WQE_WQE_TYPE_MASK        0x7 +#define ISCSI_WQE_WQE_TYPE_SHIFT       0 +#define ISCSI_WQE_NUM_FAST_SGES_MASK   0x7 +#define ISCSI_WQE_NUM_FAST_SGES_SHIFT  3 +#define ISCSI_WQE_PTU_INVALIDATE_MASK  0x1 +#define ISCSI_WQE_PTU_INVALIDATE_SHIFT 6 +#define ISCSI_WQE_RESPONSE_MASK        0x1 +#define ISCSI_WQE_RESPONSE_SHIFT       7 +	struct iscsi_dif_flags prot_flags; +	union iscsi_wqe_field_union cont_prevtid_union; +}; + +enum iscsi_wqe_type { +	ISCSI_WQE_TYPE_NORMAL, +	ISCSI_WQE_TYPE_TASK_CLEANUP, +	ISCSI_WQE_TYPE_MIDDLE_PATH, +	ISCSI_WQE_TYPE_LOGIN, +	ISCSI_WQE_TYPE_FIRST_R2T_CONT, +	ISCSI_WQE_TYPE_NONFIRST_R2T_CONT, +	ISCSI_WQE_TYPE_RESPONSE, +	MAX_ISCSI_WQE_TYPE +}; + +struct iscsi_xhqe { +	union iscsi_ttt_txlen_union ttt_or_txlen; +	__le32 exp_stat_sn; +	struct iscsi_dif_flags prot_flags; +	u8 total_ahs_length; +	u8 opcode; +	u8 flags; +#define ISCSI_XHQE_NUM_FAST_SGES_MASK  0x7 +#define ISCSI_XHQE_NUM_FAST_SGES_SHIFT 0 +#define ISCSI_XHQE_FINAL_MASK          0x1 +#define ISCSI_XHQE_FINAL_SHIFT         3 +#define ISCSI_XHQE_SUPER_IO_MASK       0x1 +#define ISCSI_XHQE_SUPER_IO_SHIFT      4 +#define ISCSI_XHQE_STATUS_BIT_MASK     0x1 +#define ISCSI_XHQE_STATUS_BIT_SHIFT    5 +#define ISCSI_XHQE_RESERVED_MASK       0x3 +#define ISCSI_XHQE_RESERVED_SHIFT      6 +	union iscsi_seq_num seq_num_union; +	__le16 reserved1; +}; + +struct mstorm_iscsi_stats_drv { +	struct regpair iscsi_rx_dropped_pdus_task_not_valid; +}; + +struct ooo_opaque { +	__le32 cid; +	u8 drop_isle; +	u8 drop_size; +	u8 ooo_opcode; +	u8 ooo_isle; +}; + +struct pstorm_iscsi_stats_drv { +	struct regpair iscsi_tx_bytes_cnt; +	struct regpair iscsi_tx_packet_cnt; +}; + +struct tstorm_iscsi_stats_drv { +	struct regpair iscsi_rx_bytes_cnt; +	struct regpair iscsi_rx_packet_cnt; +	struct regpair iscsi_rx_new_ooo_isle_events_cnt; +	__le32 iscsi_cmdq_threshold_cnt; +	__le32 iscsi_rq_threshold_cnt; +	__le32 iscsi_immq_threshold_cnt; +}; + +struct ustorm_iscsi_stats_drv { +	struct regpair iscsi_rx_data_pdu_cnt; +	struct regpair iscsi_rx_r2t_pdu_cnt; +	struct regpair iscsi_rx_total_pdu_cnt; +}; + +struct xstorm_iscsi_stats_drv { +	struct regpair iscsi_tx_go_to_slow_start_event_cnt; +	struct regpair iscsi_tx_fast_retransmit_event_cnt; +}; + +struct ystorm_iscsi_stats_drv { +	struct regpair iscsi_tx_data_pdu_cnt; +	struct regpair iscsi_tx_r2t_pdu_cnt; +	struct regpair iscsi_tx_total_pdu_cnt; +}; + +struct iscsi_db_data { +	u8 params; +#define ISCSI_DB_DATA_DEST_MASK         0x3 +#define ISCSI_DB_DATA_DEST_SHIFT        0 +#define ISCSI_DB_DATA_AGG_CMD_MASK      0x3 +#define ISCSI_DB_DATA_AGG_CMD_SHIFT     2 +#define ISCSI_DB_DATA_BYPASS_EN_MASK    0x1 +#define ISCSI_DB_DATA_BYPASS_EN_SHIFT   4 +#define ISCSI_DB_DATA_RESERVED_MASK     0x1 +#define ISCSI_DB_DATA_RESERVED_SHIFT    5 +#define ISCSI_DB_DATA_AGG_VAL_SEL_MASK  0x3 +#define ISCSI_DB_DATA_AGG_VAL_SEL_SHIFT 6 +	u8 agg_flags; +	__le16 sq_prod; +}; + +struct tstorm_iscsi_task_ag_ctx { +	u8 byte0; +	u8 byte1; +	__le16 word0; +	u8 flags0; +#define TSTORM_ISCSI_TASK_AG_CTX_NIBBLE0_MASK  0xF +#define TSTORM_ISCSI_TASK_AG_CTX_NIBBLE0_SHIFT 0 +#define TSTORM_ISCSI_TASK_AG_CTX_BIT0_MASK     0x1 +#define TSTORM_ISCSI_TASK_AG_CTX_BIT0_SHIFT    4 +#define TSTORM_ISCSI_TASK_AG_CTX_BIT1_MASK     0x1 +#define TSTORM_ISCSI_TASK_AG_CTX_BIT1_SHIFT    5 +#define TSTORM_ISCSI_TASK_AG_CTX_BIT2_MASK     0x1 +#define TSTORM_ISCSI_TASK_AG_CTX_BIT2_SHIFT    6 +#define TSTORM_ISCSI_TASK_AG_CTX_BIT3_MASK     0x1 +#define TSTORM_ISCSI_TASK_AG_CTX_BIT3_SHIFT    7 +	u8 flags1; +#define TSTORM_ISCSI_TASK_AG_CTX_BIT4_MASK     0x1 +#define TSTORM_ISCSI_TASK_AG_CTX_BIT4_SHIFT    0 +#define TSTORM_ISCSI_TASK_AG_CTX_BIT5_MASK     0x1 +#define TSTORM_ISCSI_TASK_AG_CTX_BIT5_SHIFT    1 +#define TSTORM_ISCSI_TASK_AG_CTX_CF0_MASK      0x3 +#define TSTORM_ISCSI_TASK_AG_CTX_CF0_SHIFT     2 +#define TSTORM_ISCSI_TASK_AG_CTX_CF1_MASK      0x3 +#define TSTORM_ISCSI_TASK_AG_CTX_CF1_SHIFT     4 +#define TSTORM_ISCSI_TASK_AG_CTX_CF2_MASK      0x3 +#define TSTORM_ISCSI_TASK_AG_CTX_CF2_SHIFT     6 +	u8 flags2; +#define TSTORM_ISCSI_TASK_AG_CTX_CF3_MASK      0x3 +#define TSTORM_ISCSI_TASK_AG_CTX_CF3_SHIFT     0 +#define TSTORM_ISCSI_TASK_AG_CTX_CF4_MASK      0x3 +#define TSTORM_ISCSI_TASK_AG_CTX_CF4_SHIFT     2 +#define TSTORM_ISCSI_TASK_AG_CTX_CF5_MASK      0x3 +#define TSTORM_ISCSI_TASK_AG_CTX_CF5_SHIFT     4 +#define TSTORM_ISCSI_TASK_AG_CTX_CF6_MASK      0x3 +#define TSTORM_ISCSI_TASK_AG_CTX_CF6_SHIFT     6 +	u8 flags3; +#define TSTORM_ISCSI_TASK_AG_CTX_CF7_MASK      0x3 +#define TSTORM_ISCSI_TASK_AG_CTX_CF7_SHIFT     0 +#define TSTORM_ISCSI_TASK_AG_CTX_CF0EN_MASK    0x1 +#define TSTORM_ISCSI_TASK_AG_CTX_CF0EN_SHIFT   2 +#define TSTORM_ISCSI_TASK_AG_CTX_CF1EN_MASK    0x1 +#define TSTORM_ISCSI_TASK_AG_CTX_CF1EN_SHIFT   3 +#define TSTORM_ISCSI_TASK_AG_CTX_CF2EN_MASK    0x1 +#define TSTORM_ISCSI_TASK_AG_CTX_CF2EN_SHIFT   4 +#define TSTORM_ISCSI_TASK_AG_CTX_CF3EN_MASK    0x1 +#define TSTORM_ISCSI_TASK_AG_CTX_CF3EN_SHIFT   5 +#define TSTORM_ISCSI_TASK_AG_CTX_CF4EN_MASK    0x1 +#define TSTORM_ISCSI_TASK_AG_CTX_CF4EN_SHIFT   6 +#define TSTORM_ISCSI_TASK_AG_CTX_CF5EN_MASK    0x1 +#define TSTORM_ISCSI_TASK_AG_CTX_CF5EN_SHIFT   7 +	u8 flags4; +#define TSTORM_ISCSI_TASK_AG_CTX_CF6EN_MASK    0x1 +#define TSTORM_ISCSI_TASK_AG_CTX_CF6EN_SHIFT   0 +#define TSTORM_ISCSI_TASK_AG_CTX_CF7EN_MASK    0x1 +#define TSTORM_ISCSI_TASK_AG_CTX_CF7EN_SHIFT   1 +#define TSTORM_ISCSI_TASK_AG_CTX_RULE0EN_MASK  0x1 +#define TSTORM_ISCSI_TASK_AG_CTX_RULE0EN_SHIFT 2 +#define TSTORM_ISCSI_TASK_AG_CTX_RULE1EN_MASK  0x1 +#define TSTORM_ISCSI_TASK_AG_CTX_RULE1EN_SHIFT 3 +#define TSTORM_ISCSI_TASK_AG_CTX_RULE2EN_MASK  0x1 +#define TSTORM_ISCSI_TASK_AG_CTX_RULE2EN_SHIFT 4 +#define TSTORM_ISCSI_TASK_AG_CTX_RULE3EN_MASK  0x1 +#define TSTORM_ISCSI_TASK_AG_CTX_RULE3EN_SHIFT 5 +#define TSTORM_ISCSI_TASK_AG_CTX_RULE4EN_MASK  0x1 +#define TSTORM_ISCSI_TASK_AG_CTX_RULE4EN_SHIFT 6 +#define TSTORM_ISCSI_TASK_AG_CTX_RULE5EN_MASK  0x1 +#define TSTORM_ISCSI_TASK_AG_CTX_RULE5EN_SHIFT 7 +	u8 byte2; +	__le16 word1; +	__le32 reg0; +	u8 byte3; +	u8 byte4; +	__le16 word2; +	__le16 word3; +	__le16 word4; +	__le32 reg1; +	__le32 reg2; +}; + +#endif /* __ISCSI_COMMON__ */ diff --git a/include/linux/qed/qed_chain.h b/include/linux/qed/qed_chain.h index 5f8fcaaa6504..7e441bdeabdc 100644 --- a/include/linux/qed/qed_chain.h +++ b/include/linux/qed/qed_chain.h @@ -25,10 +25,9 @@  				} while (0)  #define HILO_GEN(hi, lo, type)  ((((type)(hi)) << 32) + (lo)) -#define HILO_DMA(hi, lo)        HILO_GEN(hi, lo, dma_addr_t)  #define HILO_64(hi, lo) HILO_GEN((le32_to_cpu(hi)), (le32_to_cpu(lo)), u64) -#define HILO_DMA_REGPAIR(regpair)       (HILO_DMA(regpair.hi, regpair.lo))  #define HILO_64_REGPAIR(regpair)        (HILO_64(regpair.hi, regpair.lo)) +#define HILO_DMA_REGPAIR(regpair)	((dma_addr_t)HILO_64_REGPAIR(regpair))  enum qed_chain_mode {  	/* Each Page contains a next pointer at its end */ @@ -47,16 +46,56 @@ enum qed_chain_use_mode {  	QED_CHAIN_USE_TO_CONSUME_PRODUCE,	/* Chain starts empty */  }; +enum qed_chain_cnt_type { +	/* The chain's size/prod/cons are kept in 16-bit variables */ +	QED_CHAIN_CNT_TYPE_U16, + +	/* The chain's size/prod/cons are kept in 32-bit variables  */ +	QED_CHAIN_CNT_TYPE_U32, +}; +  struct qed_chain_next {  	struct regpair	next_phys;  	void		*next_virt;  }; +struct qed_chain_pbl_u16 { +	u16 prod_page_idx; +	u16 cons_page_idx; +}; + +struct qed_chain_pbl_u32 { +	u32 prod_page_idx; +	u32 cons_page_idx; +}; +  struct qed_chain_pbl { +	/* Base address of a pre-allocated buffer for pbl */  	dma_addr_t	p_phys_table;  	void		*p_virt_table; -	u16		prod_page_idx; -	u16		cons_page_idx; + +	/* Table for keeping the virtual addresses of the chain pages, +	 * respectively to the physical addresses in the pbl table. +	 */ +	void **pp_virt_addr_tbl; + +	/* Index to current used page by producer/consumer */ +	union { +		struct qed_chain_pbl_u16 pbl16; +		struct qed_chain_pbl_u32 pbl32; +	} u; +}; + +struct qed_chain_u16 { +	/* Cyclic index of next element to produce/consme */ +	u16 prod_idx; +	u16 cons_idx; +}; + +struct qed_chain_u32 { +	/* Cyclic index of next element to produce/consme */ +	u32 prod_idx; +	u32 cons_idx;  };  struct qed_chain { @@ -64,13 +103,25 @@ struct qed_chain {  	dma_addr_t		p_phys_addr;  	void			*p_prod_elem;  	void			*p_cons_elem; -	u16			page_cnt; +  	enum qed_chain_mode	mode;  	enum qed_chain_use_mode intended_use; /* used to produce/consume */ -	u16			capacity; /*< number of _usable_ elements */ -	u16			size; /* number of elements */ -	u16			prod_idx; -	u16			cons_idx; +	enum qed_chain_cnt_type cnt_type; + +	union { +		struct qed_chain_u16 chain16; +		struct qed_chain_u32 chain32; +	} u; + +	u32 page_cnt; + +	/* Number of elements - capacity is for usable elements only, +	 * while size will contain total number of elements [for entire chain]. +	 */ +	u32 capacity; +	u32 size; + +	/* Elements information for fast calculations */  	u16			elem_per_page;  	u16			elem_per_page_mask;  	u16			elem_unusable; @@ -96,66 +147,69 @@ struct qed_chain {  #define QED_CHAIN_PAGE_CNT(elem_cnt, elem_size, mode) \  	DIV_ROUND_UP(elem_cnt, USABLE_ELEMS_PER_PAGE(elem_size, mode)) +#define is_chain_u16(p) ((p)->cnt_type == QED_CHAIN_CNT_TYPE_U16) +#define is_chain_u32(p) ((p)->cnt_type == QED_CHAIN_CNT_TYPE_U32) +  /* Accessors */  static inline u16 qed_chain_get_prod_idx(struct qed_chain *p_chain)  { -	return p_chain->prod_idx; +	return p_chain->u.chain16.prod_idx;  }  static inline u16 qed_chain_get_cons_idx(struct qed_chain *p_chain)  { -	return p_chain->cons_idx; +	return p_chain->u.chain16.cons_idx; +} + +static inline u32 qed_chain_get_cons_idx_u32(struct qed_chain *p_chain) +{ +	return p_chain->u.chain32.cons_idx;  }  static inline u16 qed_chain_get_elem_left(struct qed_chain *p_chain)  {  	u16 used; -	/* we don't need to trancate upon assignmet, as we assign u32->u16 */ -	used = ((u32)0x10000u + (u32)(p_chain->prod_idx)) - -		(u32)p_chain->cons_idx; +	used = (u16) (((u32)0x10000 + +		       (u32)p_chain->u.chain16.prod_idx) - +		      (u32)p_chain->u.chain16.cons_idx);  	if (p_chain->mode == QED_CHAIN_MODE_NEXT_PTR) -		used -= p_chain->prod_idx / p_chain->elem_per_page - -			p_chain->cons_idx / p_chain->elem_per_page; +		used -= p_chain->u.chain16.prod_idx / p_chain->elem_per_page - +		    p_chain->u.chain16.cons_idx / p_chain->elem_per_page; -	return p_chain->capacity - used; +	return (u16)(p_chain->capacity - used);  } -static inline u8 qed_chain_is_full(struct qed_chain *p_chain) +static inline u32 qed_chain_get_elem_left_u32(struct qed_chain *p_chain)  { -	return qed_chain_get_elem_left(p_chain) == p_chain->capacity; -} +	u32 used; -static inline u8 qed_chain_is_empty(struct qed_chain *p_chain) -{ -	return qed_chain_get_elem_left(p_chain) == 0; -} +	used = (u32) (((u64)0x100000000ULL + +		       (u64)p_chain->u.chain32.prod_idx) - +		      (u64)p_chain->u.chain32.cons_idx); +	if (p_chain->mode == QED_CHAIN_MODE_NEXT_PTR) +		used -= p_chain->u.chain32.prod_idx / p_chain->elem_per_page - +		    p_chain->u.chain32.cons_idx / p_chain->elem_per_page; -static inline u16 qed_chain_get_elem_per_page( -	struct qed_chain *p_chain) -{ -	return p_chain->elem_per_page; +	return p_chain->capacity - used;  } -static inline u16 qed_chain_get_usable_per_page( -	struct qed_chain *p_chain) +static inline u16 qed_chain_get_usable_per_page(struct qed_chain *p_chain)  {  	return p_chain->usable_per_page;  } -static inline u16 qed_chain_get_unusable_per_page( -	struct qed_chain *p_chain) +static inline u16 qed_chain_get_unusable_per_page(struct qed_chain *p_chain)  {  	return p_chain->elem_unusable;  } -static inline u16 qed_chain_get_size(struct qed_chain *p_chain) +static inline u32 qed_chain_get_page_cnt(struct qed_chain *p_chain)  { -	return p_chain->size; +	return p_chain->page_cnt;  } -static inline dma_addr_t -qed_chain_get_pbl_phys(struct qed_chain *p_chain) +static inline dma_addr_t qed_chain_get_pbl_phys(struct qed_chain *p_chain)  {  	return p_chain->pbl.p_phys_table;  } @@ -172,65 +226,63 @@ qed_chain_get_pbl_phys(struct qed_chain *p_chain)   */  static inline void  qed_chain_advance_page(struct qed_chain *p_chain, -		       void **p_next_elem, -		       u16 *idx_to_inc, -		       u16 *page_to_inc) +		       void **p_next_elem, void *idx_to_inc, void *page_to_inc)  { +	struct qed_chain_next *p_next = NULL; +	u32 page_index = 0;  	switch (p_chain->mode) {  	case QED_CHAIN_MODE_NEXT_PTR: -	{ -		struct qed_chain_next *p_next = *p_next_elem; +		p_next = *p_next_elem;  		*p_next_elem = p_next->next_virt; -		*idx_to_inc += p_chain->elem_unusable; +		if (is_chain_u16(p_chain)) +			*(u16 *)idx_to_inc += p_chain->elem_unusable; +		else +			*(u32 *)idx_to_inc += p_chain->elem_unusable;  		break; -	}  	case QED_CHAIN_MODE_SINGLE:  		*p_next_elem = p_chain->p_virt_addr;  		break;  	case QED_CHAIN_MODE_PBL: -		/* It is assumed pages are sequential, next element needs -		 * to change only when passing going back to first from last. -		 */ -		if (++(*page_to_inc) == p_chain->page_cnt) { -			*page_to_inc = 0; -			*p_next_elem = p_chain->p_virt_addr; +		if (is_chain_u16(p_chain)) { +			if (++(*(u16 *)page_to_inc) == p_chain->page_cnt) +				*(u16 *)page_to_inc = 0; +			page_index = *(u16 *)page_to_inc; +		} else { +			if (++(*(u32 *)page_to_inc) == p_chain->page_cnt) +				*(u32 *)page_to_inc = 0; +			page_index = *(u32 *)page_to_inc;  		} +		*p_next_elem = p_chain->pbl.pp_virt_addr_tbl[page_index];  	}  }  #define is_unusable_idx(p, idx)	\ -	(((p)->idx & (p)->elem_per_page_mask) == (p)->usable_per_page) +	(((p)->u.chain16.idx & (p)->elem_per_page_mask) == (p)->usable_per_page) + +#define is_unusable_idx_u32(p, idx) \ +	(((p)->u.chain32.idx & (p)->elem_per_page_mask) == (p)->usable_per_page) +#define is_unusable_next_idx(p, idx)				 \ +	((((p)->u.chain16.idx + 1) & (p)->elem_per_page_mask) == \ +	 (p)->usable_per_page) -#define is_unusable_next_idx(p, idx) \ -	((((p)->idx + 1) & (p)->elem_per_page_mask) == (p)->usable_per_page) +#define is_unusable_next_idx_u32(p, idx)			 \ +	((((p)->u.chain32.idx + 1) & (p)->elem_per_page_mask) == \ +	 (p)->usable_per_page) -#define test_ans_skip(p, idx)				\ +#define test_and_skip(p, idx)						   \  	do {						\ -		if (is_unusable_idx(p, idx)) {		\ -			(p)->idx += (p)->elem_unusable;	\ +		if (is_chain_u16(p)) {					   \ +			if (is_unusable_idx(p, idx))			   \ +				(p)->u.chain16.idx += (p)->elem_unusable;  \ +		} else {						   \ +			if (is_unusable_idx_u32(p, idx))		   \ +				(p)->u.chain32.idx += (p)->elem_unusable;  \  		}					\  	} while (0)  /** - * @brief qed_chain_return_multi_produced - - * - * A chain in which the driver "Produces" elements should use this API - * to indicate previous produced elements are now consumed. - * - * @param p_chain - * @param num - */ -static inline void -qed_chain_return_multi_produced(struct qed_chain *p_chain, -				u16 num) -{ -	p_chain->cons_idx += num; -	test_ans_skip(p_chain, cons_idx); -} - -/**   * @brief qed_chain_return_produced -   *   * A chain in which the driver "Produces" elements should use this API @@ -240,8 +292,11 @@ qed_chain_return_multi_produced(struct qed_chain *p_chain,   */  static inline void qed_chain_return_produced(struct qed_chain *p_chain)  { -	p_chain->cons_idx++; -	test_ans_skip(p_chain, cons_idx); +	if (is_chain_u16(p_chain)) +		p_chain->u.chain16.cons_idx++; +	else +		p_chain->u.chain32.cons_idx++; +	test_and_skip(p_chain, cons_idx);  }  /** @@ -257,21 +312,33 @@ static inline void qed_chain_return_produced(struct qed_chain *p_chain)   */  static inline void *qed_chain_produce(struct qed_chain *p_chain)  { -	void *ret = NULL; - -	if ((p_chain->prod_idx & p_chain->elem_per_page_mask) == -	    p_chain->next_page_mask) { -		qed_chain_advance_page(p_chain, &p_chain->p_prod_elem, -				       &p_chain->prod_idx, -				       &p_chain->pbl.prod_page_idx); +	void *p_ret = NULL, *p_prod_idx, *p_prod_page_idx; + +	if (is_chain_u16(p_chain)) { +		if ((p_chain->u.chain16.prod_idx & +		     p_chain->elem_per_page_mask) == p_chain->next_page_mask) { +			p_prod_idx = &p_chain->u.chain16.prod_idx; +			p_prod_page_idx = &p_chain->pbl.u.pbl16.prod_page_idx; +			qed_chain_advance_page(p_chain, &p_chain->p_prod_elem, +					       p_prod_idx, p_prod_page_idx); +		} +		p_chain->u.chain16.prod_idx++; +	} else { +		if ((p_chain->u.chain32.prod_idx & +		     p_chain->elem_per_page_mask) == p_chain->next_page_mask) { +			p_prod_idx = &p_chain->u.chain32.prod_idx; +			p_prod_page_idx = &p_chain->pbl.u.pbl32.prod_page_idx; +			qed_chain_advance_page(p_chain, &p_chain->p_prod_elem, +					       p_prod_idx, p_prod_page_idx); +		} +		p_chain->u.chain32.prod_idx++;  	} -	ret = p_chain->p_prod_elem; -	p_chain->prod_idx++; +	p_ret = p_chain->p_prod_elem;  	p_chain->p_prod_elem = (void *)(((u8 *)p_chain->p_prod_elem) +  					p_chain->elem_size); -	return ret; +	return p_ret;  }  /** @@ -282,9 +349,9 @@ static inline void *qed_chain_produce(struct qed_chain *p_chain)   * @param p_chain   * @param num   * - * @return u16, number of unusable BDs + * @return number of unusable BDs   */ -static inline u16 qed_chain_get_capacity(struct qed_chain *p_chain) +static inline u32 qed_chain_get_capacity(struct qed_chain *p_chain)  {  	return p_chain->capacity;  } @@ -297,11 +364,13 @@ static inline u16 qed_chain_get_capacity(struct qed_chain *p_chain)   *   * @param p_chain   */ -static inline void -qed_chain_recycle_consumed(struct qed_chain *p_chain) +static inline void qed_chain_recycle_consumed(struct qed_chain *p_chain)  { -	test_ans_skip(p_chain, prod_idx); -	p_chain->prod_idx++; +	test_and_skip(p_chain, prod_idx); +	if (is_chain_u16(p_chain)) +		p_chain->u.chain16.prod_idx++; +	else +		p_chain->u.chain32.prod_idx++;  }  /** @@ -316,21 +385,33 @@ qed_chain_recycle_consumed(struct qed_chain *p_chain)   */  static inline void *qed_chain_consume(struct qed_chain *p_chain)  { -	void *ret = NULL; - -	if ((p_chain->cons_idx & p_chain->elem_per_page_mask) == -	    p_chain->next_page_mask) { +	void *p_ret = NULL, *p_cons_idx, *p_cons_page_idx; + +	if (is_chain_u16(p_chain)) { +		if ((p_chain->u.chain16.cons_idx & +		     p_chain->elem_per_page_mask) == p_chain->next_page_mask) { +			p_cons_idx = &p_chain->u.chain16.cons_idx; +			p_cons_page_idx = &p_chain->pbl.u.pbl16.cons_page_idx; +			qed_chain_advance_page(p_chain, &p_chain->p_cons_elem, +					       p_cons_idx, p_cons_page_idx); +		} +		p_chain->u.chain16.cons_idx++; +	} else { +		if ((p_chain->u.chain32.cons_idx & +		     p_chain->elem_per_page_mask) == p_chain->next_page_mask) { +			p_cons_idx = &p_chain->u.chain32.cons_idx; +			p_cons_page_idx = &p_chain->pbl.u.pbl32.cons_page_idx;  		qed_chain_advance_page(p_chain, &p_chain->p_cons_elem, -				       &p_chain->cons_idx, -				       &p_chain->pbl.cons_page_idx); +					       p_cons_idx, p_cons_page_idx); +		} +		p_chain->u.chain32.cons_idx++;  	} -	ret = p_chain->p_cons_elem; -	p_chain->cons_idx++; +	p_ret = p_chain->p_cons_elem;  	p_chain->p_cons_elem = (void *)(((u8 *)p_chain->p_cons_elem) +  					p_chain->elem_size); -	return ret; +	return p_ret;  }  /** @@ -340,16 +421,33 @@ static inline void *qed_chain_consume(struct qed_chain *p_chain)   */  static inline void qed_chain_reset(struct qed_chain *p_chain)  { -	int i; - -	p_chain->prod_idx	= 0; -	p_chain->cons_idx	= 0; -	p_chain->p_cons_elem	= p_chain->p_virt_addr; -	p_chain->p_prod_elem	= p_chain->p_virt_addr; +	u32 i; + +	if (is_chain_u16(p_chain)) { +		p_chain->u.chain16.prod_idx = 0; +		p_chain->u.chain16.cons_idx = 0; +	} else { +		p_chain->u.chain32.prod_idx = 0; +		p_chain->u.chain32.cons_idx = 0; +	} +	p_chain->p_cons_elem = p_chain->p_virt_addr; +	p_chain->p_prod_elem = p_chain->p_virt_addr;  	if (p_chain->mode == QED_CHAIN_MODE_PBL) { -		p_chain->pbl.prod_page_idx	= p_chain->page_cnt - 1; -		p_chain->pbl.cons_page_idx	= p_chain->page_cnt - 1; +		/* Use (page_cnt - 1) as a reset value for the prod/cons page's +		 * indices, to avoid unnecessary page advancing on the first +		 * call to qed_chain_produce/consume. Instead, the indices +		 * will be advanced to page_cnt and then will be wrapped to 0. +		 */ +		u32 reset_val = p_chain->page_cnt - 1; + +		if (is_chain_u16(p_chain)) { +			p_chain->pbl.u.pbl16.prod_page_idx = (u16)reset_val; +			p_chain->pbl.u.pbl16.cons_page_idx = (u16)reset_val; +		} else { +			p_chain->pbl.u.pbl32.prod_page_idx = reset_val; +			p_chain->pbl.u.pbl32.cons_page_idx = reset_val; +		}  	}  	switch (p_chain->intended_use) { @@ -377,168 +475,184 @@ static inline void qed_chain_reset(struct qed_chain *p_chain)   * @param intended_use   * @param mode   */ -static inline void qed_chain_init(struct qed_chain *p_chain, -				  void *p_virt_addr, -				  dma_addr_t p_phys_addr, -				  u16 page_cnt, -				  u8 elem_size, -				  enum qed_chain_use_mode intended_use, -				  enum qed_chain_mode mode) +static inline void qed_chain_init_params(struct qed_chain *p_chain, +					 u32 page_cnt, +					 u8 elem_size, +					 enum qed_chain_use_mode intended_use, +					 enum qed_chain_mode mode, +					 enum qed_chain_cnt_type cnt_type)  {  	/* chain fixed parameters */ -	p_chain->p_virt_addr	= p_virt_addr; -	p_chain->p_phys_addr	= p_phys_addr; +	p_chain->p_virt_addr = NULL; +	p_chain->p_phys_addr = 0;  	p_chain->elem_size	= elem_size; -	p_chain->page_cnt	= page_cnt; +	p_chain->intended_use = intended_use;  	p_chain->mode		= mode; +	p_chain->cnt_type = cnt_type; -	p_chain->intended_use		= intended_use;  	p_chain->elem_per_page		= ELEMS_PER_PAGE(elem_size); -	p_chain->usable_per_page = -		USABLE_ELEMS_PER_PAGE(elem_size, mode); -	p_chain->capacity		= p_chain->usable_per_page * page_cnt; -	p_chain->size			= p_chain->elem_per_page * page_cnt; +	p_chain->usable_per_page = USABLE_ELEMS_PER_PAGE(elem_size, mode);  	p_chain->elem_per_page_mask	= p_chain->elem_per_page - 1; -  	p_chain->elem_unusable = UNUSABLE_ELEMS_PER_PAGE(elem_size, mode); -  	p_chain->next_page_mask = (p_chain->usable_per_page &  				   p_chain->elem_per_page_mask); -	if (mode == QED_CHAIN_MODE_NEXT_PTR) { -		struct qed_chain_next	*p_next; -		u16			i; - -		for (i = 0; i < page_cnt - 1; i++) { -			/* Increment mem_phy to the next page. */ -			p_phys_addr += QED_CHAIN_PAGE_SIZE; - -			/* Initialize the physical address of the next page. */ -			p_next = (struct qed_chain_next *)((u8 *)p_virt_addr + -							   elem_size * -							   p_chain-> -							   usable_per_page); - -			p_next->next_phys.lo	= DMA_LO_LE(p_phys_addr); -			p_next->next_phys.hi	= DMA_HI_LE(p_phys_addr); - -			/* Initialize the virtual address of the next page. */ -			p_next->next_virt = (void *)((u8 *)p_virt_addr + -						     QED_CHAIN_PAGE_SIZE); - -			/* Move to the next page. */ -			p_virt_addr = p_next->next_virt; -		} - -		/* Last page's next should point to beginning of the chain */ -		p_next = (struct qed_chain_next *)((u8 *)p_virt_addr + -						   elem_size * -						   p_chain->usable_per_page); +	p_chain->page_cnt = page_cnt; +	p_chain->capacity = p_chain->usable_per_page * page_cnt; +	p_chain->size = p_chain->elem_per_page * page_cnt; -		p_next->next_phys.lo	= DMA_LO_LE(p_chain->p_phys_addr); -		p_next->next_phys.hi	= DMA_HI_LE(p_chain->p_phys_addr); -		p_next->next_virt	= p_chain->p_virt_addr; -	} -	qed_chain_reset(p_chain); +	p_chain->pbl.p_phys_table = 0; +	p_chain->pbl.p_virt_table = NULL; +	p_chain->pbl.pp_virt_addr_tbl = NULL;  }  /** - * @brief qed_chain_pbl_init - Initalizes a basic pbl chain - *        struct + * @brief qed_chain_init_mem - + * + * Initalizes a basic chain struct with its chain buffers + *   * @param p_chain   * @param p_virt_addr	virtual address of allocated buffer's beginning   * @param p_phys_addr	physical address of allocated buffer's beginning - * @param page_cnt	number of pages in the allocated buffer - * @param elem_size	size of each element in the chain - * @param use_mode - * @param p_phys_pbl	pointer to a pre-allocated side table - *                      which will hold physical page addresses. - * @param p_virt_pbl	pointer to a pre allocated side table - *                      which will hold virtual page addresses. + *   */ -static inline void -qed_chain_pbl_init(struct qed_chain *p_chain, -		   void *p_virt_addr, -		   dma_addr_t p_phys_addr, -		   u16 page_cnt, -		   u8 elem_size, -		   enum qed_chain_use_mode use_mode, -		   dma_addr_t p_phys_pbl, -		   dma_addr_t *p_virt_pbl) +static inline void qed_chain_init_mem(struct qed_chain *p_chain, +				      void *p_virt_addr, dma_addr_t p_phys_addr)  { -	dma_addr_t *p_pbl_dma = p_virt_pbl; -	int i; - -	qed_chain_init(p_chain, p_virt_addr, p_phys_addr, page_cnt, -		       elem_size, use_mode, QED_CHAIN_MODE_PBL); +	p_chain->p_virt_addr = p_virt_addr; +	p_chain->p_phys_addr = p_phys_addr; +} +/** + * @brief qed_chain_init_pbl_mem - + * + * Initalizes a basic chain struct with its pbl buffers + * + * @param p_chain + * @param p_virt_pbl	pointer to a pre allocated side table which will hold + *                      virtual page addresses. + * @param p_phys_pbl	pointer to a pre-allocated side table which will hold + *                      physical page addresses. + * @param pp_virt_addr_tbl + *                      pointer to a pre-allocated side table which will hold + *                      the virtual addresses of the chain pages. + * + */ +static inline void qed_chain_init_pbl_mem(struct qed_chain *p_chain, +					  void *p_virt_pbl, +					  dma_addr_t p_phys_pbl, +					  void **pp_virt_addr_tbl) +{  	p_chain->pbl.p_phys_table = p_phys_pbl;  	p_chain->pbl.p_virt_table = p_virt_pbl; - -	/* Fill the PBL with physical addresses*/ -	for (i = 0; i < page_cnt; i++) { -		*p_pbl_dma = p_phys_addr; -		p_phys_addr += QED_CHAIN_PAGE_SIZE; -		p_pbl_dma++; -	} +	p_chain->pbl.pp_virt_addr_tbl = pp_virt_addr_tbl;  }  /** - * @brief qed_chain_set_prod - sets the prod to the given - *        value + * @brief qed_chain_init_next_ptr_elem - + * + * Initalizes a next pointer element + * + * @param p_chain + * @param p_virt_curr	virtual address of a chain page of which the next + *                      pointer element is initialized + * @param p_virt_next	virtual address of the next chain page + * @param p_phys_next	physical address of the next chain page   * - * @param prod_idx - * @param p_prod_elem   */ -static inline void qed_chain_set_prod(struct qed_chain *p_chain, -				      u16 prod_idx, -				      void *p_prod_elem) +static inline void +qed_chain_init_next_ptr_elem(struct qed_chain *p_chain, +			     void *p_virt_curr, +			     void *p_virt_next, dma_addr_t p_phys_next)  { -	p_chain->prod_idx	= prod_idx; -	p_chain->p_prod_elem	= p_prod_elem; +	struct qed_chain_next *p_next; +	u32 size; + +	size = p_chain->elem_size * p_chain->usable_per_page; +	p_next = (struct qed_chain_next *)((u8 *)p_virt_curr + size); + +	DMA_REGPAIR_LE(p_next->next_phys, p_phys_next); + +	p_next->next_virt = p_virt_next;  }  /** - * @brief qed_chain_get_elem - + * @brief qed_chain_get_last_elem -   * - * get a pointer to an element represented by absolute idx + * Returns a pointer to the last element of the chain   *   * @param p_chain - * @assumption p_chain->size is a power of 2   * - * @return void*, a pointer to next element + * @return void*   */ -static inline void *qed_chain_sge_get_elem(struct qed_chain *p_chain, -					   u16 idx) +static inline void *qed_chain_get_last_elem(struct qed_chain *p_chain)  { -	void *ret = NULL; - -	if (idx >= p_chain->size) -		return NULL; +	struct qed_chain_next *p_next = NULL; +	void *p_virt_addr = NULL; +	u32 size, last_page_idx; -	ret = (u8 *)p_chain->p_virt_addr + p_chain->elem_size * idx; +	if (!p_chain->p_virt_addr) +		goto out; -	return ret; +	switch (p_chain->mode) { +	case QED_CHAIN_MODE_NEXT_PTR: +		size = p_chain->elem_size * p_chain->usable_per_page; +		p_virt_addr = p_chain->p_virt_addr; +		p_next = (struct qed_chain_next *)((u8 *)p_virt_addr + size); +		while (p_next->next_virt != p_chain->p_virt_addr) { +			p_virt_addr = p_next->next_virt; +			p_next = (struct qed_chain_next *)((u8 *)p_virt_addr + +							   size); +		} +		break; +	case QED_CHAIN_MODE_SINGLE: +		p_virt_addr = p_chain->p_virt_addr; +		break; +	case QED_CHAIN_MODE_PBL: +		last_page_idx = p_chain->page_cnt - 1; +		p_virt_addr = p_chain->pbl.pp_virt_addr_tbl[last_page_idx]; +		break; +	} +	/* p_virt_addr points at this stage to the last page of the chain */ +	size = p_chain->elem_size * (p_chain->usable_per_page - 1); +	p_virt_addr = (u8 *)p_virt_addr + size; +out: +	return p_virt_addr;  }  /** - * @brief qed_chain_sge_inc_cons_prod + * @brief qed_chain_set_prod - sets the prod to the given value   * - * for sge chains, producer isn't increased serially, the ring - * is expected to be full at all times. Once elements are - * consumed, they are immediately produced. + * @param prod_idx + * @param p_prod_elem + */ +static inline void qed_chain_set_prod(struct qed_chain *p_chain, +				      u32 prod_idx, void *p_prod_elem) +{ +	if (is_chain_u16(p_chain)) +		p_chain->u.chain16.prod_idx = (u16) prod_idx; +	else +		p_chain->u.chain32.prod_idx = prod_idx; +	p_chain->p_prod_elem = p_prod_elem; +} + +/** + * @brief qed_chain_pbl_zero_mem - set chain memory to 0   *   * @param p_chain - * @param cnt - * - * @return inline void   */ -static inline void -qed_chain_sge_inc_cons_prod(struct qed_chain *p_chain, -			    u16 cnt) +static inline void qed_chain_pbl_zero_mem(struct qed_chain *p_chain)  { -	p_chain->prod_idx += cnt; -	p_chain->cons_idx += cnt; +	u32 i, page_cnt; + +	if (p_chain->mode != QED_CHAIN_MODE_PBL) +		return; + +	page_cnt = qed_chain_get_page_cnt(p_chain); + +	for (i = 0; i < page_cnt; i++) +		memset(p_chain->pbl.pp_virt_addr_tbl[i], 0, +		       QED_CHAIN_PAGE_SIZE);  }  #endif diff --git a/include/linux/qed/qed_eth_if.h b/include/linux/qed/qed_eth_if.h index 6ae8cb4a61d3..4475a9d8ae15 100644 --- a/include/linux/qed/qed_eth_if.h +++ b/include/linux/qed/qed_eth_if.h @@ -49,6 +49,7 @@ struct qed_start_vport_params {  	bool drop_ttl0;  	u8 vport_id;  	u16 mtu; +	bool clear_stats;  };  struct qed_stop_rxq_params { @@ -113,6 +114,7 @@ struct qed_queue_start_common_params {  	u8 vport_id;  	u16 sb;  	u16 sb_idx; +	u16 vf_qid;  };  struct qed_tunn_params { @@ -127,11 +129,73 @@ struct qed_eth_cb_ops {  	void (*force_mac) (void *dev, u8 *mac);  }; +#ifdef CONFIG_DCB +/* Prototype declaration of qed_eth_dcbnl_ops should match with the declaration + * of dcbnl_rtnl_ops structure. + */ +struct qed_eth_dcbnl_ops { +	/* IEEE 802.1Qaz std */ +	int (*ieee_getpfc)(struct qed_dev *cdev, struct ieee_pfc *pfc); +	int (*ieee_setpfc)(struct qed_dev *cdev, struct ieee_pfc *pfc); +	int (*ieee_getets)(struct qed_dev *cdev, struct ieee_ets *ets); +	int (*ieee_setets)(struct qed_dev *cdev, struct ieee_ets *ets); +	int (*ieee_peer_getets)(struct qed_dev *cdev, struct ieee_ets *ets); +	int (*ieee_peer_getpfc)(struct qed_dev *cdev, struct ieee_pfc *pfc); +	int (*ieee_getapp)(struct qed_dev *cdev, struct dcb_app *app); +	int (*ieee_setapp)(struct qed_dev *cdev, struct dcb_app *app); + +	/* CEE std */ +	u8 (*getstate)(struct qed_dev *cdev); +	u8 (*setstate)(struct qed_dev *cdev, u8 state); +	void (*getpgtccfgtx)(struct qed_dev *cdev, int prio, u8 *prio_type, +			     u8 *pgid, u8 *bw_pct, u8 *up_map); +	void (*getpgbwgcfgtx)(struct qed_dev *cdev, int pgid, u8 *bw_pct); +	void (*getpgtccfgrx)(struct qed_dev *cdev, int prio, u8 *prio_type, +			     u8 *pgid, u8 *bw_pct, u8 *up_map); +	void (*getpgbwgcfgrx)(struct qed_dev *cdev, int pgid, u8 *bw_pct); +	void (*getpfccfg)(struct qed_dev *cdev, int prio, u8 *setting); +	void (*setpfccfg)(struct qed_dev *cdev, int prio, u8 setting); +	u8 (*getcap)(struct qed_dev *cdev, int capid, u8 *cap); +	int (*getnumtcs)(struct qed_dev *cdev, int tcid, u8 *num); +	u8 (*getpfcstate)(struct qed_dev *cdev); +	int (*getapp)(struct qed_dev *cdev, u8 idtype, u16 id); +	u8 (*getfeatcfg)(struct qed_dev *cdev, int featid, u8 *flags); + +	/* DCBX configuration */ +	u8 (*getdcbx)(struct qed_dev *cdev); +	void (*setpgtccfgtx)(struct qed_dev *cdev, int prio, +			     u8 pri_type, u8 pgid, u8 bw_pct, u8 up_map); +	void (*setpgtccfgrx)(struct qed_dev *cdev, int prio, +			     u8 pri_type, u8 pgid, u8 bw_pct, u8 up_map); +	void (*setpgbwgcfgtx)(struct qed_dev *cdev, int pgid, u8 bw_pct); +	void (*setpgbwgcfgrx)(struct qed_dev *cdev, int pgid, u8 bw_pct); +	u8 (*setall)(struct qed_dev *cdev); +	int (*setnumtcs)(struct qed_dev *cdev, int tcid, u8 num); +	void (*setpfcstate)(struct qed_dev *cdev, u8 state); +	int (*setapp)(struct qed_dev *cdev, u8 idtype, u16 idval, u8 up); +	u8 (*setdcbx)(struct qed_dev *cdev, u8 state); +	u8 (*setfeatcfg)(struct qed_dev *cdev, int featid, u8 flags); + +	/* Peer apps */ +	int (*peer_getappinfo)(struct qed_dev *cdev, +			       struct dcb_peer_app_info *info, +			       u16 *app_count); +	int (*peer_getapptable)(struct qed_dev *cdev, struct dcb_app *table); + +	/* CEE peer */ +	int (*cee_peer_getpfc)(struct qed_dev *cdev, struct cee_pfc *pfc); +	int (*cee_peer_getpg)(struct qed_dev *cdev, struct cee_pg *pg); +}; +#endif +  struct qed_eth_ops {  	const struct qed_common_ops *common;  #ifdef CONFIG_QED_SRIOV  	const struct qed_iov_hv_ops *iov;  #endif +#ifdef CONFIG_DCB +	const struct qed_eth_dcbnl_ops *dcb; +#endif  	int (*fill_dev_info)(struct qed_dev *cdev,  			     struct qed_dev_eth_info *info); diff --git a/include/linux/qed/qed_if.h b/include/linux/qed/qed_if.h index 4c29439f54bf..b1e3c57c7117 100644 --- a/include/linux/qed/qed_if.h +++ b/include/linux/qed/qed_if.h @@ -34,6 +34,96 @@ enum dcbx_protocol_type {  	DCBX_MAX_PROTOCOL_TYPE  }; +#ifdef CONFIG_DCB +#define QED_LLDP_CHASSIS_ID_STAT_LEN 4 +#define QED_LLDP_PORT_ID_STAT_LEN 4 +#define QED_DCBX_MAX_APP_PROTOCOL 32 +#define QED_MAX_PFC_PRIORITIES 8 +#define QED_DCBX_DSCP_SIZE 64 + +struct qed_dcbx_lldp_remote { +	u32 peer_chassis_id[QED_LLDP_CHASSIS_ID_STAT_LEN]; +	u32 peer_port_id[QED_LLDP_PORT_ID_STAT_LEN]; +	bool enable_rx; +	bool enable_tx; +	u32 tx_interval; +	u32 max_credit; +}; + +struct qed_dcbx_lldp_local { +	u32 local_chassis_id[QED_LLDP_CHASSIS_ID_STAT_LEN]; +	u32 local_port_id[QED_LLDP_PORT_ID_STAT_LEN]; +}; + +struct qed_dcbx_app_prio { +	u8 roce; +	u8 roce_v2; +	u8 fcoe; +	u8 iscsi; +	u8 eth; +}; + +struct qed_dbcx_pfc_params { +	bool willing; +	bool enabled; +	u8 prio[QED_MAX_PFC_PRIORITIES]; +	u8 max_tc; +}; + +struct qed_app_entry { +	bool ethtype; +	bool enabled; +	u8 prio; +	u16 proto_id; +	enum dcbx_protocol_type proto_type; +}; + +struct qed_dcbx_params { +	struct qed_app_entry app_entry[QED_DCBX_MAX_APP_PROTOCOL]; +	u16 num_app_entries; +	bool app_willing; +	bool app_valid; +	bool app_error; +	bool ets_willing; +	bool ets_enabled; +	bool ets_cbs; +	bool valid; +	u8 ets_pri_tc_tbl[QED_MAX_PFC_PRIORITIES]; +	u8 ets_tc_bw_tbl[QED_MAX_PFC_PRIORITIES]; +	u8 ets_tc_tsa_tbl[QED_MAX_PFC_PRIORITIES]; +	struct qed_dbcx_pfc_params pfc; +	u8 max_ets_tc; +}; + +struct qed_dcbx_admin_params { +	struct qed_dcbx_params params; +	bool valid; +}; + +struct qed_dcbx_remote_params { +	struct qed_dcbx_params params; +	bool valid; +}; + +struct qed_dcbx_operational_params { +	struct qed_dcbx_app_prio app_prio; +	struct qed_dcbx_params params; +	bool valid; +	bool enabled; +	bool ieee; +	bool cee; +	u32 err; +}; + +struct qed_dcbx_get { +	struct qed_dcbx_operational_params operational; +	struct qed_dcbx_lldp_remote lldp_remote; +	struct qed_dcbx_lldp_local lldp_local; +	struct qed_dcbx_remote_params remote; +	struct qed_dcbx_admin_params local; +}; +#endif +  enum qed_led_mode {  	QED_LED_MODE_OFF,  	QED_LED_MODE_ON, @@ -58,8 +148,70 @@ struct qed_eth_pf_params {  	u16 num_cons;  }; +/* Most of the the parameters below are described in the FW iSCSI / TCP HSI */ +struct qed_iscsi_pf_params { +	u64 glbl_q_params_addr; +	u64 bdq_pbl_base_addr[2]; +	u32 max_cwnd; +	u16 cq_num_entries; +	u16 cmdq_num_entries; +	u16 dup_ack_threshold; +	u16 tx_sws_timer; +	u16 min_rto; +	u16 min_rto_rt; +	u16 max_rto; + +	/* The following parameters are used during HW-init +	 * and these parameters need to be passed as arguments +	 * to update_pf_params routine invoked before slowpath start +	 */ +	u16 num_cons; +	u16 num_tasks; + +	/* The following parameters are used during protocol-init */ +	u16 half_way_close_timeout; +	u16 bdq_xoff_threshold[2]; +	u16 bdq_xon_threshold[2]; +	u16 cmdq_xoff_threshold; +	u16 cmdq_xon_threshold; +	u16 rq_buffer_size; + +	u8 num_sq_pages_in_ring; +	u8 num_r2tq_pages_in_ring; +	u8 num_uhq_pages_in_ring; +	u8 num_queues; +	u8 log_page_size; +	u8 rqe_log_size; +	u8 max_fin_rt; +	u8 gl_rq_pi; +	u8 gl_cmd_pi; +	u8 debug_mode; +	u8 ll2_ooo_queue_id; +	u8 ooo_enable; + +	u8 is_target; +	u8 bdq_pbl_num_entries[2]; +}; + +struct qed_rdma_pf_params { +	/* Supplied to QED during resource allocation (may affect the ILT and +	 * the doorbell BAR). +	 */ +	u32 min_dpis;		/* number of requested DPIs */ +	u32 num_mrs;		/* number of requested memory regions */ +	u32 num_qps;		/* number of requested Queue Pairs */ +	u32 num_srqs;		/* number of requested SRQ */ +	u8 roce_edpm_mode;	/* see QED_ROCE_EDPM_MODE_ENABLE */ +	u8 gl_pi;		/* protocol index */ + +	/* Will allocate rate limiters to be used with QPs */ +	u8 enable_dcqcn; +}; +  struct qed_pf_params {  	struct qed_eth_pf_params eth_pf_params; +	struct qed_iscsi_pf_params iscsi_pf_params; +	struct qed_rdma_pf_params rdma_pf_params;  };  enum qed_int_mode { @@ -100,6 +252,8 @@ struct qed_dev_info {  	/* MFW version */  	u32		mfw_rev; +	bool rdma_supported; +  	u32		flash_size;  	u8		mf_mode;  	bool		tx_switching; @@ -111,6 +265,7 @@ enum qed_sb_type {  enum qed_protocol {  	QED_PROTOCOL_ETH, +	QED_PROTOCOL_ISCSI,  };  struct qed_link_params { @@ -325,7 +480,8 @@ struct qed_common_ops {  	int		(*chain_alloc)(struct qed_dev *cdev,  				       enum qed_chain_use_mode intended_use,  				       enum qed_chain_mode mode, -				       u16 num_elems, +				       enum qed_chain_cnt_type cnt_type, +				       u32 num_elems,  				       size_t elem_size,  				       struct qed_chain *p_chain); @@ -333,6 +489,30 @@ struct qed_common_ops {  				      struct qed_chain *p_chain);  /** + * @brief get_coalesce - Get coalesce parameters in usec + * + * @param cdev + * @param rx_coal - Rx coalesce value in usec + * @param tx_coal - Tx coalesce value in usec + * + */ +	void (*get_coalesce)(struct qed_dev *cdev, u16 *rx_coal, u16 *tx_coal); + +/** + * @brief set_coalesce - Configure Rx coalesce value in usec + * + * @param cdev + * @param rx_coal - Rx coalesce value in usec + * @param tx_coal - Tx coalesce value in usec + * @param qid - Queue index + * @param sb_id - Status Block Id + * + * @return 0 on success, error otherwise. + */ +	int (*set_coalesce)(struct qed_dev *cdev, u16 rx_coal, u16 tx_coal, +			    u8 qid, u16 sb_id); + +/**   * @brief set_led - Configure LED mode   *   * @param cdev diff --git a/include/linux/qed/rdma_common.h b/include/linux/qed/rdma_common.h new file mode 100644 index 000000000000..187991c1f439 --- /dev/null +++ b/include/linux/qed/rdma_common.h @@ -0,0 +1,44 @@ +/* QLogic qed NIC Driver + * Copyright (c) 2015 QLogic Corporation + * + * This software is available under the terms of the GNU General Public License + * (GPL) Version 2, available from the file COPYING in the main directory of + * this source tree. + */ + +#ifndef __RDMA_COMMON__ +#define __RDMA_COMMON__ +/************************/ +/* RDMA FW CONSTANTS */ +/************************/ + +#define RDMA_RESERVED_LKEY                      (0) +#define RDMA_RING_PAGE_SIZE                     (0x1000) + +#define RDMA_MAX_SGE_PER_SQ_WQE         (4) +#define RDMA_MAX_SGE_PER_RQ_WQE         (4) + +#define RDMA_MAX_DATA_SIZE_IN_WQE       (0x7FFFFFFF) + +#define RDMA_REQ_RD_ATOMIC_ELM_SIZE             (0x50) +#define RDMA_RESP_RD_ATOMIC_ELM_SIZE    (0x20) + +#define RDMA_MAX_CQS                            (64 * 1024) +#define RDMA_MAX_TIDS                           (128 * 1024 - 1) +#define RDMA_MAX_PDS                            (64 * 1024) + +#define RDMA_NUM_STATISTIC_COUNTERS                     MAX_NUM_VPORTS + +#define RDMA_TASK_TYPE (PROTOCOLID_ROCE) + +struct rdma_srq_id { +	__le16 srq_idx; +	__le16 opaque_fid; +}; + +struct rdma_srq_producers { +	__le32 sge_prod; +	__le32 wqe_prod; +}; + +#endif /* __RDMA_COMMON__ */ diff --git a/include/linux/qed/roce_common.h b/include/linux/qed/roce_common.h new file mode 100644 index 000000000000..2eeaf3dc6646 --- /dev/null +++ b/include/linux/qed/roce_common.h @@ -0,0 +1,17 @@ +/* QLogic qed NIC Driver + * Copyright (c) 2015 QLogic Corporation + * + * This software is available under the terms of the GNU General Public License + * (GPL) Version 2, available from the file COPYING in the main directory of + * this source tree. + */ + +#ifndef __ROCE_COMMON__ +#define __ROCE_COMMON__ + +#define ROCE_REQ_MAX_INLINE_DATA_SIZE (256) +#define ROCE_REQ_MAX_SINGLE_SQ_WQE_SIZE (288) + +#define ROCE_MAX_QPS	(32 * 1024) + +#endif /* __ROCE_COMMON__ */ diff --git a/include/linux/qed/storage_common.h b/include/linux/qed/storage_common.h new file mode 100644 index 000000000000..3b8e1efd9bc2 --- /dev/null +++ b/include/linux/qed/storage_common.h @@ -0,0 +1,91 @@ +/* QLogic qed NIC Driver + * Copyright (c) 2015 QLogic Corporation + * + * This software is available under the terms of the GNU General Public License + * (GPL) Version 2, available from the file COPYING in the main directory of + * this source tree. + */ + +#ifndef __STORAGE_COMMON__ +#define __STORAGE_COMMON__ + +#define NUM_OF_CMDQS_CQS (NUM_OF_GLOBAL_QUEUES / 2) +#define BDQ_NUM_RESOURCES (4) + +#define BDQ_ID_RQ                        (0) +#define BDQ_ID_IMM_DATA          (1) +#define BDQ_NUM_IDS          (2) + +#define BDQ_MAX_EXTERNAL_RING_SIZE (1 << 15) + +struct scsi_bd { +	struct regpair address; +	struct regpair opaque; +}; + +struct scsi_bdq_ram_drv_data { +	__le16 external_producer; +	__le16 reserved0[3]; +}; + +struct scsi_drv_cmdq { +	__le16 cmdq_cons; +	__le16 reserved0; +	__le32 reserved1; +}; + +struct scsi_init_func_params { +	__le16 num_tasks; +	u8 log_page_size; +	u8 debug_mode; +	u8 reserved2[12]; +}; + +struct scsi_init_func_queues { +	struct regpair glbl_q_params_addr; +	__le16 rq_buffer_size; +	__le16 cq_num_entries; +	__le16 cmdq_num_entries; +	u8 bdq_resource_id; +	u8 q_validity; +#define SCSI_INIT_FUNC_QUEUES_RQ_VALID_MASK        0x1 +#define SCSI_INIT_FUNC_QUEUES_RQ_VALID_SHIFT       0 +#define SCSI_INIT_FUNC_QUEUES_IMM_DATA_VALID_MASK  0x1 +#define SCSI_INIT_FUNC_QUEUES_IMM_DATA_VALID_SHIFT 1 +#define SCSI_INIT_FUNC_QUEUES_CMD_VALID_MASK       0x1 +#define SCSI_INIT_FUNC_QUEUES_CMD_VALID_SHIFT      2 +#define SCSI_INIT_FUNC_QUEUES_RESERVED_VALID_MASK  0x1F +#define SCSI_INIT_FUNC_QUEUES_RESERVED_VALID_SHIFT 3 +	u8 num_queues; +	u8 queue_relative_offset; +	u8 cq_sb_pi; +	u8 cmdq_sb_pi; +	__le16 cq_cmdq_sb_num_arr[NUM_OF_CMDQS_CQS]; +	__le16 reserved0; +	u8 bdq_pbl_num_entries[BDQ_NUM_IDS]; +	struct regpair bdq_pbl_base_address[BDQ_NUM_IDS]; +	__le16 bdq_xoff_threshold[BDQ_NUM_IDS]; +	__le16 bdq_xon_threshold[BDQ_NUM_IDS]; +	__le16 cmdq_xoff_threshold; +	__le16 cmdq_xon_threshold; +	__le32 reserved1; +}; + +struct scsi_ram_per_bdq_resource_drv_data { +	struct scsi_bdq_ram_drv_data drv_data_per_bdq_id[BDQ_NUM_IDS]; +}; + +struct scsi_sge { +	struct regpair sge_addr; +	__le16 sge_len; +	__le16 reserved0; +	__le32 reserved1; +}; + +struct scsi_terminate_extra_params { +	__le16 unsolicited_cq_count; +	__le16 cmdq_count; +	u8 reserved[4]; +}; + +#endif /* __STORAGE_COMMON__ */ diff --git a/include/linux/qed/tcp_common.h b/include/linux/qed/tcp_common.h new file mode 100644 index 000000000000..accba0e6b704 --- /dev/null +++ b/include/linux/qed/tcp_common.h @@ -0,0 +1,226 @@ +/* QLogic qed NIC Driver + * Copyright (c) 2015 QLogic Corporation + * + * This software is available under the terms of the GNU General Public License + * (GPL) Version 2, available from the file COPYING in the main directory of + * this source tree. + */ + +#ifndef __TCP_COMMON__ +#define __TCP_COMMON__ + +#define TCP_INVALID_TIMEOUT_VAL -1 + +enum tcp_connect_mode { +	TCP_CONNECT_ACTIVE, +	TCP_CONNECT_PASSIVE, +	MAX_TCP_CONNECT_MODE +}; + +struct tcp_init_params { +	__le32 max_cwnd; +	__le16 dup_ack_threshold; +	__le16 tx_sws_timer; +	__le16 min_rto; +	__le16 min_rto_rt; +	__le16 max_rto; +	u8 maxfinrt; +	u8 reserved[1]; +}; + +enum tcp_ip_version { +	TCP_IPV4, +	TCP_IPV6, +	MAX_TCP_IP_VERSION +}; + +struct tcp_offload_params { +	__le16 local_mac_addr_lo; +	__le16 local_mac_addr_mid; +	__le16 local_mac_addr_hi; +	__le16 remote_mac_addr_lo; +	__le16 remote_mac_addr_mid; +	__le16 remote_mac_addr_hi; +	__le16 vlan_id; +	u8 flags; +#define TCP_OFFLOAD_PARAMS_TS_EN_MASK         0x1 +#define TCP_OFFLOAD_PARAMS_TS_EN_SHIFT        0 +#define TCP_OFFLOAD_PARAMS_DA_EN_MASK         0x1 +#define TCP_OFFLOAD_PARAMS_DA_EN_SHIFT        1 +#define TCP_OFFLOAD_PARAMS_KA_EN_MASK         0x1 +#define TCP_OFFLOAD_PARAMS_KA_EN_SHIFT        2 +#define TCP_OFFLOAD_PARAMS_NAGLE_EN_MASK      0x1 +#define TCP_OFFLOAD_PARAMS_NAGLE_EN_SHIFT     3 +#define TCP_OFFLOAD_PARAMS_DA_CNT_EN_MASK     0x1 +#define TCP_OFFLOAD_PARAMS_DA_CNT_EN_SHIFT    4 +#define TCP_OFFLOAD_PARAMS_FIN_SENT_MASK      0x1 +#define TCP_OFFLOAD_PARAMS_FIN_SENT_SHIFT     5 +#define TCP_OFFLOAD_PARAMS_FIN_RECEIVED_MASK  0x1 +#define TCP_OFFLOAD_PARAMS_FIN_RECEIVED_SHIFT 6 +#define TCP_OFFLOAD_PARAMS_RESERVED0_MASK     0x1 +#define TCP_OFFLOAD_PARAMS_RESERVED0_SHIFT    7 +	u8 ip_version; +	__le32 remote_ip[4]; +	__le32 local_ip[4]; +	__le32 flow_label; +	u8 ttl; +	u8 tos_or_tc; +	__le16 remote_port; +	__le16 local_port; +	__le16 mss; +	u8 rcv_wnd_scale; +	u8 connect_mode; +	__le16 srtt; +	__le32 cwnd; +	__le32 ss_thresh; +	__le16 reserved1; +	u8 ka_max_probe_cnt; +	u8 dup_ack_theshold; +	__le32 rcv_next; +	__le32 snd_una; +	__le32 snd_next; +	__le32 snd_max; +	__le32 snd_wnd; +	__le32 rcv_wnd; +	__le32 snd_wl1; +	__le32 ts_time; +	__le32 ts_recent; +	__le32 ts_recent_age; +	__le32 total_rt; +	__le32 ka_timeout_delta; +	__le32 rt_timeout_delta; +	u8 dup_ack_cnt; +	u8 snd_wnd_probe_cnt; +	u8 ka_probe_cnt; +	u8 rt_cnt; +	__le16 rtt_var; +	__le16 reserved2; +	__le32 ka_timeout; +	__le32 ka_interval; +	__le32 max_rt_time; +	__le32 initial_rcv_wnd; +	u8 snd_wnd_scale; +	u8 ack_frequency; +	__le16 da_timeout_value; +	__le32 ts_ticks_per_second; +}; + +struct tcp_offload_params_opt2 { +	__le16 local_mac_addr_lo; +	__le16 local_mac_addr_mid; +	__le16 local_mac_addr_hi; +	__le16 remote_mac_addr_lo; +	__le16 remote_mac_addr_mid; +	__le16 remote_mac_addr_hi; +	__le16 vlan_id; +	u8 flags; +#define TCP_OFFLOAD_PARAMS_OPT2_TS_EN_MASK      0x1 +#define TCP_OFFLOAD_PARAMS_OPT2_TS_EN_SHIFT     0 +#define TCP_OFFLOAD_PARAMS_OPT2_DA_EN_MASK      0x1 +#define TCP_OFFLOAD_PARAMS_OPT2_DA_EN_SHIFT     1 +#define TCP_OFFLOAD_PARAMS_OPT2_KA_EN_MASK      0x1 +#define TCP_OFFLOAD_PARAMS_OPT2_KA_EN_SHIFT     2 +#define TCP_OFFLOAD_PARAMS_OPT2_RESERVED0_MASK  0x1F +#define TCP_OFFLOAD_PARAMS_OPT2_RESERVED0_SHIFT 3 +	u8 ip_version; +	__le32 remote_ip[4]; +	__le32 local_ip[4]; +	__le32 flow_label; +	u8 ttl; +	u8 tos_or_tc; +	__le16 remote_port; +	__le16 local_port; +	__le16 mss; +	u8 rcv_wnd_scale; +	u8 connect_mode; +	__le16 syn_ip_payload_length; +	__le32 syn_phy_addr_lo; +	__le32 syn_phy_addr_hi; +	__le32 reserved1[22]; +}; + +enum tcp_seg_placement_event { +	TCP_EVENT_ADD_PEN, +	TCP_EVENT_ADD_NEW_ISLE, +	TCP_EVENT_ADD_ISLE_RIGHT, +	TCP_EVENT_ADD_ISLE_LEFT, +	TCP_EVENT_JOIN, +	TCP_EVENT_NOP, +	MAX_TCP_SEG_PLACEMENT_EVENT +}; + +struct tcp_update_params { +	__le16 flags; +#define TCP_UPDATE_PARAMS_REMOTE_MAC_ADDR_CHANGED_MASK   0x1 +#define TCP_UPDATE_PARAMS_REMOTE_MAC_ADDR_CHANGED_SHIFT  0 +#define TCP_UPDATE_PARAMS_MSS_CHANGED_MASK               0x1 +#define TCP_UPDATE_PARAMS_MSS_CHANGED_SHIFT              1 +#define TCP_UPDATE_PARAMS_TTL_CHANGED_MASK               0x1 +#define TCP_UPDATE_PARAMS_TTL_CHANGED_SHIFT              2 +#define TCP_UPDATE_PARAMS_TOS_OR_TC_CHANGED_MASK         0x1 +#define TCP_UPDATE_PARAMS_TOS_OR_TC_CHANGED_SHIFT        3 +#define TCP_UPDATE_PARAMS_KA_TIMEOUT_CHANGED_MASK        0x1 +#define TCP_UPDATE_PARAMS_KA_TIMEOUT_CHANGED_SHIFT       4 +#define TCP_UPDATE_PARAMS_KA_INTERVAL_CHANGED_MASK       0x1 +#define TCP_UPDATE_PARAMS_KA_INTERVAL_CHANGED_SHIFT      5 +#define TCP_UPDATE_PARAMS_MAX_RT_TIME_CHANGED_MASK       0x1 +#define TCP_UPDATE_PARAMS_MAX_RT_TIME_CHANGED_SHIFT      6 +#define TCP_UPDATE_PARAMS_FLOW_LABEL_CHANGED_MASK        0x1 +#define TCP_UPDATE_PARAMS_FLOW_LABEL_CHANGED_SHIFT       7 +#define TCP_UPDATE_PARAMS_INITIAL_RCV_WND_CHANGED_MASK   0x1 +#define TCP_UPDATE_PARAMS_INITIAL_RCV_WND_CHANGED_SHIFT  8 +#define TCP_UPDATE_PARAMS_KA_MAX_PROBE_CNT_CHANGED_MASK  0x1 +#define TCP_UPDATE_PARAMS_KA_MAX_PROBE_CNT_CHANGED_SHIFT 9 +#define TCP_UPDATE_PARAMS_KA_EN_CHANGED_MASK             0x1 +#define TCP_UPDATE_PARAMS_KA_EN_CHANGED_SHIFT            10 +#define TCP_UPDATE_PARAMS_NAGLE_EN_CHANGED_MASK          0x1 +#define TCP_UPDATE_PARAMS_NAGLE_EN_CHANGED_SHIFT         11 +#define TCP_UPDATE_PARAMS_KA_EN_MASK                     0x1 +#define TCP_UPDATE_PARAMS_KA_EN_SHIFT                    12 +#define TCP_UPDATE_PARAMS_NAGLE_EN_MASK                  0x1 +#define TCP_UPDATE_PARAMS_NAGLE_EN_SHIFT                 13 +#define TCP_UPDATE_PARAMS_KA_RESTART_MASK                0x1 +#define TCP_UPDATE_PARAMS_KA_RESTART_SHIFT               14 +#define TCP_UPDATE_PARAMS_RETRANSMIT_RESTART_MASK        0x1 +#define TCP_UPDATE_PARAMS_RETRANSMIT_RESTART_SHIFT       15 +	__le16 remote_mac_addr_lo; +	__le16 remote_mac_addr_mid; +	__le16 remote_mac_addr_hi; +	__le16 mss; +	u8 ttl; +	u8 tos_or_tc; +	__le32 ka_timeout; +	__le32 ka_interval; +	__le32 max_rt_time; +	__le32 flow_label; +	__le32 initial_rcv_wnd; +	u8 ka_max_probe_cnt; +	u8 reserved1[7]; +}; + +struct tcp_upload_params { +	__le32 rcv_next; +	__le32 snd_una; +	__le32 snd_next; +	__le32 snd_max; +	__le32 snd_wnd; +	__le32 rcv_wnd; +	__le32 snd_wl1; +	__le32 cwnd; +	__le32 ss_thresh; +	__le16 srtt; +	__le16 rtt_var; +	__le32 ts_time; +	__le32 ts_recent; +	__le32 ts_recent_age; +	__le32 total_rt; +	__le32 ka_timeout_delta; +	__le32 rt_timeout_delta; +	u8 dup_ack_cnt; +	u8 snd_wnd_probe_cnt; +	u8 ka_probe_cnt; +	u8 rt_cnt; +	__le32 reserved; +}; + +#endif /* __TCP_COMMON__ */ |