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