xref: /openbmc/linux/drivers/scsi/qedf/qedf_hsi.h (revision 812f77b749a8ae11f58dacf0d3ed65e7ede47458)
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