xref: /OK3568_Linux_fs/kernel/drivers/s390/scsi/zfcp_fsf.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * zfcp device driver
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Interface to the FSF support functions.
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Copyright IBM Corp. 2002, 2020
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #ifndef FSF_H
11*4882a593Smuzhiyun #define FSF_H
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include <linux/pfn.h>
14*4882a593Smuzhiyun #include <linux/scatterlist.h>
15*4882a593Smuzhiyun #include <scsi/libfc.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define FSF_QTCB_CURRENT_VERSION		0x00000001
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun /* FSF commands */
20*4882a593Smuzhiyun #define	FSF_QTCB_FCP_CMND			0x00000001
21*4882a593Smuzhiyun #define	FSF_QTCB_ABORT_FCP_CMND			0x00000002
22*4882a593Smuzhiyun #define	FSF_QTCB_OPEN_PORT_WITH_DID		0x00000005
23*4882a593Smuzhiyun #define	FSF_QTCB_OPEN_LUN			0x00000006
24*4882a593Smuzhiyun #define	FSF_QTCB_CLOSE_LUN			0x00000007
25*4882a593Smuzhiyun #define	FSF_QTCB_CLOSE_PORT			0x00000008
26*4882a593Smuzhiyun #define	FSF_QTCB_CLOSE_PHYSICAL_PORT		0x00000009
27*4882a593Smuzhiyun #define	FSF_QTCB_SEND_ELS			0x0000000B
28*4882a593Smuzhiyun #define	FSF_QTCB_SEND_GENERIC			0x0000000C
29*4882a593Smuzhiyun #define	FSF_QTCB_EXCHANGE_CONFIG_DATA		0x0000000D
30*4882a593Smuzhiyun #define	FSF_QTCB_EXCHANGE_PORT_DATA		0x0000000E
31*4882a593Smuzhiyun #define FSF_QTCB_DOWNLOAD_CONTROL_FILE		0x00000012
32*4882a593Smuzhiyun #define FSF_QTCB_UPLOAD_CONTROL_FILE		0x00000013
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun /* FSF QTCB types */
35*4882a593Smuzhiyun #define FSF_IO_COMMAND				0x00000001
36*4882a593Smuzhiyun #define FSF_SUPPORT_COMMAND			0x00000002
37*4882a593Smuzhiyun #define FSF_CONFIG_COMMAND			0x00000003
38*4882a593Smuzhiyun #define FSF_PORT_COMMAND			0x00000004
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun /* FSF protocol states */
41*4882a593Smuzhiyun #define FSF_PROT_GOOD				0x00000001
42*4882a593Smuzhiyun #define FSF_PROT_QTCB_VERSION_ERROR		0x00000010
43*4882a593Smuzhiyun #define FSF_PROT_SEQ_NUMB_ERROR			0x00000020
44*4882a593Smuzhiyun #define FSF_PROT_UNSUPP_QTCB_TYPE		0x00000040
45*4882a593Smuzhiyun #define FSF_PROT_HOST_CONNECTION_INITIALIZING	0x00000080
46*4882a593Smuzhiyun #define FSF_PROT_FSF_STATUS_PRESENTED		0x00000100
47*4882a593Smuzhiyun #define FSF_PROT_DUPLICATE_REQUEST_ID		0x00000200
48*4882a593Smuzhiyun #define FSF_PROT_LINK_DOWN                      0x00000400
49*4882a593Smuzhiyun #define FSF_PROT_REEST_QUEUE                    0x00000800
50*4882a593Smuzhiyun #define FSF_PROT_ERROR_STATE			0x01000000
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun /* FSF states */
53*4882a593Smuzhiyun #define FSF_GOOD				0x00000000
54*4882a593Smuzhiyun #define FSF_PORT_ALREADY_OPEN			0x00000001
55*4882a593Smuzhiyun #define FSF_LUN_ALREADY_OPEN			0x00000002
56*4882a593Smuzhiyun #define FSF_PORT_HANDLE_NOT_VALID		0x00000003
57*4882a593Smuzhiyun #define FSF_LUN_HANDLE_NOT_VALID		0x00000004
58*4882a593Smuzhiyun #define FSF_HANDLE_MISMATCH			0x00000005
59*4882a593Smuzhiyun #define FSF_SERVICE_CLASS_NOT_SUPPORTED		0x00000006
60*4882a593Smuzhiyun #define FSF_FCPLUN_NOT_VALID			0x00000009
61*4882a593Smuzhiyun #define FSF_LUN_SHARING_VIOLATION               0x00000012
62*4882a593Smuzhiyun #define FSF_FCP_COMMAND_DOES_NOT_EXIST		0x00000022
63*4882a593Smuzhiyun #define FSF_DIRECTION_INDICATOR_NOT_VALID	0x00000030
64*4882a593Smuzhiyun #define FSF_CMND_LENGTH_NOT_VALID		0x00000033
65*4882a593Smuzhiyun #define FSF_MAXIMUM_NUMBER_OF_PORTS_EXCEEDED	0x00000040
66*4882a593Smuzhiyun #define FSF_MAXIMUM_NUMBER_OF_LUNS_EXCEEDED	0x00000041
67*4882a593Smuzhiyun #define FSF_ELS_COMMAND_REJECTED		0x00000050
68*4882a593Smuzhiyun #define FSF_GENERIC_COMMAND_REJECTED		0x00000051
69*4882a593Smuzhiyun #define FSF_PORT_BOXED				0x00000059
70*4882a593Smuzhiyun #define FSF_LUN_BOXED				0x0000005A
71*4882a593Smuzhiyun #define FSF_EXCHANGE_CONFIG_DATA_INCOMPLETE	0x0000005B
72*4882a593Smuzhiyun #define FSF_PAYLOAD_SIZE_MISMATCH		0x00000060
73*4882a593Smuzhiyun #define FSF_REQUEST_SIZE_TOO_LARGE		0x00000061
74*4882a593Smuzhiyun #define FSF_RESPONSE_SIZE_TOO_LARGE		0x00000062
75*4882a593Smuzhiyun #define FSF_SBAL_MISMATCH			0x00000063
76*4882a593Smuzhiyun #define FSF_INCONSISTENT_PROT_DATA		0x00000070
77*4882a593Smuzhiyun #define FSF_INVALID_PROT_PARM			0x00000071
78*4882a593Smuzhiyun #define FSF_BLOCK_GUARD_CHECK_FAILURE		0x00000081
79*4882a593Smuzhiyun #define FSF_APP_TAG_CHECK_FAILURE		0x00000082
80*4882a593Smuzhiyun #define FSF_REF_TAG_CHECK_FAILURE		0x00000083
81*4882a593Smuzhiyun #define FSF_SECURITY_ERROR			0x00000090
82*4882a593Smuzhiyun #define FSF_ADAPTER_STATUS_AVAILABLE		0x000000AD
83*4882a593Smuzhiyun #define FSF_FCP_RSP_AVAILABLE			0x000000AF
84*4882a593Smuzhiyun #define FSF_UNKNOWN_COMMAND			0x000000E2
85*4882a593Smuzhiyun #define FSF_UNKNOWN_OP_SUBTYPE                  0x000000E3
86*4882a593Smuzhiyun #define FSF_INVALID_COMMAND_OPTION              0x000000E5
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun #define FSF_PROT_STATUS_QUAL_SIZE		16
89*4882a593Smuzhiyun #define FSF_STATUS_QUALIFIER_SIZE		16
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun /* FSF status qualifier, recommendations */
92*4882a593Smuzhiyun #define FSF_SQ_NO_RECOM				0x00
93*4882a593Smuzhiyun #define FSF_SQ_FCP_RSP_AVAILABLE		0x01
94*4882a593Smuzhiyun #define FSF_SQ_RETRY_IF_POSSIBLE		0x02
95*4882a593Smuzhiyun #define FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED	0x03
96*4882a593Smuzhiyun #define FSF_SQ_INVOKE_LINK_TEST_PROCEDURE	0x04
97*4882a593Smuzhiyun #define FSF_SQ_COMMAND_ABORTED			0x06
98*4882a593Smuzhiyun #define FSF_SQ_NO_RETRY_POSSIBLE		0x07
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun /* FSF status qualifier (most significant 4 bytes), local link down */
101*4882a593Smuzhiyun #define FSF_PSQ_LINK_NO_LIGHT			0x00000004
102*4882a593Smuzhiyun #define FSF_PSQ_LINK_WRAP_PLUG			0x00000008
103*4882a593Smuzhiyun #define FSF_PSQ_LINK_NO_FCP			0x00000010
104*4882a593Smuzhiyun #define FSF_PSQ_LINK_FIRMWARE_UPDATE		0x00000020
105*4882a593Smuzhiyun #define FSF_PSQ_LINK_INVALID_WWPN		0x00000100
106*4882a593Smuzhiyun #define FSF_PSQ_LINK_NO_NPIV_SUPPORT		0x00000200
107*4882a593Smuzhiyun #define FSF_PSQ_LINK_NO_FCP_RESOURCES		0x00000400
108*4882a593Smuzhiyun #define FSF_PSQ_LINK_NO_FABRIC_RESOURCES	0x00000800
109*4882a593Smuzhiyun #define FSF_PSQ_LINK_FABRIC_LOGIN_UNABLE	0x00001000
110*4882a593Smuzhiyun #define FSF_PSQ_LINK_WWPN_ASSIGNMENT_CORRUPTED	0x00002000
111*4882a593Smuzhiyun #define FSF_PSQ_LINK_MODE_TABLE_CURRUPTED	0x00004000
112*4882a593Smuzhiyun #define FSF_PSQ_LINK_NO_WWPN_ASSIGNMENT		0x00008000
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun /* FSF status qualifier, security error */
115*4882a593Smuzhiyun #define FSF_SQ_SECURITY_REQUIRED		0x00000001
116*4882a593Smuzhiyun #define FSF_SQ_SECURITY_TIMEOUT			0x00000002
117*4882a593Smuzhiyun #define FSF_SQ_SECURITY_KM_UNAVAILABLE		0x00000003
118*4882a593Smuzhiyun #define FSF_SQ_SECURITY_RKM_UNAVAILABLE		0x00000004
119*4882a593Smuzhiyun #define FSF_SQ_SECURITY_AUTH_FAILURE		0x00000005
120*4882a593Smuzhiyun #define FSF_SQ_SECURITY_ENC_FAILURE		0x00000010
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun /* payload size in status read buffer */
123*4882a593Smuzhiyun #define FSF_STATUS_READ_PAYLOAD_SIZE		4032
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun /* number of status read buffers that should be sent by ULP */
126*4882a593Smuzhiyun #define FSF_STATUS_READS_RECOM			16
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun /* status types in status read buffer */
129*4882a593Smuzhiyun #define FSF_STATUS_READ_PORT_CLOSED		0x00000001
130*4882a593Smuzhiyun #define FSF_STATUS_READ_INCOMING_ELS		0x00000002
131*4882a593Smuzhiyun #define FSF_STATUS_READ_SENSE_DATA_AVAIL        0x00000003
132*4882a593Smuzhiyun #define FSF_STATUS_READ_BIT_ERROR_THRESHOLD	0x00000004
133*4882a593Smuzhiyun #define FSF_STATUS_READ_LINK_DOWN		0x00000005
134*4882a593Smuzhiyun #define FSF_STATUS_READ_LINK_UP          	0x00000006
135*4882a593Smuzhiyun #define FSF_STATUS_READ_NOTIFICATION_LOST	0x00000009
136*4882a593Smuzhiyun #define FSF_STATUS_READ_FEATURE_UPDATE_ALERT	0x0000000C
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun /* status subtypes for link down */
139*4882a593Smuzhiyun #define FSF_STATUS_READ_SUB_NO_PHYSICAL_LINK	0x00000000
140*4882a593Smuzhiyun #define FSF_STATUS_READ_SUB_FDISC_FAILED	0x00000001
141*4882a593Smuzhiyun #define FSF_STATUS_READ_SUB_FIRMWARE_UPDATE	0x00000002
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun /* status subtypes for unsolicited status notification lost */
144*4882a593Smuzhiyun #define FSF_STATUS_READ_SUB_INCOMING_ELS	0x00000001
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun /* topologie that is detected by the adapter */
147*4882a593Smuzhiyun #define FSF_TOPO_P2P				0x00000001
148*4882a593Smuzhiyun #define FSF_TOPO_FABRIC				0x00000002
149*4882a593Smuzhiyun #define FSF_TOPO_AL				0x00000003
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun /* data direction for FCP commands */
152*4882a593Smuzhiyun #define FSF_DATADIR_WRITE			0x00000001
153*4882a593Smuzhiyun #define FSF_DATADIR_READ			0x00000002
154*4882a593Smuzhiyun #define FSF_DATADIR_CMND			0x00000004
155*4882a593Smuzhiyun #define FSF_DATADIR_DIF_WRITE_INSERT		0x00000009
156*4882a593Smuzhiyun #define FSF_DATADIR_DIF_READ_STRIP		0x0000000a
157*4882a593Smuzhiyun #define FSF_DATADIR_DIF_WRITE_CONVERT		0x0000000b
158*4882a593Smuzhiyun #define FSF_DATADIR_DIF_READ_CONVERT		0X0000000c
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun /* data protection control flags */
161*4882a593Smuzhiyun #define FSF_APP_TAG_CHECK_ENABLE		0x10
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun /* fc service class */
164*4882a593Smuzhiyun #define FSF_CLASS_3				0x00000003
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun /* logging space behind QTCB */
167*4882a593Smuzhiyun #define FSF_QTCB_LOG_SIZE			1024
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun /* channel features */
170*4882a593Smuzhiyun #define FSF_FEATURE_NOTIFICATION_LOST		0x00000008
171*4882a593Smuzhiyun #define FSF_FEATURE_HBAAPI_MANAGEMENT           0x00000010
172*4882a593Smuzhiyun #define FSF_FEATURE_ELS_CT_CHAINED_SBALS	0x00000020
173*4882a593Smuzhiyun #define FSF_FEATURE_UPDATE_ALERT		0x00000100
174*4882a593Smuzhiyun #define FSF_FEATURE_MEASUREMENT_DATA		0x00000200
175*4882a593Smuzhiyun #define FSF_FEATURE_REQUEST_SFP_DATA		0x00000200
176*4882a593Smuzhiyun #define FSF_FEATURE_REPORT_SFP_DATA		0x00000800
177*4882a593Smuzhiyun #define FSF_FEATURE_FC_SECURITY			0x00001000
178*4882a593Smuzhiyun #define FSF_FEATURE_DIF_PROT_TYPE1		0x00010000
179*4882a593Smuzhiyun #define FSF_FEATURE_DIX_PROT_TCPIP		0x00020000
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun /* host connection features */
182*4882a593Smuzhiyun #define FSF_FEATURE_NPIV_MODE			0x00000001
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun /* option */
185*4882a593Smuzhiyun #define FSF_OPEN_LUN_SUPPRESS_BOXING		0x00000001
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun /* FC security algorithms */
188*4882a593Smuzhiyun #define FSF_FC_SECURITY_AUTH			0x00000001
189*4882a593Smuzhiyun #define FSF_FC_SECURITY_ENC_FCSP2		0x00000002
190*4882a593Smuzhiyun #define FSF_FC_SECURITY_ENC_ERAS		0x00000004
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun struct fsf_queue_designator {
193*4882a593Smuzhiyun 	u8  cssid;
194*4882a593Smuzhiyun 	u8  chpid;
195*4882a593Smuzhiyun 	u8  hla;
196*4882a593Smuzhiyun 	u8  ua;
197*4882a593Smuzhiyun 	u32 res1;
198*4882a593Smuzhiyun } __attribute__ ((packed));
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun struct fsf_bit_error_payload {
201*4882a593Smuzhiyun 	u32 res1;
202*4882a593Smuzhiyun 	u32 link_failure_error_count;
203*4882a593Smuzhiyun 	u32 loss_of_sync_error_count;
204*4882a593Smuzhiyun 	u32 loss_of_signal_error_count;
205*4882a593Smuzhiyun 	u32 primitive_sequence_error_count;
206*4882a593Smuzhiyun 	u32 invalid_transmission_word_error_count;
207*4882a593Smuzhiyun 	u32 crc_error_count;
208*4882a593Smuzhiyun 	u32 primitive_sequence_event_timeout_count;
209*4882a593Smuzhiyun 	u32 elastic_buffer_overrun_error_count;
210*4882a593Smuzhiyun 	u32 fcal_arbitration_timeout_count;
211*4882a593Smuzhiyun 	u32 advertised_receive_b2b_credit;
212*4882a593Smuzhiyun 	u32 current_receive_b2b_credit;
213*4882a593Smuzhiyun 	u32 advertised_transmit_b2b_credit;
214*4882a593Smuzhiyun 	u32 current_transmit_b2b_credit;
215*4882a593Smuzhiyun } __attribute__ ((packed));
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun struct fsf_link_down_info {
218*4882a593Smuzhiyun 	u32 error_code;
219*4882a593Smuzhiyun 	u32 res1;
220*4882a593Smuzhiyun 	u8 res2[2];
221*4882a593Smuzhiyun 	u8 primary_status;
222*4882a593Smuzhiyun 	u8 ioerr_code;
223*4882a593Smuzhiyun 	u8 action_code;
224*4882a593Smuzhiyun 	u8 reason_code;
225*4882a593Smuzhiyun 	u8 explanation_code;
226*4882a593Smuzhiyun 	u8 vendor_specific_code;
227*4882a593Smuzhiyun } __attribute__ ((packed));
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun struct fsf_status_read_buffer {
230*4882a593Smuzhiyun 	u32 status_type;
231*4882a593Smuzhiyun 	u32 status_subtype;
232*4882a593Smuzhiyun 	u32 length;
233*4882a593Smuzhiyun 	u32 res1;
234*4882a593Smuzhiyun 	struct fsf_queue_designator queue_designator;
235*4882a593Smuzhiyun 	u8 res2;
236*4882a593Smuzhiyun 	u8 d_id[3];
237*4882a593Smuzhiyun 	u32 class;
238*4882a593Smuzhiyun 	u64 fcp_lun;
239*4882a593Smuzhiyun 	u8  res3[24];
240*4882a593Smuzhiyun 	union {
241*4882a593Smuzhiyun 		u8  data[FSF_STATUS_READ_PAYLOAD_SIZE];
242*4882a593Smuzhiyun 		u32 word[FSF_STATUS_READ_PAYLOAD_SIZE/sizeof(u32)];
243*4882a593Smuzhiyun 		struct fsf_link_down_info link_down_info;
244*4882a593Smuzhiyun 		struct fsf_bit_error_payload bit_error;
245*4882a593Smuzhiyun 	} payload;
246*4882a593Smuzhiyun } __attribute__ ((packed));
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun struct fsf_qual_version_error {
249*4882a593Smuzhiyun 	u32 fsf_version;
250*4882a593Smuzhiyun 	u32 res1[3];
251*4882a593Smuzhiyun } __attribute__ ((packed));
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun struct fsf_qual_sequence_error {
254*4882a593Smuzhiyun 	u32 exp_req_seq_no;
255*4882a593Smuzhiyun 	u32 res1[3];
256*4882a593Smuzhiyun } __attribute__ ((packed));
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun struct fsf_qual_latency_info {
259*4882a593Smuzhiyun 	u32 channel_lat;
260*4882a593Smuzhiyun 	u32 fabric_lat;
261*4882a593Smuzhiyun 	u8 res1[8];
262*4882a593Smuzhiyun } __attribute__ ((packed));
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun union fsf_prot_status_qual {
265*4882a593Smuzhiyun 	u32 word[FSF_PROT_STATUS_QUAL_SIZE / sizeof(u32)];
266*4882a593Smuzhiyun 	u64 doubleword[FSF_PROT_STATUS_QUAL_SIZE / sizeof(u64)];
267*4882a593Smuzhiyun 	struct fsf_qual_version_error   version_error;
268*4882a593Smuzhiyun 	struct fsf_qual_sequence_error  sequence_error;
269*4882a593Smuzhiyun 	struct fsf_link_down_info link_down_info;
270*4882a593Smuzhiyun 	struct fsf_qual_latency_info latency_info;
271*4882a593Smuzhiyun } __attribute__ ((packed));
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun struct fsf_qtcb_prefix {
274*4882a593Smuzhiyun 	u64 req_id;
275*4882a593Smuzhiyun 	u32 qtcb_version;
276*4882a593Smuzhiyun 	u32 ulp_info;
277*4882a593Smuzhiyun 	u32 qtcb_type;
278*4882a593Smuzhiyun 	u32 req_seq_no;
279*4882a593Smuzhiyun 	u32 prot_status;
280*4882a593Smuzhiyun 	union fsf_prot_status_qual prot_status_qual;
281*4882a593Smuzhiyun 	u8  res1[20];
282*4882a593Smuzhiyun } __attribute__ ((packed));
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun struct fsf_statistics_info {
285*4882a593Smuzhiyun 	u64 input_req;
286*4882a593Smuzhiyun 	u64 output_req;
287*4882a593Smuzhiyun 	u64 control_req;
288*4882a593Smuzhiyun 	u64 input_mb;
289*4882a593Smuzhiyun 	u64 output_mb;
290*4882a593Smuzhiyun 	u64 seconds_act;
291*4882a593Smuzhiyun } __attribute__ ((packed));
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun union fsf_status_qual {
294*4882a593Smuzhiyun 	u8  byte[FSF_STATUS_QUALIFIER_SIZE];
295*4882a593Smuzhiyun 	u16 halfword[FSF_STATUS_QUALIFIER_SIZE / sizeof (u16)];
296*4882a593Smuzhiyun 	u32 word[FSF_STATUS_QUALIFIER_SIZE / sizeof (u32)];
297*4882a593Smuzhiyun 	u64 doubleword[FSF_STATUS_QUALIFIER_SIZE / sizeof(u64)];
298*4882a593Smuzhiyun 	struct fsf_queue_designator fsf_queue_designator;
299*4882a593Smuzhiyun 	struct fsf_link_down_info link_down_info;
300*4882a593Smuzhiyun } __attribute__ ((packed));
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun struct fsf_qtcb_header {
303*4882a593Smuzhiyun 	u64 req_handle;
304*4882a593Smuzhiyun 	u32 fsf_command;
305*4882a593Smuzhiyun 	u32 res1;
306*4882a593Smuzhiyun 	u32 port_handle;
307*4882a593Smuzhiyun 	u32 lun_handle;
308*4882a593Smuzhiyun 	u32 res2;
309*4882a593Smuzhiyun 	u32 fsf_status;
310*4882a593Smuzhiyun 	union fsf_status_qual fsf_status_qual;
311*4882a593Smuzhiyun 	u8  res3[28];
312*4882a593Smuzhiyun 	u16 log_start;
313*4882a593Smuzhiyun 	u16 log_length;
314*4882a593Smuzhiyun 	u8  res4[16];
315*4882a593Smuzhiyun } __attribute__ ((packed));
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun #define FSF_PLOGI_MIN_LEN	112
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun #define FSF_FCP_CMND_SIZE	288
320*4882a593Smuzhiyun #define FSF_FCP_RSP_SIZE	128
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun struct fsf_qtcb_bottom_io {
323*4882a593Smuzhiyun 	u32 data_direction;
324*4882a593Smuzhiyun 	u32 service_class;
325*4882a593Smuzhiyun 	u8  res1;
326*4882a593Smuzhiyun 	u8  data_prot_flags;
327*4882a593Smuzhiyun 	u16 app_tag_value;
328*4882a593Smuzhiyun 	u32 ref_tag_value;
329*4882a593Smuzhiyun 	u32 fcp_cmnd_length;
330*4882a593Smuzhiyun 	u32 data_block_length;
331*4882a593Smuzhiyun 	u32 prot_data_length;
332*4882a593Smuzhiyun 	u8  res2[4];
333*4882a593Smuzhiyun 	union {
334*4882a593Smuzhiyun 		u8		byte[FSF_FCP_CMND_SIZE];
335*4882a593Smuzhiyun 		struct fcp_cmnd iu;
336*4882a593Smuzhiyun 	}   fcp_cmnd;
337*4882a593Smuzhiyun 	union {
338*4882a593Smuzhiyun 		u8			 byte[FSF_FCP_RSP_SIZE];
339*4882a593Smuzhiyun 		struct fcp_resp_with_ext iu;
340*4882a593Smuzhiyun 	}   fcp_rsp;
341*4882a593Smuzhiyun 	u8  res3[64];
342*4882a593Smuzhiyun } __attribute__ ((packed));
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun struct fsf_qtcb_bottom_support {
345*4882a593Smuzhiyun 	u32 operation_subtype;
346*4882a593Smuzhiyun 	u8  res1[13];
347*4882a593Smuzhiyun 	u8 d_id[3];
348*4882a593Smuzhiyun 	u32 option;
349*4882a593Smuzhiyun 	u64 fcp_lun;
350*4882a593Smuzhiyun 	u64 res2;
351*4882a593Smuzhiyun 	u64 req_handle;
352*4882a593Smuzhiyun 	u32 service_class;
353*4882a593Smuzhiyun 	u8  res3[3];
354*4882a593Smuzhiyun 	u8  timeout;
355*4882a593Smuzhiyun         u32 lun_access_info;
356*4882a593Smuzhiyun 	u32 connection_info;
357*4882a593Smuzhiyun 	u8  res4[176];
358*4882a593Smuzhiyun 	u32 els1_length;
359*4882a593Smuzhiyun 	u32 els2_length;
360*4882a593Smuzhiyun 	u32 req_buf_length;
361*4882a593Smuzhiyun 	u32 resp_buf_length;
362*4882a593Smuzhiyun 	u8  els[256];
363*4882a593Smuzhiyun } __attribute__ ((packed));
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun #define ZFCP_FSF_TIMER_INT_MASK	0x3FFF
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun struct fsf_qtcb_bottom_config {
368*4882a593Smuzhiyun 	u32 lic_version;
369*4882a593Smuzhiyun 	u32 feature_selection;
370*4882a593Smuzhiyun 	u32 high_qtcb_version;
371*4882a593Smuzhiyun 	u32 low_qtcb_version;
372*4882a593Smuzhiyun 	u32 max_qtcb_size;
373*4882a593Smuzhiyun 	u32 max_data_transfer_size;
374*4882a593Smuzhiyun 	u32 adapter_features;
375*4882a593Smuzhiyun 	u32 connection_features;
376*4882a593Smuzhiyun 	u32 fc_topology;
377*4882a593Smuzhiyun 	u32 fc_link_speed;	/* one of ZFCP_FSF_PORTSPEED_* */
378*4882a593Smuzhiyun 	u32 adapter_type;
379*4882a593Smuzhiyun 	u8 res0;
380*4882a593Smuzhiyun 	u8 peer_d_id[3];
381*4882a593Smuzhiyun 	u16 status_read_buf_num;
382*4882a593Smuzhiyun 	u16 timer_interval;
383*4882a593Smuzhiyun 	u8 res2[9];
384*4882a593Smuzhiyun 	u8 s_id[3];
385*4882a593Smuzhiyun 	u8 nport_serv_param[128];
386*4882a593Smuzhiyun 	u8 res3[8];
387*4882a593Smuzhiyun 	u32 adapter_ports;
388*4882a593Smuzhiyun 	u32 hardware_version;
389*4882a593Smuzhiyun 	u8 serial_number[32];
390*4882a593Smuzhiyun 	u8 plogi_payload[112];
391*4882a593Smuzhiyun 	struct fsf_statistics_info stat_info;
392*4882a593Smuzhiyun 	u8 res4[112];
393*4882a593Smuzhiyun } __attribute__ ((packed));
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun struct fsf_qtcb_bottom_port {
396*4882a593Smuzhiyun 	u64 wwpn;
397*4882a593Smuzhiyun 	u32 fc_port_id;
398*4882a593Smuzhiyun 	u32 port_type;
399*4882a593Smuzhiyun 	u32 port_state;
400*4882a593Smuzhiyun 	u32 class_of_service;	/* should be 0x00000006 for class 2 and 3 */
401*4882a593Smuzhiyun 	u8 supported_fc4_types[32]; /* should be 0x00000100 for scsi fcp */
402*4882a593Smuzhiyun 	u8 active_fc4_types[32];
403*4882a593Smuzhiyun 	u32 supported_speed;	/* any combination of ZFCP_FSF_PORTSPEED_* */
404*4882a593Smuzhiyun 	u32 maximum_frame_size;	/* fixed value of 2112 */
405*4882a593Smuzhiyun 	u64 seconds_since_last_reset;
406*4882a593Smuzhiyun 	u64 tx_frames;
407*4882a593Smuzhiyun 	u64 tx_words;
408*4882a593Smuzhiyun 	u64 rx_frames;
409*4882a593Smuzhiyun 	u64 rx_words;
410*4882a593Smuzhiyun 	u64 lip;		/* 0 */
411*4882a593Smuzhiyun 	u64 nos;		/* currently 0 */
412*4882a593Smuzhiyun 	u64 error_frames;	/* currently 0 */
413*4882a593Smuzhiyun 	u64 dumped_frames;	/* currently 0 */
414*4882a593Smuzhiyun 	u64 link_failure;
415*4882a593Smuzhiyun 	u64 loss_of_sync;
416*4882a593Smuzhiyun 	u64 loss_of_signal;
417*4882a593Smuzhiyun 	u64 psp_error_counts;
418*4882a593Smuzhiyun 	u64 invalid_tx_words;
419*4882a593Smuzhiyun 	u64 invalid_crcs;
420*4882a593Smuzhiyun 	u64 input_requests;
421*4882a593Smuzhiyun 	u64 output_requests;
422*4882a593Smuzhiyun 	u64 control_requests;
423*4882a593Smuzhiyun 	u64 input_mb;		/* where 1 MByte == 1.000.000 Bytes */
424*4882a593Smuzhiyun 	u64 output_mb;		/* where 1 MByte == 1.000.000 Bytes */
425*4882a593Smuzhiyun 	u8 cp_util;
426*4882a593Smuzhiyun 	u8 cb_util;
427*4882a593Smuzhiyun 	u8 a_util;
428*4882a593Smuzhiyun 	u8 res2;
429*4882a593Smuzhiyun 	s16 temperature;
430*4882a593Smuzhiyun 	u16 vcc;
431*4882a593Smuzhiyun 	u16 tx_bias;
432*4882a593Smuzhiyun 	u16 tx_power;
433*4882a593Smuzhiyun 	u16 rx_power;
434*4882a593Smuzhiyun 	union {
435*4882a593Smuzhiyun 		u16 raw;
436*4882a593Smuzhiyun 		struct {
437*4882a593Smuzhiyun 			u16 fec_active		:1;
438*4882a593Smuzhiyun 			u16:7;
439*4882a593Smuzhiyun 			u16 connector_type	:2;
440*4882a593Smuzhiyun 			u16 sfp_invalid		:1;
441*4882a593Smuzhiyun 			u16 optical_port	:1;
442*4882a593Smuzhiyun 			u16 port_tx_type	:4;
443*4882a593Smuzhiyun 		};
444*4882a593Smuzhiyun 	} sfp_flags;
445*4882a593Smuzhiyun 	u32 fc_security_algorithms;
446*4882a593Smuzhiyun 	u8 res3[236];
447*4882a593Smuzhiyun } __attribute__ ((packed));
448*4882a593Smuzhiyun 
449*4882a593Smuzhiyun union fsf_qtcb_bottom {
450*4882a593Smuzhiyun 	struct fsf_qtcb_bottom_io      io;
451*4882a593Smuzhiyun 	struct fsf_qtcb_bottom_support support;
452*4882a593Smuzhiyun 	struct fsf_qtcb_bottom_config  config;
453*4882a593Smuzhiyun 	struct fsf_qtcb_bottom_port port;
454*4882a593Smuzhiyun };
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun struct fsf_qtcb {
457*4882a593Smuzhiyun 	struct fsf_qtcb_prefix prefix;
458*4882a593Smuzhiyun 	struct fsf_qtcb_header header;
459*4882a593Smuzhiyun 	union  fsf_qtcb_bottom bottom;
460*4882a593Smuzhiyun 	u8 log[FSF_QTCB_LOG_SIZE];
461*4882a593Smuzhiyun } __attribute__ ((packed));
462*4882a593Smuzhiyun 
463*4882a593Smuzhiyun struct zfcp_blk_drv_data {
464*4882a593Smuzhiyun #define ZFCP_BLK_DRV_DATA_MAGIC			0x1
465*4882a593Smuzhiyun 	u32 magic;
466*4882a593Smuzhiyun #define ZFCP_BLK_LAT_VALID			0x1
467*4882a593Smuzhiyun #define ZFCP_BLK_REQ_ERROR			0x2
468*4882a593Smuzhiyun 	u16 flags;
469*4882a593Smuzhiyun 	u8 inb_usage;
470*4882a593Smuzhiyun 	u8 outb_usage;
471*4882a593Smuzhiyun 	u64 channel_lat;
472*4882a593Smuzhiyun 	u64 fabric_lat;
473*4882a593Smuzhiyun } __attribute__ ((packed));
474*4882a593Smuzhiyun 
475*4882a593Smuzhiyun /**
476*4882a593Smuzhiyun  * struct zfcp_fsf_ct_els - zfcp data for ct or els request
477*4882a593Smuzhiyun  * @req: scatter-gather list for request, points to &zfcp_fc_req.sg_req or BSG
478*4882a593Smuzhiyun  * @resp: scatter-gather list for response, points to &zfcp_fc_req.sg_rsp or BSG
479*4882a593Smuzhiyun  * @handler: handler function (called for response to the request)
480*4882a593Smuzhiyun  * @handler_data: data passed to handler function
481*4882a593Smuzhiyun  * @port: Optional pointer to port for zfcp internal ELS (only test link ADISC)
482*4882a593Smuzhiyun  * @status: used to pass error status to calling function
483*4882a593Smuzhiyun  * @d_id: Destination ID of either open WKA port for CT or of D_ID for ELS
484*4882a593Smuzhiyun  */
485*4882a593Smuzhiyun struct zfcp_fsf_ct_els {
486*4882a593Smuzhiyun 	struct scatterlist *req;
487*4882a593Smuzhiyun 	struct scatterlist *resp;
488*4882a593Smuzhiyun 	void (*handler)(void *);
489*4882a593Smuzhiyun 	void *handler_data;
490*4882a593Smuzhiyun 	struct zfcp_port *port;
491*4882a593Smuzhiyun 	int status;
492*4882a593Smuzhiyun 	u32 d_id;
493*4882a593Smuzhiyun };
494*4882a593Smuzhiyun 
495*4882a593Smuzhiyun #endif				/* FSF_H */
496