Merge branch 'next/timer' of git://git.linaro.org/people/arnd/arm-soc
[pandora-kernel.git] / drivers / s390 / scsi / zfcp_scsi.c
1 /*
2  * zfcp device driver
3  *
4  * Interface to Linux SCSI midlayer.
5  *
6  * Copyright IBM Corporation 2002, 2010
7  */
8
9 #define KMSG_COMPONENT "zfcp"
10 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
11
12 #include <linux/types.h>
13 #include <linux/slab.h>
14 #include <scsi/fc/fc_fcp.h>
15 #include <scsi/scsi_eh.h>
16 #include <linux/atomic.h>
17 #include "zfcp_ext.h"
18 #include "zfcp_dbf.h"
19 #include "zfcp_fc.h"
20 #include "zfcp_reqlist.h"
21
22 static unsigned int default_depth = 32;
23 module_param_named(queue_depth, default_depth, uint, 0600);
24 MODULE_PARM_DESC(queue_depth, "Default queue depth for new SCSI devices");
25
26 static bool enable_dif;
27 module_param_named(dif, enable_dif, bool, 0400);
28 MODULE_PARM_DESC(dif, "Enable DIF/DIX data integrity support");
29
30 static bool allow_lun_scan = 1;
31 module_param(allow_lun_scan, bool, 0600);
32 MODULE_PARM_DESC(allow_lun_scan, "For NPIV, scan and attach all storage LUNs");
33
34 static int zfcp_scsi_change_queue_depth(struct scsi_device *sdev, int depth,
35                                         int reason)
36 {
37         switch (reason) {
38         case SCSI_QDEPTH_DEFAULT:
39                 scsi_adjust_queue_depth(sdev, scsi_get_tag_type(sdev), depth);
40                 break;
41         case SCSI_QDEPTH_QFULL:
42                 scsi_track_queue_full(sdev, depth);
43                 break;
44         case SCSI_QDEPTH_RAMP_UP:
45                 scsi_adjust_queue_depth(sdev, scsi_get_tag_type(sdev), depth);
46                 break;
47         default:
48                 return -EOPNOTSUPP;
49         }
50         return sdev->queue_depth;
51 }
52
53 static void zfcp_scsi_slave_destroy(struct scsi_device *sdev)
54 {
55         struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
56
57         zfcp_erp_lun_shutdown_wait(sdev, "scssd_1");
58         put_device(&zfcp_sdev->port->dev);
59 }
60
61 static int zfcp_scsi_slave_configure(struct scsi_device *sdp)
62 {
63         if (sdp->tagged_supported)
64                 scsi_adjust_queue_depth(sdp, MSG_SIMPLE_TAG, default_depth);
65         else
66                 scsi_adjust_queue_depth(sdp, 0, 1);
67         return 0;
68 }
69
70 static void zfcp_scsi_command_fail(struct scsi_cmnd *scpnt, int result)
71 {
72         set_host_byte(scpnt, result);
73         zfcp_dbf_scsi_fail_send(scpnt);
74         scpnt->scsi_done(scpnt);
75 }
76
77 static
78 int zfcp_scsi_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scpnt)
79 {
80         struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(scpnt->device);
81         struct fc_rport *rport = starget_to_rport(scsi_target(scpnt->device));
82         int    status, scsi_result, ret;
83
84         /* reset the status for this request */
85         scpnt->result = 0;
86         scpnt->host_scribble = NULL;
87
88         scsi_result = fc_remote_port_chkready(rport);
89         if (unlikely(scsi_result)) {
90                 scpnt->result = scsi_result;
91                 zfcp_dbf_scsi_fail_send(scpnt);
92                 scpnt->scsi_done(scpnt);
93                 return 0;
94         }
95
96         status = atomic_read(&zfcp_sdev->status);
97         if (unlikely(status & ZFCP_STATUS_COMMON_ERP_FAILED) &&
98                      !(atomic_read(&zfcp_sdev->port->status) &
99                        ZFCP_STATUS_COMMON_ERP_FAILED)) {
100                 /* only LUN access denied, but port is good
101                  * not covered by FC transport, have to fail here */
102                 zfcp_scsi_command_fail(scpnt, DID_ERROR);
103                 return 0;
104         }
105
106         if (unlikely(!(status & ZFCP_STATUS_COMMON_UNBLOCKED))) {
107                 /* This could be either
108                  * open LUN pending: this is temporary, will result in
109                  *      open LUN or ERP_FAILED, so retry command
110                  * call to rport_delete pending: mimic retry from
111                  *      fc_remote_port_chkready until rport is BLOCKED
112                  */
113                 zfcp_scsi_command_fail(scpnt, DID_IMM_RETRY);
114                 return 0;
115         }
116
117         ret = zfcp_fsf_fcp_cmnd(scpnt);
118         if (unlikely(ret == -EBUSY))
119                 return SCSI_MLQUEUE_DEVICE_BUSY;
120         else if (unlikely(ret < 0))
121                 return SCSI_MLQUEUE_HOST_BUSY;
122
123         return ret;
124 }
125
126 static int zfcp_scsi_slave_alloc(struct scsi_device *sdev)
127 {
128         struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
129         struct zfcp_adapter *adapter =
130                 (struct zfcp_adapter *) sdev->host->hostdata[0];
131         struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
132         struct zfcp_port *port;
133         struct zfcp_unit *unit;
134         int npiv = adapter->connection_features & FSF_FEATURE_NPIV_MODE;
135
136         port = zfcp_get_port_by_wwpn(adapter, rport->port_name);
137         if (!port)
138                 return -ENXIO;
139
140         unit = zfcp_unit_find(port, zfcp_scsi_dev_lun(sdev));
141         if (unit)
142                 put_device(&unit->dev);
143
144         if (!unit && !(allow_lun_scan && npiv)) {
145                 put_device(&port->dev);
146                 return -ENXIO;
147         }
148
149         zfcp_sdev->port = port;
150         zfcp_sdev->latencies.write.channel.min = 0xFFFFFFFF;
151         zfcp_sdev->latencies.write.fabric.min = 0xFFFFFFFF;
152         zfcp_sdev->latencies.read.channel.min = 0xFFFFFFFF;
153         zfcp_sdev->latencies.read.fabric.min = 0xFFFFFFFF;
154         zfcp_sdev->latencies.cmd.channel.min = 0xFFFFFFFF;
155         zfcp_sdev->latencies.cmd.fabric.min = 0xFFFFFFFF;
156         spin_lock_init(&zfcp_sdev->latencies.lock);
157
158         zfcp_erp_set_lun_status(sdev, ZFCP_STATUS_COMMON_RUNNING);
159         zfcp_erp_lun_reopen(sdev, 0, "scsla_1");
160         zfcp_erp_wait(port->adapter);
161
162         return 0;
163 }
164
165 static int zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt)
166 {
167         struct Scsi_Host *scsi_host = scpnt->device->host;
168         struct zfcp_adapter *adapter =
169                 (struct zfcp_adapter *) scsi_host->hostdata[0];
170         struct zfcp_fsf_req *old_req, *abrt_req;
171         unsigned long flags;
172         unsigned long old_reqid = (unsigned long) scpnt->host_scribble;
173         int retval = SUCCESS, ret;
174         int retry = 3;
175         char *dbf_tag;
176
177         /* avoid race condition between late normal completion and abort */
178         write_lock_irqsave(&adapter->abort_lock, flags);
179
180         old_req = zfcp_reqlist_find(adapter->req_list, old_reqid);
181         if (!old_req) {
182                 write_unlock_irqrestore(&adapter->abort_lock, flags);
183                 zfcp_dbf_scsi_abort("abrt_or", scpnt, NULL);
184                 return FAILED; /* completion could be in progress */
185         }
186         old_req->data = NULL;
187
188         /* don't access old fsf_req after releasing the abort_lock */
189         write_unlock_irqrestore(&adapter->abort_lock, flags);
190
191         while (retry--) {
192                 abrt_req = zfcp_fsf_abort_fcp_cmnd(scpnt);
193                 if (abrt_req)
194                         break;
195
196                 zfcp_erp_wait(adapter);
197                 ret = fc_block_scsi_eh(scpnt);
198                 if (ret) {
199                         zfcp_dbf_scsi_abort("abrt_bl", scpnt, NULL);
200                         return ret;
201                 }
202                 if (!(atomic_read(&adapter->status) &
203                       ZFCP_STATUS_COMMON_RUNNING)) {
204                         zfcp_dbf_scsi_abort("abrt_ru", scpnt, NULL);
205                         return SUCCESS;
206                 }
207         }
208         if (!abrt_req) {
209                 zfcp_dbf_scsi_abort("abrt_ar", scpnt, NULL);
210                 return FAILED;
211         }
212
213         wait_for_completion(&abrt_req->completion);
214
215         if (abrt_req->status & ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED)
216                 dbf_tag = "abrt_ok";
217         else if (abrt_req->status & ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED)
218                 dbf_tag = "abrt_nn";
219         else {
220                 dbf_tag = "abrt_fa";
221                 retval = FAILED;
222         }
223         zfcp_dbf_scsi_abort(dbf_tag, scpnt, abrt_req);
224         zfcp_fsf_req_free(abrt_req);
225         return retval;
226 }
227
228 static int zfcp_task_mgmt_function(struct scsi_cmnd *scpnt, u8 tm_flags)
229 {
230         struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(scpnt->device);
231         struct zfcp_adapter *adapter = zfcp_sdev->port->adapter;
232         struct zfcp_fsf_req *fsf_req = NULL;
233         int retval = SUCCESS, ret;
234         int retry = 3;
235
236         while (retry--) {
237                 fsf_req = zfcp_fsf_fcp_task_mgmt(scpnt, tm_flags);
238                 if (fsf_req)
239                         break;
240
241                 zfcp_erp_wait(adapter);
242                 ret = fc_block_scsi_eh(scpnt);
243                 if (ret)
244                         return ret;
245
246                 if (!(atomic_read(&adapter->status) &
247                       ZFCP_STATUS_COMMON_RUNNING)) {
248                         zfcp_dbf_scsi_devreset("nres", scpnt, tm_flags);
249                         return SUCCESS;
250                 }
251         }
252         if (!fsf_req)
253                 return FAILED;
254
255         wait_for_completion(&fsf_req->completion);
256
257         if (fsf_req->status & ZFCP_STATUS_FSFREQ_TMFUNCFAILED) {
258                 zfcp_dbf_scsi_devreset("fail", scpnt, tm_flags);
259                 retval = FAILED;
260         } else
261                 zfcp_dbf_scsi_devreset("okay", scpnt, tm_flags);
262
263         zfcp_fsf_req_free(fsf_req);
264         return retval;
265 }
266
267 static int zfcp_scsi_eh_device_reset_handler(struct scsi_cmnd *scpnt)
268 {
269         return zfcp_task_mgmt_function(scpnt, FCP_TMF_LUN_RESET);
270 }
271
272 static int zfcp_scsi_eh_target_reset_handler(struct scsi_cmnd *scpnt)
273 {
274         return zfcp_task_mgmt_function(scpnt, FCP_TMF_TGT_RESET);
275 }
276
277 static int zfcp_scsi_eh_host_reset_handler(struct scsi_cmnd *scpnt)
278 {
279         struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(scpnt->device);
280         struct zfcp_adapter *adapter = zfcp_sdev->port->adapter;
281         int ret;
282
283         zfcp_erp_adapter_reopen(adapter, 0, "schrh_1");
284         zfcp_erp_wait(adapter);
285         ret = fc_block_scsi_eh(scpnt);
286         if (ret)
287                 return ret;
288
289         return SUCCESS;
290 }
291
292 struct scsi_transport_template *zfcp_scsi_transport_template;
293
294 static struct scsi_host_template zfcp_scsi_host_template = {
295         .module                  = THIS_MODULE,
296         .name                    = "zfcp",
297         .queuecommand            = zfcp_scsi_queuecommand,
298         .eh_abort_handler        = zfcp_scsi_eh_abort_handler,
299         .eh_device_reset_handler = zfcp_scsi_eh_device_reset_handler,
300         .eh_target_reset_handler = zfcp_scsi_eh_target_reset_handler,
301         .eh_host_reset_handler   = zfcp_scsi_eh_host_reset_handler,
302         .slave_alloc             = zfcp_scsi_slave_alloc,
303         .slave_configure         = zfcp_scsi_slave_configure,
304         .slave_destroy           = zfcp_scsi_slave_destroy,
305         .change_queue_depth      = zfcp_scsi_change_queue_depth,
306         .proc_name               = "zfcp",
307         .can_queue               = 4096,
308         .this_id                 = -1,
309         .sg_tablesize            = 1, /* adjusted later */
310         .max_sectors             = 8, /* adjusted later */
311         .dma_boundary            = ZFCP_QDIO_SBALE_LEN - 1,
312         .cmd_per_lun             = 1,
313         .use_clustering          = 1,
314         .shost_attrs             = zfcp_sysfs_shost_attrs,
315         .sdev_attrs              = zfcp_sysfs_sdev_attrs,
316 };
317
318 /**
319  * zfcp_scsi_adapter_register - Register SCSI and FC host with SCSI midlayer
320  * @adapter: The zfcp adapter to register with the SCSI midlayer
321  */
322 int zfcp_scsi_adapter_register(struct zfcp_adapter *adapter)
323 {
324         struct ccw_dev_id dev_id;
325
326         if (adapter->scsi_host)
327                 return 0;
328
329         ccw_device_get_id(adapter->ccw_device, &dev_id);
330         /* register adapter as SCSI host with mid layer of SCSI stack */
331         adapter->scsi_host = scsi_host_alloc(&zfcp_scsi_host_template,
332                                              sizeof (struct zfcp_adapter *));
333         if (!adapter->scsi_host) {
334                 dev_err(&adapter->ccw_device->dev,
335                         "Registering the FCP device with the "
336                         "SCSI stack failed\n");
337                 return -EIO;
338         }
339
340         /* tell the SCSI stack some characteristics of this adapter */
341         adapter->scsi_host->max_id = 511;
342         adapter->scsi_host->max_lun = 0xFFFFFFFF;
343         adapter->scsi_host->max_channel = 0;
344         adapter->scsi_host->unique_id = dev_id.devno;
345         adapter->scsi_host->max_cmd_len = 16; /* in struct fcp_cmnd */
346         adapter->scsi_host->transportt = zfcp_scsi_transport_template;
347
348         adapter->scsi_host->hostdata[0] = (unsigned long) adapter;
349
350         if (scsi_add_host(adapter->scsi_host, &adapter->ccw_device->dev)) {
351                 scsi_host_put(adapter->scsi_host);
352                 return -EIO;
353         }
354
355         return 0;
356 }
357
358 /**
359  * zfcp_scsi_adapter_unregister - Unregister SCSI and FC host from SCSI midlayer
360  * @adapter: The zfcp adapter to unregister.
361  */
362 void zfcp_scsi_adapter_unregister(struct zfcp_adapter *adapter)
363 {
364         struct Scsi_Host *shost;
365         struct zfcp_port *port;
366
367         shost = adapter->scsi_host;
368         if (!shost)
369                 return;
370
371         read_lock_irq(&adapter->port_list_lock);
372         list_for_each_entry(port, &adapter->port_list, list)
373                 port->rport = NULL;
374         read_unlock_irq(&adapter->port_list_lock);
375
376         fc_remove_host(shost);
377         scsi_remove_host(shost);
378         scsi_host_put(shost);
379         adapter->scsi_host = NULL;
380 }
381
382 static struct fc_host_statistics*
383 zfcp_init_fc_host_stats(struct zfcp_adapter *adapter)
384 {
385         struct fc_host_statistics *fc_stats;
386
387         if (!adapter->fc_stats) {
388                 fc_stats = kmalloc(sizeof(*fc_stats), GFP_KERNEL);
389                 if (!fc_stats)
390                         return NULL;
391                 adapter->fc_stats = fc_stats; /* freed in adapter_release */
392         }
393         memset(adapter->fc_stats, 0, sizeof(*adapter->fc_stats));
394         return adapter->fc_stats;
395 }
396
397 static void zfcp_adjust_fc_host_stats(struct fc_host_statistics *fc_stats,
398                                       struct fsf_qtcb_bottom_port *data,
399                                       struct fsf_qtcb_bottom_port *old)
400 {
401         fc_stats->seconds_since_last_reset =
402                 data->seconds_since_last_reset - old->seconds_since_last_reset;
403         fc_stats->tx_frames = data->tx_frames - old->tx_frames;
404         fc_stats->tx_words = data->tx_words - old->tx_words;
405         fc_stats->rx_frames = data->rx_frames - old->rx_frames;
406         fc_stats->rx_words = data->rx_words - old->rx_words;
407         fc_stats->lip_count = data->lip - old->lip;
408         fc_stats->nos_count = data->nos - old->nos;
409         fc_stats->error_frames = data->error_frames - old->error_frames;
410         fc_stats->dumped_frames = data->dumped_frames - old->dumped_frames;
411         fc_stats->link_failure_count = data->link_failure - old->link_failure;
412         fc_stats->loss_of_sync_count = data->loss_of_sync - old->loss_of_sync;
413         fc_stats->loss_of_signal_count =
414                 data->loss_of_signal - old->loss_of_signal;
415         fc_stats->prim_seq_protocol_err_count =
416                 data->psp_error_counts - old->psp_error_counts;
417         fc_stats->invalid_tx_word_count =
418                 data->invalid_tx_words - old->invalid_tx_words;
419         fc_stats->invalid_crc_count = data->invalid_crcs - old->invalid_crcs;
420         fc_stats->fcp_input_requests =
421                 data->input_requests - old->input_requests;
422         fc_stats->fcp_output_requests =
423                 data->output_requests - old->output_requests;
424         fc_stats->fcp_control_requests =
425                 data->control_requests - old->control_requests;
426         fc_stats->fcp_input_megabytes = data->input_mb - old->input_mb;
427         fc_stats->fcp_output_megabytes = data->output_mb - old->output_mb;
428 }
429
430 static void zfcp_set_fc_host_stats(struct fc_host_statistics *fc_stats,
431                                    struct fsf_qtcb_bottom_port *data)
432 {
433         fc_stats->seconds_since_last_reset = data->seconds_since_last_reset;
434         fc_stats->tx_frames = data->tx_frames;
435         fc_stats->tx_words = data->tx_words;
436         fc_stats->rx_frames = data->rx_frames;
437         fc_stats->rx_words = data->rx_words;
438         fc_stats->lip_count = data->lip;
439         fc_stats->nos_count = data->nos;
440         fc_stats->error_frames = data->error_frames;
441         fc_stats->dumped_frames = data->dumped_frames;
442         fc_stats->link_failure_count = data->link_failure;
443         fc_stats->loss_of_sync_count = data->loss_of_sync;
444         fc_stats->loss_of_signal_count = data->loss_of_signal;
445         fc_stats->prim_seq_protocol_err_count = data->psp_error_counts;
446         fc_stats->invalid_tx_word_count = data->invalid_tx_words;
447         fc_stats->invalid_crc_count = data->invalid_crcs;
448         fc_stats->fcp_input_requests = data->input_requests;
449         fc_stats->fcp_output_requests = data->output_requests;
450         fc_stats->fcp_control_requests = data->control_requests;
451         fc_stats->fcp_input_megabytes = data->input_mb;
452         fc_stats->fcp_output_megabytes = data->output_mb;
453 }
454
455 static struct fc_host_statistics *zfcp_get_fc_host_stats(struct Scsi_Host *host)
456 {
457         struct zfcp_adapter *adapter;
458         struct fc_host_statistics *fc_stats;
459         struct fsf_qtcb_bottom_port *data;
460         int ret;
461
462         adapter = (struct zfcp_adapter *)host->hostdata[0];
463         fc_stats = zfcp_init_fc_host_stats(adapter);
464         if (!fc_stats)
465                 return NULL;
466
467         data = kzalloc(sizeof(*data), GFP_KERNEL);
468         if (!data)
469                 return NULL;
470
471         ret = zfcp_fsf_exchange_port_data_sync(adapter->qdio, data);
472         if (ret) {
473                 kfree(data);
474                 return NULL;
475         }
476
477         if (adapter->stats_reset &&
478             ((jiffies/HZ - adapter->stats_reset) <
479              data->seconds_since_last_reset))
480                 zfcp_adjust_fc_host_stats(fc_stats, data,
481                                           adapter->stats_reset_data);
482         else
483                 zfcp_set_fc_host_stats(fc_stats, data);
484
485         kfree(data);
486         return fc_stats;
487 }
488
489 static void zfcp_reset_fc_host_stats(struct Scsi_Host *shost)
490 {
491         struct zfcp_adapter *adapter;
492         struct fsf_qtcb_bottom_port *data;
493         int ret;
494
495         adapter = (struct zfcp_adapter *)shost->hostdata[0];
496         data = kzalloc(sizeof(*data), GFP_KERNEL);
497         if (!data)
498                 return;
499
500         ret = zfcp_fsf_exchange_port_data_sync(adapter->qdio, data);
501         if (ret)
502                 kfree(data);
503         else {
504                 adapter->stats_reset = jiffies/HZ;
505                 kfree(adapter->stats_reset_data);
506                 adapter->stats_reset_data = data; /* finally freed in
507                                                      adapter_release */
508         }
509 }
510
511 static void zfcp_get_host_port_state(struct Scsi_Host *shost)
512 {
513         struct zfcp_adapter *adapter =
514                 (struct zfcp_adapter *)shost->hostdata[0];
515         int status = atomic_read(&adapter->status);
516
517         if ((status & ZFCP_STATUS_COMMON_RUNNING) &&
518             !(status & ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED))
519                 fc_host_port_state(shost) = FC_PORTSTATE_ONLINE;
520         else if (status & ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED)
521                 fc_host_port_state(shost) = FC_PORTSTATE_LINKDOWN;
522         else if (status & ZFCP_STATUS_COMMON_ERP_FAILED)
523                 fc_host_port_state(shost) = FC_PORTSTATE_ERROR;
524         else
525                 fc_host_port_state(shost) = FC_PORTSTATE_UNKNOWN;
526 }
527
528 static void zfcp_set_rport_dev_loss_tmo(struct fc_rport *rport, u32 timeout)
529 {
530         rport->dev_loss_tmo = timeout;
531 }
532
533 /**
534  * zfcp_scsi_terminate_rport_io - Terminate all I/O on a rport
535  * @rport: The FC rport where to teminate I/O
536  *
537  * Abort all pending SCSI commands for a port by closing the
538  * port. Using a reopen avoids a conflict with a shutdown
539  * overwriting a reopen. The "forced" ensures that a disappeared port
540  * is not opened again as valid due to the cached plogi data in
541  * non-NPIV mode.
542  */
543 static void zfcp_scsi_terminate_rport_io(struct fc_rport *rport)
544 {
545         struct zfcp_port *port;
546         struct Scsi_Host *shost = rport_to_shost(rport);
547         struct zfcp_adapter *adapter =
548                 (struct zfcp_adapter *)shost->hostdata[0];
549
550         port = zfcp_get_port_by_wwpn(adapter, rport->port_name);
551
552         if (port) {
553                 zfcp_erp_port_forced_reopen(port, 0, "sctrpi1");
554                 put_device(&port->dev);
555         }
556 }
557
558 static void zfcp_scsi_rport_register(struct zfcp_port *port)
559 {
560         struct fc_rport_identifiers ids;
561         struct fc_rport *rport;
562
563         if (port->rport)
564                 return;
565
566         ids.node_name = port->wwnn;
567         ids.port_name = port->wwpn;
568         ids.port_id = port->d_id;
569         ids.roles = FC_RPORT_ROLE_FCP_TARGET;
570
571         rport = fc_remote_port_add(port->adapter->scsi_host, 0, &ids);
572         if (!rport) {
573                 dev_err(&port->adapter->ccw_device->dev,
574                         "Registering port 0x%016Lx failed\n",
575                         (unsigned long long)port->wwpn);
576                 return;
577         }
578
579         rport->maxframe_size = port->maxframe_size;
580         rport->supported_classes = port->supported_classes;
581         port->rport = rport;
582         port->starget_id = rport->scsi_target_id;
583
584         zfcp_unit_queue_scsi_scan(port);
585 }
586
587 static void zfcp_scsi_rport_block(struct zfcp_port *port)
588 {
589         struct fc_rport *rport = port->rport;
590
591         if (rport) {
592                 fc_remote_port_delete(rport);
593                 port->rport = NULL;
594         }
595 }
596
597 void zfcp_scsi_schedule_rport_register(struct zfcp_port *port)
598 {
599         get_device(&port->dev);
600         port->rport_task = RPORT_ADD;
601
602         if (!queue_work(port->adapter->work_queue, &port->rport_work))
603                 put_device(&port->dev);
604 }
605
606 void zfcp_scsi_schedule_rport_block(struct zfcp_port *port)
607 {
608         get_device(&port->dev);
609         port->rport_task = RPORT_DEL;
610
611         if (port->rport && queue_work(port->adapter->work_queue,
612                                       &port->rport_work))
613                 return;
614
615         put_device(&port->dev);
616 }
617
618 void zfcp_scsi_schedule_rports_block(struct zfcp_adapter *adapter)
619 {
620         unsigned long flags;
621         struct zfcp_port *port;
622
623         read_lock_irqsave(&adapter->port_list_lock, flags);
624         list_for_each_entry(port, &adapter->port_list, list)
625                 zfcp_scsi_schedule_rport_block(port);
626         read_unlock_irqrestore(&adapter->port_list_lock, flags);
627 }
628
629 void zfcp_scsi_rport_work(struct work_struct *work)
630 {
631         struct zfcp_port *port = container_of(work, struct zfcp_port,
632                                               rport_work);
633
634         while (port->rport_task) {
635                 if (port->rport_task == RPORT_ADD) {
636                         port->rport_task = RPORT_NONE;
637                         zfcp_scsi_rport_register(port);
638                 } else {
639                         port->rport_task = RPORT_NONE;
640                         zfcp_scsi_rport_block(port);
641                 }
642         }
643
644         put_device(&port->dev);
645 }
646
647 /**
648  * zfcp_scsi_set_prot - Configure DIF/DIX support in scsi_host
649  * @adapter: The adapter where to configure DIF/DIX for the SCSI host
650  */
651 void zfcp_scsi_set_prot(struct zfcp_adapter *adapter)
652 {
653         unsigned int mask = 0;
654         unsigned int data_div;
655         struct Scsi_Host *shost = adapter->scsi_host;
656
657         data_div = atomic_read(&adapter->status) &
658                    ZFCP_STATUS_ADAPTER_DATA_DIV_ENABLED;
659
660         if (enable_dif &&
661             adapter->adapter_features & FSF_FEATURE_DIF_PROT_TYPE1)
662                 mask |= SHOST_DIF_TYPE1_PROTECTION;
663
664         if (enable_dif && data_div &&
665             adapter->adapter_features & FSF_FEATURE_DIX_PROT_TCPIP) {
666                 mask |= SHOST_DIX_TYPE1_PROTECTION;
667                 scsi_host_set_guard(shost, SHOST_DIX_GUARD_IP);
668                 shost->sg_prot_tablesize = adapter->qdio->max_sbale_per_req / 2;
669                 shost->sg_tablesize = adapter->qdio->max_sbale_per_req / 2;
670                 shost->max_sectors = shost->sg_tablesize * 8;
671         }
672
673         scsi_host_set_prot(shost, mask);
674 }
675
676 /**
677  * zfcp_scsi_dif_sense_error - Report DIF/DIX error as driver sense error
678  * @scmd: The SCSI command to report the error for
679  * @ascq: The ASCQ to put in the sense buffer
680  *
681  * See the error handling in sd_done for the sense codes used here.
682  * Set DID_SOFT_ERROR to retry the request, if possible.
683  */
684 void zfcp_scsi_dif_sense_error(struct scsi_cmnd *scmd, int ascq)
685 {
686         scsi_build_sense_buffer(1, scmd->sense_buffer,
687                                 ILLEGAL_REQUEST, 0x10, ascq);
688         set_driver_byte(scmd, DRIVER_SENSE);
689         scmd->result |= SAM_STAT_CHECK_CONDITION;
690         set_host_byte(scmd, DID_SOFT_ERROR);
691 }
692
693 struct fc_function_template zfcp_transport_functions = {
694         .show_starget_port_id = 1,
695         .show_starget_port_name = 1,
696         .show_starget_node_name = 1,
697         .show_rport_supported_classes = 1,
698         .show_rport_maxframe_size = 1,
699         .show_rport_dev_loss_tmo = 1,
700         .show_host_node_name = 1,
701         .show_host_port_name = 1,
702         .show_host_permanent_port_name = 1,
703         .show_host_supported_classes = 1,
704         .show_host_supported_fc4s = 1,
705         .show_host_supported_speeds = 1,
706         .show_host_maxframe_size = 1,
707         .show_host_serial_number = 1,
708         .get_fc_host_stats = zfcp_get_fc_host_stats,
709         .reset_fc_host_stats = zfcp_reset_fc_host_stats,
710         .set_rport_dev_loss_tmo = zfcp_set_rport_dev_loss_tmo,
711         .get_host_port_state = zfcp_get_host_port_state,
712         .terminate_rport_io = zfcp_scsi_terminate_rport_io,
713         .show_host_port_state = 1,
714         .show_host_active_fc4s = 1,
715         .bsg_request = zfcp_fc_exec_bsg_job,
716         .bsg_timeout = zfcp_fc_timeout_bsg_job,
717         /* no functions registered for following dynamic attributes but
718            directly set by LLDD */
719         .show_host_port_type = 1,
720         .show_host_symbolic_name = 1,
721         .show_host_speed = 1,
722         .show_host_port_id = 1,
723         .dd_bsg_size = sizeof(struct zfcp_fsf_ct_els),
724 };