xref: /openbmc/linux/drivers/scsi/ibmvscsi/ibmvfc.c (revision bef7a78d)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * ibmvfc.c -- driver for IBM Power Virtual Fibre Channel Adapter
4  *
5  * Written By: Brian King <brking@linux.vnet.ibm.com>, IBM Corporation
6  *
7  * Copyright (C) IBM Corporation, 2008
8  */
9 
10 #include <linux/module.h>
11 #include <linux/moduleparam.h>
12 #include <linux/dma-mapping.h>
13 #include <linux/dmapool.h>
14 #include <linux/delay.h>
15 #include <linux/interrupt.h>
16 #include <linux/kthread.h>
17 #include <linux/slab.h>
18 #include <linux/of.h>
19 #include <linux/pm.h>
20 #include <linux/stringify.h>
21 #include <linux/bsg-lib.h>
22 #include <asm/firmware.h>
23 #include <asm/irq.h>
24 #include <asm/vio.h>
25 #include <scsi/scsi.h>
26 #include <scsi/scsi_cmnd.h>
27 #include <scsi/scsi_host.h>
28 #include <scsi/scsi_device.h>
29 #include <scsi/scsi_tcq.h>
30 #include <scsi/scsi_transport_fc.h>
31 #include <scsi/scsi_bsg_fc.h>
32 #include "ibmvfc.h"
33 
34 static unsigned int init_timeout = IBMVFC_INIT_TIMEOUT;
35 static unsigned int default_timeout = IBMVFC_DEFAULT_TIMEOUT;
36 static u64 max_lun = IBMVFC_MAX_LUN;
37 static unsigned int max_targets = IBMVFC_MAX_TARGETS;
38 static unsigned int max_requests = IBMVFC_MAX_REQUESTS_DEFAULT;
39 static unsigned int disc_threads = IBMVFC_MAX_DISC_THREADS;
40 static unsigned int ibmvfc_debug = IBMVFC_DEBUG;
41 static unsigned int log_level = IBMVFC_DEFAULT_LOG_LEVEL;
42 static unsigned int cls3_error = IBMVFC_CLS3_ERROR;
43 static LIST_HEAD(ibmvfc_head);
44 static DEFINE_SPINLOCK(ibmvfc_driver_lock);
45 static struct scsi_transport_template *ibmvfc_transport_template;
46 
47 MODULE_DESCRIPTION("IBM Virtual Fibre Channel Driver");
48 MODULE_AUTHOR("Brian King <brking@linux.vnet.ibm.com>");
49 MODULE_LICENSE("GPL");
50 MODULE_VERSION(IBMVFC_DRIVER_VERSION);
51 
52 module_param_named(init_timeout, init_timeout, uint, S_IRUGO | S_IWUSR);
53 MODULE_PARM_DESC(init_timeout, "Initialization timeout in seconds. "
54 		 "[Default=" __stringify(IBMVFC_INIT_TIMEOUT) "]");
55 module_param_named(default_timeout, default_timeout, uint, S_IRUGO | S_IWUSR);
56 MODULE_PARM_DESC(default_timeout,
57 		 "Default timeout in seconds for initialization and EH commands. "
58 		 "[Default=" __stringify(IBMVFC_DEFAULT_TIMEOUT) "]");
59 module_param_named(max_requests, max_requests, uint, S_IRUGO);
60 MODULE_PARM_DESC(max_requests, "Maximum requests for this adapter. "
61 		 "[Default=" __stringify(IBMVFC_MAX_REQUESTS_DEFAULT) "]");
62 module_param_named(max_lun, max_lun, ullong, S_IRUGO);
63 MODULE_PARM_DESC(max_lun, "Maximum allowed LUN. "
64 		 "[Default=" __stringify(IBMVFC_MAX_LUN) "]");
65 module_param_named(max_targets, max_targets, uint, S_IRUGO);
66 MODULE_PARM_DESC(max_targets, "Maximum allowed targets. "
67 		 "[Default=" __stringify(IBMVFC_MAX_TARGETS) "]");
68 module_param_named(disc_threads, disc_threads, uint, S_IRUGO);
69 MODULE_PARM_DESC(disc_threads, "Number of device discovery threads to use. "
70 		 "[Default=" __stringify(IBMVFC_MAX_DISC_THREADS) "]");
71 module_param_named(debug, ibmvfc_debug, uint, S_IRUGO | S_IWUSR);
72 MODULE_PARM_DESC(debug, "Enable driver debug information. "
73 		 "[Default=" __stringify(IBMVFC_DEBUG) "]");
74 module_param_named(log_level, log_level, uint, 0);
75 MODULE_PARM_DESC(log_level, "Set to 0 - 4 for increasing verbosity of device driver. "
76 		 "[Default=" __stringify(IBMVFC_DEFAULT_LOG_LEVEL) "]");
77 module_param_named(cls3_error, cls3_error, uint, 0);
78 MODULE_PARM_DESC(cls3_error, "Enable FC Class 3 Error Recovery. "
79 		 "[Default=" __stringify(IBMVFC_CLS3_ERROR) "]");
80 
81 static const struct {
82 	u16 status;
83 	u16 error;
84 	u8 result;
85 	u8 retry;
86 	int log;
87 	char *name;
88 } cmd_status [] = {
89 	{ IBMVFC_FABRIC_MAPPED, IBMVFC_UNABLE_TO_ESTABLISH, DID_ERROR, 1, 1, "unable to establish" },
90 	{ IBMVFC_FABRIC_MAPPED, IBMVFC_XPORT_FAULT, DID_OK, 1, 0, "transport fault" },
91 	{ IBMVFC_FABRIC_MAPPED, IBMVFC_CMD_TIMEOUT, DID_TIME_OUT, 1, 1, "command timeout" },
92 	{ IBMVFC_FABRIC_MAPPED, IBMVFC_ENETDOWN, DID_TRANSPORT_DISRUPTED, 1, 1, "network down" },
93 	{ IBMVFC_FABRIC_MAPPED, IBMVFC_HW_FAILURE, DID_ERROR, 1, 1, "hardware failure" },
94 	{ IBMVFC_FABRIC_MAPPED, IBMVFC_LINK_DOWN_ERR, DID_REQUEUE, 0, 0, "link down" },
95 	{ IBMVFC_FABRIC_MAPPED, IBMVFC_LINK_DEAD_ERR, DID_ERROR, 0, 0, "link dead" },
96 	{ IBMVFC_FABRIC_MAPPED, IBMVFC_UNABLE_TO_REGISTER, DID_ERROR, 1, 1, "unable to register" },
97 	{ IBMVFC_FABRIC_MAPPED, IBMVFC_XPORT_BUSY, DID_BUS_BUSY, 1, 0, "transport busy" },
98 	{ IBMVFC_FABRIC_MAPPED, IBMVFC_XPORT_DEAD, DID_ERROR, 0, 1, "transport dead" },
99 	{ IBMVFC_FABRIC_MAPPED, IBMVFC_CONFIG_ERROR, DID_ERROR, 1, 1, "configuration error" },
100 	{ IBMVFC_FABRIC_MAPPED, IBMVFC_NAME_SERVER_FAIL, DID_ERROR, 1, 1, "name server failure" },
101 	{ IBMVFC_FABRIC_MAPPED, IBMVFC_LINK_HALTED, DID_REQUEUE, 1, 0, "link halted" },
102 	{ IBMVFC_FABRIC_MAPPED, IBMVFC_XPORT_GENERAL, DID_OK, 1, 0, "general transport error" },
103 
104 	{ IBMVFC_VIOS_FAILURE, IBMVFC_CRQ_FAILURE, DID_REQUEUE, 1, 1, "CRQ failure" },
105 	{ IBMVFC_VIOS_FAILURE, IBMVFC_SW_FAILURE, DID_ERROR, 0, 1, "software failure" },
106 	{ IBMVFC_VIOS_FAILURE, IBMVFC_INVALID_PARAMETER, DID_ERROR, 0, 1, "invalid parameter" },
107 	{ IBMVFC_VIOS_FAILURE, IBMVFC_MISSING_PARAMETER, DID_ERROR, 0, 1, "missing parameter" },
108 	{ IBMVFC_VIOS_FAILURE, IBMVFC_HOST_IO_BUS, DID_ERROR, 1, 1, "host I/O bus failure" },
109 	{ IBMVFC_VIOS_FAILURE, IBMVFC_TRANS_CANCELLED, DID_ERROR, 0, 1, "transaction cancelled" },
110 	{ IBMVFC_VIOS_FAILURE, IBMVFC_TRANS_CANCELLED_IMPLICIT, DID_ERROR, 0, 1, "transaction cancelled implicit" },
111 	{ IBMVFC_VIOS_FAILURE, IBMVFC_INSUFFICIENT_RESOURCE, DID_REQUEUE, 1, 1, "insufficient resources" },
112 	{ IBMVFC_VIOS_FAILURE, IBMVFC_PLOGI_REQUIRED, DID_ERROR, 0, 1, "port login required" },
113 	{ IBMVFC_VIOS_FAILURE, IBMVFC_COMMAND_FAILED, DID_ERROR, 1, 1, "command failed" },
114 
115 	{ IBMVFC_FC_FAILURE, IBMVFC_INVALID_ELS_CMD_CODE, DID_ERROR, 0, 1, "invalid ELS command code" },
116 	{ IBMVFC_FC_FAILURE, IBMVFC_INVALID_VERSION, DID_ERROR, 0, 1, "invalid version level" },
117 	{ IBMVFC_FC_FAILURE, IBMVFC_LOGICAL_ERROR, DID_ERROR, 1, 1, "logical error" },
118 	{ IBMVFC_FC_FAILURE, IBMVFC_INVALID_CT_IU_SIZE, DID_ERROR, 0, 1, "invalid CT_IU size" },
119 	{ IBMVFC_FC_FAILURE, IBMVFC_LOGICAL_BUSY, DID_REQUEUE, 1, 0, "logical busy" },
120 	{ IBMVFC_FC_FAILURE, IBMVFC_PROTOCOL_ERROR, DID_ERROR, 1, 1, "protocol error" },
121 	{ IBMVFC_FC_FAILURE, IBMVFC_UNABLE_TO_PERFORM_REQ, DID_ERROR, 1, 1, "unable to perform request" },
122 	{ IBMVFC_FC_FAILURE, IBMVFC_CMD_NOT_SUPPORTED, DID_ERROR, 0, 0, "command not supported" },
123 	{ IBMVFC_FC_FAILURE, IBMVFC_SERVER_NOT_AVAIL, DID_ERROR, 0, 1, "server not available" },
124 	{ IBMVFC_FC_FAILURE, IBMVFC_CMD_IN_PROGRESS, DID_ERROR, 0, 1, "command already in progress" },
125 	{ IBMVFC_FC_FAILURE, IBMVFC_VENDOR_SPECIFIC, DID_ERROR, 1, 1, "vendor specific" },
126 
127 	{ IBMVFC_FC_SCSI_ERROR, 0, DID_OK, 1, 0, "SCSI error" },
128 	{ IBMVFC_FC_SCSI_ERROR, IBMVFC_COMMAND_FAILED, DID_ERROR, 0, 1, "PRLI to device failed." },
129 };
130 
131 static void ibmvfc_npiv_login(struct ibmvfc_host *);
132 static void ibmvfc_tgt_send_prli(struct ibmvfc_target *);
133 static void ibmvfc_tgt_send_plogi(struct ibmvfc_target *);
134 static void ibmvfc_tgt_query_target(struct ibmvfc_target *);
135 static void ibmvfc_npiv_logout(struct ibmvfc_host *);
136 static void ibmvfc_tgt_implicit_logout_and_del(struct ibmvfc_target *);
137 static void ibmvfc_tgt_move_login(struct ibmvfc_target *);
138 
139 static const char *unknown_error = "unknown error";
140 
141 static int ibmvfc_check_caps(struct ibmvfc_host *vhost, unsigned long cap_flags)
142 {
143 	u64 host_caps = be64_to_cpu(vhost->login_buf->resp.capabilities);
144 
145 	return (host_caps & cap_flags) ? 1 : 0;
146 }
147 
148 static struct ibmvfc_fcp_cmd_iu *ibmvfc_get_fcp_iu(struct ibmvfc_host *vhost,
149 						   struct ibmvfc_cmd *vfc_cmd)
150 {
151 	if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN))
152 		return &vfc_cmd->v2.iu;
153 	else
154 		return &vfc_cmd->v1.iu;
155 }
156 
157 static struct ibmvfc_fcp_rsp *ibmvfc_get_fcp_rsp(struct ibmvfc_host *vhost,
158 						 struct ibmvfc_cmd *vfc_cmd)
159 {
160 	if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN))
161 		return &vfc_cmd->v2.rsp;
162 	else
163 		return &vfc_cmd->v1.rsp;
164 }
165 
166 #ifdef CONFIG_SCSI_IBMVFC_TRACE
167 /**
168  * ibmvfc_trc_start - Log a start trace entry
169  * @evt:		ibmvfc event struct
170  *
171  **/
172 static void ibmvfc_trc_start(struct ibmvfc_event *evt)
173 {
174 	struct ibmvfc_host *vhost = evt->vhost;
175 	struct ibmvfc_cmd *vfc_cmd = &evt->iu.cmd;
176 	struct ibmvfc_mad_common *mad = &evt->iu.mad_common;
177 	struct ibmvfc_fcp_cmd_iu *iu = ibmvfc_get_fcp_iu(vhost, vfc_cmd);
178 	struct ibmvfc_trace_entry *entry;
179 
180 	entry = &vhost->trace[vhost->trace_index++];
181 	entry->evt = evt;
182 	entry->time = jiffies;
183 	entry->fmt = evt->crq.format;
184 	entry->type = IBMVFC_TRC_START;
185 
186 	switch (entry->fmt) {
187 	case IBMVFC_CMD_FORMAT:
188 		entry->op_code = iu->cdb[0];
189 		entry->scsi_id = be64_to_cpu(vfc_cmd->tgt_scsi_id);
190 		entry->lun = scsilun_to_int(&iu->lun);
191 		entry->tmf_flags = iu->tmf_flags;
192 		entry->u.start.xfer_len = be32_to_cpu(iu->xfer_len);
193 		break;
194 	case IBMVFC_MAD_FORMAT:
195 		entry->op_code = be32_to_cpu(mad->opcode);
196 		break;
197 	default:
198 		break;
199 	}
200 }
201 
202 /**
203  * ibmvfc_trc_end - Log an end trace entry
204  * @evt:		ibmvfc event struct
205  *
206  **/
207 static void ibmvfc_trc_end(struct ibmvfc_event *evt)
208 {
209 	struct ibmvfc_host *vhost = evt->vhost;
210 	struct ibmvfc_cmd *vfc_cmd = &evt->xfer_iu->cmd;
211 	struct ibmvfc_mad_common *mad = &evt->xfer_iu->mad_common;
212 	struct ibmvfc_fcp_cmd_iu *iu = ibmvfc_get_fcp_iu(vhost, vfc_cmd);
213 	struct ibmvfc_fcp_rsp *rsp = ibmvfc_get_fcp_rsp(vhost, vfc_cmd);
214 	struct ibmvfc_trace_entry *entry = &vhost->trace[vhost->trace_index++];
215 
216 	entry->evt = evt;
217 	entry->time = jiffies;
218 	entry->fmt = evt->crq.format;
219 	entry->type = IBMVFC_TRC_END;
220 
221 	switch (entry->fmt) {
222 	case IBMVFC_CMD_FORMAT:
223 		entry->op_code = iu->cdb[0];
224 		entry->scsi_id = be64_to_cpu(vfc_cmd->tgt_scsi_id);
225 		entry->lun = scsilun_to_int(&iu->lun);
226 		entry->tmf_flags = iu->tmf_flags;
227 		entry->u.end.status = be16_to_cpu(vfc_cmd->status);
228 		entry->u.end.error = be16_to_cpu(vfc_cmd->error);
229 		entry->u.end.fcp_rsp_flags = rsp->flags;
230 		entry->u.end.rsp_code = rsp->data.info.rsp_code;
231 		entry->u.end.scsi_status = rsp->scsi_status;
232 		break;
233 	case IBMVFC_MAD_FORMAT:
234 		entry->op_code = be32_to_cpu(mad->opcode);
235 		entry->u.end.status = be16_to_cpu(mad->status);
236 		break;
237 	default:
238 		break;
239 
240 	}
241 }
242 
243 #else
244 #define ibmvfc_trc_start(evt) do { } while (0)
245 #define ibmvfc_trc_end(evt) do { } while (0)
246 #endif
247 
248 /**
249  * ibmvfc_get_err_index - Find the index into cmd_status for the fcp response
250  * @status:		status / error class
251  * @error:		error
252  *
253  * Return value:
254  *	index into cmd_status / -EINVAL on failure
255  **/
256 static int ibmvfc_get_err_index(u16 status, u16 error)
257 {
258 	int i;
259 
260 	for (i = 0; i < ARRAY_SIZE(cmd_status); i++)
261 		if ((cmd_status[i].status & status) == cmd_status[i].status &&
262 		    cmd_status[i].error == error)
263 			return i;
264 
265 	return -EINVAL;
266 }
267 
268 /**
269  * ibmvfc_get_cmd_error - Find the error description for the fcp response
270  * @status:		status / error class
271  * @error:		error
272  *
273  * Return value:
274  *	error description string
275  **/
276 static const char *ibmvfc_get_cmd_error(u16 status, u16 error)
277 {
278 	int rc = ibmvfc_get_err_index(status, error);
279 	if (rc >= 0)
280 		return cmd_status[rc].name;
281 	return unknown_error;
282 }
283 
284 /**
285  * ibmvfc_get_err_result - Find the scsi status to return for the fcp response
286  * @vfc_cmd:	ibmvfc command struct
287  *
288  * Return value:
289  *	SCSI result value to return for completed command
290  **/
291 static int ibmvfc_get_err_result(struct ibmvfc_host *vhost, struct ibmvfc_cmd *vfc_cmd)
292 {
293 	int err;
294 	struct ibmvfc_fcp_rsp *rsp = ibmvfc_get_fcp_rsp(vhost, vfc_cmd);
295 	int fc_rsp_len = be32_to_cpu(rsp->fcp_rsp_len);
296 
297 	if ((rsp->flags & FCP_RSP_LEN_VALID) &&
298 	    ((fc_rsp_len && fc_rsp_len != 4 && fc_rsp_len != 8) ||
299 	     rsp->data.info.rsp_code))
300 		return DID_ERROR << 16;
301 
302 	err = ibmvfc_get_err_index(be16_to_cpu(vfc_cmd->status), be16_to_cpu(vfc_cmd->error));
303 	if (err >= 0)
304 		return rsp->scsi_status | (cmd_status[err].result << 16);
305 	return rsp->scsi_status | (DID_ERROR << 16);
306 }
307 
308 /**
309  * ibmvfc_retry_cmd - Determine if error status is retryable
310  * @status:		status / error class
311  * @error:		error
312  *
313  * Return value:
314  *	1 if error should be retried / 0 if it should not
315  **/
316 static int ibmvfc_retry_cmd(u16 status, u16 error)
317 {
318 	int rc = ibmvfc_get_err_index(status, error);
319 
320 	if (rc >= 0)
321 		return cmd_status[rc].retry;
322 	return 1;
323 }
324 
325 static const char *unknown_fc_explain = "unknown fc explain";
326 
327 static const struct {
328 	u16 fc_explain;
329 	char *name;
330 } ls_explain [] = {
331 	{ 0x00, "no additional explanation" },
332 	{ 0x01, "service parameter error - options" },
333 	{ 0x03, "service parameter error - initiator control" },
334 	{ 0x05, "service parameter error - recipient control" },
335 	{ 0x07, "service parameter error - received data field size" },
336 	{ 0x09, "service parameter error - concurrent seq" },
337 	{ 0x0B, "service parameter error - credit" },
338 	{ 0x0D, "invalid N_Port/F_Port_Name" },
339 	{ 0x0E, "invalid node/Fabric Name" },
340 	{ 0x0F, "invalid common service parameters" },
341 	{ 0x11, "invalid association header" },
342 	{ 0x13, "association header required" },
343 	{ 0x15, "invalid originator S_ID" },
344 	{ 0x17, "invalid OX_ID-RX-ID combination" },
345 	{ 0x19, "command (request) already in progress" },
346 	{ 0x1E, "N_Port Login requested" },
347 	{ 0x1F, "Invalid N_Port_ID" },
348 };
349 
350 static const struct {
351 	u16 fc_explain;
352 	char *name;
353 } gs_explain [] = {
354 	{ 0x00, "no additional explanation" },
355 	{ 0x01, "port identifier not registered" },
356 	{ 0x02, "port name not registered" },
357 	{ 0x03, "node name not registered" },
358 	{ 0x04, "class of service not registered" },
359 	{ 0x06, "initial process associator not registered" },
360 	{ 0x07, "FC-4 TYPEs not registered" },
361 	{ 0x08, "symbolic port name not registered" },
362 	{ 0x09, "symbolic node name not registered" },
363 	{ 0x0A, "port type not registered" },
364 	{ 0xF0, "authorization exception" },
365 	{ 0xF1, "authentication exception" },
366 	{ 0xF2, "data base full" },
367 	{ 0xF3, "data base empty" },
368 	{ 0xF4, "processing request" },
369 	{ 0xF5, "unable to verify connection" },
370 	{ 0xF6, "devices not in a common zone" },
371 };
372 
373 /**
374  * ibmvfc_get_ls_explain - Return the FC Explain description text
375  * @status:	FC Explain status
376  *
377  * Returns:
378  *	error string
379  **/
380 static const char *ibmvfc_get_ls_explain(u16 status)
381 {
382 	int i;
383 
384 	for (i = 0; i < ARRAY_SIZE(ls_explain); i++)
385 		if (ls_explain[i].fc_explain == status)
386 			return ls_explain[i].name;
387 
388 	return unknown_fc_explain;
389 }
390 
391 /**
392  * ibmvfc_get_gs_explain - Return the FC Explain description text
393  * @status:	FC Explain status
394  *
395  * Returns:
396  *	error string
397  **/
398 static const char *ibmvfc_get_gs_explain(u16 status)
399 {
400 	int i;
401 
402 	for (i = 0; i < ARRAY_SIZE(gs_explain); i++)
403 		if (gs_explain[i].fc_explain == status)
404 			return gs_explain[i].name;
405 
406 	return unknown_fc_explain;
407 }
408 
409 static const struct {
410 	enum ibmvfc_fc_type fc_type;
411 	char *name;
412 } fc_type [] = {
413 	{ IBMVFC_FABRIC_REJECT, "fabric reject" },
414 	{ IBMVFC_PORT_REJECT, "port reject" },
415 	{ IBMVFC_LS_REJECT, "ELS reject" },
416 	{ IBMVFC_FABRIC_BUSY, "fabric busy" },
417 	{ IBMVFC_PORT_BUSY, "port busy" },
418 	{ IBMVFC_BASIC_REJECT, "basic reject" },
419 };
420 
421 static const char *unknown_fc_type = "unknown fc type";
422 
423 /**
424  * ibmvfc_get_fc_type - Return the FC Type description text
425  * @status:	FC Type error status
426  *
427  * Returns:
428  *	error string
429  **/
430 static const char *ibmvfc_get_fc_type(u16 status)
431 {
432 	int i;
433 
434 	for (i = 0; i < ARRAY_SIZE(fc_type); i++)
435 		if (fc_type[i].fc_type == status)
436 			return fc_type[i].name;
437 
438 	return unknown_fc_type;
439 }
440 
441 /**
442  * ibmvfc_set_tgt_action - Set the next init action for the target
443  * @tgt:		ibmvfc target struct
444  * @action:		action to perform
445  *
446  * Returns:
447  *	0 if action changed / non-zero if not changed
448  **/
449 static int ibmvfc_set_tgt_action(struct ibmvfc_target *tgt,
450 				  enum ibmvfc_target_action action)
451 {
452 	int rc = -EINVAL;
453 
454 	switch (tgt->action) {
455 	case IBMVFC_TGT_ACTION_LOGOUT_RPORT:
456 		if (action == IBMVFC_TGT_ACTION_LOGOUT_RPORT_WAIT ||
457 		    action == IBMVFC_TGT_ACTION_DEL_RPORT) {
458 			tgt->action = action;
459 			rc = 0;
460 		}
461 		break;
462 	case IBMVFC_TGT_ACTION_LOGOUT_RPORT_WAIT:
463 		if (action == IBMVFC_TGT_ACTION_DEL_RPORT ||
464 		    action == IBMVFC_TGT_ACTION_DEL_AND_LOGOUT_RPORT) {
465 			tgt->action = action;
466 			rc = 0;
467 		}
468 		break;
469 	case IBMVFC_TGT_ACTION_LOGOUT_DELETED_RPORT:
470 		if (action == IBMVFC_TGT_ACTION_LOGOUT_RPORT) {
471 			tgt->action = action;
472 			rc = 0;
473 		}
474 		break;
475 	case IBMVFC_TGT_ACTION_DEL_AND_LOGOUT_RPORT:
476 		if (action == IBMVFC_TGT_ACTION_LOGOUT_DELETED_RPORT) {
477 			tgt->action = action;
478 			rc = 0;
479 		}
480 		break;
481 	case IBMVFC_TGT_ACTION_DEL_RPORT:
482 		if (action == IBMVFC_TGT_ACTION_DELETED_RPORT) {
483 			tgt->action = action;
484 			rc = 0;
485 		}
486 		break;
487 	case IBMVFC_TGT_ACTION_DELETED_RPORT:
488 		break;
489 	default:
490 		tgt->action = action;
491 		rc = 0;
492 		break;
493 	}
494 
495 	if (action >= IBMVFC_TGT_ACTION_LOGOUT_RPORT)
496 		tgt->add_rport = 0;
497 
498 	return rc;
499 }
500 
501 /**
502  * ibmvfc_set_host_state - Set the state for the host
503  * @vhost:		ibmvfc host struct
504  * @state:		state to set host to
505  *
506  * Returns:
507  *	0 if state changed / non-zero if not changed
508  **/
509 static int ibmvfc_set_host_state(struct ibmvfc_host *vhost,
510 				  enum ibmvfc_host_state state)
511 {
512 	int rc = 0;
513 
514 	switch (vhost->state) {
515 	case IBMVFC_HOST_OFFLINE:
516 		rc = -EINVAL;
517 		break;
518 	default:
519 		vhost->state = state;
520 		break;
521 	}
522 
523 	return rc;
524 }
525 
526 /**
527  * ibmvfc_set_host_action - Set the next init action for the host
528  * @vhost:		ibmvfc host struct
529  * @action:		action to perform
530  *
531  **/
532 static void ibmvfc_set_host_action(struct ibmvfc_host *vhost,
533 				   enum ibmvfc_host_action action)
534 {
535 	switch (action) {
536 	case IBMVFC_HOST_ACTION_ALLOC_TGTS:
537 		if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT)
538 			vhost->action = action;
539 		break;
540 	case IBMVFC_HOST_ACTION_LOGO_WAIT:
541 		if (vhost->action == IBMVFC_HOST_ACTION_LOGO)
542 			vhost->action = action;
543 		break;
544 	case IBMVFC_HOST_ACTION_INIT_WAIT:
545 		if (vhost->action == IBMVFC_HOST_ACTION_INIT)
546 			vhost->action = action;
547 		break;
548 	case IBMVFC_HOST_ACTION_QUERY:
549 		switch (vhost->action) {
550 		case IBMVFC_HOST_ACTION_INIT_WAIT:
551 		case IBMVFC_HOST_ACTION_NONE:
552 		case IBMVFC_HOST_ACTION_TGT_DEL_FAILED:
553 			vhost->action = action;
554 			break;
555 		default:
556 			break;
557 		}
558 		break;
559 	case IBMVFC_HOST_ACTION_TGT_INIT:
560 		if (vhost->action == IBMVFC_HOST_ACTION_ALLOC_TGTS)
561 			vhost->action = action;
562 		break;
563 	case IBMVFC_HOST_ACTION_INIT:
564 	case IBMVFC_HOST_ACTION_TGT_DEL:
565 		switch (vhost->action) {
566 		case IBMVFC_HOST_ACTION_RESET:
567 		case IBMVFC_HOST_ACTION_REENABLE:
568 			break;
569 		default:
570 			vhost->action = action;
571 			break;
572 		}
573 		break;
574 	case IBMVFC_HOST_ACTION_LOGO:
575 	case IBMVFC_HOST_ACTION_QUERY_TGTS:
576 	case IBMVFC_HOST_ACTION_TGT_DEL_FAILED:
577 	case IBMVFC_HOST_ACTION_NONE:
578 	case IBMVFC_HOST_ACTION_RESET:
579 	case IBMVFC_HOST_ACTION_REENABLE:
580 	default:
581 		vhost->action = action;
582 		break;
583 	}
584 }
585 
586 /**
587  * ibmvfc_reinit_host - Re-start host initialization (no NPIV Login)
588  * @vhost:		ibmvfc host struct
589  *
590  * Return value:
591  *	nothing
592  **/
593 static void ibmvfc_reinit_host(struct ibmvfc_host *vhost)
594 {
595 	if (vhost->action == IBMVFC_HOST_ACTION_NONE &&
596 	    vhost->state == IBMVFC_ACTIVE) {
597 		if (!ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) {
598 			scsi_block_requests(vhost->host);
599 			ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY);
600 		}
601 	} else
602 		vhost->reinit = 1;
603 
604 	wake_up(&vhost->work_wait_q);
605 }
606 
607 /**
608  * ibmvfc_del_tgt - Schedule cleanup and removal of the target
609  * @tgt:		ibmvfc target struct
610  * @job_step:	job step to perform
611  *
612  **/
613 static void ibmvfc_del_tgt(struct ibmvfc_target *tgt)
614 {
615 	if (!ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_LOGOUT_RPORT))
616 		tgt->job_step = ibmvfc_tgt_implicit_logout_and_del;
617 	wake_up(&tgt->vhost->work_wait_q);
618 }
619 
620 /**
621  * ibmvfc_link_down - Handle a link down event from the adapter
622  * @vhost:	ibmvfc host struct
623  * @state:	ibmvfc host state to enter
624  *
625  **/
626 static void ibmvfc_link_down(struct ibmvfc_host *vhost,
627 			     enum ibmvfc_host_state state)
628 {
629 	struct ibmvfc_target *tgt;
630 
631 	ENTER;
632 	scsi_block_requests(vhost->host);
633 	list_for_each_entry(tgt, &vhost->targets, queue)
634 		ibmvfc_del_tgt(tgt);
635 	ibmvfc_set_host_state(vhost, state);
636 	ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_DEL);
637 	vhost->events_to_log |= IBMVFC_AE_LINKDOWN;
638 	wake_up(&vhost->work_wait_q);
639 	LEAVE;
640 }
641 
642 /**
643  * ibmvfc_init_host - Start host initialization
644  * @vhost:		ibmvfc host struct
645  *
646  * Return value:
647  *	nothing
648  **/
649 static void ibmvfc_init_host(struct ibmvfc_host *vhost)
650 {
651 	struct ibmvfc_target *tgt;
652 
653 	if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) {
654 		if (++vhost->init_retries > IBMVFC_MAX_HOST_INIT_RETRIES) {
655 			dev_err(vhost->dev,
656 				"Host initialization retries exceeded. Taking adapter offline\n");
657 			ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE);
658 			return;
659 		}
660 	}
661 
662 	if (!ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) {
663 		memset(vhost->async_crq.msgs, 0, PAGE_SIZE);
664 		vhost->async_crq.cur = 0;
665 
666 		list_for_each_entry(tgt, &vhost->targets, queue)
667 			ibmvfc_del_tgt(tgt);
668 		scsi_block_requests(vhost->host);
669 		ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT);
670 		vhost->job_step = ibmvfc_npiv_login;
671 		wake_up(&vhost->work_wait_q);
672 	}
673 }
674 
675 /**
676  * ibmvfc_send_crq - Send a CRQ
677  * @vhost:	ibmvfc host struct
678  * @word1:	the first 64 bits of the data
679  * @word2:	the second 64 bits of the data
680  *
681  * Return value:
682  *	0 on success / other on failure
683  **/
684 static int ibmvfc_send_crq(struct ibmvfc_host *vhost, u64 word1, u64 word2)
685 {
686 	struct vio_dev *vdev = to_vio_dev(vhost->dev);
687 	return plpar_hcall_norets(H_SEND_CRQ, vdev->unit_address, word1, word2);
688 }
689 
690 /**
691  * ibmvfc_send_crq_init - Send a CRQ init message
692  * @vhost:	ibmvfc host struct
693  *
694  * Return value:
695  *	0 on success / other on failure
696  **/
697 static int ibmvfc_send_crq_init(struct ibmvfc_host *vhost)
698 {
699 	ibmvfc_dbg(vhost, "Sending CRQ init\n");
700 	return ibmvfc_send_crq(vhost, 0xC001000000000000LL, 0);
701 }
702 
703 /**
704  * ibmvfc_send_crq_init_complete - Send a CRQ init complete message
705  * @vhost:	ibmvfc host struct
706  *
707  * Return value:
708  *	0 on success / other on failure
709  **/
710 static int ibmvfc_send_crq_init_complete(struct ibmvfc_host *vhost)
711 {
712 	ibmvfc_dbg(vhost, "Sending CRQ init complete\n");
713 	return ibmvfc_send_crq(vhost, 0xC002000000000000LL, 0);
714 }
715 
716 /**
717  * ibmvfc_release_crq_queue - Deallocates data and unregisters CRQ
718  * @vhost:	ibmvfc host struct
719  *
720  * Frees irq, deallocates a page for messages, unmaps dma, and unregisters
721  * the crq with the hypervisor.
722  **/
723 static void ibmvfc_release_crq_queue(struct ibmvfc_host *vhost)
724 {
725 	long rc = 0;
726 	struct vio_dev *vdev = to_vio_dev(vhost->dev);
727 	struct ibmvfc_crq_queue *crq = &vhost->crq;
728 
729 	ibmvfc_dbg(vhost, "Releasing CRQ\n");
730 	free_irq(vdev->irq, vhost);
731 	tasklet_kill(&vhost->tasklet);
732 	do {
733 		if (rc)
734 			msleep(100);
735 		rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address);
736 	} while (rc == H_BUSY || H_IS_LONG_BUSY(rc));
737 
738 	vhost->state = IBMVFC_NO_CRQ;
739 	vhost->logged_in = 0;
740 	dma_unmap_single(vhost->dev, crq->msg_token, PAGE_SIZE, DMA_BIDIRECTIONAL);
741 	free_page((unsigned long)crq->msgs);
742 }
743 
744 /**
745  * ibmvfc_reenable_crq_queue - reenables the CRQ
746  * @vhost:	ibmvfc host struct
747  *
748  * Return value:
749  *	0 on success / other on failure
750  **/
751 static int ibmvfc_reenable_crq_queue(struct ibmvfc_host *vhost)
752 {
753 	int rc = 0;
754 	struct vio_dev *vdev = to_vio_dev(vhost->dev);
755 
756 	/* Re-enable the CRQ */
757 	do {
758 		if (rc)
759 			msleep(100);
760 		rc = plpar_hcall_norets(H_ENABLE_CRQ, vdev->unit_address);
761 	} while (rc == H_IN_PROGRESS || rc == H_BUSY || H_IS_LONG_BUSY(rc));
762 
763 	if (rc)
764 		dev_err(vhost->dev, "Error enabling adapter (rc=%d)\n", rc);
765 
766 	return rc;
767 }
768 
769 /**
770  * ibmvfc_reset_crq - resets a crq after a failure
771  * @vhost:	ibmvfc host struct
772  *
773  * Return value:
774  *	0 on success / other on failure
775  **/
776 static int ibmvfc_reset_crq(struct ibmvfc_host *vhost)
777 {
778 	int rc = 0;
779 	unsigned long flags;
780 	struct vio_dev *vdev = to_vio_dev(vhost->dev);
781 	struct ibmvfc_crq_queue *crq = &vhost->crq;
782 
783 	/* Close the CRQ */
784 	do {
785 		if (rc)
786 			msleep(100);
787 		rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address);
788 	} while (rc == H_BUSY || H_IS_LONG_BUSY(rc));
789 
790 	spin_lock_irqsave(vhost->host->host_lock, flags);
791 	vhost->state = IBMVFC_NO_CRQ;
792 	vhost->logged_in = 0;
793 
794 	/* Clean out the queue */
795 	memset(crq->msgs, 0, PAGE_SIZE);
796 	crq->cur = 0;
797 
798 	/* And re-open it again */
799 	rc = plpar_hcall_norets(H_REG_CRQ, vdev->unit_address,
800 				crq->msg_token, PAGE_SIZE);
801 
802 	if (rc == H_CLOSED)
803 		/* Adapter is good, but other end is not ready */
804 		dev_warn(vhost->dev, "Partner adapter not ready\n");
805 	else if (rc != 0)
806 		dev_warn(vhost->dev, "Couldn't register crq (rc=%d)\n", rc);
807 	spin_unlock_irqrestore(vhost->host->host_lock, flags);
808 
809 	return rc;
810 }
811 
812 /**
813  * ibmvfc_valid_event - Determines if event is valid.
814  * @pool:	event_pool that contains the event
815  * @evt:	ibmvfc event to be checked for validity
816  *
817  * Return value:
818  *	1 if event is valid / 0 if event is not valid
819  **/
820 static int ibmvfc_valid_event(struct ibmvfc_event_pool *pool,
821 			      struct ibmvfc_event *evt)
822 {
823 	int index = evt - pool->events;
824 	if (index < 0 || index >= pool->size)	/* outside of bounds */
825 		return 0;
826 	if (evt != pool->events + index)	/* unaligned */
827 		return 0;
828 	return 1;
829 }
830 
831 /**
832  * ibmvfc_free_event - Free the specified event
833  * @evt:	ibmvfc_event to be freed
834  *
835  **/
836 static void ibmvfc_free_event(struct ibmvfc_event *evt)
837 {
838 	struct ibmvfc_host *vhost = evt->vhost;
839 	struct ibmvfc_event_pool *pool = &vhost->pool;
840 
841 	BUG_ON(!ibmvfc_valid_event(pool, evt));
842 	BUG_ON(atomic_inc_return(&evt->free) != 1);
843 	list_add_tail(&evt->queue, &vhost->free);
844 }
845 
846 /**
847  * ibmvfc_scsi_eh_done - EH done function for queuecommand commands
848  * @evt:	ibmvfc event struct
849  *
850  * This function does not setup any error status, that must be done
851  * before this function gets called.
852  **/
853 static void ibmvfc_scsi_eh_done(struct ibmvfc_event *evt)
854 {
855 	struct scsi_cmnd *cmnd = evt->cmnd;
856 
857 	if (cmnd) {
858 		scsi_dma_unmap(cmnd);
859 		cmnd->scsi_done(cmnd);
860 	}
861 
862 	if (evt->eh_comp)
863 		complete(evt->eh_comp);
864 
865 	ibmvfc_free_event(evt);
866 }
867 
868 /**
869  * ibmvfc_fail_request - Fail request with specified error code
870  * @evt:		ibmvfc event struct
871  * @error_code:	error code to fail request with
872  *
873  * Return value:
874  *	none
875  **/
876 static void ibmvfc_fail_request(struct ibmvfc_event *evt, int error_code)
877 {
878 	if (evt->cmnd) {
879 		evt->cmnd->result = (error_code << 16);
880 		evt->done = ibmvfc_scsi_eh_done;
881 	} else
882 		evt->xfer_iu->mad_common.status = cpu_to_be16(IBMVFC_MAD_DRIVER_FAILED);
883 
884 	list_del(&evt->queue);
885 	del_timer(&evt->timer);
886 	ibmvfc_trc_end(evt);
887 	evt->done(evt);
888 }
889 
890 /**
891  * ibmvfc_purge_requests - Our virtual adapter just shut down. Purge any sent requests
892  * @vhost:		ibmvfc host struct
893  * @error_code:	error code to fail requests with
894  *
895  * Return value:
896  *	none
897  **/
898 static void ibmvfc_purge_requests(struct ibmvfc_host *vhost, int error_code)
899 {
900 	struct ibmvfc_event *evt, *pos;
901 
902 	ibmvfc_dbg(vhost, "Purging all requests\n");
903 	list_for_each_entry_safe(evt, pos, &vhost->sent, queue)
904 		ibmvfc_fail_request(evt, error_code);
905 }
906 
907 /**
908  * ibmvfc_hard_reset_host - Reset the connection to the server by breaking the CRQ
909  * @vhost:	struct ibmvfc host to reset
910  **/
911 static void ibmvfc_hard_reset_host(struct ibmvfc_host *vhost)
912 {
913 	ibmvfc_purge_requests(vhost, DID_ERROR);
914 	ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN);
915 	ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_RESET);
916 }
917 
918 /**
919  * __ibmvfc_reset_host - Reset the connection to the server (no locking)
920  * @vhost:	struct ibmvfc host to reset
921  **/
922 static void __ibmvfc_reset_host(struct ibmvfc_host *vhost)
923 {
924 	if (vhost->logged_in && vhost->action != IBMVFC_HOST_ACTION_LOGO_WAIT &&
925 	    !ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) {
926 		scsi_block_requests(vhost->host);
927 		ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_LOGO);
928 		vhost->job_step = ibmvfc_npiv_logout;
929 		wake_up(&vhost->work_wait_q);
930 	} else
931 		ibmvfc_hard_reset_host(vhost);
932 }
933 
934 /**
935  * ibmvfc_reset_host - Reset the connection to the server
936  * @vhost:	ibmvfc host struct
937  **/
938 static void ibmvfc_reset_host(struct ibmvfc_host *vhost)
939 {
940 	unsigned long flags;
941 
942 	spin_lock_irqsave(vhost->host->host_lock, flags);
943 	__ibmvfc_reset_host(vhost);
944 	spin_unlock_irqrestore(vhost->host->host_lock, flags);
945 }
946 
947 /**
948  * ibmvfc_retry_host_init - Retry host initialization if allowed
949  * @vhost:	ibmvfc host struct
950  *
951  * Returns: 1 if init will be retried / 0 if not
952  *
953  **/
954 static int ibmvfc_retry_host_init(struct ibmvfc_host *vhost)
955 {
956 	int retry = 0;
957 
958 	if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) {
959 		vhost->delay_init = 1;
960 		if (++vhost->init_retries > IBMVFC_MAX_HOST_INIT_RETRIES) {
961 			dev_err(vhost->dev,
962 				"Host initialization retries exceeded. Taking adapter offline\n");
963 			ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE);
964 		} else if (vhost->init_retries == IBMVFC_MAX_HOST_INIT_RETRIES)
965 			__ibmvfc_reset_host(vhost);
966 		else {
967 			ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT);
968 			retry = 1;
969 		}
970 	}
971 
972 	wake_up(&vhost->work_wait_q);
973 	return retry;
974 }
975 
976 /**
977  * __ibmvfc_get_target - Find the specified scsi_target (no locking)
978  * @starget:	scsi target struct
979  *
980  * Return value:
981  *	ibmvfc_target struct / NULL if not found
982  **/
983 static struct ibmvfc_target *__ibmvfc_get_target(struct scsi_target *starget)
984 {
985 	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
986 	struct ibmvfc_host *vhost = shost_priv(shost);
987 	struct ibmvfc_target *tgt;
988 
989 	list_for_each_entry(tgt, &vhost->targets, queue)
990 		if (tgt->target_id == starget->id) {
991 			kref_get(&tgt->kref);
992 			return tgt;
993 		}
994 	return NULL;
995 }
996 
997 /**
998  * ibmvfc_get_target - Find the specified scsi_target
999  * @starget:	scsi target struct
1000  *
1001  * Return value:
1002  *	ibmvfc_target struct / NULL if not found
1003  **/
1004 static struct ibmvfc_target *ibmvfc_get_target(struct scsi_target *starget)
1005 {
1006 	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
1007 	struct ibmvfc_target *tgt;
1008 	unsigned long flags;
1009 
1010 	spin_lock_irqsave(shost->host_lock, flags);
1011 	tgt = __ibmvfc_get_target(starget);
1012 	spin_unlock_irqrestore(shost->host_lock, flags);
1013 	return tgt;
1014 }
1015 
1016 /**
1017  * ibmvfc_get_host_speed - Get host port speed
1018  * @shost:		scsi host struct
1019  *
1020  * Return value:
1021  * 	none
1022  **/
1023 static void ibmvfc_get_host_speed(struct Scsi_Host *shost)
1024 {
1025 	struct ibmvfc_host *vhost = shost_priv(shost);
1026 	unsigned long flags;
1027 
1028 	spin_lock_irqsave(shost->host_lock, flags);
1029 	if (vhost->state == IBMVFC_ACTIVE) {
1030 		switch (be64_to_cpu(vhost->login_buf->resp.link_speed) / 100) {
1031 		case 1:
1032 			fc_host_speed(shost) = FC_PORTSPEED_1GBIT;
1033 			break;
1034 		case 2:
1035 			fc_host_speed(shost) = FC_PORTSPEED_2GBIT;
1036 			break;
1037 		case 4:
1038 			fc_host_speed(shost) = FC_PORTSPEED_4GBIT;
1039 			break;
1040 		case 8:
1041 			fc_host_speed(shost) = FC_PORTSPEED_8GBIT;
1042 			break;
1043 		case 10:
1044 			fc_host_speed(shost) = FC_PORTSPEED_10GBIT;
1045 			break;
1046 		case 16:
1047 			fc_host_speed(shost) = FC_PORTSPEED_16GBIT;
1048 			break;
1049 		default:
1050 			ibmvfc_log(vhost, 3, "Unknown port speed: %lld Gbit\n",
1051 				   be64_to_cpu(vhost->login_buf->resp.link_speed) / 100);
1052 			fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN;
1053 			break;
1054 		}
1055 	} else
1056 		fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN;
1057 	spin_unlock_irqrestore(shost->host_lock, flags);
1058 }
1059 
1060 /**
1061  * ibmvfc_get_host_port_state - Get host port state
1062  * @shost:		scsi host struct
1063  *
1064  * Return value:
1065  * 	none
1066  **/
1067 static void ibmvfc_get_host_port_state(struct Scsi_Host *shost)
1068 {
1069 	struct ibmvfc_host *vhost = shost_priv(shost);
1070 	unsigned long flags;
1071 
1072 	spin_lock_irqsave(shost->host_lock, flags);
1073 	switch (vhost->state) {
1074 	case IBMVFC_INITIALIZING:
1075 	case IBMVFC_ACTIVE:
1076 		fc_host_port_state(shost) = FC_PORTSTATE_ONLINE;
1077 		break;
1078 	case IBMVFC_LINK_DOWN:
1079 		fc_host_port_state(shost) = FC_PORTSTATE_LINKDOWN;
1080 		break;
1081 	case IBMVFC_LINK_DEAD:
1082 	case IBMVFC_HOST_OFFLINE:
1083 		fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE;
1084 		break;
1085 	case IBMVFC_HALTED:
1086 		fc_host_port_state(shost) = FC_PORTSTATE_BLOCKED;
1087 		break;
1088 	case IBMVFC_NO_CRQ:
1089 		fc_host_port_state(shost) = FC_PORTSTATE_UNKNOWN;
1090 		break;
1091 	default:
1092 		ibmvfc_log(vhost, 3, "Unknown port state: %d\n", vhost->state);
1093 		fc_host_port_state(shost) = FC_PORTSTATE_UNKNOWN;
1094 		break;
1095 	}
1096 	spin_unlock_irqrestore(shost->host_lock, flags);
1097 }
1098 
1099 /**
1100  * ibmvfc_set_rport_dev_loss_tmo - Set rport's device loss timeout
1101  * @rport:		rport struct
1102  * @timeout:	timeout value
1103  *
1104  * Return value:
1105  * 	none
1106  **/
1107 static void ibmvfc_set_rport_dev_loss_tmo(struct fc_rport *rport, u32 timeout)
1108 {
1109 	if (timeout)
1110 		rport->dev_loss_tmo = timeout;
1111 	else
1112 		rport->dev_loss_tmo = 1;
1113 }
1114 
1115 /**
1116  * ibmvfc_release_tgt - Free memory allocated for a target
1117  * @kref:		kref struct
1118  *
1119  **/
1120 static void ibmvfc_release_tgt(struct kref *kref)
1121 {
1122 	struct ibmvfc_target *tgt = container_of(kref, struct ibmvfc_target, kref);
1123 	kfree(tgt);
1124 }
1125 
1126 /**
1127  * ibmvfc_get_starget_node_name - Get SCSI target's node name
1128  * @starget:	scsi target struct
1129  *
1130  * Return value:
1131  * 	none
1132  **/
1133 static void ibmvfc_get_starget_node_name(struct scsi_target *starget)
1134 {
1135 	struct ibmvfc_target *tgt = ibmvfc_get_target(starget);
1136 	fc_starget_port_name(starget) = tgt ? tgt->ids.node_name : 0;
1137 	if (tgt)
1138 		kref_put(&tgt->kref, ibmvfc_release_tgt);
1139 }
1140 
1141 /**
1142  * ibmvfc_get_starget_port_name - Get SCSI target's port name
1143  * @starget:	scsi target struct
1144  *
1145  * Return value:
1146  * 	none
1147  **/
1148 static void ibmvfc_get_starget_port_name(struct scsi_target *starget)
1149 {
1150 	struct ibmvfc_target *tgt = ibmvfc_get_target(starget);
1151 	fc_starget_port_name(starget) = tgt ? tgt->ids.port_name : 0;
1152 	if (tgt)
1153 		kref_put(&tgt->kref, ibmvfc_release_tgt);
1154 }
1155 
1156 /**
1157  * ibmvfc_get_starget_port_id - Get SCSI target's port ID
1158  * @starget:	scsi target struct
1159  *
1160  * Return value:
1161  * 	none
1162  **/
1163 static void ibmvfc_get_starget_port_id(struct scsi_target *starget)
1164 {
1165 	struct ibmvfc_target *tgt = ibmvfc_get_target(starget);
1166 	fc_starget_port_id(starget) = tgt ? tgt->scsi_id : -1;
1167 	if (tgt)
1168 		kref_put(&tgt->kref, ibmvfc_release_tgt);
1169 }
1170 
1171 /**
1172  * ibmvfc_wait_while_resetting - Wait while the host resets
1173  * @vhost:		ibmvfc host struct
1174  *
1175  * Return value:
1176  * 	0 on success / other on failure
1177  **/
1178 static int ibmvfc_wait_while_resetting(struct ibmvfc_host *vhost)
1179 {
1180 	long timeout = wait_event_timeout(vhost->init_wait_q,
1181 					  ((vhost->state == IBMVFC_ACTIVE ||
1182 					    vhost->state == IBMVFC_HOST_OFFLINE ||
1183 					    vhost->state == IBMVFC_LINK_DEAD) &&
1184 					   vhost->action == IBMVFC_HOST_ACTION_NONE),
1185 					  (init_timeout * HZ));
1186 
1187 	return timeout ? 0 : -EIO;
1188 }
1189 
1190 /**
1191  * ibmvfc_issue_fc_host_lip - Re-initiate link initialization
1192  * @shost:		scsi host struct
1193  *
1194  * Return value:
1195  * 	0 on success / other on failure
1196  **/
1197 static int ibmvfc_issue_fc_host_lip(struct Scsi_Host *shost)
1198 {
1199 	struct ibmvfc_host *vhost = shost_priv(shost);
1200 
1201 	dev_err(vhost->dev, "Initiating host LIP. Resetting connection\n");
1202 	ibmvfc_reset_host(vhost);
1203 	return ibmvfc_wait_while_resetting(vhost);
1204 }
1205 
1206 /**
1207  * ibmvfc_gather_partition_info - Gather info about the LPAR
1208  *
1209  * Return value:
1210  *	none
1211  **/
1212 static void ibmvfc_gather_partition_info(struct ibmvfc_host *vhost)
1213 {
1214 	struct device_node *rootdn;
1215 	const char *name;
1216 	const unsigned int *num;
1217 
1218 	rootdn = of_find_node_by_path("/");
1219 	if (!rootdn)
1220 		return;
1221 
1222 	name = of_get_property(rootdn, "ibm,partition-name", NULL);
1223 	if (name)
1224 		strncpy(vhost->partition_name, name, sizeof(vhost->partition_name));
1225 	num = of_get_property(rootdn, "ibm,partition-no", NULL);
1226 	if (num)
1227 		vhost->partition_number = *num;
1228 	of_node_put(rootdn);
1229 }
1230 
1231 /**
1232  * ibmvfc_set_login_info - Setup info for NPIV login
1233  * @vhost:	ibmvfc host struct
1234  *
1235  * Return value:
1236  *	none
1237  **/
1238 static void ibmvfc_set_login_info(struct ibmvfc_host *vhost)
1239 {
1240 	struct ibmvfc_npiv_login *login_info = &vhost->login_info;
1241 	struct device_node *of_node = vhost->dev->of_node;
1242 	const char *location;
1243 
1244 	memset(login_info, 0, sizeof(*login_info));
1245 
1246 	login_info->ostype = cpu_to_be32(IBMVFC_OS_LINUX);
1247 	login_info->max_dma_len = cpu_to_be64(IBMVFC_MAX_SECTORS << 9);
1248 	login_info->max_payload = cpu_to_be32(sizeof(struct ibmvfc_fcp_cmd_iu));
1249 	login_info->max_response = cpu_to_be32(sizeof(struct ibmvfc_fcp_rsp));
1250 	login_info->partition_num = cpu_to_be32(vhost->partition_number);
1251 	login_info->vfc_frame_version = cpu_to_be32(1);
1252 	login_info->fcp_version = cpu_to_be16(3);
1253 	login_info->flags = cpu_to_be16(IBMVFC_FLUSH_ON_HALT);
1254 	if (vhost->client_migrated)
1255 		login_info->flags |= cpu_to_be16(IBMVFC_CLIENT_MIGRATED);
1256 
1257 	login_info->max_cmds = cpu_to_be32(max_requests + IBMVFC_NUM_INTERNAL_REQ);
1258 	login_info->capabilities = cpu_to_be64(IBMVFC_CAN_MIGRATE | IBMVFC_CAN_SEND_VF_WWPN);
1259 	login_info->async.va = cpu_to_be64(vhost->async_crq.msg_token);
1260 	login_info->async.len = cpu_to_be32(vhost->async_crq.size * sizeof(*vhost->async_crq.msgs));
1261 	strncpy(login_info->partition_name, vhost->partition_name, IBMVFC_MAX_NAME);
1262 	strncpy(login_info->device_name,
1263 		dev_name(&vhost->host->shost_gendev), IBMVFC_MAX_NAME);
1264 
1265 	location = of_get_property(of_node, "ibm,loc-code", NULL);
1266 	location = location ? location : dev_name(vhost->dev);
1267 	strncpy(login_info->drc_name, location, IBMVFC_MAX_NAME);
1268 }
1269 
1270 /**
1271  * ibmvfc_init_event_pool - Allocates and initializes the event pool for a host
1272  * @vhost:	ibmvfc host who owns the event pool
1273  *
1274  * Returns zero on success.
1275  **/
1276 static int ibmvfc_init_event_pool(struct ibmvfc_host *vhost)
1277 {
1278 	int i;
1279 	struct ibmvfc_event_pool *pool = &vhost->pool;
1280 
1281 	ENTER;
1282 	pool->size = max_requests + IBMVFC_NUM_INTERNAL_REQ;
1283 	pool->events = kcalloc(pool->size, sizeof(*pool->events), GFP_KERNEL);
1284 	if (!pool->events)
1285 		return -ENOMEM;
1286 
1287 	pool->iu_storage = dma_alloc_coherent(vhost->dev,
1288 					      pool->size * sizeof(*pool->iu_storage),
1289 					      &pool->iu_token, 0);
1290 
1291 	if (!pool->iu_storage) {
1292 		kfree(pool->events);
1293 		return -ENOMEM;
1294 	}
1295 
1296 	for (i = 0; i < pool->size; ++i) {
1297 		struct ibmvfc_event *evt = &pool->events[i];
1298 		atomic_set(&evt->free, 1);
1299 		evt->crq.valid = 0x80;
1300 		evt->crq.ioba = cpu_to_be64(pool->iu_token + (sizeof(*evt->xfer_iu) * i));
1301 		evt->xfer_iu = pool->iu_storage + i;
1302 		evt->vhost = vhost;
1303 		evt->ext_list = NULL;
1304 		list_add_tail(&evt->queue, &vhost->free);
1305 	}
1306 
1307 	LEAVE;
1308 	return 0;
1309 }
1310 
1311 /**
1312  * ibmvfc_free_event_pool - Frees memory of the event pool of a host
1313  * @vhost:	ibmvfc host who owns the event pool
1314  *
1315  **/
1316 static void ibmvfc_free_event_pool(struct ibmvfc_host *vhost)
1317 {
1318 	int i;
1319 	struct ibmvfc_event_pool *pool = &vhost->pool;
1320 
1321 	ENTER;
1322 	for (i = 0; i < pool->size; ++i) {
1323 		list_del(&pool->events[i].queue);
1324 		BUG_ON(atomic_read(&pool->events[i].free) != 1);
1325 		if (pool->events[i].ext_list)
1326 			dma_pool_free(vhost->sg_pool,
1327 				      pool->events[i].ext_list,
1328 				      pool->events[i].ext_list_token);
1329 	}
1330 
1331 	kfree(pool->events);
1332 	dma_free_coherent(vhost->dev,
1333 			  pool->size * sizeof(*pool->iu_storage),
1334 			  pool->iu_storage, pool->iu_token);
1335 	LEAVE;
1336 }
1337 
1338 /**
1339  * ibmvfc_get_event - Gets the next free event in pool
1340  * @vhost:	ibmvfc host struct
1341  *
1342  * Returns a free event from the pool.
1343  **/
1344 static struct ibmvfc_event *ibmvfc_get_event(struct ibmvfc_host *vhost)
1345 {
1346 	struct ibmvfc_event *evt;
1347 
1348 	BUG_ON(list_empty(&vhost->free));
1349 	evt = list_entry(vhost->free.next, struct ibmvfc_event, queue);
1350 	atomic_set(&evt->free, 0);
1351 	list_del(&evt->queue);
1352 	return evt;
1353 }
1354 
1355 /**
1356  * ibmvfc_init_event - Initialize fields in an event struct that are always
1357  *				required.
1358  * @evt:	The event
1359  * @done:	Routine to call when the event is responded to
1360  * @format:	SRP or MAD format
1361  **/
1362 static void ibmvfc_init_event(struct ibmvfc_event *evt,
1363 			      void (*done) (struct ibmvfc_event *), u8 format)
1364 {
1365 	evt->cmnd = NULL;
1366 	evt->sync_iu = NULL;
1367 	evt->crq.format = format;
1368 	evt->done = done;
1369 	evt->eh_comp = NULL;
1370 }
1371 
1372 /**
1373  * ibmvfc_map_sg_list - Initialize scatterlist
1374  * @scmd:	scsi command struct
1375  * @nseg:	number of scatterlist segments
1376  * @md:	memory descriptor list to initialize
1377  **/
1378 static void ibmvfc_map_sg_list(struct scsi_cmnd *scmd, int nseg,
1379 			       struct srp_direct_buf *md)
1380 {
1381 	int i;
1382 	struct scatterlist *sg;
1383 
1384 	scsi_for_each_sg(scmd, sg, nseg, i) {
1385 		md[i].va = cpu_to_be64(sg_dma_address(sg));
1386 		md[i].len = cpu_to_be32(sg_dma_len(sg));
1387 		md[i].key = 0;
1388 	}
1389 }
1390 
1391 /**
1392  * ibmvfc_map_sg_data - Maps dma for a scatterlist and initializes descriptor fields
1393  * @scmd:		struct scsi_cmnd with the scatterlist
1394  * @evt:		ibmvfc event struct
1395  * @vfc_cmd:	vfc_cmd that contains the memory descriptor
1396  * @dev:		device for which to map dma memory
1397  *
1398  * Returns:
1399  *	0 on success / non-zero on failure
1400  **/
1401 static int ibmvfc_map_sg_data(struct scsi_cmnd *scmd,
1402 			      struct ibmvfc_event *evt,
1403 			      struct ibmvfc_cmd *vfc_cmd, struct device *dev)
1404 {
1405 
1406 	int sg_mapped;
1407 	struct srp_direct_buf *data = &vfc_cmd->ioba;
1408 	struct ibmvfc_host *vhost = dev_get_drvdata(dev);
1409 	struct ibmvfc_fcp_cmd_iu *iu = ibmvfc_get_fcp_iu(evt->vhost, vfc_cmd);
1410 
1411 	if (cls3_error)
1412 		vfc_cmd->flags |= cpu_to_be16(IBMVFC_CLASS_3_ERR);
1413 
1414 	sg_mapped = scsi_dma_map(scmd);
1415 	if (!sg_mapped) {
1416 		vfc_cmd->flags |= cpu_to_be16(IBMVFC_NO_MEM_DESC);
1417 		return 0;
1418 	} else if (unlikely(sg_mapped < 0)) {
1419 		if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL)
1420 			scmd_printk(KERN_ERR, scmd, "Failed to map DMA buffer for command\n");
1421 		return sg_mapped;
1422 	}
1423 
1424 	if (scmd->sc_data_direction == DMA_TO_DEVICE) {
1425 		vfc_cmd->flags |= cpu_to_be16(IBMVFC_WRITE);
1426 		iu->add_cdb_len |= IBMVFC_WRDATA;
1427 	} else {
1428 		vfc_cmd->flags |= cpu_to_be16(IBMVFC_READ);
1429 		iu->add_cdb_len |= IBMVFC_RDDATA;
1430 	}
1431 
1432 	if (sg_mapped == 1) {
1433 		ibmvfc_map_sg_list(scmd, sg_mapped, data);
1434 		return 0;
1435 	}
1436 
1437 	vfc_cmd->flags |= cpu_to_be16(IBMVFC_SCATTERLIST);
1438 
1439 	if (!evt->ext_list) {
1440 		evt->ext_list = dma_pool_alloc(vhost->sg_pool, GFP_ATOMIC,
1441 					       &evt->ext_list_token);
1442 
1443 		if (!evt->ext_list) {
1444 			scsi_dma_unmap(scmd);
1445 			if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL)
1446 				scmd_printk(KERN_ERR, scmd, "Can't allocate memory for scatterlist\n");
1447 			return -ENOMEM;
1448 		}
1449 	}
1450 
1451 	ibmvfc_map_sg_list(scmd, sg_mapped, evt->ext_list);
1452 
1453 	data->va = cpu_to_be64(evt->ext_list_token);
1454 	data->len = cpu_to_be32(sg_mapped * sizeof(struct srp_direct_buf));
1455 	data->key = 0;
1456 	return 0;
1457 }
1458 
1459 /**
1460  * ibmvfc_timeout - Internal command timeout handler
1461  * @evt:	struct ibmvfc_event that timed out
1462  *
1463  * Called when an internally generated command times out
1464  **/
1465 static void ibmvfc_timeout(struct timer_list *t)
1466 {
1467 	struct ibmvfc_event *evt = from_timer(evt, t, timer);
1468 	struct ibmvfc_host *vhost = evt->vhost;
1469 	dev_err(vhost->dev, "Command timed out (%p). Resetting connection\n", evt);
1470 	ibmvfc_reset_host(vhost);
1471 }
1472 
1473 /**
1474  * ibmvfc_send_event - Transforms event to u64 array and calls send_crq()
1475  * @evt:		event to be sent
1476  * @vhost:		ibmvfc host struct
1477  * @timeout:	timeout in seconds - 0 means do not time command
1478  *
1479  * Returns the value returned from ibmvfc_send_crq(). (Zero for success)
1480  **/
1481 static int ibmvfc_send_event(struct ibmvfc_event *evt,
1482 			     struct ibmvfc_host *vhost, unsigned long timeout)
1483 {
1484 	__be64 *crq_as_u64 = (__be64 *) &evt->crq;
1485 	int rc;
1486 
1487 	/* Copy the IU into the transfer area */
1488 	*evt->xfer_iu = evt->iu;
1489 	if (evt->crq.format == IBMVFC_CMD_FORMAT)
1490 		evt->xfer_iu->cmd.tag = cpu_to_be64((u64)evt);
1491 	else if (evt->crq.format == IBMVFC_MAD_FORMAT)
1492 		evt->xfer_iu->mad_common.tag = cpu_to_be64((u64)evt);
1493 	else
1494 		BUG();
1495 
1496 	list_add_tail(&evt->queue, &vhost->sent);
1497 	timer_setup(&evt->timer, ibmvfc_timeout, 0);
1498 
1499 	if (timeout) {
1500 		evt->timer.expires = jiffies + (timeout * HZ);
1501 		add_timer(&evt->timer);
1502 	}
1503 
1504 	mb();
1505 
1506 	if ((rc = ibmvfc_send_crq(vhost, be64_to_cpu(crq_as_u64[0]),
1507 				  be64_to_cpu(crq_as_u64[1])))) {
1508 		list_del(&evt->queue);
1509 		del_timer(&evt->timer);
1510 
1511 		/* If send_crq returns H_CLOSED, return SCSI_MLQUEUE_HOST_BUSY.
1512 		 * Firmware will send a CRQ with a transport event (0xFF) to
1513 		 * tell this client what has happened to the transport. This
1514 		 * will be handled in ibmvfc_handle_crq()
1515 		 */
1516 		if (rc == H_CLOSED) {
1517 			if (printk_ratelimit())
1518 				dev_warn(vhost->dev, "Send warning. Receive queue closed, will retry.\n");
1519 			if (evt->cmnd)
1520 				scsi_dma_unmap(evt->cmnd);
1521 			ibmvfc_free_event(evt);
1522 			return SCSI_MLQUEUE_HOST_BUSY;
1523 		}
1524 
1525 		dev_err(vhost->dev, "Send error (rc=%d)\n", rc);
1526 		if (evt->cmnd) {
1527 			evt->cmnd->result = DID_ERROR << 16;
1528 			evt->done = ibmvfc_scsi_eh_done;
1529 		} else
1530 			evt->xfer_iu->mad_common.status = cpu_to_be16(IBMVFC_MAD_CRQ_ERROR);
1531 
1532 		evt->done(evt);
1533 	} else
1534 		ibmvfc_trc_start(evt);
1535 
1536 	return 0;
1537 }
1538 
1539 /**
1540  * ibmvfc_log_error - Log an error for the failed command if appropriate
1541  * @evt:	ibmvfc event to log
1542  *
1543  **/
1544 static void ibmvfc_log_error(struct ibmvfc_event *evt)
1545 {
1546 	struct ibmvfc_cmd *vfc_cmd = &evt->xfer_iu->cmd;
1547 	struct ibmvfc_host *vhost = evt->vhost;
1548 	struct ibmvfc_fcp_rsp *rsp = ibmvfc_get_fcp_rsp(vhost, vfc_cmd);
1549 	struct scsi_cmnd *cmnd = evt->cmnd;
1550 	const char *err = unknown_error;
1551 	int index = ibmvfc_get_err_index(be16_to_cpu(vfc_cmd->status), be16_to_cpu(vfc_cmd->error));
1552 	int logerr = 0;
1553 	int rsp_code = 0;
1554 
1555 	if (index >= 0) {
1556 		logerr = cmd_status[index].log;
1557 		err = cmd_status[index].name;
1558 	}
1559 
1560 	if (!logerr && (vhost->log_level <= (IBMVFC_DEFAULT_LOG_LEVEL + 1)))
1561 		return;
1562 
1563 	if (rsp->flags & FCP_RSP_LEN_VALID)
1564 		rsp_code = rsp->data.info.rsp_code;
1565 
1566 	scmd_printk(KERN_ERR, cmnd, "Command (%02X) : %s (%x:%x) "
1567 		    "flags: %x fcp_rsp: %x, resid=%d, scsi_status: %x\n",
1568 		    cmnd->cmnd[0], err, be16_to_cpu(vfc_cmd->status), be16_to_cpu(vfc_cmd->error),
1569 		    rsp->flags, rsp_code, scsi_get_resid(cmnd), rsp->scsi_status);
1570 }
1571 
1572 /**
1573  * ibmvfc_relogin - Log back into the specified device
1574  * @sdev:	scsi device struct
1575  *
1576  **/
1577 static void ibmvfc_relogin(struct scsi_device *sdev)
1578 {
1579 	struct ibmvfc_host *vhost = shost_priv(sdev->host);
1580 	struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
1581 	struct ibmvfc_target *tgt;
1582 
1583 	list_for_each_entry(tgt, &vhost->targets, queue) {
1584 		if (rport == tgt->rport) {
1585 			ibmvfc_del_tgt(tgt);
1586 			break;
1587 		}
1588 	}
1589 
1590 	ibmvfc_reinit_host(vhost);
1591 }
1592 
1593 /**
1594  * ibmvfc_scsi_done - Handle responses from commands
1595  * @evt:	ibmvfc event to be handled
1596  *
1597  * Used as a callback when sending scsi cmds.
1598  **/
1599 static void ibmvfc_scsi_done(struct ibmvfc_event *evt)
1600 {
1601 	struct ibmvfc_cmd *vfc_cmd = &evt->xfer_iu->cmd;
1602 	struct ibmvfc_fcp_rsp *rsp = ibmvfc_get_fcp_rsp(evt->vhost, vfc_cmd);
1603 	struct scsi_cmnd *cmnd = evt->cmnd;
1604 	u32 rsp_len = 0;
1605 	u32 sense_len = be32_to_cpu(rsp->fcp_sense_len);
1606 
1607 	if (cmnd) {
1608 		if (be16_to_cpu(vfc_cmd->response_flags) & IBMVFC_ADAPTER_RESID_VALID)
1609 			scsi_set_resid(cmnd, be32_to_cpu(vfc_cmd->adapter_resid));
1610 		else if (rsp->flags & FCP_RESID_UNDER)
1611 			scsi_set_resid(cmnd, be32_to_cpu(rsp->fcp_resid));
1612 		else
1613 			scsi_set_resid(cmnd, 0);
1614 
1615 		if (vfc_cmd->status) {
1616 			cmnd->result = ibmvfc_get_err_result(evt->vhost, vfc_cmd);
1617 
1618 			if (rsp->flags & FCP_RSP_LEN_VALID)
1619 				rsp_len = be32_to_cpu(rsp->fcp_rsp_len);
1620 			if ((sense_len + rsp_len) > SCSI_SENSE_BUFFERSIZE)
1621 				sense_len = SCSI_SENSE_BUFFERSIZE - rsp_len;
1622 			if ((rsp->flags & FCP_SNS_LEN_VALID) && rsp->fcp_sense_len && rsp_len <= 8)
1623 				memcpy(cmnd->sense_buffer, rsp->data.sense + rsp_len, sense_len);
1624 			if ((be16_to_cpu(vfc_cmd->status) & IBMVFC_VIOS_FAILURE) &&
1625 			    (be16_to_cpu(vfc_cmd->error) == IBMVFC_PLOGI_REQUIRED))
1626 				ibmvfc_relogin(cmnd->device);
1627 
1628 			if (!cmnd->result && (!scsi_get_resid(cmnd) || (rsp->flags & FCP_RESID_OVER)))
1629 				cmnd->result = (DID_ERROR << 16);
1630 
1631 			ibmvfc_log_error(evt);
1632 		}
1633 
1634 		if (!cmnd->result &&
1635 		    (scsi_bufflen(cmnd) - scsi_get_resid(cmnd) < cmnd->underflow))
1636 			cmnd->result = (DID_ERROR << 16);
1637 
1638 		scsi_dma_unmap(cmnd);
1639 		cmnd->scsi_done(cmnd);
1640 	}
1641 
1642 	if (evt->eh_comp)
1643 		complete(evt->eh_comp);
1644 
1645 	ibmvfc_free_event(evt);
1646 }
1647 
1648 /**
1649  * ibmvfc_host_chkready - Check if the host can accept commands
1650  * @vhost:	 struct ibmvfc host
1651  *
1652  * Returns:
1653  *	1 if host can accept command / 0 if not
1654  **/
1655 static inline int ibmvfc_host_chkready(struct ibmvfc_host *vhost)
1656 {
1657 	int result = 0;
1658 
1659 	switch (vhost->state) {
1660 	case IBMVFC_LINK_DEAD:
1661 	case IBMVFC_HOST_OFFLINE:
1662 		result = DID_NO_CONNECT << 16;
1663 		break;
1664 	case IBMVFC_NO_CRQ:
1665 	case IBMVFC_INITIALIZING:
1666 	case IBMVFC_HALTED:
1667 	case IBMVFC_LINK_DOWN:
1668 		result = DID_REQUEUE << 16;
1669 		break;
1670 	case IBMVFC_ACTIVE:
1671 		result = 0;
1672 		break;
1673 	}
1674 
1675 	return result;
1676 }
1677 
1678 static struct ibmvfc_cmd *ibmvfc_init_vfc_cmd(struct ibmvfc_event *evt, struct scsi_device *sdev)
1679 {
1680 	struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
1681 	struct ibmvfc_host *vhost = evt->vhost;
1682 	struct ibmvfc_cmd *vfc_cmd = &evt->iu.cmd;
1683 	struct ibmvfc_fcp_cmd_iu *iu = ibmvfc_get_fcp_iu(vhost, vfc_cmd);
1684 	struct ibmvfc_fcp_rsp *rsp = ibmvfc_get_fcp_rsp(vhost, vfc_cmd);
1685 	size_t offset;
1686 
1687 	memset(vfc_cmd, 0, sizeof(*vfc_cmd));
1688 	if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN)) {
1689 		offset = offsetof(struct ibmvfc_cmd, v2.rsp);
1690 		vfc_cmd->target_wwpn = cpu_to_be64(rport->port_name);
1691 	} else
1692 		offset = offsetof(struct ibmvfc_cmd, v1.rsp);
1693 	vfc_cmd->resp.va = cpu_to_be64(be64_to_cpu(evt->crq.ioba) + offset);
1694 	vfc_cmd->resp.len = cpu_to_be32(sizeof(*rsp));
1695 	vfc_cmd->frame_type = cpu_to_be32(IBMVFC_SCSI_FCP_TYPE);
1696 	vfc_cmd->payload_len = cpu_to_be32(sizeof(*iu));
1697 	vfc_cmd->resp_len = cpu_to_be32(sizeof(*rsp));
1698 	vfc_cmd->cancel_key = cpu_to_be32((unsigned long)sdev->hostdata);
1699 	vfc_cmd->tgt_scsi_id = cpu_to_be64(rport->port_id);
1700 	int_to_scsilun(sdev->lun, &iu->lun);
1701 
1702 	return vfc_cmd;
1703 }
1704 
1705 /**
1706  * ibmvfc_queuecommand - The queuecommand function of the scsi template
1707  * @cmnd:	struct scsi_cmnd to be executed
1708  * @done:	Callback function to be called when cmnd is completed
1709  *
1710  * Returns:
1711  *	0 on success / other on failure
1712  **/
1713 static int ibmvfc_queuecommand_lck(struct scsi_cmnd *cmnd,
1714 			       void (*done) (struct scsi_cmnd *))
1715 {
1716 	struct ibmvfc_host *vhost = shost_priv(cmnd->device->host);
1717 	struct fc_rport *rport = starget_to_rport(scsi_target(cmnd->device));
1718 	struct ibmvfc_cmd *vfc_cmd;
1719 	struct ibmvfc_fcp_cmd_iu *iu;
1720 	struct ibmvfc_event *evt;
1721 	int rc;
1722 
1723 	if (unlikely((rc = fc_remote_port_chkready(rport))) ||
1724 	    unlikely((rc = ibmvfc_host_chkready(vhost)))) {
1725 		cmnd->result = rc;
1726 		done(cmnd);
1727 		return 0;
1728 	}
1729 
1730 	cmnd->result = (DID_OK << 16);
1731 	evt = ibmvfc_get_event(vhost);
1732 	ibmvfc_init_event(evt, ibmvfc_scsi_done, IBMVFC_CMD_FORMAT);
1733 	evt->cmnd = cmnd;
1734 	cmnd->scsi_done = done;
1735 
1736 	vfc_cmd = ibmvfc_init_vfc_cmd(evt, cmnd->device);
1737 	iu = ibmvfc_get_fcp_iu(vhost, vfc_cmd);
1738 
1739 	iu->xfer_len = cpu_to_be32(scsi_bufflen(cmnd));
1740 	memcpy(iu->cdb, cmnd->cmnd, cmnd->cmd_len);
1741 
1742 	if (cmnd->flags & SCMD_TAGGED) {
1743 		vfc_cmd->task_tag = cpu_to_be64(cmnd->tag);
1744 		iu->pri_task_attr = IBMVFC_SIMPLE_TASK;
1745 	}
1746 
1747 	vfc_cmd->correlation = cpu_to_be64(evt);
1748 
1749 	if (likely(!(rc = ibmvfc_map_sg_data(cmnd, evt, vfc_cmd, vhost->dev))))
1750 		return ibmvfc_send_event(evt, vhost, 0);
1751 
1752 	ibmvfc_free_event(evt);
1753 	if (rc == -ENOMEM)
1754 		return SCSI_MLQUEUE_HOST_BUSY;
1755 
1756 	if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL)
1757 		scmd_printk(KERN_ERR, cmnd,
1758 			    "Failed to map DMA buffer for command. rc=%d\n", rc);
1759 
1760 	cmnd->result = DID_ERROR << 16;
1761 	done(cmnd);
1762 	return 0;
1763 }
1764 
1765 static DEF_SCSI_QCMD(ibmvfc_queuecommand)
1766 
1767 /**
1768  * ibmvfc_sync_completion - Signal that a synchronous command has completed
1769  * @evt:	ibmvfc event struct
1770  *
1771  **/
1772 static void ibmvfc_sync_completion(struct ibmvfc_event *evt)
1773 {
1774 	/* copy the response back */
1775 	if (evt->sync_iu)
1776 		*evt->sync_iu = *evt->xfer_iu;
1777 
1778 	complete(&evt->comp);
1779 }
1780 
1781 /**
1782  * ibmvfc_bsg_timeout_done - Completion handler for cancelling BSG commands
1783  * @evt:	struct ibmvfc_event
1784  *
1785  **/
1786 static void ibmvfc_bsg_timeout_done(struct ibmvfc_event *evt)
1787 {
1788 	struct ibmvfc_host *vhost = evt->vhost;
1789 
1790 	ibmvfc_free_event(evt);
1791 	vhost->aborting_passthru = 0;
1792 	dev_info(vhost->dev, "Passthru command cancelled\n");
1793 }
1794 
1795 /**
1796  * ibmvfc_bsg_timeout - Handle a BSG timeout
1797  * @job:	struct bsg_job that timed out
1798  *
1799  * Returns:
1800  *	0 on success / other on failure
1801  **/
1802 static int ibmvfc_bsg_timeout(struct bsg_job *job)
1803 {
1804 	struct ibmvfc_host *vhost = shost_priv(fc_bsg_to_shost(job));
1805 	unsigned long port_id = (unsigned long)job->dd_data;
1806 	struct ibmvfc_event *evt;
1807 	struct ibmvfc_tmf *tmf;
1808 	unsigned long flags;
1809 	int rc;
1810 
1811 	ENTER;
1812 	spin_lock_irqsave(vhost->host->host_lock, flags);
1813 	if (vhost->aborting_passthru || vhost->state != IBMVFC_ACTIVE) {
1814 		__ibmvfc_reset_host(vhost);
1815 		spin_unlock_irqrestore(vhost->host->host_lock, flags);
1816 		return 0;
1817 	}
1818 
1819 	vhost->aborting_passthru = 1;
1820 	evt = ibmvfc_get_event(vhost);
1821 	ibmvfc_init_event(evt, ibmvfc_bsg_timeout_done, IBMVFC_MAD_FORMAT);
1822 
1823 	tmf = &evt->iu.tmf;
1824 	memset(tmf, 0, sizeof(*tmf));
1825 	tmf->common.version = cpu_to_be32(1);
1826 	tmf->common.opcode = cpu_to_be32(IBMVFC_TMF_MAD);
1827 	tmf->common.length = cpu_to_be16(sizeof(*tmf));
1828 	tmf->scsi_id = cpu_to_be64(port_id);
1829 	tmf->cancel_key = cpu_to_be32(IBMVFC_PASSTHRU_CANCEL_KEY);
1830 	tmf->my_cancel_key = cpu_to_be32(IBMVFC_INTERNAL_CANCEL_KEY);
1831 	rc = ibmvfc_send_event(evt, vhost, default_timeout);
1832 
1833 	if (rc != 0) {
1834 		vhost->aborting_passthru = 0;
1835 		dev_err(vhost->dev, "Failed to send cancel event. rc=%d\n", rc);
1836 		rc = -EIO;
1837 	} else
1838 		dev_info(vhost->dev, "Cancelling passthru command to port id 0x%lx\n",
1839 			 port_id);
1840 
1841 	spin_unlock_irqrestore(vhost->host->host_lock, flags);
1842 
1843 	LEAVE;
1844 	return rc;
1845 }
1846 
1847 /**
1848  * ibmvfc_bsg_plogi - PLOGI into a target to handle a BSG command
1849  * @vhost:		struct ibmvfc_host to send command
1850  * @port_id:	port ID to send command
1851  *
1852  * Returns:
1853  *	0 on success / other on failure
1854  **/
1855 static int ibmvfc_bsg_plogi(struct ibmvfc_host *vhost, unsigned int port_id)
1856 {
1857 	struct ibmvfc_port_login *plogi;
1858 	struct ibmvfc_target *tgt;
1859 	struct ibmvfc_event *evt;
1860 	union ibmvfc_iu rsp_iu;
1861 	unsigned long flags;
1862 	int rc = 0, issue_login = 1;
1863 
1864 	ENTER;
1865 	spin_lock_irqsave(vhost->host->host_lock, flags);
1866 	list_for_each_entry(tgt, &vhost->targets, queue) {
1867 		if (tgt->scsi_id == port_id) {
1868 			issue_login = 0;
1869 			break;
1870 		}
1871 	}
1872 
1873 	if (!issue_login)
1874 		goto unlock_out;
1875 	if (unlikely((rc = ibmvfc_host_chkready(vhost))))
1876 		goto unlock_out;
1877 
1878 	evt = ibmvfc_get_event(vhost);
1879 	ibmvfc_init_event(evt, ibmvfc_sync_completion, IBMVFC_MAD_FORMAT);
1880 	plogi = &evt->iu.plogi;
1881 	memset(plogi, 0, sizeof(*plogi));
1882 	plogi->common.version = cpu_to_be32(1);
1883 	plogi->common.opcode = cpu_to_be32(IBMVFC_PORT_LOGIN);
1884 	plogi->common.length = cpu_to_be16(sizeof(*plogi));
1885 	plogi->scsi_id = cpu_to_be64(port_id);
1886 	evt->sync_iu = &rsp_iu;
1887 	init_completion(&evt->comp);
1888 
1889 	rc = ibmvfc_send_event(evt, vhost, default_timeout);
1890 	spin_unlock_irqrestore(vhost->host->host_lock, flags);
1891 
1892 	if (rc)
1893 		return -EIO;
1894 
1895 	wait_for_completion(&evt->comp);
1896 
1897 	if (rsp_iu.plogi.common.status)
1898 		rc = -EIO;
1899 
1900 	spin_lock_irqsave(vhost->host->host_lock, flags);
1901 	ibmvfc_free_event(evt);
1902 unlock_out:
1903 	spin_unlock_irqrestore(vhost->host->host_lock, flags);
1904 	LEAVE;
1905 	return rc;
1906 }
1907 
1908 /**
1909  * ibmvfc_bsg_request - Handle a BSG request
1910  * @job:	struct bsg_job to be executed
1911  *
1912  * Returns:
1913  *	0 on success / other on failure
1914  **/
1915 static int ibmvfc_bsg_request(struct bsg_job *job)
1916 {
1917 	struct ibmvfc_host *vhost = shost_priv(fc_bsg_to_shost(job));
1918 	struct fc_rport *rport = fc_bsg_to_rport(job);
1919 	struct ibmvfc_passthru_mad *mad;
1920 	struct ibmvfc_event *evt;
1921 	union ibmvfc_iu rsp_iu;
1922 	unsigned long flags, port_id = -1;
1923 	struct fc_bsg_request *bsg_request = job->request;
1924 	struct fc_bsg_reply *bsg_reply = job->reply;
1925 	unsigned int code = bsg_request->msgcode;
1926 	int rc = 0, req_seg, rsp_seg, issue_login = 0;
1927 	u32 fc_flags, rsp_len;
1928 
1929 	ENTER;
1930 	bsg_reply->reply_payload_rcv_len = 0;
1931 	if (rport)
1932 		port_id = rport->port_id;
1933 
1934 	switch (code) {
1935 	case FC_BSG_HST_ELS_NOLOGIN:
1936 		port_id = (bsg_request->rqst_data.h_els.port_id[0] << 16) |
1937 			(bsg_request->rqst_data.h_els.port_id[1] << 8) |
1938 			bsg_request->rqst_data.h_els.port_id[2];
1939 		fallthrough;
1940 	case FC_BSG_RPT_ELS:
1941 		fc_flags = IBMVFC_FC_ELS;
1942 		break;
1943 	case FC_BSG_HST_CT:
1944 		issue_login = 1;
1945 		port_id = (bsg_request->rqst_data.h_ct.port_id[0] << 16) |
1946 			(bsg_request->rqst_data.h_ct.port_id[1] << 8) |
1947 			bsg_request->rqst_data.h_ct.port_id[2];
1948 		fallthrough;
1949 	case FC_BSG_RPT_CT:
1950 		fc_flags = IBMVFC_FC_CT_IU;
1951 		break;
1952 	default:
1953 		return -ENOTSUPP;
1954 	}
1955 
1956 	if (port_id == -1)
1957 		return -EINVAL;
1958 	if (!mutex_trylock(&vhost->passthru_mutex))
1959 		return -EBUSY;
1960 
1961 	job->dd_data = (void *)port_id;
1962 	req_seg = dma_map_sg(vhost->dev, job->request_payload.sg_list,
1963 			     job->request_payload.sg_cnt, DMA_TO_DEVICE);
1964 
1965 	if (!req_seg) {
1966 		mutex_unlock(&vhost->passthru_mutex);
1967 		return -ENOMEM;
1968 	}
1969 
1970 	rsp_seg = dma_map_sg(vhost->dev, job->reply_payload.sg_list,
1971 			     job->reply_payload.sg_cnt, DMA_FROM_DEVICE);
1972 
1973 	if (!rsp_seg) {
1974 		dma_unmap_sg(vhost->dev, job->request_payload.sg_list,
1975 			     job->request_payload.sg_cnt, DMA_TO_DEVICE);
1976 		mutex_unlock(&vhost->passthru_mutex);
1977 		return -ENOMEM;
1978 	}
1979 
1980 	if (req_seg > 1 || rsp_seg > 1) {
1981 		rc = -EINVAL;
1982 		goto out;
1983 	}
1984 
1985 	if (issue_login)
1986 		rc = ibmvfc_bsg_plogi(vhost, port_id);
1987 
1988 	spin_lock_irqsave(vhost->host->host_lock, flags);
1989 
1990 	if (unlikely(rc || (rport && (rc = fc_remote_port_chkready(rport)))) ||
1991 	    unlikely((rc = ibmvfc_host_chkready(vhost)))) {
1992 		spin_unlock_irqrestore(vhost->host->host_lock, flags);
1993 		goto out;
1994 	}
1995 
1996 	evt = ibmvfc_get_event(vhost);
1997 	ibmvfc_init_event(evt, ibmvfc_sync_completion, IBMVFC_MAD_FORMAT);
1998 	mad = &evt->iu.passthru;
1999 
2000 	memset(mad, 0, sizeof(*mad));
2001 	mad->common.version = cpu_to_be32(1);
2002 	mad->common.opcode = cpu_to_be32(IBMVFC_PASSTHRU);
2003 	mad->common.length = cpu_to_be16(sizeof(*mad) - sizeof(mad->fc_iu) - sizeof(mad->iu));
2004 
2005 	mad->cmd_ioba.va = cpu_to_be64(be64_to_cpu(evt->crq.ioba) +
2006 		offsetof(struct ibmvfc_passthru_mad, iu));
2007 	mad->cmd_ioba.len = cpu_to_be32(sizeof(mad->iu));
2008 
2009 	mad->iu.cmd_len = cpu_to_be32(job->request_payload.payload_len);
2010 	mad->iu.rsp_len = cpu_to_be32(job->reply_payload.payload_len);
2011 	mad->iu.flags = cpu_to_be32(fc_flags);
2012 	mad->iu.cancel_key = cpu_to_be32(IBMVFC_PASSTHRU_CANCEL_KEY);
2013 
2014 	mad->iu.cmd.va = cpu_to_be64(sg_dma_address(job->request_payload.sg_list));
2015 	mad->iu.cmd.len = cpu_to_be32(sg_dma_len(job->request_payload.sg_list));
2016 	mad->iu.rsp.va = cpu_to_be64(sg_dma_address(job->reply_payload.sg_list));
2017 	mad->iu.rsp.len = cpu_to_be32(sg_dma_len(job->reply_payload.sg_list));
2018 	mad->iu.scsi_id = cpu_to_be64(port_id);
2019 	mad->iu.tag = cpu_to_be64((u64)evt);
2020 	rsp_len = be32_to_cpu(mad->iu.rsp.len);
2021 
2022 	evt->sync_iu = &rsp_iu;
2023 	init_completion(&evt->comp);
2024 	rc = ibmvfc_send_event(evt, vhost, 0);
2025 	spin_unlock_irqrestore(vhost->host->host_lock, flags);
2026 
2027 	if (rc) {
2028 		rc = -EIO;
2029 		goto out;
2030 	}
2031 
2032 	wait_for_completion(&evt->comp);
2033 
2034 	if (rsp_iu.passthru.common.status)
2035 		rc = -EIO;
2036 	else
2037 		bsg_reply->reply_payload_rcv_len = rsp_len;
2038 
2039 	spin_lock_irqsave(vhost->host->host_lock, flags);
2040 	ibmvfc_free_event(evt);
2041 	spin_unlock_irqrestore(vhost->host->host_lock, flags);
2042 	bsg_reply->result = rc;
2043 	bsg_job_done(job, bsg_reply->result,
2044 		       bsg_reply->reply_payload_rcv_len);
2045 	rc = 0;
2046 out:
2047 	dma_unmap_sg(vhost->dev, job->request_payload.sg_list,
2048 		     job->request_payload.sg_cnt, DMA_TO_DEVICE);
2049 	dma_unmap_sg(vhost->dev, job->reply_payload.sg_list,
2050 		     job->reply_payload.sg_cnt, DMA_FROM_DEVICE);
2051 	mutex_unlock(&vhost->passthru_mutex);
2052 	LEAVE;
2053 	return rc;
2054 }
2055 
2056 /**
2057  * ibmvfc_reset_device - Reset the device with the specified reset type
2058  * @sdev:	scsi device to reset
2059  * @type:	reset type
2060  * @desc:	reset type description for log messages
2061  *
2062  * Returns:
2063  *	0 on success / other on failure
2064  **/
2065 static int ibmvfc_reset_device(struct scsi_device *sdev, int type, char *desc)
2066 {
2067 	struct ibmvfc_host *vhost = shost_priv(sdev->host);
2068 	struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
2069 	struct ibmvfc_cmd *tmf;
2070 	struct ibmvfc_event *evt = NULL;
2071 	union ibmvfc_iu rsp_iu;
2072 	struct ibmvfc_fcp_cmd_iu *iu;
2073 	struct ibmvfc_fcp_rsp *fc_rsp = ibmvfc_get_fcp_rsp(vhost, &rsp_iu.cmd);
2074 	int rsp_rc = -EBUSY;
2075 	unsigned long flags;
2076 	int rsp_code = 0;
2077 
2078 	spin_lock_irqsave(vhost->host->host_lock, flags);
2079 	if (vhost->state == IBMVFC_ACTIVE) {
2080 		evt = ibmvfc_get_event(vhost);
2081 		ibmvfc_init_event(evt, ibmvfc_sync_completion, IBMVFC_CMD_FORMAT);
2082 		tmf = ibmvfc_init_vfc_cmd(evt, sdev);
2083 		iu = ibmvfc_get_fcp_iu(vhost, tmf);
2084 
2085 		tmf->flags = cpu_to_be16((IBMVFC_NO_MEM_DESC | IBMVFC_TMF));
2086 		if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN))
2087 			tmf->target_wwpn = cpu_to_be64(rport->port_name);
2088 		iu->tmf_flags = type;
2089 		evt->sync_iu = &rsp_iu;
2090 
2091 		init_completion(&evt->comp);
2092 		rsp_rc = ibmvfc_send_event(evt, vhost, default_timeout);
2093 	}
2094 	spin_unlock_irqrestore(vhost->host->host_lock, flags);
2095 
2096 	if (rsp_rc != 0) {
2097 		sdev_printk(KERN_ERR, sdev, "Failed to send %s reset event. rc=%d\n",
2098 			    desc, rsp_rc);
2099 		return -EIO;
2100 	}
2101 
2102 	sdev_printk(KERN_INFO, sdev, "Resetting %s\n", desc);
2103 	wait_for_completion(&evt->comp);
2104 
2105 	if (rsp_iu.cmd.status)
2106 		rsp_code = ibmvfc_get_err_result(vhost, &rsp_iu.cmd);
2107 
2108 	if (rsp_code) {
2109 		if (fc_rsp->flags & FCP_RSP_LEN_VALID)
2110 			rsp_code = fc_rsp->data.info.rsp_code;
2111 
2112 		sdev_printk(KERN_ERR, sdev, "%s reset failed: %s (%x:%x) "
2113 			    "flags: %x fcp_rsp: %x, scsi_status: %x\n", desc,
2114 			    ibmvfc_get_cmd_error(be16_to_cpu(rsp_iu.cmd.status), be16_to_cpu(rsp_iu.cmd.error)),
2115 			    be16_to_cpu(rsp_iu.cmd.status), be16_to_cpu(rsp_iu.cmd.error), fc_rsp->flags, rsp_code,
2116 			    fc_rsp->scsi_status);
2117 		rsp_rc = -EIO;
2118 	} else
2119 		sdev_printk(KERN_INFO, sdev, "%s reset successful\n", desc);
2120 
2121 	spin_lock_irqsave(vhost->host->host_lock, flags);
2122 	ibmvfc_free_event(evt);
2123 	spin_unlock_irqrestore(vhost->host->host_lock, flags);
2124 	return rsp_rc;
2125 }
2126 
2127 /**
2128  * ibmvfc_match_rport - Match function for specified remote port
2129  * @evt:	ibmvfc event struct
2130  * @device:	device to match (rport)
2131  *
2132  * Returns:
2133  *	1 if event matches rport / 0 if event does not match rport
2134  **/
2135 static int ibmvfc_match_rport(struct ibmvfc_event *evt, void *rport)
2136 {
2137 	struct fc_rport *cmd_rport;
2138 
2139 	if (evt->cmnd) {
2140 		cmd_rport = starget_to_rport(scsi_target(evt->cmnd->device));
2141 		if (cmd_rport == rport)
2142 			return 1;
2143 	}
2144 	return 0;
2145 }
2146 
2147 /**
2148  * ibmvfc_match_target - Match function for specified target
2149  * @evt:	ibmvfc event struct
2150  * @device:	device to match (starget)
2151  *
2152  * Returns:
2153  *	1 if event matches starget / 0 if event does not match starget
2154  **/
2155 static int ibmvfc_match_target(struct ibmvfc_event *evt, void *device)
2156 {
2157 	if (evt->cmnd && scsi_target(evt->cmnd->device) == device)
2158 		return 1;
2159 	return 0;
2160 }
2161 
2162 /**
2163  * ibmvfc_match_lun - Match function for specified LUN
2164  * @evt:	ibmvfc event struct
2165  * @device:	device to match (sdev)
2166  *
2167  * Returns:
2168  *	1 if event matches sdev / 0 if event does not match sdev
2169  **/
2170 static int ibmvfc_match_lun(struct ibmvfc_event *evt, void *device)
2171 {
2172 	if (evt->cmnd && evt->cmnd->device == device)
2173 		return 1;
2174 	return 0;
2175 }
2176 
2177 /**
2178  * ibmvfc_wait_for_ops - Wait for ops to complete
2179  * @vhost:	ibmvfc host struct
2180  * @device:	device to match (starget or sdev)
2181  * @match:	match function
2182  *
2183  * Returns:
2184  *	SUCCESS / FAILED
2185  **/
2186 static int ibmvfc_wait_for_ops(struct ibmvfc_host *vhost, void *device,
2187 			       int (*match) (struct ibmvfc_event *, void *))
2188 {
2189 	struct ibmvfc_event *evt;
2190 	DECLARE_COMPLETION_ONSTACK(comp);
2191 	int wait;
2192 	unsigned long flags;
2193 	signed long timeout = IBMVFC_ABORT_WAIT_TIMEOUT * HZ;
2194 
2195 	ENTER;
2196 	do {
2197 		wait = 0;
2198 		spin_lock_irqsave(vhost->host->host_lock, flags);
2199 		list_for_each_entry(evt, &vhost->sent, queue) {
2200 			if (match(evt, device)) {
2201 				evt->eh_comp = &comp;
2202 				wait++;
2203 			}
2204 		}
2205 		spin_unlock_irqrestore(vhost->host->host_lock, flags);
2206 
2207 		if (wait) {
2208 			timeout = wait_for_completion_timeout(&comp, timeout);
2209 
2210 			if (!timeout) {
2211 				wait = 0;
2212 				spin_lock_irqsave(vhost->host->host_lock, flags);
2213 				list_for_each_entry(evt, &vhost->sent, queue) {
2214 					if (match(evt, device)) {
2215 						evt->eh_comp = NULL;
2216 						wait++;
2217 					}
2218 				}
2219 				spin_unlock_irqrestore(vhost->host->host_lock, flags);
2220 				if (wait)
2221 					dev_err(vhost->dev, "Timed out waiting for aborted commands\n");
2222 				LEAVE;
2223 				return wait ? FAILED : SUCCESS;
2224 			}
2225 		}
2226 	} while (wait);
2227 
2228 	LEAVE;
2229 	return SUCCESS;
2230 }
2231 
2232 /**
2233  * ibmvfc_cancel_all - Cancel all outstanding commands to the device
2234  * @sdev:	scsi device to cancel commands
2235  * @type:	type of error recovery being performed
2236  *
2237  * This sends a cancel to the VIOS for the specified device. This does
2238  * NOT send any abort to the actual device. That must be done separately.
2239  *
2240  * Returns:
2241  *	0 on success / other on failure
2242  **/
2243 static int ibmvfc_cancel_all(struct scsi_device *sdev, int type)
2244 {
2245 	struct ibmvfc_host *vhost = shost_priv(sdev->host);
2246 	struct scsi_target *starget = scsi_target(sdev);
2247 	struct fc_rport *rport = starget_to_rport(starget);
2248 	struct ibmvfc_tmf *tmf;
2249 	struct ibmvfc_event *evt, *found_evt;
2250 	union ibmvfc_iu rsp;
2251 	int rsp_rc = -EBUSY;
2252 	unsigned long flags;
2253 	u16 status;
2254 
2255 	ENTER;
2256 	spin_lock_irqsave(vhost->host->host_lock, flags);
2257 	found_evt = NULL;
2258 	list_for_each_entry(evt, &vhost->sent, queue) {
2259 		if (evt->cmnd && evt->cmnd->device == sdev) {
2260 			found_evt = evt;
2261 			break;
2262 		}
2263 	}
2264 
2265 	if (!found_evt) {
2266 		if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL)
2267 			sdev_printk(KERN_INFO, sdev, "No events found to cancel\n");
2268 		spin_unlock_irqrestore(vhost->host->host_lock, flags);
2269 		return 0;
2270 	}
2271 
2272 	if (vhost->logged_in) {
2273 		evt = ibmvfc_get_event(vhost);
2274 		ibmvfc_init_event(evt, ibmvfc_sync_completion, IBMVFC_MAD_FORMAT);
2275 
2276 		tmf = &evt->iu.tmf;
2277 		memset(tmf, 0, sizeof(*tmf));
2278 		if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN)) {
2279 			tmf->common.version = cpu_to_be32(2);
2280 			tmf->target_wwpn = cpu_to_be64(rport->port_name);
2281 		} else {
2282 			tmf->common.version = cpu_to_be32(1);
2283 		}
2284 		tmf->common.opcode = cpu_to_be32(IBMVFC_TMF_MAD);
2285 		tmf->common.length = cpu_to_be16(sizeof(*tmf));
2286 		tmf->scsi_id = cpu_to_be64(rport->port_id);
2287 		int_to_scsilun(sdev->lun, &tmf->lun);
2288 		if (!ibmvfc_check_caps(vhost, IBMVFC_CAN_SUPPRESS_ABTS))
2289 			type &= ~IBMVFC_TMF_SUPPRESS_ABTS;
2290 		if (vhost->state == IBMVFC_ACTIVE)
2291 			tmf->flags = cpu_to_be32((type | IBMVFC_TMF_LUA_VALID));
2292 		else
2293 			tmf->flags = cpu_to_be32(((type & IBMVFC_TMF_SUPPRESS_ABTS) | IBMVFC_TMF_LUA_VALID));
2294 		tmf->cancel_key = cpu_to_be32((unsigned long)sdev->hostdata);
2295 		tmf->my_cancel_key = cpu_to_be32((unsigned long)starget->hostdata);
2296 
2297 		evt->sync_iu = &rsp;
2298 		init_completion(&evt->comp);
2299 		rsp_rc = ibmvfc_send_event(evt, vhost, default_timeout);
2300 	}
2301 
2302 	spin_unlock_irqrestore(vhost->host->host_lock, flags);
2303 
2304 	if (rsp_rc != 0) {
2305 		sdev_printk(KERN_ERR, sdev, "Failed to send cancel event. rc=%d\n", rsp_rc);
2306 		/* If failure is received, the host adapter is most likely going
2307 		 through reset, return success so the caller will wait for the command
2308 		 being cancelled to get returned */
2309 		return 0;
2310 	}
2311 
2312 	sdev_printk(KERN_INFO, sdev, "Cancelling outstanding commands.\n");
2313 
2314 	wait_for_completion(&evt->comp);
2315 	status = be16_to_cpu(rsp.mad_common.status);
2316 	spin_lock_irqsave(vhost->host->host_lock, flags);
2317 	ibmvfc_free_event(evt);
2318 	spin_unlock_irqrestore(vhost->host->host_lock, flags);
2319 
2320 	if (status != IBMVFC_MAD_SUCCESS) {
2321 		sdev_printk(KERN_WARNING, sdev, "Cancel failed with rc=%x\n", status);
2322 		switch (status) {
2323 		case IBMVFC_MAD_DRIVER_FAILED:
2324 		case IBMVFC_MAD_CRQ_ERROR:
2325 			/* Host adapter most likely going through reset, return success to
2326 			 the caller will wait for the command being cancelled to get returned */
2327 			return 0;
2328 		default:
2329 			return -EIO;
2330 		};
2331 	}
2332 
2333 	sdev_printk(KERN_INFO, sdev, "Successfully cancelled outstanding commands\n");
2334 	return 0;
2335 }
2336 
2337 /**
2338  * ibmvfc_match_key - Match function for specified cancel key
2339  * @evt:	ibmvfc event struct
2340  * @key:	cancel key to match
2341  *
2342  * Returns:
2343  *	1 if event matches key / 0 if event does not match key
2344  **/
2345 static int ibmvfc_match_key(struct ibmvfc_event *evt, void *key)
2346 {
2347 	unsigned long cancel_key = (unsigned long)key;
2348 
2349 	if (evt->crq.format == IBMVFC_CMD_FORMAT &&
2350 	    be32_to_cpu(evt->iu.cmd.cancel_key) == cancel_key)
2351 		return 1;
2352 	return 0;
2353 }
2354 
2355 /**
2356  * ibmvfc_match_evt - Match function for specified event
2357  * @evt:	ibmvfc event struct
2358  * @match:	event to match
2359  *
2360  * Returns:
2361  *	1 if event matches key / 0 if event does not match key
2362  **/
2363 static int ibmvfc_match_evt(struct ibmvfc_event *evt, void *match)
2364 {
2365 	if (evt == match)
2366 		return 1;
2367 	return 0;
2368 }
2369 
2370 /**
2371  * ibmvfc_abort_task_set - Abort outstanding commands to the device
2372  * @sdev:	scsi device to abort commands
2373  *
2374  * This sends an Abort Task Set to the VIOS for the specified device. This does
2375  * NOT send any cancel to the VIOS. That must be done separately.
2376  *
2377  * Returns:
2378  *	0 on success / other on failure
2379  **/
2380 static int ibmvfc_abort_task_set(struct scsi_device *sdev)
2381 {
2382 	struct ibmvfc_host *vhost = shost_priv(sdev->host);
2383 	struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
2384 	struct ibmvfc_cmd *tmf;
2385 	struct ibmvfc_event *evt, *found_evt;
2386 	union ibmvfc_iu rsp_iu;
2387 	struct ibmvfc_fcp_cmd_iu *iu;
2388 	struct ibmvfc_fcp_rsp *fc_rsp = ibmvfc_get_fcp_rsp(vhost, &rsp_iu.cmd);
2389 	int rc, rsp_rc = -EBUSY;
2390 	unsigned long flags, timeout = IBMVFC_ABORT_TIMEOUT;
2391 	int rsp_code = 0;
2392 
2393 	spin_lock_irqsave(vhost->host->host_lock, flags);
2394 	found_evt = NULL;
2395 	list_for_each_entry(evt, &vhost->sent, queue) {
2396 		if (evt->cmnd && evt->cmnd->device == sdev) {
2397 			found_evt = evt;
2398 			break;
2399 		}
2400 	}
2401 
2402 	if (!found_evt) {
2403 		if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL)
2404 			sdev_printk(KERN_INFO, sdev, "No events found to abort\n");
2405 		spin_unlock_irqrestore(vhost->host->host_lock, flags);
2406 		return 0;
2407 	}
2408 
2409 	if (vhost->state == IBMVFC_ACTIVE) {
2410 		evt = ibmvfc_get_event(vhost);
2411 		ibmvfc_init_event(evt, ibmvfc_sync_completion, IBMVFC_CMD_FORMAT);
2412 		tmf = ibmvfc_init_vfc_cmd(evt, sdev);
2413 		iu = ibmvfc_get_fcp_iu(vhost, tmf);
2414 
2415 		if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN))
2416 			tmf->target_wwpn = cpu_to_be64(rport->port_name);
2417 		iu->tmf_flags = IBMVFC_ABORT_TASK_SET;
2418 		tmf->flags = cpu_to_be16((IBMVFC_NO_MEM_DESC | IBMVFC_TMF));
2419 		evt->sync_iu = &rsp_iu;
2420 
2421 		tmf->correlation = cpu_to_be64(evt);
2422 
2423 		init_completion(&evt->comp);
2424 		rsp_rc = ibmvfc_send_event(evt, vhost, default_timeout);
2425 	}
2426 
2427 	spin_unlock_irqrestore(vhost->host->host_lock, flags);
2428 
2429 	if (rsp_rc != 0) {
2430 		sdev_printk(KERN_ERR, sdev, "Failed to send abort. rc=%d\n", rsp_rc);
2431 		return -EIO;
2432 	}
2433 
2434 	sdev_printk(KERN_INFO, sdev, "Aborting outstanding commands\n");
2435 	timeout = wait_for_completion_timeout(&evt->comp, timeout);
2436 
2437 	if (!timeout) {
2438 		rc = ibmvfc_cancel_all(sdev, 0);
2439 		if (!rc) {
2440 			rc = ibmvfc_wait_for_ops(vhost, sdev->hostdata, ibmvfc_match_key);
2441 			if (rc == SUCCESS)
2442 				rc = 0;
2443 		}
2444 
2445 		if (rc) {
2446 			sdev_printk(KERN_INFO, sdev, "Cancel failed, resetting host\n");
2447 			ibmvfc_reset_host(vhost);
2448 			rsp_rc = -EIO;
2449 			rc = ibmvfc_wait_for_ops(vhost, sdev->hostdata, ibmvfc_match_key);
2450 
2451 			if (rc == SUCCESS)
2452 				rsp_rc = 0;
2453 
2454 			rc = ibmvfc_wait_for_ops(vhost, evt, ibmvfc_match_evt);
2455 			if (rc != SUCCESS) {
2456 				spin_lock_irqsave(vhost->host->host_lock, flags);
2457 				ibmvfc_hard_reset_host(vhost);
2458 				spin_unlock_irqrestore(vhost->host->host_lock, flags);
2459 				rsp_rc = 0;
2460 			}
2461 
2462 			goto out;
2463 		}
2464 	}
2465 
2466 	if (rsp_iu.cmd.status)
2467 		rsp_code = ibmvfc_get_err_result(vhost, &rsp_iu.cmd);
2468 
2469 	if (rsp_code) {
2470 		if (fc_rsp->flags & FCP_RSP_LEN_VALID)
2471 			rsp_code = fc_rsp->data.info.rsp_code;
2472 
2473 		sdev_printk(KERN_ERR, sdev, "Abort failed: %s (%x:%x) "
2474 			    "flags: %x fcp_rsp: %x, scsi_status: %x\n",
2475 			    ibmvfc_get_cmd_error(be16_to_cpu(rsp_iu.cmd.status), be16_to_cpu(rsp_iu.cmd.error)),
2476 			    be16_to_cpu(rsp_iu.cmd.status), be16_to_cpu(rsp_iu.cmd.error), fc_rsp->flags, rsp_code,
2477 			    fc_rsp->scsi_status);
2478 		rsp_rc = -EIO;
2479 	} else
2480 		sdev_printk(KERN_INFO, sdev, "Abort successful\n");
2481 
2482 out:
2483 	spin_lock_irqsave(vhost->host->host_lock, flags);
2484 	ibmvfc_free_event(evt);
2485 	spin_unlock_irqrestore(vhost->host->host_lock, flags);
2486 	return rsp_rc;
2487 }
2488 
2489 /**
2490  * ibmvfc_eh_abort_handler - Abort a command
2491  * @cmd:	scsi command to abort
2492  *
2493  * Returns:
2494  *	SUCCESS / FAST_IO_FAIL / FAILED
2495  **/
2496 static int ibmvfc_eh_abort_handler(struct scsi_cmnd *cmd)
2497 {
2498 	struct scsi_device *sdev = cmd->device;
2499 	struct ibmvfc_host *vhost = shost_priv(sdev->host);
2500 	int cancel_rc, block_rc;
2501 	int rc = FAILED;
2502 
2503 	ENTER;
2504 	block_rc = fc_block_scsi_eh(cmd);
2505 	ibmvfc_wait_while_resetting(vhost);
2506 	if (block_rc != FAST_IO_FAIL) {
2507 		cancel_rc = ibmvfc_cancel_all(sdev, IBMVFC_TMF_ABORT_TASK_SET);
2508 		ibmvfc_abort_task_set(sdev);
2509 	} else
2510 		cancel_rc = ibmvfc_cancel_all(sdev, IBMVFC_TMF_SUPPRESS_ABTS);
2511 
2512 	if (!cancel_rc)
2513 		rc = ibmvfc_wait_for_ops(vhost, sdev, ibmvfc_match_lun);
2514 
2515 	if (block_rc == FAST_IO_FAIL && rc != FAILED)
2516 		rc = FAST_IO_FAIL;
2517 
2518 	LEAVE;
2519 	return rc;
2520 }
2521 
2522 /**
2523  * ibmvfc_eh_device_reset_handler - Reset a single LUN
2524  * @cmd:	scsi command struct
2525  *
2526  * Returns:
2527  *	SUCCESS / FAST_IO_FAIL / FAILED
2528  **/
2529 static int ibmvfc_eh_device_reset_handler(struct scsi_cmnd *cmd)
2530 {
2531 	struct scsi_device *sdev = cmd->device;
2532 	struct ibmvfc_host *vhost = shost_priv(sdev->host);
2533 	int cancel_rc, block_rc, reset_rc = 0;
2534 	int rc = FAILED;
2535 
2536 	ENTER;
2537 	block_rc = fc_block_scsi_eh(cmd);
2538 	ibmvfc_wait_while_resetting(vhost);
2539 	if (block_rc != FAST_IO_FAIL) {
2540 		cancel_rc = ibmvfc_cancel_all(sdev, IBMVFC_TMF_LUN_RESET);
2541 		reset_rc = ibmvfc_reset_device(sdev, IBMVFC_LUN_RESET, "LUN");
2542 	} else
2543 		cancel_rc = ibmvfc_cancel_all(sdev, IBMVFC_TMF_SUPPRESS_ABTS);
2544 
2545 	if (!cancel_rc && !reset_rc)
2546 		rc = ibmvfc_wait_for_ops(vhost, sdev, ibmvfc_match_lun);
2547 
2548 	if (block_rc == FAST_IO_FAIL && rc != FAILED)
2549 		rc = FAST_IO_FAIL;
2550 
2551 	LEAVE;
2552 	return rc;
2553 }
2554 
2555 /**
2556  * ibmvfc_dev_cancel_all_noreset - Device iterated cancel all function
2557  * @sdev:	scsi device struct
2558  * @data:	return code
2559  *
2560  **/
2561 static void ibmvfc_dev_cancel_all_noreset(struct scsi_device *sdev, void *data)
2562 {
2563 	unsigned long *rc = data;
2564 	*rc |= ibmvfc_cancel_all(sdev, IBMVFC_TMF_SUPPRESS_ABTS);
2565 }
2566 
2567 /**
2568  * ibmvfc_dev_cancel_all_reset - Device iterated cancel all function
2569  * @sdev:	scsi device struct
2570  * @data:	return code
2571  *
2572  **/
2573 static void ibmvfc_dev_cancel_all_reset(struct scsi_device *sdev, void *data)
2574 {
2575 	unsigned long *rc = data;
2576 	*rc |= ibmvfc_cancel_all(sdev, IBMVFC_TMF_TGT_RESET);
2577 }
2578 
2579 /**
2580  * ibmvfc_eh_target_reset_handler - Reset the target
2581  * @cmd:	scsi command struct
2582  *
2583  * Returns:
2584  *	SUCCESS / FAST_IO_FAIL / FAILED
2585  **/
2586 static int ibmvfc_eh_target_reset_handler(struct scsi_cmnd *cmd)
2587 {
2588 	struct scsi_device *sdev = cmd->device;
2589 	struct ibmvfc_host *vhost = shost_priv(sdev->host);
2590 	struct scsi_target *starget = scsi_target(sdev);
2591 	int block_rc;
2592 	int reset_rc = 0;
2593 	int rc = FAILED;
2594 	unsigned long cancel_rc = 0;
2595 
2596 	ENTER;
2597 	block_rc = fc_block_scsi_eh(cmd);
2598 	ibmvfc_wait_while_resetting(vhost);
2599 	if (block_rc != FAST_IO_FAIL) {
2600 		starget_for_each_device(starget, &cancel_rc, ibmvfc_dev_cancel_all_reset);
2601 		reset_rc = ibmvfc_reset_device(sdev, IBMVFC_TARGET_RESET, "target");
2602 	} else
2603 		starget_for_each_device(starget, &cancel_rc, ibmvfc_dev_cancel_all_noreset);
2604 
2605 	if (!cancel_rc && !reset_rc)
2606 		rc = ibmvfc_wait_for_ops(vhost, starget, ibmvfc_match_target);
2607 
2608 	if (block_rc == FAST_IO_FAIL && rc != FAILED)
2609 		rc = FAST_IO_FAIL;
2610 
2611 	LEAVE;
2612 	return rc;
2613 }
2614 
2615 /**
2616  * ibmvfc_eh_host_reset_handler - Reset the connection to the server
2617  * @cmd:	struct scsi_cmnd having problems
2618  *
2619  **/
2620 static int ibmvfc_eh_host_reset_handler(struct scsi_cmnd *cmd)
2621 {
2622 	int rc;
2623 	struct ibmvfc_host *vhost = shost_priv(cmd->device->host);
2624 
2625 	dev_err(vhost->dev, "Resetting connection due to error recovery\n");
2626 	rc = ibmvfc_issue_fc_host_lip(vhost->host);
2627 
2628 	return rc ? FAILED : SUCCESS;
2629 }
2630 
2631 /**
2632  * ibmvfc_terminate_rport_io - Terminate all pending I/O to the rport.
2633  * @rport:		rport struct
2634  *
2635  * Return value:
2636  * 	none
2637  **/
2638 static void ibmvfc_terminate_rport_io(struct fc_rport *rport)
2639 {
2640 	struct Scsi_Host *shost = rport_to_shost(rport);
2641 	struct ibmvfc_host *vhost = shost_priv(shost);
2642 	struct fc_rport *dev_rport;
2643 	struct scsi_device *sdev;
2644 	struct ibmvfc_target *tgt;
2645 	unsigned long rc, flags;
2646 	unsigned int found;
2647 
2648 	ENTER;
2649 	shost_for_each_device(sdev, shost) {
2650 		dev_rport = starget_to_rport(scsi_target(sdev));
2651 		if (dev_rport != rport)
2652 			continue;
2653 		ibmvfc_cancel_all(sdev, IBMVFC_TMF_SUPPRESS_ABTS);
2654 	}
2655 
2656 	rc = ibmvfc_wait_for_ops(vhost, rport, ibmvfc_match_rport);
2657 
2658 	if (rc == FAILED)
2659 		ibmvfc_issue_fc_host_lip(shost);
2660 
2661 	spin_lock_irqsave(shost->host_lock, flags);
2662 	found = 0;
2663 	list_for_each_entry(tgt, &vhost->targets, queue) {
2664 		if (tgt->scsi_id == rport->port_id) {
2665 			found++;
2666 			break;
2667 		}
2668 	}
2669 
2670 	if (found && tgt->action == IBMVFC_TGT_ACTION_LOGOUT_DELETED_RPORT) {
2671 		/*
2672 		 * If we get here, that means we previously attempted to send
2673 		 * an implicit logout to the target but it failed, most likely
2674 		 * due to I/O being pending, so we need to send it again
2675 		 */
2676 		ibmvfc_del_tgt(tgt);
2677 		ibmvfc_reinit_host(vhost);
2678 	}
2679 
2680 	spin_unlock_irqrestore(shost->host_lock, flags);
2681 	LEAVE;
2682 }
2683 
2684 static const struct ibmvfc_async_desc ae_desc [] = {
2685 	{ "PLOGI",	IBMVFC_AE_ELS_PLOGI,	IBMVFC_DEFAULT_LOG_LEVEL + 1 },
2686 	{ "LOGO",	IBMVFC_AE_ELS_LOGO,	IBMVFC_DEFAULT_LOG_LEVEL + 1 },
2687 	{ "PRLO",	IBMVFC_AE_ELS_PRLO,	IBMVFC_DEFAULT_LOG_LEVEL + 1 },
2688 	{ "N-Port SCN",	IBMVFC_AE_SCN_NPORT,	IBMVFC_DEFAULT_LOG_LEVEL + 1 },
2689 	{ "Group SCN",	IBMVFC_AE_SCN_GROUP,	IBMVFC_DEFAULT_LOG_LEVEL + 1 },
2690 	{ "Domain SCN",	IBMVFC_AE_SCN_DOMAIN,	IBMVFC_DEFAULT_LOG_LEVEL },
2691 	{ "Fabric SCN",	IBMVFC_AE_SCN_FABRIC,	IBMVFC_DEFAULT_LOG_LEVEL },
2692 	{ "Link Up",	IBMVFC_AE_LINK_UP,	IBMVFC_DEFAULT_LOG_LEVEL },
2693 	{ "Link Down",	IBMVFC_AE_LINK_DOWN,	IBMVFC_DEFAULT_LOG_LEVEL },
2694 	{ "Link Dead",	IBMVFC_AE_LINK_DEAD,	IBMVFC_DEFAULT_LOG_LEVEL },
2695 	{ "Halt",	IBMVFC_AE_HALT,		IBMVFC_DEFAULT_LOG_LEVEL },
2696 	{ "Resume",	IBMVFC_AE_RESUME,	IBMVFC_DEFAULT_LOG_LEVEL },
2697 	{ "Adapter Failed", IBMVFC_AE_ADAPTER_FAILED, IBMVFC_DEFAULT_LOG_LEVEL },
2698 };
2699 
2700 static const struct ibmvfc_async_desc unknown_ae = {
2701 	"Unknown async", 0, IBMVFC_DEFAULT_LOG_LEVEL
2702 };
2703 
2704 /**
2705  * ibmvfc_get_ae_desc - Get text description for async event
2706  * @ae:	async event
2707  *
2708  **/
2709 static const struct ibmvfc_async_desc *ibmvfc_get_ae_desc(u64 ae)
2710 {
2711 	int i;
2712 
2713 	for (i = 0; i < ARRAY_SIZE(ae_desc); i++)
2714 		if (ae_desc[i].ae == ae)
2715 			return &ae_desc[i];
2716 
2717 	return &unknown_ae;
2718 }
2719 
2720 static const struct {
2721 	enum ibmvfc_ae_link_state state;
2722 	const char *desc;
2723 } link_desc [] = {
2724 	{ IBMVFC_AE_LS_LINK_UP,		" link up" },
2725 	{ IBMVFC_AE_LS_LINK_BOUNCED,	" link bounced" },
2726 	{ IBMVFC_AE_LS_LINK_DOWN,	" link down" },
2727 	{ IBMVFC_AE_LS_LINK_DEAD,	" link dead" },
2728 };
2729 
2730 /**
2731  * ibmvfc_get_link_state - Get text description for link state
2732  * @state:	link state
2733  *
2734  **/
2735 static const char *ibmvfc_get_link_state(enum ibmvfc_ae_link_state state)
2736 {
2737 	int i;
2738 
2739 	for (i = 0; i < ARRAY_SIZE(link_desc); i++)
2740 		if (link_desc[i].state == state)
2741 			return link_desc[i].desc;
2742 
2743 	return "";
2744 }
2745 
2746 /**
2747  * ibmvfc_handle_async - Handle an async event from the adapter
2748  * @crq:	crq to process
2749  * @vhost:	ibmvfc host struct
2750  *
2751  **/
2752 static void ibmvfc_handle_async(struct ibmvfc_async_crq *crq,
2753 				struct ibmvfc_host *vhost)
2754 {
2755 	const struct ibmvfc_async_desc *desc = ibmvfc_get_ae_desc(be64_to_cpu(crq->event));
2756 	struct ibmvfc_target *tgt;
2757 
2758 	ibmvfc_log(vhost, desc->log_level, "%s event received. scsi_id: %llx, wwpn: %llx,"
2759 		   " node_name: %llx%s\n", desc->desc, be64_to_cpu(crq->scsi_id),
2760 		   be64_to_cpu(crq->wwpn), be64_to_cpu(crq->node_name),
2761 		   ibmvfc_get_link_state(crq->link_state));
2762 
2763 	switch (be64_to_cpu(crq->event)) {
2764 	case IBMVFC_AE_RESUME:
2765 		switch (crq->link_state) {
2766 		case IBMVFC_AE_LS_LINK_DOWN:
2767 			ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN);
2768 			break;
2769 		case IBMVFC_AE_LS_LINK_DEAD:
2770 			ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
2771 			break;
2772 		case IBMVFC_AE_LS_LINK_UP:
2773 		case IBMVFC_AE_LS_LINK_BOUNCED:
2774 		default:
2775 			vhost->events_to_log |= IBMVFC_AE_LINKUP;
2776 			vhost->delay_init = 1;
2777 			__ibmvfc_reset_host(vhost);
2778 			break;
2779 		}
2780 
2781 		break;
2782 	case IBMVFC_AE_LINK_UP:
2783 		vhost->events_to_log |= IBMVFC_AE_LINKUP;
2784 		vhost->delay_init = 1;
2785 		__ibmvfc_reset_host(vhost);
2786 		break;
2787 	case IBMVFC_AE_SCN_FABRIC:
2788 	case IBMVFC_AE_SCN_DOMAIN:
2789 		vhost->events_to_log |= IBMVFC_AE_RSCN;
2790 		if (vhost->state < IBMVFC_HALTED) {
2791 			vhost->delay_init = 1;
2792 			__ibmvfc_reset_host(vhost);
2793 		}
2794 		break;
2795 	case IBMVFC_AE_SCN_NPORT:
2796 	case IBMVFC_AE_SCN_GROUP:
2797 		vhost->events_to_log |= IBMVFC_AE_RSCN;
2798 		ibmvfc_reinit_host(vhost);
2799 		break;
2800 	case IBMVFC_AE_ELS_LOGO:
2801 	case IBMVFC_AE_ELS_PRLO:
2802 	case IBMVFC_AE_ELS_PLOGI:
2803 		list_for_each_entry(tgt, &vhost->targets, queue) {
2804 			if (!crq->scsi_id && !crq->wwpn && !crq->node_name)
2805 				break;
2806 			if (crq->scsi_id && cpu_to_be64(tgt->scsi_id) != crq->scsi_id)
2807 				continue;
2808 			if (crq->wwpn && cpu_to_be64(tgt->ids.port_name) != crq->wwpn)
2809 				continue;
2810 			if (crq->node_name && cpu_to_be64(tgt->ids.node_name) != crq->node_name)
2811 				continue;
2812 			if (tgt->need_login && be64_to_cpu(crq->event) == IBMVFC_AE_ELS_LOGO)
2813 				tgt->logo_rcvd = 1;
2814 			if (!tgt->need_login || be64_to_cpu(crq->event) == IBMVFC_AE_ELS_PLOGI) {
2815 				ibmvfc_del_tgt(tgt);
2816 				ibmvfc_reinit_host(vhost);
2817 			}
2818 		}
2819 		break;
2820 	case IBMVFC_AE_LINK_DOWN:
2821 	case IBMVFC_AE_ADAPTER_FAILED:
2822 		ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN);
2823 		break;
2824 	case IBMVFC_AE_LINK_DEAD:
2825 		ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
2826 		break;
2827 	case IBMVFC_AE_HALT:
2828 		ibmvfc_link_down(vhost, IBMVFC_HALTED);
2829 		break;
2830 	default:
2831 		dev_err(vhost->dev, "Unknown async event received: %lld\n", crq->event);
2832 		break;
2833 	}
2834 }
2835 
2836 /**
2837  * ibmvfc_handle_crq - Handles and frees received events in the CRQ
2838  * @crq:	Command/Response queue
2839  * @vhost:	ibmvfc host struct
2840  *
2841  **/
2842 static void ibmvfc_handle_crq(struct ibmvfc_crq *crq, struct ibmvfc_host *vhost)
2843 {
2844 	long rc;
2845 	struct ibmvfc_event *evt = (struct ibmvfc_event *)be64_to_cpu(crq->ioba);
2846 
2847 	switch (crq->valid) {
2848 	case IBMVFC_CRQ_INIT_RSP:
2849 		switch (crq->format) {
2850 		case IBMVFC_CRQ_INIT:
2851 			dev_info(vhost->dev, "Partner initialized\n");
2852 			/* Send back a response */
2853 			rc = ibmvfc_send_crq_init_complete(vhost);
2854 			if (rc == 0)
2855 				ibmvfc_init_host(vhost);
2856 			else
2857 				dev_err(vhost->dev, "Unable to send init rsp. rc=%ld\n", rc);
2858 			break;
2859 		case IBMVFC_CRQ_INIT_COMPLETE:
2860 			dev_info(vhost->dev, "Partner initialization complete\n");
2861 			ibmvfc_init_host(vhost);
2862 			break;
2863 		default:
2864 			dev_err(vhost->dev, "Unknown crq message type: %d\n", crq->format);
2865 		}
2866 		return;
2867 	case IBMVFC_CRQ_XPORT_EVENT:
2868 		vhost->state = IBMVFC_NO_CRQ;
2869 		vhost->logged_in = 0;
2870 		ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE);
2871 		if (crq->format == IBMVFC_PARTITION_MIGRATED) {
2872 			/* We need to re-setup the interpartition connection */
2873 			dev_info(vhost->dev, "Partition migrated, Re-enabling adapter\n");
2874 			vhost->client_migrated = 1;
2875 			ibmvfc_purge_requests(vhost, DID_REQUEUE);
2876 			ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN);
2877 			ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_REENABLE);
2878 		} else if (crq->format == IBMVFC_PARTNER_FAILED || crq->format == IBMVFC_PARTNER_DEREGISTER) {
2879 			dev_err(vhost->dev, "Host partner adapter deregistered or failed (rc=%d)\n", crq->format);
2880 			ibmvfc_purge_requests(vhost, DID_ERROR);
2881 			ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN);
2882 			ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_RESET);
2883 		} else {
2884 			dev_err(vhost->dev, "Received unknown transport event from partner (rc=%d)\n", crq->format);
2885 		}
2886 		return;
2887 	case IBMVFC_CRQ_CMD_RSP:
2888 		break;
2889 	default:
2890 		dev_err(vhost->dev, "Got an invalid message type 0x%02x\n", crq->valid);
2891 		return;
2892 	}
2893 
2894 	if (crq->format == IBMVFC_ASYNC_EVENT)
2895 		return;
2896 
2897 	/* The only kind of payload CRQs we should get are responses to
2898 	 * things we send. Make sure this response is to something we
2899 	 * actually sent
2900 	 */
2901 	if (unlikely(!ibmvfc_valid_event(&vhost->pool, evt))) {
2902 		dev_err(vhost->dev, "Returned correlation_token 0x%08llx is invalid!\n",
2903 			crq->ioba);
2904 		return;
2905 	}
2906 
2907 	if (unlikely(atomic_read(&evt->free))) {
2908 		dev_err(vhost->dev, "Received duplicate correlation_token 0x%08llx!\n",
2909 			crq->ioba);
2910 		return;
2911 	}
2912 
2913 	del_timer(&evt->timer);
2914 	list_del(&evt->queue);
2915 	ibmvfc_trc_end(evt);
2916 	evt->done(evt);
2917 }
2918 
2919 /**
2920  * ibmvfc_scan_finished - Check if the device scan is done.
2921  * @shost:	scsi host struct
2922  * @time:	current elapsed time
2923  *
2924  * Returns:
2925  *	0 if scan is not done / 1 if scan is done
2926  **/
2927 static int ibmvfc_scan_finished(struct Scsi_Host *shost, unsigned long time)
2928 {
2929 	unsigned long flags;
2930 	struct ibmvfc_host *vhost = shost_priv(shost);
2931 	int done = 0;
2932 
2933 	spin_lock_irqsave(shost->host_lock, flags);
2934 	if (time >= (init_timeout * HZ)) {
2935 		dev_info(vhost->dev, "Scan taking longer than %d seconds, "
2936 			 "continuing initialization\n", init_timeout);
2937 		done = 1;
2938 	}
2939 
2940 	if (vhost->scan_complete)
2941 		done = 1;
2942 	spin_unlock_irqrestore(shost->host_lock, flags);
2943 	return done;
2944 }
2945 
2946 /**
2947  * ibmvfc_slave_alloc - Setup the device's task set value
2948  * @sdev:	struct scsi_device device to configure
2949  *
2950  * Set the device's task set value so that error handling works as
2951  * expected.
2952  *
2953  * Returns:
2954  *	0 on success / -ENXIO if device does not exist
2955  **/
2956 static int ibmvfc_slave_alloc(struct scsi_device *sdev)
2957 {
2958 	struct Scsi_Host *shost = sdev->host;
2959 	struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
2960 	struct ibmvfc_host *vhost = shost_priv(shost);
2961 	unsigned long flags = 0;
2962 
2963 	if (!rport || fc_remote_port_chkready(rport))
2964 		return -ENXIO;
2965 
2966 	spin_lock_irqsave(shost->host_lock, flags);
2967 	sdev->hostdata = (void *)(unsigned long)vhost->task_set++;
2968 	spin_unlock_irqrestore(shost->host_lock, flags);
2969 	return 0;
2970 }
2971 
2972 /**
2973  * ibmvfc_target_alloc - Setup the target's task set value
2974  * @starget:	struct scsi_target
2975  *
2976  * Set the target's task set value so that error handling works as
2977  * expected.
2978  *
2979  * Returns:
2980  *	0 on success / -ENXIO if device does not exist
2981  **/
2982 static int ibmvfc_target_alloc(struct scsi_target *starget)
2983 {
2984 	struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
2985 	struct ibmvfc_host *vhost = shost_priv(shost);
2986 	unsigned long flags = 0;
2987 
2988 	spin_lock_irqsave(shost->host_lock, flags);
2989 	starget->hostdata = (void *)(unsigned long)vhost->task_set++;
2990 	spin_unlock_irqrestore(shost->host_lock, flags);
2991 	return 0;
2992 }
2993 
2994 /**
2995  * ibmvfc_slave_configure - Configure the device
2996  * @sdev:	struct scsi_device device to configure
2997  *
2998  * Enable allow_restart for a device if it is a disk. Adjust the
2999  * queue_depth here also.
3000  *
3001  * Returns:
3002  *	0
3003  **/
3004 static int ibmvfc_slave_configure(struct scsi_device *sdev)
3005 {
3006 	struct Scsi_Host *shost = sdev->host;
3007 	unsigned long flags = 0;
3008 
3009 	spin_lock_irqsave(shost->host_lock, flags);
3010 	if (sdev->type == TYPE_DISK)
3011 		sdev->allow_restart = 1;
3012 	spin_unlock_irqrestore(shost->host_lock, flags);
3013 	return 0;
3014 }
3015 
3016 /**
3017  * ibmvfc_change_queue_depth - Change the device's queue depth
3018  * @sdev:	scsi device struct
3019  * @qdepth:	depth to set
3020  * @reason:	calling context
3021  *
3022  * Return value:
3023  * 	actual depth set
3024  **/
3025 static int ibmvfc_change_queue_depth(struct scsi_device *sdev, int qdepth)
3026 {
3027 	if (qdepth > IBMVFC_MAX_CMDS_PER_LUN)
3028 		qdepth = IBMVFC_MAX_CMDS_PER_LUN;
3029 
3030 	return scsi_change_queue_depth(sdev, qdepth);
3031 }
3032 
3033 static ssize_t ibmvfc_show_host_partition_name(struct device *dev,
3034 						 struct device_attribute *attr, char *buf)
3035 {
3036 	struct Scsi_Host *shost = class_to_shost(dev);
3037 	struct ibmvfc_host *vhost = shost_priv(shost);
3038 
3039 	return snprintf(buf, PAGE_SIZE, "%s\n",
3040 			vhost->login_buf->resp.partition_name);
3041 }
3042 
3043 static ssize_t ibmvfc_show_host_device_name(struct device *dev,
3044 					    struct device_attribute *attr, char *buf)
3045 {
3046 	struct Scsi_Host *shost = class_to_shost(dev);
3047 	struct ibmvfc_host *vhost = shost_priv(shost);
3048 
3049 	return snprintf(buf, PAGE_SIZE, "%s\n",
3050 			vhost->login_buf->resp.device_name);
3051 }
3052 
3053 static ssize_t ibmvfc_show_host_loc_code(struct device *dev,
3054 					 struct device_attribute *attr, char *buf)
3055 {
3056 	struct Scsi_Host *shost = class_to_shost(dev);
3057 	struct ibmvfc_host *vhost = shost_priv(shost);
3058 
3059 	return snprintf(buf, PAGE_SIZE, "%s\n",
3060 			vhost->login_buf->resp.port_loc_code);
3061 }
3062 
3063 static ssize_t ibmvfc_show_host_drc_name(struct device *dev,
3064 					 struct device_attribute *attr, char *buf)
3065 {
3066 	struct Scsi_Host *shost = class_to_shost(dev);
3067 	struct ibmvfc_host *vhost = shost_priv(shost);
3068 
3069 	return snprintf(buf, PAGE_SIZE, "%s\n",
3070 			vhost->login_buf->resp.drc_name);
3071 }
3072 
3073 static ssize_t ibmvfc_show_host_npiv_version(struct device *dev,
3074 					     struct device_attribute *attr, char *buf)
3075 {
3076 	struct Scsi_Host *shost = class_to_shost(dev);
3077 	struct ibmvfc_host *vhost = shost_priv(shost);
3078 	return snprintf(buf, PAGE_SIZE, "%d\n", be32_to_cpu(vhost->login_buf->resp.version));
3079 }
3080 
3081 static ssize_t ibmvfc_show_host_capabilities(struct device *dev,
3082 					     struct device_attribute *attr, char *buf)
3083 {
3084 	struct Scsi_Host *shost = class_to_shost(dev);
3085 	struct ibmvfc_host *vhost = shost_priv(shost);
3086 	return snprintf(buf, PAGE_SIZE, "%llx\n", be64_to_cpu(vhost->login_buf->resp.capabilities));
3087 }
3088 
3089 /**
3090  * ibmvfc_show_log_level - Show the adapter's error logging level
3091  * @dev:	class device struct
3092  * @buf:	buffer
3093  *
3094  * Return value:
3095  * 	number of bytes printed to buffer
3096  **/
3097 static ssize_t ibmvfc_show_log_level(struct device *dev,
3098 				     struct device_attribute *attr, char *buf)
3099 {
3100 	struct Scsi_Host *shost = class_to_shost(dev);
3101 	struct ibmvfc_host *vhost = shost_priv(shost);
3102 	unsigned long flags = 0;
3103 	int len;
3104 
3105 	spin_lock_irqsave(shost->host_lock, flags);
3106 	len = snprintf(buf, PAGE_SIZE, "%d\n", vhost->log_level);
3107 	spin_unlock_irqrestore(shost->host_lock, flags);
3108 	return len;
3109 }
3110 
3111 /**
3112  * ibmvfc_store_log_level - Change the adapter's error logging level
3113  * @dev:	class device struct
3114  * @buf:	buffer
3115  *
3116  * Return value:
3117  * 	number of bytes printed to buffer
3118  **/
3119 static ssize_t ibmvfc_store_log_level(struct device *dev,
3120 				      struct device_attribute *attr,
3121 				      const char *buf, size_t count)
3122 {
3123 	struct Scsi_Host *shost = class_to_shost(dev);
3124 	struct ibmvfc_host *vhost = shost_priv(shost);
3125 	unsigned long flags = 0;
3126 
3127 	spin_lock_irqsave(shost->host_lock, flags);
3128 	vhost->log_level = simple_strtoul(buf, NULL, 10);
3129 	spin_unlock_irqrestore(shost->host_lock, flags);
3130 	return strlen(buf);
3131 }
3132 
3133 static DEVICE_ATTR(partition_name, S_IRUGO, ibmvfc_show_host_partition_name, NULL);
3134 static DEVICE_ATTR(device_name, S_IRUGO, ibmvfc_show_host_device_name, NULL);
3135 static DEVICE_ATTR(port_loc_code, S_IRUGO, ibmvfc_show_host_loc_code, NULL);
3136 static DEVICE_ATTR(drc_name, S_IRUGO, ibmvfc_show_host_drc_name, NULL);
3137 static DEVICE_ATTR(npiv_version, S_IRUGO, ibmvfc_show_host_npiv_version, NULL);
3138 static DEVICE_ATTR(capabilities, S_IRUGO, ibmvfc_show_host_capabilities, NULL);
3139 static DEVICE_ATTR(log_level, S_IRUGO | S_IWUSR,
3140 		   ibmvfc_show_log_level, ibmvfc_store_log_level);
3141 
3142 #ifdef CONFIG_SCSI_IBMVFC_TRACE
3143 /**
3144  * ibmvfc_read_trace - Dump the adapter trace
3145  * @filp:		open sysfs file
3146  * @kobj:		kobject struct
3147  * @bin_attr:	bin_attribute struct
3148  * @buf:		buffer
3149  * @off:		offset
3150  * @count:		buffer size
3151  *
3152  * Return value:
3153  *	number of bytes printed to buffer
3154  **/
3155 static ssize_t ibmvfc_read_trace(struct file *filp, struct kobject *kobj,
3156 				 struct bin_attribute *bin_attr,
3157 				 char *buf, loff_t off, size_t count)
3158 {
3159 	struct device *dev = container_of(kobj, struct device, kobj);
3160 	struct Scsi_Host *shost = class_to_shost(dev);
3161 	struct ibmvfc_host *vhost = shost_priv(shost);
3162 	unsigned long flags = 0;
3163 	int size = IBMVFC_TRACE_SIZE;
3164 	char *src = (char *)vhost->trace;
3165 
3166 	if (off > size)
3167 		return 0;
3168 	if (off + count > size) {
3169 		size -= off;
3170 		count = size;
3171 	}
3172 
3173 	spin_lock_irqsave(shost->host_lock, flags);
3174 	memcpy(buf, &src[off], count);
3175 	spin_unlock_irqrestore(shost->host_lock, flags);
3176 	return count;
3177 }
3178 
3179 static struct bin_attribute ibmvfc_trace_attr = {
3180 	.attr =	{
3181 		.name = "trace",
3182 		.mode = S_IRUGO,
3183 	},
3184 	.size = 0,
3185 	.read = ibmvfc_read_trace,
3186 };
3187 #endif
3188 
3189 static struct device_attribute *ibmvfc_attrs[] = {
3190 	&dev_attr_partition_name,
3191 	&dev_attr_device_name,
3192 	&dev_attr_port_loc_code,
3193 	&dev_attr_drc_name,
3194 	&dev_attr_npiv_version,
3195 	&dev_attr_capabilities,
3196 	&dev_attr_log_level,
3197 	NULL
3198 };
3199 
3200 static struct scsi_host_template driver_template = {
3201 	.module = THIS_MODULE,
3202 	.name = "IBM POWER Virtual FC Adapter",
3203 	.proc_name = IBMVFC_NAME,
3204 	.queuecommand = ibmvfc_queuecommand,
3205 	.eh_timed_out = fc_eh_timed_out,
3206 	.eh_abort_handler = ibmvfc_eh_abort_handler,
3207 	.eh_device_reset_handler = ibmvfc_eh_device_reset_handler,
3208 	.eh_target_reset_handler = ibmvfc_eh_target_reset_handler,
3209 	.eh_host_reset_handler = ibmvfc_eh_host_reset_handler,
3210 	.slave_alloc = ibmvfc_slave_alloc,
3211 	.slave_configure = ibmvfc_slave_configure,
3212 	.target_alloc = ibmvfc_target_alloc,
3213 	.scan_finished = ibmvfc_scan_finished,
3214 	.change_queue_depth = ibmvfc_change_queue_depth,
3215 	.cmd_per_lun = 16,
3216 	.can_queue = IBMVFC_MAX_REQUESTS_DEFAULT,
3217 	.this_id = -1,
3218 	.sg_tablesize = SG_ALL,
3219 	.max_sectors = IBMVFC_MAX_SECTORS,
3220 	.shost_attrs = ibmvfc_attrs,
3221 	.track_queue_depth = 1,
3222 };
3223 
3224 /**
3225  * ibmvfc_next_async_crq - Returns the next entry in async queue
3226  * @vhost:	ibmvfc host struct
3227  *
3228  * Returns:
3229  *	Pointer to next entry in queue / NULL if empty
3230  **/
3231 static struct ibmvfc_async_crq *ibmvfc_next_async_crq(struct ibmvfc_host *vhost)
3232 {
3233 	struct ibmvfc_async_crq_queue *async_crq = &vhost->async_crq;
3234 	struct ibmvfc_async_crq *crq;
3235 
3236 	crq = &async_crq->msgs[async_crq->cur];
3237 	if (crq->valid & 0x80) {
3238 		if (++async_crq->cur == async_crq->size)
3239 			async_crq->cur = 0;
3240 		rmb();
3241 	} else
3242 		crq = NULL;
3243 
3244 	return crq;
3245 }
3246 
3247 /**
3248  * ibmvfc_next_crq - Returns the next entry in message queue
3249  * @vhost:	ibmvfc host struct
3250  *
3251  * Returns:
3252  *	Pointer to next entry in queue / NULL if empty
3253  **/
3254 static struct ibmvfc_crq *ibmvfc_next_crq(struct ibmvfc_host *vhost)
3255 {
3256 	struct ibmvfc_crq_queue *queue = &vhost->crq;
3257 	struct ibmvfc_crq *crq;
3258 
3259 	crq = &queue->msgs[queue->cur];
3260 	if (crq->valid & 0x80) {
3261 		if (++queue->cur == queue->size)
3262 			queue->cur = 0;
3263 		rmb();
3264 	} else
3265 		crq = NULL;
3266 
3267 	return crq;
3268 }
3269 
3270 /**
3271  * ibmvfc_interrupt - Interrupt handler
3272  * @irq:		number of irq to handle, not used
3273  * @dev_instance: ibmvfc_host that received interrupt
3274  *
3275  * Returns:
3276  *	IRQ_HANDLED
3277  **/
3278 static irqreturn_t ibmvfc_interrupt(int irq, void *dev_instance)
3279 {
3280 	struct ibmvfc_host *vhost = (struct ibmvfc_host *)dev_instance;
3281 	unsigned long flags;
3282 
3283 	spin_lock_irqsave(vhost->host->host_lock, flags);
3284 	vio_disable_interrupts(to_vio_dev(vhost->dev));
3285 	tasklet_schedule(&vhost->tasklet);
3286 	spin_unlock_irqrestore(vhost->host->host_lock, flags);
3287 	return IRQ_HANDLED;
3288 }
3289 
3290 /**
3291  * ibmvfc_tasklet - Interrupt handler tasklet
3292  * @data:		ibmvfc host struct
3293  *
3294  * Returns:
3295  *	Nothing
3296  **/
3297 static void ibmvfc_tasklet(void *data)
3298 {
3299 	struct ibmvfc_host *vhost = data;
3300 	struct vio_dev *vdev = to_vio_dev(vhost->dev);
3301 	struct ibmvfc_crq *crq;
3302 	struct ibmvfc_async_crq *async;
3303 	unsigned long flags;
3304 	int done = 0;
3305 
3306 	spin_lock_irqsave(vhost->host->host_lock, flags);
3307 	while (!done) {
3308 		/* Pull all the valid messages off the async CRQ */
3309 		while ((async = ibmvfc_next_async_crq(vhost)) != NULL) {
3310 			ibmvfc_handle_async(async, vhost);
3311 			async->valid = 0;
3312 			wmb();
3313 		}
3314 
3315 		/* Pull all the valid messages off the CRQ */
3316 		while ((crq = ibmvfc_next_crq(vhost)) != NULL) {
3317 			ibmvfc_handle_crq(crq, vhost);
3318 			crq->valid = 0;
3319 			wmb();
3320 		}
3321 
3322 		vio_enable_interrupts(vdev);
3323 		if ((async = ibmvfc_next_async_crq(vhost)) != NULL) {
3324 			vio_disable_interrupts(vdev);
3325 			ibmvfc_handle_async(async, vhost);
3326 			async->valid = 0;
3327 			wmb();
3328 		} else if ((crq = ibmvfc_next_crq(vhost)) != NULL) {
3329 			vio_disable_interrupts(vdev);
3330 			ibmvfc_handle_crq(crq, vhost);
3331 			crq->valid = 0;
3332 			wmb();
3333 		} else
3334 			done = 1;
3335 	}
3336 
3337 	spin_unlock_irqrestore(vhost->host->host_lock, flags);
3338 }
3339 
3340 /**
3341  * ibmvfc_init_tgt - Set the next init job step for the target
3342  * @tgt:		ibmvfc target struct
3343  * @job_step:	job step to perform
3344  *
3345  **/
3346 static void ibmvfc_init_tgt(struct ibmvfc_target *tgt,
3347 			    void (*job_step) (struct ibmvfc_target *))
3348 {
3349 	if (!ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_INIT))
3350 		tgt->job_step = job_step;
3351 	wake_up(&tgt->vhost->work_wait_q);
3352 }
3353 
3354 /**
3355  * ibmvfc_retry_tgt_init - Attempt to retry a step in target initialization
3356  * @tgt:		ibmvfc target struct
3357  * @job_step:	initialization job step
3358  *
3359  * Returns: 1 if step will be retried / 0 if not
3360  *
3361  **/
3362 static int ibmvfc_retry_tgt_init(struct ibmvfc_target *tgt,
3363 				  void (*job_step) (struct ibmvfc_target *))
3364 {
3365 	if (++tgt->init_retries > IBMVFC_MAX_TGT_INIT_RETRIES) {
3366 		ibmvfc_del_tgt(tgt);
3367 		wake_up(&tgt->vhost->work_wait_q);
3368 		return 0;
3369 	} else
3370 		ibmvfc_init_tgt(tgt, job_step);
3371 	return 1;
3372 }
3373 
3374 /* Defined in FC-LS */
3375 static const struct {
3376 	int code;
3377 	int retry;
3378 	int logged_in;
3379 } prli_rsp [] = {
3380 	{ 0, 1, 0 },
3381 	{ 1, 0, 1 },
3382 	{ 2, 1, 0 },
3383 	{ 3, 1, 0 },
3384 	{ 4, 0, 0 },
3385 	{ 5, 0, 0 },
3386 	{ 6, 0, 1 },
3387 	{ 7, 0, 0 },
3388 	{ 8, 1, 0 },
3389 };
3390 
3391 /**
3392  * ibmvfc_get_prli_rsp - Find PRLI response index
3393  * @flags:	PRLI response flags
3394  *
3395  **/
3396 static int ibmvfc_get_prli_rsp(u16 flags)
3397 {
3398 	int i;
3399 	int code = (flags & 0x0f00) >> 8;
3400 
3401 	for (i = 0; i < ARRAY_SIZE(prli_rsp); i++)
3402 		if (prli_rsp[i].code == code)
3403 			return i;
3404 
3405 	return 0;
3406 }
3407 
3408 /**
3409  * ibmvfc_tgt_prli_done - Completion handler for Process Login
3410  * @evt:	ibmvfc event struct
3411  *
3412  **/
3413 static void ibmvfc_tgt_prli_done(struct ibmvfc_event *evt)
3414 {
3415 	struct ibmvfc_target *tgt = evt->tgt;
3416 	struct ibmvfc_host *vhost = evt->vhost;
3417 	struct ibmvfc_process_login *rsp = &evt->xfer_iu->prli;
3418 	struct ibmvfc_prli_svc_parms *parms = &rsp->parms;
3419 	u32 status = be16_to_cpu(rsp->common.status);
3420 	int index, level = IBMVFC_DEFAULT_LOG_LEVEL;
3421 
3422 	vhost->discovery_threads--;
3423 	ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
3424 	switch (status) {
3425 	case IBMVFC_MAD_SUCCESS:
3426 		tgt_dbg(tgt, "Process Login succeeded: %X %02X %04X\n",
3427 			parms->type, parms->flags, parms->service_parms);
3428 
3429 		if (parms->type == IBMVFC_SCSI_FCP_TYPE) {
3430 			index = ibmvfc_get_prli_rsp(be16_to_cpu(parms->flags));
3431 			if (prli_rsp[index].logged_in) {
3432 				if (be16_to_cpu(parms->flags) & IBMVFC_PRLI_EST_IMG_PAIR) {
3433 					tgt->need_login = 0;
3434 					tgt->ids.roles = 0;
3435 					if (be32_to_cpu(parms->service_parms) & IBMVFC_PRLI_TARGET_FUNC)
3436 						tgt->ids.roles |= FC_PORT_ROLE_FCP_TARGET;
3437 					if (be32_to_cpu(parms->service_parms) & IBMVFC_PRLI_INITIATOR_FUNC)
3438 						tgt->ids.roles |= FC_PORT_ROLE_FCP_INITIATOR;
3439 					tgt->add_rport = 1;
3440 				} else
3441 					ibmvfc_del_tgt(tgt);
3442 			} else if (prli_rsp[index].retry)
3443 				ibmvfc_retry_tgt_init(tgt, ibmvfc_tgt_send_prli);
3444 			else
3445 				ibmvfc_del_tgt(tgt);
3446 		} else
3447 			ibmvfc_del_tgt(tgt);
3448 		break;
3449 	case IBMVFC_MAD_DRIVER_FAILED:
3450 		break;
3451 	case IBMVFC_MAD_CRQ_ERROR:
3452 		ibmvfc_retry_tgt_init(tgt, ibmvfc_tgt_send_prli);
3453 		break;
3454 	case IBMVFC_MAD_FAILED:
3455 	default:
3456 		if ((be16_to_cpu(rsp->status) & IBMVFC_VIOS_FAILURE) &&
3457 		     be16_to_cpu(rsp->error) == IBMVFC_PLOGI_REQUIRED)
3458 			level += ibmvfc_retry_tgt_init(tgt, ibmvfc_tgt_send_plogi);
3459 		else if (tgt->logo_rcvd)
3460 			level += ibmvfc_retry_tgt_init(tgt, ibmvfc_tgt_send_plogi);
3461 		else if (ibmvfc_retry_cmd(be16_to_cpu(rsp->status), be16_to_cpu(rsp->error)))
3462 			level += ibmvfc_retry_tgt_init(tgt, ibmvfc_tgt_send_prli);
3463 		else
3464 			ibmvfc_del_tgt(tgt);
3465 
3466 		tgt_log(tgt, level, "Process Login failed: %s (%x:%x) rc=0x%02X\n",
3467 			ibmvfc_get_cmd_error(be16_to_cpu(rsp->status), be16_to_cpu(rsp->error)),
3468 			be16_to_cpu(rsp->status), be16_to_cpu(rsp->error), status);
3469 		break;
3470 	}
3471 
3472 	kref_put(&tgt->kref, ibmvfc_release_tgt);
3473 	ibmvfc_free_event(evt);
3474 	wake_up(&vhost->work_wait_q);
3475 }
3476 
3477 /**
3478  * ibmvfc_tgt_send_prli - Send a process login
3479  * @tgt:	ibmvfc target struct
3480  *
3481  **/
3482 static void ibmvfc_tgt_send_prli(struct ibmvfc_target *tgt)
3483 {
3484 	struct ibmvfc_process_login *prli;
3485 	struct ibmvfc_host *vhost = tgt->vhost;
3486 	struct ibmvfc_event *evt;
3487 
3488 	if (vhost->discovery_threads >= disc_threads)
3489 		return;
3490 
3491 	kref_get(&tgt->kref);
3492 	evt = ibmvfc_get_event(vhost);
3493 	vhost->discovery_threads++;
3494 	ibmvfc_init_event(evt, ibmvfc_tgt_prli_done, IBMVFC_MAD_FORMAT);
3495 	evt->tgt = tgt;
3496 	prli = &evt->iu.prli;
3497 	memset(prli, 0, sizeof(*prli));
3498 	if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN)) {
3499 		prli->common.version = cpu_to_be32(2);
3500 		prli->target_wwpn = cpu_to_be64(tgt->wwpn);
3501 	} else {
3502 		prli->common.version = cpu_to_be32(1);
3503 	}
3504 	prli->common.opcode = cpu_to_be32(IBMVFC_PROCESS_LOGIN);
3505 	prli->common.length = cpu_to_be16(sizeof(*prli));
3506 	prli->scsi_id = cpu_to_be64(tgt->scsi_id);
3507 
3508 	prli->parms.type = IBMVFC_SCSI_FCP_TYPE;
3509 	prli->parms.flags = cpu_to_be16(IBMVFC_PRLI_EST_IMG_PAIR);
3510 	prli->parms.service_parms = cpu_to_be32(IBMVFC_PRLI_INITIATOR_FUNC);
3511 	prli->parms.service_parms |= cpu_to_be32(IBMVFC_PRLI_READ_FCP_XFER_RDY_DISABLED);
3512 
3513 	if (cls3_error)
3514 		prli->parms.service_parms |= cpu_to_be32(IBMVFC_PRLI_RETRY);
3515 
3516 	ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_INIT_WAIT);
3517 	if (ibmvfc_send_event(evt, vhost, default_timeout)) {
3518 		vhost->discovery_threads--;
3519 		ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
3520 		kref_put(&tgt->kref, ibmvfc_release_tgt);
3521 	} else
3522 		tgt_dbg(tgt, "Sent process login\n");
3523 }
3524 
3525 /**
3526  * ibmvfc_tgt_plogi_done - Completion handler for Port Login
3527  * @evt:	ibmvfc event struct
3528  *
3529  **/
3530 static void ibmvfc_tgt_plogi_done(struct ibmvfc_event *evt)
3531 {
3532 	struct ibmvfc_target *tgt = evt->tgt;
3533 	struct ibmvfc_host *vhost = evt->vhost;
3534 	struct ibmvfc_port_login *rsp = &evt->xfer_iu->plogi;
3535 	u32 status = be16_to_cpu(rsp->common.status);
3536 	int level = IBMVFC_DEFAULT_LOG_LEVEL;
3537 
3538 	vhost->discovery_threads--;
3539 	ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
3540 	switch (status) {
3541 	case IBMVFC_MAD_SUCCESS:
3542 		tgt_dbg(tgt, "Port Login succeeded\n");
3543 		if (tgt->ids.port_name &&
3544 		    tgt->ids.port_name != wwn_to_u64(rsp->service_parms.port_name)) {
3545 			vhost->reinit = 1;
3546 			tgt_dbg(tgt, "Port re-init required\n");
3547 			break;
3548 		}
3549 		tgt->ids.node_name = wwn_to_u64(rsp->service_parms.node_name);
3550 		tgt->ids.port_name = wwn_to_u64(rsp->service_parms.port_name);
3551 		tgt->ids.port_id = tgt->scsi_id;
3552 		memcpy(&tgt->service_parms, &rsp->service_parms,
3553 		       sizeof(tgt->service_parms));
3554 		memcpy(&tgt->service_parms_change, &rsp->service_parms_change,
3555 		       sizeof(tgt->service_parms_change));
3556 		ibmvfc_init_tgt(tgt, ibmvfc_tgt_send_prli);
3557 		break;
3558 	case IBMVFC_MAD_DRIVER_FAILED:
3559 		break;
3560 	case IBMVFC_MAD_CRQ_ERROR:
3561 		ibmvfc_retry_tgt_init(tgt, ibmvfc_tgt_send_plogi);
3562 		break;
3563 	case IBMVFC_MAD_FAILED:
3564 	default:
3565 		if (ibmvfc_retry_cmd(be16_to_cpu(rsp->status), be16_to_cpu(rsp->error)))
3566 			level += ibmvfc_retry_tgt_init(tgt, ibmvfc_tgt_send_plogi);
3567 		else
3568 			ibmvfc_del_tgt(tgt);
3569 
3570 		tgt_log(tgt, level, "Port Login failed: %s (%x:%x) %s (%x) %s (%x) rc=0x%02X\n",
3571 			ibmvfc_get_cmd_error(be16_to_cpu(rsp->status), be16_to_cpu(rsp->error)),
3572 					     be16_to_cpu(rsp->status), be16_to_cpu(rsp->error),
3573 			ibmvfc_get_fc_type(be16_to_cpu(rsp->fc_type)), be16_to_cpu(rsp->fc_type),
3574 			ibmvfc_get_ls_explain(be16_to_cpu(rsp->fc_explain)), be16_to_cpu(rsp->fc_explain), status);
3575 		break;
3576 	}
3577 
3578 	kref_put(&tgt->kref, ibmvfc_release_tgt);
3579 	ibmvfc_free_event(evt);
3580 	wake_up(&vhost->work_wait_q);
3581 }
3582 
3583 /**
3584  * ibmvfc_tgt_send_plogi - Send PLOGI to the specified target
3585  * @tgt:	ibmvfc target struct
3586  *
3587  **/
3588 static void ibmvfc_tgt_send_plogi(struct ibmvfc_target *tgt)
3589 {
3590 	struct ibmvfc_port_login *plogi;
3591 	struct ibmvfc_host *vhost = tgt->vhost;
3592 	struct ibmvfc_event *evt;
3593 
3594 	if (vhost->discovery_threads >= disc_threads)
3595 		return;
3596 
3597 	kref_get(&tgt->kref);
3598 	tgt->logo_rcvd = 0;
3599 	evt = ibmvfc_get_event(vhost);
3600 	vhost->discovery_threads++;
3601 	ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_INIT_WAIT);
3602 	ibmvfc_init_event(evt, ibmvfc_tgt_plogi_done, IBMVFC_MAD_FORMAT);
3603 	evt->tgt = tgt;
3604 	plogi = &evt->iu.plogi;
3605 	memset(plogi, 0, sizeof(*plogi));
3606 	if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN)) {
3607 		plogi->common.version = cpu_to_be32(2);
3608 		plogi->target_wwpn = cpu_to_be64(tgt->wwpn);
3609 	} else {
3610 		plogi->common.version = cpu_to_be32(1);
3611 	}
3612 	plogi->common.opcode = cpu_to_be32(IBMVFC_PORT_LOGIN);
3613 	plogi->common.length = cpu_to_be16(sizeof(*plogi));
3614 	plogi->scsi_id = cpu_to_be64(tgt->scsi_id);
3615 
3616 	if (ibmvfc_send_event(evt, vhost, default_timeout)) {
3617 		vhost->discovery_threads--;
3618 		ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
3619 		kref_put(&tgt->kref, ibmvfc_release_tgt);
3620 	} else
3621 		tgt_dbg(tgt, "Sent port login\n");
3622 }
3623 
3624 /**
3625  * ibmvfc_tgt_implicit_logout_done - Completion handler for Implicit Logout MAD
3626  * @evt:	ibmvfc event struct
3627  *
3628  **/
3629 static void ibmvfc_tgt_implicit_logout_done(struct ibmvfc_event *evt)
3630 {
3631 	struct ibmvfc_target *tgt = evt->tgt;
3632 	struct ibmvfc_host *vhost = evt->vhost;
3633 	struct ibmvfc_implicit_logout *rsp = &evt->xfer_iu->implicit_logout;
3634 	u32 status = be16_to_cpu(rsp->common.status);
3635 
3636 	vhost->discovery_threads--;
3637 	ibmvfc_free_event(evt);
3638 	ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
3639 
3640 	switch (status) {
3641 	case IBMVFC_MAD_SUCCESS:
3642 		tgt_dbg(tgt, "Implicit Logout succeeded\n");
3643 		break;
3644 	case IBMVFC_MAD_DRIVER_FAILED:
3645 		kref_put(&tgt->kref, ibmvfc_release_tgt);
3646 		wake_up(&vhost->work_wait_q);
3647 		return;
3648 	case IBMVFC_MAD_FAILED:
3649 	default:
3650 		tgt_err(tgt, "Implicit Logout failed: rc=0x%02X\n", status);
3651 		break;
3652 	}
3653 
3654 	ibmvfc_init_tgt(tgt, ibmvfc_tgt_send_plogi);
3655 	kref_put(&tgt->kref, ibmvfc_release_tgt);
3656 	wake_up(&vhost->work_wait_q);
3657 }
3658 
3659 /**
3660  * __ibmvfc_tgt_get_implicit_logout_evt - Allocate and init an event for implicit logout
3661  * @tgt:		ibmvfc target struct
3662  *
3663  * Returns:
3664  *	Allocated and initialized ibmvfc_event struct
3665  **/
3666 static struct ibmvfc_event *__ibmvfc_tgt_get_implicit_logout_evt(struct ibmvfc_target *tgt,
3667 								 void (*done) (struct ibmvfc_event *))
3668 {
3669 	struct ibmvfc_implicit_logout *mad;
3670 	struct ibmvfc_host *vhost = tgt->vhost;
3671 	struct ibmvfc_event *evt;
3672 
3673 	kref_get(&tgt->kref);
3674 	evt = ibmvfc_get_event(vhost);
3675 	ibmvfc_init_event(evt, done, IBMVFC_MAD_FORMAT);
3676 	evt->tgt = tgt;
3677 	mad = &evt->iu.implicit_logout;
3678 	memset(mad, 0, sizeof(*mad));
3679 	mad->common.version = cpu_to_be32(1);
3680 	mad->common.opcode = cpu_to_be32(IBMVFC_IMPLICIT_LOGOUT);
3681 	mad->common.length = cpu_to_be16(sizeof(*mad));
3682 	mad->old_scsi_id = cpu_to_be64(tgt->scsi_id);
3683 	return evt;
3684 }
3685 
3686 /**
3687  * ibmvfc_tgt_implicit_logout - Initiate an Implicit Logout for specified target
3688  * @tgt:		ibmvfc target struct
3689  *
3690  **/
3691 static void ibmvfc_tgt_implicit_logout(struct ibmvfc_target *tgt)
3692 {
3693 	struct ibmvfc_host *vhost = tgt->vhost;
3694 	struct ibmvfc_event *evt;
3695 
3696 	if (vhost->discovery_threads >= disc_threads)
3697 		return;
3698 
3699 	vhost->discovery_threads++;
3700 	evt = __ibmvfc_tgt_get_implicit_logout_evt(tgt,
3701 						   ibmvfc_tgt_implicit_logout_done);
3702 
3703 	ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_INIT_WAIT);
3704 	if (ibmvfc_send_event(evt, vhost, default_timeout)) {
3705 		vhost->discovery_threads--;
3706 		ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
3707 		kref_put(&tgt->kref, ibmvfc_release_tgt);
3708 	} else
3709 		tgt_dbg(tgt, "Sent Implicit Logout\n");
3710 }
3711 
3712 /**
3713  * ibmvfc_tgt_implicit_logout_and_del_done - Completion handler for Implicit Logout MAD
3714  * @evt:	ibmvfc event struct
3715  *
3716  **/
3717 static void ibmvfc_tgt_implicit_logout_and_del_done(struct ibmvfc_event *evt)
3718 {
3719 	struct ibmvfc_target *tgt = evt->tgt;
3720 	struct ibmvfc_host *vhost = evt->vhost;
3721 	struct ibmvfc_passthru_mad *mad = &evt->xfer_iu->passthru;
3722 	u32 status = be16_to_cpu(mad->common.status);
3723 
3724 	vhost->discovery_threads--;
3725 	ibmvfc_free_event(evt);
3726 
3727 	/*
3728 	 * If our state is IBMVFC_HOST_OFFLINE, we could be unloading the
3729 	 * driver in which case we need to free up all the targets. If we are
3730 	 * not unloading, we will still go through a hard reset to get out of
3731 	 * offline state, so there is no need to track the old targets in that
3732 	 * case.
3733 	 */
3734 	if (status == IBMVFC_MAD_SUCCESS || vhost->state == IBMVFC_HOST_OFFLINE)
3735 		ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DEL_RPORT);
3736 	else
3737 		ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DEL_AND_LOGOUT_RPORT);
3738 
3739 	tgt_dbg(tgt, "Implicit Logout %s\n", (status == IBMVFC_MAD_SUCCESS) ? "succeeded" : "failed");
3740 	kref_put(&tgt->kref, ibmvfc_release_tgt);
3741 	wake_up(&vhost->work_wait_q);
3742 }
3743 
3744 /**
3745  * ibmvfc_tgt_implicit_logout_and_del - Initiate an Implicit Logout for specified target
3746  * @tgt:		ibmvfc target struct
3747  *
3748  **/
3749 static void ibmvfc_tgt_implicit_logout_and_del(struct ibmvfc_target *tgt)
3750 {
3751 	struct ibmvfc_host *vhost = tgt->vhost;
3752 	struct ibmvfc_event *evt;
3753 
3754 	if (!vhost->logged_in) {
3755 		ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DEL_RPORT);
3756 		return;
3757 	}
3758 
3759 	if (vhost->discovery_threads >= disc_threads)
3760 		return;
3761 
3762 	vhost->discovery_threads++;
3763 	evt = __ibmvfc_tgt_get_implicit_logout_evt(tgt,
3764 						   ibmvfc_tgt_implicit_logout_and_del_done);
3765 
3766 	ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_LOGOUT_RPORT_WAIT);
3767 	if (ibmvfc_send_event(evt, vhost, default_timeout)) {
3768 		vhost->discovery_threads--;
3769 		ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DEL_RPORT);
3770 		kref_put(&tgt->kref, ibmvfc_release_tgt);
3771 	} else
3772 		tgt_dbg(tgt, "Sent Implicit Logout\n");
3773 }
3774 
3775 /**
3776  * ibmvfc_tgt_move_login_done - Completion handler for Move Login
3777  * @evt:	ibmvfc event struct
3778  *
3779  **/
3780 static void ibmvfc_tgt_move_login_done(struct ibmvfc_event *evt)
3781 {
3782 	struct ibmvfc_target *tgt = evt->tgt;
3783 	struct ibmvfc_host *vhost = evt->vhost;
3784 	struct ibmvfc_move_login *rsp = &evt->xfer_iu->move_login;
3785 	u32 status = be16_to_cpu(rsp->common.status);
3786 	int level = IBMVFC_DEFAULT_LOG_LEVEL;
3787 
3788 	vhost->discovery_threads--;
3789 	ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
3790 	switch (status) {
3791 	case IBMVFC_MAD_SUCCESS:
3792 		tgt_dbg(tgt, "Move Login succeeded for old scsi_id: %llX\n", tgt->old_scsi_id);
3793 		tgt->ids.node_name = wwn_to_u64(rsp->service_parms.node_name);
3794 		tgt->ids.port_name = wwn_to_u64(rsp->service_parms.port_name);
3795 		tgt->ids.port_id = tgt->scsi_id;
3796 		memcpy(&tgt->service_parms, &rsp->service_parms,
3797 		       sizeof(tgt->service_parms));
3798 		memcpy(&tgt->service_parms_change, &rsp->service_parms_change,
3799 		       sizeof(tgt->service_parms_change));
3800 		ibmvfc_init_tgt(tgt, ibmvfc_tgt_send_prli);
3801 		break;
3802 	case IBMVFC_MAD_DRIVER_FAILED:
3803 		break;
3804 	case IBMVFC_MAD_CRQ_ERROR:
3805 		ibmvfc_retry_tgt_init(tgt, ibmvfc_tgt_move_login);
3806 		break;
3807 	case IBMVFC_MAD_FAILED:
3808 	default:
3809 		level += ibmvfc_retry_tgt_init(tgt, ibmvfc_tgt_move_login);
3810 
3811 		tgt_log(tgt, level,
3812 			"Move Login failed: old scsi_id: %llX, flags:%x, vios_flags:%x, rc=0x%02X\n",
3813 			tgt->old_scsi_id, be32_to_cpu(rsp->flags), be16_to_cpu(rsp->vios_flags),
3814 			status);
3815 		break;
3816 	}
3817 
3818 	kref_put(&tgt->kref, ibmvfc_release_tgt);
3819 	ibmvfc_free_event(evt);
3820 	wake_up(&vhost->work_wait_q);
3821 }
3822 
3823 
3824 /**
3825  * ibmvfc_tgt_move_login - Initiate a move login for specified target
3826  * @tgt:		ibmvfc target struct
3827  *
3828  **/
3829 static void ibmvfc_tgt_move_login(struct ibmvfc_target *tgt)
3830 {
3831 	struct ibmvfc_host *vhost = tgt->vhost;
3832 	struct ibmvfc_move_login *move;
3833 	struct ibmvfc_event *evt;
3834 
3835 	if (vhost->discovery_threads >= disc_threads)
3836 		return;
3837 
3838 	kref_get(&tgt->kref);
3839 	evt = ibmvfc_get_event(vhost);
3840 	vhost->discovery_threads++;
3841 	ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_INIT_WAIT);
3842 	ibmvfc_init_event(evt, ibmvfc_tgt_move_login_done, IBMVFC_MAD_FORMAT);
3843 	evt->tgt = tgt;
3844 	move = &evt->iu.move_login;
3845 	memset(move, 0, sizeof(*move));
3846 	move->common.version = cpu_to_be32(1);
3847 	move->common.opcode = cpu_to_be32(IBMVFC_MOVE_LOGIN);
3848 	move->common.length = cpu_to_be16(sizeof(*move));
3849 
3850 	move->old_scsi_id = cpu_to_be64(tgt->old_scsi_id);
3851 	move->new_scsi_id = cpu_to_be64(tgt->scsi_id);
3852 	move->wwpn = cpu_to_be64(tgt->wwpn);
3853 	move->node_name = cpu_to_be64(tgt->ids.node_name);
3854 
3855 	if (ibmvfc_send_event(evt, vhost, default_timeout)) {
3856 		vhost->discovery_threads--;
3857 		ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DEL_RPORT);
3858 		kref_put(&tgt->kref, ibmvfc_release_tgt);
3859 	} else
3860 		tgt_dbg(tgt, "Sent Move Login for old scsi_id: %llX\n", tgt->old_scsi_id);
3861 }
3862 
3863 /**
3864  * ibmvfc_adisc_needs_plogi - Does device need PLOGI?
3865  * @mad:	ibmvfc passthru mad struct
3866  * @tgt:	ibmvfc target struct
3867  *
3868  * Returns:
3869  *	1 if PLOGI needed / 0 if PLOGI not needed
3870  **/
3871 static int ibmvfc_adisc_needs_plogi(struct ibmvfc_passthru_mad *mad,
3872 				    struct ibmvfc_target *tgt)
3873 {
3874 	if (wwn_to_u64((u8 *)&mad->fc_iu.response[2]) != tgt->ids.port_name)
3875 		return 1;
3876 	if (wwn_to_u64((u8 *)&mad->fc_iu.response[4]) != tgt->ids.node_name)
3877 		return 1;
3878 	if (be32_to_cpu(mad->fc_iu.response[6]) != tgt->scsi_id)
3879 		return 1;
3880 	return 0;
3881 }
3882 
3883 /**
3884  * ibmvfc_tgt_adisc_done - Completion handler for ADISC
3885  * @evt:	ibmvfc event struct
3886  *
3887  **/
3888 static void ibmvfc_tgt_adisc_done(struct ibmvfc_event *evt)
3889 {
3890 	struct ibmvfc_target *tgt = evt->tgt;
3891 	struct ibmvfc_host *vhost = evt->vhost;
3892 	struct ibmvfc_passthru_mad *mad = &evt->xfer_iu->passthru;
3893 	u32 status = be16_to_cpu(mad->common.status);
3894 	u8 fc_reason, fc_explain;
3895 
3896 	vhost->discovery_threads--;
3897 	ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
3898 	del_timer(&tgt->timer);
3899 
3900 	switch (status) {
3901 	case IBMVFC_MAD_SUCCESS:
3902 		tgt_dbg(tgt, "ADISC succeeded\n");
3903 		if (ibmvfc_adisc_needs_plogi(mad, tgt))
3904 			ibmvfc_del_tgt(tgt);
3905 		break;
3906 	case IBMVFC_MAD_DRIVER_FAILED:
3907 		break;
3908 	case IBMVFC_MAD_FAILED:
3909 	default:
3910 		ibmvfc_del_tgt(tgt);
3911 		fc_reason = (be32_to_cpu(mad->fc_iu.response[1]) & 0x00ff0000) >> 16;
3912 		fc_explain = (be32_to_cpu(mad->fc_iu.response[1]) & 0x0000ff00) >> 8;
3913 		tgt_info(tgt, "ADISC failed: %s (%x:%x) %s (%x) %s (%x) rc=0x%02X\n",
3914 			 ibmvfc_get_cmd_error(be16_to_cpu(mad->iu.status), be16_to_cpu(mad->iu.error)),
3915 			 be16_to_cpu(mad->iu.status), be16_to_cpu(mad->iu.error),
3916 			 ibmvfc_get_fc_type(fc_reason), fc_reason,
3917 			 ibmvfc_get_ls_explain(fc_explain), fc_explain, status);
3918 		break;
3919 	}
3920 
3921 	kref_put(&tgt->kref, ibmvfc_release_tgt);
3922 	ibmvfc_free_event(evt);
3923 	wake_up(&vhost->work_wait_q);
3924 }
3925 
3926 /**
3927  * ibmvfc_init_passthru - Initialize an event struct for FC passthru
3928  * @evt:		ibmvfc event struct
3929  *
3930  **/
3931 static void ibmvfc_init_passthru(struct ibmvfc_event *evt)
3932 {
3933 	struct ibmvfc_passthru_mad *mad = &evt->iu.passthru;
3934 
3935 	memset(mad, 0, sizeof(*mad));
3936 	mad->common.version = cpu_to_be32(1);
3937 	mad->common.opcode = cpu_to_be32(IBMVFC_PASSTHRU);
3938 	mad->common.length = cpu_to_be16(sizeof(*mad) - sizeof(mad->fc_iu) - sizeof(mad->iu));
3939 	mad->cmd_ioba.va = cpu_to_be64((u64)be64_to_cpu(evt->crq.ioba) +
3940 		offsetof(struct ibmvfc_passthru_mad, iu));
3941 	mad->cmd_ioba.len = cpu_to_be32(sizeof(mad->iu));
3942 	mad->iu.cmd_len = cpu_to_be32(sizeof(mad->fc_iu.payload));
3943 	mad->iu.rsp_len = cpu_to_be32(sizeof(mad->fc_iu.response));
3944 	mad->iu.cmd.va = cpu_to_be64((u64)be64_to_cpu(evt->crq.ioba) +
3945 		offsetof(struct ibmvfc_passthru_mad, fc_iu) +
3946 		offsetof(struct ibmvfc_passthru_fc_iu, payload));
3947 	mad->iu.cmd.len = cpu_to_be32(sizeof(mad->fc_iu.payload));
3948 	mad->iu.rsp.va = cpu_to_be64((u64)be64_to_cpu(evt->crq.ioba) +
3949 		offsetof(struct ibmvfc_passthru_mad, fc_iu) +
3950 		offsetof(struct ibmvfc_passthru_fc_iu, response));
3951 	mad->iu.rsp.len = cpu_to_be32(sizeof(mad->fc_iu.response));
3952 }
3953 
3954 /**
3955  * ibmvfc_tgt_adisc_cancel_done - Completion handler when cancelling an ADISC
3956  * @evt:		ibmvfc event struct
3957  *
3958  * Just cleanup this event struct. Everything else is handled by
3959  * the ADISC completion handler. If the ADISC never actually comes
3960  * back, we still have the timer running on the ADISC event struct
3961  * which will fire and cause the CRQ to get reset.
3962  *
3963  **/
3964 static void ibmvfc_tgt_adisc_cancel_done(struct ibmvfc_event *evt)
3965 {
3966 	struct ibmvfc_host *vhost = evt->vhost;
3967 	struct ibmvfc_target *tgt = evt->tgt;
3968 
3969 	tgt_dbg(tgt, "ADISC cancel complete\n");
3970 	vhost->abort_threads--;
3971 	ibmvfc_free_event(evt);
3972 	kref_put(&tgt->kref, ibmvfc_release_tgt);
3973 	wake_up(&vhost->work_wait_q);
3974 }
3975 
3976 /**
3977  * ibmvfc_adisc_timeout - Handle an ADISC timeout
3978  * @tgt:		ibmvfc target struct
3979  *
3980  * If an ADISC times out, send a cancel. If the cancel times
3981  * out, reset the CRQ. When the ADISC comes back as cancelled,
3982  * log back into the target.
3983  **/
3984 static void ibmvfc_adisc_timeout(struct timer_list *t)
3985 {
3986 	struct ibmvfc_target *tgt = from_timer(tgt, t, timer);
3987 	struct ibmvfc_host *vhost = tgt->vhost;
3988 	struct ibmvfc_event *evt;
3989 	struct ibmvfc_tmf *tmf;
3990 	unsigned long flags;
3991 	int rc;
3992 
3993 	tgt_dbg(tgt, "ADISC timeout\n");
3994 	spin_lock_irqsave(vhost->host->host_lock, flags);
3995 	if (vhost->abort_threads >= disc_threads ||
3996 	    tgt->action != IBMVFC_TGT_ACTION_INIT_WAIT ||
3997 	    vhost->state != IBMVFC_INITIALIZING ||
3998 	    vhost->action != IBMVFC_HOST_ACTION_QUERY_TGTS) {
3999 		spin_unlock_irqrestore(vhost->host->host_lock, flags);
4000 		return;
4001 	}
4002 
4003 	vhost->abort_threads++;
4004 	kref_get(&tgt->kref);
4005 	evt = ibmvfc_get_event(vhost);
4006 	ibmvfc_init_event(evt, ibmvfc_tgt_adisc_cancel_done, IBMVFC_MAD_FORMAT);
4007 
4008 	evt->tgt = tgt;
4009 	tmf = &evt->iu.tmf;
4010 	memset(tmf, 0, sizeof(*tmf));
4011 	if (ibmvfc_check_caps(vhost, IBMVFC_HANDLE_VF_WWPN)) {
4012 		tmf->common.version = cpu_to_be32(2);
4013 		tmf->target_wwpn = cpu_to_be64(tgt->wwpn);
4014 	} else {
4015 		tmf->common.version = cpu_to_be32(1);
4016 	}
4017 	tmf->common.opcode = cpu_to_be32(IBMVFC_TMF_MAD);
4018 	tmf->common.length = cpu_to_be16(sizeof(*tmf));
4019 	tmf->scsi_id = cpu_to_be64(tgt->scsi_id);
4020 	tmf->cancel_key = cpu_to_be32(tgt->cancel_key);
4021 
4022 	rc = ibmvfc_send_event(evt, vhost, default_timeout);
4023 
4024 	if (rc) {
4025 		tgt_err(tgt, "Failed to send cancel event for ADISC. rc=%d\n", rc);
4026 		vhost->abort_threads--;
4027 		kref_put(&tgt->kref, ibmvfc_release_tgt);
4028 		__ibmvfc_reset_host(vhost);
4029 	} else
4030 		tgt_dbg(tgt, "Attempting to cancel ADISC\n");
4031 	spin_unlock_irqrestore(vhost->host->host_lock, flags);
4032 }
4033 
4034 /**
4035  * ibmvfc_tgt_adisc - Initiate an ADISC for specified target
4036  * @tgt:		ibmvfc target struct
4037  *
4038  * When sending an ADISC we end up with two timers running. The
4039  * first timer is the timer in the ibmvfc target struct. If this
4040  * fires, we send a cancel to the target. The second timer is the
4041  * timer on the ibmvfc event for the ADISC, which is longer. If that
4042  * fires, it means the ADISC timed out and our attempt to cancel it
4043  * also failed, so we need to reset the CRQ.
4044  **/
4045 static void ibmvfc_tgt_adisc(struct ibmvfc_target *tgt)
4046 {
4047 	struct ibmvfc_passthru_mad *mad;
4048 	struct ibmvfc_host *vhost = tgt->vhost;
4049 	struct ibmvfc_event *evt;
4050 
4051 	if (vhost->discovery_threads >= disc_threads)
4052 		return;
4053 
4054 	kref_get(&tgt->kref);
4055 	evt = ibmvfc_get_event(vhost);
4056 	vhost->discovery_threads++;
4057 	ibmvfc_init_event(evt, ibmvfc_tgt_adisc_done, IBMVFC_MAD_FORMAT);
4058 	evt->tgt = tgt;
4059 
4060 	ibmvfc_init_passthru(evt);
4061 	mad = &evt->iu.passthru;
4062 	mad->iu.flags = cpu_to_be32(IBMVFC_FC_ELS);
4063 	mad->iu.scsi_id = cpu_to_be64(tgt->scsi_id);
4064 	mad->iu.cancel_key = cpu_to_be32(tgt->cancel_key);
4065 
4066 	mad->fc_iu.payload[0] = cpu_to_be32(IBMVFC_ADISC);
4067 	memcpy(&mad->fc_iu.payload[2], &vhost->login_buf->resp.port_name,
4068 	       sizeof(vhost->login_buf->resp.port_name));
4069 	memcpy(&mad->fc_iu.payload[4], &vhost->login_buf->resp.node_name,
4070 	       sizeof(vhost->login_buf->resp.node_name));
4071 	mad->fc_iu.payload[6] = cpu_to_be32(be64_to_cpu(vhost->login_buf->resp.scsi_id) & 0x00ffffff);
4072 
4073 	if (timer_pending(&tgt->timer))
4074 		mod_timer(&tgt->timer, jiffies + (IBMVFC_ADISC_TIMEOUT * HZ));
4075 	else {
4076 		tgt->timer.expires = jiffies + (IBMVFC_ADISC_TIMEOUT * HZ);
4077 		add_timer(&tgt->timer);
4078 	}
4079 
4080 	ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_INIT_WAIT);
4081 	if (ibmvfc_send_event(evt, vhost, IBMVFC_ADISC_PLUS_CANCEL_TIMEOUT)) {
4082 		vhost->discovery_threads--;
4083 		del_timer(&tgt->timer);
4084 		ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
4085 		kref_put(&tgt->kref, ibmvfc_release_tgt);
4086 	} else
4087 		tgt_dbg(tgt, "Sent ADISC\n");
4088 }
4089 
4090 /**
4091  * ibmvfc_tgt_query_target_done - Completion handler for Query Target MAD
4092  * @evt:	ibmvfc event struct
4093  *
4094  **/
4095 static void ibmvfc_tgt_query_target_done(struct ibmvfc_event *evt)
4096 {
4097 	struct ibmvfc_target *tgt = evt->tgt;
4098 	struct ibmvfc_host *vhost = evt->vhost;
4099 	struct ibmvfc_query_tgt *rsp = &evt->xfer_iu->query_tgt;
4100 	u32 status = be16_to_cpu(rsp->common.status);
4101 	int level = IBMVFC_DEFAULT_LOG_LEVEL;
4102 
4103 	vhost->discovery_threads--;
4104 	ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
4105 	switch (status) {
4106 	case IBMVFC_MAD_SUCCESS:
4107 		tgt_dbg(tgt, "Query Target succeeded\n");
4108 		if (be64_to_cpu(rsp->scsi_id) != tgt->scsi_id)
4109 			ibmvfc_del_tgt(tgt);
4110 		else
4111 			ibmvfc_init_tgt(tgt, ibmvfc_tgt_adisc);
4112 		break;
4113 	case IBMVFC_MAD_DRIVER_FAILED:
4114 		break;
4115 	case IBMVFC_MAD_CRQ_ERROR:
4116 		ibmvfc_retry_tgt_init(tgt, ibmvfc_tgt_query_target);
4117 		break;
4118 	case IBMVFC_MAD_FAILED:
4119 	default:
4120 		if ((be16_to_cpu(rsp->status) & IBMVFC_FABRIC_MAPPED) == IBMVFC_FABRIC_MAPPED &&
4121 		    be16_to_cpu(rsp->error) == IBMVFC_UNABLE_TO_PERFORM_REQ &&
4122 		    be16_to_cpu(rsp->fc_explain) == IBMVFC_PORT_NAME_NOT_REG)
4123 			ibmvfc_del_tgt(tgt);
4124 		else if (ibmvfc_retry_cmd(be16_to_cpu(rsp->status), be16_to_cpu(rsp->error)))
4125 			level += ibmvfc_retry_tgt_init(tgt, ibmvfc_tgt_query_target);
4126 		else
4127 			ibmvfc_del_tgt(tgt);
4128 
4129 		tgt_log(tgt, level, "Query Target failed: %s (%x:%x) %s (%x) %s (%x) rc=0x%02X\n",
4130 			ibmvfc_get_cmd_error(be16_to_cpu(rsp->status), be16_to_cpu(rsp->error)),
4131 			be16_to_cpu(rsp->status), be16_to_cpu(rsp->error),
4132 			ibmvfc_get_fc_type(be16_to_cpu(rsp->fc_type)), be16_to_cpu(rsp->fc_type),
4133 			ibmvfc_get_gs_explain(be16_to_cpu(rsp->fc_explain)), be16_to_cpu(rsp->fc_explain),
4134 			status);
4135 		break;
4136 	}
4137 
4138 	kref_put(&tgt->kref, ibmvfc_release_tgt);
4139 	ibmvfc_free_event(evt);
4140 	wake_up(&vhost->work_wait_q);
4141 }
4142 
4143 /**
4144  * ibmvfc_tgt_query_target - Initiate a Query Target for specified target
4145  * @tgt:	ibmvfc target struct
4146  *
4147  **/
4148 static void ibmvfc_tgt_query_target(struct ibmvfc_target *tgt)
4149 {
4150 	struct ibmvfc_query_tgt *query_tgt;
4151 	struct ibmvfc_host *vhost = tgt->vhost;
4152 	struct ibmvfc_event *evt;
4153 
4154 	if (vhost->discovery_threads >= disc_threads)
4155 		return;
4156 
4157 	kref_get(&tgt->kref);
4158 	evt = ibmvfc_get_event(vhost);
4159 	vhost->discovery_threads++;
4160 	evt->tgt = tgt;
4161 	ibmvfc_init_event(evt, ibmvfc_tgt_query_target_done, IBMVFC_MAD_FORMAT);
4162 	query_tgt = &evt->iu.query_tgt;
4163 	memset(query_tgt, 0, sizeof(*query_tgt));
4164 	query_tgt->common.version = cpu_to_be32(1);
4165 	query_tgt->common.opcode = cpu_to_be32(IBMVFC_QUERY_TARGET);
4166 	query_tgt->common.length = cpu_to_be16(sizeof(*query_tgt));
4167 	query_tgt->wwpn = cpu_to_be64(tgt->ids.port_name);
4168 
4169 	ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_INIT_WAIT);
4170 	if (ibmvfc_send_event(evt, vhost, default_timeout)) {
4171 		vhost->discovery_threads--;
4172 		ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
4173 		kref_put(&tgt->kref, ibmvfc_release_tgt);
4174 	} else
4175 		tgt_dbg(tgt, "Sent Query Target\n");
4176 }
4177 
4178 /**
4179  * ibmvfc_alloc_target - Allocate and initialize an ibmvfc target
4180  * @vhost:		ibmvfc host struct
4181  * @scsi_id:	SCSI ID to allocate target for
4182  *
4183  * Returns:
4184  *	0 on success / other on failure
4185  **/
4186 static int ibmvfc_alloc_target(struct ibmvfc_host *vhost,
4187 			       struct ibmvfc_discover_targets_entry *target)
4188 {
4189 	struct ibmvfc_target *stgt = NULL;
4190 	struct ibmvfc_target *wtgt = NULL;
4191 	struct ibmvfc_target *tgt;
4192 	unsigned long flags;
4193 	u64 scsi_id = be32_to_cpu(target->scsi_id) & IBMVFC_DISC_TGT_SCSI_ID_MASK;
4194 	u64 wwpn = be64_to_cpu(target->wwpn);
4195 
4196 	/* Look to see if we already have a target allocated for this SCSI ID or WWPN */
4197 	spin_lock_irqsave(vhost->host->host_lock, flags);
4198 	list_for_each_entry(tgt, &vhost->targets, queue) {
4199 		if (tgt->wwpn == wwpn) {
4200 			wtgt = tgt;
4201 			break;
4202 		}
4203 	}
4204 
4205 	list_for_each_entry(tgt, &vhost->targets, queue) {
4206 		if (tgt->scsi_id == scsi_id) {
4207 			stgt = tgt;
4208 			break;
4209 		}
4210 	}
4211 
4212 	if (wtgt && !stgt) {
4213 		/*
4214 		 * A WWPN target has moved and we still are tracking the old
4215 		 * SCSI ID.  The only way we should be able to get here is if
4216 		 * we attempted to send an implicit logout for the old SCSI ID
4217 		 * and it failed for some reason, such as there being I/O
4218 		 * pending to the target. In this case, we will have already
4219 		 * deleted the rport from the FC transport so we do a move
4220 		 * login, which works even with I/O pending, as it will cancel
4221 		 * any active commands.
4222 		 */
4223 		if (wtgt->action == IBMVFC_TGT_ACTION_LOGOUT_DELETED_RPORT) {
4224 			/*
4225 			 * Do a move login here. The old target is no longer
4226 			 * known to the transport layer We don't use the
4227 			 * normal ibmvfc_set_tgt_action to set this, as we
4228 			 * don't normally want to allow this state change.
4229 			 */
4230 			wtgt->old_scsi_id = wtgt->scsi_id;
4231 			wtgt->scsi_id = scsi_id;
4232 			wtgt->action = IBMVFC_TGT_ACTION_INIT;
4233 			ibmvfc_init_tgt(wtgt, ibmvfc_tgt_move_login);
4234 			goto unlock_out;
4235 		} else {
4236 			tgt_err(wtgt, "Unexpected target state: %d, %p\n",
4237 				wtgt->action, wtgt->rport);
4238 		}
4239 	} else if (stgt) {
4240 		if (tgt->need_login)
4241 			ibmvfc_init_tgt(tgt, ibmvfc_tgt_implicit_logout);
4242 		goto unlock_out;
4243 	}
4244 	spin_unlock_irqrestore(vhost->host->host_lock, flags);
4245 
4246 	tgt = mempool_alloc(vhost->tgt_pool, GFP_NOIO);
4247 	memset(tgt, 0, sizeof(*tgt));
4248 	tgt->scsi_id = scsi_id;
4249 	tgt->wwpn = wwpn;
4250 	tgt->vhost = vhost;
4251 	tgt->need_login = 1;
4252 	timer_setup(&tgt->timer, ibmvfc_adisc_timeout, 0);
4253 	kref_init(&tgt->kref);
4254 	ibmvfc_init_tgt(tgt, ibmvfc_tgt_implicit_logout);
4255 	spin_lock_irqsave(vhost->host->host_lock, flags);
4256 	tgt->cancel_key = vhost->task_set++;
4257 	list_add_tail(&tgt->queue, &vhost->targets);
4258 
4259 unlock_out:
4260 	spin_unlock_irqrestore(vhost->host->host_lock, flags);
4261 	return 0;
4262 }
4263 
4264 /**
4265  * ibmvfc_alloc_targets - Allocate and initialize ibmvfc targets
4266  * @vhost:		ibmvfc host struct
4267  *
4268  * Returns:
4269  *	0 on success / other on failure
4270  **/
4271 static int ibmvfc_alloc_targets(struct ibmvfc_host *vhost)
4272 {
4273 	int i, rc;
4274 
4275 	for (i = 0, rc = 0; !rc && i < vhost->num_targets; i++)
4276 		rc = ibmvfc_alloc_target(vhost, &vhost->disc_buf[i]);
4277 
4278 	return rc;
4279 }
4280 
4281 /**
4282  * ibmvfc_discover_targets_done - Completion handler for discover targets MAD
4283  * @evt:	ibmvfc event struct
4284  *
4285  **/
4286 static void ibmvfc_discover_targets_done(struct ibmvfc_event *evt)
4287 {
4288 	struct ibmvfc_host *vhost = evt->vhost;
4289 	struct ibmvfc_discover_targets *rsp = &evt->xfer_iu->discover_targets;
4290 	u32 mad_status = be16_to_cpu(rsp->common.status);
4291 	int level = IBMVFC_DEFAULT_LOG_LEVEL;
4292 
4293 	switch (mad_status) {
4294 	case IBMVFC_MAD_SUCCESS:
4295 		ibmvfc_dbg(vhost, "Discover Targets succeeded\n");
4296 		vhost->num_targets = be32_to_cpu(rsp->num_written);
4297 		ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_ALLOC_TGTS);
4298 		break;
4299 	case IBMVFC_MAD_FAILED:
4300 		level += ibmvfc_retry_host_init(vhost);
4301 		ibmvfc_log(vhost, level, "Discover Targets failed: %s (%x:%x)\n",
4302 			   ibmvfc_get_cmd_error(be16_to_cpu(rsp->status), be16_to_cpu(rsp->error)),
4303 			   be16_to_cpu(rsp->status), be16_to_cpu(rsp->error));
4304 		break;
4305 	case IBMVFC_MAD_DRIVER_FAILED:
4306 		break;
4307 	default:
4308 		dev_err(vhost->dev, "Invalid Discover Targets response: 0x%x\n", mad_status);
4309 		ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
4310 		break;
4311 	}
4312 
4313 	ibmvfc_free_event(evt);
4314 	wake_up(&vhost->work_wait_q);
4315 }
4316 
4317 /**
4318  * ibmvfc_discover_targets - Send Discover Targets MAD
4319  * @vhost:	ibmvfc host struct
4320  *
4321  **/
4322 static void ibmvfc_discover_targets(struct ibmvfc_host *vhost)
4323 {
4324 	struct ibmvfc_discover_targets *mad;
4325 	struct ibmvfc_event *evt = ibmvfc_get_event(vhost);
4326 
4327 	ibmvfc_init_event(evt, ibmvfc_discover_targets_done, IBMVFC_MAD_FORMAT);
4328 	mad = &evt->iu.discover_targets;
4329 	memset(mad, 0, sizeof(*mad));
4330 	mad->common.version = cpu_to_be32(1);
4331 	mad->common.opcode = cpu_to_be32(IBMVFC_DISC_TARGETS);
4332 	mad->common.length = cpu_to_be16(sizeof(*mad));
4333 	mad->bufflen = cpu_to_be32(vhost->disc_buf_sz);
4334 	mad->buffer.va = cpu_to_be64(vhost->disc_buf_dma);
4335 	mad->buffer.len = cpu_to_be32(vhost->disc_buf_sz);
4336 	mad->flags = cpu_to_be32(IBMVFC_DISC_TGT_PORT_ID_WWPN_LIST);
4337 	ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT_WAIT);
4338 
4339 	if (!ibmvfc_send_event(evt, vhost, default_timeout))
4340 		ibmvfc_dbg(vhost, "Sent discover targets\n");
4341 	else
4342 		ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
4343 }
4344 
4345 /**
4346  * ibmvfc_npiv_login_done - Completion handler for NPIV Login
4347  * @evt:	ibmvfc event struct
4348  *
4349  **/
4350 static void ibmvfc_npiv_login_done(struct ibmvfc_event *evt)
4351 {
4352 	struct ibmvfc_host *vhost = evt->vhost;
4353 	u32 mad_status = be16_to_cpu(evt->xfer_iu->npiv_login.common.status);
4354 	struct ibmvfc_npiv_login_resp *rsp = &vhost->login_buf->resp;
4355 	unsigned int npiv_max_sectors;
4356 	int level = IBMVFC_DEFAULT_LOG_LEVEL;
4357 
4358 	switch (mad_status) {
4359 	case IBMVFC_MAD_SUCCESS:
4360 		ibmvfc_free_event(evt);
4361 		break;
4362 	case IBMVFC_MAD_FAILED:
4363 		if (ibmvfc_retry_cmd(be16_to_cpu(rsp->status), be16_to_cpu(rsp->error)))
4364 			level += ibmvfc_retry_host_init(vhost);
4365 		else
4366 			ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
4367 		ibmvfc_log(vhost, level, "NPIV Login failed: %s (%x:%x)\n",
4368 			   ibmvfc_get_cmd_error(be16_to_cpu(rsp->status), be16_to_cpu(rsp->error)),
4369 						be16_to_cpu(rsp->status), be16_to_cpu(rsp->error));
4370 		ibmvfc_free_event(evt);
4371 		return;
4372 	case IBMVFC_MAD_CRQ_ERROR:
4373 		ibmvfc_retry_host_init(vhost);
4374 		fallthrough;
4375 	case IBMVFC_MAD_DRIVER_FAILED:
4376 		ibmvfc_free_event(evt);
4377 		return;
4378 	default:
4379 		dev_err(vhost->dev, "Invalid NPIV Login response: 0x%x\n", mad_status);
4380 		ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
4381 		ibmvfc_free_event(evt);
4382 		return;
4383 	}
4384 
4385 	vhost->client_migrated = 0;
4386 
4387 	if (!(be32_to_cpu(rsp->flags) & IBMVFC_NATIVE_FC)) {
4388 		dev_err(vhost->dev, "Virtual adapter does not support FC. %x\n",
4389 			rsp->flags);
4390 		ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
4391 		wake_up(&vhost->work_wait_q);
4392 		return;
4393 	}
4394 
4395 	if (be32_to_cpu(rsp->max_cmds) <= IBMVFC_NUM_INTERNAL_REQ) {
4396 		dev_err(vhost->dev, "Virtual adapter supported queue depth too small: %d\n",
4397 			rsp->max_cmds);
4398 		ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
4399 		wake_up(&vhost->work_wait_q);
4400 		return;
4401 	}
4402 
4403 	vhost->logged_in = 1;
4404 	npiv_max_sectors = min((uint)(be64_to_cpu(rsp->max_dma_len) >> 9), IBMVFC_MAX_SECTORS);
4405 	dev_info(vhost->dev, "Host partition: %s, device: %s %s %s max sectors %u\n",
4406 		 rsp->partition_name, rsp->device_name, rsp->port_loc_code,
4407 		 rsp->drc_name, npiv_max_sectors);
4408 
4409 	fc_host_fabric_name(vhost->host) = be64_to_cpu(rsp->node_name);
4410 	fc_host_node_name(vhost->host) = be64_to_cpu(rsp->node_name);
4411 	fc_host_port_name(vhost->host) = be64_to_cpu(rsp->port_name);
4412 	fc_host_port_id(vhost->host) = be64_to_cpu(rsp->scsi_id);
4413 	fc_host_port_type(vhost->host) = FC_PORTTYPE_NPIV;
4414 	fc_host_supported_classes(vhost->host) = 0;
4415 	if (be32_to_cpu(rsp->service_parms.class1_parms[0]) & 0x80000000)
4416 		fc_host_supported_classes(vhost->host) |= FC_COS_CLASS1;
4417 	if (be32_to_cpu(rsp->service_parms.class2_parms[0]) & 0x80000000)
4418 		fc_host_supported_classes(vhost->host) |= FC_COS_CLASS2;
4419 	if (be32_to_cpu(rsp->service_parms.class3_parms[0]) & 0x80000000)
4420 		fc_host_supported_classes(vhost->host) |= FC_COS_CLASS3;
4421 	fc_host_maxframe_size(vhost->host) =
4422 		be16_to_cpu(rsp->service_parms.common.bb_rcv_sz) & 0x0fff;
4423 
4424 	vhost->host->can_queue = be32_to_cpu(rsp->max_cmds) - IBMVFC_NUM_INTERNAL_REQ;
4425 	vhost->host->max_sectors = npiv_max_sectors;
4426 	ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY);
4427 	wake_up(&vhost->work_wait_q);
4428 }
4429 
4430 /**
4431  * ibmvfc_npiv_login - Sends NPIV login
4432  * @vhost:	ibmvfc host struct
4433  *
4434  **/
4435 static void ibmvfc_npiv_login(struct ibmvfc_host *vhost)
4436 {
4437 	struct ibmvfc_npiv_login_mad *mad;
4438 	struct ibmvfc_event *evt = ibmvfc_get_event(vhost);
4439 
4440 	ibmvfc_gather_partition_info(vhost);
4441 	ibmvfc_set_login_info(vhost);
4442 	ibmvfc_init_event(evt, ibmvfc_npiv_login_done, IBMVFC_MAD_FORMAT);
4443 
4444 	memcpy(vhost->login_buf, &vhost->login_info, sizeof(vhost->login_info));
4445 	mad = &evt->iu.npiv_login;
4446 	memset(mad, 0, sizeof(struct ibmvfc_npiv_login_mad));
4447 	mad->common.version = cpu_to_be32(1);
4448 	mad->common.opcode = cpu_to_be32(IBMVFC_NPIV_LOGIN);
4449 	mad->common.length = cpu_to_be16(sizeof(struct ibmvfc_npiv_login_mad));
4450 	mad->buffer.va = cpu_to_be64(vhost->login_buf_dma);
4451 	mad->buffer.len = cpu_to_be32(sizeof(*vhost->login_buf));
4452 
4453 	ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT_WAIT);
4454 
4455 	if (!ibmvfc_send_event(evt, vhost, default_timeout))
4456 		ibmvfc_dbg(vhost, "Sent NPIV login\n");
4457 	else
4458 		ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
4459 }
4460 
4461 /**
4462  * ibmvfc_npiv_logout_done - Completion handler for NPIV Logout
4463  * @vhost:		ibmvfc host struct
4464  *
4465  **/
4466 static void ibmvfc_npiv_logout_done(struct ibmvfc_event *evt)
4467 {
4468 	struct ibmvfc_host *vhost = evt->vhost;
4469 	u32 mad_status = be16_to_cpu(evt->xfer_iu->npiv_logout.common.status);
4470 
4471 	ibmvfc_free_event(evt);
4472 
4473 	switch (mad_status) {
4474 	case IBMVFC_MAD_SUCCESS:
4475 		if (list_empty(&vhost->sent) &&
4476 		    vhost->action == IBMVFC_HOST_ACTION_LOGO_WAIT) {
4477 			ibmvfc_init_host(vhost);
4478 			return;
4479 		}
4480 		break;
4481 	case IBMVFC_MAD_FAILED:
4482 	case IBMVFC_MAD_NOT_SUPPORTED:
4483 	case IBMVFC_MAD_CRQ_ERROR:
4484 	case IBMVFC_MAD_DRIVER_FAILED:
4485 	default:
4486 		ibmvfc_dbg(vhost, "NPIV Logout failed. 0x%X\n", mad_status);
4487 		break;
4488 	}
4489 
4490 	ibmvfc_hard_reset_host(vhost);
4491 }
4492 
4493 /**
4494  * ibmvfc_npiv_logout - Issue an NPIV Logout
4495  * @vhost:		ibmvfc host struct
4496  *
4497  **/
4498 static void ibmvfc_npiv_logout(struct ibmvfc_host *vhost)
4499 {
4500 	struct ibmvfc_npiv_logout_mad *mad;
4501 	struct ibmvfc_event *evt;
4502 
4503 	evt = ibmvfc_get_event(vhost);
4504 	ibmvfc_init_event(evt, ibmvfc_npiv_logout_done, IBMVFC_MAD_FORMAT);
4505 
4506 	mad = &evt->iu.npiv_logout;
4507 	memset(mad, 0, sizeof(*mad));
4508 	mad->common.version = cpu_to_be32(1);
4509 	mad->common.opcode = cpu_to_be32(IBMVFC_NPIV_LOGOUT);
4510 	mad->common.length = cpu_to_be16(sizeof(struct ibmvfc_npiv_logout_mad));
4511 
4512 	ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_LOGO_WAIT);
4513 
4514 	if (!ibmvfc_send_event(evt, vhost, default_timeout))
4515 		ibmvfc_dbg(vhost, "Sent NPIV logout\n");
4516 	else
4517 		ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
4518 }
4519 
4520 /**
4521  * ibmvfc_dev_init_to_do - Is there target initialization work to do?
4522  * @vhost:		ibmvfc host struct
4523  *
4524  * Returns:
4525  *	1 if work to do / 0 if not
4526  **/
4527 static int ibmvfc_dev_init_to_do(struct ibmvfc_host *vhost)
4528 {
4529 	struct ibmvfc_target *tgt;
4530 
4531 	list_for_each_entry(tgt, &vhost->targets, queue) {
4532 		if (tgt->action == IBMVFC_TGT_ACTION_INIT ||
4533 		    tgt->action == IBMVFC_TGT_ACTION_INIT_WAIT)
4534 			return 1;
4535 	}
4536 
4537 	return 0;
4538 }
4539 
4540 /**
4541  * ibmvfc_dev_logo_to_do - Is there target logout work to do?
4542  * @vhost:		ibmvfc host struct
4543  *
4544  * Returns:
4545  *	1 if work to do / 0 if not
4546  **/
4547 static int ibmvfc_dev_logo_to_do(struct ibmvfc_host *vhost)
4548 {
4549 	struct ibmvfc_target *tgt;
4550 
4551 	list_for_each_entry(tgt, &vhost->targets, queue) {
4552 		if (tgt->action == IBMVFC_TGT_ACTION_LOGOUT_RPORT ||
4553 		    tgt->action == IBMVFC_TGT_ACTION_LOGOUT_RPORT_WAIT)
4554 			return 1;
4555 	}
4556 	return 0;
4557 }
4558 
4559 /**
4560  * __ibmvfc_work_to_do - Is there task level work to do? (no locking)
4561  * @vhost:		ibmvfc host struct
4562  *
4563  * Returns:
4564  *	1 if work to do / 0 if not
4565  **/
4566 static int __ibmvfc_work_to_do(struct ibmvfc_host *vhost)
4567 {
4568 	struct ibmvfc_target *tgt;
4569 
4570 	if (kthread_should_stop())
4571 		return 1;
4572 	switch (vhost->action) {
4573 	case IBMVFC_HOST_ACTION_NONE:
4574 	case IBMVFC_HOST_ACTION_INIT_WAIT:
4575 	case IBMVFC_HOST_ACTION_LOGO_WAIT:
4576 		return 0;
4577 	case IBMVFC_HOST_ACTION_TGT_INIT:
4578 	case IBMVFC_HOST_ACTION_QUERY_TGTS:
4579 		if (vhost->discovery_threads == disc_threads)
4580 			return 0;
4581 		list_for_each_entry(tgt, &vhost->targets, queue)
4582 			if (tgt->action == IBMVFC_TGT_ACTION_INIT)
4583 				return 1;
4584 		list_for_each_entry(tgt, &vhost->targets, queue)
4585 			if (tgt->action == IBMVFC_TGT_ACTION_INIT_WAIT)
4586 				return 0;
4587 		return 1;
4588 	case IBMVFC_HOST_ACTION_TGT_DEL:
4589 	case IBMVFC_HOST_ACTION_TGT_DEL_FAILED:
4590 		if (vhost->discovery_threads == disc_threads)
4591 			return 0;
4592 		list_for_each_entry(tgt, &vhost->targets, queue)
4593 			if (tgt->action == IBMVFC_TGT_ACTION_LOGOUT_RPORT)
4594 				return 1;
4595 		list_for_each_entry(tgt, &vhost->targets, queue)
4596 			if (tgt->action == IBMVFC_TGT_ACTION_LOGOUT_RPORT_WAIT)
4597 				return 0;
4598 		return 1;
4599 	case IBMVFC_HOST_ACTION_LOGO:
4600 	case IBMVFC_HOST_ACTION_INIT:
4601 	case IBMVFC_HOST_ACTION_ALLOC_TGTS:
4602 	case IBMVFC_HOST_ACTION_QUERY:
4603 	case IBMVFC_HOST_ACTION_RESET:
4604 	case IBMVFC_HOST_ACTION_REENABLE:
4605 	default:
4606 		break;
4607 	}
4608 
4609 	return 1;
4610 }
4611 
4612 /**
4613  * ibmvfc_work_to_do - Is there task level work to do?
4614  * @vhost:		ibmvfc host struct
4615  *
4616  * Returns:
4617  *	1 if work to do / 0 if not
4618  **/
4619 static int ibmvfc_work_to_do(struct ibmvfc_host *vhost)
4620 {
4621 	unsigned long flags;
4622 	int rc;
4623 
4624 	spin_lock_irqsave(vhost->host->host_lock, flags);
4625 	rc = __ibmvfc_work_to_do(vhost);
4626 	spin_unlock_irqrestore(vhost->host->host_lock, flags);
4627 	return rc;
4628 }
4629 
4630 /**
4631  * ibmvfc_log_ae - Log async events if necessary
4632  * @vhost:		ibmvfc host struct
4633  * @events:		events to log
4634  *
4635  **/
4636 static void ibmvfc_log_ae(struct ibmvfc_host *vhost, int events)
4637 {
4638 	if (events & IBMVFC_AE_RSCN)
4639 		fc_host_post_event(vhost->host, fc_get_event_number(), FCH_EVT_RSCN, 0);
4640 	if ((events & IBMVFC_AE_LINKDOWN) &&
4641 	    vhost->state >= IBMVFC_HALTED)
4642 		fc_host_post_event(vhost->host, fc_get_event_number(), FCH_EVT_LINKDOWN, 0);
4643 	if ((events & IBMVFC_AE_LINKUP) &&
4644 	    vhost->state == IBMVFC_INITIALIZING)
4645 		fc_host_post_event(vhost->host, fc_get_event_number(), FCH_EVT_LINKUP, 0);
4646 }
4647 
4648 /**
4649  * ibmvfc_tgt_add_rport - Tell the FC transport about a new remote port
4650  * @tgt:		ibmvfc target struct
4651  *
4652  **/
4653 static void ibmvfc_tgt_add_rport(struct ibmvfc_target *tgt)
4654 {
4655 	struct ibmvfc_host *vhost = tgt->vhost;
4656 	struct fc_rport *rport;
4657 	unsigned long flags;
4658 
4659 	tgt_dbg(tgt, "Adding rport\n");
4660 	rport = fc_remote_port_add(vhost->host, 0, &tgt->ids);
4661 	spin_lock_irqsave(vhost->host->host_lock, flags);
4662 
4663 	if (rport && tgt->action == IBMVFC_TGT_ACTION_DEL_RPORT) {
4664 		tgt_dbg(tgt, "Deleting rport\n");
4665 		list_del(&tgt->queue);
4666 		ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DELETED_RPORT);
4667 		spin_unlock_irqrestore(vhost->host->host_lock, flags);
4668 		fc_remote_port_delete(rport);
4669 		del_timer_sync(&tgt->timer);
4670 		kref_put(&tgt->kref, ibmvfc_release_tgt);
4671 		return;
4672 	} else if (rport && tgt->action == IBMVFC_TGT_ACTION_DEL_AND_LOGOUT_RPORT) {
4673 		tgt_dbg(tgt, "Deleting rport with outstanding I/O\n");
4674 		ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_LOGOUT_DELETED_RPORT);
4675 		tgt->rport = NULL;
4676 		spin_unlock_irqrestore(vhost->host->host_lock, flags);
4677 		fc_remote_port_delete(rport);
4678 		return;
4679 	} else if (rport && tgt->action == IBMVFC_TGT_ACTION_DELETED_RPORT) {
4680 		spin_unlock_irqrestore(vhost->host->host_lock, flags);
4681 		return;
4682 	}
4683 
4684 	if (rport) {
4685 		tgt_dbg(tgt, "rport add succeeded\n");
4686 		tgt->rport = rport;
4687 		rport->maxframe_size = be16_to_cpu(tgt->service_parms.common.bb_rcv_sz) & 0x0fff;
4688 		rport->supported_classes = 0;
4689 		tgt->target_id = rport->scsi_target_id;
4690 		if (be32_to_cpu(tgt->service_parms.class1_parms[0]) & 0x80000000)
4691 			rport->supported_classes |= FC_COS_CLASS1;
4692 		if (be32_to_cpu(tgt->service_parms.class2_parms[0]) & 0x80000000)
4693 			rport->supported_classes |= FC_COS_CLASS2;
4694 		if (be32_to_cpu(tgt->service_parms.class3_parms[0]) & 0x80000000)
4695 			rport->supported_classes |= FC_COS_CLASS3;
4696 		if (rport->rqst_q)
4697 			blk_queue_max_segments(rport->rqst_q, 1);
4698 	} else
4699 		tgt_dbg(tgt, "rport add failed\n");
4700 	spin_unlock_irqrestore(vhost->host->host_lock, flags);
4701 }
4702 
4703 /**
4704  * ibmvfc_do_work - Do task level work
4705  * @vhost:		ibmvfc host struct
4706  *
4707  **/
4708 static void ibmvfc_do_work(struct ibmvfc_host *vhost)
4709 {
4710 	struct ibmvfc_target *tgt;
4711 	unsigned long flags;
4712 	struct fc_rport *rport;
4713 	int rc;
4714 
4715 	ibmvfc_log_ae(vhost, vhost->events_to_log);
4716 	spin_lock_irqsave(vhost->host->host_lock, flags);
4717 	vhost->events_to_log = 0;
4718 	switch (vhost->action) {
4719 	case IBMVFC_HOST_ACTION_NONE:
4720 	case IBMVFC_HOST_ACTION_LOGO_WAIT:
4721 	case IBMVFC_HOST_ACTION_INIT_WAIT:
4722 		break;
4723 	case IBMVFC_HOST_ACTION_RESET:
4724 		vhost->action = IBMVFC_HOST_ACTION_TGT_DEL;
4725 		spin_unlock_irqrestore(vhost->host->host_lock, flags);
4726 		rc = ibmvfc_reset_crq(vhost);
4727 		spin_lock_irqsave(vhost->host->host_lock, flags);
4728 		if (rc == H_CLOSED)
4729 			vio_enable_interrupts(to_vio_dev(vhost->dev));
4730 		if (rc || (rc = ibmvfc_send_crq_init(vhost)) ||
4731 		    (rc = vio_enable_interrupts(to_vio_dev(vhost->dev)))) {
4732 			ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
4733 			dev_err(vhost->dev, "Error after reset (rc=%d)\n", rc);
4734 		}
4735 		break;
4736 	case IBMVFC_HOST_ACTION_REENABLE:
4737 		vhost->action = IBMVFC_HOST_ACTION_TGT_DEL;
4738 		spin_unlock_irqrestore(vhost->host->host_lock, flags);
4739 		rc = ibmvfc_reenable_crq_queue(vhost);
4740 		spin_lock_irqsave(vhost->host->host_lock, flags);
4741 		if (rc || (rc = ibmvfc_send_crq_init(vhost))) {
4742 			ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
4743 			dev_err(vhost->dev, "Error after enable (rc=%d)\n", rc);
4744 		}
4745 		break;
4746 	case IBMVFC_HOST_ACTION_LOGO:
4747 		vhost->job_step(vhost);
4748 		break;
4749 	case IBMVFC_HOST_ACTION_INIT:
4750 		BUG_ON(vhost->state != IBMVFC_INITIALIZING);
4751 		if (vhost->delay_init) {
4752 			vhost->delay_init = 0;
4753 			spin_unlock_irqrestore(vhost->host->host_lock, flags);
4754 			ssleep(15);
4755 			return;
4756 		} else
4757 			vhost->job_step(vhost);
4758 		break;
4759 	case IBMVFC_HOST_ACTION_QUERY:
4760 		list_for_each_entry(tgt, &vhost->targets, queue)
4761 			ibmvfc_init_tgt(tgt, ibmvfc_tgt_query_target);
4762 		ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY_TGTS);
4763 		break;
4764 	case IBMVFC_HOST_ACTION_QUERY_TGTS:
4765 		list_for_each_entry(tgt, &vhost->targets, queue) {
4766 			if (tgt->action == IBMVFC_TGT_ACTION_INIT) {
4767 				tgt->job_step(tgt);
4768 				break;
4769 			}
4770 		}
4771 
4772 		if (!ibmvfc_dev_init_to_do(vhost))
4773 			ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_DEL);
4774 		break;
4775 	case IBMVFC_HOST_ACTION_TGT_DEL:
4776 	case IBMVFC_HOST_ACTION_TGT_DEL_FAILED:
4777 		list_for_each_entry(tgt, &vhost->targets, queue) {
4778 			if (tgt->action == IBMVFC_TGT_ACTION_LOGOUT_RPORT) {
4779 				tgt->job_step(tgt);
4780 				break;
4781 			}
4782 		}
4783 
4784 		if (ibmvfc_dev_logo_to_do(vhost)) {
4785 			spin_unlock_irqrestore(vhost->host->host_lock, flags);
4786 			return;
4787 		}
4788 
4789 		list_for_each_entry(tgt, &vhost->targets, queue) {
4790 			if (tgt->action == IBMVFC_TGT_ACTION_DEL_RPORT) {
4791 				tgt_dbg(tgt, "Deleting rport\n");
4792 				rport = tgt->rport;
4793 				tgt->rport = NULL;
4794 				list_del(&tgt->queue);
4795 				ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DELETED_RPORT);
4796 				spin_unlock_irqrestore(vhost->host->host_lock, flags);
4797 				if (rport)
4798 					fc_remote_port_delete(rport);
4799 				del_timer_sync(&tgt->timer);
4800 				kref_put(&tgt->kref, ibmvfc_release_tgt);
4801 				return;
4802 			} else if (tgt->action == IBMVFC_TGT_ACTION_DEL_AND_LOGOUT_RPORT) {
4803 				tgt_dbg(tgt, "Deleting rport with I/O outstanding\n");
4804 				rport = tgt->rport;
4805 				tgt->rport = NULL;
4806 				ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_LOGOUT_DELETED_RPORT);
4807 				spin_unlock_irqrestore(vhost->host->host_lock, flags);
4808 				if (rport)
4809 					fc_remote_port_delete(rport);
4810 				return;
4811 			}
4812 		}
4813 
4814 		if (vhost->state == IBMVFC_INITIALIZING) {
4815 			if (vhost->action == IBMVFC_HOST_ACTION_TGT_DEL_FAILED) {
4816 				if (vhost->reinit) {
4817 					vhost->reinit = 0;
4818 					scsi_block_requests(vhost->host);
4819 					ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY);
4820 					spin_unlock_irqrestore(vhost->host->host_lock, flags);
4821 				} else {
4822 					ibmvfc_set_host_state(vhost, IBMVFC_ACTIVE);
4823 					ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE);
4824 					wake_up(&vhost->init_wait_q);
4825 					schedule_work(&vhost->rport_add_work_q);
4826 					vhost->init_retries = 0;
4827 					spin_unlock_irqrestore(vhost->host->host_lock, flags);
4828 					scsi_unblock_requests(vhost->host);
4829 				}
4830 
4831 				return;
4832 			} else {
4833 				ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT);
4834 				vhost->job_step = ibmvfc_discover_targets;
4835 			}
4836 		} else {
4837 			ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE);
4838 			spin_unlock_irqrestore(vhost->host->host_lock, flags);
4839 			scsi_unblock_requests(vhost->host);
4840 			wake_up(&vhost->init_wait_q);
4841 			return;
4842 		}
4843 		break;
4844 	case IBMVFC_HOST_ACTION_ALLOC_TGTS:
4845 		ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_INIT);
4846 		spin_unlock_irqrestore(vhost->host->host_lock, flags);
4847 		ibmvfc_alloc_targets(vhost);
4848 		spin_lock_irqsave(vhost->host->host_lock, flags);
4849 		break;
4850 	case IBMVFC_HOST_ACTION_TGT_INIT:
4851 		list_for_each_entry(tgt, &vhost->targets, queue) {
4852 			if (tgt->action == IBMVFC_TGT_ACTION_INIT) {
4853 				tgt->job_step(tgt);
4854 				break;
4855 			}
4856 		}
4857 
4858 		if (!ibmvfc_dev_init_to_do(vhost))
4859 			ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_DEL_FAILED);
4860 		break;
4861 	default:
4862 		break;
4863 	}
4864 
4865 	spin_unlock_irqrestore(vhost->host->host_lock, flags);
4866 }
4867 
4868 /**
4869  * ibmvfc_work - Do task level work
4870  * @data:		ibmvfc host struct
4871  *
4872  * Returns:
4873  *	zero
4874  **/
4875 static int ibmvfc_work(void *data)
4876 {
4877 	struct ibmvfc_host *vhost = data;
4878 	int rc;
4879 
4880 	set_user_nice(current, MIN_NICE);
4881 
4882 	while (1) {
4883 		rc = wait_event_interruptible(vhost->work_wait_q,
4884 					      ibmvfc_work_to_do(vhost));
4885 
4886 		BUG_ON(rc);
4887 
4888 		if (kthread_should_stop())
4889 			break;
4890 
4891 		ibmvfc_do_work(vhost);
4892 	}
4893 
4894 	ibmvfc_dbg(vhost, "ibmvfc kthread exiting...\n");
4895 	return 0;
4896 }
4897 
4898 /**
4899  * ibmvfc_init_crq - Initializes and registers CRQ with hypervisor
4900  * @vhost:	ibmvfc host struct
4901  *
4902  * Allocates a page for messages, maps it for dma, and registers
4903  * the crq with the hypervisor.
4904  *
4905  * Return value:
4906  *	zero on success / other on failure
4907  **/
4908 static int ibmvfc_init_crq(struct ibmvfc_host *vhost)
4909 {
4910 	int rc, retrc = -ENOMEM;
4911 	struct device *dev = vhost->dev;
4912 	struct vio_dev *vdev = to_vio_dev(dev);
4913 	struct ibmvfc_crq_queue *crq = &vhost->crq;
4914 
4915 	ENTER;
4916 	crq->msgs = (struct ibmvfc_crq *)get_zeroed_page(GFP_KERNEL);
4917 
4918 	if (!crq->msgs)
4919 		return -ENOMEM;
4920 
4921 	crq->size = PAGE_SIZE / sizeof(*crq->msgs);
4922 	crq->msg_token = dma_map_single(dev, crq->msgs,
4923 					PAGE_SIZE, DMA_BIDIRECTIONAL);
4924 
4925 	if (dma_mapping_error(dev, crq->msg_token))
4926 		goto map_failed;
4927 
4928 	retrc = rc = plpar_hcall_norets(H_REG_CRQ, vdev->unit_address,
4929 					crq->msg_token, PAGE_SIZE);
4930 
4931 	if (rc == H_RESOURCE)
4932 		/* maybe kexecing and resource is busy. try a reset */
4933 		retrc = rc = ibmvfc_reset_crq(vhost);
4934 
4935 	if (rc == H_CLOSED)
4936 		dev_warn(dev, "Partner adapter not ready\n");
4937 	else if (rc) {
4938 		dev_warn(dev, "Error %d opening adapter\n", rc);
4939 		goto reg_crq_failed;
4940 	}
4941 
4942 	retrc = 0;
4943 
4944 	tasklet_init(&vhost->tasklet, (void *)ibmvfc_tasklet, (unsigned long)vhost);
4945 
4946 	if ((rc = request_irq(vdev->irq, ibmvfc_interrupt, 0, IBMVFC_NAME, vhost))) {
4947 		dev_err(dev, "Couldn't register irq 0x%x. rc=%d\n", vdev->irq, rc);
4948 		goto req_irq_failed;
4949 	}
4950 
4951 	if ((rc = vio_enable_interrupts(vdev))) {
4952 		dev_err(dev, "Error %d enabling interrupts\n", rc);
4953 		goto req_irq_failed;
4954 	}
4955 
4956 	crq->cur = 0;
4957 	LEAVE;
4958 	return retrc;
4959 
4960 req_irq_failed:
4961 	tasklet_kill(&vhost->tasklet);
4962 	do {
4963 		rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address);
4964 	} while (rc == H_BUSY || H_IS_LONG_BUSY(rc));
4965 reg_crq_failed:
4966 	dma_unmap_single(dev, crq->msg_token, PAGE_SIZE, DMA_BIDIRECTIONAL);
4967 map_failed:
4968 	free_page((unsigned long)crq->msgs);
4969 	return retrc;
4970 }
4971 
4972 /**
4973  * ibmvfc_free_mem - Free memory for vhost
4974  * @vhost:	ibmvfc host struct
4975  *
4976  * Return value:
4977  * 	none
4978  **/
4979 static void ibmvfc_free_mem(struct ibmvfc_host *vhost)
4980 {
4981 	struct ibmvfc_async_crq_queue *async_q = &vhost->async_crq;
4982 
4983 	ENTER;
4984 	mempool_destroy(vhost->tgt_pool);
4985 	kfree(vhost->trace);
4986 	dma_free_coherent(vhost->dev, vhost->disc_buf_sz, vhost->disc_buf,
4987 			  vhost->disc_buf_dma);
4988 	dma_free_coherent(vhost->dev, sizeof(*vhost->login_buf),
4989 			  vhost->login_buf, vhost->login_buf_dma);
4990 	dma_pool_destroy(vhost->sg_pool);
4991 	dma_unmap_single(vhost->dev, async_q->msg_token,
4992 			 async_q->size * sizeof(*async_q->msgs), DMA_BIDIRECTIONAL);
4993 	free_page((unsigned long)async_q->msgs);
4994 	LEAVE;
4995 }
4996 
4997 /**
4998  * ibmvfc_alloc_mem - Allocate memory for vhost
4999  * @vhost:	ibmvfc host struct
5000  *
5001  * Return value:
5002  * 	0 on success / non-zero on failure
5003  **/
5004 static int ibmvfc_alloc_mem(struct ibmvfc_host *vhost)
5005 {
5006 	struct ibmvfc_async_crq_queue *async_q = &vhost->async_crq;
5007 	struct device *dev = vhost->dev;
5008 
5009 	ENTER;
5010 	async_q->msgs = (struct ibmvfc_async_crq *)get_zeroed_page(GFP_KERNEL);
5011 	if (!async_q->msgs) {
5012 		dev_err(dev, "Couldn't allocate async queue.\n");
5013 		goto nomem;
5014 	}
5015 
5016 	async_q->size = PAGE_SIZE / sizeof(struct ibmvfc_async_crq);
5017 	async_q->msg_token = dma_map_single(dev, async_q->msgs,
5018 					    async_q->size * sizeof(*async_q->msgs),
5019 					    DMA_BIDIRECTIONAL);
5020 
5021 	if (dma_mapping_error(dev, async_q->msg_token)) {
5022 		dev_err(dev, "Failed to map async queue\n");
5023 		goto free_async_crq;
5024 	}
5025 
5026 	vhost->sg_pool = dma_pool_create(IBMVFC_NAME, dev,
5027 					 SG_ALL * sizeof(struct srp_direct_buf),
5028 					 sizeof(struct srp_direct_buf), 0);
5029 
5030 	if (!vhost->sg_pool) {
5031 		dev_err(dev, "Failed to allocate sg pool\n");
5032 		goto unmap_async_crq;
5033 	}
5034 
5035 	vhost->login_buf = dma_alloc_coherent(dev, sizeof(*vhost->login_buf),
5036 					      &vhost->login_buf_dma, GFP_KERNEL);
5037 
5038 	if (!vhost->login_buf) {
5039 		dev_err(dev, "Couldn't allocate NPIV login buffer\n");
5040 		goto free_sg_pool;
5041 	}
5042 
5043 	vhost->disc_buf_sz = sizeof(*vhost->disc_buf) * max_targets;
5044 	vhost->disc_buf = dma_alloc_coherent(dev, vhost->disc_buf_sz,
5045 					     &vhost->disc_buf_dma, GFP_KERNEL);
5046 
5047 	if (!vhost->disc_buf) {
5048 		dev_err(dev, "Couldn't allocate Discover Targets buffer\n");
5049 		goto free_login_buffer;
5050 	}
5051 
5052 	vhost->trace = kcalloc(IBMVFC_NUM_TRACE_ENTRIES,
5053 			       sizeof(struct ibmvfc_trace_entry), GFP_KERNEL);
5054 
5055 	if (!vhost->trace)
5056 		goto free_disc_buffer;
5057 
5058 	vhost->tgt_pool = mempool_create_kmalloc_pool(IBMVFC_TGT_MEMPOOL_SZ,
5059 						      sizeof(struct ibmvfc_target));
5060 
5061 	if (!vhost->tgt_pool) {
5062 		dev_err(dev, "Couldn't allocate target memory pool\n");
5063 		goto free_trace;
5064 	}
5065 
5066 	LEAVE;
5067 	return 0;
5068 
5069 free_trace:
5070 	kfree(vhost->trace);
5071 free_disc_buffer:
5072 	dma_free_coherent(dev, vhost->disc_buf_sz, vhost->disc_buf,
5073 			  vhost->disc_buf_dma);
5074 free_login_buffer:
5075 	dma_free_coherent(dev, sizeof(*vhost->login_buf),
5076 			  vhost->login_buf, vhost->login_buf_dma);
5077 free_sg_pool:
5078 	dma_pool_destroy(vhost->sg_pool);
5079 unmap_async_crq:
5080 	dma_unmap_single(dev, async_q->msg_token,
5081 			 async_q->size * sizeof(*async_q->msgs), DMA_BIDIRECTIONAL);
5082 free_async_crq:
5083 	free_page((unsigned long)async_q->msgs);
5084 nomem:
5085 	LEAVE;
5086 	return -ENOMEM;
5087 }
5088 
5089 /**
5090  * ibmvfc_rport_add_thread - Worker thread for rport adds
5091  * @work:	work struct
5092  *
5093  **/
5094 static void ibmvfc_rport_add_thread(struct work_struct *work)
5095 {
5096 	struct ibmvfc_host *vhost = container_of(work, struct ibmvfc_host,
5097 						 rport_add_work_q);
5098 	struct ibmvfc_target *tgt;
5099 	struct fc_rport *rport;
5100 	unsigned long flags;
5101 	int did_work;
5102 
5103 	ENTER;
5104 	spin_lock_irqsave(vhost->host->host_lock, flags);
5105 	do {
5106 		did_work = 0;
5107 		if (vhost->state != IBMVFC_ACTIVE)
5108 			break;
5109 
5110 		list_for_each_entry(tgt, &vhost->targets, queue) {
5111 			if (tgt->add_rport) {
5112 				did_work = 1;
5113 				tgt->add_rport = 0;
5114 				kref_get(&tgt->kref);
5115 				rport = tgt->rport;
5116 				if (!rport) {
5117 					spin_unlock_irqrestore(vhost->host->host_lock, flags);
5118 					ibmvfc_tgt_add_rport(tgt);
5119 				} else if (get_device(&rport->dev)) {
5120 					spin_unlock_irqrestore(vhost->host->host_lock, flags);
5121 					tgt_dbg(tgt, "Setting rport roles\n");
5122 					fc_remote_port_rolechg(rport, tgt->ids.roles);
5123 					put_device(&rport->dev);
5124 				} else {
5125 					spin_unlock_irqrestore(vhost->host->host_lock, flags);
5126 				}
5127 
5128 				kref_put(&tgt->kref, ibmvfc_release_tgt);
5129 				spin_lock_irqsave(vhost->host->host_lock, flags);
5130 				break;
5131 			}
5132 		}
5133 	} while(did_work);
5134 
5135 	if (vhost->state == IBMVFC_ACTIVE)
5136 		vhost->scan_complete = 1;
5137 	spin_unlock_irqrestore(vhost->host->host_lock, flags);
5138 	LEAVE;
5139 }
5140 
5141 /**
5142  * ibmvfc_probe - Adapter hot plug add entry point
5143  * @vdev:	vio device struct
5144  * @id:	vio device id struct
5145  *
5146  * Return value:
5147  * 	0 on success / non-zero on failure
5148  **/
5149 static int ibmvfc_probe(struct vio_dev *vdev, const struct vio_device_id *id)
5150 {
5151 	struct ibmvfc_host *vhost;
5152 	struct Scsi_Host *shost;
5153 	struct device *dev = &vdev->dev;
5154 	int rc = -ENOMEM;
5155 
5156 	ENTER;
5157 	shost = scsi_host_alloc(&driver_template, sizeof(*vhost));
5158 	if (!shost) {
5159 		dev_err(dev, "Couldn't allocate host data\n");
5160 		goto out;
5161 	}
5162 
5163 	shost->transportt = ibmvfc_transport_template;
5164 	shost->can_queue = max_requests;
5165 	shost->max_lun = max_lun;
5166 	shost->max_id = max_targets;
5167 	shost->max_sectors = IBMVFC_MAX_SECTORS;
5168 	shost->max_cmd_len = IBMVFC_MAX_CDB_LEN;
5169 	shost->unique_id = shost->host_no;
5170 
5171 	vhost = shost_priv(shost);
5172 	INIT_LIST_HEAD(&vhost->sent);
5173 	INIT_LIST_HEAD(&vhost->free);
5174 	INIT_LIST_HEAD(&vhost->targets);
5175 	sprintf(vhost->name, IBMVFC_NAME);
5176 	vhost->host = shost;
5177 	vhost->dev = dev;
5178 	vhost->partition_number = -1;
5179 	vhost->log_level = log_level;
5180 	vhost->task_set = 1;
5181 	strcpy(vhost->partition_name, "UNKNOWN");
5182 	init_waitqueue_head(&vhost->work_wait_q);
5183 	init_waitqueue_head(&vhost->init_wait_q);
5184 	INIT_WORK(&vhost->rport_add_work_q, ibmvfc_rport_add_thread);
5185 	mutex_init(&vhost->passthru_mutex);
5186 
5187 	if ((rc = ibmvfc_alloc_mem(vhost)))
5188 		goto free_scsi_host;
5189 
5190 	vhost->work_thread = kthread_run(ibmvfc_work, vhost, "%s_%d", IBMVFC_NAME,
5191 					 shost->host_no);
5192 
5193 	if (IS_ERR(vhost->work_thread)) {
5194 		dev_err(dev, "Couldn't create kernel thread: %ld\n",
5195 			PTR_ERR(vhost->work_thread));
5196 		rc = PTR_ERR(vhost->work_thread);
5197 		goto free_host_mem;
5198 	}
5199 
5200 	if ((rc = ibmvfc_init_crq(vhost))) {
5201 		dev_err(dev, "Couldn't initialize crq. rc=%d\n", rc);
5202 		goto kill_kthread;
5203 	}
5204 
5205 	if ((rc = ibmvfc_init_event_pool(vhost))) {
5206 		dev_err(dev, "Couldn't initialize event pool. rc=%d\n", rc);
5207 		goto release_crq;
5208 	}
5209 
5210 	if ((rc = scsi_add_host(shost, dev)))
5211 		goto release_event_pool;
5212 
5213 	fc_host_dev_loss_tmo(shost) = IBMVFC_DEV_LOSS_TMO;
5214 
5215 	if ((rc = ibmvfc_create_trace_file(&shost->shost_dev.kobj,
5216 					   &ibmvfc_trace_attr))) {
5217 		dev_err(dev, "Failed to create trace file. rc=%d\n", rc);
5218 		goto remove_shost;
5219 	}
5220 
5221 	if (shost_to_fc_host(shost)->rqst_q)
5222 		blk_queue_max_segments(shost_to_fc_host(shost)->rqst_q, 1);
5223 	dev_set_drvdata(dev, vhost);
5224 	spin_lock(&ibmvfc_driver_lock);
5225 	list_add_tail(&vhost->queue, &ibmvfc_head);
5226 	spin_unlock(&ibmvfc_driver_lock);
5227 
5228 	ibmvfc_send_crq_init(vhost);
5229 	scsi_scan_host(shost);
5230 	return 0;
5231 
5232 remove_shost:
5233 	scsi_remove_host(shost);
5234 release_event_pool:
5235 	ibmvfc_free_event_pool(vhost);
5236 release_crq:
5237 	ibmvfc_release_crq_queue(vhost);
5238 kill_kthread:
5239 	kthread_stop(vhost->work_thread);
5240 free_host_mem:
5241 	ibmvfc_free_mem(vhost);
5242 free_scsi_host:
5243 	scsi_host_put(shost);
5244 out:
5245 	LEAVE;
5246 	return rc;
5247 }
5248 
5249 /**
5250  * ibmvfc_remove - Adapter hot plug remove entry point
5251  * @vdev:	vio device struct
5252  *
5253  * Return value:
5254  * 	0
5255  **/
5256 static int ibmvfc_remove(struct vio_dev *vdev)
5257 {
5258 	struct ibmvfc_host *vhost = dev_get_drvdata(&vdev->dev);
5259 	unsigned long flags;
5260 
5261 	ENTER;
5262 	ibmvfc_remove_trace_file(&vhost->host->shost_dev.kobj, &ibmvfc_trace_attr);
5263 
5264 	spin_lock_irqsave(vhost->host->host_lock, flags);
5265 	ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE);
5266 	spin_unlock_irqrestore(vhost->host->host_lock, flags);
5267 
5268 	ibmvfc_wait_while_resetting(vhost);
5269 	ibmvfc_release_crq_queue(vhost);
5270 	kthread_stop(vhost->work_thread);
5271 	fc_remove_host(vhost->host);
5272 	scsi_remove_host(vhost->host);
5273 
5274 	spin_lock_irqsave(vhost->host->host_lock, flags);
5275 	ibmvfc_purge_requests(vhost, DID_ERROR);
5276 	spin_unlock_irqrestore(vhost->host->host_lock, flags);
5277 	ibmvfc_free_event_pool(vhost);
5278 
5279 	ibmvfc_free_mem(vhost);
5280 	spin_lock(&ibmvfc_driver_lock);
5281 	list_del(&vhost->queue);
5282 	spin_unlock(&ibmvfc_driver_lock);
5283 	scsi_host_put(vhost->host);
5284 	LEAVE;
5285 	return 0;
5286 }
5287 
5288 /**
5289  * ibmvfc_resume - Resume from suspend
5290  * @dev:	device struct
5291  *
5292  * We may have lost an interrupt across suspend/resume, so kick the
5293  * interrupt handler
5294  *
5295  */
5296 static int ibmvfc_resume(struct device *dev)
5297 {
5298 	unsigned long flags;
5299 	struct ibmvfc_host *vhost = dev_get_drvdata(dev);
5300 	struct vio_dev *vdev = to_vio_dev(dev);
5301 
5302 	spin_lock_irqsave(vhost->host->host_lock, flags);
5303 	vio_disable_interrupts(vdev);
5304 	tasklet_schedule(&vhost->tasklet);
5305 	spin_unlock_irqrestore(vhost->host->host_lock, flags);
5306 	return 0;
5307 }
5308 
5309 /**
5310  * ibmvfc_get_desired_dma - Calculate DMA resources needed by the driver
5311  * @vdev:	vio device struct
5312  *
5313  * Return value:
5314  *	Number of bytes the driver will need to DMA map at the same time in
5315  *	order to perform well.
5316  */
5317 static unsigned long ibmvfc_get_desired_dma(struct vio_dev *vdev)
5318 {
5319 	unsigned long pool_dma = max_requests * sizeof(union ibmvfc_iu);
5320 	return pool_dma + ((512 * 1024) * driver_template.cmd_per_lun);
5321 }
5322 
5323 static const struct vio_device_id ibmvfc_device_table[] = {
5324 	{"fcp", "IBM,vfc-client"},
5325 	{ "", "" }
5326 };
5327 MODULE_DEVICE_TABLE(vio, ibmvfc_device_table);
5328 
5329 static const struct dev_pm_ops ibmvfc_pm_ops = {
5330 	.resume = ibmvfc_resume
5331 };
5332 
5333 static struct vio_driver ibmvfc_driver = {
5334 	.id_table = ibmvfc_device_table,
5335 	.probe = ibmvfc_probe,
5336 	.remove = ibmvfc_remove,
5337 	.get_desired_dma = ibmvfc_get_desired_dma,
5338 	.name = IBMVFC_NAME,
5339 	.pm = &ibmvfc_pm_ops,
5340 };
5341 
5342 static struct fc_function_template ibmvfc_transport_functions = {
5343 	.show_host_fabric_name = 1,
5344 	.show_host_node_name = 1,
5345 	.show_host_port_name = 1,
5346 	.show_host_supported_classes = 1,
5347 	.show_host_port_type = 1,
5348 	.show_host_port_id = 1,
5349 	.show_host_maxframe_size = 1,
5350 
5351 	.get_host_port_state = ibmvfc_get_host_port_state,
5352 	.show_host_port_state = 1,
5353 
5354 	.get_host_speed = ibmvfc_get_host_speed,
5355 	.show_host_speed = 1,
5356 
5357 	.issue_fc_host_lip = ibmvfc_issue_fc_host_lip,
5358 	.terminate_rport_io = ibmvfc_terminate_rport_io,
5359 
5360 	.show_rport_maxframe_size = 1,
5361 	.show_rport_supported_classes = 1,
5362 
5363 	.set_rport_dev_loss_tmo = ibmvfc_set_rport_dev_loss_tmo,
5364 	.show_rport_dev_loss_tmo = 1,
5365 
5366 	.get_starget_node_name = ibmvfc_get_starget_node_name,
5367 	.show_starget_node_name = 1,
5368 
5369 	.get_starget_port_name = ibmvfc_get_starget_port_name,
5370 	.show_starget_port_name = 1,
5371 
5372 	.get_starget_port_id = ibmvfc_get_starget_port_id,
5373 	.show_starget_port_id = 1,
5374 
5375 	.bsg_request = ibmvfc_bsg_request,
5376 	.bsg_timeout = ibmvfc_bsg_timeout,
5377 };
5378 
5379 /**
5380  * ibmvfc_module_init - Initialize the ibmvfc module
5381  *
5382  * Return value:
5383  * 	0 on success / other on failure
5384  **/
5385 static int __init ibmvfc_module_init(void)
5386 {
5387 	int rc;
5388 
5389 	if (!firmware_has_feature(FW_FEATURE_VIO))
5390 		return -ENODEV;
5391 
5392 	printk(KERN_INFO IBMVFC_NAME": IBM Virtual Fibre Channel Driver version: %s %s\n",
5393 	       IBMVFC_DRIVER_VERSION, IBMVFC_DRIVER_DATE);
5394 
5395 	ibmvfc_transport_template = fc_attach_transport(&ibmvfc_transport_functions);
5396 	if (!ibmvfc_transport_template)
5397 		return -ENOMEM;
5398 
5399 	rc = vio_register_driver(&ibmvfc_driver);
5400 	if (rc)
5401 		fc_release_transport(ibmvfc_transport_template);
5402 	return rc;
5403 }
5404 
5405 /**
5406  * ibmvfc_module_exit - Teardown the ibmvfc module
5407  *
5408  * Return value:
5409  * 	nothing
5410  **/
5411 static void __exit ibmvfc_module_exit(void)
5412 {
5413 	vio_unregister_driver(&ibmvfc_driver);
5414 	fc_release_transport(ibmvfc_transport_template);
5415 }
5416 
5417 module_init(ibmvfc_module_init);
5418 module_exit(ibmvfc_module_exit);
5419