Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  *  QLogic FCoE Offload Driver
0004  *  Copyright (c) 2016-2018 Cavium Inc.
0005  */
0006 #ifndef __QEDF_HSI__
0007 #define __QEDF_HSI__
0008 /*
0009  * Add include to common target
0010  */
0011 #include <linux/qed/common_hsi.h>
0012 
0013 /*
0014  * Add include to common storage target
0015  */
0016 #include <linux/qed/storage_common.h>
0017 
0018 /*
0019  * Add include to common fcoe target for both eCore and protocol driver
0020  */
0021 #include <linux/qed/fcoe_common.h>
0022 
0023 
0024 /*
0025  * FCoE CQ element ABTS information
0026  */
0027 struct fcoe_abts_info {
0028     u8 r_ctl /* R_CTL in the ABTS response frame */;
0029     u8 reserved0;
0030     __le16 rx_id;
0031     __le32 reserved2[2];
0032     __le32 fc_payload[3] /* ABTS FC payload response frame */;
0033 };
0034 
0035 
0036 /*
0037  * FCoE class type
0038  */
0039 enum fcoe_class_type {
0040     FCOE_TASK_CLASS_TYPE_3,
0041     FCOE_TASK_CLASS_TYPE_2,
0042     MAX_FCOE_CLASS_TYPE
0043 };
0044 
0045 
0046 /*
0047  * FCoE CMDQ element control information
0048  */
0049 struct fcoe_cmdqe_control {
0050     __le16 conn_id;
0051     u8 num_additional_cmdqes;
0052     u8 cmdType;
0053     /* true for ABTS request cmdqe. used in Target mode */
0054 #define FCOE_CMDQE_CONTROL_ABTSREQCMD_MASK  0x1
0055 #define FCOE_CMDQE_CONTROL_ABTSREQCMD_SHIFT 0
0056 #define FCOE_CMDQE_CONTROL_RESERVED1_MASK   0x7F
0057 #define FCOE_CMDQE_CONTROL_RESERVED1_SHIFT  1
0058     u8 reserved2[4];
0059 };
0060 
0061 /*
0062  * FCoE control + payload CMDQ element
0063  */
0064 struct fcoe_cmdqe {
0065     struct fcoe_cmdqe_control hdr;
0066     u8 fc_header[24];
0067     __le32 fcp_cmd_payload[8];
0068 };
0069 
0070 
0071 
0072 /*
0073  * FCP RSP flags
0074  */
0075 struct fcoe_fcp_rsp_flags {
0076     u8 flags;
0077 #define FCOE_FCP_RSP_FLAGS_FCP_RSP_LEN_VALID_MASK  0x1
0078 #define FCOE_FCP_RSP_FLAGS_FCP_RSP_LEN_VALID_SHIFT 0
0079 #define FCOE_FCP_RSP_FLAGS_FCP_SNS_LEN_VALID_MASK  0x1
0080 #define FCOE_FCP_RSP_FLAGS_FCP_SNS_LEN_VALID_SHIFT 1
0081 #define FCOE_FCP_RSP_FLAGS_FCP_RESID_OVER_MASK     0x1
0082 #define FCOE_FCP_RSP_FLAGS_FCP_RESID_OVER_SHIFT    2
0083 #define FCOE_FCP_RSP_FLAGS_FCP_RESID_UNDER_MASK    0x1
0084 #define FCOE_FCP_RSP_FLAGS_FCP_RESID_UNDER_SHIFT   3
0085 #define FCOE_FCP_RSP_FLAGS_FCP_CONF_REQ_MASK       0x1
0086 #define FCOE_FCP_RSP_FLAGS_FCP_CONF_REQ_SHIFT      4
0087 #define FCOE_FCP_RSP_FLAGS_FCP_BIDI_FLAGS_MASK     0x7
0088 #define FCOE_FCP_RSP_FLAGS_FCP_BIDI_FLAGS_SHIFT    5
0089 };
0090 
0091 /*
0092  * FCoE CQ element response information
0093  */
0094 struct fcoe_cqe_rsp_info {
0095     struct fcoe_fcp_rsp_flags rsp_flags;
0096     u8 scsi_status_code;
0097     __le16 retry_delay_timer;
0098     __le32 fcp_resid;
0099     __le32 fcp_sns_len;
0100     __le32 fcp_rsp_len;
0101     __le16 rx_id;
0102     u8 fw_error_flags;
0103 #define FCOE_CQE_RSP_INFO_FW_UNDERRUN_MASK  0x1 /* FW detected underrun */
0104 #define FCOE_CQE_RSP_INFO_FW_UNDERRUN_SHIFT 0
0105 #define FCOE_CQE_RSP_INFO_RESREVED_MASK     0x7F
0106 #define FCOE_CQE_RSP_INFO_RESREVED_SHIFT    1
0107     u8 reserved;
0108     __le32 fw_residual /* Residual bytes calculated by FW */;
0109 };
0110 
0111 /*
0112  * FCoE CQ element Target completion information
0113  */
0114 struct fcoe_cqe_target_info {
0115     __le16 rx_id;
0116     __le16 reserved0;
0117     __le32 reserved1[5];
0118 };
0119 
0120 /*
0121  * FCoE error/warning reporting entry
0122  */
0123 struct fcoe_err_report_entry {
0124     __le32 err_warn_bitmap_lo /* Error bitmap lower 32 bits */;
0125     __le32 err_warn_bitmap_hi /* Error bitmap higher 32 bits */;
0126     /* Buffer offset the beginning of the Sequence last transmitted */
0127     __le32 tx_buf_off;
0128     /* Buffer offset from the beginning of the Sequence last received */
0129     __le32 rx_buf_off;
0130     __le16 rx_id /* RX_ID of the associated task */;
0131     __le16 reserved1;
0132     __le32 reserved2;
0133 };
0134 
0135 /*
0136  * FCoE CQ element middle path information
0137  */
0138 struct fcoe_cqe_midpath_info {
0139     __le32 data_placement_size;
0140     __le16 rx_id;
0141     __le16 reserved0;
0142     __le32 reserved1[4];
0143 };
0144 
0145 /*
0146  * FCoE CQ element unsolicited information
0147  */
0148 struct fcoe_unsolic_info {
0149     /* BD information: Physical address and opaque data */
0150     struct scsi_bd bd_info;
0151     __le16 conn_id /* Connection ID the frame is associated to */;
0152     __le16 pkt_len /* Packet length */;
0153     u8 reserved1[4];
0154 };
0155 
0156 /*
0157  * FCoE warning reporting entry
0158  */
0159 struct fcoe_warning_report_entry {
0160     /* BD information: Physical address and opaque data */
0161     struct scsi_bd bd_info;
0162     /* Buffer offset the beginning of the Sequence last transmitted */
0163     __le32 buf_off;
0164     __le16 rx_id /* RX_ID of the associated task */;
0165     __le16 reserved1;
0166 };
0167 
0168 /*
0169  * FCoE CQ element information
0170  */
0171 union fcoe_cqe_info {
0172     struct fcoe_cqe_rsp_info rsp_info /* Response completion information */;
0173     /* Target completion information */
0174     struct fcoe_cqe_target_info target_info;
0175     /* Error completion information */
0176     struct fcoe_err_report_entry err_info;
0177     struct fcoe_abts_info abts_info /* ABTS completion information */;
0178     /* Middle path completion information */
0179     struct fcoe_cqe_midpath_info midpath_info;
0180     /* Unsolicited packet completion information */
0181     struct fcoe_unsolic_info unsolic_info;
0182     /* Warning completion information (Rec Tov expiration) */
0183     struct fcoe_warning_report_entry warn_info;
0184 };
0185 
0186 /*
0187  * FCoE CQ element
0188  */
0189 struct fcoe_cqe {
0190     __le32 cqe_data;
0191     /* The task identifier (OX_ID) to be completed */
0192 #define FCOE_CQE_TASK_ID_MASK    0xFFFF
0193 #define FCOE_CQE_TASK_ID_SHIFT   0
0194     /*
0195      * The CQE type: 0x0 Indicating on a pending work request completion.
0196      * 0x1 - Indicating on an unsolicited event notification. use enum
0197      * fcoe_cqe_type  (use enum fcoe_cqe_type)
0198      */
0199 #define FCOE_CQE_CQE_TYPE_MASK   0xF
0200 #define FCOE_CQE_CQE_TYPE_SHIFT  16
0201 #define FCOE_CQE_RESERVED0_MASK  0xFFF
0202 #define FCOE_CQE_RESERVED0_SHIFT 20
0203     __le16 reserved1;
0204     __le16 fw_cq_prod;
0205     union fcoe_cqe_info cqe_info;
0206 };
0207 
0208 /*
0209  * FCoE CQE type
0210  */
0211 enum fcoe_cqe_type {
0212     /* solicited response on a R/W or middle-path SQE */
0213     FCOE_GOOD_COMPLETION_CQE_TYPE,
0214     FCOE_UNSOLIC_CQE_TYPE /* unsolicited packet, RQ consumed */,
0215     FCOE_ERROR_DETECTION_CQE_TYPE /* timer expiration, validation error */,
0216     FCOE_WARNING_CQE_TYPE /* rec_tov or rr_tov timer expiration */,
0217     FCOE_EXCH_CLEANUP_CQE_TYPE /* task cleanup completed */,
0218     FCOE_ABTS_CQE_TYPE /* ABTS received and task cleaned */,
0219     FCOE_DUMMY_CQE_TYPE /* just increment SQ CONS */,
0220     /* Task was completed wight after sending a pkt to the target */
0221     FCOE_LOCAL_COMP_CQE_TYPE,
0222     MAX_FCOE_CQE_TYPE
0223 };
0224 
0225 /*
0226  * FCoE fast path error codes
0227  */
0228 enum fcoe_fp_error_warning_code {
0229     FCOE_ERROR_CODE_XFER_OOO_RO /* XFER error codes */,
0230     FCOE_ERROR_CODE_XFER_RO_NOT_ALIGNED,
0231     FCOE_ERROR_CODE_XFER_NULL_BURST_LEN,
0232     FCOE_ERROR_CODE_XFER_RO_GREATER_THAN_DATA2TRNS,
0233     FCOE_ERROR_CODE_XFER_INVALID_PAYLOAD_SIZE,
0234     FCOE_ERROR_CODE_XFER_TASK_TYPE_NOT_WRITE,
0235     FCOE_ERROR_CODE_XFER_PEND_XFER_SET,
0236     FCOE_ERROR_CODE_XFER_OPENED_SEQ,
0237     FCOE_ERROR_CODE_XFER_FCTL,
0238     FCOE_ERROR_CODE_FCP_RSP_BIDI_FLAGS_SET /* FCP RSP error codes */,
0239     FCOE_ERROR_CODE_FCP_RSP_INVALID_LENGTH_FIELD,
0240     FCOE_ERROR_CODE_FCP_RSP_INVALID_SNS_FIELD,
0241     FCOE_ERROR_CODE_FCP_RSP_INVALID_PAYLOAD_SIZE,
0242     FCOE_ERROR_CODE_FCP_RSP_PEND_XFER_SET,
0243     FCOE_ERROR_CODE_FCP_RSP_OPENED_SEQ,
0244     FCOE_ERROR_CODE_FCP_RSP_FCTL,
0245     FCOE_ERROR_CODE_FCP_RSP_LAST_SEQ_RESET,
0246     FCOE_ERROR_CODE_FCP_RSP_CONF_REQ_NOT_SUPPORTED_YET,
0247     FCOE_ERROR_CODE_DATA_OOO_RO /* FCP DATA error codes */,
0248     FCOE_ERROR_CODE_DATA_EXCEEDS_DEFINED_MAX_FRAME_SIZE,
0249     FCOE_ERROR_CODE_DATA_EXCEEDS_DATA2TRNS,
0250     FCOE_ERROR_CODE_DATA_SOFI3_SEQ_ACTIVE_SET,
0251     FCOE_ERROR_CODE_DATA_SOFN_SEQ_ACTIVE_RESET,
0252     FCOE_ERROR_CODE_DATA_EOFN_END_SEQ_SET,
0253     FCOE_ERROR_CODE_DATA_EOFT_END_SEQ_RESET,
0254     FCOE_ERROR_CODE_DATA_TASK_TYPE_NOT_READ,
0255     FCOE_ERROR_CODE_DATA_FCTL_INITIATIR,
0256     FCOE_ERROR_CODE_MIDPATH_INVALID_TYPE /* Middle path error codes */,
0257     FCOE_ERROR_CODE_MIDPATH_SOFI3_SEQ_ACTIVE_SET,
0258     FCOE_ERROR_CODE_MIDPATH_SOFN_SEQ_ACTIVE_RESET,
0259     FCOE_ERROR_CODE_MIDPATH_EOFN_END_SEQ_SET,
0260     FCOE_ERROR_CODE_MIDPATH_EOFT_END_SEQ_RESET,
0261     FCOE_ERROR_CODE_MIDPATH_REPLY_FCTL,
0262     FCOE_ERROR_CODE_MIDPATH_INVALID_REPLY,
0263     FCOE_ERROR_CODE_MIDPATH_ELS_REPLY_RCTL,
0264     FCOE_ERROR_CODE_COMMON_MIDDLE_FRAME_WITH_PAD /* Common error codes */,
0265     FCOE_ERROR_CODE_COMMON_SEQ_INIT_IN_TCE,
0266     FCOE_ERROR_CODE_COMMON_FC_HDR_RX_ID_MISMATCH,
0267     FCOE_ERROR_CODE_COMMON_INCORRECT_SEQ_CNT,
0268     FCOE_ERROR_CODE_COMMON_DATA_FC_HDR_FCP_TYPE_MISMATCH,
0269     FCOE_ERROR_CODE_COMMON_DATA_NO_MORE_SGES,
0270     FCOE_ERROR_CODE_COMMON_OPTIONAL_FC_HDR,
0271     FCOE_ERROR_CODE_COMMON_READ_TCE_OX_ID_TOO_BIG,
0272     FCOE_ERROR_CODE_COMMON_DATA_WAS_NOT_TRANSMITTED,
0273     FCOE_ERROR_CODE_COMMON_TASK_DDF_RCTL_INFO_FIELD,
0274     FCOE_ERROR_CODE_COMMON_TASK_INVALID_RCTL,
0275     FCOE_ERROR_CODE_COMMON_TASK_RCTL_GENERAL_MISMATCH,
0276     FCOE_ERROR_CODE_E_D_TOV_TIMER_EXPIRATION /* Timer error codes */,
0277     FCOE_WARNING_CODE_REC_TOV_TIMER_EXPIRATION /* Timer error codes */,
0278     FCOE_ERROR_CODE_RR_TOV_TIMER_EXPIRATION /* Timer error codes */,
0279     /* ABTSrsp pckt arrived unexpected */
0280     FCOE_ERROR_CODE_ABTS_REPLY_UNEXPECTED,
0281     FCOE_ERROR_CODE_TARGET_MODE_FCP_RSP,
0282     FCOE_ERROR_CODE_TARGET_MODE_FCP_XFER,
0283     FCOE_ERROR_CODE_TARGET_MODE_DATA_TASK_TYPE_NOT_WRITE,
0284     FCOE_ERROR_CODE_DATA_FCTL_TARGET,
0285     FCOE_ERROR_CODE_TARGET_DATA_SIZE_NO_MATCH_XFER,
0286     FCOE_ERROR_CODE_TARGET_DIF_CRC_CHECKSUM_ERROR,
0287     FCOE_ERROR_CODE_TARGET_DIF_REF_TAG_ERROR,
0288     FCOE_ERROR_CODE_TARGET_DIF_APP_TAG_ERROR,
0289     MAX_FCOE_FP_ERROR_WARNING_CODE
0290 };
0291 
0292 
0293 /*
0294  * FCoE RESPQ element
0295  */
0296 struct fcoe_respqe {
0297     __le16 ox_id /* OX_ID that is located in the FCP_RSP FC header */;
0298     __le16 rx_id /* RX_ID that is located in the FCP_RSP FC header */;
0299     __le32 additional_info;
0300 /* PARAM that is located in the FCP_RSP FC header */
0301 #define FCOE_RESPQE_PARAM_MASK            0xFFFFFF
0302 #define FCOE_RESPQE_PARAM_SHIFT           0
0303 /* Indication whther its Target-auto-rsp mode or not */
0304 #define FCOE_RESPQE_TARGET_AUTO_RSP_MASK  0xFF
0305 #define FCOE_RESPQE_TARGET_AUTO_RSP_SHIFT 24
0306 };
0307 
0308 
0309 /*
0310  * FCoE slow path error codes
0311  */
0312 enum fcoe_sp_error_code {
0313     /* Error codes for Error Reporting in slow path flows */
0314     FCOE_ERROR_CODE_SLOW_PATH_TOO_MANY_FUNCS,
0315     FCOE_ERROR_SLOW_PATH_CODE_NO_LICENSE,
0316     MAX_FCOE_SP_ERROR_CODE
0317 };
0318 
0319 /*
0320  * FCoE task TX state
0321  */
0322 enum fcoe_task_tx_state {
0323     /* Initiate state after driver has initialized the task */
0324     FCOE_TASK_TX_STATE_NORMAL,
0325     /* Updated by TX path after complete transmitting unsolicited packet */
0326     FCOE_TASK_TX_STATE_UNSOLICITED_COMPLETED,
0327     /*
0328      * Updated by TX path after start processing the task requesting the
0329      * cleanup/abort operation
0330      */
0331     FCOE_TASK_TX_STATE_CLEAN_REQ,
0332     FCOE_TASK_TX_STATE_ABTS /* Updated by TX path during abort procedure */,
0333     /* Updated by TX path during exchange cleanup procedure */
0334     FCOE_TASK_TX_STATE_EXCLEANUP,
0335     /*
0336      * Updated by TX path during exchange cleanup continuation task
0337      * procedure
0338      */
0339     FCOE_TASK_TX_STATE_EXCLEANUP_TARGET_WRITE_CONT,
0340     /* Updated by TX path during exchange cleanup first xfer procedure */
0341     FCOE_TASK_TX_STATE_EXCLEANUP_TARGET_WRITE,
0342     /* Updated by TX path during exchange cleanup read task in Target */
0343     FCOE_TASK_TX_STATE_EXCLEANUP_TARGET_READ_OR_RSP,
0344     /* Updated by TX path during target exchange cleanup procedure */
0345     FCOE_TASK_TX_STATE_EXCLEANUP_TARGET_WRITE_LAST_CYCLE,
0346     /* Updated by TX path during sequence recovery procedure */
0347     FCOE_TASK_TX_STATE_SEQRECOVERY,
0348     MAX_FCOE_TASK_TX_STATE
0349 };
0350 
0351 #endif /* __QEDF_HSI__ */