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