1 // SPDX-License-Identifier: GPL-2.0
5 * Interface to Linux SCSI midlayer.
7 * Copyright IBM Corp. 2002, 2017
10 #define KMSG_COMPONENT "zfcp"
11 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
13 #include <linux/module.h>
14 #include <linux/types.h>
15 #include <linux/slab.h>
16 #include <scsi/fc/fc_fcp.h>
17 #include <scsi/scsi_eh.h>
18 #include <linux/atomic.h>
22 #include "zfcp_reqlist.h"
24 static unsigned int default_depth
= 32;
25 module_param_named(queue_depth
, default_depth
, uint
, 0600);
26 MODULE_PARM_DESC(queue_depth
, "Default queue depth for new SCSI devices");
28 static bool enable_dif
;
29 module_param_named(dif
, enable_dif
, bool, 0400);
30 MODULE_PARM_DESC(dif
, "Enable DIF/DIX data integrity support");
32 static bool allow_lun_scan
= true;
33 module_param(allow_lun_scan
, bool, 0600);
34 MODULE_PARM_DESC(allow_lun_scan
, "For NPIV, scan and attach all storage LUNs");
36 static void zfcp_scsi_slave_destroy(struct scsi_device
*sdev
)
38 struct zfcp_scsi_dev
*zfcp_sdev
= sdev_to_zfcp(sdev
);
40 /* if previous slave_alloc returned early, there is nothing to do */
44 zfcp_erp_lun_shutdown_wait(sdev
, "scssd_1");
45 put_device(&zfcp_sdev
->port
->dev
);
48 static int zfcp_scsi_slave_configure(struct scsi_device
*sdp
)
50 if (sdp
->tagged_supported
)
51 scsi_change_queue_depth(sdp
, default_depth
);
55 static void zfcp_scsi_command_fail(struct scsi_cmnd
*scpnt
, int result
)
57 set_host_byte(scpnt
, result
);
58 zfcp_dbf_scsi_fail_send(scpnt
);
59 scpnt
->scsi_done(scpnt
);
63 int zfcp_scsi_queuecommand(struct Scsi_Host
*shost
, struct scsi_cmnd
*scpnt
)
65 struct zfcp_scsi_dev
*zfcp_sdev
= sdev_to_zfcp(scpnt
->device
);
66 struct fc_rport
*rport
= starget_to_rport(scsi_target(scpnt
->device
));
67 int status
, scsi_result
, ret
;
69 /* reset the status for this request */
71 scpnt
->host_scribble
= NULL
;
73 scsi_result
= fc_remote_port_chkready(rport
);
74 if (unlikely(scsi_result
)) {
75 scpnt
->result
= scsi_result
;
76 zfcp_dbf_scsi_fail_send(scpnt
);
77 scpnt
->scsi_done(scpnt
);
81 status
= atomic_read(&zfcp_sdev
->status
);
82 if (unlikely(status
& ZFCP_STATUS_COMMON_ERP_FAILED
) &&
83 !(atomic_read(&zfcp_sdev
->port
->status
) &
84 ZFCP_STATUS_COMMON_ERP_FAILED
)) {
85 /* only LUN access denied, but port is good
86 * not covered by FC transport, have to fail here */
87 zfcp_scsi_command_fail(scpnt
, DID_ERROR
);
91 if (unlikely(!(status
& ZFCP_STATUS_COMMON_UNBLOCKED
))) {
93 * call to rport_delete pending: mimic retry from
94 * fc_remote_port_chkready until rport is BLOCKED
96 zfcp_scsi_command_fail(scpnt
, DID_IMM_RETRY
);
100 ret
= zfcp_fsf_fcp_cmnd(scpnt
);
101 if (unlikely(ret
== -EBUSY
))
102 return SCSI_MLQUEUE_DEVICE_BUSY
;
103 else if (unlikely(ret
< 0))
104 return SCSI_MLQUEUE_HOST_BUSY
;
109 static int zfcp_scsi_slave_alloc(struct scsi_device
*sdev
)
111 struct fc_rport
*rport
= starget_to_rport(scsi_target(sdev
));
112 struct zfcp_adapter
*adapter
=
113 (struct zfcp_adapter
*) sdev
->host
->hostdata
[0];
114 struct zfcp_scsi_dev
*zfcp_sdev
= sdev_to_zfcp(sdev
);
115 struct zfcp_port
*port
;
116 struct zfcp_unit
*unit
;
117 int npiv
= adapter
->connection_features
& FSF_FEATURE_NPIV_MODE
;
119 zfcp_sdev
->erp_action
.adapter
= adapter
;
120 zfcp_sdev
->erp_action
.sdev
= sdev
;
122 port
= zfcp_get_port_by_wwpn(adapter
, rport
->port_name
);
126 zfcp_sdev
->erp_action
.port
= port
;
128 unit
= zfcp_unit_find(port
, zfcp_scsi_dev_lun(sdev
));
130 put_device(&unit
->dev
);
132 if (!unit
&& !(allow_lun_scan
&& npiv
)) {
133 put_device(&port
->dev
);
137 zfcp_sdev
->port
= port
;
138 zfcp_sdev
->latencies
.write
.channel
.min
= 0xFFFFFFFF;
139 zfcp_sdev
->latencies
.write
.fabric
.min
= 0xFFFFFFFF;
140 zfcp_sdev
->latencies
.read
.channel
.min
= 0xFFFFFFFF;
141 zfcp_sdev
->latencies
.read
.fabric
.min
= 0xFFFFFFFF;
142 zfcp_sdev
->latencies
.cmd
.channel
.min
= 0xFFFFFFFF;
143 zfcp_sdev
->latencies
.cmd
.fabric
.min
= 0xFFFFFFFF;
144 spin_lock_init(&zfcp_sdev
->latencies
.lock
);
146 zfcp_erp_set_lun_status(sdev
, ZFCP_STATUS_COMMON_RUNNING
);
147 zfcp_erp_lun_reopen(sdev
, 0, "scsla_1");
148 zfcp_erp_wait(port
->adapter
);
153 static int zfcp_scsi_eh_abort_handler(struct scsi_cmnd
*scpnt
)
155 struct Scsi_Host
*scsi_host
= scpnt
->device
->host
;
156 struct zfcp_adapter
*adapter
=
157 (struct zfcp_adapter
*) scsi_host
->hostdata
[0];
158 struct zfcp_fsf_req
*old_req
, *abrt_req
;
160 unsigned long old_reqid
= (unsigned long) scpnt
->host_scribble
;
161 int retval
= SUCCESS
, ret
;
165 /* avoid race condition between late normal completion and abort */
166 write_lock_irqsave(&adapter
->abort_lock
, flags
);
168 old_req
= zfcp_reqlist_find(adapter
->req_list
, old_reqid
);
170 write_unlock_irqrestore(&adapter
->abort_lock
, flags
);
171 zfcp_dbf_scsi_abort("abrt_or", scpnt
, NULL
);
172 return FAILED
; /* completion could be in progress */
174 old_req
->data
= NULL
;
176 /* don't access old fsf_req after releasing the abort_lock */
177 write_unlock_irqrestore(&adapter
->abort_lock
, flags
);
180 abrt_req
= zfcp_fsf_abort_fcp_cmnd(scpnt
);
184 zfcp_erp_wait(adapter
);
185 ret
= fc_block_scsi_eh(scpnt
);
187 zfcp_dbf_scsi_abort("abrt_bl", scpnt
, NULL
);
190 if (!(atomic_read(&adapter
->status
) &
191 ZFCP_STATUS_COMMON_RUNNING
)) {
192 zfcp_dbf_scsi_abort("abrt_ru", scpnt
, NULL
);
197 zfcp_dbf_scsi_abort("abrt_ar", scpnt
, NULL
);
201 wait_for_completion(&abrt_req
->completion
);
203 if (abrt_req
->status
& ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED
)
205 else if (abrt_req
->status
& ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED
)
211 zfcp_dbf_scsi_abort(dbf_tag
, scpnt
, abrt_req
);
212 zfcp_fsf_req_free(abrt_req
);
216 struct zfcp_scsi_req_filter
{
222 static void zfcp_scsi_forget_cmnd(struct zfcp_fsf_req
*old_req
, void *data
)
224 struct zfcp_scsi_req_filter
*filter
=
225 (struct zfcp_scsi_req_filter
*)data
;
227 /* already aborted - prevent side-effects - or not a SCSI command */
228 if (old_req
->data
== NULL
|| old_req
->fsf_command
!= FSF_QTCB_FCP_CMND
)
231 /* (tmf_scope == FCP_TMF_TGT_RESET || tmf_scope == FCP_TMF_LUN_RESET) */
232 if (old_req
->qtcb
->header
.port_handle
!= filter
->port_handle
)
235 if (filter
->tmf_scope
== FCP_TMF_LUN_RESET
&&
236 old_req
->qtcb
->header
.lun_handle
!= filter
->lun_handle
)
239 zfcp_dbf_scsi_nullcmnd((struct scsi_cmnd
*)old_req
->data
, old_req
);
240 old_req
->data
= NULL
;
243 static void zfcp_scsi_forget_cmnds(struct zfcp_scsi_dev
*zsdev
, u8 tm_flags
)
245 struct zfcp_adapter
*adapter
= zsdev
->port
->adapter
;
246 struct zfcp_scsi_req_filter filter
= {
247 .tmf_scope
= FCP_TMF_TGT_RESET
,
248 .port_handle
= zsdev
->port
->handle
,
252 if (tm_flags
== FCP_TMF_LUN_RESET
) {
253 filter
.tmf_scope
= FCP_TMF_LUN_RESET
;
254 filter
.lun_handle
= zsdev
->lun_handle
;
258 * abort_lock secures against other processings - in the abort-function
259 * and normal cmnd-handler - of (struct zfcp_fsf_req *)->data
261 write_lock_irqsave(&adapter
->abort_lock
, flags
);
262 zfcp_reqlist_apply_for_all(adapter
->req_list
, zfcp_scsi_forget_cmnd
,
264 write_unlock_irqrestore(&adapter
->abort_lock
, flags
);
267 static int zfcp_task_mgmt_function(struct scsi_cmnd
*scpnt
, u8 tm_flags
)
269 struct zfcp_scsi_dev
*zfcp_sdev
= sdev_to_zfcp(scpnt
->device
);
270 struct zfcp_adapter
*adapter
= zfcp_sdev
->port
->adapter
;
271 struct zfcp_fsf_req
*fsf_req
= NULL
;
272 int retval
= SUCCESS
, ret
;
276 fsf_req
= zfcp_fsf_fcp_task_mgmt(scpnt
, tm_flags
);
280 zfcp_erp_wait(adapter
);
281 ret
= fc_block_scsi_eh(scpnt
);
283 zfcp_dbf_scsi_devreset("fiof", scpnt
, tm_flags
, NULL
);
287 if (!(atomic_read(&adapter
->status
) &
288 ZFCP_STATUS_COMMON_RUNNING
)) {
289 zfcp_dbf_scsi_devreset("nres", scpnt
, tm_flags
, NULL
);
294 zfcp_dbf_scsi_devreset("reqf", scpnt
, tm_flags
, NULL
);
298 wait_for_completion(&fsf_req
->completion
);
300 if (fsf_req
->status
& ZFCP_STATUS_FSFREQ_TMFUNCFAILED
) {
301 zfcp_dbf_scsi_devreset("fail", scpnt
, tm_flags
, fsf_req
);
304 zfcp_dbf_scsi_devreset("okay", scpnt
, tm_flags
, fsf_req
);
305 zfcp_scsi_forget_cmnds(zfcp_sdev
, tm_flags
);
308 zfcp_fsf_req_free(fsf_req
);
312 static int zfcp_scsi_eh_device_reset_handler(struct scsi_cmnd
*scpnt
)
314 return zfcp_task_mgmt_function(scpnt
, FCP_TMF_LUN_RESET
);
317 static int zfcp_scsi_eh_target_reset_handler(struct scsi_cmnd
*scpnt
)
319 return zfcp_task_mgmt_function(scpnt
, FCP_TMF_TGT_RESET
);
322 static int zfcp_scsi_eh_host_reset_handler(struct scsi_cmnd
*scpnt
)
324 struct zfcp_scsi_dev
*zfcp_sdev
= sdev_to_zfcp(scpnt
->device
);
325 struct zfcp_adapter
*adapter
= zfcp_sdev
->port
->adapter
;
328 zfcp_erp_adapter_reopen(adapter
, 0, "schrh_1");
329 zfcp_erp_wait(adapter
);
330 ret
= fc_block_scsi_eh(scpnt
);
337 struct scsi_transport_template
*zfcp_scsi_transport_template
;
339 static struct scsi_host_template zfcp_scsi_host_template
= {
340 .module
= THIS_MODULE
,
342 .queuecommand
= zfcp_scsi_queuecommand
,
343 .eh_timed_out
= fc_eh_timed_out
,
344 .eh_abort_handler
= zfcp_scsi_eh_abort_handler
,
345 .eh_device_reset_handler
= zfcp_scsi_eh_device_reset_handler
,
346 .eh_target_reset_handler
= zfcp_scsi_eh_target_reset_handler
,
347 .eh_host_reset_handler
= zfcp_scsi_eh_host_reset_handler
,
348 .slave_alloc
= zfcp_scsi_slave_alloc
,
349 .slave_configure
= zfcp_scsi_slave_configure
,
350 .slave_destroy
= zfcp_scsi_slave_destroy
,
351 .change_queue_depth
= scsi_change_queue_depth
,
355 .sg_tablesize
= (((QDIO_MAX_ELEMENTS_PER_BUFFER
- 1)
356 * ZFCP_QDIO_MAX_SBALS_PER_REQ
) - 2),
357 /* GCD, adjusted later */
358 .max_sectors
= (((QDIO_MAX_ELEMENTS_PER_BUFFER
- 1)
359 * ZFCP_QDIO_MAX_SBALS_PER_REQ
) - 2) * 8,
360 /* GCD, adjusted later */
361 .dma_boundary
= ZFCP_QDIO_SBALE_LEN
- 1,
363 .shost_attrs
= zfcp_sysfs_shost_attrs
,
364 .sdev_attrs
= zfcp_sysfs_sdev_attrs
,
365 .track_queue_depth
= 1,
369 * zfcp_scsi_adapter_register - Register SCSI and FC host with SCSI midlayer
370 * @adapter: The zfcp adapter to register with the SCSI midlayer
372 int zfcp_scsi_adapter_register(struct zfcp_adapter
*adapter
)
374 struct ccw_dev_id dev_id
;
376 if (adapter
->scsi_host
)
379 ccw_device_get_id(adapter
->ccw_device
, &dev_id
);
380 /* register adapter as SCSI host with mid layer of SCSI stack */
381 adapter
->scsi_host
= scsi_host_alloc(&zfcp_scsi_host_template
,
382 sizeof (struct zfcp_adapter
*));
383 if (!adapter
->scsi_host
) {
384 dev_err(&adapter
->ccw_device
->dev
,
385 "Registering the FCP device with the "
386 "SCSI stack failed\n");
390 /* tell the SCSI stack some characteristics of this adapter */
391 adapter
->scsi_host
->max_id
= 511;
392 adapter
->scsi_host
->max_lun
= 0xFFFFFFFF;
393 adapter
->scsi_host
->max_channel
= 0;
394 adapter
->scsi_host
->unique_id
= dev_id
.devno
;
395 adapter
->scsi_host
->max_cmd_len
= 16; /* in struct fcp_cmnd */
396 adapter
->scsi_host
->transportt
= zfcp_scsi_transport_template
;
398 adapter
->scsi_host
->hostdata
[0] = (unsigned long) adapter
;
400 if (scsi_add_host(adapter
->scsi_host
, &adapter
->ccw_device
->dev
)) {
401 scsi_host_put(adapter
->scsi_host
);
409 * zfcp_scsi_adapter_unregister - Unregister SCSI and FC host from SCSI midlayer
410 * @adapter: The zfcp adapter to unregister.
412 void zfcp_scsi_adapter_unregister(struct zfcp_adapter
*adapter
)
414 struct Scsi_Host
*shost
;
415 struct zfcp_port
*port
;
417 shost
= adapter
->scsi_host
;
421 read_lock_irq(&adapter
->port_list_lock
);
422 list_for_each_entry(port
, &adapter
->port_list
, list
)
424 read_unlock_irq(&adapter
->port_list_lock
);
426 fc_remove_host(shost
);
427 scsi_remove_host(shost
);
428 scsi_host_put(shost
);
429 adapter
->scsi_host
= NULL
;
432 static struct fc_host_statistics
*
433 zfcp_init_fc_host_stats(struct zfcp_adapter
*adapter
)
435 struct fc_host_statistics
*fc_stats
;
437 if (!adapter
->fc_stats
) {
438 fc_stats
= kmalloc(sizeof(*fc_stats
), GFP_KERNEL
);
441 adapter
->fc_stats
= fc_stats
; /* freed in adapter_release */
443 memset(adapter
->fc_stats
, 0, sizeof(*adapter
->fc_stats
));
444 return adapter
->fc_stats
;
447 static void zfcp_adjust_fc_host_stats(struct fc_host_statistics
*fc_stats
,
448 struct fsf_qtcb_bottom_port
*data
,
449 struct fsf_qtcb_bottom_port
*old
)
451 fc_stats
->seconds_since_last_reset
=
452 data
->seconds_since_last_reset
- old
->seconds_since_last_reset
;
453 fc_stats
->tx_frames
= data
->tx_frames
- old
->tx_frames
;
454 fc_stats
->tx_words
= data
->tx_words
- old
->tx_words
;
455 fc_stats
->rx_frames
= data
->rx_frames
- old
->rx_frames
;
456 fc_stats
->rx_words
= data
->rx_words
- old
->rx_words
;
457 fc_stats
->lip_count
= data
->lip
- old
->lip
;
458 fc_stats
->nos_count
= data
->nos
- old
->nos
;
459 fc_stats
->error_frames
= data
->error_frames
- old
->error_frames
;
460 fc_stats
->dumped_frames
= data
->dumped_frames
- old
->dumped_frames
;
461 fc_stats
->link_failure_count
= data
->link_failure
- old
->link_failure
;
462 fc_stats
->loss_of_sync_count
= data
->loss_of_sync
- old
->loss_of_sync
;
463 fc_stats
->loss_of_signal_count
=
464 data
->loss_of_signal
- old
->loss_of_signal
;
465 fc_stats
->prim_seq_protocol_err_count
=
466 data
->psp_error_counts
- old
->psp_error_counts
;
467 fc_stats
->invalid_tx_word_count
=
468 data
->invalid_tx_words
- old
->invalid_tx_words
;
469 fc_stats
->invalid_crc_count
= data
->invalid_crcs
- old
->invalid_crcs
;
470 fc_stats
->fcp_input_requests
=
471 data
->input_requests
- old
->input_requests
;
472 fc_stats
->fcp_output_requests
=
473 data
->output_requests
- old
->output_requests
;
474 fc_stats
->fcp_control_requests
=
475 data
->control_requests
- old
->control_requests
;
476 fc_stats
->fcp_input_megabytes
= data
->input_mb
- old
->input_mb
;
477 fc_stats
->fcp_output_megabytes
= data
->output_mb
- old
->output_mb
;
480 static void zfcp_set_fc_host_stats(struct fc_host_statistics
*fc_stats
,
481 struct fsf_qtcb_bottom_port
*data
)
483 fc_stats
->seconds_since_last_reset
= data
->seconds_since_last_reset
;
484 fc_stats
->tx_frames
= data
->tx_frames
;
485 fc_stats
->tx_words
= data
->tx_words
;
486 fc_stats
->rx_frames
= data
->rx_frames
;
487 fc_stats
->rx_words
= data
->rx_words
;
488 fc_stats
->lip_count
= data
->lip
;
489 fc_stats
->nos_count
= data
->nos
;
490 fc_stats
->error_frames
= data
->error_frames
;
491 fc_stats
->dumped_frames
= data
->dumped_frames
;
492 fc_stats
->link_failure_count
= data
->link_failure
;
493 fc_stats
->loss_of_sync_count
= data
->loss_of_sync
;
494 fc_stats
->loss_of_signal_count
= data
->loss_of_signal
;
495 fc_stats
->prim_seq_protocol_err_count
= data
->psp_error_counts
;
496 fc_stats
->invalid_tx_word_count
= data
->invalid_tx_words
;
497 fc_stats
->invalid_crc_count
= data
->invalid_crcs
;
498 fc_stats
->fcp_input_requests
= data
->input_requests
;
499 fc_stats
->fcp_output_requests
= data
->output_requests
;
500 fc_stats
->fcp_control_requests
= data
->control_requests
;
501 fc_stats
->fcp_input_megabytes
= data
->input_mb
;
502 fc_stats
->fcp_output_megabytes
= data
->output_mb
;
505 static struct fc_host_statistics
*zfcp_get_fc_host_stats(struct Scsi_Host
*host
)
507 struct zfcp_adapter
*adapter
;
508 struct fc_host_statistics
*fc_stats
;
509 struct fsf_qtcb_bottom_port
*data
;
512 adapter
= (struct zfcp_adapter
*)host
->hostdata
[0];
513 fc_stats
= zfcp_init_fc_host_stats(adapter
);
517 data
= kzalloc(sizeof(*data
), GFP_KERNEL
);
521 ret
= zfcp_fsf_exchange_port_data_sync(adapter
->qdio
, data
);
527 if (adapter
->stats_reset
&&
528 ((jiffies
/HZ
- adapter
->stats_reset
) <
529 data
->seconds_since_last_reset
))
530 zfcp_adjust_fc_host_stats(fc_stats
, data
,
531 adapter
->stats_reset_data
);
533 zfcp_set_fc_host_stats(fc_stats
, data
);
539 static void zfcp_reset_fc_host_stats(struct Scsi_Host
*shost
)
541 struct zfcp_adapter
*adapter
;
542 struct fsf_qtcb_bottom_port
*data
;
545 adapter
= (struct zfcp_adapter
*)shost
->hostdata
[0];
546 data
= kzalloc(sizeof(*data
), GFP_KERNEL
);
550 ret
= zfcp_fsf_exchange_port_data_sync(adapter
->qdio
, data
);
554 adapter
->stats_reset
= jiffies
/HZ
;
555 kfree(adapter
->stats_reset_data
);
556 adapter
->stats_reset_data
= data
; /* finally freed in
561 static void zfcp_get_host_port_state(struct Scsi_Host
*shost
)
563 struct zfcp_adapter
*adapter
=
564 (struct zfcp_adapter
*)shost
->hostdata
[0];
565 int status
= atomic_read(&adapter
->status
);
567 if ((status
& ZFCP_STATUS_COMMON_RUNNING
) &&
568 !(status
& ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED
))
569 fc_host_port_state(shost
) = FC_PORTSTATE_ONLINE
;
570 else if (status
& ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED
)
571 fc_host_port_state(shost
) = FC_PORTSTATE_LINKDOWN
;
572 else if (status
& ZFCP_STATUS_COMMON_ERP_FAILED
)
573 fc_host_port_state(shost
) = FC_PORTSTATE_ERROR
;
575 fc_host_port_state(shost
) = FC_PORTSTATE_UNKNOWN
;
578 static void zfcp_set_rport_dev_loss_tmo(struct fc_rport
*rport
, u32 timeout
)
580 rport
->dev_loss_tmo
= timeout
;
584 * zfcp_scsi_terminate_rport_io - Terminate all I/O on a rport
585 * @rport: The FC rport where to teminate I/O
587 * Abort all pending SCSI commands for a port by closing the
588 * port. Using a reopen avoids a conflict with a shutdown
589 * overwriting a reopen. The "forced" ensures that a disappeared port
590 * is not opened again as valid due to the cached plogi data in
593 static void zfcp_scsi_terminate_rport_io(struct fc_rport
*rport
)
595 struct zfcp_port
*port
;
596 struct Scsi_Host
*shost
= rport_to_shost(rport
);
597 struct zfcp_adapter
*adapter
=
598 (struct zfcp_adapter
*)shost
->hostdata
[0];
600 port
= zfcp_get_port_by_wwpn(adapter
, rport
->port_name
);
603 zfcp_erp_port_forced_reopen(port
, 0, "sctrpi1");
604 put_device(&port
->dev
);
608 static void zfcp_scsi_rport_register(struct zfcp_port
*port
)
610 struct fc_rport_identifiers ids
;
611 struct fc_rport
*rport
;
616 ids
.node_name
= port
->wwnn
;
617 ids
.port_name
= port
->wwpn
;
618 ids
.port_id
= port
->d_id
;
619 ids
.roles
= FC_RPORT_ROLE_FCP_TARGET
;
621 zfcp_dbf_rec_trig("scpaddy", port
->adapter
, port
, NULL
,
622 ZFCP_PSEUDO_ERP_ACTION_RPORT_ADD
,
623 ZFCP_PSEUDO_ERP_ACTION_RPORT_ADD
);
624 rport
= fc_remote_port_add(port
->adapter
->scsi_host
, 0, &ids
);
626 dev_err(&port
->adapter
->ccw_device
->dev
,
627 "Registering port 0x%016Lx failed\n",
628 (unsigned long long)port
->wwpn
);
632 rport
->maxframe_size
= port
->maxframe_size
;
633 rport
->supported_classes
= port
->supported_classes
;
635 port
->starget_id
= rport
->scsi_target_id
;
637 zfcp_unit_queue_scsi_scan(port
);
640 static void zfcp_scsi_rport_block(struct zfcp_port
*port
)
642 struct fc_rport
*rport
= port
->rport
;
645 zfcp_dbf_rec_trig("scpdely", port
->adapter
, port
, NULL
,
646 ZFCP_PSEUDO_ERP_ACTION_RPORT_DEL
,
647 ZFCP_PSEUDO_ERP_ACTION_RPORT_DEL
);
648 fc_remote_port_delete(rport
);
653 void zfcp_scsi_schedule_rport_register(struct zfcp_port
*port
)
655 get_device(&port
->dev
);
656 port
->rport_task
= RPORT_ADD
;
658 if (!queue_work(port
->adapter
->work_queue
, &port
->rport_work
))
659 put_device(&port
->dev
);
662 void zfcp_scsi_schedule_rport_block(struct zfcp_port
*port
)
664 get_device(&port
->dev
);
665 port
->rport_task
= RPORT_DEL
;
667 if (port
->rport
&& queue_work(port
->adapter
->work_queue
,
671 put_device(&port
->dev
);
674 void zfcp_scsi_schedule_rports_block(struct zfcp_adapter
*adapter
)
677 struct zfcp_port
*port
;
679 read_lock_irqsave(&adapter
->port_list_lock
, flags
);
680 list_for_each_entry(port
, &adapter
->port_list
, list
)
681 zfcp_scsi_schedule_rport_block(port
);
682 read_unlock_irqrestore(&adapter
->port_list_lock
, flags
);
685 void zfcp_scsi_rport_work(struct work_struct
*work
)
687 struct zfcp_port
*port
= container_of(work
, struct zfcp_port
,
690 while (port
->rport_task
) {
691 if (port
->rport_task
== RPORT_ADD
) {
692 port
->rport_task
= RPORT_NONE
;
693 zfcp_scsi_rport_register(port
);
695 port
->rport_task
= RPORT_NONE
;
696 zfcp_scsi_rport_block(port
);
700 put_device(&port
->dev
);
704 * zfcp_scsi_set_prot - Configure DIF/DIX support in scsi_host
705 * @adapter: The adapter where to configure DIF/DIX for the SCSI host
707 void zfcp_scsi_set_prot(struct zfcp_adapter
*adapter
)
709 unsigned int mask
= 0;
710 unsigned int data_div
;
711 struct Scsi_Host
*shost
= adapter
->scsi_host
;
713 data_div
= atomic_read(&adapter
->status
) &
714 ZFCP_STATUS_ADAPTER_DATA_DIV_ENABLED
;
717 adapter
->adapter_features
& FSF_FEATURE_DIF_PROT_TYPE1
)
718 mask
|= SHOST_DIF_TYPE1_PROTECTION
;
720 if (enable_dif
&& data_div
&&
721 adapter
->adapter_features
& FSF_FEATURE_DIX_PROT_TCPIP
) {
722 mask
|= SHOST_DIX_TYPE1_PROTECTION
;
723 scsi_host_set_guard(shost
, SHOST_DIX_GUARD_IP
);
724 shost
->sg_prot_tablesize
= adapter
->qdio
->max_sbale_per_req
/ 2;
725 shost
->sg_tablesize
= adapter
->qdio
->max_sbale_per_req
/ 2;
726 shost
->max_sectors
= shost
->sg_tablesize
* 8;
729 scsi_host_set_prot(shost
, mask
);
733 * zfcp_scsi_dif_sense_error - Report DIF/DIX error as driver sense error
734 * @scmd: The SCSI command to report the error for
735 * @ascq: The ASCQ to put in the sense buffer
737 * See the error handling in sd_done for the sense codes used here.
738 * Set DID_SOFT_ERROR to retry the request, if possible.
740 void zfcp_scsi_dif_sense_error(struct scsi_cmnd
*scmd
, int ascq
)
742 scsi_build_sense_buffer(1, scmd
->sense_buffer
,
743 ILLEGAL_REQUEST
, 0x10, ascq
);
744 set_driver_byte(scmd
, DRIVER_SENSE
);
745 scmd
->result
|= SAM_STAT_CHECK_CONDITION
;
746 set_host_byte(scmd
, DID_SOFT_ERROR
);
749 struct fc_function_template zfcp_transport_functions
= {
750 .show_starget_port_id
= 1,
751 .show_starget_port_name
= 1,
752 .show_starget_node_name
= 1,
753 .show_rport_supported_classes
= 1,
754 .show_rport_maxframe_size
= 1,
755 .show_rport_dev_loss_tmo
= 1,
756 .show_host_node_name
= 1,
757 .show_host_port_name
= 1,
758 .show_host_permanent_port_name
= 1,
759 .show_host_supported_classes
= 1,
760 .show_host_supported_fc4s
= 1,
761 .show_host_supported_speeds
= 1,
762 .show_host_maxframe_size
= 1,
763 .show_host_serial_number
= 1,
764 .get_fc_host_stats
= zfcp_get_fc_host_stats
,
765 .reset_fc_host_stats
= zfcp_reset_fc_host_stats
,
766 .set_rport_dev_loss_tmo
= zfcp_set_rport_dev_loss_tmo
,
767 .get_host_port_state
= zfcp_get_host_port_state
,
768 .terminate_rport_io
= zfcp_scsi_terminate_rport_io
,
769 .show_host_port_state
= 1,
770 .show_host_active_fc4s
= 1,
771 .bsg_request
= zfcp_fc_exec_bsg_job
,
772 .bsg_timeout
= zfcp_fc_timeout_bsg_job
,
773 /* no functions registered for following dynamic attributes but
774 directly set by LLDD */
775 .show_host_port_type
= 1,
776 .show_host_symbolic_name
= 1,
777 .show_host_speed
= 1,
778 .show_host_port_id
= 1,
779 .dd_bsg_size
= sizeof(struct zfcp_fsf_ct_els
),