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