4 * Interface to Linux SCSI midlayer.
6 * Copyright IBM Corporation 2002, 2010
9 #define KMSG_COMPONENT "zfcp"
10 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
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>
20 #include "zfcp_reqlist.h"
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");
26 static bool enable_dif
;
28 #ifdef CONFIG_ZFCP_DIF
29 module_param_named(dif
, enable_dif
, bool, 0600);
30 MODULE_PARM_DESC(dif
, "Enable DIF/DIX data integrity support");
33 static bool allow_lun_scan
= 1;
34 module_param(allow_lun_scan
, bool, 0600);
35 MODULE_PARM_DESC(allow_lun_scan
, "For NPIV, scan and attach all storage LUNs");
37 static int zfcp_scsi_change_queue_depth(struct scsi_device
*sdev
, int depth
,
41 case SCSI_QDEPTH_DEFAULT
:
42 scsi_adjust_queue_depth(sdev
, scsi_get_tag_type(sdev
), depth
);
44 case SCSI_QDEPTH_QFULL
:
45 scsi_track_queue_full(sdev
, depth
);
47 case SCSI_QDEPTH_RAMP_UP
:
48 scsi_adjust_queue_depth(sdev
, scsi_get_tag_type(sdev
), depth
);
53 return sdev
->queue_depth
;
56 static void zfcp_scsi_slave_destroy(struct scsi_device
*sdev
)
58 struct zfcp_scsi_dev
*zfcp_sdev
= sdev_to_zfcp(sdev
);
60 zfcp_erp_lun_shutdown_wait(sdev
, "scssd_1");
61 put_device(&zfcp_sdev
->port
->dev
);
64 static int zfcp_scsi_slave_configure(struct scsi_device
*sdp
)
66 if (sdp
->tagged_supported
)
67 scsi_adjust_queue_depth(sdp
, MSG_SIMPLE_TAG
, default_depth
);
69 scsi_adjust_queue_depth(sdp
, 0, 1);
73 static void zfcp_scsi_command_fail(struct scsi_cmnd
*scpnt
, int result
)
75 set_host_byte(scpnt
, result
);
76 zfcp_dbf_scsi_fail_send(scpnt
);
77 scpnt
->scsi_done(scpnt
);
81 int zfcp_scsi_queuecommand(struct Scsi_Host
*shost
, struct scsi_cmnd
*scpnt
)
83 struct zfcp_scsi_dev
*zfcp_sdev
= sdev_to_zfcp(scpnt
->device
);
84 struct fc_rport
*rport
= starget_to_rport(scsi_target(scpnt
->device
));
85 int status
, scsi_result
, ret
;
87 /* reset the status for this request */
89 scpnt
->host_scribble
= NULL
;
91 scsi_result
= fc_remote_port_chkready(rport
);
92 if (unlikely(scsi_result
)) {
93 scpnt
->result
= scsi_result
;
94 zfcp_dbf_scsi_fail_send(scpnt
);
95 scpnt
->scsi_done(scpnt
);
99 status
= atomic_read(&zfcp_sdev
->status
);
100 if (unlikely(status
& ZFCP_STATUS_COMMON_ERP_FAILED
) &&
101 !(atomic_read(&zfcp_sdev
->port
->status
) &
102 ZFCP_STATUS_COMMON_ERP_FAILED
)) {
103 /* only LUN access denied, but port is good
104 * not covered by FC transport, have to fail here */
105 zfcp_scsi_command_fail(scpnt
, DID_ERROR
);
109 if (unlikely(!(status
& ZFCP_STATUS_COMMON_UNBLOCKED
))) {
110 /* This could be either
111 * open LUN pending: this is temporary, will result in
112 * open LUN or ERP_FAILED, so retry command
113 * call to rport_delete pending: mimic retry from
114 * fc_remote_port_chkready until rport is BLOCKED
116 zfcp_scsi_command_fail(scpnt
, DID_IMM_RETRY
);
120 ret
= zfcp_fsf_fcp_cmnd(scpnt
);
121 if (unlikely(ret
== -EBUSY
))
122 return SCSI_MLQUEUE_DEVICE_BUSY
;
123 else if (unlikely(ret
< 0))
124 return SCSI_MLQUEUE_HOST_BUSY
;
129 static int zfcp_scsi_slave_alloc(struct scsi_device
*sdev
)
131 struct fc_rport
*rport
= starget_to_rport(scsi_target(sdev
));
132 struct zfcp_adapter
*adapter
=
133 (struct zfcp_adapter
*) sdev
->host
->hostdata
[0];
134 struct zfcp_scsi_dev
*zfcp_sdev
= sdev_to_zfcp(sdev
);
135 struct zfcp_port
*port
;
136 struct zfcp_unit
*unit
;
137 int npiv
= adapter
->connection_features
& FSF_FEATURE_NPIV_MODE
;
139 port
= zfcp_get_port_by_wwpn(adapter
, rport
->port_name
);
143 unit
= zfcp_unit_find(port
, zfcp_scsi_dev_lun(sdev
));
145 put_device(&unit
->dev
);
147 if (!unit
&& !(allow_lun_scan
&& npiv
)) {
148 put_device(&port
->dev
);
152 zfcp_sdev
->port
= port
;
153 zfcp_sdev
->latencies
.write
.channel
.min
= 0xFFFFFFFF;
154 zfcp_sdev
->latencies
.write
.fabric
.min
= 0xFFFFFFFF;
155 zfcp_sdev
->latencies
.read
.channel
.min
= 0xFFFFFFFF;
156 zfcp_sdev
->latencies
.read
.fabric
.min
= 0xFFFFFFFF;
157 zfcp_sdev
->latencies
.cmd
.channel
.min
= 0xFFFFFFFF;
158 zfcp_sdev
->latencies
.cmd
.fabric
.min
= 0xFFFFFFFF;
159 spin_lock_init(&zfcp_sdev
->latencies
.lock
);
161 zfcp_erp_set_lun_status(sdev
, ZFCP_STATUS_COMMON_RUNNING
);
162 zfcp_erp_lun_reopen(sdev
, 0, "scsla_1");
163 zfcp_erp_wait(port
->adapter
);
168 static int zfcp_scsi_eh_abort_handler(struct scsi_cmnd
*scpnt
)
170 struct Scsi_Host
*scsi_host
= scpnt
->device
->host
;
171 struct zfcp_adapter
*adapter
=
172 (struct zfcp_adapter
*) scsi_host
->hostdata
[0];
173 struct zfcp_fsf_req
*old_req
, *abrt_req
;
175 unsigned long old_reqid
= (unsigned long) scpnt
->host_scribble
;
176 int retval
= SUCCESS
, ret
;
180 /* avoid race condition between late normal completion and abort */
181 write_lock_irqsave(&adapter
->abort_lock
, flags
);
183 old_req
= zfcp_reqlist_find(adapter
->req_list
, old_reqid
);
185 write_unlock_irqrestore(&adapter
->abort_lock
, flags
);
186 zfcp_dbf_scsi_abort("abrt_or", scpnt
, NULL
);
187 return FAILED
; /* completion could be in progress */
189 old_req
->data
= NULL
;
191 /* don't access old fsf_req after releasing the abort_lock */
192 write_unlock_irqrestore(&adapter
->abort_lock
, flags
);
195 abrt_req
= zfcp_fsf_abort_fcp_cmnd(scpnt
);
199 zfcp_erp_wait(adapter
);
200 ret
= fc_block_scsi_eh(scpnt
);
202 zfcp_dbf_scsi_abort("abrt_bl", scpnt
, NULL
);
205 if (!(atomic_read(&adapter
->status
) &
206 ZFCP_STATUS_COMMON_RUNNING
)) {
207 zfcp_dbf_scsi_abort("abrt_ru", scpnt
, NULL
);
212 zfcp_dbf_scsi_abort("abrt_ar", scpnt
, NULL
);
216 wait_for_completion(&abrt_req
->completion
);
218 if (abrt_req
->status
& ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED
)
220 else if (abrt_req
->status
& ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED
)
226 zfcp_dbf_scsi_abort(dbf_tag
, scpnt
, abrt_req
);
227 zfcp_fsf_req_free(abrt_req
);
231 static int zfcp_task_mgmt_function(struct scsi_cmnd
*scpnt
, u8 tm_flags
)
233 struct zfcp_scsi_dev
*zfcp_sdev
= sdev_to_zfcp(scpnt
->device
);
234 struct zfcp_adapter
*adapter
= zfcp_sdev
->port
->adapter
;
235 struct zfcp_fsf_req
*fsf_req
= NULL
;
236 int retval
= SUCCESS
, ret
;
240 fsf_req
= zfcp_fsf_fcp_task_mgmt(scpnt
, tm_flags
);
244 zfcp_erp_wait(adapter
);
245 ret
= fc_block_scsi_eh(scpnt
);
249 if (!(atomic_read(&adapter
->status
) &
250 ZFCP_STATUS_COMMON_RUNNING
)) {
251 zfcp_dbf_scsi_devreset("nres", scpnt
, tm_flags
);
258 wait_for_completion(&fsf_req
->completion
);
260 if (fsf_req
->status
& ZFCP_STATUS_FSFREQ_TMFUNCFAILED
) {
261 zfcp_dbf_scsi_devreset("fail", scpnt
, tm_flags
);
264 zfcp_dbf_scsi_devreset("okay", scpnt
, tm_flags
);
266 zfcp_fsf_req_free(fsf_req
);
270 static int zfcp_scsi_eh_device_reset_handler(struct scsi_cmnd
*scpnt
)
272 return zfcp_task_mgmt_function(scpnt
, FCP_TMF_LUN_RESET
);
275 static int zfcp_scsi_eh_target_reset_handler(struct scsi_cmnd
*scpnt
)
277 return zfcp_task_mgmt_function(scpnt
, FCP_TMF_TGT_RESET
);
280 static int zfcp_scsi_eh_host_reset_handler(struct scsi_cmnd
*scpnt
)
282 struct zfcp_scsi_dev
*zfcp_sdev
= sdev_to_zfcp(scpnt
->device
);
283 struct zfcp_adapter
*adapter
= zfcp_sdev
->port
->adapter
;
286 zfcp_erp_adapter_reopen(adapter
, 0, "schrh_1");
287 zfcp_erp_wait(adapter
);
288 ret
= fc_block_scsi_eh(scpnt
);
295 struct scsi_transport_template
*zfcp_scsi_transport_template
;
297 static struct scsi_host_template zfcp_scsi_host_template
= {
298 .module
= THIS_MODULE
,
300 .queuecommand
= zfcp_scsi_queuecommand
,
301 .eh_abort_handler
= zfcp_scsi_eh_abort_handler
,
302 .eh_device_reset_handler
= zfcp_scsi_eh_device_reset_handler
,
303 .eh_target_reset_handler
= zfcp_scsi_eh_target_reset_handler
,
304 .eh_host_reset_handler
= zfcp_scsi_eh_host_reset_handler
,
305 .slave_alloc
= zfcp_scsi_slave_alloc
,
306 .slave_configure
= zfcp_scsi_slave_configure
,
307 .slave_destroy
= zfcp_scsi_slave_destroy
,
308 .change_queue_depth
= zfcp_scsi_change_queue_depth
,
312 .sg_tablesize
= ZFCP_QDIO_MAX_SBALES_PER_REQ
,
313 .max_sectors
= (ZFCP_QDIO_MAX_SBALES_PER_REQ
* 8),
314 .dma_boundary
= ZFCP_QDIO_SBALE_LEN
- 1,
317 .shost_attrs
= zfcp_sysfs_shost_attrs
,
318 .sdev_attrs
= zfcp_sysfs_sdev_attrs
,
322 * zfcp_scsi_adapter_register - Register SCSI and FC host with SCSI midlayer
323 * @adapter: The zfcp adapter to register with the SCSI midlayer
325 int zfcp_scsi_adapter_register(struct zfcp_adapter
*adapter
)
327 struct ccw_dev_id dev_id
;
329 if (adapter
->scsi_host
)
332 ccw_device_get_id(adapter
->ccw_device
, &dev_id
);
333 /* register adapter as SCSI host with mid layer of SCSI stack */
334 adapter
->scsi_host
= scsi_host_alloc(&zfcp_scsi_host_template
,
335 sizeof (struct zfcp_adapter
*));
336 if (!adapter
->scsi_host
) {
337 dev_err(&adapter
->ccw_device
->dev
,
338 "Registering the FCP device with the "
339 "SCSI stack failed\n");
343 /* tell the SCSI stack some characteristics of this adapter */
344 adapter
->scsi_host
->max_id
= 511;
345 adapter
->scsi_host
->max_lun
= 0xFFFFFFFF;
346 adapter
->scsi_host
->max_channel
= 0;
347 adapter
->scsi_host
->unique_id
= dev_id
.devno
;
348 adapter
->scsi_host
->max_cmd_len
= 16; /* in struct fcp_cmnd */
349 adapter
->scsi_host
->transportt
= zfcp_scsi_transport_template
;
351 adapter
->scsi_host
->hostdata
[0] = (unsigned long) adapter
;
353 if (scsi_add_host(adapter
->scsi_host
, &adapter
->ccw_device
->dev
)) {
354 scsi_host_put(adapter
->scsi_host
);
362 * zfcp_scsi_adapter_unregister - Unregister SCSI and FC host from SCSI midlayer
363 * @adapter: The zfcp adapter to unregister.
365 void zfcp_scsi_adapter_unregister(struct zfcp_adapter
*adapter
)
367 struct Scsi_Host
*shost
;
368 struct zfcp_port
*port
;
370 shost
= adapter
->scsi_host
;
374 read_lock_irq(&adapter
->port_list_lock
);
375 list_for_each_entry(port
, &adapter
->port_list
, list
)
377 read_unlock_irq(&adapter
->port_list_lock
);
379 fc_remove_host(shost
);
380 scsi_remove_host(shost
);
381 scsi_host_put(shost
);
382 adapter
->scsi_host
= NULL
;
385 static struct fc_host_statistics
*
386 zfcp_init_fc_host_stats(struct zfcp_adapter
*adapter
)
388 struct fc_host_statistics
*fc_stats
;
390 if (!adapter
->fc_stats
) {
391 fc_stats
= kmalloc(sizeof(*fc_stats
), GFP_KERNEL
);
394 adapter
->fc_stats
= fc_stats
; /* freed in adapter_release */
396 memset(adapter
->fc_stats
, 0, sizeof(*adapter
->fc_stats
));
397 return adapter
->fc_stats
;
400 static void zfcp_adjust_fc_host_stats(struct fc_host_statistics
*fc_stats
,
401 struct fsf_qtcb_bottom_port
*data
,
402 struct fsf_qtcb_bottom_port
*old
)
404 fc_stats
->seconds_since_last_reset
=
405 data
->seconds_since_last_reset
- old
->seconds_since_last_reset
;
406 fc_stats
->tx_frames
= data
->tx_frames
- old
->tx_frames
;
407 fc_stats
->tx_words
= data
->tx_words
- old
->tx_words
;
408 fc_stats
->rx_frames
= data
->rx_frames
- old
->rx_frames
;
409 fc_stats
->rx_words
= data
->rx_words
- old
->rx_words
;
410 fc_stats
->lip_count
= data
->lip
- old
->lip
;
411 fc_stats
->nos_count
= data
->nos
- old
->nos
;
412 fc_stats
->error_frames
= data
->error_frames
- old
->error_frames
;
413 fc_stats
->dumped_frames
= data
->dumped_frames
- old
->dumped_frames
;
414 fc_stats
->link_failure_count
= data
->link_failure
- old
->link_failure
;
415 fc_stats
->loss_of_sync_count
= data
->loss_of_sync
- old
->loss_of_sync
;
416 fc_stats
->loss_of_signal_count
=
417 data
->loss_of_signal
- old
->loss_of_signal
;
418 fc_stats
->prim_seq_protocol_err_count
=
419 data
->psp_error_counts
- old
->psp_error_counts
;
420 fc_stats
->invalid_tx_word_count
=
421 data
->invalid_tx_words
- old
->invalid_tx_words
;
422 fc_stats
->invalid_crc_count
= data
->invalid_crcs
- old
->invalid_crcs
;
423 fc_stats
->fcp_input_requests
=
424 data
->input_requests
- old
->input_requests
;
425 fc_stats
->fcp_output_requests
=
426 data
->output_requests
- old
->output_requests
;
427 fc_stats
->fcp_control_requests
=
428 data
->control_requests
- old
->control_requests
;
429 fc_stats
->fcp_input_megabytes
= data
->input_mb
- old
->input_mb
;
430 fc_stats
->fcp_output_megabytes
= data
->output_mb
- old
->output_mb
;
433 static void zfcp_set_fc_host_stats(struct fc_host_statistics
*fc_stats
,
434 struct fsf_qtcb_bottom_port
*data
)
436 fc_stats
->seconds_since_last_reset
= data
->seconds_since_last_reset
;
437 fc_stats
->tx_frames
= data
->tx_frames
;
438 fc_stats
->tx_words
= data
->tx_words
;
439 fc_stats
->rx_frames
= data
->rx_frames
;
440 fc_stats
->rx_words
= data
->rx_words
;
441 fc_stats
->lip_count
= data
->lip
;
442 fc_stats
->nos_count
= data
->nos
;
443 fc_stats
->error_frames
= data
->error_frames
;
444 fc_stats
->dumped_frames
= data
->dumped_frames
;
445 fc_stats
->link_failure_count
= data
->link_failure
;
446 fc_stats
->loss_of_sync_count
= data
->loss_of_sync
;
447 fc_stats
->loss_of_signal_count
= data
->loss_of_signal
;
448 fc_stats
->prim_seq_protocol_err_count
= data
->psp_error_counts
;
449 fc_stats
->invalid_tx_word_count
= data
->invalid_tx_words
;
450 fc_stats
->invalid_crc_count
= data
->invalid_crcs
;
451 fc_stats
->fcp_input_requests
= data
->input_requests
;
452 fc_stats
->fcp_output_requests
= data
->output_requests
;
453 fc_stats
->fcp_control_requests
= data
->control_requests
;
454 fc_stats
->fcp_input_megabytes
= data
->input_mb
;
455 fc_stats
->fcp_output_megabytes
= data
->output_mb
;
458 static struct fc_host_statistics
*zfcp_get_fc_host_stats(struct Scsi_Host
*host
)
460 struct zfcp_adapter
*adapter
;
461 struct fc_host_statistics
*fc_stats
;
462 struct fsf_qtcb_bottom_port
*data
;
465 adapter
= (struct zfcp_adapter
*)host
->hostdata
[0];
466 fc_stats
= zfcp_init_fc_host_stats(adapter
);
470 data
= kzalloc(sizeof(*data
), GFP_KERNEL
);
474 ret
= zfcp_fsf_exchange_port_data_sync(adapter
->qdio
, data
);
480 if (adapter
->stats_reset
&&
481 ((jiffies
/HZ
- adapter
->stats_reset
) <
482 data
->seconds_since_last_reset
))
483 zfcp_adjust_fc_host_stats(fc_stats
, data
,
484 adapter
->stats_reset_data
);
486 zfcp_set_fc_host_stats(fc_stats
, data
);
492 static void zfcp_reset_fc_host_stats(struct Scsi_Host
*shost
)
494 struct zfcp_adapter
*adapter
;
495 struct fsf_qtcb_bottom_port
*data
;
498 adapter
= (struct zfcp_adapter
*)shost
->hostdata
[0];
499 data
= kzalloc(sizeof(*data
), GFP_KERNEL
);
503 ret
= zfcp_fsf_exchange_port_data_sync(adapter
->qdio
, data
);
507 adapter
->stats_reset
= jiffies
/HZ
;
508 kfree(adapter
->stats_reset_data
);
509 adapter
->stats_reset_data
= data
; /* finally freed in
514 static void zfcp_get_host_port_state(struct Scsi_Host
*shost
)
516 struct zfcp_adapter
*adapter
=
517 (struct zfcp_adapter
*)shost
->hostdata
[0];
518 int status
= atomic_read(&adapter
->status
);
520 if ((status
& ZFCP_STATUS_COMMON_RUNNING
) &&
521 !(status
& ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED
))
522 fc_host_port_state(shost
) = FC_PORTSTATE_ONLINE
;
523 else if (status
& ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED
)
524 fc_host_port_state(shost
) = FC_PORTSTATE_LINKDOWN
;
525 else if (status
& ZFCP_STATUS_COMMON_ERP_FAILED
)
526 fc_host_port_state(shost
) = FC_PORTSTATE_ERROR
;
528 fc_host_port_state(shost
) = FC_PORTSTATE_UNKNOWN
;
531 static void zfcp_set_rport_dev_loss_tmo(struct fc_rport
*rport
, u32 timeout
)
533 rport
->dev_loss_tmo
= timeout
;
537 * zfcp_scsi_terminate_rport_io - Terminate all I/O on a rport
538 * @rport: The FC rport where to teminate I/O
540 * Abort all pending SCSI commands for a port by closing the
541 * port. Using a reopen avoids a conflict with a shutdown
542 * overwriting a reopen. The "forced" ensures that a disappeared port
543 * is not opened again as valid due to the cached plogi data in
546 static void zfcp_scsi_terminate_rport_io(struct fc_rport
*rport
)
548 struct zfcp_port
*port
;
549 struct Scsi_Host
*shost
= rport_to_shost(rport
);
550 struct zfcp_adapter
*adapter
=
551 (struct zfcp_adapter
*)shost
->hostdata
[0];
553 port
= zfcp_get_port_by_wwpn(adapter
, rport
->port_name
);
556 zfcp_erp_port_forced_reopen(port
, 0, "sctrpi1");
557 put_device(&port
->dev
);
561 static void zfcp_scsi_rport_register(struct zfcp_port
*port
)
563 struct fc_rport_identifiers ids
;
564 struct fc_rport
*rport
;
569 ids
.node_name
= port
->wwnn
;
570 ids
.port_name
= port
->wwpn
;
571 ids
.port_id
= port
->d_id
;
572 ids
.roles
= FC_RPORT_ROLE_FCP_TARGET
;
574 rport
= fc_remote_port_add(port
->adapter
->scsi_host
, 0, &ids
);
576 dev_err(&port
->adapter
->ccw_device
->dev
,
577 "Registering port 0x%016Lx failed\n",
578 (unsigned long long)port
->wwpn
);
582 rport
->maxframe_size
= port
->maxframe_size
;
583 rport
->supported_classes
= port
->supported_classes
;
585 port
->starget_id
= rport
->scsi_target_id
;
587 zfcp_unit_queue_scsi_scan(port
);
590 static void zfcp_scsi_rport_block(struct zfcp_port
*port
)
592 struct fc_rport
*rport
= port
->rport
;
595 fc_remote_port_delete(rport
);
600 void zfcp_scsi_schedule_rport_register(struct zfcp_port
*port
)
602 get_device(&port
->dev
);
603 port
->rport_task
= RPORT_ADD
;
605 if (!queue_work(port
->adapter
->work_queue
, &port
->rport_work
))
606 put_device(&port
->dev
);
609 void zfcp_scsi_schedule_rport_block(struct zfcp_port
*port
)
611 get_device(&port
->dev
);
612 port
->rport_task
= RPORT_DEL
;
614 if (port
->rport
&& queue_work(port
->adapter
->work_queue
,
618 put_device(&port
->dev
);
621 void zfcp_scsi_schedule_rports_block(struct zfcp_adapter
*adapter
)
624 struct zfcp_port
*port
;
626 read_lock_irqsave(&adapter
->port_list_lock
, flags
);
627 list_for_each_entry(port
, &adapter
->port_list
, list
)
628 zfcp_scsi_schedule_rport_block(port
);
629 read_unlock_irqrestore(&adapter
->port_list_lock
, flags
);
632 void zfcp_scsi_rport_work(struct work_struct
*work
)
634 struct zfcp_port
*port
= container_of(work
, struct zfcp_port
,
637 while (port
->rport_task
) {
638 if (port
->rport_task
== RPORT_ADD
) {
639 port
->rport_task
= RPORT_NONE
;
640 zfcp_scsi_rport_register(port
);
642 port
->rport_task
= RPORT_NONE
;
643 zfcp_scsi_rport_block(port
);
647 put_device(&port
->dev
);
651 * zfcp_scsi_set_prot - Configure DIF/DIX support in scsi_host
652 * @adapter: The adapter where to configure DIF/DIX for the SCSI host
654 void zfcp_scsi_set_prot(struct zfcp_adapter
*adapter
)
656 unsigned int mask
= 0;
657 unsigned int data_div
;
658 struct Scsi_Host
*shost
= adapter
->scsi_host
;
660 data_div
= atomic_read(&adapter
->status
) &
661 ZFCP_STATUS_ADAPTER_DATA_DIV_ENABLED
;
664 adapter
->adapter_features
& FSF_FEATURE_DIF_PROT_TYPE1
)
665 mask
|= SHOST_DIF_TYPE1_PROTECTION
;
667 if (enable_dif
&& data_div
&&
668 adapter
->adapter_features
& FSF_FEATURE_DIX_PROT_TCPIP
) {
669 mask
|= SHOST_DIX_TYPE1_PROTECTION
;
670 scsi_host_set_guard(shost
, SHOST_DIX_GUARD_IP
);
671 shost
->sg_prot_tablesize
= ZFCP_QDIO_MAX_SBALES_PER_REQ
/ 2;
672 shost
->sg_tablesize
= ZFCP_QDIO_MAX_SBALES_PER_REQ
/ 2;
673 shost
->max_sectors
= ZFCP_QDIO_MAX_SBALES_PER_REQ
* 8 / 2;
676 scsi_host_set_prot(shost
, mask
);
680 * zfcp_scsi_dif_sense_error - Report DIF/DIX error as driver sense error
681 * @scmd: The SCSI command to report the error for
682 * @ascq: The ASCQ to put in the sense buffer
684 * See the error handling in sd_done for the sense codes used here.
685 * Set DID_SOFT_ERROR to retry the request, if possible.
687 void zfcp_scsi_dif_sense_error(struct scsi_cmnd
*scmd
, int ascq
)
689 scsi_build_sense_buffer(1, scmd
->sense_buffer
,
690 ILLEGAL_REQUEST
, 0x10, ascq
);
691 set_driver_byte(scmd
, DRIVER_SENSE
);
692 scmd
->result
|= SAM_STAT_CHECK_CONDITION
;
693 set_host_byte(scmd
, DID_SOFT_ERROR
);
696 struct fc_function_template zfcp_transport_functions
= {
697 .show_starget_port_id
= 1,
698 .show_starget_port_name
= 1,
699 .show_starget_node_name
= 1,
700 .show_rport_supported_classes
= 1,
701 .show_rport_maxframe_size
= 1,
702 .show_rport_dev_loss_tmo
= 1,
703 .show_host_node_name
= 1,
704 .show_host_port_name
= 1,
705 .show_host_permanent_port_name
= 1,
706 .show_host_supported_classes
= 1,
707 .show_host_supported_fc4s
= 1,
708 .show_host_supported_speeds
= 1,
709 .show_host_maxframe_size
= 1,
710 .show_host_serial_number
= 1,
711 .get_fc_host_stats
= zfcp_get_fc_host_stats
,
712 .reset_fc_host_stats
= zfcp_reset_fc_host_stats
,
713 .set_rport_dev_loss_tmo
= zfcp_set_rport_dev_loss_tmo
,
714 .get_host_port_state
= zfcp_get_host_port_state
,
715 .terminate_rport_io
= zfcp_scsi_terminate_rport_io
,
716 .show_host_port_state
= 1,
717 .show_host_active_fc4s
= 1,
718 .bsg_request
= zfcp_fc_exec_bsg_job
,
719 .bsg_timeout
= zfcp_fc_timeout_bsg_job
,
720 /* no functions registered for following dynamic attributes but
721 directly set by LLDD */
722 .show_host_port_type
= 1,
723 .show_host_symbolic_name
= 1,
724 .show_host_speed
= 1,
725 .show_host_port_id
= 1,
726 .dd_bsg_size
= sizeof(struct zfcp_fsf_ct_els
),