| Swen Schillig | 41fa2ad | 2007-09-07 09:15:31 +0200 | [diff] [blame] | 1 | /* | 
| Christof Schmitt | 553448f | 2008-06-10 18:20:58 +0200 | [diff] [blame] | 2 | * zfcp device driver | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 3 | * | 
| Christof Schmitt | 553448f | 2008-06-10 18:20:58 +0200 | [diff] [blame] | 4 | * Global definitions for the zfcp device driver. | 
| Swen Schillig | 41fa2ad | 2007-09-07 09:15:31 +0200 | [diff] [blame] | 5 | * | 
| Christof Schmitt | 615f59e | 2010-02-17 11:18:56 +0100 | [diff] [blame] | 6 | * Copyright IBM Corporation 2002, 2010 | 
| Swen Schillig | 41fa2ad | 2007-09-07 09:15:31 +0200 | [diff] [blame] | 7 | */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 8 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 9 | #ifndef ZFCP_DEF_H | 
|  | 10 | #define ZFCP_DEF_H | 
|  | 11 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 12 | /*************************** INCLUDES *****************************************/ | 
|  | 13 |  | 
|  | 14 | #include <linux/init.h> | 
|  | 15 | #include <linux/moduleparam.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 16 | #include <linux/major.h> | 
|  | 17 | #include <linux/blkdev.h> | 
|  | 18 | #include <linux/delay.h> | 
|  | 19 | #include <linux/timer.h> | 
| Heiko Carstens | dd52e0e | 2006-09-18 22:28:49 +0200 | [diff] [blame] | 20 | #include <linux/slab.h> | 
|  | 21 | #include <linux/mempool.h> | 
|  | 22 | #include <linux/syscalls.h> | 
| FUJITA Tomonori | f134637 | 2007-07-30 23:01:32 +0900 | [diff] [blame] | 23 | #include <linux/scatterlist.h> | 
| Heiko Carstens | dd52e0e | 2006-09-18 22:28:49 +0200 | [diff] [blame] | 24 | #include <linux/ioctl.h> | 
| Sven Schuetz | 9d544f2 | 2009-04-06 18:31:47 +0200 | [diff] [blame] | 25 | #include <scsi/fc/fc_fs.h> | 
|  | 26 | #include <scsi/fc/fc_gs.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 27 | #include <scsi/scsi.h> | 
|  | 28 | #include <scsi/scsi_tcq.h> | 
|  | 29 | #include <scsi/scsi_cmnd.h> | 
|  | 30 | #include <scsi/scsi_device.h> | 
|  | 31 | #include <scsi/scsi_host.h> | 
|  | 32 | #include <scsi/scsi_transport.h> | 
|  | 33 | #include <scsi/scsi_transport_fc.h> | 
| Sven Schuetz | 9d544f2 | 2009-04-06 18:31:47 +0200 | [diff] [blame] | 34 | #include <scsi/scsi_bsg_fc.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 35 | #include <asm/ccwdev.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 36 | #include <asm/debug.h> | 
|  | 37 | #include <asm/ebcdic.h> | 
| Christof Schmitt | bd43a42 | 2008-12-25 13:38:50 +0100 | [diff] [blame] | 38 | #include <asm/sysinfo.h> | 
| Heiko Carstens | dd52e0e | 2006-09-18 22:28:49 +0200 | [diff] [blame] | 39 | #include "zfcp_fsf.h" | 
| Sven Schuetz | 2d1e547 | 2010-07-16 15:37:39 +0200 | [diff] [blame] | 40 | #include "zfcp_fc.h" | 
| Christof Schmitt | 34c2b71 | 2010-02-17 11:18:59 +0100 | [diff] [blame] | 41 | #include "zfcp_qdio.h" | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 42 |  | 
| Christof Schmitt | b6bd2fb | 2010-02-17 11:18:50 +0100 | [diff] [blame] | 43 | struct zfcp_reqlist; | 
| Andreas Herrmann | 06506d0 | 2006-05-22 18:18:19 +0200 | [diff] [blame] | 44 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 45 | /********************* SCSI SPECIFIC DEFINES *********************************/ | 
| Andreas Herrmann | f6c0e7a | 2006-08-02 11:05:52 +0200 | [diff] [blame] | 46 | #define ZFCP_SCSI_ER_TIMEOUT                    (10*HZ) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 47 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 48 | /********************* FSF SPECIFIC DEFINES *********************************/ | 
|  | 49 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 50 | /* ATTENTION: value must not be used by hardware */ | 
|  | 51 | #define FSF_QTCB_UNSOLICITED_STATUS		0x6305 | 
| Andreas Herrmann | 22753fa | 2005-06-13 13:15:15 +0200 | [diff] [blame] | 52 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 53 | /* timeout value for "default timer" for fsf requests */ | 
| Andreas Herrmann | 2abbe86 | 2006-09-18 22:29:56 +0200 | [diff] [blame] | 54 | #define ZFCP_FSF_REQUEST_TIMEOUT (60*HZ) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 55 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 56 | /*************** ADAPTER/PORT/UNIT AND FSF_REQ STATUS FLAGS ******************/ | 
|  | 57 |  | 
| Swen Schillig | 41fa2ad | 2007-09-07 09:15:31 +0200 | [diff] [blame] | 58 | /* | 
|  | 59 | * Note, the leftmost status byte is common among adapter, port | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 60 | * and unit | 
|  | 61 | */ | 
|  | 62 | #define ZFCP_COMMON_FLAGS			0xfff00000 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 63 |  | 
|  | 64 | /* common status bits */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 65 | #define ZFCP_STATUS_COMMON_RUNNING		0x40000000 | 
|  | 66 | #define ZFCP_STATUS_COMMON_ERP_FAILED		0x20000000 | 
|  | 67 | #define ZFCP_STATUS_COMMON_UNBLOCKED		0x10000000 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 68 | #define ZFCP_STATUS_COMMON_OPEN                 0x04000000 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 69 | #define ZFCP_STATUS_COMMON_ERP_INUSE		0x01000000 | 
|  | 70 | #define ZFCP_STATUS_COMMON_ACCESS_DENIED	0x00800000 | 
| Andreas Herrmann | d736a27 | 2005-06-13 13:23:57 +0200 | [diff] [blame] | 71 | #define ZFCP_STATUS_COMMON_ACCESS_BOXED		0x00400000 | 
| Swen Schillig | cc8c282 | 2008-06-10 18:21:00 +0200 | [diff] [blame] | 72 | #define ZFCP_STATUS_COMMON_NOESC		0x00200000 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 73 |  | 
|  | 74 | /* adapter status */ | 
|  | 75 | #define ZFCP_STATUS_ADAPTER_QDIOUP		0x00000002 | 
| Christof Schmitt | 339f4f4 | 2010-07-16 15:37:43 +0200 | [diff] [blame] | 76 | #define ZFCP_STATUS_ADAPTER_SIOSL_ISSUED	0x00000004 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 77 | #define ZFCP_STATUS_ADAPTER_XCONFIG_OK		0x00000008 | 
|  | 78 | #define ZFCP_STATUS_ADAPTER_HOST_CON_INIT	0x00000010 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 79 | #define ZFCP_STATUS_ADAPTER_ERP_PENDING		0x00000100 | 
|  | 80 | #define ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED	0x00000200 | 
| Christof Schmitt | dcc18f4 | 2010-07-16 15:37:41 +0200 | [diff] [blame] | 81 | #define ZFCP_STATUS_ADAPTER_DATA_DIV_ENABLED	0x00000400 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 82 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 83 | /* remote port status */ | 
|  | 84 | #define ZFCP_STATUS_PORT_PHYS_OPEN		0x00000001 | 
| Christof Schmitt | 14e242e | 2009-08-18 15:43:11 +0200 | [diff] [blame] | 85 | #define ZFCP_STATUS_PORT_LINK_TEST		0x00000002 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 86 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 87 | /* logical unit status */ | 
| Christof Schmitt | b62a8d9 | 2010-09-08 14:39:55 +0200 | [diff] [blame] | 88 | #define ZFCP_STATUS_LUN_SHARED			0x00000004 | 
|  | 89 | #define ZFCP_STATUS_LUN_READONLY		0x00000008 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 90 |  | 
|  | 91 | /* FSF request status (this does not have a common part) */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 92 | #define ZFCP_STATUS_FSFREQ_ERROR		0x00000008 | 
|  | 93 | #define ZFCP_STATUS_FSFREQ_CLEANUP		0x00000010 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 94 | #define ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED	0x00000040 | 
|  | 95 | #define ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED       0x00000080 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 96 | #define ZFCP_STATUS_FSFREQ_TMFUNCFAILED         0x00000200 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 97 | #define ZFCP_STATUS_FSFREQ_DISMISSED            0x00001000 | 
|  | 98 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 99 | /************************* STRUCTURE DEFINITIONS *****************************/ | 
|  | 100 |  | 
|  | 101 | struct zfcp_fsf_req; | 
|  | 102 |  | 
|  | 103 | /* holds various memory pools of an adapter */ | 
|  | 104 | struct zfcp_adapter_mempool { | 
| Swen Schillig | a4623c4 | 2009-08-18 15:43:15 +0200 | [diff] [blame] | 105 | mempool_t *erp_req; | 
| Christof Schmitt | 799b76d | 2009-08-18 15:43:20 +0200 | [diff] [blame] | 106 | mempool_t *gid_pn_req; | 
| Swen Schillig | a4623c4 | 2009-08-18 15:43:15 +0200 | [diff] [blame] | 107 | mempool_t *scsi_req; | 
|  | 108 | mempool_t *scsi_abort; | 
|  | 109 | mempool_t *status_read_req; | 
| Christof Schmitt | c7b279a | 2011-02-22 19:54:40 +0100 | [diff] [blame] | 110 | mempool_t *sr_data; | 
| Christof Schmitt | dbf5dfe | 2009-11-24 16:54:10 +0100 | [diff] [blame] | 111 | mempool_t *gid_pn; | 
| Swen Schillig | a4623c4 | 2009-08-18 15:43:15 +0200 | [diff] [blame] | 112 | mempool_t *qtcb_pool; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 113 | }; | 
|  | 114 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 115 | struct zfcp_erp_action { | 
|  | 116 | struct list_head list; | 
|  | 117 | int action;	              /* requested action code */ | 
|  | 118 | struct zfcp_adapter *adapter; /* device which should be recovered */ | 
|  | 119 | struct zfcp_port *port; | 
| Christof Schmitt | b62a8d9 | 2010-09-08 14:39:55 +0200 | [diff] [blame] | 120 | struct scsi_device *sdev; | 
| Swen Schillig | 44cc76f | 2008-10-01 12:42:16 +0200 | [diff] [blame] | 121 | u32		status;	      /* recovery status */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 122 | u32 step;	              /* active step of this erp action */ | 
| Christof Schmitt | e60a6d6 | 2010-02-17 11:18:49 +0100 | [diff] [blame] | 123 | unsigned long		fsf_req_id; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 124 | struct timer_list timer; | 
|  | 125 | }; | 
|  | 126 |  | 
| Christof Schmitt | c961585 | 2008-05-06 11:00:05 +0200 | [diff] [blame] | 127 | struct fsf_latency_record { | 
|  | 128 | u32 min; | 
|  | 129 | u32 max; | 
|  | 130 | u64 sum; | 
|  | 131 | }; | 
|  | 132 |  | 
|  | 133 | struct latency_cont { | 
|  | 134 | struct fsf_latency_record channel; | 
|  | 135 | struct fsf_latency_record fabric; | 
|  | 136 | u64 counter; | 
|  | 137 | }; | 
|  | 138 |  | 
|  | 139 | struct zfcp_latencies { | 
|  | 140 | struct latency_cont read; | 
|  | 141 | struct latency_cont write; | 
|  | 142 | struct latency_cont cmd; | 
|  | 143 | spinlock_t lock; | 
|  | 144 | }; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 145 |  | 
|  | 146 | struct zfcp_adapter { | 
| Swen Schillig | f3450c7 | 2009-11-24 16:53:59 +0100 | [diff] [blame] | 147 | struct kref		ref; | 
| Swen Schillig | 7ba58c9 | 2008-10-01 12:42:18 +0200 | [diff] [blame] | 148 | u64			peer_wwnn;	   /* P2P peer WWNN */ | 
|  | 149 | u64			peer_wwpn;	   /* P2P peer WWPN */ | 
| Andreas Herrmann | 13e1e1f | 2005-09-19 16:56:17 +0200 | [diff] [blame] | 150 | u32			peer_d_id;	   /* P2P peer D_ID */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 151 | struct ccw_device       *ccw_device;	   /* S/390 ccw device */ | 
| Swen Schillig | 564e1c8 | 2009-08-18 15:43:19 +0200 | [diff] [blame] | 152 | struct zfcp_qdio	*qdio; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 153 | u32			hydra_version;	   /* Hydra version */ | 
|  | 154 | u32			fsf_lic_version; | 
| Maxim Shchetynin | aef4a98 | 2005-09-13 21:51:16 +0200 | [diff] [blame] | 155 | u32			adapter_features;  /* FCP channel features */ | 
|  | 156 | u32			connection_features; /* host connection features */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 157 | u32			hardware_version;  /* of FCP channel */ | 
| Christof Schmitt | c961585 | 2008-05-06 11:00:05 +0200 | [diff] [blame] | 158 | u16			timer_ticks;       /* time int for a tick */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 159 | struct Scsi_Host	*scsi_host;	   /* Pointer to mid-layer */ | 
| Swen Schillig | ecf0c77 | 2009-11-24 16:53:58 +0100 | [diff] [blame] | 160 | struct list_head	port_list;	   /* remote port list */ | 
|  | 161 | rwlock_t		port_list_lock;    /* port list lock */ | 
| Volker Sameske | fea9d6c | 2006-08-02 11:05:16 +0200 | [diff] [blame] | 162 | unsigned long		req_no;		   /* unique FSF req number */ | 
| Christof Schmitt | b6bd2fb | 2010-02-17 11:18:50 +0100 | [diff] [blame] | 163 | struct zfcp_reqlist	*req_list; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 164 | u32			fsf_req_seq_no;	   /* FSF cmnd seq number */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 165 | rwlock_t		abort_lock;        /* Protects against SCSI | 
|  | 166 | stack abort/command | 
|  | 167 | completion races */ | 
| Swen Schillig | d26ab06 | 2008-05-19 12:17:37 +0200 | [diff] [blame] | 168 | atomic_t		stat_miss;	   /* # missing status reads*/ | 
| Christof Schmitt | 64deb6e | 2010-04-30 18:09:36 +0200 | [diff] [blame] | 169 | unsigned int		stat_read_buf_num; | 
| Swen Schillig | d26ab06 | 2008-05-19 12:17:37 +0200 | [diff] [blame] | 170 | struct work_struct	stat_work; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 171 | atomic_t		status;	           /* status of this adapter */ | 
|  | 172 | struct list_head	erp_ready_head;	   /* error recovery for this | 
|  | 173 | adapter/devices */ | 
| Christof Schmitt | 347c6a9 | 2009-08-18 15:43:25 +0200 | [diff] [blame] | 174 | wait_queue_head_t	erp_ready_wq; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 175 | struct list_head	erp_running_head; | 
|  | 176 | rwlock_t		erp_lock; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 177 | wait_queue_head_t	erp_done_wqh; | 
|  | 178 | struct zfcp_erp_action	erp_action;	   /* pending error recovery */ | 
|  | 179 | atomic_t                erp_counter; | 
|  | 180 | u32			erp_total_count;   /* total nr of enqueued erp | 
|  | 181 | actions */ | 
|  | 182 | u32			erp_low_mem_count; /* nr of erp actions waiting | 
|  | 183 | for memory */ | 
| Christof Schmitt | 347c6a9 | 2009-08-18 15:43:25 +0200 | [diff] [blame] | 184 | struct task_struct	*erp_thread; | 
| Christof Schmitt | bd0072e | 2009-11-24 16:54:11 +0100 | [diff] [blame] | 185 | struct zfcp_fc_wka_ports *gs;		   /* generic services */ | 
| Christof Schmitt | d46f384 | 2009-08-18 15:43:07 +0200 | [diff] [blame] | 186 | struct zfcp_dbf		*dbf;		   /* debug traces */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 187 | struct zfcp_adapter_mempool	pool;      /* Adapter memory pools */ | 
| Andreas Herrmann | f6cd94b | 2006-01-05 09:59:34 +0100 | [diff] [blame] | 188 | struct fc_host_statistics *fc_stats; | 
|  | 189 | struct fsf_qtcb_bottom_port *stats_reset_data; | 
|  | 190 | unsigned long		stats_reset; | 
| Swen Schillig | cc8c282 | 2008-06-10 18:21:00 +0200 | [diff] [blame] | 191 | struct work_struct	scan_work; | 
| Christof Schmitt | 038d944 | 2011-02-22 19:54:48 +0100 | [diff] [blame] | 192 | struct work_struct	ns_up_work; | 
| Christof Schmitt | bd43a42 | 2008-12-25 13:38:50 +0100 | [diff] [blame] | 193 | struct service_level	service_level; | 
| Swen Schillig | 4544683 | 2009-08-18 15:43:17 +0200 | [diff] [blame] | 194 | struct workqueue_struct	*work_queue; | 
| Christof Schmitt | 6832298 | 2010-04-30 18:09:33 +0200 | [diff] [blame] | 195 | struct device_dma_parameters dma_parms; | 
| Sven Schuetz | 2d1e547 | 2010-07-16 15:37:39 +0200 | [diff] [blame] | 196 | struct zfcp_fc_events events; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 197 | }; | 
|  | 198 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 199 | struct zfcp_port { | 
| Christof Schmitt | 615f59e | 2010-02-17 11:18:56 +0100 | [diff] [blame] | 200 | struct device          dev; | 
| Andreas Herrmann | 3859f6a | 2005-08-27 11:07:54 -0700 | [diff] [blame] | 201 | struct fc_rport        *rport;         /* rport of fc transport class */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 202 | struct list_head       list;	       /* list of remote ports */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 203 | struct zfcp_adapter    *adapter;       /* adapter used to access port */ | 
| Swen Schillig | ecf0c77 | 2009-11-24 16:53:58 +0100 | [diff] [blame] | 204 | struct list_head	unit_list;	/* head of logical unit list */ | 
|  | 205 | rwlock_t		unit_list_lock; /* unit list lock */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 206 | atomic_t	       status;	       /* status of this remote port */ | 
| Swen Schillig | 7ba58c9 | 2008-10-01 12:42:18 +0200 | [diff] [blame] | 207 | u64		       wwnn;	       /* WWNN if known */ | 
|  | 208 | u64		       wwpn;	       /* WWPN */ | 
| Andreas Herrmann | 13e1e1f | 2005-09-19 16:56:17 +0200 | [diff] [blame] | 209 | u32		       d_id;	       /* D_ID */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 210 | u32		       handle;	       /* handle assigned by FSF */ | 
|  | 211 | struct zfcp_erp_action erp_action;     /* pending error recovery */ | 
|  | 212 | atomic_t               erp_counter; | 
| Ralph Wuerthner | 75bfc28 | 2006-05-22 18:24:33 +0200 | [diff] [blame] | 213 | u32                    maxframe_size; | 
|  | 214 | u32                    supported_classes; | 
| Swen Schillig | 5ab944f | 2008-10-01 12:42:17 +0200 | [diff] [blame] | 215 | struct work_struct     gid_pn_work; | 
| Christof Schmitt | 8fdf30d | 2009-03-02 13:09:01 +0100 | [diff] [blame] | 216 | struct work_struct     test_link_work; | 
| Christof Schmitt | a2fa0ae | 2009-03-02 13:09:08 +0100 | [diff] [blame] | 217 | struct work_struct     rport_work; | 
|  | 218 | enum { RPORT_NONE, RPORT_ADD, RPORT_DEL }  rport_task; | 
| Christof Schmitt | 1bf3ff0 | 2010-07-16 15:37:35 +0200 | [diff] [blame] | 219 | unsigned int		starget_id; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 220 | }; | 
|  | 221 |  | 
| Christof Schmitt | b62a8d9 | 2010-09-08 14:39:55 +0200 | [diff] [blame] | 222 | /** | 
|  | 223 | * struct zfcp_unit - LUN configured via zfcp sysfs | 
|  | 224 | * @dev: struct device for sysfs representation and reference counting | 
|  | 225 | * @list: entry in LUN/unit list per zfcp_port | 
|  | 226 | * @port: reference to zfcp_port where this LUN is configured | 
|  | 227 | * @fcp_lun: 64 bit LUN value | 
|  | 228 | * @scsi_work: for running scsi_scan_target | 
|  | 229 | * | 
|  | 230 | * This is the representation of a LUN that has been configured for | 
|  | 231 | * usage. The main data here is the 64 bit LUN value, data for | 
|  | 232 | * running I/O and recovery is in struct zfcp_scsi_dev. | 
|  | 233 | */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 234 | struct zfcp_unit { | 
| Christof Schmitt | b62a8d9 | 2010-09-08 14:39:55 +0200 | [diff] [blame] | 235 | struct device		dev; | 
|  | 236 | struct list_head	list; | 
|  | 237 | struct zfcp_port	*port; | 
|  | 238 | u64			fcp_lun; | 
| Swen Schillig | 92d5193 | 2009-04-17 15:08:04 +0200 | [diff] [blame] | 239 | struct work_struct	scsi_work; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 240 | }; | 
|  | 241 |  | 
| Swen Schillig | 42428f7 | 2009-08-18 15:43:18 +0200 | [diff] [blame] | 242 | /** | 
| Christof Schmitt | 57c2377 | 2010-09-08 14:39:51 +0200 | [diff] [blame] | 243 | * struct zfcp_scsi_dev - zfcp data per SCSI device | 
|  | 244 | * @status: zfcp internal status flags | 
|  | 245 | * @lun_handle: handle from "open lun" for issuing FSF requests | 
|  | 246 | * @erp_action: zfcp erp data for opening and recovering this LUN | 
|  | 247 | * @erp_counter: zfcp erp counter for this LUN | 
|  | 248 | * @latencies: FSF channel and fabric latencies | 
|  | 249 | * @port: zfcp_port where this LUN belongs to | 
|  | 250 | */ | 
|  | 251 | struct zfcp_scsi_dev { | 
|  | 252 | atomic_t		status; | 
|  | 253 | u32			lun_handle; | 
|  | 254 | struct zfcp_erp_action	erp_action; | 
|  | 255 | atomic_t		erp_counter; | 
|  | 256 | struct zfcp_latencies	latencies; | 
|  | 257 | struct zfcp_port	*port; | 
|  | 258 | }; | 
|  | 259 |  | 
|  | 260 | /** | 
|  | 261 | * sdev_to_zfcp - Access zfcp LUN data for SCSI device | 
|  | 262 | * @sdev: scsi_device where to get the zfcp_scsi_dev pointer | 
|  | 263 | */ | 
|  | 264 | static inline struct zfcp_scsi_dev *sdev_to_zfcp(struct scsi_device *sdev) | 
|  | 265 | { | 
|  | 266 | return scsi_transport_device_data(sdev); | 
|  | 267 | } | 
|  | 268 |  | 
|  | 269 | /** | 
|  | 270 | * zfcp_scsi_dev_lun - Return SCSI device LUN as 64 bit FCP LUN | 
|  | 271 | * @sdev: SCSI device where to get the LUN from | 
|  | 272 | */ | 
|  | 273 | static inline u64 zfcp_scsi_dev_lun(struct scsi_device *sdev) | 
|  | 274 | { | 
|  | 275 | u64 fcp_lun; | 
|  | 276 |  | 
|  | 277 | int_to_scsilun(sdev->lun, (struct scsi_lun *)&fcp_lun); | 
|  | 278 | return fcp_lun; | 
|  | 279 | } | 
|  | 280 |  | 
|  | 281 | /** | 
| Swen Schillig | 42428f7 | 2009-08-18 15:43:18 +0200 | [diff] [blame] | 282 | * struct zfcp_fsf_req - basic FSF request structure | 
|  | 283 | * @list: list of FSF requests | 
|  | 284 | * @req_id: unique request ID | 
|  | 285 | * @adapter: adapter this request belongs to | 
| Christof Schmitt | 34c2b71 | 2010-02-17 11:18:59 +0100 | [diff] [blame] | 286 | * @qdio_req: qdio queue related values | 
| Swen Schillig | 42428f7 | 2009-08-18 15:43:18 +0200 | [diff] [blame] | 287 | * @completion: used to signal the completion of the request | 
|  | 288 | * @status: status of the request | 
|  | 289 | * @fsf_command: FSF command issued | 
|  | 290 | * @qtcb: associated QTCB | 
|  | 291 | * @seq_no: sequence number of this request | 
|  | 292 | * @data: private data | 
|  | 293 | * @timer: timer data of this request | 
|  | 294 | * @erp_action: reference to erp action if request issued on behalf of ERP | 
|  | 295 | * @pool: reference to memory pool if used for this request | 
|  | 296 | * @issued: time when request was send (STCK) | 
| Swen Schillig | 42428f7 | 2009-08-18 15:43:18 +0200 | [diff] [blame] | 297 | * @handler: handler which should be called to process response | 
|  | 298 | */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 299 | struct zfcp_fsf_req { | 
| Swen Schillig | 42428f7 | 2009-08-18 15:43:18 +0200 | [diff] [blame] | 300 | struct list_head	list; | 
|  | 301 | unsigned long		req_id; | 
|  | 302 | struct zfcp_adapter	*adapter; | 
| Christof Schmitt | 34c2b71 | 2010-02-17 11:18:59 +0100 | [diff] [blame] | 303 | struct zfcp_qdio_req	qdio_req; | 
| Swen Schillig | 42428f7 | 2009-08-18 15:43:18 +0200 | [diff] [blame] | 304 | struct completion	completion; | 
|  | 305 | u32			status; | 
|  | 306 | u32			fsf_command; | 
|  | 307 | struct fsf_qtcb		*qtcb; | 
|  | 308 | u32			seq_no; | 
|  | 309 | void			*data; | 
|  | 310 | struct timer_list	timer; | 
|  | 311 | struct zfcp_erp_action	*erp_action; | 
|  | 312 | mempool_t		*pool; | 
|  | 313 | unsigned long long	issued; | 
| Swen Schillig | c41f8cb | 2008-07-02 10:56:39 +0200 | [diff] [blame] | 314 | void			(*handler)(struct zfcp_fsf_req *); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 315 | }; | 
|  | 316 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 317 | #endif /* ZFCP_DEF_H */ |