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