[SCSI] zfcp: Remove UNIT_REGISTERED status flag
[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, 2008
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, 12, 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;
61         int    ret;
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         status = atomic_read(&unit->status);
84         if (unlikely((status & ZFCP_STATUS_COMMON_ERP_FAILED) ||
85                      !(status & ZFCP_STATUS_COMMON_RUNNING))) {
86                 zfcp_scsi_command_fail(scpnt, DID_ERROR);
87                 return 0;;
88         }
89
90         ret = zfcp_fsf_send_fcp_command_task(adapter, unit, scpnt, 0,
91                                              ZFCP_REQ_AUTO_CLEANUP);
92         if (unlikely(ret == -EBUSY))
93                 return SCSI_MLQUEUE_DEVICE_BUSY;
94         else if (unlikely(ret < 0))
95                 return SCSI_MLQUEUE_HOST_BUSY;
96
97         return ret;
98 }
99
100 static struct zfcp_unit *zfcp_unit_lookup(struct zfcp_adapter *adapter,
101                                           int channel, unsigned int id,
102                                           unsigned int lun)
103 {
104         struct zfcp_port *port;
105         struct zfcp_unit *unit;
106         int scsi_lun;
107
108         list_for_each_entry(port, &adapter->port_list_head, list) {
109                 if (!port->rport || (id != port->rport->scsi_target_id))
110                         continue;
111                 list_for_each_entry(unit, &port->unit_list_head, list) {
112                         scsi_lun = scsilun_to_int(
113                                 (struct scsi_lun *)&unit->fcp_lun);
114                         if (lun == scsi_lun)
115                                 return unit;
116                 }
117         }
118
119         return NULL;
120 }
121
122 static int zfcp_scsi_slave_alloc(struct scsi_device *sdp)
123 {
124         struct zfcp_adapter *adapter;
125         struct zfcp_unit *unit;
126         unsigned long flags;
127         int retval = -ENXIO;
128
129         adapter = (struct zfcp_adapter *) sdp->host->hostdata[0];
130         if (!adapter)
131                 goto out;
132
133         read_lock_irqsave(&zfcp_data.config_lock, flags);
134         unit = zfcp_unit_lookup(adapter, sdp->channel, sdp->id, sdp->lun);
135         if (unit) {
136                 sdp->hostdata = unit;
137                 unit->device = sdp;
138                 zfcp_unit_get(unit);
139                 retval = 0;
140         }
141         read_unlock_irqrestore(&zfcp_data.config_lock, flags);
142 out:
143         return retval;
144 }
145
146 static int zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt)
147 {
148         struct Scsi_Host *scsi_host;
149         struct zfcp_adapter *adapter;
150         struct zfcp_unit *unit;
151         struct zfcp_fsf_req *fsf_req;
152         unsigned long flags;
153         unsigned long old_req_id = (unsigned long) scpnt->host_scribble;
154         int retval = SUCCESS;
155
156         scsi_host = scpnt->device->host;
157         adapter = (struct zfcp_adapter *) scsi_host->hostdata[0];
158         unit = scpnt->device->hostdata;
159
160         /* avoid race condition between late normal completion and abort */
161         write_lock_irqsave(&adapter->abort_lock, flags);
162
163         /* Check whether corresponding fsf_req is still pending */
164         spin_lock(&adapter->req_list_lock);
165         fsf_req = zfcp_reqlist_find(adapter, old_req_id);
166         spin_unlock(&adapter->req_list_lock);
167         if (!fsf_req) {
168                 write_unlock_irqrestore(&adapter->abort_lock, flags);
169                 zfcp_scsi_dbf_event_abort("lte1", adapter, scpnt, NULL, 0);
170                 return retval;
171         }
172         fsf_req->data = NULL;
173
174         /* don't access old fsf_req after releasing the abort_lock */
175         write_unlock_irqrestore(&adapter->abort_lock, flags);
176
177         fsf_req = zfcp_fsf_abort_fcp_command(old_req_id, adapter, unit, 0);
178         if (!fsf_req) {
179                 zfcp_scsi_dbf_event_abort("nres", adapter, scpnt, NULL,
180                                           old_req_id);
181                 retval = FAILED;
182                 return retval;
183         }
184
185         __wait_event(fsf_req->completion_wq,
186                      fsf_req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
187
188         if (fsf_req->status & ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED) {
189                 zfcp_scsi_dbf_event_abort("okay", adapter, scpnt, fsf_req, 0);
190         } else if (fsf_req->status & ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED) {
191                 zfcp_scsi_dbf_event_abort("lte2", adapter, scpnt, fsf_req, 0);
192         } else {
193                 zfcp_scsi_dbf_event_abort("fail", adapter, scpnt, fsf_req, 0);
194                 retval = FAILED;
195         }
196         zfcp_fsf_req_free(fsf_req);
197
198         return retval;
199 }
200
201 static int zfcp_task_mgmt_function(struct zfcp_unit *unit, u8 tm_flags,
202                                          struct scsi_cmnd *scpnt)
203 {
204         struct zfcp_adapter *adapter = unit->port->adapter;
205         struct zfcp_fsf_req *fsf_req;
206         int retval = SUCCESS;
207
208         /* issue task management function */
209         fsf_req = zfcp_fsf_send_fcp_ctm(adapter, unit, tm_flags, 0);
210         if (!fsf_req) {
211                 zfcp_scsi_dbf_event_devreset("nres", tm_flags, unit, scpnt);
212                 return FAILED;
213         }
214
215         __wait_event(fsf_req->completion_wq,
216                      fsf_req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
217
218         /*
219          * check completion status of task management function
220          */
221         if (fsf_req->status & ZFCP_STATUS_FSFREQ_TMFUNCFAILED) {
222                 zfcp_scsi_dbf_event_devreset("fail", tm_flags, unit, scpnt);
223                 retval = FAILED;
224         } else if (fsf_req->status & ZFCP_STATUS_FSFREQ_TMFUNCNOTSUPP) {
225                 zfcp_scsi_dbf_event_devreset("nsup", tm_flags, unit, scpnt);
226                 retval = FAILED;
227         } else
228                 zfcp_scsi_dbf_event_devreset("okay", tm_flags, unit, scpnt);
229
230         zfcp_fsf_req_free(fsf_req);
231
232         return retval;
233 }
234
235 static int zfcp_scsi_eh_device_reset_handler(struct scsi_cmnd *scpnt)
236 {
237         struct zfcp_unit *unit = scpnt->device->hostdata;
238
239         if (!unit) {
240                 WARN_ON(1);
241                 return SUCCESS;
242         }
243         return zfcp_task_mgmt_function(unit, FCP_LOGICAL_UNIT_RESET, scpnt);
244 }
245
246 static int zfcp_scsi_eh_target_reset_handler(struct scsi_cmnd *scpnt)
247 {
248         struct zfcp_unit *unit = scpnt->device->hostdata;
249
250         if (!unit) {
251                 WARN_ON(1);
252                 return SUCCESS;
253         }
254         return zfcp_task_mgmt_function(unit, FCP_TARGET_RESET, scpnt);
255 }
256
257 static int zfcp_scsi_eh_host_reset_handler(struct scsi_cmnd *scpnt)
258 {
259         struct zfcp_unit *unit;
260         struct zfcp_adapter *adapter;
261
262         unit = scpnt->device->hostdata;
263         adapter = unit->port->adapter;
264         zfcp_erp_adapter_reopen(adapter, 0, 141, scpnt);
265         zfcp_erp_wait(adapter);
266
267         return SUCCESS;
268 }
269
270 int zfcp_adapter_scsi_register(struct zfcp_adapter *adapter)
271 {
272         struct ccw_dev_id dev_id;
273
274         if (adapter->scsi_host)
275                 return 0;
276
277         ccw_device_get_id(adapter->ccw_device, &dev_id);
278         /* register adapter as SCSI host with mid layer of SCSI stack */
279         adapter->scsi_host = scsi_host_alloc(&zfcp_data.scsi_host_template,
280                                              sizeof (struct zfcp_adapter *));
281         if (!adapter->scsi_host) {
282                 dev_err(&adapter->ccw_device->dev,
283                         "Registering the FCP device with the "
284                         "SCSI stack failed\n");
285                 return -EIO;
286         }
287
288         /* tell the SCSI stack some characteristics of this adapter */
289         adapter->scsi_host->max_id = 1;
290         adapter->scsi_host->max_lun = 1;
291         adapter->scsi_host->max_channel = 0;
292         adapter->scsi_host->unique_id = dev_id.devno;
293         adapter->scsi_host->max_cmd_len = 255;
294         adapter->scsi_host->transportt = zfcp_data.scsi_transport_template;
295
296         adapter->scsi_host->hostdata[0] = (unsigned long) adapter;
297
298         if (scsi_add_host(adapter->scsi_host, &adapter->ccw_device->dev)) {
299                 scsi_host_put(adapter->scsi_host);
300                 return -EIO;
301         }
302
303         return 0;
304 }
305
306 void zfcp_adapter_scsi_unregister(struct zfcp_adapter *adapter)
307 {
308         struct Scsi_Host *shost;
309         struct zfcp_port *port;
310
311         shost = adapter->scsi_host;
312         if (!shost)
313                 return;
314
315         read_lock_irq(&zfcp_data.config_lock);
316         list_for_each_entry(port, &adapter->port_list_head, list)
317                 if (port->rport)
318                         port->rport = NULL;
319
320         read_unlock_irq(&zfcp_data.config_lock);
321         fc_remove_host(shost);
322         scsi_remove_host(shost);
323         scsi_host_put(shost);
324         adapter->scsi_host = NULL;
325
326         return;
327 }
328
329 static struct fc_host_statistics*
330 zfcp_init_fc_host_stats(struct zfcp_adapter *adapter)
331 {
332         struct fc_host_statistics *fc_stats;
333
334         if (!adapter->fc_stats) {
335                 fc_stats = kmalloc(sizeof(*fc_stats), GFP_KERNEL);
336                 if (!fc_stats)
337                         return NULL;
338                 adapter->fc_stats = fc_stats; /* freed in adater_dequeue */
339         }
340         memset(adapter->fc_stats, 0, sizeof(*adapter->fc_stats));
341         return adapter->fc_stats;
342 }
343
344 static void zfcp_adjust_fc_host_stats(struct fc_host_statistics *fc_stats,
345                                       struct fsf_qtcb_bottom_port *data,
346                                       struct fsf_qtcb_bottom_port *old)
347 {
348         fc_stats->seconds_since_last_reset =
349                 data->seconds_since_last_reset - old->seconds_since_last_reset;
350         fc_stats->tx_frames = data->tx_frames - old->tx_frames;
351         fc_stats->tx_words = data->tx_words - old->tx_words;
352         fc_stats->rx_frames = data->rx_frames - old->rx_frames;
353         fc_stats->rx_words = data->rx_words - old->rx_words;
354         fc_stats->lip_count = data->lip - old->lip;
355         fc_stats->nos_count = data->nos - old->nos;
356         fc_stats->error_frames = data->error_frames - old->error_frames;
357         fc_stats->dumped_frames = data->dumped_frames - old->dumped_frames;
358         fc_stats->link_failure_count = data->link_failure - old->link_failure;
359         fc_stats->loss_of_sync_count = data->loss_of_sync - old->loss_of_sync;
360         fc_stats->loss_of_signal_count =
361                 data->loss_of_signal - old->loss_of_signal;
362         fc_stats->prim_seq_protocol_err_count =
363                 data->psp_error_counts - old->psp_error_counts;
364         fc_stats->invalid_tx_word_count =
365                 data->invalid_tx_words - old->invalid_tx_words;
366         fc_stats->invalid_crc_count = data->invalid_crcs - old->invalid_crcs;
367         fc_stats->fcp_input_requests =
368                 data->input_requests - old->input_requests;
369         fc_stats->fcp_output_requests =
370                 data->output_requests - old->output_requests;
371         fc_stats->fcp_control_requests =
372                 data->control_requests - old->control_requests;
373         fc_stats->fcp_input_megabytes = data->input_mb - old->input_mb;
374         fc_stats->fcp_output_megabytes = data->output_mb - old->output_mb;
375 }
376
377 static void zfcp_set_fc_host_stats(struct fc_host_statistics *fc_stats,
378                                    struct fsf_qtcb_bottom_port *data)
379 {
380         fc_stats->seconds_since_last_reset = data->seconds_since_last_reset;
381         fc_stats->tx_frames = data->tx_frames;
382         fc_stats->tx_words = data->tx_words;
383         fc_stats->rx_frames = data->rx_frames;
384         fc_stats->rx_words = data->rx_words;
385         fc_stats->lip_count = data->lip;
386         fc_stats->nos_count = data->nos;
387         fc_stats->error_frames = data->error_frames;
388         fc_stats->dumped_frames = data->dumped_frames;
389         fc_stats->link_failure_count = data->link_failure;
390         fc_stats->loss_of_sync_count = data->loss_of_sync;
391         fc_stats->loss_of_signal_count = data->loss_of_signal;
392         fc_stats->prim_seq_protocol_err_count = data->psp_error_counts;
393         fc_stats->invalid_tx_word_count = data->invalid_tx_words;
394         fc_stats->invalid_crc_count = data->invalid_crcs;
395         fc_stats->fcp_input_requests = data->input_requests;
396         fc_stats->fcp_output_requests = data->output_requests;
397         fc_stats->fcp_control_requests = data->control_requests;
398         fc_stats->fcp_input_megabytes = data->input_mb;
399         fc_stats->fcp_output_megabytes = data->output_mb;
400 }
401
402 static struct fc_host_statistics *zfcp_get_fc_host_stats(struct Scsi_Host *host)
403 {
404         struct zfcp_adapter *adapter;
405         struct fc_host_statistics *fc_stats;
406         struct fsf_qtcb_bottom_port *data;
407         int ret;
408
409         adapter = (struct zfcp_adapter *)host->hostdata[0];
410         fc_stats = zfcp_init_fc_host_stats(adapter);
411         if (!fc_stats)
412                 return NULL;
413
414         data = kzalloc(sizeof(*data), GFP_KERNEL);
415         if (!data)
416                 return NULL;
417
418         ret = zfcp_fsf_exchange_port_data_sync(adapter, data);
419         if (ret) {
420                 kfree(data);
421                 return NULL;
422         }
423
424         if (adapter->stats_reset &&
425             ((jiffies/HZ - adapter->stats_reset) <
426              data->seconds_since_last_reset))
427                 zfcp_adjust_fc_host_stats(fc_stats, data,
428                                           adapter->stats_reset_data);
429         else
430                 zfcp_set_fc_host_stats(fc_stats, data);
431
432         kfree(data);
433         return fc_stats;
434 }
435
436 static void zfcp_reset_fc_host_stats(struct Scsi_Host *shost)
437 {
438         struct zfcp_adapter *adapter;
439         struct fsf_qtcb_bottom_port *data;
440         int ret;
441
442         adapter = (struct zfcp_adapter *)shost->hostdata[0];
443         data = kzalloc(sizeof(*data), GFP_KERNEL);
444         if (!data)
445                 return;
446
447         ret = zfcp_fsf_exchange_port_data_sync(adapter, data);
448         if (ret)
449                 kfree(data);
450         else {
451                 adapter->stats_reset = jiffies/HZ;
452                 kfree(adapter->stats_reset_data);
453                 adapter->stats_reset_data = data; /* finally freed in
454                                                      adapter_dequeue */
455         }
456 }
457
458 static void zfcp_get_host_port_state(struct Scsi_Host *shost)
459 {
460         struct zfcp_adapter *adapter =
461                 (struct zfcp_adapter *)shost->hostdata[0];
462         int status = atomic_read(&adapter->status);
463
464         if ((status & ZFCP_STATUS_COMMON_RUNNING) &&
465             !(status & ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED))
466                 fc_host_port_state(shost) = FC_PORTSTATE_ONLINE;
467         else if (status & ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED)
468                 fc_host_port_state(shost) = FC_PORTSTATE_LINKDOWN;
469         else if (status & ZFCP_STATUS_COMMON_ERP_FAILED)
470                 fc_host_port_state(shost) = FC_PORTSTATE_ERROR;
471         else
472                 fc_host_port_state(shost) = FC_PORTSTATE_UNKNOWN;
473 }
474
475 static void zfcp_set_rport_dev_loss_tmo(struct fc_rport *rport, u32 timeout)
476 {
477         rport->dev_loss_tmo = timeout;
478 }
479
480 struct fc_function_template zfcp_transport_functions = {
481         .show_starget_port_id = 1,
482         .show_starget_port_name = 1,
483         .show_starget_node_name = 1,
484         .show_rport_supported_classes = 1,
485         .show_rport_maxframe_size = 1,
486         .show_rport_dev_loss_tmo = 1,
487         .show_host_node_name = 1,
488         .show_host_port_name = 1,
489         .show_host_permanent_port_name = 1,
490         .show_host_supported_classes = 1,
491         .show_host_supported_speeds = 1,
492         .show_host_maxframe_size = 1,
493         .show_host_serial_number = 1,
494         .get_fc_host_stats = zfcp_get_fc_host_stats,
495         .reset_fc_host_stats = zfcp_reset_fc_host_stats,
496         .set_rport_dev_loss_tmo = zfcp_set_rport_dev_loss_tmo,
497         .get_host_port_state = zfcp_get_host_port_state,
498         .show_host_port_state = 1,
499         /* no functions registered for following dynamic attributes but
500            directly set by LLDD */
501         .show_host_port_type = 1,
502         .show_host_speed = 1,
503         .show_host_port_id = 1,
504         .disable_target_scan = 1,
505 };
506
507 struct zfcp_data zfcp_data = {
508         .scsi_host_template = {
509                 .name                    = "zfcp",
510                 .module                  = THIS_MODULE,
511                 .proc_name               = "zfcp",
512                 .slave_alloc             = zfcp_scsi_slave_alloc,
513                 .slave_configure         = zfcp_scsi_slave_configure,
514                 .slave_destroy           = zfcp_scsi_slave_destroy,
515                 .queuecommand            = zfcp_scsi_queuecommand,
516                 .eh_abort_handler        = zfcp_scsi_eh_abort_handler,
517                 .eh_device_reset_handler = zfcp_scsi_eh_device_reset_handler,
518                 .eh_target_reset_handler = zfcp_scsi_eh_target_reset_handler,
519                 .eh_host_reset_handler   = zfcp_scsi_eh_host_reset_handler,
520                 .can_queue               = 4096,
521                 .this_id                 = -1,
522                 .sg_tablesize            = ZFCP_MAX_SBALES_PER_REQ,
523                 .cmd_per_lun             = 1,
524                 .use_clustering          = 1,
525                 .sdev_attrs              = zfcp_sysfs_sdev_attrs,
526                 .max_sectors             = (ZFCP_MAX_SBALES_PER_REQ * 8),
527                 .shost_attrs             = zfcp_sysfs_shost_attrs,
528         },
529 };