xref: /openbmc/linux/drivers/s390/scsi/zfcp_def.h (revision b8bb76713ec50df2f11efee386e16f93d51e1076)
1 /*
2  * zfcp device driver
3  *
4  * Global definitions for the zfcp device driver.
5  *
6  * Copyright IBM Corporation 2002, 2009
7  */
8 
9 #ifndef ZFCP_DEF_H
10 #define ZFCP_DEF_H
11 
12 /*************************** INCLUDES *****************************************/
13 
14 #include <linux/init.h>
15 #include <linux/moduleparam.h>
16 #include <linux/major.h>
17 #include <linux/blkdev.h>
18 #include <linux/delay.h>
19 #include <linux/timer.h>
20 #include <linux/slab.h>
21 #include <linux/mempool.h>
22 #include <linux/syscalls.h>
23 #include <linux/scatterlist.h>
24 #include <linux/ioctl.h>
25 #include <scsi/scsi.h>
26 #include <scsi/scsi_tcq.h>
27 #include <scsi/scsi_cmnd.h>
28 #include <scsi/scsi_device.h>
29 #include <scsi/scsi_host.h>
30 #include <scsi/scsi_transport.h>
31 #include <scsi/scsi_transport_fc.h>
32 #include <asm/ccwdev.h>
33 #include <asm/qdio.h>
34 #include <asm/debug.h>
35 #include <asm/ebcdic.h>
36 #include <asm/sysinfo.h>
37 #include "zfcp_dbf.h"
38 #include "zfcp_fsf.h"
39 
40 
41 /********************* GENERAL DEFINES *********************************/
42 
43 #define REQUEST_LIST_SIZE 128
44 
45 /********************* SCSI SPECIFIC DEFINES *********************************/
46 #define ZFCP_SCSI_ER_TIMEOUT                    (10*HZ)
47 
48 /********************* CIO/QDIO SPECIFIC DEFINES *****************************/
49 
50 /* Adapter Identification Parameters */
51 #define ZFCP_CONTROL_UNIT_TYPE  0x1731
52 #define ZFCP_CONTROL_UNIT_MODEL 0x03
53 #define ZFCP_DEVICE_TYPE        0x1732
54 #define ZFCP_DEVICE_MODEL       0x03
55 #define ZFCP_DEVICE_MODEL_PRIV	0x04
56 
57 /* DMQ bug workaround: don't use last SBALE */
58 #define ZFCP_MAX_SBALES_PER_SBAL	(QDIO_MAX_ELEMENTS_PER_BUFFER - 1)
59 
60 /* index of last SBALE (with respect to DMQ bug workaround) */
61 #define ZFCP_LAST_SBALE_PER_SBAL	(ZFCP_MAX_SBALES_PER_SBAL - 1)
62 
63 /* max. number of (data buffer) SBALEs in largest SBAL chain */
64 #define ZFCP_MAX_SBALES_PER_REQ		\
65 	(FSF_MAX_SBALS_PER_REQ * ZFCP_MAX_SBALES_PER_SBAL - 2)
66         /* request ID + QTCB in SBALE 0 + 1 of first SBAL in chain */
67 
68 #define ZFCP_MAX_SECTORS (ZFCP_MAX_SBALES_PER_REQ * 8)
69         /* max. number of (data buffer) SBALEs in largest SBAL chain
70            multiplied with number of sectors per 4k block */
71 
72 /********************* FSF SPECIFIC DEFINES *********************************/
73 
74 /* ATTENTION: value must not be used by hardware */
75 #define FSF_QTCB_UNSOLICITED_STATUS		0x6305
76 
77 /* timeout value for "default timer" for fsf requests */
78 #define ZFCP_FSF_REQUEST_TIMEOUT (60*HZ)
79 
80 /*************** FIBRE CHANNEL PROTOCOL SPECIFIC DEFINES ********************/
81 
82 /* timeout for name-server lookup (in seconds) */
83 #define ZFCP_NS_GID_PN_TIMEOUT		10
84 
85 /* task attribute values in FCP-2 FCP_CMND IU */
86 #define SIMPLE_Q	0
87 #define HEAD_OF_Q	1
88 #define ORDERED_Q	2
89 #define ACA_Q		4
90 #define UNTAGGED	5
91 
92 /* task management flags in FCP-2 FCP_CMND IU */
93 #define FCP_CLEAR_ACA		0x40
94 #define FCP_TARGET_RESET	0x20
95 #define FCP_LOGICAL_UNIT_RESET	0x10
96 #define FCP_CLEAR_TASK_SET	0x04
97 #define FCP_ABORT_TASK_SET	0x02
98 
99 #define FCP_CDB_LENGTH		16
100 
101 #define ZFCP_DID_MASK           0x00FFFFFF
102 
103 /* FCP(-2) FCP_CMND IU */
104 struct fcp_cmnd_iu {
105 	u64 fcp_lun;	   /* FCP logical unit number */
106 	u8  crn;	           /* command reference number */
107 	u8  reserved0:5;	   /* reserved */
108 	u8  task_attribute:3;	   /* task attribute */
109 	u8  task_management_flags; /* task management flags */
110 	u8  add_fcp_cdb_length:6;  /* additional FCP_CDB length */
111 	u8  rddata:1;              /* read data */
112 	u8  wddata:1;              /* write data */
113 	u8  fcp_cdb[FCP_CDB_LENGTH];
114 } __attribute__((packed));
115 
116 /* FCP(-2) FCP_RSP IU */
117 struct fcp_rsp_iu {
118 	u8  reserved0[10];
119 	union {
120 		struct {
121 			u8 reserved1:3;
122 			u8 fcp_conf_req:1;
123 			u8 fcp_resid_under:1;
124 			u8 fcp_resid_over:1;
125 			u8 fcp_sns_len_valid:1;
126 			u8 fcp_rsp_len_valid:1;
127 		} bits;
128 		u8 value;
129 	} validity;
130 	u8  scsi_status;
131 	u32 fcp_resid;
132 	u32 fcp_sns_len;
133 	u32 fcp_rsp_len;
134 } __attribute__((packed));
135 
136 
137 #define RSP_CODE_GOOD		 0
138 #define RSP_CODE_LENGTH_MISMATCH 1
139 #define RSP_CODE_FIELD_INVALID	 2
140 #define RSP_CODE_RO_MISMATCH	 3
141 #define RSP_CODE_TASKMAN_UNSUPP	 4
142 #define RSP_CODE_TASKMAN_FAILED	 5
143 
144 /* see fc-fs */
145 #define LS_RSCN  0x61
146 #define LS_LOGO  0x05
147 #define LS_PLOGI 0x03
148 
149 struct fcp_rscn_head {
150         u8  command;
151         u8  page_length; /* always 0x04 */
152         u16 payload_len;
153 } __attribute__((packed));
154 
155 struct fcp_rscn_element {
156         u8  reserved:2;
157         u8  event_qual:4;
158         u8  addr_format:2;
159         u32 nport_did:24;
160 } __attribute__((packed));
161 
162 /* see fc-ph */
163 struct fcp_logo {
164         u32 command;
165         u32 nport_did;
166 	u64 nport_wwpn;
167 } __attribute__((packed));
168 
169 /*
170  * FC-FS stuff
171  */
172 #define R_A_TOV				10 /* seconds */
173 
174 #define ZFCP_LS_RLS			0x0f
175 #define ZFCP_LS_ADISC			0x52
176 #define ZFCP_LS_RPS			0x56
177 #define ZFCP_LS_RSCN			0x61
178 #define ZFCP_LS_RNID			0x78
179 
180 struct zfcp_ls_adisc {
181 	u8		code;
182 	u8		field[3];
183 	u32		hard_nport_id;
184 	u64		wwpn;
185 	u64		wwnn;
186 	u32		nport_id;
187 } __attribute__ ((packed));
188 
189 /*
190  * FC-GS-2 stuff
191  */
192 #define ZFCP_CT_REVISION		0x01
193 #define ZFCP_CT_DIRECTORY_SERVICE	0xFC
194 #define ZFCP_CT_NAME_SERVER		0x02
195 #define ZFCP_CT_SYNCHRONOUS		0x00
196 #define ZFCP_CT_SCSI_FCP		0x08
197 #define ZFCP_CT_UNABLE_TO_PERFORM_CMD	0x09
198 #define ZFCP_CT_GID_PN			0x0121
199 #define ZFCP_CT_GPN_FT			0x0172
200 #define ZFCP_CT_ACCEPT			0x8002
201 #define ZFCP_CT_REJECT			0x8001
202 
203 /*
204  * FC-GS-4 stuff
205  */
206 #define ZFCP_CT_TIMEOUT			(3 * R_A_TOV)
207 
208 /*************** ADAPTER/PORT/UNIT AND FSF_REQ STATUS FLAGS ******************/
209 
210 /*
211  * Note, the leftmost status byte is common among adapter, port
212  * and unit
213  */
214 #define ZFCP_COMMON_FLAGS			0xfff00000
215 
216 /* common status bits */
217 #define ZFCP_STATUS_COMMON_REMOVE		0x80000000
218 #define ZFCP_STATUS_COMMON_RUNNING		0x40000000
219 #define ZFCP_STATUS_COMMON_ERP_FAILED		0x20000000
220 #define ZFCP_STATUS_COMMON_UNBLOCKED		0x10000000
221 #define ZFCP_STATUS_COMMON_OPEN                 0x04000000
222 #define ZFCP_STATUS_COMMON_ERP_INUSE		0x01000000
223 #define ZFCP_STATUS_COMMON_ACCESS_DENIED	0x00800000
224 #define ZFCP_STATUS_COMMON_ACCESS_BOXED		0x00400000
225 #define ZFCP_STATUS_COMMON_NOESC		0x00200000
226 
227 /* adapter status */
228 #define ZFCP_STATUS_ADAPTER_QDIOUP		0x00000002
229 #define ZFCP_STATUS_ADAPTER_XCONFIG_OK		0x00000008
230 #define ZFCP_STATUS_ADAPTER_HOST_CON_INIT	0x00000010
231 #define ZFCP_STATUS_ADAPTER_ERP_THREAD_UP	0x00000020
232 #define ZFCP_STATUS_ADAPTER_ERP_THREAD_KILL	0x00000080
233 #define ZFCP_STATUS_ADAPTER_ERP_PENDING		0x00000100
234 #define ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED	0x00000200
235 
236 /* FC-PH/FC-GS well-known address identifiers for generic services */
237 #define ZFCP_DID_WKA				0xFFFFF0
238 #define ZFCP_DID_MANAGEMENT_SERVICE		0xFFFFFA
239 #define ZFCP_DID_TIME_SERVICE			0xFFFFFB
240 #define ZFCP_DID_DIRECTORY_SERVICE		0xFFFFFC
241 #define ZFCP_DID_ALIAS_SERVICE			0xFFFFF8
242 #define ZFCP_DID_KEY_DISTRIBUTION_SERVICE	0xFFFFF7
243 
244 /* remote port status */
245 #define ZFCP_STATUS_PORT_PHYS_OPEN		0x00000001
246 
247 /* well known address (WKA) port status*/
248 enum zfcp_wka_status {
249 	ZFCP_WKA_PORT_OFFLINE,
250 	ZFCP_WKA_PORT_CLOSING,
251 	ZFCP_WKA_PORT_OPENING,
252 	ZFCP_WKA_PORT_ONLINE,
253 };
254 
255 /* logical unit status */
256 #define ZFCP_STATUS_UNIT_SHARED			0x00000004
257 #define ZFCP_STATUS_UNIT_READONLY		0x00000008
258 #define ZFCP_STATUS_UNIT_SCSI_WORK_PENDING	0x00000020
259 
260 /* FSF request status (this does not have a common part) */
261 #define ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT	0x00000002
262 #define ZFCP_STATUS_FSFREQ_COMPLETED		0x00000004
263 #define ZFCP_STATUS_FSFREQ_ERROR		0x00000008
264 #define ZFCP_STATUS_FSFREQ_CLEANUP		0x00000010
265 #define ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED	0x00000040
266 #define ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED       0x00000080
267 #define ZFCP_STATUS_FSFREQ_ABORTED              0x00000100
268 #define ZFCP_STATUS_FSFREQ_TMFUNCFAILED         0x00000200
269 #define ZFCP_STATUS_FSFREQ_TMFUNCNOTSUPP        0x00000400
270 #define ZFCP_STATUS_FSFREQ_RETRY                0x00000800
271 #define ZFCP_STATUS_FSFREQ_DISMISSED            0x00001000
272 
273 /************************* STRUCTURE DEFINITIONS *****************************/
274 
275 struct zfcp_fsf_req;
276 
277 /* holds various memory pools of an adapter */
278 struct zfcp_adapter_mempool {
279 	mempool_t *fsf_req_erp;
280 	mempool_t *fsf_req_scsi;
281 	mempool_t *fsf_req_abort;
282 	mempool_t *fsf_req_status_read;
283 	mempool_t *data_status_read;
284 	mempool_t *data_gid_pn;
285 };
286 
287 /*
288  * header for CT_IU
289  */
290 struct ct_hdr {
291 	u8 revision;		// 0x01
292 	u8 in_id[3];		// 0x00
293 	u8 gs_type;		// 0xFC	Directory Service
294 	u8 gs_subtype;		// 0x02	Name Server
295 	u8 options;		// 0x00 single bidirectional exchange
296 	u8 reserved0;
297 	u16 cmd_rsp_code;	// 0x0121 GID_PN, or 0x0100 GA_NXT
298 	u16 max_res_size;	// <= (4096 - 16) / 4
299 	u8 reserved1;
300 	u8 reason_code;
301 	u8 reason_code_expl;
302 	u8 vendor_unique;
303 } __attribute__ ((packed));
304 
305 /* nameserver request CT_IU -- for requests where
306  * a port name is required */
307 struct ct_iu_gid_pn_req {
308 	struct ct_hdr header;
309 	u64 wwpn;
310 } __attribute__ ((packed));
311 
312 /* FS_ACC IU and data unit for GID_PN nameserver request */
313 struct ct_iu_gid_pn_resp {
314 	struct ct_hdr header;
315 	u32 d_id;
316 } __attribute__ ((packed));
317 
318 /**
319  * struct zfcp_send_ct - used to pass parameters to function zfcp_fsf_send_ct
320  * @wka_port: port where the request is sent to
321  * @req: scatter-gather list for request
322  * @resp: scatter-gather list for response
323  * @handler: handler function (called for response to the request)
324  * @handler_data: data passed to handler function
325  * @timeout: FSF timeout for this request
326  * @completion: completion for synchronization purposes
327  * @status: used to pass error status to calling function
328  */
329 struct zfcp_send_ct {
330 	struct zfcp_wka_port *wka_port;
331 	struct scatterlist *req;
332 	struct scatterlist *resp;
333 	void (*handler)(unsigned long);
334 	unsigned long handler_data;
335 	int timeout;
336 	struct completion *completion;
337 	int status;
338 };
339 
340 /* used for name server requests in error recovery */
341 struct zfcp_gid_pn_data {
342 	struct zfcp_send_ct ct;
343 	struct scatterlist req;
344 	struct scatterlist resp;
345 	struct ct_iu_gid_pn_req ct_iu_req;
346 	struct ct_iu_gid_pn_resp ct_iu_resp;
347         struct zfcp_port *port;
348 };
349 
350 /**
351  * struct zfcp_send_els - used to pass parameters to function zfcp_fsf_send_els
352  * @adapter: adapter where request is sent from
353  * @port: port where ELS is destinated (port reference count has to be increased)
354  * @d_id: destiniation id of port where request is sent to
355  * @req: scatter-gather list for request
356  * @resp: scatter-gather list for response
357  * @handler: handler function (called for response to the request)
358  * @handler_data: data passed to handler function
359  * @completion: completion for synchronization purposes
360  * @ls_code: hex code of ELS command
361  * @status: used to pass error status to calling function
362  */
363 struct zfcp_send_els {
364 	struct zfcp_adapter *adapter;
365 	struct zfcp_port *port;
366 	u32 d_id;
367 	struct scatterlist *req;
368 	struct scatterlist *resp;
369 	void (*handler)(unsigned long);
370 	unsigned long handler_data;
371 	struct completion *completion;
372 	int ls_code;
373 	int status;
374 };
375 
376 struct zfcp_wka_port {
377 	struct zfcp_adapter	*adapter;
378 	wait_queue_head_t	completion_wq;
379 	enum zfcp_wka_status	status;
380 	atomic_t		refcount;
381 	u32			d_id;
382 	u32			handle;
383 	struct mutex		mutex;
384 	struct delayed_work	work;
385 };
386 
387 struct zfcp_qdio_queue {
388 	struct qdio_buffer *sbal[QDIO_MAX_BUFFERS_PER_Q];
389 	u8		   first;	/* index of next free bfr in queue */
390 	atomic_t           count;	/* number of free buffers in queue */
391 };
392 
393 struct zfcp_erp_action {
394 	struct list_head list;
395 	int action;	              /* requested action code */
396 	struct zfcp_adapter *adapter; /* device which should be recovered */
397 	struct zfcp_port *port;
398 	struct zfcp_unit *unit;
399 	u32		status;	      /* recovery status */
400 	u32 step;	              /* active step of this erp action */
401 	struct zfcp_fsf_req *fsf_req; /* fsf request currently pending
402 					 for this action */
403 	struct timer_list timer;
404 };
405 
406 struct fsf_latency_record {
407 	u32 min;
408 	u32 max;
409 	u64 sum;
410 };
411 
412 struct latency_cont {
413 	struct fsf_latency_record channel;
414 	struct fsf_latency_record fabric;
415 	u64 counter;
416 };
417 
418 struct zfcp_latencies {
419 	struct latency_cont read;
420 	struct latency_cont write;
421 	struct latency_cont cmd;
422 	spinlock_t lock;
423 };
424 
425 struct zfcp_adapter {
426 	atomic_t                refcount;          /* reference count */
427 	wait_queue_head_t	remove_wq;         /* can be used to wait for
428 						      refcount drop to zero */
429 	u64			peer_wwnn;	   /* P2P peer WWNN */
430 	u64			peer_wwpn;	   /* P2P peer WWPN */
431 	u32			peer_d_id;	   /* P2P peer D_ID */
432 	struct ccw_device       *ccw_device;	   /* S/390 ccw device */
433 	u32			hydra_version;	   /* Hydra version */
434 	u32			fsf_lic_version;
435 	u32			adapter_features;  /* FCP channel features */
436 	u32			connection_features; /* host connection features */
437         u32			hardware_version;  /* of FCP channel */
438 	u16			timer_ticks;       /* time int for a tick */
439 	struct Scsi_Host	*scsi_host;	   /* Pointer to mid-layer */
440 	struct list_head	port_list_head;	   /* remote port list */
441 	unsigned long		req_no;		   /* unique FSF req number */
442 	struct list_head	*req_list;	   /* list of pending reqs */
443 	spinlock_t		req_list_lock;	   /* request list lock */
444 	struct zfcp_qdio_queue	req_q;		   /* request queue */
445 	spinlock_t		req_q_lock;	   /* for operations on queue */
446 	ktime_t			req_q_time; /* time of last fill level change */
447 	u64			req_q_util; /* for accounting */
448 	spinlock_t		qdio_stat_lock;
449 	u32			fsf_req_seq_no;	   /* FSF cmnd seq number */
450 	wait_queue_head_t	request_wq;	   /* can be used to wait for
451 						      more avaliable SBALs */
452 	struct zfcp_qdio_queue	resp_q;	   /* response queue */
453 	rwlock_t		abort_lock;        /* Protects against SCSI
454 						      stack abort/command
455 						      completion races */
456 	atomic_t		stat_miss;	   /* # missing status reads*/
457 	struct work_struct	stat_work;
458 	atomic_t		status;	           /* status of this adapter */
459 	struct list_head	erp_ready_head;	   /* error recovery for this
460 						      adapter/devices */
461 	struct list_head	erp_running_head;
462 	rwlock_t		erp_lock;
463 	struct semaphore	erp_ready_sem;
464 	wait_queue_head_t	erp_thread_wqh;
465 	wait_queue_head_t	erp_done_wqh;
466 	struct zfcp_erp_action	erp_action;	   /* pending error recovery */
467         atomic_t                erp_counter;
468 	u32			erp_total_count;   /* total nr of enqueued erp
469 						      actions */
470 	u32			erp_low_mem_count; /* nr of erp actions waiting
471 						      for memory */
472 	struct zfcp_wka_port	nsp;		   /* adapter's nameserver */
473 	debug_info_t		*rec_dbf;
474 	debug_info_t		*hba_dbf;
475 	debug_info_t		*san_dbf;          /* debug feature areas */
476 	debug_info_t		*scsi_dbf;
477 	spinlock_t		rec_dbf_lock;
478 	spinlock_t		hba_dbf_lock;
479 	spinlock_t		san_dbf_lock;
480 	spinlock_t		scsi_dbf_lock;
481 	struct zfcp_rec_dbf_record	rec_dbf_buf;
482 	struct zfcp_hba_dbf_record	hba_dbf_buf;
483 	struct zfcp_san_dbf_record	san_dbf_buf;
484 	struct zfcp_scsi_dbf_record	scsi_dbf_buf;
485 	struct zfcp_adapter_mempool	pool;      /* Adapter memory pools */
486 	struct qdio_initialize  qdio_init_data;    /* for qdio_establish */
487 	struct fc_host_statistics *fc_stats;
488 	struct fsf_qtcb_bottom_port *stats_reset_data;
489 	unsigned long		stats_reset;
490 	struct work_struct	scan_work;
491 	struct service_level	service_level;
492 	atomic_t		qdio_outb_full;	   /* queue full incidents */
493 };
494 
495 struct zfcp_port {
496 	struct device          sysfs_device;   /* sysfs device */
497 	struct fc_rport        *rport;         /* rport of fc transport class */
498 	struct list_head       list;	       /* list of remote ports */
499 	atomic_t               refcount;       /* reference count */
500 	wait_queue_head_t      remove_wq;      /* can be used to wait for
501 						  refcount drop to zero */
502 	struct zfcp_adapter    *adapter;       /* adapter used to access port */
503 	struct list_head       unit_list_head; /* head of logical unit list */
504 	atomic_t	       status;	       /* status of this remote port */
505 	u64		       wwnn;	       /* WWNN if known */
506 	u64		       wwpn;	       /* WWPN */
507 	u32		       d_id;	       /* D_ID */
508 	u32		       handle;	       /* handle assigned by FSF */
509 	struct zfcp_erp_action erp_action;     /* pending error recovery */
510         atomic_t               erp_counter;
511 	u32                    maxframe_size;
512 	u32                    supported_classes;
513 	struct work_struct     gid_pn_work;
514 	struct work_struct     test_link_work;
515 	struct work_struct     rport_work;
516 	enum { RPORT_NONE, RPORT_ADD, RPORT_DEL }  rport_task;
517 };
518 
519 struct zfcp_unit {
520 	struct device          sysfs_device;   /* sysfs device */
521 	struct list_head       list;	       /* list of logical units */
522 	atomic_t               refcount;       /* reference count */
523 	wait_queue_head_t      remove_wq;      /* can be used to wait for
524 						  refcount drop to zero */
525 	struct zfcp_port       *port;	       /* remote port of unit */
526 	atomic_t	       status;	       /* status of this logical unit */
527 	u64		       fcp_lun;	       /* own FCP_LUN */
528 	u32		       handle;	       /* handle assigned by FSF */
529         struct scsi_device     *device;        /* scsi device struct pointer */
530 	struct zfcp_erp_action erp_action;     /* pending error recovery */
531         atomic_t               erp_counter;
532 	struct zfcp_latencies	latencies;
533 };
534 
535 /* FSF request */
536 struct zfcp_fsf_req {
537 	struct list_head       list;	       /* list of FSF requests */
538 	unsigned long	       req_id;	       /* unique request ID */
539 	struct zfcp_adapter    *adapter;       /* adapter request belongs to */
540 	u8		       sbal_number;    /* nr of SBALs free for use */
541 	u8		       sbal_first;     /* first SBAL for this request */
542 	u8		       sbal_last;      /* last SBAL for this request */
543 	u8		       sbal_limit;      /* last possible SBAL for
544 						  this reuest */
545 	u8		       sbale_curr;     /* current SBALE during creation
546 						  of request */
547 	u8			sbal_response;	/* SBAL used in interrupt */
548 	wait_queue_head_t      completion_wq;  /* can be used by a routine
549 						  to wait for completion */
550 	u32			status;	       /* status of this request */
551 	u32		       fsf_command;    /* FSF Command copy */
552 	struct fsf_qtcb	       *qtcb;	       /* address of associated QTCB */
553 	u32		       seq_no;         /* Sequence number of request */
554 	void			*data;           /* private data of request */
555 	struct timer_list     timer;	       /* used for erp or scsi er */
556 	struct zfcp_erp_action *erp_action;    /* used if this request is
557 						  issued on behalf of erp */
558 	mempool_t	       *pool;	       /* used if request was alloacted
559 						  from emergency pool */
560 	unsigned long long     issued;         /* request sent time (STCK) */
561 	struct zfcp_unit       *unit;
562 	void			(*handler)(struct zfcp_fsf_req *);
563 	u16			qdio_outb_usage;/* usage of outbound queue */
564 	u16			qdio_inb_usage;	/* usage of inbound queue */
565 };
566 
567 /* driver data */
568 struct zfcp_data {
569 	struct scsi_host_template scsi_host_template;
570 	struct scsi_transport_template *scsi_transport_template;
571 	rwlock_t                config_lock;        /* serialises changes
572 						       to adapter/port/unit
573 						       lists */
574 	struct semaphore        config_sema;        /* serialises configuration
575 						       changes */
576 	struct kmem_cache	*fsf_req_qtcb_cache;
577 	struct kmem_cache	*sr_buffer_cache;
578 	struct kmem_cache	*gid_pn_cache;
579 	struct workqueue_struct	*work_queue;
580 };
581 
582 /* struct used by memory pools for fsf_requests */
583 struct zfcp_fsf_req_qtcb {
584 	struct zfcp_fsf_req fsf_req;
585 	struct fsf_qtcb qtcb;
586 };
587 
588 /********************** ZFCP SPECIFIC DEFINES ********************************/
589 
590 #define ZFCP_SET                0x00000100
591 #define ZFCP_CLEAR              0x00000200
592 
593 /*
594  * Helper functions for request ID management.
595  */
596 static inline int zfcp_reqlist_hash(unsigned long req_id)
597 {
598 	return req_id % REQUEST_LIST_SIZE;
599 }
600 
601 static inline void zfcp_reqlist_remove(struct zfcp_adapter *adapter,
602 				       struct zfcp_fsf_req *fsf_req)
603 {
604 	list_del(&fsf_req->list);
605 }
606 
607 static inline struct zfcp_fsf_req *
608 zfcp_reqlist_find(struct zfcp_adapter *adapter, unsigned long req_id)
609 {
610 	struct zfcp_fsf_req *request;
611 	unsigned int idx;
612 
613 	idx = zfcp_reqlist_hash(req_id);
614 	list_for_each_entry(request, &adapter->req_list[idx], list)
615 		if (request->req_id == req_id)
616 			return request;
617 	return NULL;
618 }
619 
620 static inline struct zfcp_fsf_req *
621 zfcp_reqlist_find_safe(struct zfcp_adapter *adapter, struct zfcp_fsf_req *req)
622 {
623 	struct zfcp_fsf_req *request;
624 	unsigned int idx;
625 
626 	for (idx = 0; idx < REQUEST_LIST_SIZE; idx++) {
627 		list_for_each_entry(request, &adapter->req_list[idx], list)
628 			if (request == req)
629 				return request;
630 	}
631 	return NULL;
632 }
633 
634 /*
635  *  functions needed for reference/usage counting
636  */
637 
638 static inline void
639 zfcp_unit_get(struct zfcp_unit *unit)
640 {
641 	atomic_inc(&unit->refcount);
642 }
643 
644 static inline void
645 zfcp_unit_put(struct zfcp_unit *unit)
646 {
647 	if (atomic_dec_return(&unit->refcount) == 0)
648 		wake_up(&unit->remove_wq);
649 }
650 
651 static inline void
652 zfcp_port_get(struct zfcp_port *port)
653 {
654 	atomic_inc(&port->refcount);
655 }
656 
657 static inline void
658 zfcp_port_put(struct zfcp_port *port)
659 {
660 	if (atomic_dec_return(&port->refcount) == 0)
661 		wake_up(&port->remove_wq);
662 }
663 
664 static inline void
665 zfcp_adapter_get(struct zfcp_adapter *adapter)
666 {
667 	atomic_inc(&adapter->refcount);
668 }
669 
670 static inline void
671 zfcp_adapter_put(struct zfcp_adapter *adapter)
672 {
673 	if (atomic_dec_return(&adapter->refcount) == 0)
674 		wake_up(&adapter->remove_wq);
675 }
676 
677 #endif /* ZFCP_DEF_H */
678