]> bbs.cooldavid.org Git - net-next-2.6.git/blob - drivers/scsi/ibmvscsi/ibmvfc.c
6ecc0ddd4440e88a1ed5c207bf8e2c60f73b76a4
[net-next-2.6.git] / drivers / scsi / ibmvscsi / ibmvfc.c
1 /*
2  * ibmvfc.c -- driver for IBM Power Virtual Fibre Channel Adapter
3  *
4  * Written By: Brian King <brking@linux.vnet.ibm.com>, IBM Corporation
5  *
6  * Copyright (C) IBM Corporation, 2008
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21  *
22  */
23
24 #include <linux/module.h>
25 #include <linux/moduleparam.h>
26 #include <linux/dma-mapping.h>
27 #include <linux/dmapool.h>
28 #include <linux/delay.h>
29 #include <linux/interrupt.h>
30 #include <linux/kthread.h>
31 #include <linux/of.h>
32 #include <linux/stringify.h>
33 #include <asm/firmware.h>
34 #include <asm/irq.h>
35 #include <asm/vio.h>
36 #include <scsi/scsi.h>
37 #include <scsi/scsi_cmnd.h>
38 #include <scsi/scsi_host.h>
39 #include <scsi/scsi_device.h>
40 #include <scsi/scsi_tcq.h>
41 #include <scsi/scsi_transport_fc.h>
42 #include "ibmvfc.h"
43
44 static unsigned int init_timeout = IBMVFC_INIT_TIMEOUT;
45 static unsigned int default_timeout = IBMVFC_DEFAULT_TIMEOUT;
46 static unsigned int max_lun = IBMVFC_MAX_LUN;
47 static unsigned int max_targets = IBMVFC_MAX_TARGETS;
48 static unsigned int max_requests = IBMVFC_MAX_REQUESTS_DEFAULT;
49 static unsigned int disc_threads = IBMVFC_MAX_DISC_THREADS;
50 static unsigned int dev_loss_tmo = IBMVFC_DEV_LOSS_TMO;
51 static unsigned int ibmvfc_debug = IBMVFC_DEBUG;
52 static unsigned int log_level = IBMVFC_DEFAULT_LOG_LEVEL;
53 static LIST_HEAD(ibmvfc_head);
54 static DEFINE_SPINLOCK(ibmvfc_driver_lock);
55 static struct scsi_transport_template *ibmvfc_transport_template;
56
57 MODULE_DESCRIPTION("IBM Virtual Fibre Channel Driver");
58 MODULE_AUTHOR("Brian King <brking@linux.vnet.ibm.com>");
59 MODULE_LICENSE("GPL");
60 MODULE_VERSION(IBMVFC_DRIVER_VERSION);
61
62 module_param_named(init_timeout, init_timeout, uint, S_IRUGO | S_IWUSR);
63 MODULE_PARM_DESC(init_timeout, "Initialization timeout in seconds. "
64                  "[Default=" __stringify(IBMVFC_INIT_TIMEOUT) "]");
65 module_param_named(default_timeout, default_timeout, uint, S_IRUGO | S_IWUSR);
66 MODULE_PARM_DESC(default_timeout,
67                  "Default timeout in seconds for initialization and EH commands. "
68                  "[Default=" __stringify(IBMVFC_DEFAULT_TIMEOUT) "]");
69 module_param_named(max_requests, max_requests, uint, S_IRUGO);
70 MODULE_PARM_DESC(max_requests, "Maximum requests for this adapter. "
71                  "[Default=" __stringify(IBMVFC_MAX_REQUESTS_DEFAULT) "]");
72 module_param_named(max_lun, max_lun, uint, S_IRUGO);
73 MODULE_PARM_DESC(max_lun, "Maximum allowed LUN. "
74                  "[Default=" __stringify(IBMVFC_MAX_LUN) "]");
75 module_param_named(max_targets, max_targets, uint, S_IRUGO);
76 MODULE_PARM_DESC(max_targets, "Maximum allowed targets. "
77                  "[Default=" __stringify(IBMVFC_MAX_TARGETS) "]");
78 module_param_named(disc_threads, disc_threads, uint, S_IRUGO | S_IWUSR);
79 MODULE_PARM_DESC(disc_threads, "Number of device discovery threads to use. "
80                  "[Default=" __stringify(IBMVFC_MAX_DISC_THREADS) "]");
81 module_param_named(debug, ibmvfc_debug, uint, S_IRUGO | S_IWUSR);
82 MODULE_PARM_DESC(debug, "Enable driver debug information. "
83                  "[Default=" __stringify(IBMVFC_DEBUG) "]");
84 module_param_named(dev_loss_tmo, dev_loss_tmo, uint, S_IRUGO | S_IWUSR);
85 MODULE_PARM_DESC(dev_loss_tmo, "Maximum number of seconds that the FC "
86                  "transport should insulate the loss of a remote port. Once this "
87                  "value is exceeded, the scsi target is removed. "
88                  "[Default=" __stringify(IBMVFC_DEV_LOSS_TMO) "]");
89 module_param_named(log_level, log_level, uint, 0);
90 MODULE_PARM_DESC(log_level, "Set to 0 - 4 for increasing verbosity of device driver. "
91                  "[Default=" __stringify(IBMVFC_DEFAULT_LOG_LEVEL) "]");
92
93 static const struct {
94         u16 status;
95         u16 error;
96         u8 result;
97         u8 retry;
98         int log;
99         char *name;
100 } cmd_status [] = {
101         { IBMVFC_FABRIC_MAPPED, IBMVFC_UNABLE_TO_ESTABLISH, DID_ERROR, 1, 1, "unable to establish" },
102         { IBMVFC_FABRIC_MAPPED, IBMVFC_XPORT_FAULT, DID_OK, 1, 0, "transport fault" },
103         { IBMVFC_FABRIC_MAPPED, IBMVFC_CMD_TIMEOUT, DID_TIME_OUT, 1, 1, "command timeout" },
104         { IBMVFC_FABRIC_MAPPED, IBMVFC_ENETDOWN, DID_NO_CONNECT, 1, 1, "network down" },
105         { IBMVFC_FABRIC_MAPPED, IBMVFC_HW_FAILURE, DID_ERROR, 1, 1, "hardware failure" },
106         { IBMVFC_FABRIC_MAPPED, IBMVFC_LINK_DOWN_ERR, DID_REQUEUE, 0, 0, "link down" },
107         { IBMVFC_FABRIC_MAPPED, IBMVFC_LINK_DEAD_ERR, DID_ERROR, 0, 0, "link dead" },
108         { IBMVFC_FABRIC_MAPPED, IBMVFC_UNABLE_TO_REGISTER, DID_ERROR, 1, 1, "unable to register" },
109         { IBMVFC_FABRIC_MAPPED, IBMVFC_XPORT_BUSY, DID_BUS_BUSY, 1, 0, "transport busy" },
110         { IBMVFC_FABRIC_MAPPED, IBMVFC_XPORT_DEAD, DID_ERROR, 0, 1, "transport dead" },
111         { IBMVFC_FABRIC_MAPPED, IBMVFC_CONFIG_ERROR, DID_ERROR, 1, 1, "configuration error" },
112         { IBMVFC_FABRIC_MAPPED, IBMVFC_NAME_SERVER_FAIL, DID_ERROR, 1, 1, "name server failure" },
113         { IBMVFC_FABRIC_MAPPED, IBMVFC_LINK_HALTED, DID_REQUEUE, 0, 0, "link halted" },
114         { IBMVFC_FABRIC_MAPPED, IBMVFC_XPORT_GENERAL, DID_OK, 1, 0, "general transport error" },
115
116         { IBMVFC_VIOS_FAILURE, IBMVFC_CRQ_FAILURE, DID_REQUEUE, 1, 1, "CRQ failure" },
117         { IBMVFC_VIOS_FAILURE, IBMVFC_SW_FAILURE, DID_ERROR, 0, 1, "software failure" },
118         { IBMVFC_VIOS_FAILURE, IBMVFC_INVALID_PARAMETER, DID_ABORT, 0, 1, "invalid parameter" },
119         { IBMVFC_VIOS_FAILURE, IBMVFC_MISSING_PARAMETER, DID_ABORT, 0, 1, "missing parameter" },
120         { IBMVFC_VIOS_FAILURE, IBMVFC_HOST_IO_BUS, DID_ERROR, 1, 1, "host I/O bus failure" },
121         { IBMVFC_VIOS_FAILURE, IBMVFC_TRANS_CANCELLED, DID_ABORT, 0, 1, "transaction cancelled" },
122         { IBMVFC_VIOS_FAILURE, IBMVFC_TRANS_CANCELLED_IMPLICIT, DID_ABORT, 0, 1, "transaction cancelled implicit" },
123         { IBMVFC_VIOS_FAILURE, IBMVFC_INSUFFICIENT_RESOURCE, DID_REQUEUE, 1, 1, "insufficient resources" },
124         { IBMVFC_VIOS_FAILURE, IBMVFC_COMMAND_FAILED, DID_ERROR, 1, 1, "command failed" },
125
126         { IBMVFC_FC_FAILURE, IBMVFC_INVALID_ELS_CMD_CODE, DID_ERROR, 0, 1, "invalid ELS command code" },
127         { IBMVFC_FC_FAILURE, IBMVFC_INVALID_VERSION, DID_ERROR, 0, 1, "invalid version level" },
128         { IBMVFC_FC_FAILURE, IBMVFC_LOGICAL_ERROR, DID_ERROR, 1, 1, "logical error" },
129         { IBMVFC_FC_FAILURE, IBMVFC_INVALID_CT_IU_SIZE, DID_ERROR, 0, 1, "invalid CT_IU size" },
130         { IBMVFC_FC_FAILURE, IBMVFC_LOGICAL_BUSY, DID_REQUEUE, 1, 0, "logical busy" },
131         { IBMVFC_FC_FAILURE, IBMVFC_PROTOCOL_ERROR, DID_ERROR, 1, 1, "protocol error" },
132         { IBMVFC_FC_FAILURE, IBMVFC_UNABLE_TO_PERFORM_REQ, DID_ERROR, 1, 1, "unable to perform request" },
133         { IBMVFC_FC_FAILURE, IBMVFC_CMD_NOT_SUPPORTED, DID_ERROR, 0, 0, "command not supported" },
134         { IBMVFC_FC_FAILURE, IBMVFC_SERVER_NOT_AVAIL, DID_ERROR, 0, 1, "server not available" },
135         { IBMVFC_FC_FAILURE, IBMVFC_CMD_IN_PROGRESS, DID_ERROR, 0, 1, "command already in progress" },
136         { IBMVFC_FC_FAILURE, IBMVFC_VENDOR_SPECIFIC, DID_ERROR, 1, 1, "vendor specific" },
137
138         { IBMVFC_FC_SCSI_ERROR, 0, DID_OK, 1, 0, "SCSI error" },
139 };
140
141 static void ibmvfc_npiv_login(struct ibmvfc_host *);
142 static void ibmvfc_tgt_send_prli(struct ibmvfc_target *);
143 static void ibmvfc_tgt_send_plogi(struct ibmvfc_target *);
144 static void ibmvfc_tgt_query_target(struct ibmvfc_target *);
145
146 static const char *unknown_error = "unknown error";
147
148 #ifdef CONFIG_SCSI_IBMVFC_TRACE
149 /**
150  * ibmvfc_trc_start - Log a start trace entry
151  * @evt:                ibmvfc event struct
152  *
153  **/
154 static void ibmvfc_trc_start(struct ibmvfc_event *evt)
155 {
156         struct ibmvfc_host *vhost = evt->vhost;
157         struct ibmvfc_cmd *vfc_cmd = &evt->iu.cmd;
158         struct ibmvfc_mad_common *mad = &evt->iu.mad_common;
159         struct ibmvfc_trace_entry *entry;
160
161         entry = &vhost->trace[vhost->trace_index++];
162         entry->evt = evt;
163         entry->time = jiffies;
164         entry->fmt = evt->crq.format;
165         entry->type = IBMVFC_TRC_START;
166
167         switch (entry->fmt) {
168         case IBMVFC_CMD_FORMAT:
169                 entry->op_code = vfc_cmd->iu.cdb[0];
170                 entry->scsi_id = vfc_cmd->tgt_scsi_id;
171                 entry->lun = scsilun_to_int(&vfc_cmd->iu.lun);
172                 entry->tmf_flags = vfc_cmd->iu.tmf_flags;
173                 entry->u.start.xfer_len = vfc_cmd->iu.xfer_len;
174                 break;
175         case IBMVFC_MAD_FORMAT:
176                 entry->op_code = mad->opcode;
177                 break;
178         default:
179                 break;
180         };
181 }
182
183 /**
184  * ibmvfc_trc_end - Log an end trace entry
185  * @evt:                ibmvfc event struct
186  *
187  **/
188 static void ibmvfc_trc_end(struct ibmvfc_event *evt)
189 {
190         struct ibmvfc_host *vhost = evt->vhost;
191         struct ibmvfc_cmd *vfc_cmd = &evt->xfer_iu->cmd;
192         struct ibmvfc_mad_common *mad = &evt->xfer_iu->mad_common;
193         struct ibmvfc_trace_entry *entry = &vhost->trace[vhost->trace_index++];
194
195         entry->evt = evt;
196         entry->time = jiffies;
197         entry->fmt = evt->crq.format;
198         entry->type = IBMVFC_TRC_END;
199
200         switch (entry->fmt) {
201         case IBMVFC_CMD_FORMAT:
202                 entry->op_code = vfc_cmd->iu.cdb[0];
203                 entry->scsi_id = vfc_cmd->tgt_scsi_id;
204                 entry->lun = scsilun_to_int(&vfc_cmd->iu.lun);
205                 entry->tmf_flags = vfc_cmd->iu.tmf_flags;
206                 entry->u.end.status = vfc_cmd->status;
207                 entry->u.end.error = vfc_cmd->error;
208                 entry->u.end.fcp_rsp_flags = vfc_cmd->rsp.flags;
209                 entry->u.end.rsp_code = vfc_cmd->rsp.data.info.rsp_code;
210                 entry->u.end.scsi_status = vfc_cmd->rsp.scsi_status;
211                 break;
212         case IBMVFC_MAD_FORMAT:
213                 entry->op_code = mad->opcode;
214                 entry->u.end.status = mad->status;
215                 break;
216         default:
217                 break;
218
219         };
220 }
221
222 #else
223 #define ibmvfc_trc_start(evt) do { } while (0)
224 #define ibmvfc_trc_end(evt) do { } while (0)
225 #endif
226
227 /**
228  * ibmvfc_get_err_index - Find the index into cmd_status for the fcp response
229  * @status:             status / error class
230  * @error:              error
231  *
232  * Return value:
233  *      index into cmd_status / -EINVAL on failure
234  **/
235 static int ibmvfc_get_err_index(u16 status, u16 error)
236 {
237         int i;
238
239         for (i = 0; i < ARRAY_SIZE(cmd_status); i++)
240                 if ((cmd_status[i].status & status) == cmd_status[i].status &&
241                     cmd_status[i].error == error)
242                         return i;
243
244         return -EINVAL;
245 }
246
247 /**
248  * ibmvfc_get_cmd_error - Find the error description for the fcp response
249  * @status:             status / error class
250  * @error:              error
251  *
252  * Return value:
253  *      error description string
254  **/
255 static const char *ibmvfc_get_cmd_error(u16 status, u16 error)
256 {
257         int rc = ibmvfc_get_err_index(status, error);
258         if (rc >= 0)
259                 return cmd_status[rc].name;
260         return unknown_error;
261 }
262
263 /**
264  * ibmvfc_get_err_result - Find the scsi status to return for the fcp response
265  * @vfc_cmd:    ibmvfc command struct
266  *
267  * Return value:
268  *      SCSI result value to return for completed command
269  **/
270 static int ibmvfc_get_err_result(struct ibmvfc_cmd *vfc_cmd)
271 {
272         int err;
273         struct ibmvfc_fcp_rsp *rsp = &vfc_cmd->rsp;
274         int fc_rsp_len = rsp->fcp_rsp_len;
275
276         if ((rsp->flags & FCP_RSP_LEN_VALID) &&
277             ((!fc_rsp_len && fc_rsp_len != 4 && fc_rsp_len != 8) ||
278              rsp->data.info.rsp_code))
279                 return DID_ERROR << 16;
280
281         if (!vfc_cmd->status) {
282                 if (rsp->flags & FCP_RESID_OVER)
283                         return rsp->scsi_status | (DID_ERROR << 16);
284                 else
285                         return rsp->scsi_status | (DID_OK << 16);
286         }
287
288         err = ibmvfc_get_err_index(vfc_cmd->status, vfc_cmd->error);
289         if (err >= 0)
290                 return rsp->scsi_status | (cmd_status[err].result << 16);
291         return rsp->scsi_status | (DID_ERROR << 16);
292 }
293
294 /**
295  * ibmvfc_retry_cmd - Determine if error status is retryable
296  * @status:             status / error class
297  * @error:              error
298  *
299  * Return value:
300  *      1 if error should be retried / 0 if it should not
301  **/
302 static int ibmvfc_retry_cmd(u16 status, u16 error)
303 {
304         int rc = ibmvfc_get_err_index(status, error);
305
306         if (rc >= 0)
307                 return cmd_status[rc].retry;
308         return 1;
309 }
310
311 static const char *unknown_fc_explain = "unknown fc explain";
312
313 static const struct {
314         u16 fc_explain;
315         char *name;
316 } ls_explain [] = {
317         { 0x00, "no additional explanation" },
318         { 0x01, "service parameter error - options" },
319         { 0x03, "service parameter error - initiator control" },
320         { 0x05, "service parameter error - recipient control" },
321         { 0x07, "service parameter error - received data field size" },
322         { 0x09, "service parameter error - concurrent seq" },
323         { 0x0B, "service parameter error - credit" },
324         { 0x0D, "invalid N_Port/F_Port_Name" },
325         { 0x0E, "invalid node/Fabric Name" },
326         { 0x0F, "invalid common service parameters" },
327         { 0x11, "invalid association header" },
328         { 0x13, "association header required" },
329         { 0x15, "invalid originator S_ID" },
330         { 0x17, "invalid OX_ID-RX-ID combination" },
331         { 0x19, "command (request) already in progress" },
332         { 0x1E, "N_Port Login requested" },
333         { 0x1F, "Invalid N_Port_ID" },
334 };
335
336 static const struct {
337         u16 fc_explain;
338         char *name;
339 } gs_explain [] = {
340         { 0x00, "no additional explanation" },
341         { 0x01, "port identifier not registered" },
342         { 0x02, "port name not registered" },
343         { 0x03, "node name not registered" },
344         { 0x04, "class of service not registered" },
345         { 0x06, "initial process associator not registered" },
346         { 0x07, "FC-4 TYPEs not registered" },
347         { 0x08, "symbolic port name not registered" },
348         { 0x09, "symbolic node name not registered" },
349         { 0x0A, "port type not registered" },
350         { 0xF0, "authorization exception" },
351         { 0xF1, "authentication exception" },
352         { 0xF2, "data base full" },
353         { 0xF3, "data base empty" },
354         { 0xF4, "processing request" },
355         { 0xF5, "unable to verify connection" },
356         { 0xF6, "devices not in a common zone" },
357 };
358
359 /**
360  * ibmvfc_get_ls_explain - Return the FC Explain description text
361  * @status:     FC Explain status
362  *
363  * Returns:
364  *      error string
365  **/
366 static const char *ibmvfc_get_ls_explain(u16 status)
367 {
368         int i;
369
370         for (i = 0; i < ARRAY_SIZE(ls_explain); i++)
371                 if (ls_explain[i].fc_explain == status)
372                         return ls_explain[i].name;
373
374         return unknown_fc_explain;
375 }
376
377 /**
378  * ibmvfc_get_gs_explain - Return the FC Explain description text
379  * @status:     FC Explain status
380  *
381  * Returns:
382  *      error string
383  **/
384 static const char *ibmvfc_get_gs_explain(u16 status)
385 {
386         int i;
387
388         for (i = 0; i < ARRAY_SIZE(gs_explain); i++)
389                 if (gs_explain[i].fc_explain == status)
390                         return gs_explain[i].name;
391
392         return unknown_fc_explain;
393 }
394
395 static const struct {
396         enum ibmvfc_fc_type fc_type;
397         char *name;
398 } fc_type [] = {
399         { IBMVFC_FABRIC_REJECT, "fabric reject" },
400         { IBMVFC_PORT_REJECT, "port reject" },
401         { IBMVFC_LS_REJECT, "ELS reject" },
402         { IBMVFC_FABRIC_BUSY, "fabric busy" },
403         { IBMVFC_PORT_BUSY, "port busy" },
404         { IBMVFC_BASIC_REJECT, "basic reject" },
405 };
406
407 static const char *unknown_fc_type = "unknown fc type";
408
409 /**
410  * ibmvfc_get_fc_type - Return the FC Type description text
411  * @status:     FC Type error status
412  *
413  * Returns:
414  *      error string
415  **/
416 static const char *ibmvfc_get_fc_type(u16 status)
417 {
418         int i;
419
420         for (i = 0; i < ARRAY_SIZE(fc_type); i++)
421                 if (fc_type[i].fc_type == status)
422                         return fc_type[i].name;
423
424         return unknown_fc_type;
425 }
426
427 /**
428  * ibmvfc_set_tgt_action - Set the next init action for the target
429  * @tgt:                ibmvfc target struct
430  * @action:             action to perform
431  *
432  **/
433 static void ibmvfc_set_tgt_action(struct ibmvfc_target *tgt,
434                                   enum ibmvfc_target_action action)
435 {
436         switch (tgt->action) {
437         case IBMVFC_TGT_ACTION_DEL_RPORT:
438                 break;
439         default:
440                 tgt->action = action;
441                 break;
442         }
443 }
444
445 /**
446  * ibmvfc_set_host_state - Set the state for the host
447  * @vhost:              ibmvfc host struct
448  * @state:              state to set host to
449  *
450  * Returns:
451  *      0 if state changed / non-zero if not changed
452  **/
453 static int ibmvfc_set_host_state(struct ibmvfc_host *vhost,
454                                   enum ibmvfc_host_state state)
455 {
456         int rc = 0;
457
458         switch (vhost->state) {
459         case IBMVFC_HOST_OFFLINE:
460                 rc = -EINVAL;
461                 break;
462         default:
463                 vhost->state = state;
464                 break;
465         };
466
467         return rc;
468 }
469
470 /**
471  * ibmvfc_set_host_action - Set the next init action for the host
472  * @vhost:              ibmvfc host struct
473  * @action:             action to perform
474  *
475  **/
476 static void ibmvfc_set_host_action(struct ibmvfc_host *vhost,
477                                    enum ibmvfc_host_action action)
478 {
479         switch (action) {
480         case IBMVFC_HOST_ACTION_ALLOC_TGTS:
481                 if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT)
482                         vhost->action = action;
483                 break;
484         case IBMVFC_HOST_ACTION_INIT_WAIT:
485                 if (vhost->action == IBMVFC_HOST_ACTION_INIT)
486                         vhost->action = action;
487                 break;
488         case IBMVFC_HOST_ACTION_QUERY:
489                 switch (vhost->action) {
490                 case IBMVFC_HOST_ACTION_INIT_WAIT:
491                 case IBMVFC_HOST_ACTION_NONE:
492                 case IBMVFC_HOST_ACTION_TGT_ADD:
493                         vhost->action = action;
494                         break;
495                 default:
496                         break;
497                 };
498                 break;
499         case IBMVFC_HOST_ACTION_TGT_INIT:
500                 if (vhost->action == IBMVFC_HOST_ACTION_ALLOC_TGTS)
501                         vhost->action = action;
502                 break;
503         case IBMVFC_HOST_ACTION_INIT:
504         case IBMVFC_HOST_ACTION_TGT_DEL:
505         case IBMVFC_HOST_ACTION_QUERY_TGTS:
506         case IBMVFC_HOST_ACTION_TGT_ADD:
507         case IBMVFC_HOST_ACTION_NONE:
508         default:
509                 vhost->action = action;
510                 break;
511         };
512 }
513
514 /**
515  * ibmvfc_reinit_host - Re-start host initialization (no NPIV Login)
516  * @vhost:              ibmvfc host struct
517  *
518  * Return value:
519  *      nothing
520  **/
521 static void ibmvfc_reinit_host(struct ibmvfc_host *vhost)
522 {
523         if (vhost->action == IBMVFC_HOST_ACTION_NONE) {
524                 if (!ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) {
525                         scsi_block_requests(vhost->host);
526                         ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY);
527                 }
528         } else
529                 vhost->reinit = 1;
530
531         wake_up(&vhost->work_wait_q);
532 }
533
534 /**
535  * ibmvfc_link_down - Handle a link down event from the adapter
536  * @vhost:      ibmvfc host struct
537  * @state:      ibmvfc host state to enter
538  *
539  **/
540 static void ibmvfc_link_down(struct ibmvfc_host *vhost,
541                              enum ibmvfc_host_state state)
542 {
543         struct ibmvfc_target *tgt;
544
545         ENTER;
546         scsi_block_requests(vhost->host);
547         list_for_each_entry(tgt, &vhost->targets, queue)
548                 ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DEL_RPORT);
549         ibmvfc_set_host_state(vhost, state);
550         ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_DEL);
551         vhost->events_to_log |= IBMVFC_AE_LINKDOWN;
552         wake_up(&vhost->work_wait_q);
553         LEAVE;
554 }
555
556 /**
557  * ibmvfc_init_host - Start host initialization
558  * @vhost:              ibmvfc host struct
559  * @relogin:    is this a re-login?
560  *
561  * Return value:
562  *      nothing
563  **/
564 static void ibmvfc_init_host(struct ibmvfc_host *vhost, int relogin)
565 {
566         struct ibmvfc_target *tgt;
567
568         if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) {
569                 if (++vhost->init_retries > IBMVFC_MAX_INIT_RETRIES) {
570                         dev_err(vhost->dev,
571                                 "Host initialization retries exceeded. Taking adapter offline\n");
572                         ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE);
573                         return;
574                 }
575         }
576
577         if (!ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) {
578                 if (!relogin) {
579                         memset(vhost->async_crq.msgs, 0, PAGE_SIZE);
580                         vhost->async_crq.cur = 0;
581                 }
582
583                 list_for_each_entry(tgt, &vhost->targets, queue)
584                         tgt->need_login = 1;
585                 scsi_block_requests(vhost->host);
586                 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT);
587                 vhost->job_step = ibmvfc_npiv_login;
588                 wake_up(&vhost->work_wait_q);
589         }
590 }
591
592 /**
593  * ibmvfc_send_crq - Send a CRQ
594  * @vhost:      ibmvfc host struct
595  * @word1:      the first 64 bits of the data
596  * @word2:      the second 64 bits of the data
597  *
598  * Return value:
599  *      0 on success / other on failure
600  **/
601 static int ibmvfc_send_crq(struct ibmvfc_host *vhost, u64 word1, u64 word2)
602 {
603         struct vio_dev *vdev = to_vio_dev(vhost->dev);
604         return plpar_hcall_norets(H_SEND_CRQ, vdev->unit_address, word1, word2);
605 }
606
607 /**
608  * ibmvfc_send_crq_init - Send a CRQ init message
609  * @vhost:      ibmvfc host struct
610  *
611  * Return value:
612  *      0 on success / other on failure
613  **/
614 static int ibmvfc_send_crq_init(struct ibmvfc_host *vhost)
615 {
616         ibmvfc_dbg(vhost, "Sending CRQ init\n");
617         return ibmvfc_send_crq(vhost, 0xC001000000000000LL, 0);
618 }
619
620 /**
621  * ibmvfc_send_crq_init_complete - Send a CRQ init complete message
622  * @vhost:      ibmvfc host struct
623  *
624  * Return value:
625  *      0 on success / other on failure
626  **/
627 static int ibmvfc_send_crq_init_complete(struct ibmvfc_host *vhost)
628 {
629         ibmvfc_dbg(vhost, "Sending CRQ init complete\n");
630         return ibmvfc_send_crq(vhost, 0xC002000000000000LL, 0);
631 }
632
633 /**
634  * ibmvfc_release_crq_queue - Deallocates data and unregisters CRQ
635  * @vhost:      ibmvfc host struct
636  *
637  * Frees irq, deallocates a page for messages, unmaps dma, and unregisters
638  * the crq with the hypervisor.
639  **/
640 static void ibmvfc_release_crq_queue(struct ibmvfc_host *vhost)
641 {
642         long rc;
643         struct vio_dev *vdev = to_vio_dev(vhost->dev);
644         struct ibmvfc_crq_queue *crq = &vhost->crq;
645
646         ibmvfc_dbg(vhost, "Releasing CRQ\n");
647         free_irq(vdev->irq, vhost);
648         do {
649                 rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address);
650         } while (rc == H_BUSY || H_IS_LONG_BUSY(rc));
651
652         vhost->state = IBMVFC_NO_CRQ;
653         dma_unmap_single(vhost->dev, crq->msg_token, PAGE_SIZE, DMA_BIDIRECTIONAL);
654         free_page((unsigned long)crq->msgs);
655 }
656
657 /**
658  * ibmvfc_reenable_crq_queue - reenables the CRQ
659  * @vhost:      ibmvfc host struct
660  *
661  * Return value:
662  *      0 on success / other on failure
663  **/
664 static int ibmvfc_reenable_crq_queue(struct ibmvfc_host *vhost)
665 {
666         int rc;
667         struct vio_dev *vdev = to_vio_dev(vhost->dev);
668
669         /* Re-enable the CRQ */
670         do {
671                 rc = plpar_hcall_norets(H_ENABLE_CRQ, vdev->unit_address);
672         } while (rc == H_IN_PROGRESS || rc == H_BUSY || H_IS_LONG_BUSY(rc));
673
674         if (rc)
675                 dev_err(vhost->dev, "Error enabling adapter (rc=%d)\n", rc);
676
677         return rc;
678 }
679
680 /**
681  * ibmvfc_reset_crq - resets a crq after a failure
682  * @vhost:      ibmvfc host struct
683  *
684  * Return value:
685  *      0 on success / other on failure
686  **/
687 static int ibmvfc_reset_crq(struct ibmvfc_host *vhost)
688 {
689         int rc;
690         struct vio_dev *vdev = to_vio_dev(vhost->dev);
691         struct ibmvfc_crq_queue *crq = &vhost->crq;
692
693         /* Close the CRQ */
694         do {
695                 rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address);
696         } while (rc == H_BUSY || H_IS_LONG_BUSY(rc));
697
698         vhost->state = IBMVFC_NO_CRQ;
699         ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE);
700
701         /* Clean out the queue */
702         memset(crq->msgs, 0, PAGE_SIZE);
703         crq->cur = 0;
704
705         /* And re-open it again */
706         rc = plpar_hcall_norets(H_REG_CRQ, vdev->unit_address,
707                                 crq->msg_token, PAGE_SIZE);
708
709         if (rc == H_CLOSED)
710                 /* Adapter is good, but other end is not ready */
711                 dev_warn(vhost->dev, "Partner adapter not ready\n");
712         else if (rc != 0)
713                 dev_warn(vhost->dev, "Couldn't register crq (rc=%d)\n", rc);
714
715         return rc;
716 }
717
718 /**
719  * ibmvfc_valid_event - Determines if event is valid.
720  * @pool:       event_pool that contains the event
721  * @evt:        ibmvfc event to be checked for validity
722  *
723  * Return value:
724  *      1 if event is valid / 0 if event is not valid
725  **/
726 static int ibmvfc_valid_event(struct ibmvfc_event_pool *pool,
727                               struct ibmvfc_event *evt)
728 {
729         int index = evt - pool->events;
730         if (index < 0 || index >= pool->size)   /* outside of bounds */
731                 return 0;
732         if (evt != pool->events + index)        /* unaligned */
733                 return 0;
734         return 1;
735 }
736
737 /**
738  * ibmvfc_free_event - Free the specified event
739  * @evt:        ibmvfc_event to be freed
740  *
741  **/
742 static void ibmvfc_free_event(struct ibmvfc_event *evt)
743 {
744         struct ibmvfc_host *vhost = evt->vhost;
745         struct ibmvfc_event_pool *pool = &vhost->pool;
746
747         BUG_ON(!ibmvfc_valid_event(pool, evt));
748         BUG_ON(atomic_inc_return(&evt->free) != 1);
749         list_add_tail(&evt->queue, &vhost->free);
750 }
751
752 /**
753  * ibmvfc_scsi_eh_done - EH done function for queuecommand commands
754  * @evt:        ibmvfc event struct
755  *
756  * This function does not setup any error status, that must be done
757  * before this function gets called.
758  **/
759 static void ibmvfc_scsi_eh_done(struct ibmvfc_event *evt)
760 {
761         struct scsi_cmnd *cmnd = evt->cmnd;
762
763         if (cmnd) {
764                 scsi_dma_unmap(cmnd);
765                 cmnd->scsi_done(cmnd);
766         }
767
768         ibmvfc_free_event(evt);
769 }
770
771 /**
772  * ibmvfc_fail_request - Fail request with specified error code
773  * @evt:                ibmvfc event struct
774  * @error_code: error code to fail request with
775  *
776  * Return value:
777  *      none
778  **/
779 static void ibmvfc_fail_request(struct ibmvfc_event *evt, int error_code)
780 {
781         if (evt->cmnd) {
782                 evt->cmnd->result = (error_code << 16);
783                 evt->done = ibmvfc_scsi_eh_done;
784         } else
785                 evt->xfer_iu->mad_common.status = IBMVFC_MAD_DRIVER_FAILED;
786
787         list_del(&evt->queue);
788         del_timer(&evt->timer);
789         ibmvfc_trc_end(evt);
790         evt->done(evt);
791 }
792
793 /**
794  * ibmvfc_purge_requests - Our virtual adapter just shut down. Purge any sent requests
795  * @vhost:              ibmvfc host struct
796  * @error_code: error code to fail requests with
797  *
798  * Return value:
799  *      none
800  **/
801 static void ibmvfc_purge_requests(struct ibmvfc_host *vhost, int error_code)
802 {
803         struct ibmvfc_event *evt, *pos;
804
805         ibmvfc_dbg(vhost, "Purging all requests\n");
806         list_for_each_entry_safe(evt, pos, &vhost->sent, queue)
807                 ibmvfc_fail_request(evt, error_code);
808 }
809
810 /**
811  * __ibmvfc_reset_host - Reset the connection to the server (no locking)
812  * @vhost:      struct ibmvfc host to reset
813  **/
814 static void __ibmvfc_reset_host(struct ibmvfc_host *vhost)
815 {
816         int rc;
817
818         scsi_block_requests(vhost->host);
819         ibmvfc_purge_requests(vhost, DID_ERROR);
820         if ((rc = ibmvfc_reset_crq(vhost)) ||
821             (rc = ibmvfc_send_crq_init(vhost)) ||
822             (rc = vio_enable_interrupts(to_vio_dev(vhost->dev)))) {
823                 dev_err(vhost->dev, "Error after reset rc=%d\n", rc);
824                 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
825         } else
826                 ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN);
827 }
828
829 /**
830  * ibmvfc_reset_host - Reset the connection to the server
831  * @vhost:      struct ibmvfc host to reset
832  **/
833 static void ibmvfc_reset_host(struct ibmvfc_host *vhost)
834 {
835         unsigned long flags;
836
837         spin_lock_irqsave(vhost->host->host_lock, flags);
838         __ibmvfc_reset_host(vhost);
839         spin_unlock_irqrestore(vhost->host->host_lock, flags);
840 }
841
842 /**
843  * ibmvfc_retry_host_init - Retry host initialization if allowed
844  * @vhost:      ibmvfc host struct
845  *
846  **/
847 static void ibmvfc_retry_host_init(struct ibmvfc_host *vhost)
848 {
849         if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) {
850                 if (++vhost->init_retries > IBMVFC_MAX_INIT_RETRIES) {
851                         dev_err(vhost->dev,
852                                 "Host initialization retries exceeded. Taking adapter offline\n");
853                         ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE);
854                 } else if (vhost->init_retries == IBMVFC_MAX_INIT_RETRIES)
855                         __ibmvfc_reset_host(vhost);
856                 else
857                         ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT);
858         }
859
860         wake_up(&vhost->work_wait_q);
861 }
862
863 /**
864  * __ibmvfc_get_target - Find the specified scsi_target (no locking)
865  * @starget:    scsi target struct
866  *
867  * Return value:
868  *      ibmvfc_target struct / NULL if not found
869  **/
870 static struct ibmvfc_target *__ibmvfc_get_target(struct scsi_target *starget)
871 {
872         struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
873         struct ibmvfc_host *vhost = shost_priv(shost);
874         struct ibmvfc_target *tgt;
875
876         list_for_each_entry(tgt, &vhost->targets, queue)
877                 if (tgt->target_id == starget->id) {
878                         kref_get(&tgt->kref);
879                         return tgt;
880                 }
881         return NULL;
882 }
883
884 /**
885  * ibmvfc_get_target - Find the specified scsi_target
886  * @starget:    scsi target struct
887  *
888  * Return value:
889  *      ibmvfc_target struct / NULL if not found
890  **/
891 static struct ibmvfc_target *ibmvfc_get_target(struct scsi_target *starget)
892 {
893         struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
894         struct ibmvfc_target *tgt;
895         unsigned long flags;
896
897         spin_lock_irqsave(shost->host_lock, flags);
898         tgt = __ibmvfc_get_target(starget);
899         spin_unlock_irqrestore(shost->host_lock, flags);
900         return tgt;
901 }
902
903 /**
904  * ibmvfc_get_host_speed - Get host port speed
905  * @shost:              scsi host struct
906  *
907  * Return value:
908  *      none
909  **/
910 static void ibmvfc_get_host_speed(struct Scsi_Host *shost)
911 {
912         struct ibmvfc_host *vhost = shost_priv(shost);
913         unsigned long flags;
914
915         spin_lock_irqsave(shost->host_lock, flags);
916         if (vhost->state == IBMVFC_ACTIVE) {
917                 switch (vhost->login_buf->resp.link_speed / 100) {
918                 case 1:
919                         fc_host_speed(shost) = FC_PORTSPEED_1GBIT;
920                         break;
921                 case 2:
922                         fc_host_speed(shost) = FC_PORTSPEED_2GBIT;
923                         break;
924                 case 4:
925                         fc_host_speed(shost) = FC_PORTSPEED_4GBIT;
926                         break;
927                 case 8:
928                         fc_host_speed(shost) = FC_PORTSPEED_8GBIT;
929                         break;
930                 case 10:
931                         fc_host_speed(shost) = FC_PORTSPEED_10GBIT;
932                         break;
933                 case 16:
934                         fc_host_speed(shost) = FC_PORTSPEED_16GBIT;
935                         break;
936                 default:
937                         ibmvfc_log(vhost, 3, "Unknown port speed: %ld Gbit\n",
938                                    vhost->login_buf->resp.link_speed / 100);
939                         fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN;
940                         break;
941                 }
942         } else
943                 fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN;
944         spin_unlock_irqrestore(shost->host_lock, flags);
945 }
946
947 /**
948  * ibmvfc_get_host_port_state - Get host port state
949  * @shost:              scsi host struct
950  *
951  * Return value:
952  *      none
953  **/
954 static void ibmvfc_get_host_port_state(struct Scsi_Host *shost)
955 {
956         struct ibmvfc_host *vhost = shost_priv(shost);
957         unsigned long flags;
958
959         spin_lock_irqsave(shost->host_lock, flags);
960         switch (vhost->state) {
961         case IBMVFC_INITIALIZING:
962         case IBMVFC_ACTIVE:
963                 fc_host_port_state(shost) = FC_PORTSTATE_ONLINE;
964                 break;
965         case IBMVFC_LINK_DOWN:
966                 fc_host_port_state(shost) = FC_PORTSTATE_LINKDOWN;
967                 break;
968         case IBMVFC_LINK_DEAD:
969         case IBMVFC_HOST_OFFLINE:
970                 fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE;
971                 break;
972         case IBMVFC_HALTED:
973                 fc_host_port_state(shost) = FC_PORTSTATE_BLOCKED;
974                 break;
975         case IBMVFC_NO_CRQ:
976                 fc_host_port_state(shost) = FC_PORTSTATE_UNKNOWN;
977                 break;
978         default:
979                 ibmvfc_log(vhost, 3, "Unknown port state: %d\n", vhost->state);
980                 fc_host_port_state(shost) = FC_PORTSTATE_UNKNOWN;
981                 break;
982         }
983         spin_unlock_irqrestore(shost->host_lock, flags);
984 }
985
986 /**
987  * ibmvfc_set_rport_dev_loss_tmo - Set rport's device loss timeout
988  * @rport:              rport struct
989  * @timeout:    timeout value
990  *
991  * Return value:
992  *      none
993  **/
994 static void ibmvfc_set_rport_dev_loss_tmo(struct fc_rport *rport, u32 timeout)
995 {
996         if (timeout)
997                 rport->dev_loss_tmo = timeout;
998         else
999                 rport->dev_loss_tmo = 1;
1000 }
1001
1002 /**
1003  * ibmvfc_release_tgt - Free memory allocated for a target
1004  * @kref:               kref struct
1005  *
1006  **/
1007 static void ibmvfc_release_tgt(struct kref *kref)
1008 {
1009         struct ibmvfc_target *tgt = container_of(kref, struct ibmvfc_target, kref);
1010         kfree(tgt);
1011 }
1012
1013 /**
1014  * ibmvfc_get_starget_node_name - Get SCSI target's node name
1015  * @starget:    scsi target struct
1016  *
1017  * Return value:
1018  *      none
1019  **/
1020 static void ibmvfc_get_starget_node_name(struct scsi_target *starget)
1021 {
1022         struct ibmvfc_target *tgt = ibmvfc_get_target(starget);
1023         fc_starget_port_name(starget) = tgt ? tgt->ids.node_name : 0;
1024         if (tgt)
1025                 kref_put(&tgt->kref, ibmvfc_release_tgt);
1026 }
1027
1028 /**
1029  * ibmvfc_get_starget_port_name - Get SCSI target's port name
1030  * @starget:    scsi target struct
1031  *
1032  * Return value:
1033  *      none
1034  **/
1035 static void ibmvfc_get_starget_port_name(struct scsi_target *starget)
1036 {
1037         struct ibmvfc_target *tgt = ibmvfc_get_target(starget);
1038         fc_starget_port_name(starget) = tgt ? tgt->ids.port_name : 0;
1039         if (tgt)
1040                 kref_put(&tgt->kref, ibmvfc_release_tgt);
1041 }
1042
1043 /**
1044  * ibmvfc_get_starget_port_id - Get SCSI target's port ID
1045  * @starget:    scsi target struct
1046  *
1047  * Return value:
1048  *      none
1049  **/
1050 static void ibmvfc_get_starget_port_id(struct scsi_target *starget)
1051 {
1052         struct ibmvfc_target *tgt = ibmvfc_get_target(starget);
1053         fc_starget_port_id(starget) = tgt ? tgt->scsi_id : -1;
1054         if (tgt)
1055                 kref_put(&tgt->kref, ibmvfc_release_tgt);
1056 }
1057
1058 /**
1059  * ibmvfc_wait_while_resetting - Wait while the host resets
1060  * @vhost:              ibmvfc host struct
1061  *
1062  * Return value:
1063  *      0 on success / other on failure
1064  **/
1065 static int ibmvfc_wait_while_resetting(struct ibmvfc_host *vhost)
1066 {
1067         long timeout = wait_event_timeout(vhost->init_wait_q,
1068                                           ((vhost->state == IBMVFC_ACTIVE ||
1069                                             vhost->state == IBMVFC_HOST_OFFLINE ||
1070                                             vhost->state == IBMVFC_LINK_DEAD) &&
1071                                            vhost->action == IBMVFC_HOST_ACTION_NONE),
1072                                           (init_timeout * HZ));
1073
1074         return timeout ? 0 : -EIO;
1075 }
1076
1077 /**
1078  * ibmvfc_issue_fc_host_lip - Re-initiate link initialization
1079  * @shost:              scsi host struct
1080  *
1081  * Return value:
1082  *      0 on success / other on failure
1083  **/
1084 static int ibmvfc_issue_fc_host_lip(struct Scsi_Host *shost)
1085 {
1086         struct ibmvfc_host *vhost = shost_priv(shost);
1087
1088         dev_err(vhost->dev, "Initiating host LIP. Resetting connection\n");
1089         ibmvfc_reset_host(vhost);
1090         return ibmvfc_wait_while_resetting(vhost);
1091 }
1092
1093 /**
1094  * ibmvfc_gather_partition_info - Gather info about the LPAR
1095  *
1096  * Return value:
1097  *      none
1098  **/
1099 static void ibmvfc_gather_partition_info(struct ibmvfc_host *vhost)
1100 {
1101         struct device_node *rootdn;
1102         const char *name;
1103         const unsigned int *num;
1104
1105         rootdn = of_find_node_by_path("/");
1106         if (!rootdn)
1107                 return;
1108
1109         name = of_get_property(rootdn, "ibm,partition-name", NULL);
1110         if (name)
1111                 strncpy(vhost->partition_name, name, sizeof(vhost->partition_name));
1112         num = of_get_property(rootdn, "ibm,partition-no", NULL);
1113         if (num)
1114                 vhost->partition_number = *num;
1115         of_node_put(rootdn);
1116 }
1117
1118 /**
1119  * ibmvfc_set_login_info - Setup info for NPIV login
1120  * @vhost:      ibmvfc host struct
1121  *
1122  * Return value:
1123  *      none
1124  **/
1125 static void ibmvfc_set_login_info(struct ibmvfc_host *vhost)
1126 {
1127         struct ibmvfc_npiv_login *login_info = &vhost->login_info;
1128         struct device_node *of_node = vhost->dev->archdata.of_node;
1129         const char *location;
1130
1131         memset(login_info, 0, sizeof(*login_info));
1132
1133         login_info->ostype = IBMVFC_OS_LINUX;
1134         login_info->max_dma_len = IBMVFC_MAX_SECTORS << 9;
1135         login_info->max_payload = sizeof(struct ibmvfc_fcp_cmd_iu);
1136         login_info->max_response = sizeof(struct ibmvfc_fcp_rsp);
1137         login_info->partition_num = vhost->partition_number;
1138         login_info->vfc_frame_version = 1;
1139         login_info->fcp_version = 3;
1140         if (vhost->client_migrated)
1141                 login_info->flags = IBMVFC_CLIENT_MIGRATED;
1142
1143         login_info->max_cmds = max_requests + IBMVFC_NUM_INTERNAL_REQ;
1144         login_info->capabilities = IBMVFC_CAN_MIGRATE;
1145         login_info->async.va = vhost->async_crq.msg_token;
1146         login_info->async.len = vhost->async_crq.size * sizeof(*vhost->async_crq.msgs);
1147         strncpy(login_info->partition_name, vhost->partition_name, IBMVFC_MAX_NAME);
1148         strncpy(login_info->device_name,
1149                 vhost->host->shost_gendev.bus_id, IBMVFC_MAX_NAME);
1150
1151         location = of_get_property(of_node, "ibm,loc-code", NULL);
1152         location = location ? location : vhost->dev->bus_id;
1153         strncpy(login_info->drc_name, location, IBMVFC_MAX_NAME);
1154 }
1155
1156 /**
1157  * ibmvfc_init_event_pool - Allocates and initializes the event pool for a host
1158  * @vhost:      ibmvfc host who owns the event pool
1159  *
1160  * Returns zero on success.
1161  **/
1162 static int ibmvfc_init_event_pool(struct ibmvfc_host *vhost)
1163 {
1164         int i;
1165         struct ibmvfc_event_pool *pool = &vhost->pool;
1166
1167         ENTER;
1168         pool->size = max_requests + IBMVFC_NUM_INTERNAL_REQ;
1169         pool->events = kcalloc(pool->size, sizeof(*pool->events), GFP_KERNEL);
1170         if (!pool->events)
1171                 return -ENOMEM;
1172
1173         pool->iu_storage = dma_alloc_coherent(vhost->dev,
1174                                               pool->size * sizeof(*pool->iu_storage),
1175                                               &pool->iu_token, 0);
1176
1177         if (!pool->iu_storage) {
1178                 kfree(pool->events);
1179                 return -ENOMEM;
1180         }
1181
1182         for (i = 0; i < pool->size; ++i) {
1183                 struct ibmvfc_event *evt = &pool->events[i];
1184                 atomic_set(&evt->free, 1);
1185                 evt->crq.valid = 0x80;
1186                 evt->crq.ioba = pool->iu_token + (sizeof(*evt->xfer_iu) * i);
1187                 evt->xfer_iu = pool->iu_storage + i;
1188                 evt->vhost = vhost;
1189                 evt->ext_list = NULL;
1190                 list_add_tail(&evt->queue, &vhost->free);
1191         }
1192
1193         LEAVE;
1194         return 0;
1195 }
1196
1197 /**
1198  * ibmvfc_free_event_pool - Frees memory of the event pool of a host
1199  * @vhost:      ibmvfc host who owns the event pool
1200  *
1201  **/
1202 static void ibmvfc_free_event_pool(struct ibmvfc_host *vhost)
1203 {
1204         int i;
1205         struct ibmvfc_event_pool *pool = &vhost->pool;
1206
1207         ENTER;
1208         for (i = 0; i < pool->size; ++i) {
1209                 list_del(&pool->events[i].queue);
1210                 BUG_ON(atomic_read(&pool->events[i].free) != 1);
1211                 if (pool->events[i].ext_list)
1212                         dma_pool_free(vhost->sg_pool,
1213                                       pool->events[i].ext_list,
1214                                       pool->events[i].ext_list_token);
1215         }
1216
1217         kfree(pool->events);
1218         dma_free_coherent(vhost->dev,
1219                           pool->size * sizeof(*pool->iu_storage),
1220                           pool->iu_storage, pool->iu_token);
1221         LEAVE;
1222 }
1223
1224 /**
1225  * ibmvfc_get_event - Gets the next free event in pool
1226  * @vhost:      ibmvfc host struct
1227  *
1228  * Returns a free event from the pool.
1229  **/
1230 static struct ibmvfc_event *ibmvfc_get_event(struct ibmvfc_host *vhost)
1231 {
1232         struct ibmvfc_event *evt;
1233
1234         BUG_ON(list_empty(&vhost->free));
1235         evt = list_entry(vhost->free.next, struct ibmvfc_event, queue);
1236         atomic_set(&evt->free, 0);
1237         list_del(&evt->queue);
1238         return evt;
1239 }
1240
1241 /**
1242  * ibmvfc_init_event - Initialize fields in an event struct that are always
1243  *                              required.
1244  * @evt:        The event
1245  * @done:       Routine to call when the event is responded to
1246  * @format:     SRP or MAD format
1247  **/
1248 static void ibmvfc_init_event(struct ibmvfc_event *evt,
1249                               void (*done) (struct ibmvfc_event *), u8 format)
1250 {
1251         evt->cmnd = NULL;
1252         evt->sync_iu = NULL;
1253         evt->crq.format = format;
1254         evt->done = done;
1255 }
1256
1257 /**
1258  * ibmvfc_map_sg_list - Initialize scatterlist
1259  * @scmd:       scsi command struct
1260  * @nseg:       number of scatterlist segments
1261  * @md: memory descriptor list to initialize
1262  **/
1263 static void ibmvfc_map_sg_list(struct scsi_cmnd *scmd, int nseg,
1264                                struct srp_direct_buf *md)
1265 {
1266         int i;
1267         struct scatterlist *sg;
1268
1269         scsi_for_each_sg(scmd, sg, nseg, i) {
1270                 md[i].va = sg_dma_address(sg);
1271                 md[i].len = sg_dma_len(sg);
1272                 md[i].key = 0;
1273         }
1274 }
1275
1276 /**
1277  * ibmvfc_map_sg_data - Maps dma for a scatterlist and initializes decriptor fields
1278  * @scmd:               Scsi_Cmnd with the scatterlist
1279  * @evt:                ibmvfc event struct
1280  * @vfc_cmd:    vfc_cmd that contains the memory descriptor
1281  * @dev:                device for which to map dma memory
1282  *
1283  * Returns:
1284  *      0 on success / non-zero on failure
1285  **/
1286 static int ibmvfc_map_sg_data(struct scsi_cmnd *scmd,
1287                               struct ibmvfc_event *evt,
1288                               struct ibmvfc_cmd *vfc_cmd, struct device *dev)
1289 {
1290
1291         int sg_mapped;
1292         struct srp_direct_buf *data = &vfc_cmd->ioba;
1293         struct ibmvfc_host *vhost = dev_get_drvdata(dev);
1294
1295         sg_mapped = scsi_dma_map(scmd);
1296         if (!sg_mapped) {
1297                 vfc_cmd->flags |= IBMVFC_NO_MEM_DESC;
1298                 return 0;
1299         } else if (unlikely(sg_mapped < 0)) {
1300                 if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL)
1301                         scmd_printk(KERN_ERR, scmd, "Failed to map DMA buffer for command\n");
1302                 return sg_mapped;
1303         }
1304
1305         if (scmd->sc_data_direction == DMA_TO_DEVICE) {
1306                 vfc_cmd->flags |= IBMVFC_WRITE;
1307                 vfc_cmd->iu.add_cdb_len |= IBMVFC_WRDATA;
1308         } else {
1309                 vfc_cmd->flags |= IBMVFC_READ;
1310                 vfc_cmd->iu.add_cdb_len |= IBMVFC_RDDATA;
1311         }
1312
1313         if (sg_mapped == 1) {
1314                 ibmvfc_map_sg_list(scmd, sg_mapped, data);
1315                 return 0;
1316         }
1317
1318         vfc_cmd->flags |= IBMVFC_SCATTERLIST;
1319
1320         if (!evt->ext_list) {
1321                 evt->ext_list = dma_pool_alloc(vhost->sg_pool, GFP_ATOMIC,
1322                                                &evt->ext_list_token);
1323
1324                 if (!evt->ext_list) {
1325                         scmd_printk(KERN_ERR, scmd, "Can't allocate memory for scatterlist\n");
1326                         return -ENOMEM;
1327                 }
1328         }
1329
1330         ibmvfc_map_sg_list(scmd, sg_mapped, evt->ext_list);
1331
1332         data->va = evt->ext_list_token;
1333         data->len = sg_mapped * sizeof(struct srp_direct_buf);
1334         data->key = 0;
1335         return 0;
1336 }
1337
1338 /**
1339  * ibmvfc_timeout - Internal command timeout handler
1340  * @evt:        struct ibmvfc_event that timed out
1341  *
1342  * Called when an internally generated command times out
1343  **/
1344 static void ibmvfc_timeout(struct ibmvfc_event *evt)
1345 {
1346         struct ibmvfc_host *vhost = evt->vhost;
1347         dev_err(vhost->dev, "Command timed out (%p). Resetting connection\n", evt);
1348         ibmvfc_reset_host(vhost);
1349 }
1350
1351 /**
1352  * ibmvfc_send_event - Transforms event to u64 array and calls send_crq()
1353  * @evt:                event to be sent
1354  * @vhost:              ibmvfc host struct
1355  * @timeout:    timeout in seconds - 0 means do not time command
1356  *
1357  * Returns the value returned from ibmvfc_send_crq(). (Zero for success)
1358  **/
1359 static int ibmvfc_send_event(struct ibmvfc_event *evt,
1360                              struct ibmvfc_host *vhost, unsigned long timeout)
1361 {
1362         u64 *crq_as_u64 = (u64 *) &evt->crq;
1363         int rc;
1364
1365         /* Copy the IU into the transfer area */
1366         *evt->xfer_iu = evt->iu;
1367         if (evt->crq.format == IBMVFC_CMD_FORMAT)
1368                 evt->xfer_iu->cmd.tag = (u64)evt;
1369         else if (evt->crq.format == IBMVFC_MAD_FORMAT)
1370                 evt->xfer_iu->mad_common.tag = (u64)evt;
1371         else
1372                 BUG();
1373
1374         list_add_tail(&evt->queue, &vhost->sent);
1375         init_timer(&evt->timer);
1376
1377         if (timeout) {
1378                 evt->timer.data = (unsigned long) evt;
1379                 evt->timer.expires = jiffies + (timeout * HZ);
1380                 evt->timer.function = (void (*)(unsigned long))ibmvfc_timeout;
1381                 add_timer(&evt->timer);
1382         }
1383
1384         if ((rc = ibmvfc_send_crq(vhost, crq_as_u64[0], crq_as_u64[1]))) {
1385                 list_del(&evt->queue);
1386                 del_timer(&evt->timer);
1387
1388                 /* If send_crq returns H_CLOSED, return SCSI_MLQUEUE_HOST_BUSY.
1389                  * Firmware will send a CRQ with a transport event (0xFF) to
1390                  * tell this client what has happened to the transport. This
1391                  * will be handled in ibmvfc_handle_crq()
1392                  */
1393                 if (rc == H_CLOSED) {
1394                         if (printk_ratelimit())
1395                                 dev_warn(vhost->dev, "Send warning. Receive queue closed, will retry.\n");
1396                         if (evt->cmnd)
1397                                 scsi_dma_unmap(evt->cmnd);
1398                         ibmvfc_free_event(evt);
1399                         return SCSI_MLQUEUE_HOST_BUSY;
1400                 }
1401
1402                 dev_err(vhost->dev, "Send error (rc=%d)\n", rc);
1403                 if (evt->cmnd) {
1404                         evt->cmnd->result = DID_ERROR << 16;
1405                         evt->done = ibmvfc_scsi_eh_done;
1406                 } else
1407                         evt->xfer_iu->mad_common.status = IBMVFC_MAD_CRQ_ERROR;
1408
1409                 evt->done(evt);
1410         } else
1411                 ibmvfc_trc_start(evt);
1412
1413         return 0;
1414 }
1415
1416 /**
1417  * ibmvfc_log_error - Log an error for the failed command if appropriate
1418  * @evt:        ibmvfc event to log
1419  *
1420  **/
1421 static void ibmvfc_log_error(struct ibmvfc_event *evt)
1422 {
1423         struct ibmvfc_cmd *vfc_cmd = &evt->xfer_iu->cmd;
1424         struct ibmvfc_host *vhost = evt->vhost;
1425         struct ibmvfc_fcp_rsp *rsp = &vfc_cmd->rsp;
1426         struct scsi_cmnd *cmnd = evt->cmnd;
1427         const char *err = unknown_error;
1428         int index = ibmvfc_get_err_index(vfc_cmd->status, vfc_cmd->error);
1429         int logerr = 0;
1430         int rsp_code = 0;
1431
1432         if (index >= 0) {
1433                 logerr = cmd_status[index].log;
1434                 err = cmd_status[index].name;
1435         }
1436
1437         if (!logerr && (vhost->log_level <= (IBMVFC_DEFAULT_LOG_LEVEL + 1)))
1438                 return;
1439
1440         if (rsp->flags & FCP_RSP_LEN_VALID)
1441                 rsp_code = rsp->data.info.rsp_code;
1442
1443         scmd_printk(KERN_ERR, cmnd, "Command (%02X) failed: %s (%x:%x) "
1444                     "flags: %x fcp_rsp: %x, resid=%d, scsi_status: %x\n",
1445                     cmnd->cmnd[0], err, vfc_cmd->status, vfc_cmd->error,
1446                     rsp->flags, rsp_code, scsi_get_resid(cmnd), rsp->scsi_status);
1447 }
1448
1449 /**
1450  * ibmvfc_scsi_done - Handle responses from commands
1451  * @evt:        ibmvfc event to be handled
1452  *
1453  * Used as a callback when sending scsi cmds.
1454  **/
1455 static void ibmvfc_scsi_done(struct ibmvfc_event *evt)
1456 {
1457         struct ibmvfc_cmd *vfc_cmd = &evt->xfer_iu->cmd;
1458         struct ibmvfc_fcp_rsp *rsp = &vfc_cmd->rsp;
1459         struct scsi_cmnd *cmnd = evt->cmnd;
1460         u32 rsp_len = 0;
1461         u32 sense_len = rsp->fcp_sense_len;
1462
1463         if (cmnd) {
1464                 if (vfc_cmd->response_flags & IBMVFC_ADAPTER_RESID_VALID)
1465                         scsi_set_resid(cmnd, vfc_cmd->adapter_resid);
1466                 else if (rsp->flags & FCP_RESID_UNDER)
1467                         scsi_set_resid(cmnd, rsp->fcp_resid);
1468                 else
1469                         scsi_set_resid(cmnd, 0);
1470
1471                 if (vfc_cmd->status) {
1472                         cmnd->result = ibmvfc_get_err_result(vfc_cmd);
1473
1474                         if (rsp->flags & FCP_RSP_LEN_VALID)
1475                                 rsp_len = rsp->fcp_rsp_len;
1476                         if ((sense_len + rsp_len) > SCSI_SENSE_BUFFERSIZE)
1477                                 sense_len = SCSI_SENSE_BUFFERSIZE - rsp_len;
1478                         if ((rsp->flags & FCP_SNS_LEN_VALID) && rsp->fcp_sense_len && rsp_len <= 8)
1479                                 memcpy(cmnd->sense_buffer, rsp->data.sense + rsp_len, sense_len);
1480
1481                         ibmvfc_log_error(evt);
1482                 }
1483
1484                 if (!cmnd->result &&
1485                     (scsi_bufflen(cmnd) - scsi_get_resid(cmnd) < cmnd->underflow))
1486                         cmnd->result = (DID_ERROR << 16);
1487
1488                 scsi_dma_unmap(cmnd);
1489                 cmnd->scsi_done(cmnd);
1490         }
1491
1492         ibmvfc_free_event(evt);
1493 }
1494
1495 /**
1496  * ibmvfc_host_chkready - Check if the host can accept commands
1497  * @vhost:       struct ibmvfc host
1498  *
1499  * Returns:
1500  *      1 if host can accept command / 0 if not
1501  **/
1502 static inline int ibmvfc_host_chkready(struct ibmvfc_host *vhost)
1503 {
1504         int result = 0;
1505
1506         switch (vhost->state) {
1507         case IBMVFC_LINK_DEAD:
1508         case IBMVFC_HOST_OFFLINE:
1509                 result = DID_NO_CONNECT << 16;
1510                 break;
1511         case IBMVFC_NO_CRQ:
1512         case IBMVFC_INITIALIZING:
1513         case IBMVFC_HALTED:
1514         case IBMVFC_LINK_DOWN:
1515                 result = DID_REQUEUE << 16;
1516                 break;
1517         case IBMVFC_ACTIVE:
1518                 result = 0;
1519                 break;
1520         };
1521
1522         return result;
1523 }
1524
1525 /**
1526  * ibmvfc_queuecommand - The queuecommand function of the scsi template
1527  * @cmnd:       struct scsi_cmnd to be executed
1528  * @done:       Callback function to be called when cmnd is completed
1529  *
1530  * Returns:
1531  *      0 on success / other on failure
1532  **/
1533 static int ibmvfc_queuecommand(struct scsi_cmnd *cmnd,
1534                                void (*done) (struct scsi_cmnd *))
1535 {
1536         struct ibmvfc_host *vhost = shost_priv(cmnd->device->host);
1537         struct fc_rport *rport = starget_to_rport(scsi_target(cmnd->device));
1538         struct ibmvfc_cmd *vfc_cmd;
1539         struct ibmvfc_event *evt;
1540         u8 tag[2];
1541         int rc;
1542
1543         if (unlikely((rc = fc_remote_port_chkready(rport))) ||
1544             unlikely((rc = ibmvfc_host_chkready(vhost)))) {
1545                 cmnd->result = rc;
1546                 done(cmnd);
1547                 return 0;
1548         }
1549
1550         cmnd->result = (DID_OK << 16);
1551         evt = ibmvfc_get_event(vhost);
1552         ibmvfc_init_event(evt, ibmvfc_scsi_done, IBMVFC_CMD_FORMAT);
1553         evt->cmnd = cmnd;
1554         cmnd->scsi_done = done;
1555         vfc_cmd = &evt->iu.cmd;
1556         memset(vfc_cmd, 0, sizeof(*vfc_cmd));
1557         vfc_cmd->resp.va = (u64)evt->crq.ioba + offsetof(struct ibmvfc_cmd, rsp);
1558         vfc_cmd->resp.len = sizeof(vfc_cmd->rsp);
1559         vfc_cmd->frame_type = IBMVFC_SCSI_FCP_TYPE;
1560         vfc_cmd->payload_len = sizeof(vfc_cmd->iu);
1561         vfc_cmd->resp_len = sizeof(vfc_cmd->rsp);
1562         vfc_cmd->cancel_key = (unsigned long)cmnd->device->hostdata;
1563         vfc_cmd->tgt_scsi_id = rport->port_id;
1564         if ((rport->supported_classes & FC_COS_CLASS3) &&
1565             (fc_host_supported_classes(vhost->host) & FC_COS_CLASS3))
1566                 vfc_cmd->flags = IBMVFC_CLASS_3_ERR;
1567         vfc_cmd->iu.xfer_len = scsi_bufflen(cmnd);
1568         int_to_scsilun(cmnd->device->lun, &vfc_cmd->iu.lun);
1569         memcpy(vfc_cmd->iu.cdb, cmnd->cmnd, cmnd->cmd_len);
1570
1571         if (scsi_populate_tag_msg(cmnd, tag)) {
1572                 vfc_cmd->task_tag = tag[1];
1573                 switch (tag[0]) {
1574                 case MSG_SIMPLE_TAG:
1575                         vfc_cmd->iu.pri_task_attr = IBMVFC_SIMPLE_TASK;
1576                         break;
1577                 case MSG_HEAD_TAG:
1578                         vfc_cmd->iu.pri_task_attr = IBMVFC_HEAD_OF_QUEUE;
1579                         break;
1580                 case MSG_ORDERED_TAG:
1581                         vfc_cmd->iu.pri_task_attr = IBMVFC_ORDERED_TASK;
1582                         break;
1583                 };
1584         }
1585
1586         if (likely(!(rc = ibmvfc_map_sg_data(cmnd, evt, vfc_cmd, vhost->dev))))
1587                 return ibmvfc_send_event(evt, vhost, 0);
1588
1589         ibmvfc_free_event(evt);
1590         if (rc == -ENOMEM)
1591                 return SCSI_MLQUEUE_HOST_BUSY;
1592
1593         if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL)
1594                 scmd_printk(KERN_ERR, cmnd,
1595                             "Failed to map DMA buffer for command. rc=%d\n", rc);
1596
1597         cmnd->result = DID_ERROR << 16;
1598         done(cmnd);
1599         return 0;
1600 }
1601
1602 /**
1603  * ibmvfc_sync_completion - Signal that a synchronous command has completed
1604  * @evt:        ibmvfc event struct
1605  *
1606  **/
1607 static void ibmvfc_sync_completion(struct ibmvfc_event *evt)
1608 {
1609         /* copy the response back */
1610         if (evt->sync_iu)
1611                 *evt->sync_iu = *evt->xfer_iu;
1612
1613         complete(&evt->comp);
1614 }
1615
1616 /**
1617  * ibmvfc_reset_device - Reset the device with the specified reset type
1618  * @sdev:       scsi device to reset
1619  * @type:       reset type
1620  * @desc:       reset type description for log messages
1621  *
1622  * Returns:
1623  *      0 on success / other on failure
1624  **/
1625 static int ibmvfc_reset_device(struct scsi_device *sdev, int type, char *desc)
1626 {
1627         struct ibmvfc_host *vhost = shost_priv(sdev->host);
1628         struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
1629         struct ibmvfc_cmd *tmf;
1630         struct ibmvfc_event *evt;
1631         union ibmvfc_iu rsp_iu;
1632         struct ibmvfc_fcp_rsp *fc_rsp = &rsp_iu.cmd.rsp;
1633         int rsp_rc = -EBUSY;
1634         unsigned long flags;
1635         int rsp_code = 0;
1636
1637         spin_lock_irqsave(vhost->host->host_lock, flags);
1638         if (vhost->state == IBMVFC_ACTIVE) {
1639                 evt = ibmvfc_get_event(vhost);
1640                 ibmvfc_init_event(evt, ibmvfc_sync_completion, IBMVFC_CMD_FORMAT);
1641
1642                 tmf = &evt->iu.cmd;
1643                 memset(tmf, 0, sizeof(*tmf));
1644                 tmf->resp.va = (u64)evt->crq.ioba + offsetof(struct ibmvfc_cmd, rsp);
1645                 tmf->resp.len = sizeof(tmf->rsp);
1646                 tmf->frame_type = IBMVFC_SCSI_FCP_TYPE;
1647                 tmf->payload_len = sizeof(tmf->iu);
1648                 tmf->resp_len = sizeof(tmf->rsp);
1649                 tmf->cancel_key = (unsigned long)sdev->hostdata;
1650                 tmf->tgt_scsi_id = rport->port_id;
1651                 int_to_scsilun(sdev->lun, &tmf->iu.lun);
1652                 tmf->flags = (IBMVFC_NO_MEM_DESC | IBMVFC_TMF);
1653                 tmf->iu.tmf_flags = type;
1654                 evt->sync_iu = &rsp_iu;
1655
1656                 init_completion(&evt->comp);
1657                 rsp_rc = ibmvfc_send_event(evt, vhost, default_timeout);
1658         }
1659         spin_unlock_irqrestore(vhost->host->host_lock, flags);
1660
1661         if (rsp_rc != 0) {
1662                 sdev_printk(KERN_ERR, sdev, "Failed to send %s reset event. rc=%d\n",
1663                             desc, rsp_rc);
1664                 return -EIO;
1665         }
1666
1667         sdev_printk(KERN_INFO, sdev, "Resetting %s\n", desc);
1668         wait_for_completion(&evt->comp);
1669
1670         if (rsp_iu.cmd.status) {
1671                 if (fc_rsp->flags & FCP_RSP_LEN_VALID)
1672                         rsp_code = fc_rsp->data.info.rsp_code;
1673
1674                 sdev_printk(KERN_ERR, sdev, "%s reset failed: %s (%x:%x) "
1675                             "flags: %x fcp_rsp: %x, scsi_status: %x\n",
1676                             desc, ibmvfc_get_cmd_error(rsp_iu.cmd.status, rsp_iu.cmd.error),
1677                             rsp_iu.cmd.status, rsp_iu.cmd.error, fc_rsp->flags, rsp_code,
1678                             fc_rsp->scsi_status);
1679                 rsp_rc = -EIO;
1680         } else
1681                 sdev_printk(KERN_INFO, sdev, "%s reset successful\n", desc);
1682
1683         spin_lock_irqsave(vhost->host->host_lock, flags);
1684         ibmvfc_free_event(evt);
1685         spin_unlock_irqrestore(vhost->host->host_lock, flags);
1686         return rsp_rc;
1687 }
1688
1689 /**
1690  * ibmvfc_abort_task_set - Abort outstanding commands to the device
1691  * @sdev:       scsi device to abort commands
1692  *
1693  * This sends an Abort Task Set to the VIOS for the specified device. This does
1694  * NOT send any cancel to the VIOS. That must be done separately.
1695  *
1696  * Returns:
1697  *      0 on success / other on failure
1698  **/
1699 static int ibmvfc_abort_task_set(struct scsi_device *sdev)
1700 {
1701         struct ibmvfc_host *vhost = shost_priv(sdev->host);
1702         struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
1703         struct ibmvfc_cmd *tmf;
1704         struct ibmvfc_event *evt, *found_evt;
1705         union ibmvfc_iu rsp_iu;
1706         struct ibmvfc_fcp_rsp *fc_rsp = &rsp_iu.cmd.rsp;
1707         int rsp_rc = -EBUSY;
1708         unsigned long flags;
1709         int rsp_code = 0;
1710
1711         spin_lock_irqsave(vhost->host->host_lock, flags);
1712         found_evt = NULL;
1713         list_for_each_entry(evt, &vhost->sent, queue) {
1714                 if (evt->cmnd && evt->cmnd->device == sdev) {
1715                         found_evt = evt;
1716                         break;
1717                 }
1718         }
1719
1720         if (!found_evt) {
1721                 if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL)
1722                         sdev_printk(KERN_INFO, sdev, "No events found to abort\n");
1723                 spin_unlock_irqrestore(vhost->host->host_lock, flags);
1724                 return 0;
1725         }
1726
1727         if (vhost->state == IBMVFC_ACTIVE) {
1728                 evt = ibmvfc_get_event(vhost);
1729                 ibmvfc_init_event(evt, ibmvfc_sync_completion, IBMVFC_CMD_FORMAT);
1730
1731                 tmf = &evt->iu.cmd;
1732                 memset(tmf, 0, sizeof(*tmf));
1733                 tmf->resp.va = (u64)evt->crq.ioba + offsetof(struct ibmvfc_cmd, rsp);
1734                 tmf->resp.len = sizeof(tmf->rsp);
1735                 tmf->frame_type = IBMVFC_SCSI_FCP_TYPE;
1736                 tmf->payload_len = sizeof(tmf->iu);
1737                 tmf->resp_len = sizeof(tmf->rsp);
1738                 tmf->cancel_key = (unsigned long)sdev->hostdata;
1739                 tmf->tgt_scsi_id = rport->port_id;
1740                 int_to_scsilun(sdev->lun, &tmf->iu.lun);
1741                 tmf->flags = (IBMVFC_NO_MEM_DESC | IBMVFC_TMF);
1742                 tmf->iu.tmf_flags = IBMVFC_ABORT_TASK_SET;
1743                 evt->sync_iu = &rsp_iu;
1744
1745                 init_completion(&evt->comp);
1746                 rsp_rc = ibmvfc_send_event(evt, vhost, default_timeout);
1747         }
1748
1749         spin_unlock_irqrestore(vhost->host->host_lock, flags);
1750
1751         if (rsp_rc != 0) {
1752                 sdev_printk(KERN_ERR, sdev, "Failed to send abort. rc=%d\n", rsp_rc);
1753                 return -EIO;
1754         }
1755
1756         sdev_printk(KERN_INFO, sdev, "Aborting outstanding commands\n");
1757         wait_for_completion(&evt->comp);
1758
1759         if (rsp_iu.cmd.status) {
1760                 if (fc_rsp->flags & FCP_RSP_LEN_VALID)
1761                         rsp_code = fc_rsp->data.info.rsp_code;
1762
1763                 sdev_printk(KERN_ERR, sdev, "Abort failed: %s (%x:%x) "
1764                             "flags: %x fcp_rsp: %x, scsi_status: %x\n",
1765                             ibmvfc_get_cmd_error(rsp_iu.cmd.status, rsp_iu.cmd.error),
1766                             rsp_iu.cmd.status, rsp_iu.cmd.error, fc_rsp->flags, rsp_code,
1767                             fc_rsp->scsi_status);
1768                 rsp_rc = -EIO;
1769         } else
1770                 sdev_printk(KERN_INFO, sdev, "Abort successful\n");
1771
1772         spin_lock_irqsave(vhost->host->host_lock, flags);
1773         ibmvfc_free_event(evt);
1774         spin_unlock_irqrestore(vhost->host->host_lock, flags);
1775         return rsp_rc;
1776 }
1777
1778 /**
1779  * ibmvfc_cancel_all - Cancel all outstanding commands to the device
1780  * @sdev:       scsi device to cancel commands
1781  * @type:       type of error recovery being performed
1782  *
1783  * This sends a cancel to the VIOS for the specified device. This does
1784  * NOT send any abort to the actual device. That must be done separately.
1785  *
1786  * Returns:
1787  *      0 on success / other on failure
1788  **/
1789 static int ibmvfc_cancel_all(struct scsi_device *sdev, int type)
1790 {
1791         struct ibmvfc_host *vhost = shost_priv(sdev->host);
1792         struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
1793         struct ibmvfc_tmf *tmf;
1794         struct ibmvfc_event *evt, *found_evt;
1795         union ibmvfc_iu rsp;
1796         int rsp_rc = -EBUSY;
1797         unsigned long flags;
1798         u16 status;
1799
1800         ENTER;
1801         spin_lock_irqsave(vhost->host->host_lock, flags);
1802         found_evt = NULL;
1803         list_for_each_entry(evt, &vhost->sent, queue) {
1804                 if (evt->cmnd && evt->cmnd->device == sdev) {
1805                         found_evt = evt;
1806                         break;
1807                 }
1808         }
1809
1810         if (!found_evt) {
1811                 if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL)
1812                         sdev_printk(KERN_INFO, sdev, "No events found to cancel\n");
1813                 spin_unlock_irqrestore(vhost->host->host_lock, flags);
1814                 return 0;
1815         }
1816
1817         if (vhost->state == IBMVFC_ACTIVE) {
1818                 evt = ibmvfc_get_event(vhost);
1819                 ibmvfc_init_event(evt, ibmvfc_sync_completion, IBMVFC_MAD_FORMAT);
1820
1821                 tmf = &evt->iu.tmf;
1822                 memset(tmf, 0, sizeof(*tmf));
1823                 tmf->common.version = 1;
1824                 tmf->common.opcode = IBMVFC_TMF_MAD;
1825                 tmf->common.length = sizeof(*tmf);
1826                 tmf->scsi_id = rport->port_id;
1827                 int_to_scsilun(sdev->lun, &tmf->lun);
1828                 tmf->flags = (type | IBMVFC_TMF_LUA_VALID);
1829                 tmf->cancel_key = (unsigned long)sdev->hostdata;
1830                 tmf->my_cancel_key = (IBMVFC_TMF_CANCEL_KEY | (unsigned long)sdev->hostdata);
1831
1832                 evt->sync_iu = &rsp;
1833                 init_completion(&evt->comp);
1834                 rsp_rc = ibmvfc_send_event(evt, vhost, default_timeout);
1835         }
1836
1837         spin_unlock_irqrestore(vhost->host->host_lock, flags);
1838
1839         if (rsp_rc != 0) {
1840                 sdev_printk(KERN_ERR, sdev, "Failed to send cancel event. rc=%d\n", rsp_rc);
1841                 return -EIO;
1842         }
1843
1844         sdev_printk(KERN_INFO, sdev, "Cancelling outstanding commands.\n");
1845
1846         wait_for_completion(&evt->comp);
1847         status = rsp.mad_common.status;
1848         spin_lock_irqsave(vhost->host->host_lock, flags);
1849         ibmvfc_free_event(evt);
1850         spin_unlock_irqrestore(vhost->host->host_lock, flags);
1851
1852         if (status != IBMVFC_MAD_SUCCESS) {
1853                 sdev_printk(KERN_WARNING, sdev, "Cancel failed with rc=%x\n", status);
1854                 return -EIO;
1855         }
1856
1857         sdev_printk(KERN_INFO, sdev, "Successfully cancelled outstanding commands\n");
1858         return 0;
1859 }
1860
1861 /**
1862  * ibmvfc_eh_abort_handler - Abort a command
1863  * @cmd:        scsi command to abort
1864  *
1865  * Returns:
1866  *      SUCCESS / FAILED
1867  **/
1868 static int ibmvfc_eh_abort_handler(struct scsi_cmnd *cmd)
1869 {
1870         struct ibmvfc_host *vhost = shost_priv(cmd->device->host);
1871         struct ibmvfc_event *evt, *pos;
1872         int cancel_rc, abort_rc;
1873         unsigned long flags;
1874
1875         ENTER;
1876         ibmvfc_wait_while_resetting(vhost);
1877         cancel_rc = ibmvfc_cancel_all(cmd->device, IBMVFC_TMF_ABORT_TASK_SET);
1878         abort_rc = ibmvfc_abort_task_set(cmd->device);
1879
1880         if (!cancel_rc && !abort_rc) {
1881                 spin_lock_irqsave(vhost->host->host_lock, flags);
1882                 list_for_each_entry_safe(evt, pos, &vhost->sent, queue) {
1883                         if (evt->cmnd && evt->cmnd->device == cmd->device)
1884                                 ibmvfc_fail_request(evt, DID_ABORT);
1885                 }
1886                 spin_unlock_irqrestore(vhost->host->host_lock, flags);
1887                 LEAVE;
1888                 return SUCCESS;
1889         }
1890
1891         LEAVE;
1892         return FAILED;
1893 }
1894
1895 /**
1896  * ibmvfc_eh_device_reset_handler - Reset a single LUN
1897  * @cmd:        scsi command struct
1898  *
1899  * Returns:
1900  *      SUCCESS / FAILED
1901  **/
1902 static int ibmvfc_eh_device_reset_handler(struct scsi_cmnd *cmd)
1903 {
1904         struct ibmvfc_host *vhost = shost_priv(cmd->device->host);
1905         struct ibmvfc_event *evt, *pos;
1906         int cancel_rc, reset_rc;
1907         unsigned long flags;
1908
1909         ENTER;
1910         ibmvfc_wait_while_resetting(vhost);
1911         cancel_rc = ibmvfc_cancel_all(cmd->device, IBMVFC_TMF_LUN_RESET);
1912         reset_rc = ibmvfc_reset_device(cmd->device, IBMVFC_LUN_RESET, "LUN");
1913
1914         if (!cancel_rc && !reset_rc) {
1915                 spin_lock_irqsave(vhost->host->host_lock, flags);
1916                 list_for_each_entry_safe(evt, pos, &vhost->sent, queue) {
1917                         if (evt->cmnd && evt->cmnd->device == cmd->device)
1918                                 ibmvfc_fail_request(evt, DID_ABORT);
1919                 }
1920                 spin_unlock_irqrestore(vhost->host->host_lock, flags);
1921                 LEAVE;
1922                 return SUCCESS;
1923         }
1924
1925         LEAVE;
1926         return FAILED;
1927 }
1928
1929 /**
1930  * ibmvfc_dev_cancel_all - Device iterated cancel all function
1931  * @sdev:       scsi device struct
1932  * @data:       return code
1933  *
1934  **/
1935 static void ibmvfc_dev_cancel_all(struct scsi_device *sdev, void *data)
1936 {
1937         unsigned long *rc = data;
1938         *rc |= ibmvfc_cancel_all(sdev, IBMVFC_TMF_TGT_RESET);
1939 }
1940
1941 /**
1942  * ibmvfc_dev_abort_all - Device iterated abort task set function
1943  * @sdev:       scsi device struct
1944  * @data:       return code
1945  *
1946  **/
1947 static void ibmvfc_dev_abort_all(struct scsi_device *sdev, void *data)
1948 {
1949         unsigned long *rc = data;
1950         *rc |= ibmvfc_abort_task_set(sdev);
1951 }
1952
1953 /**
1954  * ibmvfc_eh_target_reset_handler - Reset the target
1955  * @cmd:        scsi command struct
1956  *
1957  * Returns:
1958  *      SUCCESS / FAILED
1959  **/
1960 static int ibmvfc_eh_target_reset_handler(struct scsi_cmnd *cmd)
1961 {
1962         struct ibmvfc_host *vhost = shost_priv(cmd->device->host);
1963         struct scsi_target *starget = scsi_target(cmd->device);
1964         struct ibmvfc_event *evt, *pos;
1965         int reset_rc;
1966         unsigned long cancel_rc = 0;
1967         unsigned long flags;
1968
1969         ENTER;
1970         ibmvfc_wait_while_resetting(vhost);
1971         starget_for_each_device(starget, &cancel_rc, ibmvfc_dev_cancel_all);
1972         reset_rc = ibmvfc_reset_device(cmd->device, IBMVFC_TARGET_RESET, "target");
1973
1974         if (!cancel_rc && !reset_rc) {
1975                 spin_lock_irqsave(vhost->host->host_lock, flags);
1976                 list_for_each_entry_safe(evt, pos, &vhost->sent, queue) {
1977                         if (evt->cmnd && scsi_target(evt->cmnd->device) == starget)
1978                                 ibmvfc_fail_request(evt, DID_ABORT);
1979                 }
1980                 spin_unlock_irqrestore(vhost->host->host_lock, flags);
1981                 LEAVE;
1982                 return SUCCESS;
1983         }
1984
1985         LEAVE;
1986         return FAILED;
1987 }
1988
1989 /**
1990  * ibmvfc_eh_host_reset_handler - Reset the connection to the server
1991  * @cmd:        struct scsi_cmnd having problems
1992  *
1993  **/
1994 static int ibmvfc_eh_host_reset_handler(struct scsi_cmnd *cmd)
1995 {
1996         int rc;
1997         struct ibmvfc_host *vhost = shost_priv(cmd->device->host);
1998
1999         dev_err(vhost->dev, "Resetting connection due to error recovery\n");
2000         rc = ibmvfc_issue_fc_host_lip(vhost->host);
2001         return rc ? FAILED : SUCCESS;
2002 }
2003
2004 /**
2005  * ibmvfc_terminate_rport_io - Terminate all pending I/O to the rport.
2006  * @rport:              rport struct
2007  *
2008  * Return value:
2009  *      none
2010  **/
2011 static void ibmvfc_terminate_rport_io(struct fc_rport *rport)
2012 {
2013         struct scsi_target *starget = to_scsi_target(&rport->dev);
2014         struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
2015         struct ibmvfc_host *vhost = shost_priv(shost);
2016         struct ibmvfc_event *evt, *pos;
2017         unsigned long cancel_rc = 0;
2018         unsigned long abort_rc = 0;
2019         unsigned long flags;
2020
2021         ENTER;
2022         starget_for_each_device(starget, &cancel_rc, ibmvfc_dev_cancel_all);
2023         starget_for_each_device(starget, &abort_rc, ibmvfc_dev_abort_all);
2024
2025         if (!cancel_rc && !abort_rc) {
2026                 spin_lock_irqsave(shost->host_lock, flags);
2027                 list_for_each_entry_safe(evt, pos, &vhost->sent, queue) {
2028                         if (evt->cmnd && scsi_target(evt->cmnd->device) == starget)
2029                                 ibmvfc_fail_request(evt, DID_ABORT);
2030                 }
2031                 spin_unlock_irqrestore(shost->host_lock, flags);
2032         } else
2033                 ibmvfc_issue_fc_host_lip(shost);
2034
2035         scsi_target_unblock(&rport->dev);
2036         LEAVE;
2037 }
2038
2039 static const struct {
2040         enum ibmvfc_async_event ae;
2041         const char *desc;
2042 } ae_desc [] = {
2043         { IBMVFC_AE_ELS_PLOGI,          "PLOGI" },
2044         { IBMVFC_AE_ELS_LOGO,           "LOGO" },
2045         { IBMVFC_AE_ELS_PRLO,           "PRLO" },
2046         { IBMVFC_AE_SCN_NPORT,          "N-Port SCN" },
2047         { IBMVFC_AE_SCN_GROUP,          "Group SCN" },
2048         { IBMVFC_AE_SCN_DOMAIN,         "Domain SCN" },
2049         { IBMVFC_AE_SCN_FABRIC,         "Fabric SCN" },
2050         { IBMVFC_AE_LINK_UP,            "Link Up" },
2051         { IBMVFC_AE_LINK_DOWN,          "Link Down" },
2052         { IBMVFC_AE_LINK_DEAD,          "Link Dead" },
2053         { IBMVFC_AE_HALT,                       "Halt" },
2054         { IBMVFC_AE_RESUME,             "Resume" },
2055         { IBMVFC_AE_ADAPTER_FAILED,     "Adapter Failed" },
2056 };
2057
2058 static const char *unknown_ae = "Unknown async";
2059
2060 /**
2061  * ibmvfc_get_ae_desc - Get text description for async event
2062  * @ae: async event
2063  *
2064  **/
2065 static const char *ibmvfc_get_ae_desc(u64 ae)
2066 {
2067         int i;
2068
2069         for (i = 0; i < ARRAY_SIZE(ae_desc); i++)
2070                 if (ae_desc[i].ae == ae)
2071                         return ae_desc[i].desc;
2072
2073         return unknown_ae;
2074 }
2075
2076 /**
2077  * ibmvfc_handle_async - Handle an async event from the adapter
2078  * @crq:        crq to process
2079  * @vhost:      ibmvfc host struct
2080  *
2081  **/
2082 static void ibmvfc_handle_async(struct ibmvfc_async_crq *crq,
2083                                 struct ibmvfc_host *vhost)
2084 {
2085         const char *desc = ibmvfc_get_ae_desc(crq->event);
2086
2087         ibmvfc_log(vhost, 3, "%s event received\n", desc);
2088
2089         switch (crq->event) {
2090         case IBMVFC_AE_LINK_UP:
2091         case IBMVFC_AE_RESUME:
2092                 vhost->events_to_log |= IBMVFC_AE_LINKUP;
2093                 ibmvfc_init_host(vhost, 1);
2094                 break;
2095         case IBMVFC_AE_SCN_FABRIC:
2096                 vhost->events_to_log |= IBMVFC_AE_RSCN;
2097                 ibmvfc_init_host(vhost, 1);
2098                 break;
2099         case IBMVFC_AE_SCN_NPORT:
2100         case IBMVFC_AE_SCN_GROUP:
2101         case IBMVFC_AE_SCN_DOMAIN:
2102                 vhost->events_to_log |= IBMVFC_AE_RSCN;
2103         case IBMVFC_AE_ELS_LOGO:
2104         case IBMVFC_AE_ELS_PRLO:
2105         case IBMVFC_AE_ELS_PLOGI:
2106                 ibmvfc_reinit_host(vhost);
2107                 break;
2108         case IBMVFC_AE_LINK_DOWN:
2109         case IBMVFC_AE_ADAPTER_FAILED:
2110                 ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN);
2111                 break;
2112         case IBMVFC_AE_LINK_DEAD:
2113                 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
2114                 break;
2115         case IBMVFC_AE_HALT:
2116                 ibmvfc_link_down(vhost, IBMVFC_HALTED);
2117                 break;
2118         default:
2119                 dev_err(vhost->dev, "Unknown async event received: %ld\n", crq->event);
2120                 break;
2121         };
2122 }
2123
2124 /**
2125  * ibmvfc_handle_crq - Handles and frees received events in the CRQ
2126  * @crq:        Command/Response queue
2127  * @vhost:      ibmvfc host struct
2128  *
2129  **/
2130 static void ibmvfc_handle_crq(struct ibmvfc_crq *crq, struct ibmvfc_host *vhost)
2131 {
2132         long rc;
2133         struct ibmvfc_event *evt = (struct ibmvfc_event *)crq->ioba;
2134
2135         switch (crq->valid) {
2136         case IBMVFC_CRQ_INIT_RSP:
2137                 switch (crq->format) {
2138                 case IBMVFC_CRQ_INIT:
2139                         dev_info(vhost->dev, "Partner initialized\n");
2140                         /* Send back a response */
2141                         rc = ibmvfc_send_crq_init_complete(vhost);
2142                         if (rc == 0)
2143                                 ibmvfc_init_host(vhost, 0);
2144                         else
2145                                 dev_err(vhost->dev, "Unable to send init rsp. rc=%ld\n", rc);
2146                         break;
2147                 case IBMVFC_CRQ_INIT_COMPLETE:
2148                         dev_info(vhost->dev, "Partner initialization complete\n");
2149                         ibmvfc_init_host(vhost, 0);
2150                         break;
2151                 default:
2152                         dev_err(vhost->dev, "Unknown crq message type: %d\n", crq->format);
2153                 }
2154                 return;
2155         case IBMVFC_CRQ_XPORT_EVENT:
2156                 vhost->state = IBMVFC_NO_CRQ;
2157                 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE);
2158                 if (crq->format == IBMVFC_PARTITION_MIGRATED) {
2159                         /* We need to re-setup the interpartition connection */
2160                         dev_info(vhost->dev, "Re-enabling adapter\n");
2161                         vhost->client_migrated = 1;
2162                         ibmvfc_purge_requests(vhost, DID_REQUEUE);
2163                         if ((rc = ibmvfc_reenable_crq_queue(vhost)) ||
2164                             (rc = ibmvfc_send_crq_init(vhost))) {
2165                                 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
2166                                 dev_err(vhost->dev, "Error after enable (rc=%ld)\n", rc);
2167                         } else
2168                                 ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN);
2169                 } else {
2170                         dev_err(vhost->dev, "Virtual adapter failed (rc=%d)\n", crq->format);
2171
2172                         ibmvfc_purge_requests(vhost, DID_ERROR);
2173                         if ((rc = ibmvfc_reset_crq(vhost)) ||
2174                             (rc = ibmvfc_send_crq_init(vhost))) {
2175                                 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
2176                                 dev_err(vhost->dev, "Error after reset (rc=%ld)\n", rc);
2177                         } else
2178                                 ibmvfc_link_down(vhost, IBMVFC_LINK_DOWN);
2179                 }
2180                 return;
2181         case IBMVFC_CRQ_CMD_RSP:
2182                 break;
2183         default:
2184                 dev_err(vhost->dev, "Got an invalid message type 0x%02x\n", crq->valid);
2185                 return;
2186         }
2187
2188         if (crq->format == IBMVFC_ASYNC_EVENT)
2189                 return;
2190
2191         /* The only kind of payload CRQs we should get are responses to
2192          * things we send. Make sure this response is to something we
2193          * actually sent
2194          */
2195         if (unlikely(!ibmvfc_valid_event(&vhost->pool, evt))) {
2196                 dev_err(vhost->dev, "Returned correlation_token 0x%08lx is invalid!\n",
2197                         crq->ioba);
2198                 return;
2199         }
2200
2201         if (unlikely(atomic_read(&evt->free))) {
2202                 dev_err(vhost->dev, "Received duplicate correlation_token 0x%08lx!\n",
2203                         crq->ioba);
2204                 return;
2205         }
2206
2207         del_timer(&evt->timer);
2208         list_del(&evt->queue);
2209         ibmvfc_trc_end(evt);
2210         evt->done(evt);
2211 }
2212
2213 /**
2214  * ibmvfc_scan_finished - Check if the device scan is done.
2215  * @shost:      scsi host struct
2216  * @time:       current elapsed time
2217  *
2218  * Returns:
2219  *      0 if scan is not done / 1 if scan is done
2220  **/
2221 static int ibmvfc_scan_finished(struct Scsi_Host *shost, unsigned long time)
2222 {
2223         unsigned long flags;
2224         struct ibmvfc_host *vhost = shost_priv(shost);
2225         int done = 0;
2226
2227         spin_lock_irqsave(shost->host_lock, flags);
2228         if (time >= (init_timeout * HZ)) {
2229                 dev_info(vhost->dev, "Scan taking longer than %d seconds, "
2230                          "continuing initialization\n", init_timeout);
2231                 done = 1;
2232         }
2233
2234         if (vhost->state != IBMVFC_NO_CRQ && vhost->action == IBMVFC_HOST_ACTION_NONE)
2235                 done = 1;
2236         spin_unlock_irqrestore(shost->host_lock, flags);
2237         return done;
2238 }
2239
2240 /**
2241  * ibmvfc_slave_alloc - Setup the device's task set value
2242  * @sdev:       struct scsi_device device to configure
2243  *
2244  * Set the device's task set value so that error handling works as
2245  * expected.
2246  *
2247  * Returns:
2248  *      0 on success / -ENXIO if device does not exist
2249  **/
2250 static int ibmvfc_slave_alloc(struct scsi_device *sdev)
2251 {
2252         struct Scsi_Host *shost = sdev->host;
2253         struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
2254         struct ibmvfc_host *vhost = shost_priv(shost);
2255         unsigned long flags = 0;
2256
2257         if (!rport || fc_remote_port_chkready(rport))
2258                 return -ENXIO;
2259
2260         spin_lock_irqsave(shost->host_lock, flags);
2261         sdev->hostdata = (void *)(unsigned long)vhost->task_set++;
2262         spin_unlock_irqrestore(shost->host_lock, flags);
2263         return 0;
2264 }
2265
2266 /**
2267  * ibmvfc_slave_configure - Configure the device
2268  * @sdev:       struct scsi_device device to configure
2269  *
2270  * Enable allow_restart for a device if it is a disk. Adjust the
2271  * queue_depth here also.
2272  *
2273  * Returns:
2274  *      0
2275  **/
2276 static int ibmvfc_slave_configure(struct scsi_device *sdev)
2277 {
2278         struct Scsi_Host *shost = sdev->host;
2279         struct fc_rport *rport = starget_to_rport(sdev->sdev_target);
2280         unsigned long flags = 0;
2281
2282         spin_lock_irqsave(shost->host_lock, flags);
2283         if (sdev->type == TYPE_DISK)
2284                 sdev->allow_restart = 1;
2285
2286         if (sdev->tagged_supported) {
2287                 scsi_set_tag_type(sdev, MSG_SIMPLE_TAG);
2288                 scsi_activate_tcq(sdev, sdev->queue_depth);
2289         } else
2290                 scsi_deactivate_tcq(sdev, sdev->queue_depth);
2291
2292         rport->dev_loss_tmo = dev_loss_tmo;
2293         spin_unlock_irqrestore(shost->host_lock, flags);
2294         return 0;
2295 }
2296
2297 /**
2298  * ibmvfc_change_queue_depth - Change the device's queue depth
2299  * @sdev:       scsi device struct
2300  * @qdepth:     depth to set
2301  *
2302  * Return value:
2303  *      actual depth set
2304  **/
2305 static int ibmvfc_change_queue_depth(struct scsi_device *sdev, int qdepth)
2306 {
2307         if (qdepth > IBMVFC_MAX_CMDS_PER_LUN)
2308                 qdepth = IBMVFC_MAX_CMDS_PER_LUN;
2309
2310         scsi_adjust_queue_depth(sdev, 0, qdepth);
2311         return sdev->queue_depth;
2312 }
2313
2314 /**
2315  * ibmvfc_change_queue_type - Change the device's queue type
2316  * @sdev:               scsi device struct
2317  * @tag_type:   type of tags to use
2318  *
2319  * Return value:
2320  *      actual queue type set
2321  **/
2322 static int ibmvfc_change_queue_type(struct scsi_device *sdev, int tag_type)
2323 {
2324         if (sdev->tagged_supported) {
2325                 scsi_set_tag_type(sdev, tag_type);
2326
2327                 if (tag_type)
2328                         scsi_activate_tcq(sdev, sdev->queue_depth);
2329                 else
2330                         scsi_deactivate_tcq(sdev, sdev->queue_depth);
2331         } else
2332                 tag_type = 0;
2333
2334         return tag_type;
2335 }
2336
2337 static ssize_t ibmvfc_show_host_partition_name(struct device *dev,
2338                                                  struct device_attribute *attr, char *buf)
2339 {
2340         struct Scsi_Host *shost = class_to_shost(dev);
2341         struct ibmvfc_host *vhost = shost_priv(shost);
2342
2343         return snprintf(buf, PAGE_SIZE, "%s\n",
2344                         vhost->login_buf->resp.partition_name);
2345 }
2346
2347 static struct device_attribute ibmvfc_host_partition_name = {
2348         .attr = {
2349                 .name = "partition_name",
2350                 .mode = S_IRUGO,
2351         },
2352         .show = ibmvfc_show_host_partition_name,
2353 };
2354
2355 static ssize_t ibmvfc_show_host_device_name(struct device *dev,
2356                                             struct device_attribute *attr, char *buf)
2357 {
2358         struct Scsi_Host *shost = class_to_shost(dev);
2359         struct ibmvfc_host *vhost = shost_priv(shost);
2360
2361         return snprintf(buf, PAGE_SIZE, "%s\n",
2362                         vhost->login_buf->resp.device_name);
2363 }
2364
2365 static struct device_attribute ibmvfc_host_device_name = {
2366         .attr = {
2367                 .name = "device_name",
2368                 .mode = S_IRUGO,
2369         },
2370         .show = ibmvfc_show_host_device_name,
2371 };
2372
2373 static ssize_t ibmvfc_show_host_loc_code(struct device *dev,
2374                                          struct device_attribute *attr, char *buf)
2375 {
2376         struct Scsi_Host *shost = class_to_shost(dev);
2377         struct ibmvfc_host *vhost = shost_priv(shost);
2378
2379         return snprintf(buf, PAGE_SIZE, "%s\n",
2380                         vhost->login_buf->resp.port_loc_code);
2381 }
2382
2383 static struct device_attribute ibmvfc_host_loc_code = {
2384         .attr = {
2385                 .name = "port_loc_code",
2386                 .mode = S_IRUGO,
2387         },
2388         .show = ibmvfc_show_host_loc_code,
2389 };
2390
2391 static ssize_t ibmvfc_show_host_drc_name(struct device *dev,
2392                                          struct device_attribute *attr, char *buf)
2393 {
2394         struct Scsi_Host *shost = class_to_shost(dev);
2395         struct ibmvfc_host *vhost = shost_priv(shost);
2396
2397         return snprintf(buf, PAGE_SIZE, "%s\n",
2398                         vhost->login_buf->resp.drc_name);
2399 }
2400
2401 static struct device_attribute ibmvfc_host_drc_name = {
2402         .attr = {
2403                 .name = "drc_name",
2404                 .mode = S_IRUGO,
2405         },
2406         .show = ibmvfc_show_host_drc_name,
2407 };
2408
2409 static ssize_t ibmvfc_show_host_npiv_version(struct device *dev,
2410                                              struct device_attribute *attr, char *buf)
2411 {
2412         struct Scsi_Host *shost = class_to_shost(dev);
2413         struct ibmvfc_host *vhost = shost_priv(shost);
2414         return snprintf(buf, PAGE_SIZE, "%d\n", vhost->login_buf->resp.version);
2415 }
2416
2417 static struct device_attribute ibmvfc_host_npiv_version = {
2418         .attr = {
2419                 .name = "npiv_version",
2420                 .mode = S_IRUGO,
2421         },
2422         .show = ibmvfc_show_host_npiv_version,
2423 };
2424
2425 /**
2426  * ibmvfc_show_log_level - Show the adapter's error logging level
2427  * @dev:        class device struct
2428  * @buf:        buffer
2429  *
2430  * Return value:
2431  *      number of bytes printed to buffer
2432  **/
2433 static ssize_t ibmvfc_show_log_level(struct device *dev,
2434                                      struct device_attribute *attr, char *buf)
2435 {
2436         struct Scsi_Host *shost = class_to_shost(dev);
2437         struct ibmvfc_host *vhost = shost_priv(shost);
2438         unsigned long flags = 0;
2439         int len;
2440
2441         spin_lock_irqsave(shost->host_lock, flags);
2442         len = snprintf(buf, PAGE_SIZE, "%d\n", vhost->log_level);
2443         spin_unlock_irqrestore(shost->host_lock, flags);
2444         return len;
2445 }
2446
2447 /**
2448  * ibmvfc_store_log_level - Change the adapter's error logging level
2449  * @dev:        class device struct
2450  * @buf:        buffer
2451  *
2452  * Return value:
2453  *      number of bytes printed to buffer
2454  **/
2455 static ssize_t ibmvfc_store_log_level(struct device *dev,
2456                                       struct device_attribute *attr,
2457                                       const char *buf, size_t count)
2458 {
2459         struct Scsi_Host *shost = class_to_shost(dev);
2460         struct ibmvfc_host *vhost = shost_priv(shost);
2461         unsigned long flags = 0;
2462
2463         spin_lock_irqsave(shost->host_lock, flags);
2464         vhost->log_level = simple_strtoul(buf, NULL, 10);
2465         spin_unlock_irqrestore(shost->host_lock, flags);
2466         return strlen(buf);
2467 }
2468
2469 static struct device_attribute ibmvfc_log_level_attr = {
2470         .attr = {
2471                 .name =         "log_level",
2472                 .mode =         S_IRUGO | S_IWUSR,
2473         },
2474         .show = ibmvfc_show_log_level,
2475         .store = ibmvfc_store_log_level
2476 };
2477
2478 #ifdef CONFIG_SCSI_IBMVFC_TRACE
2479 /**
2480  * ibmvfc_read_trace - Dump the adapter trace
2481  * @kobj:               kobject struct
2482  * @bin_attr:   bin_attribute struct
2483  * @buf:                buffer
2484  * @off:                offset
2485  * @count:              buffer size
2486  *
2487  * Return value:
2488  *      number of bytes printed to buffer
2489  **/
2490 static ssize_t ibmvfc_read_trace(struct kobject *kobj,
2491                                  struct bin_attribute *bin_attr,
2492                                  char *buf, loff_t off, size_t count)
2493 {
2494         struct device *dev = container_of(kobj, struct device, kobj);
2495         struct Scsi_Host *shost = class_to_shost(dev);
2496         struct ibmvfc_host *vhost = shost_priv(shost);
2497         unsigned long flags = 0;
2498         int size = IBMVFC_TRACE_SIZE;
2499         char *src = (char *)vhost->trace;
2500
2501         if (off > size)
2502                 return 0;
2503         if (off + count > size) {
2504                 size -= off;
2505                 count = size;
2506         }
2507
2508         spin_lock_irqsave(shost->host_lock, flags);
2509         memcpy(buf, &src[off], count);
2510         spin_unlock_irqrestore(shost->host_lock, flags);
2511         return count;
2512 }
2513
2514 static struct bin_attribute ibmvfc_trace_attr = {
2515         .attr = {
2516                 .name = "trace",
2517                 .mode = S_IRUGO,
2518         },
2519         .size = 0,
2520         .read = ibmvfc_read_trace,
2521 };
2522 #endif
2523
2524 static struct device_attribute *ibmvfc_attrs[] = {
2525         &ibmvfc_host_partition_name,
2526         &ibmvfc_host_device_name,
2527         &ibmvfc_host_loc_code,
2528         &ibmvfc_host_drc_name,
2529         &ibmvfc_host_npiv_version,
2530         &ibmvfc_log_level_attr,
2531         NULL
2532 };
2533
2534 static struct scsi_host_template driver_template = {
2535         .module = THIS_MODULE,
2536         .name = "IBM POWER Virtual FC Adapter",
2537         .proc_name = IBMVFC_NAME,
2538         .queuecommand = ibmvfc_queuecommand,
2539         .eh_abort_handler = ibmvfc_eh_abort_handler,
2540         .eh_device_reset_handler = ibmvfc_eh_device_reset_handler,
2541         .eh_target_reset_handler = ibmvfc_eh_target_reset_handler,
2542         .eh_host_reset_handler = ibmvfc_eh_host_reset_handler,
2543         .slave_alloc = ibmvfc_slave_alloc,
2544         .slave_configure = ibmvfc_slave_configure,
2545         .scan_finished = ibmvfc_scan_finished,
2546         .change_queue_depth = ibmvfc_change_queue_depth,
2547         .change_queue_type = ibmvfc_change_queue_type,
2548         .cmd_per_lun = 16,
2549         .can_queue = IBMVFC_MAX_REQUESTS_DEFAULT,
2550         .this_id = -1,
2551         .sg_tablesize = SG_ALL,
2552         .max_sectors = IBMVFC_MAX_SECTORS,
2553         .use_clustering = ENABLE_CLUSTERING,
2554         .shost_attrs = ibmvfc_attrs,
2555 };
2556
2557 /**
2558  * ibmvfc_next_async_crq - Returns the next entry in async queue
2559  * @vhost:      ibmvfc host struct
2560  *
2561  * Returns:
2562  *      Pointer to next entry in queue / NULL if empty
2563  **/
2564 static struct ibmvfc_async_crq *ibmvfc_next_async_crq(struct ibmvfc_host *vhost)
2565 {
2566         struct ibmvfc_async_crq_queue *async_crq = &vhost->async_crq;
2567         struct ibmvfc_async_crq *crq;
2568
2569         crq = &async_crq->msgs[async_crq->cur];
2570         if (crq->valid & 0x80) {
2571                 if (++async_crq->cur == async_crq->size)
2572                         async_crq->cur = 0;
2573         } else
2574                 crq = NULL;
2575
2576         return crq;
2577 }
2578
2579 /**
2580  * ibmvfc_next_crq - Returns the next entry in message queue
2581  * @vhost:      ibmvfc host struct
2582  *
2583  * Returns:
2584  *      Pointer to next entry in queue / NULL if empty
2585  **/
2586 static struct ibmvfc_crq *ibmvfc_next_crq(struct ibmvfc_host *vhost)
2587 {
2588         struct ibmvfc_crq_queue *queue = &vhost->crq;
2589         struct ibmvfc_crq *crq;
2590
2591         crq = &queue->msgs[queue->cur];
2592         if (crq->valid & 0x80) {
2593                 if (++queue->cur == queue->size)
2594                         queue->cur = 0;
2595         } else
2596                 crq = NULL;
2597
2598         return crq;
2599 }
2600
2601 /**
2602  * ibmvfc_interrupt - Interrupt handler
2603  * @irq:                number of irq to handle, not used
2604  * @dev_instance: ibmvfc_host that received interrupt
2605  *
2606  * Returns:
2607  *      IRQ_HANDLED
2608  **/
2609 static irqreturn_t ibmvfc_interrupt(int irq, void *dev_instance)
2610 {
2611         struct ibmvfc_host *vhost = (struct ibmvfc_host *)dev_instance;
2612         struct vio_dev *vdev = to_vio_dev(vhost->dev);
2613         struct ibmvfc_crq *crq;
2614         struct ibmvfc_async_crq *async;
2615         unsigned long flags;
2616         int done = 0;
2617
2618         spin_lock_irqsave(vhost->host->host_lock, flags);
2619         vio_disable_interrupts(to_vio_dev(vhost->dev));
2620         while (!done) {
2621                 /* Pull all the valid messages off the CRQ */
2622                 while ((crq = ibmvfc_next_crq(vhost)) != NULL) {
2623                         ibmvfc_handle_crq(crq, vhost);
2624                         crq->valid = 0;
2625                 }
2626
2627                 /* Pull all the valid messages off the async CRQ */
2628                 while ((async = ibmvfc_next_async_crq(vhost)) != NULL) {
2629                         ibmvfc_handle_async(async, vhost);
2630                         async->valid = 0;
2631                 }
2632
2633                 vio_enable_interrupts(vdev);
2634                 if ((crq = ibmvfc_next_crq(vhost)) != NULL) {
2635                         vio_disable_interrupts(vdev);
2636                         ibmvfc_handle_crq(crq, vhost);
2637                         crq->valid = 0;
2638                 } else if ((async = ibmvfc_next_async_crq(vhost)) != NULL) {
2639                         vio_disable_interrupts(vdev);
2640                         ibmvfc_handle_async(async, vhost);
2641                         crq->valid = 0;
2642                 } else
2643                         done = 1;
2644         }
2645
2646         spin_unlock_irqrestore(vhost->host->host_lock, flags);
2647         return IRQ_HANDLED;
2648 }
2649
2650 /**
2651  * ibmvfc_init_tgt - Set the next init job step for the target
2652  * @tgt:                ibmvfc target struct
2653  * @job_step:   job step to perform
2654  *
2655  **/
2656 static void ibmvfc_init_tgt(struct ibmvfc_target *tgt,
2657                             void (*job_step) (struct ibmvfc_target *))
2658 {
2659         ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_INIT);
2660         tgt->job_step = job_step;
2661         wake_up(&tgt->vhost->work_wait_q);
2662 }
2663
2664 /**
2665  * ibmvfc_retry_tgt_init - Attempt to retry a step in target initialization
2666  * @tgt:                ibmvfc target struct
2667  * @job_step:   initialization job step
2668  *
2669  **/
2670 static void ibmvfc_retry_tgt_init(struct ibmvfc_target *tgt,
2671                                   void (*job_step) (struct ibmvfc_target *))
2672 {
2673         if (++tgt->init_retries > IBMVFC_MAX_INIT_RETRIES) {
2674                 ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DEL_RPORT);
2675                 wake_up(&tgt->vhost->work_wait_q);
2676         } else
2677                 ibmvfc_init_tgt(tgt, job_step);
2678 }
2679
2680 /**
2681  * ibmvfc_tgt_prli_done - Completion handler for Process Login
2682  * @evt:        ibmvfc event struct
2683  *
2684  **/
2685 static void ibmvfc_tgt_prli_done(struct ibmvfc_event *evt)
2686 {
2687         struct ibmvfc_target *tgt = evt->tgt;
2688         struct ibmvfc_host *vhost = evt->vhost;
2689         struct ibmvfc_process_login *rsp = &evt->xfer_iu->prli;
2690         u32 status = rsp->common.status;
2691
2692         vhost->discovery_threads--;
2693         ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
2694         switch (status) {
2695         case IBMVFC_MAD_SUCCESS:
2696                 tgt_dbg(tgt, "Process Login succeeded\n");
2697                 tgt->need_login = 0;
2698                 ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_ADD_RPORT);
2699                 break;
2700         case IBMVFC_MAD_DRIVER_FAILED:
2701                 break;
2702         case IBMVFC_MAD_CRQ_ERROR:
2703                 ibmvfc_retry_tgt_init(tgt, ibmvfc_tgt_send_prli);
2704                 break;
2705         case IBMVFC_MAD_FAILED:
2706         default:
2707                 tgt_err(tgt, "Process Login failed: %s (%x:%x) rc=0x%02X\n",
2708                         ibmvfc_get_cmd_error(rsp->status, rsp->error),
2709                         rsp->status, rsp->error, status);
2710                 if (ibmvfc_retry_cmd(rsp->status, rsp->error))
2711                         ibmvfc_retry_tgt_init(tgt, ibmvfc_tgt_send_prli);
2712                 break;
2713         };
2714
2715         kref_put(&tgt->kref, ibmvfc_release_tgt);
2716         ibmvfc_free_event(evt);
2717         wake_up(&vhost->work_wait_q);
2718 }
2719
2720 /**
2721  * ibmvfc_tgt_send_prli - Send a process login
2722  * @tgt:        ibmvfc target struct
2723  *
2724  **/
2725 static void ibmvfc_tgt_send_prli(struct ibmvfc_target *tgt)
2726 {
2727         struct ibmvfc_process_login *prli;
2728         struct ibmvfc_host *vhost = tgt->vhost;
2729         struct ibmvfc_event *evt;
2730
2731         if (vhost->discovery_threads >= disc_threads)
2732                 return;
2733
2734         kref_get(&tgt->kref);
2735         evt = ibmvfc_get_event(vhost);
2736         vhost->discovery_threads++;
2737         ibmvfc_init_event(evt, ibmvfc_tgt_prli_done, IBMVFC_MAD_FORMAT);
2738         evt->tgt = tgt;
2739         prli = &evt->iu.prli;
2740         memset(prli, 0, sizeof(*prli));
2741         prli->common.version = 1;
2742         prli->common.opcode = IBMVFC_PROCESS_LOGIN;
2743         prli->common.length = sizeof(*prli);
2744         prli->scsi_id = tgt->scsi_id;
2745
2746         prli->parms.type = IBMVFC_SCSI_FCP_TYPE;
2747         prli->parms.flags = IBMVFC_PRLI_EST_IMG_PAIR;
2748         prli->parms.service_parms = IBMVFC_PRLI_INITIATOR_FUNC;
2749
2750         ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_INIT_WAIT);
2751         if (ibmvfc_send_event(evt, vhost, default_timeout)) {
2752                 vhost->discovery_threads--;
2753                 ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
2754                 kref_put(&tgt->kref, ibmvfc_release_tgt);
2755         } else
2756                 tgt_dbg(tgt, "Sent process login\n");
2757 }
2758
2759 /**
2760  * ibmvfc_tgt_plogi_done - Completion handler for Port Login
2761  * @evt:        ibmvfc event struct
2762  *
2763  **/
2764 static void ibmvfc_tgt_plogi_done(struct ibmvfc_event *evt)
2765 {
2766         struct ibmvfc_target *tgt = evt->tgt;
2767         struct ibmvfc_host *vhost = evt->vhost;
2768         struct ibmvfc_port_login *rsp = &evt->xfer_iu->plogi;
2769         u32 status = rsp->common.status;
2770
2771         vhost->discovery_threads--;
2772         ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
2773         switch (status) {
2774         case IBMVFC_MAD_SUCCESS:
2775                 tgt_dbg(tgt, "Port Login succeeded\n");
2776                 if (tgt->ids.port_name &&
2777                     tgt->ids.port_name != wwn_to_u64(rsp->service_parms.port_name)) {
2778                         vhost->reinit = 1;
2779                         tgt_dbg(tgt, "Port re-init required\n");
2780                         break;
2781                 }
2782                 tgt->ids.node_name = wwn_to_u64(rsp->service_parms.node_name);
2783                 tgt->ids.port_name = wwn_to_u64(rsp->service_parms.port_name);
2784                 tgt->ids.port_id = tgt->scsi_id;
2785                 tgt->ids.roles = FC_PORT_ROLE_FCP_TARGET;
2786                 memcpy(&tgt->service_parms, &rsp->service_parms,
2787                        sizeof(tgt->service_parms));
2788                 memcpy(&tgt->service_parms_change, &rsp->service_parms_change,
2789                        sizeof(tgt->service_parms_change));
2790                 ibmvfc_init_tgt(tgt, ibmvfc_tgt_send_prli);
2791                 break;
2792         case IBMVFC_MAD_DRIVER_FAILED:
2793                 break;
2794         case IBMVFC_MAD_CRQ_ERROR:
2795                 ibmvfc_retry_tgt_init(tgt, ibmvfc_tgt_send_plogi);
2796                 break;
2797         case IBMVFC_MAD_FAILED:
2798         default:
2799                 tgt_err(tgt, "Port Login failed: %s (%x:%x) %s (%x) %s (%x) rc=0x%02X\n",
2800                         ibmvfc_get_cmd_error(rsp->status, rsp->error), rsp->status, rsp->error,
2801                         ibmvfc_get_fc_type(rsp->fc_type), rsp->fc_type,
2802                         ibmvfc_get_ls_explain(rsp->fc_explain), rsp->fc_explain, status);
2803
2804                 if (ibmvfc_retry_cmd(rsp->status, rsp->error))
2805                         ibmvfc_retry_tgt_init(tgt, ibmvfc_tgt_send_plogi);
2806                 break;
2807         };
2808
2809         kref_put(&tgt->kref, ibmvfc_release_tgt);
2810         ibmvfc_free_event(evt);
2811         wake_up(&vhost->work_wait_q);
2812 }
2813
2814 /**
2815  * ibmvfc_tgt_send_plogi - Send PLOGI to the specified target
2816  * @tgt:        ibmvfc target struct
2817  *
2818  **/
2819 static void ibmvfc_tgt_send_plogi(struct ibmvfc_target *tgt)
2820 {
2821         struct ibmvfc_port_login *plogi;
2822         struct ibmvfc_host *vhost = tgt->vhost;
2823         struct ibmvfc_event *evt;
2824
2825         if (vhost->discovery_threads >= disc_threads)
2826                 return;
2827
2828         kref_get(&tgt->kref);
2829         evt = ibmvfc_get_event(vhost);
2830         vhost->discovery_threads++;
2831         ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_INIT_WAIT);
2832         ibmvfc_init_event(evt, ibmvfc_tgt_plogi_done, IBMVFC_MAD_FORMAT);
2833         evt->tgt = tgt;
2834         plogi = &evt->iu.plogi;
2835         memset(plogi, 0, sizeof(*plogi));
2836         plogi->common.version = 1;
2837         plogi->common.opcode = IBMVFC_PORT_LOGIN;
2838         plogi->common.length = sizeof(*plogi);
2839         plogi->scsi_id = tgt->scsi_id;
2840
2841         if (ibmvfc_send_event(evt, vhost, default_timeout)) {
2842                 vhost->discovery_threads--;
2843                 ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
2844                 kref_put(&tgt->kref, ibmvfc_release_tgt);
2845         } else
2846                 tgt_dbg(tgt, "Sent port login\n");
2847 }
2848
2849 /**
2850  * ibmvfc_tgt_implicit_logout_done - Completion handler for Implicit Logout MAD
2851  * @evt:        ibmvfc event struct
2852  *
2853  **/
2854 static void ibmvfc_tgt_implicit_logout_done(struct ibmvfc_event *evt)
2855 {
2856         struct ibmvfc_target *tgt = evt->tgt;
2857         struct ibmvfc_host *vhost = evt->vhost;
2858         struct ibmvfc_implicit_logout *rsp = &evt->xfer_iu->implicit_logout;
2859         u32 status = rsp->common.status;
2860
2861         vhost->discovery_threads--;
2862         ibmvfc_free_event(evt);
2863         ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
2864
2865         switch (status) {
2866         case IBMVFC_MAD_SUCCESS:
2867                 tgt_dbg(tgt, "Implicit Logout succeeded\n");
2868                 break;
2869         case IBMVFC_MAD_DRIVER_FAILED:
2870                 kref_put(&tgt->kref, ibmvfc_release_tgt);
2871                 wake_up(&vhost->work_wait_q);
2872                 return;
2873         case IBMVFC_MAD_FAILED:
2874         default:
2875                 tgt_err(tgt, "Implicit Logout failed: rc=0x%02X\n", status);
2876                 break;
2877         };
2878
2879         if (vhost->action == IBMVFC_HOST_ACTION_TGT_INIT)
2880                 ibmvfc_init_tgt(tgt, ibmvfc_tgt_send_plogi);
2881         else if (vhost->action == IBMVFC_HOST_ACTION_QUERY_TGTS &&
2882                  tgt->scsi_id != tgt->new_scsi_id)
2883                 ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DEL_RPORT);
2884         kref_put(&tgt->kref, ibmvfc_release_tgt);
2885         wake_up(&vhost->work_wait_q);
2886 }
2887
2888 /**
2889  * ibmvfc_tgt_implicit_logout - Initiate an Implicit Logout for specified target
2890  * @tgt:                ibmvfc target struct
2891  *
2892  **/
2893 static void ibmvfc_tgt_implicit_logout(struct ibmvfc_target *tgt)
2894 {
2895         struct ibmvfc_implicit_logout *mad;
2896         struct ibmvfc_host *vhost = tgt->vhost;
2897         struct ibmvfc_event *evt;
2898
2899         if (vhost->discovery_threads >= disc_threads)
2900                 return;
2901
2902         kref_get(&tgt->kref);
2903         evt = ibmvfc_get_event(vhost);
2904         vhost->discovery_threads++;
2905         ibmvfc_init_event(evt, ibmvfc_tgt_implicit_logout_done, IBMVFC_MAD_FORMAT);
2906         evt->tgt = tgt;
2907         mad = &evt->iu.implicit_logout;
2908         memset(mad, 0, sizeof(*mad));
2909         mad->common.version = 1;
2910         mad->common.opcode = IBMVFC_IMPLICIT_LOGOUT;
2911         mad->common.length = sizeof(*mad);
2912         mad->old_scsi_id = tgt->scsi_id;
2913
2914         ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_INIT_WAIT);
2915         if (ibmvfc_send_event(evt, vhost, default_timeout)) {
2916                 vhost->discovery_threads--;
2917                 ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
2918                 kref_put(&tgt->kref, ibmvfc_release_tgt);
2919         } else
2920                 tgt_dbg(tgt, "Sent Implicit Logout\n");
2921 }
2922
2923 /**
2924  * ibmvfc_adisc_needs_plogi - Does device need PLOGI?
2925  * @mad:        ibmvfc passthru mad struct
2926  * @tgt:        ibmvfc target struct
2927  *
2928  * Returns:
2929  *      1 if PLOGI needed / 0 if PLOGI not needed
2930  **/
2931 static int ibmvfc_adisc_needs_plogi(struct ibmvfc_passthru_mad *mad,
2932                                     struct ibmvfc_target *tgt)
2933 {
2934         if (memcmp(&mad->fc_iu.response[2], &tgt->ids.port_name,
2935                    sizeof(tgt->ids.port_name)))
2936                 return 1;
2937         if (memcmp(&mad->fc_iu.response[4], &tgt->ids.node_name,
2938                    sizeof(tgt->ids.node_name)))
2939                 return 1;
2940         if (mad->fc_iu.response[6] != tgt->scsi_id)
2941                 return 1;
2942         return 0;
2943 }
2944
2945 /**
2946  * ibmvfc_tgt_adisc_done - Completion handler for ADISC
2947  * @evt:        ibmvfc event struct
2948  *
2949  **/
2950 static void ibmvfc_tgt_adisc_done(struct ibmvfc_event *evt)
2951 {
2952         struct ibmvfc_target *tgt = evt->tgt;
2953         struct ibmvfc_host *vhost = evt->vhost;
2954         struct ibmvfc_passthru_mad *mad = &evt->xfer_iu->passthru;
2955         u32 status = mad->common.status;
2956         u8 fc_reason, fc_explain;
2957
2958         vhost->discovery_threads--;
2959         ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
2960
2961         switch (status) {
2962         case IBMVFC_MAD_SUCCESS:
2963                 tgt_dbg(tgt, "ADISC succeeded\n");
2964                 if (ibmvfc_adisc_needs_plogi(mad, tgt))
2965                         tgt->need_login = 1;
2966                 break;
2967         case IBMVFC_MAD_DRIVER_FAILED:
2968                 break;
2969         case IBMVFC_MAD_FAILED:
2970         default:
2971                 tgt->need_login = 1;
2972                 fc_reason = (mad->fc_iu.response[1] & 0x00ff0000) >> 16;
2973                 fc_explain = (mad->fc_iu.response[1] & 0x0000ff00) >> 8;
2974                 tgt_info(tgt, "ADISC failed: %s (%x:%x) %s (%x) %s (%x) rc=0x%02X\n",
2975                          ibmvfc_get_cmd_error(mad->iu.status, mad->iu.error),
2976                          mad->iu.status, mad->iu.error,
2977                          ibmvfc_get_fc_type(fc_reason), fc_reason,
2978                          ibmvfc_get_ls_explain(fc_explain), fc_explain, status);
2979                 break;
2980         };
2981
2982         kref_put(&tgt->kref, ibmvfc_release_tgt);
2983         ibmvfc_free_event(evt);
2984         wake_up(&vhost->work_wait_q);
2985 }
2986
2987 /**
2988  * ibmvfc_init_passthru - Initialize an event struct for FC passthru
2989  * @evt:                ibmvfc event struct
2990  *
2991  **/
2992 static void ibmvfc_init_passthru(struct ibmvfc_event *evt)
2993 {
2994         struct ibmvfc_passthru_mad *mad = &evt->iu.passthru;
2995
2996         memset(mad, 0, sizeof(*mad));
2997         mad->common.version = 1;
2998         mad->common.opcode = IBMVFC_PASSTHRU;
2999         mad->common.length = sizeof(*mad) - sizeof(mad->fc_iu) - sizeof(mad->iu);
3000         mad->cmd_ioba.va = (u64)evt->crq.ioba +
3001                 offsetof(struct ibmvfc_passthru_mad, iu);
3002         mad->cmd_ioba.len = sizeof(mad->iu);
3003         mad->iu.cmd_len = sizeof(mad->fc_iu.payload);
3004         mad->iu.rsp_len = sizeof(mad->fc_iu.response);
3005         mad->iu.cmd.va = (u64)evt->crq.ioba +
3006                 offsetof(struct ibmvfc_passthru_mad, fc_iu) +
3007                 offsetof(struct ibmvfc_passthru_fc_iu, payload);
3008         mad->iu.cmd.len = sizeof(mad->fc_iu.payload);
3009         mad->iu.rsp.va = (u64)evt->crq.ioba +
3010                 offsetof(struct ibmvfc_passthru_mad, fc_iu) +
3011                 offsetof(struct ibmvfc_passthru_fc_iu, response);
3012         mad->iu.rsp.len = sizeof(mad->fc_iu.response);
3013 }
3014
3015 /**
3016  * ibmvfc_tgt_adisc - Initiate an ADISC for specified target
3017  * @tgt:                ibmvfc target struct
3018  *
3019  **/
3020 static void ibmvfc_tgt_adisc(struct ibmvfc_target *tgt)
3021 {
3022         struct ibmvfc_passthru_mad *mad;
3023         struct ibmvfc_host *vhost = tgt->vhost;
3024         struct ibmvfc_event *evt;
3025
3026         if (vhost->discovery_threads >= disc_threads)
3027                 return;
3028
3029         kref_get(&tgt->kref);
3030         evt = ibmvfc_get_event(vhost);
3031         vhost->discovery_threads++;
3032         ibmvfc_init_event(evt, ibmvfc_tgt_adisc_done, IBMVFC_MAD_FORMAT);
3033         evt->tgt = tgt;
3034
3035         ibmvfc_init_passthru(evt);
3036         mad = &evt->iu.passthru;
3037         mad->iu.flags = IBMVFC_FC_ELS;
3038         mad->iu.scsi_id = tgt->scsi_id;
3039
3040         mad->fc_iu.payload[0] = IBMVFC_ADISC;
3041         memcpy(&mad->fc_iu.payload[2], &vhost->login_buf->resp.port_name,
3042                sizeof(vhost->login_buf->resp.port_name));
3043         memcpy(&mad->fc_iu.payload[4], &vhost->login_buf->resp.node_name,
3044                sizeof(vhost->login_buf->resp.node_name));
3045         mad->fc_iu.payload[6] = vhost->login_buf->resp.scsi_id & 0x00ffffff;
3046
3047         ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_INIT_WAIT);
3048         if (ibmvfc_send_event(evt, vhost, default_timeout)) {
3049                 vhost->discovery_threads--;
3050                 ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
3051                 kref_put(&tgt->kref, ibmvfc_release_tgt);
3052         } else
3053                 tgt_dbg(tgt, "Sent ADISC\n");
3054 }
3055
3056 /**
3057  * ibmvfc_tgt_query_target_done - Completion handler for Query Target MAD
3058  * @evt:        ibmvfc event struct
3059  *
3060  **/
3061 static void ibmvfc_tgt_query_target_done(struct ibmvfc_event *evt)
3062 {
3063         struct ibmvfc_target *tgt = evt->tgt;
3064         struct ibmvfc_host *vhost = evt->vhost;
3065         struct ibmvfc_query_tgt *rsp = &evt->xfer_iu->query_tgt;
3066         u32 status = rsp->common.status;
3067
3068         vhost->discovery_threads--;
3069         ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
3070         switch (status) {
3071         case IBMVFC_MAD_SUCCESS:
3072                 tgt_dbg(tgt, "Query Target succeeded\n");
3073                 tgt->new_scsi_id = rsp->scsi_id;
3074                 if (rsp->scsi_id != tgt->scsi_id)
3075                         ibmvfc_init_tgt(tgt, ibmvfc_tgt_implicit_logout);
3076                 else
3077                         ibmvfc_init_tgt(tgt, ibmvfc_tgt_adisc);
3078                 break;
3079         case IBMVFC_MAD_DRIVER_FAILED:
3080                 break;
3081         case IBMVFC_MAD_CRQ_ERROR:
3082                 ibmvfc_retry_tgt_init(tgt, ibmvfc_tgt_query_target);
3083                 break;
3084         case IBMVFC_MAD_FAILED:
3085         default:
3086                 tgt_err(tgt, "Query Target failed: %s (%x:%x) %s (%x) %s (%x) rc=0x%02X\n",
3087                         ibmvfc_get_cmd_error(rsp->status, rsp->error), rsp->status, rsp->error,
3088                         ibmvfc_get_fc_type(rsp->fc_type), rsp->fc_type,
3089                         ibmvfc_get_gs_explain(rsp->fc_explain), rsp->fc_explain, status);
3090
3091                 if ((rsp->status & IBMVFC_FABRIC_MAPPED) == IBMVFC_FABRIC_MAPPED &&
3092                     rsp->error == IBMVFC_UNABLE_TO_PERFORM_REQ &&
3093                     rsp->fc_explain == IBMVFC_PORT_NAME_NOT_REG)
3094                         ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DEL_RPORT);
3095                 else if (ibmvfc_retry_cmd(rsp->status, rsp->error))
3096                         ibmvfc_retry_tgt_init(tgt, ibmvfc_tgt_query_target);
3097                 break;
3098         };
3099
3100         kref_put(&tgt->kref, ibmvfc_release_tgt);
3101         ibmvfc_free_event(evt);
3102         wake_up(&vhost->work_wait_q);
3103 }
3104
3105 /**
3106  * ibmvfc_tgt_query_target - Initiate a Query Target for specified target
3107  * @tgt:        ibmvfc target struct
3108  *
3109  **/
3110 static void ibmvfc_tgt_query_target(struct ibmvfc_target *tgt)
3111 {
3112         struct ibmvfc_query_tgt *query_tgt;
3113         struct ibmvfc_host *vhost = tgt->vhost;
3114         struct ibmvfc_event *evt;
3115
3116         if (vhost->discovery_threads >= disc_threads)
3117                 return;
3118
3119         kref_get(&tgt->kref);
3120         evt = ibmvfc_get_event(vhost);
3121         vhost->discovery_threads++;
3122         evt->tgt = tgt;
3123         ibmvfc_init_event(evt, ibmvfc_tgt_query_target_done, IBMVFC_MAD_FORMAT);
3124         query_tgt = &evt->iu.query_tgt;
3125         memset(query_tgt, 0, sizeof(*query_tgt));
3126         query_tgt->common.version = 1;
3127         query_tgt->common.opcode = IBMVFC_QUERY_TARGET;
3128         query_tgt->common.length = sizeof(*query_tgt);
3129         query_tgt->wwpn = tgt->ids.port_name;
3130
3131         ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_INIT_WAIT);
3132         if (ibmvfc_send_event(evt, vhost, default_timeout)) {
3133                 vhost->discovery_threads--;
3134                 ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
3135                 kref_put(&tgt->kref, ibmvfc_release_tgt);
3136         } else
3137                 tgt_dbg(tgt, "Sent Query Target\n");
3138 }
3139
3140 /**
3141  * ibmvfc_alloc_target - Allocate and initialize an ibmvfc target
3142  * @vhost:              ibmvfc host struct
3143  * @scsi_id:    SCSI ID to allocate target for
3144  *
3145  * Returns:
3146  *      0 on success / other on failure
3147  **/
3148 static int ibmvfc_alloc_target(struct ibmvfc_host *vhost, u64 scsi_id)
3149 {
3150         struct ibmvfc_target *tgt;
3151         unsigned long flags;
3152
3153         spin_lock_irqsave(vhost->host->host_lock, flags);
3154         list_for_each_entry(tgt, &vhost->targets, queue) {
3155                 if (tgt->scsi_id == scsi_id) {
3156                         if (tgt->need_login)
3157                                 ibmvfc_init_tgt(tgt, ibmvfc_tgt_implicit_logout);
3158                         goto unlock_out;
3159                 }
3160         }
3161         spin_unlock_irqrestore(vhost->host->host_lock, flags);
3162
3163         tgt = mempool_alloc(vhost->tgt_pool, GFP_KERNEL);
3164         if (!tgt) {
3165                 dev_err(vhost->dev, "Target allocation failure for scsi id %08lx\n",
3166                         scsi_id);
3167                 return -ENOMEM;
3168         }
3169
3170         tgt->scsi_id = scsi_id;
3171         tgt->new_scsi_id = scsi_id;
3172         tgt->vhost = vhost;
3173         tgt->need_login = 1;
3174         kref_init(&tgt->kref);
3175         ibmvfc_init_tgt(tgt, ibmvfc_tgt_implicit_logout);
3176         spin_lock_irqsave(vhost->host->host_lock, flags);
3177         list_add_tail(&tgt->queue, &vhost->targets);
3178
3179 unlock_out:
3180         spin_unlock_irqrestore(vhost->host->host_lock, flags);
3181         return 0;
3182 }
3183
3184 /**
3185  * ibmvfc_alloc_targets - Allocate and initialize ibmvfc targets
3186  * @vhost:              ibmvfc host struct
3187  *
3188  * Returns:
3189  *      0 on success / other on failure
3190  **/
3191 static int ibmvfc_alloc_targets(struct ibmvfc_host *vhost)
3192 {
3193         int i, rc;
3194
3195         for (i = 0, rc = 0; !rc && i < vhost->num_targets; i++)
3196                 rc = ibmvfc_alloc_target(vhost,
3197                                          vhost->disc_buf->scsi_id[i] & IBMVFC_DISC_TGT_SCSI_ID_MASK);
3198
3199         return rc;
3200 }
3201
3202 /**
3203  * ibmvfc_discover_targets_done - Completion handler for discover targets MAD
3204  * @evt:        ibmvfc event struct
3205  *
3206  **/
3207 static void ibmvfc_discover_targets_done(struct ibmvfc_event *evt)
3208 {
3209         struct ibmvfc_host *vhost = evt->vhost;
3210         struct ibmvfc_discover_targets *rsp = &evt->xfer_iu->discover_targets;
3211         u32 mad_status = rsp->common.status;
3212
3213         switch (mad_status) {
3214         case IBMVFC_MAD_SUCCESS:
3215                 ibmvfc_dbg(vhost, "Discover Targets succeeded\n");
3216                 vhost->num_targets = rsp->num_written;
3217                 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_ALLOC_TGTS);
3218                 break;
3219         case IBMVFC_MAD_FAILED:
3220                 dev_err(vhost->dev, "Discover Targets failed: %s (%x:%x)\n",
3221                         ibmvfc_get_cmd_error(rsp->status, rsp->error), rsp->status, rsp->error);
3222                 ibmvfc_retry_host_init(vhost);
3223                 break;
3224         case IBMVFC_MAD_DRIVER_FAILED:
3225                 break;
3226         default:
3227                 dev_err(vhost->dev, "Invalid Discover Targets response: 0x%x\n", mad_status);
3228                 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
3229                 break;
3230         }
3231
3232         ibmvfc_free_event(evt);
3233         wake_up(&vhost->work_wait_q);
3234 }
3235
3236 /**
3237  * ibmvfc_discover_targets - Send Discover Targets MAD
3238  * @vhost:      ibmvfc host struct
3239  *
3240  **/
3241 static void ibmvfc_discover_targets(struct ibmvfc_host *vhost)
3242 {
3243         struct ibmvfc_discover_targets *mad;
3244         struct ibmvfc_event *evt = ibmvfc_get_event(vhost);
3245
3246         ibmvfc_init_event(evt, ibmvfc_discover_targets_done, IBMVFC_MAD_FORMAT);
3247         mad = &evt->iu.discover_targets;
3248         memset(mad, 0, sizeof(*mad));
3249         mad->common.version = 1;
3250         mad->common.opcode = IBMVFC_DISC_TARGETS;
3251         mad->common.length = sizeof(*mad);
3252         mad->bufflen = vhost->disc_buf_sz;
3253         mad->buffer.va = vhost->disc_buf_dma;
3254         mad->buffer.len = vhost->disc_buf_sz;
3255         ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT_WAIT);
3256
3257         if (!ibmvfc_send_event(evt, vhost, default_timeout))
3258                 ibmvfc_dbg(vhost, "Sent discover targets\n");
3259         else
3260                 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
3261 }
3262
3263 /**
3264  * ibmvfc_npiv_login_done - Completion handler for NPIV Login
3265  * @evt:        ibmvfc event struct
3266  *
3267  **/
3268 static void ibmvfc_npiv_login_done(struct ibmvfc_event *evt)
3269 {
3270         struct ibmvfc_host *vhost = evt->vhost;
3271         u32 mad_status = evt->xfer_iu->npiv_login.common.status;
3272         struct ibmvfc_npiv_login_resp *rsp = &vhost->login_buf->resp;
3273         unsigned int npiv_max_sectors;
3274
3275         switch (mad_status) {
3276         case IBMVFC_MAD_SUCCESS:
3277                 ibmvfc_free_event(evt);
3278                 break;
3279         case IBMVFC_MAD_FAILED:
3280                 dev_err(vhost->dev, "NPIV Login failed: %s (%x:%x)\n",
3281                         ibmvfc_get_cmd_error(rsp->status, rsp->error), rsp->status, rsp->error);
3282                 if (ibmvfc_retry_cmd(rsp->status, rsp->error))
3283                         ibmvfc_retry_host_init(vhost);
3284                 else
3285                         ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
3286                 ibmvfc_free_event(evt);
3287                 return;
3288         case IBMVFC_MAD_CRQ_ERROR:
3289                 ibmvfc_retry_host_init(vhost);
3290         case IBMVFC_MAD_DRIVER_FAILED:
3291                 ibmvfc_free_event(evt);
3292                 return;
3293         default:
3294                 dev_err(vhost->dev, "Invalid NPIV Login response: 0x%x\n", mad_status);
3295                 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
3296                 ibmvfc_free_event(evt);
3297                 return;
3298         }
3299
3300         vhost->client_migrated = 0;
3301
3302         if (!(rsp->flags & IBMVFC_NATIVE_FC)) {
3303                 dev_err(vhost->dev, "Virtual adapter does not support FC. %x\n",
3304                         rsp->flags);
3305                 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
3306                 wake_up(&vhost->work_wait_q);
3307                 return;
3308         }
3309
3310         if (rsp->max_cmds <= IBMVFC_NUM_INTERNAL_REQ) {
3311                 dev_err(vhost->dev, "Virtual adapter supported queue depth too small: %d\n",
3312                         rsp->max_cmds);
3313                 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
3314                 wake_up(&vhost->work_wait_q);
3315                 return;
3316         }
3317
3318         npiv_max_sectors = min((uint)(rsp->max_dma_len >> 9), IBMVFC_MAX_SECTORS);
3319         dev_info(vhost->dev, "Host partition: %s, device: %s %s %s max sectors %u\n",
3320                  rsp->partition_name, rsp->device_name, rsp->port_loc_code,
3321                  rsp->drc_name, npiv_max_sectors);
3322
3323         fc_host_fabric_name(vhost->host) = rsp->node_name;
3324         fc_host_node_name(vhost->host) = rsp->node_name;
3325         fc_host_port_name(vhost->host) = rsp->port_name;
3326         fc_host_port_id(vhost->host) = rsp->scsi_id;
3327         fc_host_port_type(vhost->host) = FC_PORTTYPE_NPIV;
3328         fc_host_supported_classes(vhost->host) = 0;
3329         if (rsp->service_parms.class1_parms[0] & 0x80000000)
3330                 fc_host_supported_classes(vhost->host) |= FC_COS_CLASS1;
3331         if (rsp->service_parms.class2_parms[0] & 0x80000000)
3332                 fc_host_supported_classes(vhost->host) |= FC_COS_CLASS2;
3333         if (rsp->service_parms.class3_parms[0] & 0x80000000)
3334                 fc_host_supported_classes(vhost->host) |= FC_COS_CLASS3;
3335         fc_host_maxframe_size(vhost->host) =
3336                 rsp->service_parms.common.bb_rcv_sz & 0x0fff;
3337
3338         vhost->host->can_queue = rsp->max_cmds - IBMVFC_NUM_INTERNAL_REQ;
3339         vhost->host->max_sectors = npiv_max_sectors;
3340         ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY);
3341         wake_up(&vhost->work_wait_q);
3342 }
3343
3344 /**
3345  * ibmvfc_npiv_login - Sends NPIV login
3346  * @vhost:      ibmvfc host struct
3347  *
3348  **/
3349 static void ibmvfc_npiv_login(struct ibmvfc_host *vhost)
3350 {
3351         struct ibmvfc_npiv_login_mad *mad;
3352         struct ibmvfc_event *evt = ibmvfc_get_event(vhost);
3353
3354         ibmvfc_gather_partition_info(vhost);
3355         ibmvfc_set_login_info(vhost);
3356         ibmvfc_init_event(evt, ibmvfc_npiv_login_done, IBMVFC_MAD_FORMAT);
3357
3358         memcpy(vhost->login_buf, &vhost->login_info, sizeof(vhost->login_info));
3359         mad = &evt->iu.npiv_login;
3360         memset(mad, 0, sizeof(struct ibmvfc_npiv_login_mad));
3361         mad->common.version = 1;
3362         mad->common.opcode = IBMVFC_NPIV_LOGIN;
3363         mad->common.length = sizeof(struct ibmvfc_npiv_login_mad);
3364         mad->buffer.va = vhost->login_buf_dma;
3365         mad->buffer.len = sizeof(*vhost->login_buf);
3366
3367         ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT_WAIT);
3368
3369         if (!ibmvfc_send_event(evt, vhost, default_timeout))
3370                 ibmvfc_dbg(vhost, "Sent NPIV login\n");
3371         else
3372                 ibmvfc_link_down(vhost, IBMVFC_LINK_DEAD);
3373 };
3374
3375 /**
3376  * ibmvfc_dev_init_to_do - Is there target initialization work to do?
3377  * @vhost:              ibmvfc host struct
3378  *
3379  * Returns:
3380  *      1 if work to do / 0 if not
3381  **/
3382 static int ibmvfc_dev_init_to_do(struct ibmvfc_host *vhost)
3383 {
3384         struct ibmvfc_target *tgt;
3385
3386         list_for_each_entry(tgt, &vhost->targets, queue) {
3387                 if (tgt->action == IBMVFC_TGT_ACTION_INIT ||
3388                     tgt->action == IBMVFC_TGT_ACTION_INIT_WAIT)
3389                         return 1;
3390         }
3391
3392         return 0;
3393 }
3394
3395 /**
3396  * __ibmvfc_work_to_do - Is there task level work to do? (no locking)
3397  * @vhost:              ibmvfc host struct
3398  *
3399  * Returns:
3400  *      1 if work to do / 0 if not
3401  **/
3402 static int __ibmvfc_work_to_do(struct ibmvfc_host *vhost)
3403 {
3404         struct ibmvfc_target *tgt;
3405
3406         if (kthread_should_stop())
3407                 return 1;
3408         switch (vhost->action) {
3409         case IBMVFC_HOST_ACTION_NONE:
3410         case IBMVFC_HOST_ACTION_INIT_WAIT:
3411                 return 0;
3412         case IBMVFC_HOST_ACTION_TGT_INIT:
3413         case IBMVFC_HOST_ACTION_QUERY_TGTS:
3414                 if (vhost->discovery_threads == disc_threads)
3415                         return 0;
3416                 list_for_each_entry(tgt, &vhost->targets, queue)
3417                         if (tgt->action == IBMVFC_TGT_ACTION_INIT)
3418                                 return 1;
3419                 list_for_each_entry(tgt, &vhost->targets, queue)
3420                         if (tgt->action == IBMVFC_TGT_ACTION_INIT_WAIT)
3421                                 return 0;
3422                 return 1;
3423         case IBMVFC_HOST_ACTION_INIT:
3424         case IBMVFC_HOST_ACTION_ALLOC_TGTS:
3425         case IBMVFC_HOST_ACTION_TGT_ADD:
3426         case IBMVFC_HOST_ACTION_TGT_DEL:
3427         case IBMVFC_HOST_ACTION_QUERY:
3428         default:
3429                 break;
3430         };
3431
3432         return 1;
3433 }
3434
3435 /**
3436  * ibmvfc_work_to_do - Is there task level work to do?
3437  * @vhost:              ibmvfc host struct
3438  *
3439  * Returns:
3440  *      1 if work to do / 0 if not
3441  **/
3442 static int ibmvfc_work_to_do(struct ibmvfc_host *vhost)
3443 {
3444         unsigned long flags;
3445         int rc;
3446
3447         spin_lock_irqsave(vhost->host->host_lock, flags);
3448         rc = __ibmvfc_work_to_do(vhost);
3449         spin_unlock_irqrestore(vhost->host->host_lock, flags);
3450         return rc;
3451 }
3452
3453 /**
3454  * ibmvfc_log_ae - Log async events if necessary
3455  * @vhost:              ibmvfc host struct
3456  * @events:             events to log
3457  *
3458  **/
3459 static void ibmvfc_log_ae(struct ibmvfc_host *vhost, int events)
3460 {
3461         if (events & IBMVFC_AE_RSCN)
3462                 fc_host_post_event(vhost->host, fc_get_event_number(), FCH_EVT_RSCN, 0);
3463         if ((events & IBMVFC_AE_LINKDOWN) &&
3464             vhost->state >= IBMVFC_HALTED)
3465                 fc_host_post_event(vhost->host, fc_get_event_number(), FCH_EVT_LINKDOWN, 0);
3466         if ((events & IBMVFC_AE_LINKUP) &&
3467             vhost->state == IBMVFC_INITIALIZING)
3468                 fc_host_post_event(vhost->host, fc_get_event_number(), FCH_EVT_LINKUP, 0);
3469 }
3470
3471 /**
3472  * ibmvfc_tgt_add_rport - Tell the FC transport about a new remote port
3473  * @tgt:                ibmvfc target struct
3474  *
3475  **/
3476 static void ibmvfc_tgt_add_rport(struct ibmvfc_target *tgt)
3477 {
3478         struct ibmvfc_host *vhost = tgt->vhost;
3479         struct fc_rport *rport;
3480         unsigned long flags;
3481
3482         tgt_dbg(tgt, "Adding rport\n");
3483         rport = fc_remote_port_add(vhost->host, 0, &tgt->ids);
3484         spin_lock_irqsave(vhost->host->host_lock, flags);
3485         tgt->rport = rport;
3486         ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_NONE);
3487         if (rport) {
3488                 tgt_dbg(tgt, "rport add succeeded\n");
3489                 rport->maxframe_size = tgt->service_parms.common.bb_rcv_sz & 0x0fff;
3490                 rport->supported_classes = 0;
3491                 tgt->target_id = rport->scsi_target_id;
3492                 if (tgt->service_parms.class1_parms[0] & 0x80000000)
3493                         rport->supported_classes |= FC_COS_CLASS1;
3494                 if (tgt->service_parms.class2_parms[0] & 0x80000000)
3495                         rport->supported_classes |= FC_COS_CLASS2;
3496                 if (tgt->service_parms.class3_parms[0] & 0x80000000)
3497                         rport->supported_classes |= FC_COS_CLASS3;
3498         } else
3499                 tgt_dbg(tgt, "rport add failed\n");
3500         spin_unlock_irqrestore(vhost->host->host_lock, flags);
3501 }
3502
3503 /**
3504  * ibmvfc_do_work - Do task level work
3505  * @vhost:              ibmvfc host struct
3506  *
3507  **/
3508 static void ibmvfc_do_work(struct ibmvfc_host *vhost)
3509 {
3510         struct ibmvfc_target *tgt;
3511         unsigned long flags;
3512         struct fc_rport *rport;
3513
3514         ibmvfc_log_ae(vhost, vhost->events_to_log);
3515         spin_lock_irqsave(vhost->host->host_lock, flags);
3516         vhost->events_to_log = 0;
3517         switch (vhost->action) {
3518         case IBMVFC_HOST_ACTION_NONE:
3519         case IBMVFC_HOST_ACTION_INIT_WAIT:
3520                 break;
3521         case IBMVFC_HOST_ACTION_INIT:
3522                 BUG_ON(vhost->state != IBMVFC_INITIALIZING);
3523                 vhost->job_step(vhost);
3524                 break;
3525         case IBMVFC_HOST_ACTION_QUERY:
3526                 list_for_each_entry(tgt, &vhost->targets, queue)
3527                         ibmvfc_init_tgt(tgt, ibmvfc_tgt_query_target);
3528                 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY_TGTS);
3529                 break;
3530         case IBMVFC_HOST_ACTION_QUERY_TGTS:
3531                 list_for_each_entry(tgt, &vhost->targets, queue) {
3532                         if (tgt->action == IBMVFC_TGT_ACTION_INIT) {
3533                                 tgt->job_step(tgt);
3534                                 break;
3535                         }
3536                 }
3537
3538                 if (!ibmvfc_dev_init_to_do(vhost))
3539                         ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_DEL);
3540                 break;
3541         case IBMVFC_HOST_ACTION_TGT_DEL:
3542                 list_for_each_entry(tgt, &vhost->targets, queue) {
3543                         if (tgt->action == IBMVFC_TGT_ACTION_DEL_RPORT) {
3544                                 tgt_dbg(tgt, "Deleting rport\n");
3545                                 rport = tgt->rport;
3546                                 tgt->rport = NULL;
3547                                 list_del(&tgt->queue);
3548                                 spin_unlock_irqrestore(vhost->host->host_lock, flags);
3549                                 if (rport)
3550                                         fc_remote_port_delete(rport);
3551                                 kref_put(&tgt->kref, ibmvfc_release_tgt);
3552                                 return;
3553                         }
3554                 }
3555
3556                 if (vhost->state == IBMVFC_INITIALIZING) {
3557                         ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT);
3558                         vhost->job_step = ibmvfc_discover_targets;
3559                 } else {
3560                         ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE);
3561                         spin_unlock_irqrestore(vhost->host->host_lock, flags);
3562                         scsi_unblock_requests(vhost->host);
3563                         wake_up(&vhost->init_wait_q);
3564                         return;
3565                 }
3566                 break;
3567         case IBMVFC_HOST_ACTION_ALLOC_TGTS:
3568                 ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_INIT);
3569                 spin_unlock_irqrestore(vhost->host->host_lock, flags);
3570                 ibmvfc_alloc_targets(vhost);
3571                 spin_lock_irqsave(vhost->host->host_lock, flags);
3572                 break;
3573         case IBMVFC_HOST_ACTION_TGT_INIT:
3574                 list_for_each_entry(tgt, &vhost->targets, queue) {
3575                         if (tgt->action == IBMVFC_TGT_ACTION_INIT) {
3576                                 tgt->job_step(tgt);
3577                                 break;
3578                         }
3579                 }
3580
3581                 if (!ibmvfc_dev_init_to_do(vhost)) {
3582                         ibmvfc_set_host_state(vhost, IBMVFC_ACTIVE);
3583                         ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_ADD);
3584                         vhost->init_retries = 0;
3585                         spin_unlock_irqrestore(vhost->host->host_lock, flags);
3586                         scsi_unblock_requests(vhost->host);
3587                         return;
3588                 }
3589                 break;
3590         case IBMVFC_HOST_ACTION_TGT_ADD:
3591                 list_for_each_entry(tgt, &vhost->targets, queue) {
3592                         if (tgt->action == IBMVFC_TGT_ACTION_ADD_RPORT) {
3593                                 spin_unlock_irqrestore(vhost->host->host_lock, flags);
3594                                 ibmvfc_tgt_add_rport(tgt);
3595                                 return;
3596                         } else if (tgt->action == IBMVFC_TGT_ACTION_DEL_RPORT) {
3597                                 tgt_dbg(tgt, "Deleting rport\n");
3598                                 rport = tgt->rport;
3599                                 tgt->rport = NULL;
3600                                 list_del(&tgt->queue);
3601                                 spin_unlock_irqrestore(vhost->host->host_lock, flags);
3602                                 if (rport)
3603                                         fc_remote_port_delete(rport);
3604                                 kref_put(&tgt->kref, ibmvfc_release_tgt);
3605                                 return;
3606                         }
3607                 }
3608
3609                 if (vhost->reinit && !ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) {
3610                         vhost->reinit = 0;
3611                         scsi_block_requests(vhost->host);
3612                         ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY);
3613                 } else {
3614                         ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE);
3615                         wake_up(&vhost->init_wait_q);
3616                 }
3617                 break;
3618         default:
3619                 break;
3620         };
3621
3622         spin_unlock_irqrestore(vhost->host->host_lock, flags);
3623 }
3624
3625 /**
3626  * ibmvfc_work - Do task level work
3627  * @data:               ibmvfc host struct
3628  *
3629  * Returns:
3630  *      zero
3631  **/
3632 static int ibmvfc_work(void *data)
3633 {
3634         struct ibmvfc_host *vhost = data;
3635         int rc;
3636
3637         set_user_nice(current, -20);
3638
3639         while (1) {
3640                 rc = wait_event_interruptible(vhost->work_wait_q,
3641                                               ibmvfc_work_to_do(vhost));
3642
3643                 BUG_ON(rc);
3644
3645                 if (kthread_should_stop())
3646                         break;
3647
3648                 ibmvfc_do_work(vhost);
3649         }
3650
3651         ibmvfc_dbg(vhost, "ibmvfc kthread exiting...\n");
3652         return 0;
3653 }
3654
3655 /**
3656  * ibmvfc_init_crq - Initializes and registers CRQ with hypervisor
3657  * @vhost:      ibmvfc host struct
3658  *
3659  * Allocates a page for messages, maps it for dma, and registers
3660  * the crq with the hypervisor.
3661  *
3662  * Return value:
3663  *      zero on success / other on failure
3664  **/
3665 static int ibmvfc_init_crq(struct ibmvfc_host *vhost)
3666 {
3667         int rc, retrc = -ENOMEM;
3668         struct device *dev = vhost->dev;
3669         struct vio_dev *vdev = to_vio_dev(dev);
3670         struct ibmvfc_crq_queue *crq = &vhost->crq;
3671
3672         ENTER;
3673         crq->msgs = (struct ibmvfc_crq *)get_zeroed_page(GFP_KERNEL);
3674
3675         if (!crq->msgs)
3676                 return -ENOMEM;
3677
3678         crq->size = PAGE_SIZE / sizeof(*crq->msgs);
3679         crq->msg_token = dma_map_single(dev, crq->msgs,
3680                                         PAGE_SIZE, DMA_BIDIRECTIONAL);
3681
3682         if (dma_mapping_error(dev, crq->msg_token))
3683                 goto map_failed;
3684
3685         retrc = rc = plpar_hcall_norets(H_REG_CRQ, vdev->unit_address,
3686                                         crq->msg_token, PAGE_SIZE);
3687
3688         if (rc == H_RESOURCE)
3689                 /* maybe kexecing and resource is busy. try a reset */
3690                 retrc = rc = ibmvfc_reset_crq(vhost);
3691
3692         if (rc == H_CLOSED)
3693                 dev_warn(dev, "Partner adapter not ready\n");
3694         else if (rc) {
3695                 dev_warn(dev, "Error %d opening adapter\n", rc);
3696                 goto reg_crq_failed;
3697         }
3698
3699         retrc = 0;
3700
3701         if ((rc = request_irq(vdev->irq, ibmvfc_interrupt, 0, IBMVFC_NAME, vhost))) {
3702                 dev_err(dev, "Couldn't register irq 0x%x. rc=%d\n", vdev->irq, rc);
3703                 goto req_irq_failed;
3704         }
3705
3706         if ((rc = vio_enable_interrupts(vdev))) {
3707                 dev_err(dev, "Error %d enabling interrupts\n", rc);
3708                 goto req_irq_failed;
3709         }
3710
3711         crq->cur = 0;
3712         LEAVE;
3713         return retrc;
3714
3715 req_irq_failed:
3716         do {
3717                 rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address);
3718         } while (rc == H_BUSY || H_IS_LONG_BUSY(rc));
3719 reg_crq_failed:
3720         dma_unmap_single(dev, crq->msg_token, PAGE_SIZE, DMA_BIDIRECTIONAL);
3721 map_failed:
3722         free_page((unsigned long)crq->msgs);
3723         return retrc;
3724 }
3725
3726 /**
3727  * ibmvfc_free_mem - Free memory for vhost
3728  * @vhost:      ibmvfc host struct
3729  *
3730  * Return value:
3731  *      none
3732  **/
3733 static void ibmvfc_free_mem(struct ibmvfc_host *vhost)
3734 {
3735         struct ibmvfc_async_crq_queue *async_q = &vhost->async_crq;
3736
3737         ENTER;
3738         mempool_destroy(vhost->tgt_pool);
3739         kfree(vhost->trace);
3740         dma_free_coherent(vhost->dev, vhost->disc_buf_sz, vhost->disc_buf,
3741                           vhost->disc_buf_dma);
3742         dma_free_coherent(vhost->dev, sizeof(*vhost->login_buf),
3743                           vhost->login_buf, vhost->login_buf_dma);
3744         dma_pool_destroy(vhost->sg_pool);
3745         dma_unmap_single(vhost->dev, async_q->msg_token,
3746                          async_q->size * sizeof(*async_q->msgs), DMA_BIDIRECTIONAL);
3747         free_page((unsigned long)async_q->msgs);
3748         LEAVE;
3749 }
3750
3751 /**
3752  * ibmvfc_alloc_mem - Allocate memory for vhost
3753  * @vhost:      ibmvfc host struct
3754  *
3755  * Return value:
3756  *      0 on success / non-zero on failure
3757  **/
3758 static int ibmvfc_alloc_mem(struct ibmvfc_host *vhost)
3759 {
3760         struct ibmvfc_async_crq_queue *async_q = &vhost->async_crq;
3761         struct device *dev = vhost->dev;
3762
3763         ENTER;
3764         async_q->msgs = (struct ibmvfc_async_crq *)get_zeroed_page(GFP_KERNEL);
3765         if (!async_q->msgs) {
3766                 dev_err(dev, "Couldn't allocate async queue.\n");
3767                 goto nomem;
3768         }
3769
3770         async_q->size = PAGE_SIZE / sizeof(struct ibmvfc_async_crq);
3771         async_q->msg_token = dma_map_single(dev, async_q->msgs,
3772                                             async_q->size * sizeof(*async_q->msgs),
3773                                             DMA_BIDIRECTIONAL);
3774
3775         if (dma_mapping_error(dev, async_q->msg_token)) {
3776                 dev_err(dev, "Failed to map async queue\n");
3777                 goto free_async_crq;
3778         }
3779
3780         vhost->sg_pool = dma_pool_create(IBMVFC_NAME, dev,
3781                                          SG_ALL * sizeof(struct srp_direct_buf),
3782                                          sizeof(struct srp_direct_buf), 0);
3783
3784         if (!vhost->sg_pool) {
3785                 dev_err(dev, "Failed to allocate sg pool\n");
3786                 goto unmap_async_crq;
3787         }
3788
3789         vhost->login_buf = dma_alloc_coherent(dev, sizeof(*vhost->login_buf),
3790                                               &vhost->login_buf_dma, GFP_KERNEL);
3791
3792         if (!vhost->login_buf) {
3793                 dev_err(dev, "Couldn't allocate NPIV login buffer\n");
3794                 goto free_sg_pool;
3795         }
3796
3797         vhost->disc_buf_sz = sizeof(vhost->disc_buf->scsi_id[0]) * max_targets;
3798         vhost->disc_buf = dma_alloc_coherent(dev, vhost->disc_buf_sz,
3799                                              &vhost->disc_buf_dma, GFP_KERNEL);
3800
3801         if (!vhost->disc_buf) {
3802                 dev_err(dev, "Couldn't allocate Discover Targets buffer\n");
3803                 goto free_login_buffer;
3804         }
3805
3806         vhost->trace = kcalloc(IBMVFC_NUM_TRACE_ENTRIES,
3807                                sizeof(struct ibmvfc_trace_entry), GFP_KERNEL);
3808
3809         if (!vhost->trace)
3810                 goto free_disc_buffer;
3811
3812         vhost->tgt_pool = mempool_create_kzalloc_pool(IBMVFC_TGT_MEMPOOL_SZ,
3813                                                       sizeof(struct ibmvfc_target));
3814
3815         if (!vhost->tgt_pool) {
3816                 dev_err(dev, "Couldn't allocate target memory pool\n");
3817                 goto free_trace;
3818         }
3819
3820         LEAVE;
3821         return 0;
3822
3823 free_trace:
3824         kfree(vhost->trace);
3825 free_disc_buffer:
3826         dma_free_coherent(dev, vhost->disc_buf_sz, vhost->disc_buf,
3827                           vhost->disc_buf_dma);
3828 free_login_buffer:
3829         dma_free_coherent(dev, sizeof(*vhost->login_buf),
3830                           vhost->login_buf, vhost->login_buf_dma);
3831 free_sg_pool:
3832         dma_pool_destroy(vhost->sg_pool);
3833 unmap_async_crq:
3834         dma_unmap_single(dev, async_q->msg_token,
3835                          async_q->size * sizeof(*async_q->msgs), DMA_BIDIRECTIONAL);
3836 free_async_crq:
3837         free_page((unsigned long)async_q->msgs);
3838 nomem:
3839         LEAVE;
3840         return -ENOMEM;
3841 }
3842
3843 /**
3844  * ibmvfc_probe - Adapter hot plug add entry point
3845  * @vdev:       vio device struct
3846  * @id: vio device id struct
3847  *
3848  * Return value:
3849  *      0 on success / non-zero on failure
3850  **/
3851 static int ibmvfc_probe(struct vio_dev *vdev, const struct vio_device_id *id)
3852 {
3853         struct ibmvfc_host *vhost;
3854         struct Scsi_Host *shost;
3855         struct device *dev = &vdev->dev;
3856         int rc = -ENOMEM;
3857
3858         ENTER;
3859         shost = scsi_host_alloc(&driver_template, sizeof(*vhost));
3860         if (!shost) {
3861                 dev_err(dev, "Couldn't allocate host data\n");
3862                 goto out;
3863         }
3864
3865         shost->transportt = ibmvfc_transport_template;
3866         shost->can_queue = max_requests;
3867         shost->max_lun = max_lun;
3868         shost->max_id = max_targets;
3869         shost->max_sectors = IBMVFC_MAX_SECTORS;
3870         shost->max_cmd_len = IBMVFC_MAX_CDB_LEN;
3871         shost->unique_id = shost->host_no;
3872
3873         vhost = shost_priv(shost);
3874         INIT_LIST_HEAD(&vhost->sent);
3875         INIT_LIST_HEAD(&vhost->free);
3876         INIT_LIST_HEAD(&vhost->targets);
3877         sprintf(vhost->name, IBMVFC_NAME);
3878         vhost->host = shost;
3879         vhost->dev = dev;
3880         vhost->partition_number = -1;
3881         vhost->log_level = log_level;
3882         strcpy(vhost->partition_name, "UNKNOWN");
3883         init_waitqueue_head(&vhost->work_wait_q);
3884         init_waitqueue_head(&vhost->init_wait_q);
3885
3886         if ((rc = ibmvfc_alloc_mem(vhost)))
3887                 goto free_scsi_host;
3888
3889         vhost->work_thread = kthread_run(ibmvfc_work, vhost, "%s_%d", IBMVFC_NAME,
3890                                          shost->host_no);
3891
3892         if (IS_ERR(vhost->work_thread)) {
3893                 dev_err(dev, "Couldn't create kernel thread: %ld\n",
3894                         PTR_ERR(vhost->work_thread));
3895                 goto free_host_mem;
3896         }
3897
3898         if ((rc = ibmvfc_init_crq(vhost))) {
3899                 dev_err(dev, "Couldn't initialize crq. rc=%d\n", rc);
3900                 goto kill_kthread;
3901         }
3902
3903         if ((rc = ibmvfc_init_event_pool(vhost))) {
3904                 dev_err(dev, "Couldn't initialize event pool. rc=%d\n", rc);
3905                 goto release_crq;
3906         }
3907
3908         if ((rc = scsi_add_host(shost, dev)))
3909                 goto release_event_pool;
3910
3911         if ((rc = ibmvfc_create_trace_file(&shost->shost_dev.kobj,
3912                                            &ibmvfc_trace_attr))) {
3913                 dev_err(dev, "Failed to create trace file. rc=%d\n", rc);
3914                 goto remove_shost;
3915         }
3916
3917         dev_set_drvdata(dev, vhost);
3918         spin_lock(&ibmvfc_driver_lock);
3919         list_add_tail(&vhost->queue, &ibmvfc_head);
3920         spin_unlock(&ibmvfc_driver_lock);
3921
3922         ibmvfc_send_crq_init(vhost);
3923         scsi_scan_host(shost);
3924         return 0;
3925
3926 remove_shost:
3927         scsi_remove_host(shost);
3928 release_event_pool:
3929         ibmvfc_free_event_pool(vhost);
3930 release_crq:
3931         ibmvfc_release_crq_queue(vhost);
3932 kill_kthread:
3933         kthread_stop(vhost->work_thread);
3934 free_host_mem:
3935         ibmvfc_free_mem(vhost);
3936 free_scsi_host:
3937         scsi_host_put(shost);
3938 out:
3939         LEAVE;
3940         return rc;
3941 }
3942
3943 /**
3944  * ibmvfc_remove - Adapter hot plug remove entry point
3945  * @vdev:       vio device struct
3946  *
3947  * Return value:
3948  *      0
3949  **/
3950 static int ibmvfc_remove(struct vio_dev *vdev)
3951 {
3952         struct ibmvfc_host *vhost = dev_get_drvdata(&vdev->dev);
3953         unsigned long flags;
3954
3955         ENTER;
3956         ibmvfc_remove_trace_file(&vhost->host->shost_dev.kobj, &ibmvfc_trace_attr);
3957         ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE);
3958         ibmvfc_wait_while_resetting(vhost);
3959         ibmvfc_release_crq_queue(vhost);
3960         kthread_stop(vhost->work_thread);
3961         fc_remove_host(vhost->host);
3962         scsi_remove_host(vhost->host);
3963
3964         spin_lock_irqsave(vhost->host->host_lock, flags);
3965         ibmvfc_purge_requests(vhost, DID_ERROR);
3966         ibmvfc_free_event_pool(vhost);
3967         spin_unlock_irqrestore(vhost->host->host_lock, flags);
3968
3969         ibmvfc_free_mem(vhost);
3970         spin_lock(&ibmvfc_driver_lock);
3971         list_del(&vhost->queue);
3972         spin_unlock(&ibmvfc_driver_lock);
3973         scsi_host_put(vhost->host);
3974         LEAVE;
3975         return 0;
3976 }
3977
3978 /**
3979  * ibmvfc_get_desired_dma - Calculate DMA resources needed by the driver
3980  * @vdev:       vio device struct
3981  *
3982  * Return value:
3983  *      Number of bytes the driver will need to DMA map at the same time in
3984  *      order to perform well.
3985  */
3986 static unsigned long ibmvfc_get_desired_dma(struct vio_dev *vdev)
3987 {
3988         unsigned long pool_dma = max_requests * sizeof(union ibmvfc_iu);
3989         return pool_dma + ((512 * 1024) * driver_template.cmd_per_lun);
3990 }
3991
3992 static struct vio_device_id ibmvfc_device_table[] __devinitdata = {
3993         {"fcp", "IBM,vfc-client"},
3994         { "", "" }
3995 };
3996 MODULE_DEVICE_TABLE(vio, ibmvfc_device_table);
3997
3998 static struct vio_driver ibmvfc_driver = {
3999         .id_table = ibmvfc_device_table,
4000         .probe = ibmvfc_probe,
4001         .remove = ibmvfc_remove,
4002         .get_desired_dma = ibmvfc_get_desired_dma,
4003         .driver = {
4004                 .name = IBMVFC_NAME,
4005                 .owner = THIS_MODULE,
4006         }
4007 };
4008
4009 static struct fc_function_template ibmvfc_transport_functions = {
4010         .show_host_fabric_name = 1,
4011         .show_host_node_name = 1,
4012         .show_host_port_name = 1,
4013         .show_host_supported_classes = 1,
4014         .show_host_port_type = 1,
4015         .show_host_port_id = 1,
4016
4017         .get_host_port_state = ibmvfc_get_host_port_state,
4018         .show_host_port_state = 1,
4019
4020         .get_host_speed = ibmvfc_get_host_speed,
4021         .show_host_speed = 1,
4022
4023         .issue_fc_host_lip = ibmvfc_issue_fc_host_lip,
4024         .terminate_rport_io = ibmvfc_terminate_rport_io,
4025
4026         .show_rport_maxframe_size = 1,
4027         .show_rport_supported_classes = 1,
4028
4029         .set_rport_dev_loss_tmo = ibmvfc_set_rport_dev_loss_tmo,
4030         .show_rport_dev_loss_tmo = 1,
4031
4032         .get_starget_node_name = ibmvfc_get_starget_node_name,
4033         .show_starget_node_name = 1,
4034
4035         .get_starget_port_name = ibmvfc_get_starget_port_name,
4036         .show_starget_port_name = 1,
4037
4038         .get_starget_port_id = ibmvfc_get_starget_port_id,
4039         .show_starget_port_id = 1,
4040 };
4041
4042 /**
4043  * ibmvfc_module_init - Initialize the ibmvfc module
4044  *
4045  * Return value:
4046  *      0 on success / other on failure
4047  **/
4048 static int __init ibmvfc_module_init(void)
4049 {
4050         int rc;
4051
4052         if (!firmware_has_feature(FW_FEATURE_VIO))
4053                 return -ENODEV;
4054
4055         printk(KERN_INFO IBMVFC_NAME": IBM Virtual Fibre Channel Driver version: %s %s\n",
4056                IBMVFC_DRIVER_VERSION, IBMVFC_DRIVER_DATE);
4057
4058         ibmvfc_transport_template = fc_attach_transport(&ibmvfc_transport_functions);
4059         if (!ibmvfc_transport_template)
4060                 return -ENOMEM;
4061
4062         rc = vio_register_driver(&ibmvfc_driver);
4063         if (rc)
4064                 fc_release_transport(ibmvfc_transport_template);
4065         return rc;
4066 }
4067
4068 /**
4069  * ibmvfc_module_exit - Teardown the ibmvfc module
4070  *
4071  * Return value:
4072  *      nothing
4073  **/
4074 static void __exit ibmvfc_module_exit(void)
4075 {
4076         vio_unregister_driver(&ibmvfc_driver);
4077         fc_release_transport(ibmvfc_transport_template);
4078 }
4079
4080 module_init(ibmvfc_module_init);
4081 module_exit(ibmvfc_module_exit);