• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * zfcp device driver
3  *
4  * Global definitions for the zfcp device driver.
5  *
6  * Copyright IBM Corporation 2002, 2008
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 #define ZFCP_STATUS_PORT_PHYS_CLOSING		0x00000004
247 #define ZFCP_STATUS_PORT_NO_WWPN		0x00000008
248 #define ZFCP_STATUS_PORT_INVALID_WWPN		0x00000020
249 
250 /* well known address (WKA) port status*/
251 enum zfcp_wka_status {
252 	ZFCP_WKA_PORT_OFFLINE,
253 	ZFCP_WKA_PORT_CLOSING,
254 	ZFCP_WKA_PORT_OPENING,
255 	ZFCP_WKA_PORT_ONLINE,
256 };
257 
258 /* logical unit status */
259 #define ZFCP_STATUS_UNIT_SHARED			0x00000004
260 #define ZFCP_STATUS_UNIT_READONLY		0x00000008
261 #define ZFCP_STATUS_UNIT_REGISTERED		0x00000010
262 #define ZFCP_STATUS_UNIT_SCSI_WORK_PENDING	0x00000020
263 
264 /* FSF request status (this does not have a common part) */
265 #define ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT	0x00000002
266 #define ZFCP_STATUS_FSFREQ_COMPLETED		0x00000004
267 #define ZFCP_STATUS_FSFREQ_ERROR		0x00000008
268 #define ZFCP_STATUS_FSFREQ_CLEANUP		0x00000010
269 #define ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED	0x00000040
270 #define ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED       0x00000080
271 #define ZFCP_STATUS_FSFREQ_ABORTED              0x00000100
272 #define ZFCP_STATUS_FSFREQ_TMFUNCFAILED         0x00000200
273 #define ZFCP_STATUS_FSFREQ_TMFUNCNOTSUPP        0x00000400
274 #define ZFCP_STATUS_FSFREQ_RETRY                0x00000800
275 #define ZFCP_STATUS_FSFREQ_DISMISSED            0x00001000
276 
277 /************************* STRUCTURE DEFINITIONS *****************************/
278 
279 struct zfcp_fsf_req;
280 
281 /* holds various memory pools of an adapter */
282 struct zfcp_adapter_mempool {
283 	mempool_t *fsf_req_erp;
284 	mempool_t *fsf_req_scsi;
285 	mempool_t *fsf_req_abort;
286 	mempool_t *fsf_req_status_read;
287 	mempool_t *data_status_read;
288 	mempool_t *data_gid_pn;
289 };
290 
291 /*
292  * header for CT_IU
293  */
294 struct ct_hdr {
295 	u8 revision;		// 0x01
296 	u8 in_id[3];		// 0x00
297 	u8 gs_type;		// 0xFC	Directory Service
298 	u8 gs_subtype;		// 0x02	Name Server
299 	u8 options;		// 0x00 single bidirectional exchange
300 	u8 reserved0;
301 	u16 cmd_rsp_code;	// 0x0121 GID_PN, or 0x0100 GA_NXT
302 	u16 max_res_size;	// <= (4096 - 16) / 4
303 	u8 reserved1;
304 	u8 reason_code;
305 	u8 reason_code_expl;
306 	u8 vendor_unique;
307 } __attribute__ ((packed));
308 
309 /* nameserver request CT_IU -- for requests where
310  * a port name is required */
311 struct ct_iu_gid_pn_req {
312 	struct ct_hdr header;
313 	u64 wwpn;
314 } __attribute__ ((packed));
315 
316 /* FS_ACC IU and data unit for GID_PN nameserver request */
317 struct ct_iu_gid_pn_resp {
318 	struct ct_hdr header;
319 	u32 d_id;
320 } __attribute__ ((packed));
321 
322 /**
323  * struct zfcp_send_ct - used to pass parameters to function zfcp_fsf_send_ct
324  * @wka_port: port where the request is sent to
325  * @req: scatter-gather list for request
326  * @resp: scatter-gather list for response
327  * @handler: handler function (called for response to the request)
328  * @handler_data: data passed to handler function
329  * @timeout: FSF timeout for this request
330  * @completion: completion for synchronization purposes
331  * @status: used to pass error status to calling function
332  */
333 struct zfcp_send_ct {
334 	struct zfcp_wka_port *wka_port;
335 	struct scatterlist *req;
336 	struct scatterlist *resp;
337 	void (*handler)(unsigned long);
338 	unsigned long handler_data;
339 	int timeout;
340 	struct completion *completion;
341 	int status;
342 };
343 
344 /* used for name server requests in error recovery */
345 struct zfcp_gid_pn_data {
346 	struct zfcp_send_ct ct;
347 	struct scatterlist req;
348 	struct scatterlist resp;
349 	struct ct_iu_gid_pn_req ct_iu_req;
350 	struct ct_iu_gid_pn_resp ct_iu_resp;
351         struct zfcp_port *port;
352 };
353 
354 /**
355  * struct zfcp_send_els - used to pass parameters to function zfcp_fsf_send_els
356  * @adapter: adapter where request is sent from
357  * @port: port where ELS is destinated (port reference count has to be increased)
358  * @d_id: destiniation id of port where request is sent to
359  * @req: scatter-gather list for request
360  * @resp: scatter-gather list for response
361  * @handler: handler function (called for response to the request)
362  * @handler_data: data passed to handler function
363  * @completion: completion for synchronization purposes
364  * @ls_code: hex code of ELS command
365  * @status: used to pass error status to calling function
366  */
367 struct zfcp_send_els {
368 	struct zfcp_adapter *adapter;
369 	struct zfcp_port *port;
370 	u32 d_id;
371 	struct scatterlist *req;
372 	struct scatterlist *resp;
373 	void (*handler)(unsigned long);
374 	unsigned long handler_data;
375 	struct completion *completion;
376 	int ls_code;
377 	int status;
378 };
379 
380 struct zfcp_wka_port {
381 	struct zfcp_adapter	*adapter;
382 	wait_queue_head_t	completion_wq;
383 	enum zfcp_wka_status	status;
384 	atomic_t		refcount;
385 	u32			d_id;
386 	u32			handle;
387 	struct mutex		mutex;
388 	struct delayed_work	work;
389 };
390 
391 struct zfcp_qdio_queue {
392 	struct qdio_buffer *sbal[QDIO_MAX_BUFFERS_PER_Q];
393 	u8		   first;	/* index of next free bfr in queue */
394 	atomic_t           count;	/* number of free buffers in queue */
395 };
396 
397 struct zfcp_erp_action {
398 	struct list_head list;
399 	int action;	              /* requested action code */
400 	struct zfcp_adapter *adapter; /* device which should be recovered */
401 	struct zfcp_port *port;
402 	struct zfcp_unit *unit;
403 	u32		status;	      /* recovery status */
404 	u32 step;	              /* active step of this erp action */
405 	struct zfcp_fsf_req *fsf_req; /* fsf request currently pending
406 					 for this action */
407 	struct timer_list timer;
408 };
409 
410 struct fsf_latency_record {
411 	u32 min;
412 	u32 max;
413 	u64 sum;
414 };
415 
416 struct latency_cont {
417 	struct fsf_latency_record channel;
418 	struct fsf_latency_record fabric;
419 	u64 counter;
420 };
421 
422 struct zfcp_latencies {
423 	struct latency_cont read;
424 	struct latency_cont write;
425 	struct latency_cont cmd;
426 	spinlock_t lock;
427 };
428 
429 struct zfcp_adapter {
430 	atomic_t                refcount;          /* reference count */
431 	wait_queue_head_t	remove_wq;         /* can be used to wait for
432 						      refcount drop to zero */
433 	u64			peer_wwnn;	   /* P2P peer WWNN */
434 	u64			peer_wwpn;	   /* P2P peer WWPN */
435 	u32			peer_d_id;	   /* P2P peer D_ID */
436 	struct ccw_device       *ccw_device;	   /* S/390 ccw device */
437 	u32			hydra_version;	   /* Hydra version */
438 	u32			fsf_lic_version;
439 	u32			adapter_features;  /* FCP channel features */
440 	u32			connection_features; /* host connection features */
441         u32			hardware_version;  /* of FCP channel */
442 	u16			timer_ticks;       /* time int for a tick */
443 	struct Scsi_Host	*scsi_host;	   /* Pointer to mid-layer */
444 	struct list_head	port_list_head;	   /* remote port list */
445 	unsigned long		req_no;		   /* unique FSF req number */
446 	struct list_head	*req_list;	   /* list of pending reqs */
447 	spinlock_t		req_list_lock;	   /* request list lock */
448 	struct zfcp_qdio_queue	req_q;		   /* request queue */
449 	spinlock_t		req_q_lock;	   /* for operations on queue */
450 	int			req_q_pci_batch;   /* SBALs since PCI indication
451 						      was last set */
452 	u32			fsf_req_seq_no;	   /* FSF cmnd seq number */
453 	wait_queue_head_t	request_wq;	   /* can be used to wait for
454 						      more avaliable SBALs */
455 	struct zfcp_qdio_queue	resp_q;	   /* response queue */
456 	rwlock_t		abort_lock;        /* Protects against SCSI
457 						      stack abort/command
458 						      completion races */
459 	atomic_t		stat_miss;	   /* # missing status reads*/
460 	struct work_struct	stat_work;
461 	atomic_t		status;	           /* status of this adapter */
462 	struct list_head	erp_ready_head;	   /* error recovery for this
463 						      adapter/devices */
464 	struct list_head	erp_running_head;
465 	rwlock_t		erp_lock;
466 	struct semaphore	erp_ready_sem;
467 	wait_queue_head_t	erp_thread_wqh;
468 	wait_queue_head_t	erp_done_wqh;
469 	struct zfcp_erp_action	erp_action;	   /* pending error recovery */
470         atomic_t                erp_counter;
471 	u32			erp_total_count;   /* total nr of enqueued erp
472 						      actions */
473 	u32			erp_low_mem_count; /* nr of erp actions waiting
474 						      for memory */
475 	struct zfcp_wka_port	nsp;		   /* adapter's nameserver */
476 	debug_info_t		*rec_dbf;
477 	debug_info_t		*hba_dbf;
478 	debug_info_t		*san_dbf;          /* debug feature areas */
479 	debug_info_t		*scsi_dbf;
480 	spinlock_t		rec_dbf_lock;
481 	spinlock_t		hba_dbf_lock;
482 	spinlock_t		san_dbf_lock;
483 	spinlock_t		scsi_dbf_lock;
484 	struct zfcp_rec_dbf_record	rec_dbf_buf;
485 	struct zfcp_hba_dbf_record	hba_dbf_buf;
486 	struct zfcp_san_dbf_record	san_dbf_buf;
487 	struct zfcp_scsi_dbf_record	scsi_dbf_buf;
488 	struct zfcp_adapter_mempool	pool;      /* Adapter memory pools */
489 	struct qdio_initialize  qdio_init_data;    /* for qdio_establish */
490 	struct fc_host_statistics *fc_stats;
491 	struct fsf_qtcb_bottom_port *stats_reset_data;
492 	unsigned long		stats_reset;
493 	struct work_struct	scan_work;
494 	struct service_level	service_level;
495 	atomic_t		qdio_outb_full;	   /* queue full incidents */
496 };
497 
498 struct zfcp_port {
499 	struct device          sysfs_device;   /* sysfs device */
500 	struct fc_rport        *rport;         /* rport of fc transport class */
501 	struct list_head       list;	       /* list of remote ports */
502 	atomic_t               refcount;       /* reference count */
503 	wait_queue_head_t      remove_wq;      /* can be used to wait for
504 						  refcount drop to zero */
505 	struct zfcp_adapter    *adapter;       /* adapter used to access port */
506 	struct list_head       unit_list_head; /* head of logical unit list */
507 	atomic_t	       status;	       /* status of this remote port */
508 	u64		       wwnn;	       /* WWNN if known */
509 	u64		       wwpn;	       /* WWPN */
510 	u32		       d_id;	       /* D_ID */
511 	u32		       handle;	       /* handle assigned by FSF */
512 	struct zfcp_erp_action erp_action;     /* pending error recovery */
513         atomic_t               erp_counter;
514 	u32                    maxframe_size;
515 	u32                    supported_classes;
516 	struct work_struct     gid_pn_work;
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_REQ_AUTO_CLEANUP	0x00000002
591 #define ZFCP_REQ_NO_QTCB	0x00000008
592 
593 #define ZFCP_SET                0x00000100
594 #define ZFCP_CLEAR              0x00000200
595 
596 /*
597  * Helper functions for request ID management.
598  */
zfcp_reqlist_hash(unsigned long req_id)599 static inline int zfcp_reqlist_hash(unsigned long req_id)
600 {
601 	return req_id % REQUEST_LIST_SIZE;
602 }
603 
zfcp_reqlist_remove(struct zfcp_adapter * adapter,struct zfcp_fsf_req * fsf_req)604 static inline void zfcp_reqlist_remove(struct zfcp_adapter *adapter,
605 				       struct zfcp_fsf_req *fsf_req)
606 {
607 	list_del(&fsf_req->list);
608 }
609 
610 static inline struct zfcp_fsf_req *
zfcp_reqlist_find(struct zfcp_adapter * adapter,unsigned long req_id)611 zfcp_reqlist_find(struct zfcp_adapter *adapter, unsigned long req_id)
612 {
613 	struct zfcp_fsf_req *request;
614 	unsigned int idx;
615 
616 	idx = zfcp_reqlist_hash(req_id);
617 	list_for_each_entry(request, &adapter->req_list[idx], list)
618 		if (request->req_id == req_id)
619 			return request;
620 	return NULL;
621 }
622 
623 static inline struct zfcp_fsf_req *
zfcp_reqlist_find_safe(struct zfcp_adapter * adapter,struct zfcp_fsf_req * req)624 zfcp_reqlist_find_safe(struct zfcp_adapter *adapter, struct zfcp_fsf_req *req)
625 {
626 	struct zfcp_fsf_req *request;
627 	unsigned int idx;
628 
629 	for (idx = 0; idx < REQUEST_LIST_SIZE; idx++) {
630 		list_for_each_entry(request, &adapter->req_list[idx], list)
631 			if (request == req)
632 				return request;
633 	}
634 	return NULL;
635 }
636 
637 /*
638  *  functions needed for reference/usage counting
639  */
640 
641 static inline void
zfcp_unit_get(struct zfcp_unit * unit)642 zfcp_unit_get(struct zfcp_unit *unit)
643 {
644 	atomic_inc(&unit->refcount);
645 }
646 
647 static inline void
zfcp_unit_put(struct zfcp_unit * unit)648 zfcp_unit_put(struct zfcp_unit *unit)
649 {
650 	if (atomic_dec_return(&unit->refcount) == 0)
651 		wake_up(&unit->remove_wq);
652 }
653 
654 static inline void
zfcp_port_get(struct zfcp_port * port)655 zfcp_port_get(struct zfcp_port *port)
656 {
657 	atomic_inc(&port->refcount);
658 }
659 
660 static inline void
zfcp_port_put(struct zfcp_port * port)661 zfcp_port_put(struct zfcp_port *port)
662 {
663 	if (atomic_dec_return(&port->refcount) == 0)
664 		wake_up(&port->remove_wq);
665 }
666 
667 static inline void
zfcp_adapter_get(struct zfcp_adapter * adapter)668 zfcp_adapter_get(struct zfcp_adapter *adapter)
669 {
670 	atomic_inc(&adapter->refcount);
671 }
672 
673 static inline void
zfcp_adapter_put(struct zfcp_adapter * adapter)674 zfcp_adapter_put(struct zfcp_adapter *adapter)
675 {
676 	if (atomic_dec_return(&adapter->refcount) == 0)
677 		wake_up(&adapter->remove_wq);
678 }
679 
680 #endif /* ZFCP_DEF_H */
681