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 [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 | |