| /* |
| * QLogic FCoE Offload Driver |
| * Copyright (c) 2016 Cavium Inc. |
| * |
| * 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 __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 device type |
| */ |
| enum fcoe_device_type { |
| FCOE_TASK_DEV_TYPE_DISK, |
| FCOE_TASK_DEV_TYPE_TAPE, |
| MAX_FCOE_DEVICE_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 SQE request type |
| */ |
| enum fcoe_sqe_request_type { |
| SEND_FCOE_CMD, |
| SEND_FCOE_MIDPATH, |
| SEND_FCOE_ABTS_REQUEST, |
| FCOE_EXCHANGE_CLEANUP, |
| FCOE_SEQUENCE_RECOVERY, |
| SEND_FCOE_XFER_RDY, |
| SEND_FCOE_RSP, |
| SEND_FCOE_RSP_WITH_SENSE_DATA, |
| SEND_FCOE_TARGET_DATA, |
| SEND_FCOE_INITIATOR_DATA, |
| /* |
| * Xfer Continuation (==1) ready to be sent. Previous XFERs data |
| * received successfully. |
| */ |
| SEND_FCOE_XFER_CONTINUATION_RDY, |
| SEND_FCOE_TARGET_ABTS_RSP, |
| MAX_FCOE_SQE_REQUEST_TYPE |
| }; |
| |
| |
| /* |
| * 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 |
| }; |
| |
| |
| /* |
| * FCoE task type |
| */ |
| enum fcoe_task_type { |
| FCOE_TASK_TYPE_WRITE_INITIATOR, |
| FCOE_TASK_TYPE_READ_INITIATOR, |
| FCOE_TASK_TYPE_MIDPATH, |
| FCOE_TASK_TYPE_UNSOLICITED, |
| FCOE_TASK_TYPE_ABTS, |
| FCOE_TASK_TYPE_EXCHANGE_CLEANUP, |
| FCOE_TASK_TYPE_SEQUENCE_CLEANUP, |
| FCOE_TASK_TYPE_WRITE_TARGET, |
| FCOE_TASK_TYPE_READ_TARGET, |
| FCOE_TASK_TYPE_RSP, |
| FCOE_TASK_TYPE_RSP_SENSE_DATA, |
| FCOE_TASK_TYPE_ABTS_TARGET, |
| FCOE_TASK_TYPE_ENUM_SIZE, |
| MAX_FCOE_TASK_TYPE |
| }; |
| |
| struct scsi_glbl_queue_entry { |
| /* Start physical address for the RQ (receive queue) PBL. */ |
| struct regpair rq_pbl_addr; |
| /* Start physical address for the CQ (completion queue) PBL. */ |
| struct regpair cq_pbl_addr; |
| /* Start physical address for the CMDQ (command queue) PBL. */ |
| struct regpair cmdq_pbl_addr; |
| }; |
| |
| #endif /* __QEDF_HSI__ */ |