xref: /OK3568_Linux_fs/kernel/drivers/scsi/ibmvscsi/ibmvfc.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * ibmvfc.h -- driver for IBM Power Virtual Fibre Channel Adapter
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Written By: Brian King <brking@linux.vnet.ibm.com>, IBM Corporation
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Copyright (C) IBM Corporation, 2008
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #ifndef _IBMVFC_H
11*4882a593Smuzhiyun #define _IBMVFC_H
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include <linux/list.h>
14*4882a593Smuzhiyun #include <linux/types.h>
15*4882a593Smuzhiyun #include <scsi/viosrp.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define IBMVFC_NAME	"ibmvfc"
18*4882a593Smuzhiyun #define IBMVFC_DRIVER_VERSION		"1.0.11"
19*4882a593Smuzhiyun #define IBMVFC_DRIVER_DATE		"(April 12, 2013)"
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #define IBMVFC_DEFAULT_TIMEOUT	60
22*4882a593Smuzhiyun #define IBMVFC_ADISC_CANCEL_TIMEOUT	45
23*4882a593Smuzhiyun #define IBMVFC_ADISC_TIMEOUT		15
24*4882a593Smuzhiyun #define IBMVFC_ADISC_PLUS_CANCEL_TIMEOUT	\
25*4882a593Smuzhiyun 		(IBMVFC_ADISC_TIMEOUT + IBMVFC_ADISC_CANCEL_TIMEOUT)
26*4882a593Smuzhiyun #define IBMVFC_INIT_TIMEOUT		120
27*4882a593Smuzhiyun #define IBMVFC_ABORT_TIMEOUT		8
28*4882a593Smuzhiyun #define IBMVFC_ABORT_WAIT_TIMEOUT	40
29*4882a593Smuzhiyun #define IBMVFC_MAX_REQUESTS_DEFAULT	100
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #define IBMVFC_DEBUG			0
32*4882a593Smuzhiyun #define IBMVFC_MAX_TARGETS		1024
33*4882a593Smuzhiyun #define IBMVFC_MAX_LUN			0xffffffff
34*4882a593Smuzhiyun #define IBMVFC_MAX_SECTORS		0xffffu
35*4882a593Smuzhiyun #define IBMVFC_MAX_DISC_THREADS	4
36*4882a593Smuzhiyun #define IBMVFC_TGT_MEMPOOL_SZ		64
37*4882a593Smuzhiyun #define IBMVFC_MAX_CMDS_PER_LUN	64
38*4882a593Smuzhiyun #define IBMVFC_MAX_HOST_INIT_RETRIES	6
39*4882a593Smuzhiyun #define IBMVFC_MAX_TGT_INIT_RETRIES		3
40*4882a593Smuzhiyun #define IBMVFC_DEV_LOSS_TMO		(5 * 60)
41*4882a593Smuzhiyun #define IBMVFC_DEFAULT_LOG_LEVEL	2
42*4882a593Smuzhiyun #define IBMVFC_MAX_CDB_LEN		16
43*4882a593Smuzhiyun #define IBMVFC_CLS3_ERROR		0
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun /*
46*4882a593Smuzhiyun  * Ensure we have resources for ERP and initialization:
47*4882a593Smuzhiyun  * 1 for ERP
48*4882a593Smuzhiyun  * 1 for initialization
49*4882a593Smuzhiyun  * 1 for NPIV Logout
50*4882a593Smuzhiyun  * 2 for BSG passthru
51*4882a593Smuzhiyun  * 2 for each discovery thread
52*4882a593Smuzhiyun  */
53*4882a593Smuzhiyun #define IBMVFC_NUM_INTERNAL_REQ	(1 + 1 + 1 + 2 + (disc_threads * 2))
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #define IBMVFC_MAD_SUCCESS		0x00
56*4882a593Smuzhiyun #define IBMVFC_MAD_NOT_SUPPORTED	0xF1
57*4882a593Smuzhiyun #define IBMVFC_MAD_FAILED		0xF7
58*4882a593Smuzhiyun #define IBMVFC_MAD_DRIVER_FAILED	0xEE
59*4882a593Smuzhiyun #define IBMVFC_MAD_CRQ_ERROR		0xEF
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun enum ibmvfc_crq_valid {
62*4882a593Smuzhiyun 	IBMVFC_CRQ_CMD_RSP		= 0x80,
63*4882a593Smuzhiyun 	IBMVFC_CRQ_INIT_RSP		= 0xC0,
64*4882a593Smuzhiyun 	IBMVFC_CRQ_XPORT_EVENT		= 0xFF,
65*4882a593Smuzhiyun };
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun enum ibmvfc_crq_init_msg {
68*4882a593Smuzhiyun 	IBMVFC_CRQ_INIT			= 0x01,
69*4882a593Smuzhiyun 	IBMVFC_CRQ_INIT_COMPLETE	= 0x02,
70*4882a593Smuzhiyun };
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun enum ibmvfc_crq_xport_evts {
73*4882a593Smuzhiyun 	IBMVFC_PARTNER_FAILED		= 0x01,
74*4882a593Smuzhiyun 	IBMVFC_PARTNER_DEREGISTER	= 0x02,
75*4882a593Smuzhiyun 	IBMVFC_PARTITION_MIGRATED	= 0x06,
76*4882a593Smuzhiyun };
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun enum ibmvfc_cmd_status_flags {
79*4882a593Smuzhiyun 	IBMVFC_FABRIC_MAPPED		= 0x0001,
80*4882a593Smuzhiyun 	IBMVFC_VIOS_FAILURE		= 0x0002,
81*4882a593Smuzhiyun 	IBMVFC_FC_FAILURE			= 0x0004,
82*4882a593Smuzhiyun 	IBMVFC_FC_SCSI_ERROR		= 0x0008,
83*4882a593Smuzhiyun 	IBMVFC_HW_EVENT_LOGGED		= 0x0010,
84*4882a593Smuzhiyun 	IBMVFC_VIOS_LOGGED		= 0x0020,
85*4882a593Smuzhiyun };
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun enum ibmvfc_fabric_mapped_errors {
88*4882a593Smuzhiyun 	IBMVFC_UNABLE_TO_ESTABLISH	= 0x0001,
89*4882a593Smuzhiyun 	IBMVFC_XPORT_FAULT		= 0x0002,
90*4882a593Smuzhiyun 	IBMVFC_CMD_TIMEOUT		= 0x0003,
91*4882a593Smuzhiyun 	IBMVFC_ENETDOWN			= 0x0004,
92*4882a593Smuzhiyun 	IBMVFC_HW_FAILURE			= 0x0005,
93*4882a593Smuzhiyun 	IBMVFC_LINK_DOWN_ERR		= 0x0006,
94*4882a593Smuzhiyun 	IBMVFC_LINK_DEAD_ERR		= 0x0007,
95*4882a593Smuzhiyun 	IBMVFC_UNABLE_TO_REGISTER	= 0x0008,
96*4882a593Smuzhiyun 	IBMVFC_XPORT_BUSY			= 0x000A,
97*4882a593Smuzhiyun 	IBMVFC_XPORT_DEAD			= 0x000B,
98*4882a593Smuzhiyun 	IBMVFC_CONFIG_ERROR		= 0x000C,
99*4882a593Smuzhiyun 	IBMVFC_NAME_SERVER_FAIL		= 0x000D,
100*4882a593Smuzhiyun 	IBMVFC_LINK_HALTED		= 0x000E,
101*4882a593Smuzhiyun 	IBMVFC_XPORT_GENERAL		= 0x8000,
102*4882a593Smuzhiyun };
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun enum ibmvfc_vios_errors {
105*4882a593Smuzhiyun 	IBMVFC_CRQ_FAILURE			= 0x0001,
106*4882a593Smuzhiyun 	IBMVFC_SW_FAILURE				= 0x0002,
107*4882a593Smuzhiyun 	IBMVFC_INVALID_PARAMETER		= 0x0003,
108*4882a593Smuzhiyun 	IBMVFC_MISSING_PARAMETER		= 0x0004,
109*4882a593Smuzhiyun 	IBMVFC_HOST_IO_BUS			= 0x0005,
110*4882a593Smuzhiyun 	IBMVFC_TRANS_CANCELLED			= 0x0006,
111*4882a593Smuzhiyun 	IBMVFC_TRANS_CANCELLED_IMPLICIT	= 0x0007,
112*4882a593Smuzhiyun 	IBMVFC_INSUFFICIENT_RESOURCE		= 0x0008,
113*4882a593Smuzhiyun 	IBMVFC_PLOGI_REQUIRED			= 0x0010,
114*4882a593Smuzhiyun 	IBMVFC_COMMAND_FAILED			= 0x8000,
115*4882a593Smuzhiyun };
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun enum ibmvfc_mad_types {
118*4882a593Smuzhiyun 	IBMVFC_NPIV_LOGIN		= 0x0001,
119*4882a593Smuzhiyun 	IBMVFC_DISC_TARGETS	= 0x0002,
120*4882a593Smuzhiyun 	IBMVFC_PORT_LOGIN		= 0x0004,
121*4882a593Smuzhiyun 	IBMVFC_PROCESS_LOGIN	= 0x0008,
122*4882a593Smuzhiyun 	IBMVFC_QUERY_TARGET	= 0x0010,
123*4882a593Smuzhiyun 	IBMVFC_MOVE_LOGIN		= 0x0020,
124*4882a593Smuzhiyun 	IBMVFC_IMPLICIT_LOGOUT	= 0x0040,
125*4882a593Smuzhiyun 	IBMVFC_PASSTHRU		= 0x0200,
126*4882a593Smuzhiyun 	IBMVFC_TMF_MAD		= 0x0100,
127*4882a593Smuzhiyun 	IBMVFC_NPIV_LOGOUT	= 0x0800,
128*4882a593Smuzhiyun 	IBMVFC_CHANNEL_ENQUIRY	= 0x1000,
129*4882a593Smuzhiyun 	IBMVFC_CHANNEL_SETUP	= 0x2000,
130*4882a593Smuzhiyun 	IBMVFC_CONNECTION_INFO	= 0x4000,
131*4882a593Smuzhiyun };
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun struct ibmvfc_mad_common {
134*4882a593Smuzhiyun 	__be32 version;
135*4882a593Smuzhiyun 	__be32 reserved;
136*4882a593Smuzhiyun 	__be32 opcode;
137*4882a593Smuzhiyun 	__be16 status;
138*4882a593Smuzhiyun 	__be16 length;
139*4882a593Smuzhiyun 	__be64 tag;
140*4882a593Smuzhiyun } __packed __aligned(8);
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun struct ibmvfc_npiv_login_mad {
143*4882a593Smuzhiyun 	struct ibmvfc_mad_common common;
144*4882a593Smuzhiyun 	struct srp_direct_buf buffer;
145*4882a593Smuzhiyun } __packed __aligned(8);
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun struct ibmvfc_npiv_logout_mad {
148*4882a593Smuzhiyun 	struct ibmvfc_mad_common common;
149*4882a593Smuzhiyun } __packed __aligned(8);
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun #define IBMVFC_MAX_NAME 256
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun struct ibmvfc_npiv_login {
154*4882a593Smuzhiyun 	__be32 ostype;
155*4882a593Smuzhiyun #define IBMVFC_OS_LINUX	0x02
156*4882a593Smuzhiyun 	__be32 pad;
157*4882a593Smuzhiyun 	__be64 max_dma_len;
158*4882a593Smuzhiyun 	__be32 max_payload;
159*4882a593Smuzhiyun 	__be32 max_response;
160*4882a593Smuzhiyun 	__be32 partition_num;
161*4882a593Smuzhiyun 	__be32 vfc_frame_version;
162*4882a593Smuzhiyun 	__be16 fcp_version;
163*4882a593Smuzhiyun 	__be16 flags;
164*4882a593Smuzhiyun #define IBMVFC_CLIENT_MIGRATED	0x01
165*4882a593Smuzhiyun #define IBMVFC_FLUSH_ON_HALT		0x02
166*4882a593Smuzhiyun 	__be32 max_cmds;
167*4882a593Smuzhiyun 	__be64 capabilities;
168*4882a593Smuzhiyun #define IBMVFC_CAN_MIGRATE		0x01
169*4882a593Smuzhiyun #define IBMVFC_CAN_USE_CHANNELS		0x02
170*4882a593Smuzhiyun #define IBMVFC_CAN_HANDLE_FPIN		0x04
171*4882a593Smuzhiyun 	__be64 node_name;
172*4882a593Smuzhiyun 	struct srp_direct_buf async;
173*4882a593Smuzhiyun 	u8 partition_name[IBMVFC_MAX_NAME];
174*4882a593Smuzhiyun 	u8 device_name[IBMVFC_MAX_NAME];
175*4882a593Smuzhiyun 	u8 drc_name[IBMVFC_MAX_NAME];
176*4882a593Smuzhiyun 	__be64 reserved2[2];
177*4882a593Smuzhiyun } __packed __aligned(8);
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun struct ibmvfc_common_svc_parms {
180*4882a593Smuzhiyun 	__be16 fcph_version;
181*4882a593Smuzhiyun 	__be16 b2b_credit;
182*4882a593Smuzhiyun 	__be16 features;
183*4882a593Smuzhiyun 	__be16 bb_rcv_sz; /* upper nibble is BB_SC_N */
184*4882a593Smuzhiyun 	__be32 ratov;
185*4882a593Smuzhiyun 	__be32 edtov;
186*4882a593Smuzhiyun } __packed __aligned(4);
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun struct ibmvfc_service_parms {
189*4882a593Smuzhiyun 	struct ibmvfc_common_svc_parms common;
190*4882a593Smuzhiyun 	u8 port_name[8];
191*4882a593Smuzhiyun 	u8 node_name[8];
192*4882a593Smuzhiyun 	__be32 class1_parms[4];
193*4882a593Smuzhiyun 	__be32 class2_parms[4];
194*4882a593Smuzhiyun 	__be32 class3_parms[4];
195*4882a593Smuzhiyun 	__be32 obsolete[4];
196*4882a593Smuzhiyun 	__be32 vendor_version[4];
197*4882a593Smuzhiyun 	__be32 services_avail[2];
198*4882a593Smuzhiyun 	__be32 ext_len;
199*4882a593Smuzhiyun 	__be32 reserved[30];
200*4882a593Smuzhiyun 	__be32 clk_sync_qos[2];
201*4882a593Smuzhiyun 	__be32 reserved2;
202*4882a593Smuzhiyun } __packed __aligned(4);
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun struct ibmvfc_npiv_login_resp {
205*4882a593Smuzhiyun 	__be32 version;
206*4882a593Smuzhiyun 	__be16 status;
207*4882a593Smuzhiyun 	__be16 error;
208*4882a593Smuzhiyun 	__be32 flags;
209*4882a593Smuzhiyun #define IBMVFC_NATIVE_FC		0x01
210*4882a593Smuzhiyun 	__be32 reserved;
211*4882a593Smuzhiyun 	__be64 capabilities;
212*4882a593Smuzhiyun #define IBMVFC_CAN_FLUSH_ON_HALT	0x08
213*4882a593Smuzhiyun #define IBMVFC_CAN_SUPPRESS_ABTS	0x10
214*4882a593Smuzhiyun #define IBMVFC_CAN_SUPPORT_CHANNELS	0x20
215*4882a593Smuzhiyun 	__be32 max_cmds;
216*4882a593Smuzhiyun 	__be32 scsi_id_sz;
217*4882a593Smuzhiyun 	__be64 max_dma_len;
218*4882a593Smuzhiyun 	__be64 scsi_id;
219*4882a593Smuzhiyun 	__be64 port_name;
220*4882a593Smuzhiyun 	__be64 node_name;
221*4882a593Smuzhiyun 	__be64 link_speed;
222*4882a593Smuzhiyun 	u8 partition_name[IBMVFC_MAX_NAME];
223*4882a593Smuzhiyun 	u8 device_name[IBMVFC_MAX_NAME];
224*4882a593Smuzhiyun 	u8 port_loc_code[IBMVFC_MAX_NAME];
225*4882a593Smuzhiyun 	u8 drc_name[IBMVFC_MAX_NAME];
226*4882a593Smuzhiyun 	struct ibmvfc_service_parms service_parms;
227*4882a593Smuzhiyun 	__be64 reserved2;
228*4882a593Smuzhiyun } __packed __aligned(8);
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun union ibmvfc_npiv_login_data {
231*4882a593Smuzhiyun 	struct ibmvfc_npiv_login login;
232*4882a593Smuzhiyun 	struct ibmvfc_npiv_login_resp resp;
233*4882a593Smuzhiyun } __packed __aligned(8);
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun struct ibmvfc_discover_targets_entry {
236*4882a593Smuzhiyun 	__be32 scsi_id;
237*4882a593Smuzhiyun 	__be32 pad;
238*4882a593Smuzhiyun 	__be64 wwpn;
239*4882a593Smuzhiyun #define IBMVFC_DISC_TGT_SCSI_ID_MASK	0x00ffffff
240*4882a593Smuzhiyun } __packed __aligned(8);
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun struct ibmvfc_discover_targets {
243*4882a593Smuzhiyun 	struct ibmvfc_mad_common common;
244*4882a593Smuzhiyun 	struct srp_direct_buf buffer;
245*4882a593Smuzhiyun 	__be32 flags;
246*4882a593Smuzhiyun #define IBMVFC_DISC_TGT_PORT_ID_WWPN_LIST	0x02
247*4882a593Smuzhiyun 	__be16 status;
248*4882a593Smuzhiyun 	__be16 error;
249*4882a593Smuzhiyun 	__be32 bufflen;
250*4882a593Smuzhiyun 	__be32 num_avail;
251*4882a593Smuzhiyun 	__be32 num_written;
252*4882a593Smuzhiyun 	__be64 reserved[2];
253*4882a593Smuzhiyun } __packed __aligned(8);
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun enum ibmvfc_fc_reason {
256*4882a593Smuzhiyun 	IBMVFC_INVALID_ELS_CMD_CODE	= 0x01,
257*4882a593Smuzhiyun 	IBMVFC_INVALID_VERSION		= 0x02,
258*4882a593Smuzhiyun 	IBMVFC_LOGICAL_ERROR		= 0x03,
259*4882a593Smuzhiyun 	IBMVFC_INVALID_CT_IU_SIZE	= 0x04,
260*4882a593Smuzhiyun 	IBMVFC_LOGICAL_BUSY		= 0x05,
261*4882a593Smuzhiyun 	IBMVFC_PROTOCOL_ERROR		= 0x07,
262*4882a593Smuzhiyun 	IBMVFC_UNABLE_TO_PERFORM_REQ	= 0x09,
263*4882a593Smuzhiyun 	IBMVFC_CMD_NOT_SUPPORTED	= 0x0B,
264*4882a593Smuzhiyun 	IBMVFC_SERVER_NOT_AVAIL		= 0x0D,
265*4882a593Smuzhiyun 	IBMVFC_CMD_IN_PROGRESS		= 0x0E,
266*4882a593Smuzhiyun 	IBMVFC_VENDOR_SPECIFIC		= 0xFF,
267*4882a593Smuzhiyun };
268*4882a593Smuzhiyun 
269*4882a593Smuzhiyun enum ibmvfc_fc_type {
270*4882a593Smuzhiyun 	IBMVFC_FABRIC_REJECT	= 0x01,
271*4882a593Smuzhiyun 	IBMVFC_PORT_REJECT	= 0x02,
272*4882a593Smuzhiyun 	IBMVFC_LS_REJECT		= 0x03,
273*4882a593Smuzhiyun 	IBMVFC_FABRIC_BUSY	= 0x04,
274*4882a593Smuzhiyun 	IBMVFC_PORT_BUSY		= 0x05,
275*4882a593Smuzhiyun 	IBMVFC_BASIC_REJECT	= 0x06,
276*4882a593Smuzhiyun };
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun enum ibmvfc_gs_explain {
279*4882a593Smuzhiyun 	IBMVFC_PORT_NAME_NOT_REG	= 0x02,
280*4882a593Smuzhiyun };
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun struct ibmvfc_port_login {
283*4882a593Smuzhiyun 	struct ibmvfc_mad_common common;
284*4882a593Smuzhiyun 	__be64 scsi_id;
285*4882a593Smuzhiyun 	__be16 reserved;
286*4882a593Smuzhiyun 	__be16 fc_service_class;
287*4882a593Smuzhiyun 	__be32 blksz;
288*4882a593Smuzhiyun 	__be32 hdr_per_blk;
289*4882a593Smuzhiyun 	__be16 status;
290*4882a593Smuzhiyun 	__be16 error;		/* also fc_reason */
291*4882a593Smuzhiyun 	__be16 fc_explain;
292*4882a593Smuzhiyun 	__be16 fc_type;
293*4882a593Smuzhiyun 	__be32 reserved2;
294*4882a593Smuzhiyun 	struct ibmvfc_service_parms service_parms;
295*4882a593Smuzhiyun 	struct ibmvfc_service_parms service_parms_change;
296*4882a593Smuzhiyun 	__be64 reserved3[2];
297*4882a593Smuzhiyun } __packed __aligned(8);
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun struct ibmvfc_move_login {
300*4882a593Smuzhiyun 	struct ibmvfc_mad_common common;
301*4882a593Smuzhiyun 	__be64 old_scsi_id;
302*4882a593Smuzhiyun 	__be64 new_scsi_id;
303*4882a593Smuzhiyun 	__be64 wwpn;
304*4882a593Smuzhiyun 	__be64 node_name;
305*4882a593Smuzhiyun 	__be32 flags;
306*4882a593Smuzhiyun #define IBMVFC_MOVE_LOGIN_IMPLICIT_OLD_FAILED	0x01
307*4882a593Smuzhiyun #define IBMVFC_MOVE_LOGIN_IMPLICIT_NEW_FAILED	0x02
308*4882a593Smuzhiyun #define IBMVFC_MOVE_LOGIN_PORT_LOGIN_FAILED	0x04
309*4882a593Smuzhiyun 	__be32 reserved;
310*4882a593Smuzhiyun 	struct ibmvfc_service_parms service_parms;
311*4882a593Smuzhiyun 	struct ibmvfc_service_parms service_parms_change;
312*4882a593Smuzhiyun 	__be32 reserved2;
313*4882a593Smuzhiyun 	__be16 service_class;
314*4882a593Smuzhiyun 	__be16 vios_flags;
315*4882a593Smuzhiyun #define IBMVFC_MOVE_LOGIN_VF_NOT_SENT_ADAPTER	0x01
316*4882a593Smuzhiyun 	__be64 reserved3;
317*4882a593Smuzhiyun } __packed __aligned(8);
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun struct ibmvfc_prli_svc_parms {
320*4882a593Smuzhiyun 	u8 type;
321*4882a593Smuzhiyun #define IBMVFC_SCSI_FCP_TYPE		0x08
322*4882a593Smuzhiyun 	u8 type_ext;
323*4882a593Smuzhiyun 	__be16 flags;
324*4882a593Smuzhiyun #define IBMVFC_PRLI_ORIG_PA_VALID			0x8000
325*4882a593Smuzhiyun #define IBMVFC_PRLI_RESP_PA_VALID			0x4000
326*4882a593Smuzhiyun #define IBMVFC_PRLI_EST_IMG_PAIR			0x2000
327*4882a593Smuzhiyun 	__be32 orig_pa;
328*4882a593Smuzhiyun 	__be32 resp_pa;
329*4882a593Smuzhiyun 	__be32 service_parms;
330*4882a593Smuzhiyun #define IBMVFC_PRLI_TASK_RETRY			0x00000200
331*4882a593Smuzhiyun #define IBMVFC_PRLI_RETRY				0x00000100
332*4882a593Smuzhiyun #define IBMVFC_PRLI_DATA_OVERLAY			0x00000040
333*4882a593Smuzhiyun #define IBMVFC_PRLI_INITIATOR_FUNC			0x00000020
334*4882a593Smuzhiyun #define IBMVFC_PRLI_TARGET_FUNC			0x00000010
335*4882a593Smuzhiyun #define IBMVFC_PRLI_READ_FCP_XFER_RDY_DISABLED	0x00000002
336*4882a593Smuzhiyun #define IBMVFC_PRLI_WR_FCP_XFER_RDY_DISABLED	0x00000001
337*4882a593Smuzhiyun } __packed __aligned(4);
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun struct ibmvfc_process_login {
340*4882a593Smuzhiyun 	struct ibmvfc_mad_common common;
341*4882a593Smuzhiyun 	__be64 scsi_id;
342*4882a593Smuzhiyun 	struct ibmvfc_prli_svc_parms parms;
343*4882a593Smuzhiyun 	u8 reserved[48];
344*4882a593Smuzhiyun 	__be16 status;
345*4882a593Smuzhiyun 	__be16 error;			/* also fc_reason */
346*4882a593Smuzhiyun 	__be32 reserved2;
347*4882a593Smuzhiyun 	__be64 reserved3[2];
348*4882a593Smuzhiyun } __packed __aligned(8);
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun struct ibmvfc_query_tgt {
351*4882a593Smuzhiyun 	struct ibmvfc_mad_common common;
352*4882a593Smuzhiyun 	__be64 wwpn;
353*4882a593Smuzhiyun 	__be64 scsi_id;
354*4882a593Smuzhiyun 	__be16 status;
355*4882a593Smuzhiyun 	__be16 error;
356*4882a593Smuzhiyun 	__be16 fc_explain;
357*4882a593Smuzhiyun 	__be16 fc_type;
358*4882a593Smuzhiyun 	__be64 reserved[2];
359*4882a593Smuzhiyun } __packed __aligned(8);
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun struct ibmvfc_implicit_logout {
362*4882a593Smuzhiyun 	struct ibmvfc_mad_common common;
363*4882a593Smuzhiyun 	__be64 old_scsi_id;
364*4882a593Smuzhiyun 	__be64 reserved[2];
365*4882a593Smuzhiyun } __packed __aligned(8);
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun struct ibmvfc_tmf {
368*4882a593Smuzhiyun 	struct ibmvfc_mad_common common;
369*4882a593Smuzhiyun 	__be64 scsi_id;
370*4882a593Smuzhiyun 	struct scsi_lun lun;
371*4882a593Smuzhiyun 	__be32 flags;
372*4882a593Smuzhiyun #define IBMVFC_TMF_ABORT_TASK		0x02
373*4882a593Smuzhiyun #define IBMVFC_TMF_ABORT_TASK_SET	0x04
374*4882a593Smuzhiyun #define IBMVFC_TMF_LUN_RESET		0x10
375*4882a593Smuzhiyun #define IBMVFC_TMF_TGT_RESET		0x20
376*4882a593Smuzhiyun #define IBMVFC_TMF_LUA_VALID		0x40
377*4882a593Smuzhiyun #define IBMVFC_TMF_SUPPRESS_ABTS	0x80
378*4882a593Smuzhiyun 	__be32 cancel_key;
379*4882a593Smuzhiyun 	__be32 my_cancel_key;
380*4882a593Smuzhiyun 	__be32 pad;
381*4882a593Smuzhiyun 	__be64 reserved[2];
382*4882a593Smuzhiyun } __packed __aligned(8);
383*4882a593Smuzhiyun 
384*4882a593Smuzhiyun enum ibmvfc_fcp_rsp_info_codes {
385*4882a593Smuzhiyun 	RSP_NO_FAILURE		= 0x00,
386*4882a593Smuzhiyun 	RSP_TMF_REJECTED		= 0x04,
387*4882a593Smuzhiyun 	RSP_TMF_FAILED		= 0x05,
388*4882a593Smuzhiyun 	RSP_TMF_INVALID_LUN	= 0x09,
389*4882a593Smuzhiyun };
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun struct ibmvfc_fcp_rsp_info {
392*4882a593Smuzhiyun 	u8 reserved[3];
393*4882a593Smuzhiyun 	u8 rsp_code;
394*4882a593Smuzhiyun 	u8 reserved2[4];
395*4882a593Smuzhiyun } __packed __aligned(2);
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun enum ibmvfc_fcp_rsp_flags {
398*4882a593Smuzhiyun 	FCP_BIDI_RSP			= 0x80,
399*4882a593Smuzhiyun 	FCP_BIDI_READ_RESID_UNDER	= 0x40,
400*4882a593Smuzhiyun 	FCP_BIDI_READ_RESID_OVER	= 0x20,
401*4882a593Smuzhiyun 	FCP_CONF_REQ			= 0x10,
402*4882a593Smuzhiyun 	FCP_RESID_UNDER			= 0x08,
403*4882a593Smuzhiyun 	FCP_RESID_OVER			= 0x04,
404*4882a593Smuzhiyun 	FCP_SNS_LEN_VALID			= 0x02,
405*4882a593Smuzhiyun 	FCP_RSP_LEN_VALID			= 0x01,
406*4882a593Smuzhiyun };
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun union ibmvfc_fcp_rsp_data {
409*4882a593Smuzhiyun 	struct ibmvfc_fcp_rsp_info info;
410*4882a593Smuzhiyun 	u8 sense[SCSI_SENSE_BUFFERSIZE + sizeof(struct ibmvfc_fcp_rsp_info)];
411*4882a593Smuzhiyun } __packed __aligned(8);
412*4882a593Smuzhiyun 
413*4882a593Smuzhiyun struct ibmvfc_fcp_rsp {
414*4882a593Smuzhiyun 	__be64 reserved;
415*4882a593Smuzhiyun 	__be16 retry_delay_timer;
416*4882a593Smuzhiyun 	u8 flags;
417*4882a593Smuzhiyun 	u8 scsi_status;
418*4882a593Smuzhiyun 	__be32 fcp_resid;
419*4882a593Smuzhiyun 	__be32 fcp_sense_len;
420*4882a593Smuzhiyun 	__be32 fcp_rsp_len;
421*4882a593Smuzhiyun 	union ibmvfc_fcp_rsp_data data;
422*4882a593Smuzhiyun } __packed __aligned(8);
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun enum ibmvfc_cmd_flags {
425*4882a593Smuzhiyun 	IBMVFC_SCATTERLIST	= 0x0001,
426*4882a593Smuzhiyun 	IBMVFC_NO_MEM_DESC	= 0x0002,
427*4882a593Smuzhiyun 	IBMVFC_READ			= 0x0004,
428*4882a593Smuzhiyun 	IBMVFC_WRITE		= 0x0008,
429*4882a593Smuzhiyun 	IBMVFC_TMF			= 0x0080,
430*4882a593Smuzhiyun 	IBMVFC_CLASS_3_ERR	= 0x0100,
431*4882a593Smuzhiyun };
432*4882a593Smuzhiyun 
433*4882a593Smuzhiyun enum ibmvfc_fc_task_attr {
434*4882a593Smuzhiyun 	IBMVFC_SIMPLE_TASK	= 0x00,
435*4882a593Smuzhiyun 	IBMVFC_HEAD_OF_QUEUE	= 0x01,
436*4882a593Smuzhiyun 	IBMVFC_ORDERED_TASK	= 0x02,
437*4882a593Smuzhiyun 	IBMVFC_ACA_TASK		= 0x04,
438*4882a593Smuzhiyun };
439*4882a593Smuzhiyun 
440*4882a593Smuzhiyun enum ibmvfc_fc_tmf_flags {
441*4882a593Smuzhiyun 	IBMVFC_ABORT_TASK_SET	= 0x02,
442*4882a593Smuzhiyun 	IBMVFC_LUN_RESET		= 0x10,
443*4882a593Smuzhiyun 	IBMVFC_TARGET_RESET	= 0x20,
444*4882a593Smuzhiyun };
445*4882a593Smuzhiyun 
446*4882a593Smuzhiyun struct ibmvfc_fcp_cmd_iu {
447*4882a593Smuzhiyun 	struct scsi_lun lun;
448*4882a593Smuzhiyun 	u8 crn;
449*4882a593Smuzhiyun 	u8 pri_task_attr;
450*4882a593Smuzhiyun 	u8 tmf_flags;
451*4882a593Smuzhiyun 	u8 add_cdb_len;
452*4882a593Smuzhiyun #define IBMVFC_RDDATA		0x02
453*4882a593Smuzhiyun #define IBMVFC_WRDATA		0x01
454*4882a593Smuzhiyun 	u8 cdb[IBMVFC_MAX_CDB_LEN];
455*4882a593Smuzhiyun 	__be32 xfer_len;
456*4882a593Smuzhiyun } __packed __aligned(4);
457*4882a593Smuzhiyun 
458*4882a593Smuzhiyun struct ibmvfc_cmd {
459*4882a593Smuzhiyun 	__be64 task_tag;
460*4882a593Smuzhiyun 	__be32 frame_type;
461*4882a593Smuzhiyun 	__be32 payload_len;
462*4882a593Smuzhiyun 	__be32 resp_len;
463*4882a593Smuzhiyun 	__be32 adapter_resid;
464*4882a593Smuzhiyun 	__be16 status;
465*4882a593Smuzhiyun 	__be16 error;
466*4882a593Smuzhiyun 	__be16 flags;
467*4882a593Smuzhiyun 	__be16 response_flags;
468*4882a593Smuzhiyun #define IBMVFC_ADAPTER_RESID_VALID	0x01
469*4882a593Smuzhiyun 	__be32 cancel_key;
470*4882a593Smuzhiyun 	__be32 exchange_id;
471*4882a593Smuzhiyun 	struct srp_direct_buf ext_func;
472*4882a593Smuzhiyun 	struct srp_direct_buf ioba;
473*4882a593Smuzhiyun 	struct srp_direct_buf resp;
474*4882a593Smuzhiyun 	__be64 correlation;
475*4882a593Smuzhiyun 	__be64 tgt_scsi_id;
476*4882a593Smuzhiyun 	__be64 tag;
477*4882a593Smuzhiyun 	__be64 reserved3[2];
478*4882a593Smuzhiyun 	struct ibmvfc_fcp_cmd_iu iu;
479*4882a593Smuzhiyun 	struct ibmvfc_fcp_rsp rsp;
480*4882a593Smuzhiyun } __packed __aligned(8);
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun struct ibmvfc_passthru_fc_iu {
483*4882a593Smuzhiyun 	__be32 payload[7];
484*4882a593Smuzhiyun #define IBMVFC_ADISC	0x52000000
485*4882a593Smuzhiyun 	__be32 response[7];
486*4882a593Smuzhiyun };
487*4882a593Smuzhiyun 
488*4882a593Smuzhiyun struct ibmvfc_passthru_iu {
489*4882a593Smuzhiyun 	__be64 task_tag;
490*4882a593Smuzhiyun 	__be32 cmd_len;
491*4882a593Smuzhiyun 	__be32 rsp_len;
492*4882a593Smuzhiyun 	__be16 status;
493*4882a593Smuzhiyun 	__be16 error;
494*4882a593Smuzhiyun 	__be32 flags;
495*4882a593Smuzhiyun #define IBMVFC_FC_ELS		0x01
496*4882a593Smuzhiyun #define IBMVFC_FC_CT_IU		0x02
497*4882a593Smuzhiyun 	__be32 cancel_key;
498*4882a593Smuzhiyun #define IBMVFC_PASSTHRU_CANCEL_KEY	0x80000000
499*4882a593Smuzhiyun #define IBMVFC_INTERNAL_CANCEL_KEY	0x80000001
500*4882a593Smuzhiyun 	__be32 reserved;
501*4882a593Smuzhiyun 	struct srp_direct_buf cmd;
502*4882a593Smuzhiyun 	struct srp_direct_buf rsp;
503*4882a593Smuzhiyun 	__be64 correlation;
504*4882a593Smuzhiyun 	__be64 scsi_id;
505*4882a593Smuzhiyun 	__be64 tag;
506*4882a593Smuzhiyun 	__be64 reserved2[2];
507*4882a593Smuzhiyun } __packed __aligned(8);
508*4882a593Smuzhiyun 
509*4882a593Smuzhiyun struct ibmvfc_passthru_mad {
510*4882a593Smuzhiyun 	struct ibmvfc_mad_common common;
511*4882a593Smuzhiyun 	struct srp_direct_buf cmd_ioba;
512*4882a593Smuzhiyun 	struct ibmvfc_passthru_iu iu;
513*4882a593Smuzhiyun 	struct ibmvfc_passthru_fc_iu fc_iu;
514*4882a593Smuzhiyun } __packed __aligned(8);
515*4882a593Smuzhiyun 
516*4882a593Smuzhiyun struct ibmvfc_channel_enquiry {
517*4882a593Smuzhiyun 	struct ibmvfc_mad_common common;
518*4882a593Smuzhiyun 	__be32 flags;
519*4882a593Smuzhiyun #define IBMVFC_NO_CHANNELS_TO_CRQ_SUPPORT	0x01
520*4882a593Smuzhiyun #define IBMVFC_SUPPORT_VARIABLE_SUBQ_MSG	0x02
521*4882a593Smuzhiyun #define IBMVFC_NO_N_TO_M_CHANNELS_SUPPORT	0x04
522*4882a593Smuzhiyun 	__be32 num_scsi_subq_channels;
523*4882a593Smuzhiyun 	__be32 num_nvmeof_subq_channels;
524*4882a593Smuzhiyun 	__be32 num_scsi_vas_channels;
525*4882a593Smuzhiyun 	__be32 num_nvmeof_vas_channels;
526*4882a593Smuzhiyun } __packed __aligned(8);
527*4882a593Smuzhiyun 
528*4882a593Smuzhiyun struct ibmvfc_channel_setup_mad {
529*4882a593Smuzhiyun 	struct ibmvfc_mad_common common;
530*4882a593Smuzhiyun 	struct srp_direct_buf buffer;
531*4882a593Smuzhiyun } __packed __aligned(8);
532*4882a593Smuzhiyun 
533*4882a593Smuzhiyun #define IBMVFC_MAX_CHANNELS	502
534*4882a593Smuzhiyun 
535*4882a593Smuzhiyun struct ibmvfc_channel_setup {
536*4882a593Smuzhiyun 	__be32 flags;
537*4882a593Smuzhiyun #define IBMVFC_CANCEL_CHANNELS		0x01
538*4882a593Smuzhiyun #define IBMVFC_USE_BUFFER		0x02
539*4882a593Smuzhiyun #define IBMVFC_CHANNELS_CANCELED	0x04
540*4882a593Smuzhiyun 	__be32 reserved;
541*4882a593Smuzhiyun 	__be32 num_scsi_subq_channels;
542*4882a593Smuzhiyun 	__be32 num_nvmeof_subq_channels;
543*4882a593Smuzhiyun 	__be32 num_scsi_vas_channels;
544*4882a593Smuzhiyun 	__be32 num_nvmeof_vas_channels;
545*4882a593Smuzhiyun 	struct srp_direct_buf buffer;
546*4882a593Smuzhiyun 	__be64 reserved2[5];
547*4882a593Smuzhiyun 	__be64 channel_handles[IBMVFC_MAX_CHANNELS];
548*4882a593Smuzhiyun } __packed __aligned(8);
549*4882a593Smuzhiyun 
550*4882a593Smuzhiyun struct ibmvfc_connection_info {
551*4882a593Smuzhiyun 	struct ibmvfc_mad_common common;
552*4882a593Smuzhiyun 	__be64 information_bits;
553*4882a593Smuzhiyun #define IBMVFC_NO_FC_IO_CHANNEL		0x01
554*4882a593Smuzhiyun #define IBMVFC_NO_PHYP_VAS		0x02
555*4882a593Smuzhiyun #define IBMVFC_NO_PHYP_SUBQ		0x04
556*4882a593Smuzhiyun #define IBMVFC_PHYP_DEPRECATED_SUBQ	0x08
557*4882a593Smuzhiyun #define IBMVFC_PHYP_PRESERVED_SUBQ	0x10
558*4882a593Smuzhiyun #define IBMVFC_PHYP_FULL_SUBQ		0x20
559*4882a593Smuzhiyun 	__be64 reserved[16];
560*4882a593Smuzhiyun } __packed __aligned(8);
561*4882a593Smuzhiyun 
562*4882a593Smuzhiyun struct ibmvfc_trace_start_entry {
563*4882a593Smuzhiyun 	u32 xfer_len;
564*4882a593Smuzhiyun } __packed;
565*4882a593Smuzhiyun 
566*4882a593Smuzhiyun struct ibmvfc_trace_end_entry {
567*4882a593Smuzhiyun 	u16 status;
568*4882a593Smuzhiyun 	u16 error;
569*4882a593Smuzhiyun 	u8 fcp_rsp_flags;
570*4882a593Smuzhiyun 	u8 rsp_code;
571*4882a593Smuzhiyun 	u8 scsi_status;
572*4882a593Smuzhiyun 	u8 reserved;
573*4882a593Smuzhiyun } __packed;
574*4882a593Smuzhiyun 
575*4882a593Smuzhiyun struct ibmvfc_trace_entry {
576*4882a593Smuzhiyun 	struct ibmvfc_event *evt;
577*4882a593Smuzhiyun 	u32 time;
578*4882a593Smuzhiyun 	u32 scsi_id;
579*4882a593Smuzhiyun 	u32 lun;
580*4882a593Smuzhiyun 	u8 fmt;
581*4882a593Smuzhiyun 	u8 op_code;
582*4882a593Smuzhiyun 	u8 tmf_flags;
583*4882a593Smuzhiyun 	u8 type;
584*4882a593Smuzhiyun #define IBMVFC_TRC_START	0x00
585*4882a593Smuzhiyun #define IBMVFC_TRC_END		0xff
586*4882a593Smuzhiyun 	union {
587*4882a593Smuzhiyun 		struct ibmvfc_trace_start_entry start;
588*4882a593Smuzhiyun 		struct ibmvfc_trace_end_entry end;
589*4882a593Smuzhiyun 	} u;
590*4882a593Smuzhiyun } __packed __aligned(8);
591*4882a593Smuzhiyun 
592*4882a593Smuzhiyun enum ibmvfc_crq_formats {
593*4882a593Smuzhiyun 	IBMVFC_CMD_FORMAT		= 0x01,
594*4882a593Smuzhiyun 	IBMVFC_ASYNC_EVENT	= 0x02,
595*4882a593Smuzhiyun 	IBMVFC_MAD_FORMAT		= 0x04,
596*4882a593Smuzhiyun };
597*4882a593Smuzhiyun 
598*4882a593Smuzhiyun enum ibmvfc_async_event {
599*4882a593Smuzhiyun 	IBMVFC_AE_ELS_PLOGI		= 0x0001,
600*4882a593Smuzhiyun 	IBMVFC_AE_ELS_LOGO		= 0x0002,
601*4882a593Smuzhiyun 	IBMVFC_AE_ELS_PRLO		= 0x0004,
602*4882a593Smuzhiyun 	IBMVFC_AE_SCN_NPORT		= 0x0008,
603*4882a593Smuzhiyun 	IBMVFC_AE_SCN_GROUP		= 0x0010,
604*4882a593Smuzhiyun 	IBMVFC_AE_SCN_DOMAIN		= 0x0020,
605*4882a593Smuzhiyun 	IBMVFC_AE_SCN_FABRIC		= 0x0040,
606*4882a593Smuzhiyun 	IBMVFC_AE_LINK_UP			= 0x0080,
607*4882a593Smuzhiyun 	IBMVFC_AE_LINK_DOWN		= 0x0100,
608*4882a593Smuzhiyun 	IBMVFC_AE_LINK_DEAD		= 0x0200,
609*4882a593Smuzhiyun 	IBMVFC_AE_HALT			= 0x0400,
610*4882a593Smuzhiyun 	IBMVFC_AE_RESUME			= 0x0800,
611*4882a593Smuzhiyun 	IBMVFC_AE_ADAPTER_FAILED	= 0x1000,
612*4882a593Smuzhiyun 	IBMVFC_AE_FPIN			= 0x2000,
613*4882a593Smuzhiyun };
614*4882a593Smuzhiyun 
615*4882a593Smuzhiyun struct ibmvfc_async_desc {
616*4882a593Smuzhiyun 	const char *desc;
617*4882a593Smuzhiyun 	enum ibmvfc_async_event ae;
618*4882a593Smuzhiyun 	int log_level;
619*4882a593Smuzhiyun };
620*4882a593Smuzhiyun 
621*4882a593Smuzhiyun struct ibmvfc_crq {
622*4882a593Smuzhiyun 	volatile u8 valid;
623*4882a593Smuzhiyun 	volatile u8 format;
624*4882a593Smuzhiyun 	u8 reserved[6];
625*4882a593Smuzhiyun 	volatile __be64 ioba;
626*4882a593Smuzhiyun } __packed __aligned(8);
627*4882a593Smuzhiyun 
628*4882a593Smuzhiyun struct ibmvfc_crq_queue {
629*4882a593Smuzhiyun 	struct ibmvfc_crq *msgs;
630*4882a593Smuzhiyun 	int size, cur;
631*4882a593Smuzhiyun 	dma_addr_t msg_token;
632*4882a593Smuzhiyun };
633*4882a593Smuzhiyun 
634*4882a593Smuzhiyun enum ibmvfc_ae_link_state {
635*4882a593Smuzhiyun 	IBMVFC_AE_LS_LINK_UP		= 0x01,
636*4882a593Smuzhiyun 	IBMVFC_AE_LS_LINK_BOUNCED	= 0x02,
637*4882a593Smuzhiyun 	IBMVFC_AE_LS_LINK_DOWN		= 0x04,
638*4882a593Smuzhiyun 	IBMVFC_AE_LS_LINK_DEAD		= 0x08,
639*4882a593Smuzhiyun };
640*4882a593Smuzhiyun 
641*4882a593Smuzhiyun enum ibmvfc_ae_fpin_status {
642*4882a593Smuzhiyun 	IBMVFC_AE_FPIN_LINK_CONGESTED	= 0x1,
643*4882a593Smuzhiyun 	IBMVFC_AE_FPIN_PORT_CONGESTED	= 0x2,
644*4882a593Smuzhiyun 	IBMVFC_AE_FPIN_PORT_CLEARED	= 0x3,
645*4882a593Smuzhiyun 	IBMVFC_AE_FPIN_PORT_DEGRADED	= 0x4,
646*4882a593Smuzhiyun };
647*4882a593Smuzhiyun 
648*4882a593Smuzhiyun struct ibmvfc_async_crq {
649*4882a593Smuzhiyun 	volatile u8 valid;
650*4882a593Smuzhiyun 	u8 link_state;
651*4882a593Smuzhiyun 	u8 fpin_status;
652*4882a593Smuzhiyun 	u8 pad;
653*4882a593Smuzhiyun 	__be32 pad2;
654*4882a593Smuzhiyun 	volatile __be64 event;
655*4882a593Smuzhiyun 	volatile __be64 scsi_id;
656*4882a593Smuzhiyun 	volatile __be64 wwpn;
657*4882a593Smuzhiyun 	volatile __be64 node_name;
658*4882a593Smuzhiyun 	__be64 reserved;
659*4882a593Smuzhiyun } __packed __aligned(8);
660*4882a593Smuzhiyun 
661*4882a593Smuzhiyun struct ibmvfc_async_crq_queue {
662*4882a593Smuzhiyun 	struct ibmvfc_async_crq *msgs;
663*4882a593Smuzhiyun 	int size, cur;
664*4882a593Smuzhiyun 	dma_addr_t msg_token;
665*4882a593Smuzhiyun };
666*4882a593Smuzhiyun 
667*4882a593Smuzhiyun union ibmvfc_iu {
668*4882a593Smuzhiyun 	struct ibmvfc_mad_common mad_common;
669*4882a593Smuzhiyun 	struct ibmvfc_npiv_login_mad npiv_login;
670*4882a593Smuzhiyun 	struct ibmvfc_npiv_logout_mad npiv_logout;
671*4882a593Smuzhiyun 	struct ibmvfc_discover_targets discover_targets;
672*4882a593Smuzhiyun 	struct ibmvfc_port_login plogi;
673*4882a593Smuzhiyun 	struct ibmvfc_process_login prli;
674*4882a593Smuzhiyun 	struct ibmvfc_move_login move_login;
675*4882a593Smuzhiyun 	struct ibmvfc_query_tgt query_tgt;
676*4882a593Smuzhiyun 	struct ibmvfc_implicit_logout implicit_logout;
677*4882a593Smuzhiyun 	struct ibmvfc_tmf tmf;
678*4882a593Smuzhiyun 	struct ibmvfc_cmd cmd;
679*4882a593Smuzhiyun 	struct ibmvfc_passthru_mad passthru;
680*4882a593Smuzhiyun 	struct ibmvfc_channel_enquiry channel_enquiry;
681*4882a593Smuzhiyun 	struct ibmvfc_channel_setup_mad channel_setup;
682*4882a593Smuzhiyun 	struct ibmvfc_connection_info connection_info;
683*4882a593Smuzhiyun } __packed __aligned(8);
684*4882a593Smuzhiyun 
685*4882a593Smuzhiyun enum ibmvfc_target_action {
686*4882a593Smuzhiyun 	IBMVFC_TGT_ACTION_NONE = 0,
687*4882a593Smuzhiyun 	IBMVFC_TGT_ACTION_INIT,
688*4882a593Smuzhiyun 	IBMVFC_TGT_ACTION_INIT_WAIT,
689*4882a593Smuzhiyun 	IBMVFC_TGT_ACTION_LOGOUT_RPORT,
690*4882a593Smuzhiyun 	IBMVFC_TGT_ACTION_LOGOUT_RPORT_WAIT,
691*4882a593Smuzhiyun 	IBMVFC_TGT_ACTION_DEL_RPORT,
692*4882a593Smuzhiyun 	IBMVFC_TGT_ACTION_DELETED_RPORT,
693*4882a593Smuzhiyun 	IBMVFC_TGT_ACTION_DEL_AND_LOGOUT_RPORT,
694*4882a593Smuzhiyun 	IBMVFC_TGT_ACTION_LOGOUT_DELETED_RPORT,
695*4882a593Smuzhiyun };
696*4882a593Smuzhiyun 
697*4882a593Smuzhiyun struct ibmvfc_target {
698*4882a593Smuzhiyun 	struct list_head queue;
699*4882a593Smuzhiyun 	struct ibmvfc_host *vhost;
700*4882a593Smuzhiyun 	u64 scsi_id;
701*4882a593Smuzhiyun 	u64 wwpn;
702*4882a593Smuzhiyun 	u64 old_scsi_id;
703*4882a593Smuzhiyun 	struct fc_rport *rport;
704*4882a593Smuzhiyun 	int target_id;
705*4882a593Smuzhiyun 	enum ibmvfc_target_action action;
706*4882a593Smuzhiyun 	int need_login;
707*4882a593Smuzhiyun 	int add_rport;
708*4882a593Smuzhiyun 	int init_retries;
709*4882a593Smuzhiyun 	int logo_rcvd;
710*4882a593Smuzhiyun 	u32 cancel_key;
711*4882a593Smuzhiyun 	struct ibmvfc_service_parms service_parms;
712*4882a593Smuzhiyun 	struct ibmvfc_service_parms service_parms_change;
713*4882a593Smuzhiyun 	struct fc_rport_identifiers ids;
714*4882a593Smuzhiyun 	void (*job_step) (struct ibmvfc_target *);
715*4882a593Smuzhiyun 	struct timer_list timer;
716*4882a593Smuzhiyun 	struct kref kref;
717*4882a593Smuzhiyun };
718*4882a593Smuzhiyun 
719*4882a593Smuzhiyun /* a unit of work for the hosting partition */
720*4882a593Smuzhiyun struct ibmvfc_event {
721*4882a593Smuzhiyun 	struct list_head queue;
722*4882a593Smuzhiyun 	struct ibmvfc_host *vhost;
723*4882a593Smuzhiyun 	struct ibmvfc_target *tgt;
724*4882a593Smuzhiyun 	struct scsi_cmnd *cmnd;
725*4882a593Smuzhiyun 	atomic_t free;
726*4882a593Smuzhiyun 	union ibmvfc_iu *xfer_iu;
727*4882a593Smuzhiyun 	void (*done) (struct ibmvfc_event *);
728*4882a593Smuzhiyun 	struct ibmvfc_crq crq;
729*4882a593Smuzhiyun 	union ibmvfc_iu iu;
730*4882a593Smuzhiyun 	union ibmvfc_iu *sync_iu;
731*4882a593Smuzhiyun 	struct srp_direct_buf *ext_list;
732*4882a593Smuzhiyun 	dma_addr_t ext_list_token;
733*4882a593Smuzhiyun 	struct completion comp;
734*4882a593Smuzhiyun 	struct completion *eh_comp;
735*4882a593Smuzhiyun 	struct timer_list timer;
736*4882a593Smuzhiyun };
737*4882a593Smuzhiyun 
738*4882a593Smuzhiyun /* a pool of event structs for use */
739*4882a593Smuzhiyun struct ibmvfc_event_pool {
740*4882a593Smuzhiyun 	struct ibmvfc_event *events;
741*4882a593Smuzhiyun 	u32 size;
742*4882a593Smuzhiyun 	union ibmvfc_iu *iu_storage;
743*4882a593Smuzhiyun 	dma_addr_t iu_token;
744*4882a593Smuzhiyun };
745*4882a593Smuzhiyun 
746*4882a593Smuzhiyun enum ibmvfc_host_action {
747*4882a593Smuzhiyun 	IBMVFC_HOST_ACTION_NONE = 0,
748*4882a593Smuzhiyun 	IBMVFC_HOST_ACTION_RESET,
749*4882a593Smuzhiyun 	IBMVFC_HOST_ACTION_REENABLE,
750*4882a593Smuzhiyun 	IBMVFC_HOST_ACTION_LOGO,
751*4882a593Smuzhiyun 	IBMVFC_HOST_ACTION_LOGO_WAIT,
752*4882a593Smuzhiyun 	IBMVFC_HOST_ACTION_INIT,
753*4882a593Smuzhiyun 	IBMVFC_HOST_ACTION_INIT_WAIT,
754*4882a593Smuzhiyun 	IBMVFC_HOST_ACTION_QUERY,
755*4882a593Smuzhiyun 	IBMVFC_HOST_ACTION_QUERY_TGTS,
756*4882a593Smuzhiyun 	IBMVFC_HOST_ACTION_TGT_DEL,
757*4882a593Smuzhiyun 	IBMVFC_HOST_ACTION_ALLOC_TGTS,
758*4882a593Smuzhiyun 	IBMVFC_HOST_ACTION_TGT_INIT,
759*4882a593Smuzhiyun 	IBMVFC_HOST_ACTION_TGT_DEL_FAILED,
760*4882a593Smuzhiyun };
761*4882a593Smuzhiyun 
762*4882a593Smuzhiyun enum ibmvfc_host_state {
763*4882a593Smuzhiyun 	IBMVFC_NO_CRQ = 0,
764*4882a593Smuzhiyun 	IBMVFC_INITIALIZING,
765*4882a593Smuzhiyun 	IBMVFC_ACTIVE,
766*4882a593Smuzhiyun 	IBMVFC_HALTED,
767*4882a593Smuzhiyun 	IBMVFC_LINK_DOWN,
768*4882a593Smuzhiyun 	IBMVFC_LINK_DEAD,
769*4882a593Smuzhiyun 	IBMVFC_HOST_OFFLINE,
770*4882a593Smuzhiyun };
771*4882a593Smuzhiyun 
772*4882a593Smuzhiyun struct ibmvfc_host {
773*4882a593Smuzhiyun 	char name[8];
774*4882a593Smuzhiyun 	struct list_head queue;
775*4882a593Smuzhiyun 	struct Scsi_Host *host;
776*4882a593Smuzhiyun 	enum ibmvfc_host_state state;
777*4882a593Smuzhiyun 	enum ibmvfc_host_action action;
778*4882a593Smuzhiyun #define IBMVFC_NUM_TRACE_INDEX_BITS		8
779*4882a593Smuzhiyun #define IBMVFC_NUM_TRACE_ENTRIES		(1 << IBMVFC_NUM_TRACE_INDEX_BITS)
780*4882a593Smuzhiyun #define IBMVFC_TRACE_SIZE	(sizeof(struct ibmvfc_trace_entry) * IBMVFC_NUM_TRACE_ENTRIES)
781*4882a593Smuzhiyun 	struct ibmvfc_trace_entry *trace;
782*4882a593Smuzhiyun 	u32 trace_index:IBMVFC_NUM_TRACE_INDEX_BITS;
783*4882a593Smuzhiyun 	int num_targets;
784*4882a593Smuzhiyun 	struct list_head targets;
785*4882a593Smuzhiyun 	struct list_head sent;
786*4882a593Smuzhiyun 	struct list_head free;
787*4882a593Smuzhiyun 	struct device *dev;
788*4882a593Smuzhiyun 	struct ibmvfc_event_pool pool;
789*4882a593Smuzhiyun 	struct dma_pool *sg_pool;
790*4882a593Smuzhiyun 	mempool_t *tgt_pool;
791*4882a593Smuzhiyun 	struct ibmvfc_crq_queue crq;
792*4882a593Smuzhiyun 	struct ibmvfc_async_crq_queue async_crq;
793*4882a593Smuzhiyun 	struct ibmvfc_npiv_login login_info;
794*4882a593Smuzhiyun 	union ibmvfc_npiv_login_data *login_buf;
795*4882a593Smuzhiyun 	dma_addr_t login_buf_dma;
796*4882a593Smuzhiyun 	int disc_buf_sz;
797*4882a593Smuzhiyun 	int log_level;
798*4882a593Smuzhiyun 	struct ibmvfc_discover_targets_entry *disc_buf;
799*4882a593Smuzhiyun 	struct mutex passthru_mutex;
800*4882a593Smuzhiyun 	int task_set;
801*4882a593Smuzhiyun 	int init_retries;
802*4882a593Smuzhiyun 	int discovery_threads;
803*4882a593Smuzhiyun 	int abort_threads;
804*4882a593Smuzhiyun 	int client_migrated;
805*4882a593Smuzhiyun 	int reinit;
806*4882a593Smuzhiyun 	int delay_init;
807*4882a593Smuzhiyun 	int scan_complete;
808*4882a593Smuzhiyun 	int logged_in;
809*4882a593Smuzhiyun 	int aborting_passthru;
810*4882a593Smuzhiyun 	int events_to_log;
811*4882a593Smuzhiyun #define IBMVFC_AE_LINKUP	0x0001
812*4882a593Smuzhiyun #define IBMVFC_AE_LINKDOWN	0x0002
813*4882a593Smuzhiyun #define IBMVFC_AE_RSCN		0x0004
814*4882a593Smuzhiyun 	dma_addr_t disc_buf_dma;
815*4882a593Smuzhiyun 	unsigned int partition_number;
816*4882a593Smuzhiyun 	char partition_name[97];
817*4882a593Smuzhiyun 	void (*job_step) (struct ibmvfc_host *);
818*4882a593Smuzhiyun 	struct task_struct *work_thread;
819*4882a593Smuzhiyun 	struct tasklet_struct tasklet;
820*4882a593Smuzhiyun 	struct work_struct rport_add_work_q;
821*4882a593Smuzhiyun 	wait_queue_head_t init_wait_q;
822*4882a593Smuzhiyun 	wait_queue_head_t work_wait_q;
823*4882a593Smuzhiyun };
824*4882a593Smuzhiyun 
825*4882a593Smuzhiyun #define DBG_CMD(CMD) do { if (ibmvfc_debug) CMD; } while (0)
826*4882a593Smuzhiyun 
827*4882a593Smuzhiyun #define tgt_dbg(t, fmt, ...)			\
828*4882a593Smuzhiyun 	DBG_CMD(dev_info((t)->vhost->dev, "%llX: " fmt, (t)->scsi_id, ##__VA_ARGS__))
829*4882a593Smuzhiyun 
830*4882a593Smuzhiyun #define tgt_info(t, fmt, ...)		\
831*4882a593Smuzhiyun 	dev_info((t)->vhost->dev, "%llX: " fmt, (t)->scsi_id, ##__VA_ARGS__)
832*4882a593Smuzhiyun 
833*4882a593Smuzhiyun #define tgt_err(t, fmt, ...)		\
834*4882a593Smuzhiyun 	dev_err((t)->vhost->dev, "%llX: " fmt, (t)->scsi_id, ##__VA_ARGS__)
835*4882a593Smuzhiyun 
836*4882a593Smuzhiyun #define tgt_log(t, level, fmt, ...) \
837*4882a593Smuzhiyun 	do { \
838*4882a593Smuzhiyun 		if ((t)->vhost->log_level >= level) \
839*4882a593Smuzhiyun 			tgt_err(t, fmt, ##__VA_ARGS__); \
840*4882a593Smuzhiyun 	} while (0)
841*4882a593Smuzhiyun 
842*4882a593Smuzhiyun #define ibmvfc_dbg(vhost, ...) \
843*4882a593Smuzhiyun 	DBG_CMD(dev_info((vhost)->dev, ##__VA_ARGS__))
844*4882a593Smuzhiyun 
845*4882a593Smuzhiyun #define ibmvfc_log(vhost, level, ...) \
846*4882a593Smuzhiyun 	do { \
847*4882a593Smuzhiyun 		if ((vhost)->log_level >= level) \
848*4882a593Smuzhiyun 			dev_err((vhost)->dev, ##__VA_ARGS__); \
849*4882a593Smuzhiyun 	} while (0)
850*4882a593Smuzhiyun 
851*4882a593Smuzhiyun #define ENTER DBG_CMD(printk(KERN_INFO IBMVFC_NAME": Entering %s\n", __func__))
852*4882a593Smuzhiyun #define LEAVE DBG_CMD(printk(KERN_INFO IBMVFC_NAME": Leaving %s\n", __func__))
853*4882a593Smuzhiyun 
854*4882a593Smuzhiyun #ifdef CONFIG_SCSI_IBMVFC_TRACE
855*4882a593Smuzhiyun #define ibmvfc_create_trace_file(kobj, attr) sysfs_create_bin_file(kobj, attr)
856*4882a593Smuzhiyun #define ibmvfc_remove_trace_file(kobj, attr) sysfs_remove_bin_file(kobj, attr)
857*4882a593Smuzhiyun #else
858*4882a593Smuzhiyun #define ibmvfc_create_trace_file(kobj, attr) 0
859*4882a593Smuzhiyun #define ibmvfc_remove_trace_file(kobj, attr) do { } while (0)
860*4882a593Smuzhiyun #endif
861*4882a593Smuzhiyun 
862*4882a593Smuzhiyun #endif
863