1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * QLogic FCoE Offload Driver 4 * Copyright (c) 2016-2018 Cavium Inc. 5 */ 6 #ifndef __QEDF_HSI__ 7 #define __QEDF_HSI__ 8 /* 9 * Add include to common target 10 */ 11 #include <linux/qed/common_hsi.h> 12 13 /* 14 * Add include to common storage target 15 */ 16 #include <linux/qed/storage_common.h> 17 18 /* 19 * Add include to common fcoe target for both eCore and protocol driver 20 */ 21 #include <linux/qed/fcoe_common.h> 22 23 24 /* 25 * FCoE CQ element ABTS information 26 */ 27 struct fcoe_abts_info { 28 u8 r_ctl /* R_CTL in the ABTS response frame */; 29 u8 reserved0; 30 __le16 rx_id; 31 __le32 reserved2[2]; 32 __le32 fc_payload[3] /* ABTS FC payload response frame */; 33 }; 34 35 36 /* 37 * FCoE class type 38 */ 39 enum fcoe_class_type { 40 FCOE_TASK_CLASS_TYPE_3, 41 FCOE_TASK_CLASS_TYPE_2, 42 MAX_FCOE_CLASS_TYPE 43 }; 44 45 46 /* 47 * FCoE CMDQ element control information 48 */ 49 struct fcoe_cmdqe_control { 50 __le16 conn_id; 51 u8 num_additional_cmdqes; 52 u8 cmdType; 53 /* true for ABTS request cmdqe. used in Target mode */ 54 #define FCOE_CMDQE_CONTROL_ABTSREQCMD_MASK 0x1 55 #define FCOE_CMDQE_CONTROL_ABTSREQCMD_SHIFT 0 56 #define FCOE_CMDQE_CONTROL_RESERVED1_MASK 0x7F 57 #define FCOE_CMDQE_CONTROL_RESERVED1_SHIFT 1 58 u8 reserved2[4]; 59 }; 60 61 /* 62 * FCoE control + payload CMDQ element 63 */ 64 struct fcoe_cmdqe { 65 struct fcoe_cmdqe_control hdr; 66 u8 fc_header[24]; 67 __le32 fcp_cmd_payload[8]; 68 }; 69 70 71 72 /* 73 * FCP RSP flags 74 */ 75 struct fcoe_fcp_rsp_flags { 76 u8 flags; 77 #define FCOE_FCP_RSP_FLAGS_FCP_RSP_LEN_VALID_MASK 0x1 78 #define FCOE_FCP_RSP_FLAGS_FCP_RSP_LEN_VALID_SHIFT 0 79 #define FCOE_FCP_RSP_FLAGS_FCP_SNS_LEN_VALID_MASK 0x1 80 #define FCOE_FCP_RSP_FLAGS_FCP_SNS_LEN_VALID_SHIFT 1 81 #define FCOE_FCP_RSP_FLAGS_FCP_RESID_OVER_MASK 0x1 82 #define FCOE_FCP_RSP_FLAGS_FCP_RESID_OVER_SHIFT 2 83 #define FCOE_FCP_RSP_FLAGS_FCP_RESID_UNDER_MASK 0x1 84 #define FCOE_FCP_RSP_FLAGS_FCP_RESID_UNDER_SHIFT 3 85 #define FCOE_FCP_RSP_FLAGS_FCP_CONF_REQ_MASK 0x1 86 #define FCOE_FCP_RSP_FLAGS_FCP_CONF_REQ_SHIFT 4 87 #define FCOE_FCP_RSP_FLAGS_FCP_BIDI_FLAGS_MASK 0x7 88 #define FCOE_FCP_RSP_FLAGS_FCP_BIDI_FLAGS_SHIFT 5 89 }; 90 91 /* 92 * FCoE CQ element response information 93 */ 94 struct fcoe_cqe_rsp_info { 95 struct fcoe_fcp_rsp_flags rsp_flags; 96 u8 scsi_status_code; 97 __le16 retry_delay_timer; 98 __le32 fcp_resid; 99 __le32 fcp_sns_len; 100 __le32 fcp_rsp_len; 101 __le16 rx_id; 102 u8 fw_error_flags; 103 #define FCOE_CQE_RSP_INFO_FW_UNDERRUN_MASK 0x1 /* FW detected underrun */ 104 #define FCOE_CQE_RSP_INFO_FW_UNDERRUN_SHIFT 0 105 #define FCOE_CQE_RSP_INFO_RESREVED_MASK 0x7F 106 #define FCOE_CQE_RSP_INFO_RESREVED_SHIFT 1 107 u8 reserved; 108 __le32 fw_residual /* Residual bytes calculated by FW */; 109 }; 110 111 /* 112 * FCoE CQ element Target completion information 113 */ 114 struct fcoe_cqe_target_info { 115 __le16 rx_id; 116 __le16 reserved0; 117 __le32 reserved1[5]; 118 }; 119 120 /* 121 * FCoE error/warning reporting entry 122 */ 123 struct fcoe_err_report_entry { 124 __le32 err_warn_bitmap_lo /* Error bitmap lower 32 bits */; 125 __le32 err_warn_bitmap_hi /* Error bitmap higher 32 bits */; 126 /* Buffer offset the beginning of the Sequence last transmitted */ 127 __le32 tx_buf_off; 128 /* Buffer offset from the beginning of the Sequence last received */ 129 __le32 rx_buf_off; 130 __le16 rx_id /* RX_ID of the associated task */; 131 __le16 reserved1; 132 __le32 reserved2; 133 }; 134 135 /* 136 * FCoE CQ element middle path information 137 */ 138 struct fcoe_cqe_midpath_info { 139 __le32 data_placement_size; 140 __le16 rx_id; 141 __le16 reserved0; 142 __le32 reserved1[4]; 143 }; 144 145 /* 146 * FCoE CQ element unsolicited information 147 */ 148 struct fcoe_unsolic_info { 149 /* BD information: Physical address and opaque data */ 150 struct scsi_bd bd_info; 151 __le16 conn_id /* Connection ID the frame is associated to */; 152 __le16 pkt_len /* Packet length */; 153 u8 reserved1[4]; 154 }; 155 156 /* 157 * FCoE warning reporting entry 158 */ 159 struct fcoe_warning_report_entry { 160 /* BD information: Physical address and opaque data */ 161 struct scsi_bd bd_info; 162 /* Buffer offset the beginning of the Sequence last transmitted */ 163 __le32 buf_off; 164 __le16 rx_id /* RX_ID of the associated task */; 165 __le16 reserved1; 166 }; 167 168 /* 169 * FCoE CQ element information 170 */ 171 union fcoe_cqe_info { 172 struct fcoe_cqe_rsp_info rsp_info /* Response completion information */; 173 /* Target completion information */ 174 struct fcoe_cqe_target_info target_info; 175 /* Error completion information */ 176 struct fcoe_err_report_entry err_info; 177 struct fcoe_abts_info abts_info /* ABTS completion information */; 178 /* Middle path completion information */ 179 struct fcoe_cqe_midpath_info midpath_info; 180 /* Unsolicited packet completion information */ 181 struct fcoe_unsolic_info unsolic_info; 182 /* Warning completion information (Rec Tov expiration) */ 183 struct fcoe_warning_report_entry warn_info; 184 }; 185 186 /* 187 * FCoE CQ element 188 */ 189 struct fcoe_cqe { 190 __le32 cqe_data; 191 /* The task identifier (OX_ID) to be completed */ 192 #define FCOE_CQE_TASK_ID_MASK 0xFFFF 193 #define FCOE_CQE_TASK_ID_SHIFT 0 194 /* 195 * The CQE type: 0x0 Indicating on a pending work request completion. 196 * 0x1 - Indicating on an unsolicited event notification. use enum 197 * fcoe_cqe_type (use enum fcoe_cqe_type) 198 */ 199 #define FCOE_CQE_CQE_TYPE_MASK 0xF 200 #define FCOE_CQE_CQE_TYPE_SHIFT 16 201 #define FCOE_CQE_RESERVED0_MASK 0xFFF 202 #define FCOE_CQE_RESERVED0_SHIFT 20 203 __le16 reserved1; 204 __le16 fw_cq_prod; 205 union fcoe_cqe_info cqe_info; 206 }; 207 208 /* 209 * FCoE CQE type 210 */ 211 enum fcoe_cqe_type { 212 /* solicited response on a R/W or middle-path SQE */ 213 FCOE_GOOD_COMPLETION_CQE_TYPE, 214 FCOE_UNSOLIC_CQE_TYPE /* unsolicited packet, RQ consumed */, 215 FCOE_ERROR_DETECTION_CQE_TYPE /* timer expiration, validation error */, 216 FCOE_WARNING_CQE_TYPE /* rec_tov or rr_tov timer expiration */, 217 FCOE_EXCH_CLEANUP_CQE_TYPE /* task cleanup completed */, 218 FCOE_ABTS_CQE_TYPE /* ABTS received and task cleaned */, 219 FCOE_DUMMY_CQE_TYPE /* just increment SQ CONS */, 220 /* Task was completed wight after sending a pkt to the target */ 221 FCOE_LOCAL_COMP_CQE_TYPE, 222 MAX_FCOE_CQE_TYPE 223 }; 224 225 /* 226 * FCoE fast path error codes 227 */ 228 enum fcoe_fp_error_warning_code { 229 FCOE_ERROR_CODE_XFER_OOO_RO /* XFER error codes */, 230 FCOE_ERROR_CODE_XFER_RO_NOT_ALIGNED, 231 FCOE_ERROR_CODE_XFER_NULL_BURST_LEN, 232 FCOE_ERROR_CODE_XFER_RO_GREATER_THAN_DATA2TRNS, 233 FCOE_ERROR_CODE_XFER_INVALID_PAYLOAD_SIZE, 234 FCOE_ERROR_CODE_XFER_TASK_TYPE_NOT_WRITE, 235 FCOE_ERROR_CODE_XFER_PEND_XFER_SET, 236 FCOE_ERROR_CODE_XFER_OPENED_SEQ, 237 FCOE_ERROR_CODE_XFER_FCTL, 238 FCOE_ERROR_CODE_FCP_RSP_BIDI_FLAGS_SET /* FCP RSP error codes */, 239 FCOE_ERROR_CODE_FCP_RSP_INVALID_LENGTH_FIELD, 240 FCOE_ERROR_CODE_FCP_RSP_INVALID_SNS_FIELD, 241 FCOE_ERROR_CODE_FCP_RSP_INVALID_PAYLOAD_SIZE, 242 FCOE_ERROR_CODE_FCP_RSP_PEND_XFER_SET, 243 FCOE_ERROR_CODE_FCP_RSP_OPENED_SEQ, 244 FCOE_ERROR_CODE_FCP_RSP_FCTL, 245 FCOE_ERROR_CODE_FCP_RSP_LAST_SEQ_RESET, 246 FCOE_ERROR_CODE_FCP_RSP_CONF_REQ_NOT_SUPPORTED_YET, 247 FCOE_ERROR_CODE_DATA_OOO_RO /* FCP DATA error codes */, 248 FCOE_ERROR_CODE_DATA_EXCEEDS_DEFINED_MAX_FRAME_SIZE, 249 FCOE_ERROR_CODE_DATA_EXCEEDS_DATA2TRNS, 250 FCOE_ERROR_CODE_DATA_SOFI3_SEQ_ACTIVE_SET, 251 FCOE_ERROR_CODE_DATA_SOFN_SEQ_ACTIVE_RESET, 252 FCOE_ERROR_CODE_DATA_EOFN_END_SEQ_SET, 253 FCOE_ERROR_CODE_DATA_EOFT_END_SEQ_RESET, 254 FCOE_ERROR_CODE_DATA_TASK_TYPE_NOT_READ, 255 FCOE_ERROR_CODE_DATA_FCTL_INITIATIR, 256 FCOE_ERROR_CODE_MIDPATH_INVALID_TYPE /* Middle path error codes */, 257 FCOE_ERROR_CODE_MIDPATH_SOFI3_SEQ_ACTIVE_SET, 258 FCOE_ERROR_CODE_MIDPATH_SOFN_SEQ_ACTIVE_RESET, 259 FCOE_ERROR_CODE_MIDPATH_EOFN_END_SEQ_SET, 260 FCOE_ERROR_CODE_MIDPATH_EOFT_END_SEQ_RESET, 261 FCOE_ERROR_CODE_MIDPATH_REPLY_FCTL, 262 FCOE_ERROR_CODE_MIDPATH_INVALID_REPLY, 263 FCOE_ERROR_CODE_MIDPATH_ELS_REPLY_RCTL, 264 FCOE_ERROR_CODE_COMMON_MIDDLE_FRAME_WITH_PAD /* Common error codes */, 265 FCOE_ERROR_CODE_COMMON_SEQ_INIT_IN_TCE, 266 FCOE_ERROR_CODE_COMMON_FC_HDR_RX_ID_MISMATCH, 267 FCOE_ERROR_CODE_COMMON_INCORRECT_SEQ_CNT, 268 FCOE_ERROR_CODE_COMMON_DATA_FC_HDR_FCP_TYPE_MISMATCH, 269 FCOE_ERROR_CODE_COMMON_DATA_NO_MORE_SGES, 270 FCOE_ERROR_CODE_COMMON_OPTIONAL_FC_HDR, 271 FCOE_ERROR_CODE_COMMON_READ_TCE_OX_ID_TOO_BIG, 272 FCOE_ERROR_CODE_COMMON_DATA_WAS_NOT_TRANSMITTED, 273 FCOE_ERROR_CODE_COMMON_TASK_DDF_RCTL_INFO_FIELD, 274 FCOE_ERROR_CODE_COMMON_TASK_INVALID_RCTL, 275 FCOE_ERROR_CODE_COMMON_TASK_RCTL_GENERAL_MISMATCH, 276 FCOE_ERROR_CODE_E_D_TOV_TIMER_EXPIRATION /* Timer error codes */, 277 FCOE_WARNING_CODE_REC_TOV_TIMER_EXPIRATION /* Timer error codes */, 278 FCOE_ERROR_CODE_RR_TOV_TIMER_EXPIRATION /* Timer error codes */, 279 /* ABTSrsp pckt arrived unexpected */ 280 FCOE_ERROR_CODE_ABTS_REPLY_UNEXPECTED, 281 FCOE_ERROR_CODE_TARGET_MODE_FCP_RSP, 282 FCOE_ERROR_CODE_TARGET_MODE_FCP_XFER, 283 FCOE_ERROR_CODE_TARGET_MODE_DATA_TASK_TYPE_NOT_WRITE, 284 FCOE_ERROR_CODE_DATA_FCTL_TARGET, 285 FCOE_ERROR_CODE_TARGET_DATA_SIZE_NO_MATCH_XFER, 286 FCOE_ERROR_CODE_TARGET_DIF_CRC_CHECKSUM_ERROR, 287 FCOE_ERROR_CODE_TARGET_DIF_REF_TAG_ERROR, 288 FCOE_ERROR_CODE_TARGET_DIF_APP_TAG_ERROR, 289 MAX_FCOE_FP_ERROR_WARNING_CODE 290 }; 291 292 293 /* 294 * FCoE RESPQ element 295 */ 296 struct fcoe_respqe { 297 __le16 ox_id /* OX_ID that is located in the FCP_RSP FC header */; 298 __le16 rx_id /* RX_ID that is located in the FCP_RSP FC header */; 299 __le32 additional_info; 300 /* PARAM that is located in the FCP_RSP FC header */ 301 #define FCOE_RESPQE_PARAM_MASK 0xFFFFFF 302 #define FCOE_RESPQE_PARAM_SHIFT 0 303 /* Indication whther its Target-auto-rsp mode or not */ 304 #define FCOE_RESPQE_TARGET_AUTO_RSP_MASK 0xFF 305 #define FCOE_RESPQE_TARGET_AUTO_RSP_SHIFT 24 306 }; 307 308 309 /* 310 * FCoE slow path error codes 311 */ 312 enum fcoe_sp_error_code { 313 /* Error codes for Error Reporting in slow path flows */ 314 FCOE_ERROR_CODE_SLOW_PATH_TOO_MANY_FUNCS, 315 FCOE_ERROR_SLOW_PATH_CODE_NO_LICENSE, 316 MAX_FCOE_SP_ERROR_CODE 317 }; 318 319 /* 320 * FCoE task TX state 321 */ 322 enum fcoe_task_tx_state { 323 /* Initiate state after driver has initialized the task */ 324 FCOE_TASK_TX_STATE_NORMAL, 325 /* Updated by TX path after complete transmitting unsolicited packet */ 326 FCOE_TASK_TX_STATE_UNSOLICITED_COMPLETED, 327 /* 328 * Updated by TX path after start processing the task requesting the 329 * cleanup/abort operation 330 */ 331 FCOE_TASK_TX_STATE_CLEAN_REQ, 332 FCOE_TASK_TX_STATE_ABTS /* Updated by TX path during abort procedure */, 333 /* Updated by TX path during exchange cleanup procedure */ 334 FCOE_TASK_TX_STATE_EXCLEANUP, 335 /* 336 * Updated by TX path during exchange cleanup continuation task 337 * procedure 338 */ 339 FCOE_TASK_TX_STATE_EXCLEANUP_TARGET_WRITE_CONT, 340 /* Updated by TX path during exchange cleanup first xfer procedure */ 341 FCOE_TASK_TX_STATE_EXCLEANUP_TARGET_WRITE, 342 /* Updated by TX path during exchange cleanup read task in Target */ 343 FCOE_TASK_TX_STATE_EXCLEANUP_TARGET_READ_OR_RSP, 344 /* Updated by TX path during target exchange cleanup procedure */ 345 FCOE_TASK_TX_STATE_EXCLEANUP_TARGET_WRITE_LAST_CYCLE, 346 /* Updated by TX path during sequence recovery procedure */ 347 FCOE_TASK_TX_STATE_SEQRECOVERY, 348 MAX_FCOE_TASK_TX_STATE 349 }; 350 351 #endif /* __QEDF_HSI__ */ 352