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