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