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 */
27struct 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 */
39enum 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 */
49struct 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 */
64struct 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 */
75struct 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 */
94struct 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 */
114struct 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 */
123struct 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 */
138struct 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 */
148struct 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 */
159struct 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 */
171union 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 */
189struct 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 */
211enum 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 */
228enum 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 */
296struct 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 */
312enum 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 */
322enum 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