|  | /* SPDX-License-Identifier: GPL-2.0-only */ | 
|  | /* | 
|  | *  QLogic FCoE Offload Driver | 
|  | *  Copyright (c) 2016-2018 Cavium Inc. | 
|  | */ | 
|  | #ifndef __QEDF_HSI__ | 
|  | #define __QEDF_HSI__ | 
|  | /* | 
|  | * Add include to common target | 
|  | */ | 
|  | #include <linux/qed/common_hsi.h> | 
|  |  | 
|  | /* | 
|  | * Add include to common storage target | 
|  | */ | 
|  | #include <linux/qed/storage_common.h> | 
|  |  | 
|  | /* | 
|  | * Add include to common fcoe target for both eCore and protocol driver | 
|  | */ | 
|  | #include <linux/qed/fcoe_common.h> | 
|  |  | 
|  |  | 
|  | /* | 
|  | * FCoE CQ element ABTS information | 
|  | */ | 
|  | struct fcoe_abts_info { | 
|  | u8 r_ctl /* R_CTL in the ABTS response frame */; | 
|  | u8 reserved0; | 
|  | __le16 rx_id; | 
|  | __le32 reserved2[2]; | 
|  | __le32 fc_payload[3] /* ABTS FC payload response frame */; | 
|  | }; | 
|  |  | 
|  |  | 
|  | /* | 
|  | * FCoE class type | 
|  | */ | 
|  | enum fcoe_class_type { | 
|  | FCOE_TASK_CLASS_TYPE_3, | 
|  | FCOE_TASK_CLASS_TYPE_2, | 
|  | MAX_FCOE_CLASS_TYPE | 
|  | }; | 
|  |  | 
|  |  | 
|  | /* | 
|  | * FCoE CMDQ element control information | 
|  | */ | 
|  | struct fcoe_cmdqe_control { | 
|  | __le16 conn_id; | 
|  | u8 num_additional_cmdqes; | 
|  | u8 cmdType; | 
|  | /* true for ABTS request cmdqe. used in Target mode */ | 
|  | #define FCOE_CMDQE_CONTROL_ABTSREQCMD_MASK  0x1 | 
|  | #define FCOE_CMDQE_CONTROL_ABTSREQCMD_SHIFT 0 | 
|  | #define FCOE_CMDQE_CONTROL_RESERVED1_MASK   0x7F | 
|  | #define FCOE_CMDQE_CONTROL_RESERVED1_SHIFT  1 | 
|  | u8 reserved2[4]; | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * FCoE control + payload CMDQ element | 
|  | */ | 
|  | struct fcoe_cmdqe { | 
|  | struct fcoe_cmdqe_control hdr; | 
|  | u8 fc_header[24]; | 
|  | __le32 fcp_cmd_payload[8]; | 
|  | }; | 
|  |  | 
|  |  | 
|  |  | 
|  | /* | 
|  | * FCP RSP flags | 
|  | */ | 
|  | struct fcoe_fcp_rsp_flags { | 
|  | u8 flags; | 
|  | #define FCOE_FCP_RSP_FLAGS_FCP_RSP_LEN_VALID_MASK  0x1 | 
|  | #define FCOE_FCP_RSP_FLAGS_FCP_RSP_LEN_VALID_SHIFT 0 | 
|  | #define FCOE_FCP_RSP_FLAGS_FCP_SNS_LEN_VALID_MASK  0x1 | 
|  | #define FCOE_FCP_RSP_FLAGS_FCP_SNS_LEN_VALID_SHIFT 1 | 
|  | #define FCOE_FCP_RSP_FLAGS_FCP_RESID_OVER_MASK     0x1 | 
|  | #define FCOE_FCP_RSP_FLAGS_FCP_RESID_OVER_SHIFT    2 | 
|  | #define FCOE_FCP_RSP_FLAGS_FCP_RESID_UNDER_MASK    0x1 | 
|  | #define FCOE_FCP_RSP_FLAGS_FCP_RESID_UNDER_SHIFT   3 | 
|  | #define FCOE_FCP_RSP_FLAGS_FCP_CONF_REQ_MASK       0x1 | 
|  | #define FCOE_FCP_RSP_FLAGS_FCP_CONF_REQ_SHIFT      4 | 
|  | #define FCOE_FCP_RSP_FLAGS_FCP_BIDI_FLAGS_MASK     0x7 | 
|  | #define FCOE_FCP_RSP_FLAGS_FCP_BIDI_FLAGS_SHIFT    5 | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * FCoE CQ element response information | 
|  | */ | 
|  | struct fcoe_cqe_rsp_info { | 
|  | struct fcoe_fcp_rsp_flags rsp_flags; | 
|  | u8 scsi_status_code; | 
|  | __le16 retry_delay_timer; | 
|  | __le32 fcp_resid; | 
|  | __le32 fcp_sns_len; | 
|  | __le32 fcp_rsp_len; | 
|  | __le16 rx_id; | 
|  | u8 fw_error_flags; | 
|  | #define FCOE_CQE_RSP_INFO_FW_UNDERRUN_MASK  0x1 /* FW detected underrun */ | 
|  | #define FCOE_CQE_RSP_INFO_FW_UNDERRUN_SHIFT 0 | 
|  | #define FCOE_CQE_RSP_INFO_RESREVED_MASK     0x7F | 
|  | #define FCOE_CQE_RSP_INFO_RESREVED_SHIFT    1 | 
|  | u8 reserved; | 
|  | __le32 fw_residual /* Residual bytes calculated by FW */; | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * FCoE CQ element Target completion information | 
|  | */ | 
|  | struct fcoe_cqe_target_info { | 
|  | __le16 rx_id; | 
|  | __le16 reserved0; | 
|  | __le32 reserved1[5]; | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * FCoE error/warning reporting entry | 
|  | */ | 
|  | struct fcoe_err_report_entry { | 
|  | __le32 err_warn_bitmap_lo /* Error bitmap lower 32 bits */; | 
|  | __le32 err_warn_bitmap_hi /* Error bitmap higher 32 bits */; | 
|  | /* Buffer offset the beginning of the Sequence last transmitted */ | 
|  | __le32 tx_buf_off; | 
|  | /* Buffer offset from the beginning of the Sequence last received */ | 
|  | __le32 rx_buf_off; | 
|  | __le16 rx_id /* RX_ID of the associated task */; | 
|  | __le16 reserved1; | 
|  | __le32 reserved2; | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * FCoE CQ element middle path information | 
|  | */ | 
|  | struct fcoe_cqe_midpath_info { | 
|  | __le32 data_placement_size; | 
|  | __le16 rx_id; | 
|  | __le16 reserved0; | 
|  | __le32 reserved1[4]; | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * FCoE CQ element unsolicited information | 
|  | */ | 
|  | struct fcoe_unsolic_info { | 
|  | /* BD information: Physical address and opaque data */ | 
|  | struct scsi_bd bd_info; | 
|  | __le16 conn_id /* Connection ID the frame is associated to */; | 
|  | __le16 pkt_len /* Packet length */; | 
|  | u8 reserved1[4]; | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * FCoE warning reporting entry | 
|  | */ | 
|  | struct fcoe_warning_report_entry { | 
|  | /* BD information: Physical address and opaque data */ | 
|  | struct scsi_bd bd_info; | 
|  | /* Buffer offset the beginning of the Sequence last transmitted */ | 
|  | __le32 buf_off; | 
|  | __le16 rx_id /* RX_ID of the associated task */; | 
|  | __le16 reserved1; | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * FCoE CQ element information | 
|  | */ | 
|  | union fcoe_cqe_info { | 
|  | struct fcoe_cqe_rsp_info rsp_info /* Response completion information */; | 
|  | /* Target completion information */ | 
|  | struct fcoe_cqe_target_info target_info; | 
|  | /* Error completion information */ | 
|  | struct fcoe_err_report_entry err_info; | 
|  | struct fcoe_abts_info abts_info /* ABTS completion information */; | 
|  | /* Middle path completion information */ | 
|  | struct fcoe_cqe_midpath_info midpath_info; | 
|  | /* Unsolicited packet completion information */ | 
|  | struct fcoe_unsolic_info unsolic_info; | 
|  | /* Warning completion information (Rec Tov expiration) */ | 
|  | struct fcoe_warning_report_entry warn_info; | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * FCoE CQ element | 
|  | */ | 
|  | struct fcoe_cqe { | 
|  | __le32 cqe_data; | 
|  | /* The task identifier (OX_ID) to be completed */ | 
|  | #define FCOE_CQE_TASK_ID_MASK    0xFFFF | 
|  | #define FCOE_CQE_TASK_ID_SHIFT   0 | 
|  | /* | 
|  | * The CQE type: 0x0 Indicating on a pending work request completion. | 
|  | * 0x1 - Indicating on an unsolicited event notification. use enum | 
|  | * fcoe_cqe_type  (use enum fcoe_cqe_type) | 
|  | */ | 
|  | #define FCOE_CQE_CQE_TYPE_MASK   0xF | 
|  | #define FCOE_CQE_CQE_TYPE_SHIFT  16 | 
|  | #define FCOE_CQE_RESERVED0_MASK  0xFFF | 
|  | #define FCOE_CQE_RESERVED0_SHIFT 20 | 
|  | __le16 reserved1; | 
|  | __le16 fw_cq_prod; | 
|  | union fcoe_cqe_info cqe_info; | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * FCoE CQE type | 
|  | */ | 
|  | enum fcoe_cqe_type { | 
|  | /* solicited response on a R/W or middle-path SQE */ | 
|  | FCOE_GOOD_COMPLETION_CQE_TYPE, | 
|  | FCOE_UNSOLIC_CQE_TYPE /* unsolicited packet, RQ consumed */, | 
|  | FCOE_ERROR_DETECTION_CQE_TYPE /* timer expiration, validation error */, | 
|  | FCOE_WARNING_CQE_TYPE /* rec_tov or rr_tov timer expiration */, | 
|  | FCOE_EXCH_CLEANUP_CQE_TYPE /* task cleanup completed */, | 
|  | FCOE_ABTS_CQE_TYPE /* ABTS received and task cleaned */, | 
|  | FCOE_DUMMY_CQE_TYPE /* just increment SQ CONS */, | 
|  | /* Task was completed wight after sending a pkt to the target */ | 
|  | FCOE_LOCAL_COMP_CQE_TYPE, | 
|  | MAX_FCOE_CQE_TYPE | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * FCoE fast path error codes | 
|  | */ | 
|  | enum fcoe_fp_error_warning_code { | 
|  | FCOE_ERROR_CODE_XFER_OOO_RO /* XFER error codes */, | 
|  | FCOE_ERROR_CODE_XFER_RO_NOT_ALIGNED, | 
|  | FCOE_ERROR_CODE_XFER_NULL_BURST_LEN, | 
|  | FCOE_ERROR_CODE_XFER_RO_GREATER_THAN_DATA2TRNS, | 
|  | FCOE_ERROR_CODE_XFER_INVALID_PAYLOAD_SIZE, | 
|  | FCOE_ERROR_CODE_XFER_TASK_TYPE_NOT_WRITE, | 
|  | FCOE_ERROR_CODE_XFER_PEND_XFER_SET, | 
|  | FCOE_ERROR_CODE_XFER_OPENED_SEQ, | 
|  | FCOE_ERROR_CODE_XFER_FCTL, | 
|  | FCOE_ERROR_CODE_FCP_RSP_BIDI_FLAGS_SET /* FCP RSP error codes */, | 
|  | FCOE_ERROR_CODE_FCP_RSP_INVALID_LENGTH_FIELD, | 
|  | FCOE_ERROR_CODE_FCP_RSP_INVALID_SNS_FIELD, | 
|  | FCOE_ERROR_CODE_FCP_RSP_INVALID_PAYLOAD_SIZE, | 
|  | FCOE_ERROR_CODE_FCP_RSP_PEND_XFER_SET, | 
|  | FCOE_ERROR_CODE_FCP_RSP_OPENED_SEQ, | 
|  | FCOE_ERROR_CODE_FCP_RSP_FCTL, | 
|  | FCOE_ERROR_CODE_FCP_RSP_LAST_SEQ_RESET, | 
|  | FCOE_ERROR_CODE_FCP_RSP_CONF_REQ_NOT_SUPPORTED_YET, | 
|  | FCOE_ERROR_CODE_DATA_OOO_RO /* FCP DATA error codes */, | 
|  | FCOE_ERROR_CODE_DATA_EXCEEDS_DEFINED_MAX_FRAME_SIZE, | 
|  | FCOE_ERROR_CODE_DATA_EXCEEDS_DATA2TRNS, | 
|  | FCOE_ERROR_CODE_DATA_SOFI3_SEQ_ACTIVE_SET, | 
|  | FCOE_ERROR_CODE_DATA_SOFN_SEQ_ACTIVE_RESET, | 
|  | FCOE_ERROR_CODE_DATA_EOFN_END_SEQ_SET, | 
|  | FCOE_ERROR_CODE_DATA_EOFT_END_SEQ_RESET, | 
|  | FCOE_ERROR_CODE_DATA_TASK_TYPE_NOT_READ, | 
|  | FCOE_ERROR_CODE_DATA_FCTL_INITIATIR, | 
|  | FCOE_ERROR_CODE_MIDPATH_INVALID_TYPE /* Middle path error codes */, | 
|  | FCOE_ERROR_CODE_MIDPATH_SOFI3_SEQ_ACTIVE_SET, | 
|  | FCOE_ERROR_CODE_MIDPATH_SOFN_SEQ_ACTIVE_RESET, | 
|  | FCOE_ERROR_CODE_MIDPATH_EOFN_END_SEQ_SET, | 
|  | FCOE_ERROR_CODE_MIDPATH_EOFT_END_SEQ_RESET, | 
|  | FCOE_ERROR_CODE_MIDPATH_REPLY_FCTL, | 
|  | FCOE_ERROR_CODE_MIDPATH_INVALID_REPLY, | 
|  | FCOE_ERROR_CODE_MIDPATH_ELS_REPLY_RCTL, | 
|  | FCOE_ERROR_CODE_COMMON_MIDDLE_FRAME_WITH_PAD /* Common error codes */, | 
|  | FCOE_ERROR_CODE_COMMON_SEQ_INIT_IN_TCE, | 
|  | FCOE_ERROR_CODE_COMMON_FC_HDR_RX_ID_MISMATCH, | 
|  | FCOE_ERROR_CODE_COMMON_INCORRECT_SEQ_CNT, | 
|  | FCOE_ERROR_CODE_COMMON_DATA_FC_HDR_FCP_TYPE_MISMATCH, | 
|  | FCOE_ERROR_CODE_COMMON_DATA_NO_MORE_SGES, | 
|  | FCOE_ERROR_CODE_COMMON_OPTIONAL_FC_HDR, | 
|  | FCOE_ERROR_CODE_COMMON_READ_TCE_OX_ID_TOO_BIG, | 
|  | FCOE_ERROR_CODE_COMMON_DATA_WAS_NOT_TRANSMITTED, | 
|  | FCOE_ERROR_CODE_COMMON_TASK_DDF_RCTL_INFO_FIELD, | 
|  | FCOE_ERROR_CODE_COMMON_TASK_INVALID_RCTL, | 
|  | FCOE_ERROR_CODE_COMMON_TASK_RCTL_GENERAL_MISMATCH, | 
|  | FCOE_ERROR_CODE_E_D_TOV_TIMER_EXPIRATION /* Timer error codes */, | 
|  | FCOE_WARNING_CODE_REC_TOV_TIMER_EXPIRATION /* Timer error codes */, | 
|  | FCOE_ERROR_CODE_RR_TOV_TIMER_EXPIRATION /* Timer error codes */, | 
|  | /* ABTSrsp pckt arrived unexpected */ | 
|  | FCOE_ERROR_CODE_ABTS_REPLY_UNEXPECTED, | 
|  | FCOE_ERROR_CODE_TARGET_MODE_FCP_RSP, | 
|  | FCOE_ERROR_CODE_TARGET_MODE_FCP_XFER, | 
|  | FCOE_ERROR_CODE_TARGET_MODE_DATA_TASK_TYPE_NOT_WRITE, | 
|  | FCOE_ERROR_CODE_DATA_FCTL_TARGET, | 
|  | FCOE_ERROR_CODE_TARGET_DATA_SIZE_NO_MATCH_XFER, | 
|  | FCOE_ERROR_CODE_TARGET_DIF_CRC_CHECKSUM_ERROR, | 
|  | FCOE_ERROR_CODE_TARGET_DIF_REF_TAG_ERROR, | 
|  | FCOE_ERROR_CODE_TARGET_DIF_APP_TAG_ERROR, | 
|  | MAX_FCOE_FP_ERROR_WARNING_CODE | 
|  | }; | 
|  |  | 
|  |  | 
|  | /* | 
|  | * FCoE RESPQ element | 
|  | */ | 
|  | struct fcoe_respqe { | 
|  | __le16 ox_id /* OX_ID that is located in the FCP_RSP FC header */; | 
|  | __le16 rx_id /* RX_ID that is located in the FCP_RSP FC header */; | 
|  | __le32 additional_info; | 
|  | /* PARAM that is located in the FCP_RSP FC header */ | 
|  | #define FCOE_RESPQE_PARAM_MASK            0xFFFFFF | 
|  | #define FCOE_RESPQE_PARAM_SHIFT           0 | 
|  | /* Indication whther its Target-auto-rsp mode or not */ | 
|  | #define FCOE_RESPQE_TARGET_AUTO_RSP_MASK  0xFF | 
|  | #define FCOE_RESPQE_TARGET_AUTO_RSP_SHIFT 24 | 
|  | }; | 
|  |  | 
|  |  | 
|  | /* | 
|  | * FCoE slow path error codes | 
|  | */ | 
|  | enum fcoe_sp_error_code { | 
|  | /* Error codes for Error Reporting in slow path flows */ | 
|  | FCOE_ERROR_CODE_SLOW_PATH_TOO_MANY_FUNCS, | 
|  | FCOE_ERROR_SLOW_PATH_CODE_NO_LICENSE, | 
|  | MAX_FCOE_SP_ERROR_CODE | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * FCoE task TX state | 
|  | */ | 
|  | enum fcoe_task_tx_state { | 
|  | /* Initiate state after driver has initialized the task */ | 
|  | FCOE_TASK_TX_STATE_NORMAL, | 
|  | /* Updated by TX path after complete transmitting unsolicited packet */ | 
|  | FCOE_TASK_TX_STATE_UNSOLICITED_COMPLETED, | 
|  | /* | 
|  | * Updated by TX path after start processing the task requesting the | 
|  | * cleanup/abort operation | 
|  | */ | 
|  | FCOE_TASK_TX_STATE_CLEAN_REQ, | 
|  | FCOE_TASK_TX_STATE_ABTS /* Updated by TX path during abort procedure */, | 
|  | /* Updated by TX path during exchange cleanup procedure */ | 
|  | FCOE_TASK_TX_STATE_EXCLEANUP, | 
|  | /* | 
|  | * Updated by TX path during exchange cleanup continuation task | 
|  | * procedure | 
|  | */ | 
|  | FCOE_TASK_TX_STATE_EXCLEANUP_TARGET_WRITE_CONT, | 
|  | /* Updated by TX path during exchange cleanup first xfer procedure */ | 
|  | FCOE_TASK_TX_STATE_EXCLEANUP_TARGET_WRITE, | 
|  | /* Updated by TX path during exchange cleanup read task in Target */ | 
|  | FCOE_TASK_TX_STATE_EXCLEANUP_TARGET_READ_OR_RSP, | 
|  | /* Updated by TX path during target exchange cleanup procedure */ | 
|  | FCOE_TASK_TX_STATE_EXCLEANUP_TARGET_WRITE_LAST_CYCLE, | 
|  | /* Updated by TX path during sequence recovery procedure */ | 
|  | FCOE_TASK_TX_STATE_SEQRECOVERY, | 
|  | MAX_FCOE_TASK_TX_STATE | 
|  | }; | 
|  |  | 
|  | #endif /* __QEDF_HSI__ */ |