4 * Interface to Linux SCSI midlayer.
6 * Copyright IBM Corporation 2002, 2008
10 #include <asm/atomic.h>
12 /* Find start of Sense Information in FCP response unit*/
13 char *zfcp_get_fcp_sns_info_ptr(struct fcp_rsp_iu
*fcp_rsp_iu
)
15 char *fcp_sns_info_ptr
;
17 fcp_sns_info_ptr
= (unsigned char *) &fcp_rsp_iu
[1];
18 if (fcp_rsp_iu
->validity
.bits
.fcp_rsp_len_valid
)
19 fcp_sns_info_ptr
+= fcp_rsp_iu
->fcp_rsp_len
;
21 return fcp_sns_info_ptr
;
24 static void zfcp_scsi_slave_destroy(struct scsi_device
*sdpnt
)
26 struct zfcp_unit
*unit
= (struct zfcp_unit
*) sdpnt
->hostdata
;
27 atomic_clear_mask(ZFCP_STATUS_UNIT_REGISTERED
, &unit
->status
);
29 zfcp_erp_unit_failed(unit
, 12, NULL
);
33 static int zfcp_scsi_slave_configure(struct scsi_device
*sdp
)
35 if (sdp
->tagged_supported
)
36 scsi_adjust_queue_depth(sdp
, MSG_SIMPLE_TAG
, 32);
38 scsi_adjust_queue_depth(sdp
, 0, 1);
42 static void zfcp_scsi_command_fail(struct scsi_cmnd
*scpnt
, int result
)
44 set_host_byte(scpnt
, result
);
45 if ((scpnt
->device
!= NULL
) && (scpnt
->device
->host
!= NULL
))
46 zfcp_scsi_dbf_event_result("fail", 4,
47 (struct zfcp_adapter
*) scpnt
->device
->host
->hostdata
[0],
50 scpnt
->scsi_done(scpnt
);
53 static int zfcp_scsi_queuecommand(struct scsi_cmnd
*scpnt
,
54 void (*done
) (struct scsi_cmnd
*))
56 struct zfcp_unit
*unit
;
57 struct zfcp_adapter
*adapter
;
61 /* reset the status for this request */
63 scpnt
->host_scribble
= NULL
;
64 scpnt
->scsi_done
= done
;
67 * figure out adapter and target device
68 * (stored there by zfcp_scsi_slave_alloc)
70 adapter
= (struct zfcp_adapter
*) scpnt
->device
->host
->hostdata
[0];
71 unit
= scpnt
->device
->hostdata
;
73 BUG_ON(!adapter
|| (adapter
!= unit
->port
->adapter
));
74 BUG_ON(!scpnt
->scsi_done
);
76 if (unlikely(!unit
)) {
77 zfcp_scsi_command_fail(scpnt
, DID_NO_CONNECT
);
81 status
= atomic_read(&unit
->status
);
82 if (unlikely((status
& ZFCP_STATUS_COMMON_ERP_FAILED
) ||
83 !(status
& ZFCP_STATUS_COMMON_RUNNING
))) {
84 zfcp_scsi_command_fail(scpnt
, DID_ERROR
);
88 ret
= zfcp_fsf_send_fcp_command_task(adapter
, unit
, scpnt
, 0,
89 ZFCP_REQ_AUTO_CLEANUP
);
90 if (unlikely(ret
== -EBUSY
))
91 zfcp_scsi_command_fail(scpnt
, DID_NO_CONNECT
);
92 else if (unlikely(ret
< 0))
93 return SCSI_MLQUEUE_HOST_BUSY
;
98 static struct zfcp_unit
*zfcp_unit_lookup(struct zfcp_adapter
*adapter
,
99 int channel
, unsigned int id
,
102 struct zfcp_port
*port
;
103 struct zfcp_unit
*unit
;
106 list_for_each_entry(port
, &adapter
->port_list_head
, list
) {
107 if (!port
->rport
|| (id
!= port
->rport
->scsi_target_id
))
109 list_for_each_entry(unit
, &port
->unit_list_head
, list
) {
110 scsi_lun
= scsilun_to_int(
111 (struct scsi_lun
*)&unit
->fcp_lun
);
120 static int zfcp_scsi_slave_alloc(struct scsi_device
*sdp
)
122 struct zfcp_adapter
*adapter
;
123 struct zfcp_unit
*unit
;
127 adapter
= (struct zfcp_adapter
*) sdp
->host
->hostdata
[0];
131 read_lock_irqsave(&zfcp_data
.config_lock
, flags
);
132 unit
= zfcp_unit_lookup(adapter
, sdp
->channel
, sdp
->id
, sdp
->lun
);
134 (atomic_read(&unit
->status
) & ZFCP_STATUS_UNIT_REGISTERED
)) {
135 sdp
->hostdata
= unit
;
140 read_unlock_irqrestore(&zfcp_data
.config_lock
, flags
);
145 static int zfcp_scsi_eh_abort_handler(struct scsi_cmnd
*scpnt
)
147 struct Scsi_Host
*scsi_host
;
148 struct zfcp_adapter
*adapter
;
149 struct zfcp_unit
*unit
;
150 struct zfcp_fsf_req
*fsf_req
;
152 unsigned long old_req_id
= (unsigned long) scpnt
->host_scribble
;
153 int retval
= SUCCESS
;
155 scsi_host
= scpnt
->device
->host
;
156 adapter
= (struct zfcp_adapter
*) scsi_host
->hostdata
[0];
157 unit
= scpnt
->device
->hostdata
;
159 /* avoid race condition between late normal completion and abort */
160 write_lock_irqsave(&adapter
->abort_lock
, flags
);
162 /* Check whether corresponding fsf_req is still pending */
163 spin_lock(&adapter
->req_list_lock
);
164 fsf_req
= zfcp_reqlist_find(adapter
, old_req_id
);
165 spin_unlock(&adapter
->req_list_lock
);
167 write_unlock_irqrestore(&adapter
->abort_lock
, flags
);
168 zfcp_scsi_dbf_event_abort("lte1", adapter
, scpnt
, NULL
, 0);
171 fsf_req
->data
= NULL
;
173 /* don't access old fsf_req after releasing the abort_lock */
174 write_unlock_irqrestore(&adapter
->abort_lock
, flags
);
176 fsf_req
= zfcp_fsf_abort_fcp_command(old_req_id
, adapter
, unit
, 0);
178 zfcp_scsi_dbf_event_abort("nres", adapter
, scpnt
, NULL
,
184 __wait_event(fsf_req
->completion_wq
,
185 fsf_req
->status
& ZFCP_STATUS_FSFREQ_COMPLETED
);
187 if (fsf_req
->status
& ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED
) {
188 zfcp_scsi_dbf_event_abort("okay", adapter
, scpnt
, fsf_req
, 0);
189 } else if (fsf_req
->status
& ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED
) {
190 zfcp_scsi_dbf_event_abort("lte2", adapter
, scpnt
, fsf_req
, 0);
192 zfcp_scsi_dbf_event_abort("fail", adapter
, scpnt
, fsf_req
, 0);
195 zfcp_fsf_req_free(fsf_req
);
200 static int zfcp_task_mgmt_function(struct zfcp_unit
*unit
, u8 tm_flags
,
201 struct scsi_cmnd
*scpnt
)
203 struct zfcp_adapter
*adapter
= unit
->port
->adapter
;
204 struct zfcp_fsf_req
*fsf_req
;
205 int retval
= SUCCESS
;
207 /* issue task management function */
208 fsf_req
= zfcp_fsf_send_fcp_ctm(adapter
, unit
, tm_flags
, 0);
210 zfcp_scsi_dbf_event_devreset("nres", tm_flags
, unit
, scpnt
);
214 __wait_event(fsf_req
->completion_wq
,
215 fsf_req
->status
& ZFCP_STATUS_FSFREQ_COMPLETED
);
218 * check completion status of task management function
220 if (fsf_req
->status
& ZFCP_STATUS_FSFREQ_TMFUNCFAILED
) {
221 zfcp_scsi_dbf_event_devreset("fail", tm_flags
, unit
, scpnt
);
223 } else if (fsf_req
->status
& ZFCP_STATUS_FSFREQ_TMFUNCNOTSUPP
) {
224 zfcp_scsi_dbf_event_devreset("nsup", tm_flags
, unit
, scpnt
);
227 zfcp_scsi_dbf_event_devreset("okay", tm_flags
, unit
, scpnt
);
229 zfcp_fsf_req_free(fsf_req
);
234 static int zfcp_scsi_eh_device_reset_handler(struct scsi_cmnd
*scpnt
)
236 struct zfcp_unit
*unit
= scpnt
->device
->hostdata
;
242 return zfcp_task_mgmt_function(unit
, FCP_LOGICAL_UNIT_RESET
, scpnt
);
245 static int zfcp_scsi_eh_target_reset_handler(struct scsi_cmnd
*scpnt
)
247 struct zfcp_unit
*unit
= scpnt
->device
->hostdata
;
253 return zfcp_task_mgmt_function(unit
, FCP_TARGET_RESET
, scpnt
);
256 static int zfcp_scsi_eh_host_reset_handler(struct scsi_cmnd
*scpnt
)
258 struct zfcp_unit
*unit
;
259 struct zfcp_adapter
*adapter
;
261 unit
= scpnt
->device
->hostdata
;
262 adapter
= unit
->port
->adapter
;
263 zfcp_erp_adapter_reopen(adapter
, 0, 141, scpnt
);
264 zfcp_erp_wait(adapter
);
269 int zfcp_adapter_scsi_register(struct zfcp_adapter
*adapter
)
271 struct ccw_dev_id dev_id
;
273 if (adapter
->scsi_host
)
276 ccw_device_get_id(adapter
->ccw_device
, &dev_id
);
277 /* register adapter as SCSI host with mid layer of SCSI stack */
278 adapter
->scsi_host
= scsi_host_alloc(&zfcp_data
.scsi_host_template
,
279 sizeof (struct zfcp_adapter
*));
280 if (!adapter
->scsi_host
) {
281 dev_err(&adapter
->ccw_device
->dev
,
282 "Registering the FCP device with the "
283 "SCSI stack failed\n");
287 /* tell the SCSI stack some characteristics of this adapter */
288 adapter
->scsi_host
->max_id
= 1;
289 adapter
->scsi_host
->max_lun
= 1;
290 adapter
->scsi_host
->max_channel
= 0;
291 adapter
->scsi_host
->unique_id
= dev_id
.devno
;
292 adapter
->scsi_host
->max_cmd_len
= 255;
293 adapter
->scsi_host
->transportt
= zfcp_data
.scsi_transport_template
;
295 adapter
->scsi_host
->hostdata
[0] = (unsigned long) adapter
;
297 if (scsi_add_host(adapter
->scsi_host
, &adapter
->ccw_device
->dev
)) {
298 scsi_host_put(adapter
->scsi_host
);
305 void zfcp_adapter_scsi_unregister(struct zfcp_adapter
*adapter
)
307 struct Scsi_Host
*shost
;
308 struct zfcp_port
*port
;
310 shost
= adapter
->scsi_host
;
314 read_lock_irq(&zfcp_data
.config_lock
);
315 list_for_each_entry(port
, &adapter
->port_list_head
, list
)
319 read_unlock_irq(&zfcp_data
.config_lock
);
320 fc_remove_host(shost
);
321 scsi_remove_host(shost
);
322 scsi_host_put(shost
);
323 adapter
->scsi_host
= NULL
;
328 static struct fc_host_statistics
*
329 zfcp_init_fc_host_stats(struct zfcp_adapter
*adapter
)
331 struct fc_host_statistics
*fc_stats
;
333 if (!adapter
->fc_stats
) {
334 fc_stats
= kmalloc(sizeof(*fc_stats
), GFP_KERNEL
);
337 adapter
->fc_stats
= fc_stats
; /* freed in adater_dequeue */
339 memset(adapter
->fc_stats
, 0, sizeof(*adapter
->fc_stats
));
340 return adapter
->fc_stats
;
343 static void zfcp_adjust_fc_host_stats(struct fc_host_statistics
*fc_stats
,
344 struct fsf_qtcb_bottom_port
*data
,
345 struct fsf_qtcb_bottom_port
*old
)
347 fc_stats
->seconds_since_last_reset
=
348 data
->seconds_since_last_reset
- old
->seconds_since_last_reset
;
349 fc_stats
->tx_frames
= data
->tx_frames
- old
->tx_frames
;
350 fc_stats
->tx_words
= data
->tx_words
- old
->tx_words
;
351 fc_stats
->rx_frames
= data
->rx_frames
- old
->rx_frames
;
352 fc_stats
->rx_words
= data
->rx_words
- old
->rx_words
;
353 fc_stats
->lip_count
= data
->lip
- old
->lip
;
354 fc_stats
->nos_count
= data
->nos
- old
->nos
;
355 fc_stats
->error_frames
= data
->error_frames
- old
->error_frames
;
356 fc_stats
->dumped_frames
= data
->dumped_frames
- old
->dumped_frames
;
357 fc_stats
->link_failure_count
= data
->link_failure
- old
->link_failure
;
358 fc_stats
->loss_of_sync_count
= data
->loss_of_sync
- old
->loss_of_sync
;
359 fc_stats
->loss_of_signal_count
=
360 data
->loss_of_signal
- old
->loss_of_signal
;
361 fc_stats
->prim_seq_protocol_err_count
=
362 data
->psp_error_counts
- old
->psp_error_counts
;
363 fc_stats
->invalid_tx_word_count
=
364 data
->invalid_tx_words
- old
->invalid_tx_words
;
365 fc_stats
->invalid_crc_count
= data
->invalid_crcs
- old
->invalid_crcs
;
366 fc_stats
->fcp_input_requests
=
367 data
->input_requests
- old
->input_requests
;
368 fc_stats
->fcp_output_requests
=
369 data
->output_requests
- old
->output_requests
;
370 fc_stats
->fcp_control_requests
=
371 data
->control_requests
- old
->control_requests
;
372 fc_stats
->fcp_input_megabytes
= data
->input_mb
- old
->input_mb
;
373 fc_stats
->fcp_output_megabytes
= data
->output_mb
- old
->output_mb
;
376 static void zfcp_set_fc_host_stats(struct fc_host_statistics
*fc_stats
,
377 struct fsf_qtcb_bottom_port
*data
)
379 fc_stats
->seconds_since_last_reset
= data
->seconds_since_last_reset
;
380 fc_stats
->tx_frames
= data
->tx_frames
;
381 fc_stats
->tx_words
= data
->tx_words
;
382 fc_stats
->rx_frames
= data
->rx_frames
;
383 fc_stats
->rx_words
= data
->rx_words
;
384 fc_stats
->lip_count
= data
->lip
;
385 fc_stats
->nos_count
= data
->nos
;
386 fc_stats
->error_frames
= data
->error_frames
;
387 fc_stats
->dumped_frames
= data
->dumped_frames
;
388 fc_stats
->link_failure_count
= data
->link_failure
;
389 fc_stats
->loss_of_sync_count
= data
->loss_of_sync
;
390 fc_stats
->loss_of_signal_count
= data
->loss_of_signal
;
391 fc_stats
->prim_seq_protocol_err_count
= data
->psp_error_counts
;
392 fc_stats
->invalid_tx_word_count
= data
->invalid_tx_words
;
393 fc_stats
->invalid_crc_count
= data
->invalid_crcs
;
394 fc_stats
->fcp_input_requests
= data
->input_requests
;
395 fc_stats
->fcp_output_requests
= data
->output_requests
;
396 fc_stats
->fcp_control_requests
= data
->control_requests
;
397 fc_stats
->fcp_input_megabytes
= data
->input_mb
;
398 fc_stats
->fcp_output_megabytes
= data
->output_mb
;
401 static struct fc_host_statistics
*zfcp_get_fc_host_stats(struct Scsi_Host
*host
)
403 struct zfcp_adapter
*adapter
;
404 struct fc_host_statistics
*fc_stats
;
405 struct fsf_qtcb_bottom_port
*data
;
408 adapter
= (struct zfcp_adapter
*)host
->hostdata
[0];
409 fc_stats
= zfcp_init_fc_host_stats(adapter
);
413 data
= kzalloc(sizeof(*data
), GFP_KERNEL
);
417 ret
= zfcp_fsf_exchange_port_data_sync(adapter
, data
);
423 if (adapter
->stats_reset
&&
424 ((jiffies
/HZ
- adapter
->stats_reset
) <
425 data
->seconds_since_last_reset
))
426 zfcp_adjust_fc_host_stats(fc_stats
, data
,
427 adapter
->stats_reset_data
);
429 zfcp_set_fc_host_stats(fc_stats
, data
);
435 static void zfcp_reset_fc_host_stats(struct Scsi_Host
*shost
)
437 struct zfcp_adapter
*adapter
;
438 struct fsf_qtcb_bottom_port
*data
;
441 adapter
= (struct zfcp_adapter
*)shost
->hostdata
[0];
442 data
= kzalloc(sizeof(*data
), GFP_KERNEL
);
446 ret
= zfcp_fsf_exchange_port_data_sync(adapter
, data
);
450 adapter
->stats_reset
= jiffies
/HZ
;
451 kfree(adapter
->stats_reset_data
);
452 adapter
->stats_reset_data
= data
; /* finally freed in
457 static void zfcp_get_host_port_state(struct Scsi_Host
*shost
)
459 struct zfcp_adapter
*adapter
=
460 (struct zfcp_adapter
*)shost
->hostdata
[0];
461 int status
= atomic_read(&adapter
->status
);
463 if ((status
& ZFCP_STATUS_COMMON_RUNNING
) &&
464 !(status
& ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED
))
465 fc_host_port_state(shost
) = FC_PORTSTATE_ONLINE
;
466 else if (status
& ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED
)
467 fc_host_port_state(shost
) = FC_PORTSTATE_LINKDOWN
;
468 else if (status
& ZFCP_STATUS_COMMON_ERP_FAILED
)
469 fc_host_port_state(shost
) = FC_PORTSTATE_ERROR
;
471 fc_host_port_state(shost
) = FC_PORTSTATE_UNKNOWN
;
474 static void zfcp_set_rport_dev_loss_tmo(struct fc_rport
*rport
, u32 timeout
)
476 rport
->dev_loss_tmo
= timeout
;
479 struct fc_function_template zfcp_transport_functions
= {
480 .show_starget_port_id
= 1,
481 .show_starget_port_name
= 1,
482 .show_starget_node_name
= 1,
483 .show_rport_supported_classes
= 1,
484 .show_rport_maxframe_size
= 1,
485 .show_rport_dev_loss_tmo
= 1,
486 .show_host_node_name
= 1,
487 .show_host_port_name
= 1,
488 .show_host_permanent_port_name
= 1,
489 .show_host_supported_classes
= 1,
490 .show_host_supported_speeds
= 1,
491 .show_host_maxframe_size
= 1,
492 .show_host_serial_number
= 1,
493 .get_fc_host_stats
= zfcp_get_fc_host_stats
,
494 .reset_fc_host_stats
= zfcp_reset_fc_host_stats
,
495 .set_rport_dev_loss_tmo
= zfcp_set_rport_dev_loss_tmo
,
496 .get_host_port_state
= zfcp_get_host_port_state
,
497 .show_host_port_state
= 1,
498 /* no functions registered for following dynamic attributes but
499 directly set by LLDD */
500 .show_host_port_type
= 1,
501 .show_host_speed
= 1,
502 .show_host_port_id
= 1,
503 .disable_target_scan
= 1,
506 struct zfcp_data zfcp_data
= {
507 .scsi_host_template
= {
509 .module
= THIS_MODULE
,
511 .slave_alloc
= zfcp_scsi_slave_alloc
,
512 .slave_configure
= zfcp_scsi_slave_configure
,
513 .slave_destroy
= zfcp_scsi_slave_destroy
,
514 .queuecommand
= zfcp_scsi_queuecommand
,
515 .eh_abort_handler
= zfcp_scsi_eh_abort_handler
,
516 .eh_device_reset_handler
= zfcp_scsi_eh_device_reset_handler
,
517 .eh_target_reset_handler
= zfcp_scsi_eh_target_reset_handler
,
518 .eh_host_reset_handler
= zfcp_scsi_eh_host_reset_handler
,
521 .sg_tablesize
= ZFCP_MAX_SBALES_PER_REQ
,
524 .sdev_attrs
= zfcp_sysfs_sdev_attrs
,
525 .max_sectors
= (ZFCP_MAX_SBALES_PER_REQ
* 8),
526 .shost_attrs
= zfcp_sysfs_shost_attrs
,