]> err.no Git - linux-2.6/blob - drivers/s390/scsi/zfcp_dbf.c
[SCSI] zfcp: Remove field sbal_last from trace record.
[linux-2.6] / drivers / s390 / scsi / zfcp_dbf.c
1 /*
2  * This file is part of the zfcp device driver for
3  * FCP adapters for IBM System z9 and zSeries.
4  *
5  * (C) Copyright IBM Corp. 2002, 2006
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2, or (at your option)
10  * any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20  */
21
22 #include <linux/ctype.h>
23 #include <asm/debug.h>
24 #include "zfcp_ext.h"
25
26 static u32 dbfsize = 4;
27
28 module_param(dbfsize, uint, 0400);
29 MODULE_PARM_DESC(dbfsize,
30                  "number of pages for each debug feature area (default 4)");
31
32 #define ZFCP_LOG_AREA                   ZFCP_LOG_AREA_OTHER
33
34 static void zfcp_dbf_hexdump(debug_info_t *dbf, void *to, int to_len,
35                              int level, char *from, int from_len)
36 {
37         int offset;
38         struct zfcp_dbf_dump *dump = to;
39         int room = to_len - sizeof(*dump);
40
41         for (offset = 0; offset < from_len; offset += dump->size) {
42                 memset(to, 0, to_len);
43                 strncpy(dump->tag, "dump", ZFCP_DBF_TAG_SIZE);
44                 dump->total_size = from_len;
45                 dump->offset = offset;
46                 dump->size = min(from_len - offset, room);
47                 memcpy(dump->data, from + offset, dump->size);
48                 debug_event(dbf, level, dump, dump->size);
49         }
50 }
51
52 /* FIXME: this duplicate this code in s390 debug feature */
53 static void zfcp_dbf_timestamp(unsigned long long stck, struct timespec *time)
54 {
55         unsigned long long sec;
56
57         stck -= 0x8126d60e46000000LL - (0x3c26700LL * 1000000 * 4096);
58         sec = stck >> 12;
59         do_div(sec, 1000000);
60         time->tv_sec = sec;
61         stck -= (sec * 1000000) << 12;
62         time->tv_nsec = ((stck * 1000) >> 12);
63 }
64
65 static void zfcp_dbf_tag(char **p, const char *label, const char *tag)
66 {
67         int i;
68
69         *p += sprintf(*p, "%-24s", label);
70         for (i = 0; i < ZFCP_DBF_TAG_SIZE; i++)
71                 *p += sprintf(*p, "%c", tag[i]);
72         *p += sprintf(*p, "\n");
73 }
74
75 static void zfcp_dbf_outs(char **buf, const char *s1, const char *s2)
76 {
77         *buf += sprintf(*buf, "%-24s%s\n", s1, s2);
78 }
79
80 static void zfcp_dbf_out(char **buf, const char *s, const char *format, ...)
81 {
82         va_list arg;
83
84         *buf += sprintf(*buf, "%-24s", s);
85         va_start(arg, format);
86         *buf += vsprintf(*buf, format, arg);
87         va_end(arg);
88         *buf += sprintf(*buf, "\n");
89 }
90
91 static void zfcp_dbf_outd(char **p, const char *label, char *buffer,
92                           int buflen, int offset, int total_size)
93 {
94         if (!offset)
95                 *p += sprintf(*p, "%-24s  ", label);
96         while (buflen--) {
97                 if (offset > 0) {
98                         if ((offset % 32) == 0)
99                                 *p += sprintf(*p, "\n%-24c  ", ' ');
100                         else if ((offset % 4) == 0)
101                                 *p += sprintf(*p, " ");
102                 }
103                 *p += sprintf(*p, "%02x", *buffer++);
104                 if (++offset == total_size) {
105                         *p += sprintf(*p, "\n");
106                         break;
107                 }
108         }
109         if (!total_size)
110                 *p += sprintf(*p, "\n");
111 }
112
113 static int zfcp_dbf_view_header(debug_info_t *id, struct debug_view *view,
114                                 int area, debug_entry_t *entry, char *out_buf)
115 {
116         struct zfcp_dbf_dump *dump = (struct zfcp_dbf_dump *)DEBUG_DATA(entry);
117         struct timespec t;
118         char *p = out_buf;
119
120         if (strncmp(dump->tag, "dump", ZFCP_DBF_TAG_SIZE) != 0) {
121                 zfcp_dbf_timestamp(entry->id.stck, &t);
122                 zfcp_dbf_out(&p, "timestamp", "%011lu:%06lu",
123                              t.tv_sec, t.tv_nsec);
124                 zfcp_dbf_out(&p, "cpu", "%02i", entry->id.fields.cpuid);
125         } else  {
126                 zfcp_dbf_outd(&p, NULL, dump->data, dump->size, dump->offset,
127                               dump->total_size);
128                 if ((dump->offset + dump->size) == dump->total_size)
129                         p += sprintf(p, "\n");
130         }
131         return p - out_buf;
132 }
133
134 /**
135  * zfcp_hba_dbf_event_fsf_response - trace event for request completion
136  * @fsf_req: request that has been completed
137  */
138 void zfcp_hba_dbf_event_fsf_response(struct zfcp_fsf_req *fsf_req)
139 {
140         struct zfcp_adapter *adapter = fsf_req->adapter;
141         struct fsf_qtcb *qtcb = fsf_req->qtcb;
142         union fsf_prot_status_qual *prot_status_qual =
143                                         &qtcb->prefix.prot_status_qual;
144         union fsf_status_qual *fsf_status_qual = &qtcb->header.fsf_status_qual;
145         struct scsi_cmnd *scsi_cmnd;
146         struct zfcp_port *port;
147         struct zfcp_unit *unit;
148         struct zfcp_send_els *send_els;
149         struct zfcp_hba_dbf_record *rec = &adapter->hba_dbf_buf;
150         struct zfcp_hba_dbf_record_response *response = &rec->u.response;
151         int level;
152         unsigned long flags;
153
154         spin_lock_irqsave(&adapter->hba_dbf_lock, flags);
155         memset(rec, 0, sizeof(*rec));
156         strncpy(rec->tag, "resp", ZFCP_DBF_TAG_SIZE);
157
158         if ((qtcb->prefix.prot_status != FSF_PROT_GOOD) &&
159             (qtcb->prefix.prot_status != FSF_PROT_FSF_STATUS_PRESENTED)) {
160                 strncpy(rec->tag2, "perr", ZFCP_DBF_TAG_SIZE);
161                 level = 1;
162         } else if (qtcb->header.fsf_status != FSF_GOOD) {
163                 strncpy(rec->tag2, "ferr", ZFCP_DBF_TAG_SIZE);
164                 level = 1;
165         } else if ((fsf_req->fsf_command == FSF_QTCB_OPEN_PORT_WITH_DID) ||
166                    (fsf_req->fsf_command == FSF_QTCB_OPEN_LUN)) {
167                 strncpy(rec->tag2, "open", ZFCP_DBF_TAG_SIZE);
168                 level = 4;
169         } else if (qtcb->header.log_length) {
170                 strncpy(rec->tag2, "qtcb", ZFCP_DBF_TAG_SIZE);
171                 level = 5;
172         } else {
173                 strncpy(rec->tag2, "norm", ZFCP_DBF_TAG_SIZE);
174                 level = 6;
175         }
176
177         response->fsf_command = fsf_req->fsf_command;
178         response->fsf_reqid = (unsigned long)fsf_req;
179         response->fsf_seqno = fsf_req->seq_no;
180         response->fsf_issued = fsf_req->issued;
181         response->fsf_prot_status = qtcb->prefix.prot_status;
182         response->fsf_status = qtcb->header.fsf_status;
183         memcpy(response->fsf_prot_status_qual,
184                prot_status_qual, FSF_PROT_STATUS_QUAL_SIZE);
185         memcpy(response->fsf_status_qual,
186                fsf_status_qual, FSF_STATUS_QUALIFIER_SIZE);
187         response->fsf_req_status = fsf_req->status;
188         response->sbal_first = fsf_req->sbal_first;
189         response->sbal_curr = fsf_req->sbal_curr;
190         response->pool = fsf_req->pool != NULL;
191         response->erp_action = (unsigned long)fsf_req->erp_action;
192
193         switch (fsf_req->fsf_command) {
194         case FSF_QTCB_FCP_CMND:
195                 if (fsf_req->status & ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT)
196                         break;
197                 scsi_cmnd = (struct scsi_cmnd *)fsf_req->data;
198                 if (scsi_cmnd) {
199                         response->u.fcp.cmnd = (unsigned long)scsi_cmnd;
200                         response->u.fcp.serial = scsi_cmnd->serial_number;
201                 }
202                 break;
203
204         case FSF_QTCB_OPEN_PORT_WITH_DID:
205         case FSF_QTCB_CLOSE_PORT:
206         case FSF_QTCB_CLOSE_PHYSICAL_PORT:
207                 port = (struct zfcp_port *)fsf_req->data;
208                 response->u.port.wwpn = port->wwpn;
209                 response->u.port.d_id = port->d_id;
210                 response->u.port.port_handle = qtcb->header.port_handle;
211                 break;
212
213         case FSF_QTCB_OPEN_LUN:
214         case FSF_QTCB_CLOSE_LUN:
215                 unit = (struct zfcp_unit *)fsf_req->data;
216                 port = unit->port;
217                 response->u.unit.wwpn = port->wwpn;
218                 response->u.unit.fcp_lun = unit->fcp_lun;
219                 response->u.unit.port_handle = qtcb->header.port_handle;
220                 response->u.unit.lun_handle = qtcb->header.lun_handle;
221                 break;
222
223         case FSF_QTCB_SEND_ELS:
224                 send_els = (struct zfcp_send_els *)fsf_req->data;
225                 response->u.els.d_id = qtcb->bottom.support.d_id;
226                 response->u.els.ls_code = send_els->ls_code >> 24;
227                 break;
228
229         case FSF_QTCB_ABORT_FCP_CMND:
230         case FSF_QTCB_SEND_GENERIC:
231         case FSF_QTCB_EXCHANGE_CONFIG_DATA:
232         case FSF_QTCB_EXCHANGE_PORT_DATA:
233         case FSF_QTCB_DOWNLOAD_CONTROL_FILE:
234         case FSF_QTCB_UPLOAD_CONTROL_FILE:
235                 break;
236         }
237
238         debug_event(adapter->hba_dbf, level, rec, sizeof(*rec));
239
240         /* have fcp channel microcode fixed to use as little as possible */
241         if (fsf_req->fsf_command != FSF_QTCB_FCP_CMND) {
242                 /* adjust length skipping trailing zeros */
243                 char *buf = (char *)qtcb + qtcb->header.log_start;
244                 int len = qtcb->header.log_length;
245                 for (; len && !buf[len - 1]; len--);
246                 zfcp_dbf_hexdump(adapter->hba_dbf, rec, sizeof(*rec), level,
247                                  buf, len);
248         }
249
250         spin_unlock_irqrestore(&adapter->hba_dbf_lock, flags);
251 }
252
253 /**
254  * zfcp_hba_dbf_event_fsf_unsol - trace event for an unsolicited status buffer
255  * @tag: tag indicating which kind of unsolicited status has been received
256  * @adapter: adapter that has issued the unsolicited status buffer
257  * @status_buffer: buffer containing payload of unsolicited status
258  */
259 void zfcp_hba_dbf_event_fsf_unsol(const char *tag, struct zfcp_adapter *adapter,
260                                   struct fsf_status_read_buffer *status_buffer)
261 {
262         struct zfcp_hba_dbf_record *rec = &adapter->hba_dbf_buf;
263         unsigned long flags;
264
265         spin_lock_irqsave(&adapter->hba_dbf_lock, flags);
266         memset(rec, 0, sizeof(*rec));
267         strncpy(rec->tag, "stat", ZFCP_DBF_TAG_SIZE);
268         strncpy(rec->tag2, tag, ZFCP_DBF_TAG_SIZE);
269
270         rec->u.status.failed = atomic_read(&adapter->stat_miss);
271         if (status_buffer != NULL) {
272                 rec->u.status.status_type = status_buffer->status_type;
273                 rec->u.status.status_subtype = status_buffer->status_subtype;
274                 memcpy(&rec->u.status.queue_designator,
275                        &status_buffer->queue_designator,
276                        sizeof(struct fsf_queue_designator));
277
278                 switch (status_buffer->status_type) {
279                 case FSF_STATUS_READ_SENSE_DATA_AVAIL:
280                         rec->u.status.payload_size =
281                             ZFCP_DBF_UNSOL_PAYLOAD_SENSE_DATA_AVAIL;
282                         break;
283
284                 case FSF_STATUS_READ_BIT_ERROR_THRESHOLD:
285                         rec->u.status.payload_size =
286                             ZFCP_DBF_UNSOL_PAYLOAD_BIT_ERROR_THRESHOLD;
287                         break;
288
289                 case FSF_STATUS_READ_LINK_DOWN:
290                         switch (status_buffer->status_subtype) {
291                         case FSF_STATUS_READ_SUB_NO_PHYSICAL_LINK:
292                         case FSF_STATUS_READ_SUB_FDISC_FAILED:
293                                 rec->u.status.payload_size =
294                                         sizeof(struct fsf_link_down_info);
295                         }
296                         break;
297
298                 case FSF_STATUS_READ_FEATURE_UPDATE_ALERT:
299                         rec->u.status.payload_size =
300                             ZFCP_DBF_UNSOL_PAYLOAD_FEATURE_UPDATE_ALERT;
301                         break;
302                 }
303                 memcpy(&rec->u.status.payload,
304                        &status_buffer->payload, rec->u.status.payload_size);
305         }
306
307         debug_event(adapter->hba_dbf, 2, rec, sizeof(*rec));
308         spin_unlock_irqrestore(&adapter->hba_dbf_lock, flags);
309 }
310
311 /**
312  * zfcp_hba_dbf_event_qdio - trace event for QDIO related failure
313  * @adapter: adapter affected by this QDIO related event
314  * @status: as passed by qdio module
315  * @qdio_error: as passed by qdio module
316  * @siga_error: as passed by qdio module
317  * @sbal_index: first buffer with error condition, as passed by qdio module
318  * @sbal_count: number of buffers affected, as passed by qdio module
319  */
320 void zfcp_hba_dbf_event_qdio(struct zfcp_adapter *adapter, unsigned int status,
321                              unsigned int qdio_error, unsigned int siga_error,
322                              int sbal_index, int sbal_count)
323 {
324         struct zfcp_hba_dbf_record *r = &adapter->hba_dbf_buf;
325         unsigned long flags;
326
327         spin_lock_irqsave(&adapter->hba_dbf_lock, flags);
328         memset(r, 0, sizeof(*r));
329         strncpy(r->tag, "qdio", ZFCP_DBF_TAG_SIZE);
330         r->u.qdio.status = status;
331         r->u.qdio.qdio_error = qdio_error;
332         r->u.qdio.siga_error = siga_error;
333         r->u.qdio.sbal_index = sbal_index;
334         r->u.qdio.sbal_count = sbal_count;
335         debug_event(adapter->hba_dbf, 0, r, sizeof(*r));
336         spin_unlock_irqrestore(&adapter->hba_dbf_lock, flags);
337 }
338
339 static void zfcp_hba_dbf_view_response(char **p,
340                                        struct zfcp_hba_dbf_record_response *r)
341 {
342         struct timespec t;
343
344         zfcp_dbf_out(p, "fsf_command", "0x%08x", r->fsf_command);
345         zfcp_dbf_out(p, "fsf_reqid", "0x%0Lx", r->fsf_reqid);
346         zfcp_dbf_out(p, "fsf_seqno", "0x%08x", r->fsf_seqno);
347         zfcp_dbf_timestamp(r->fsf_issued, &t);
348         zfcp_dbf_out(p, "fsf_issued", "%011lu:%06lu", t.tv_sec, t.tv_nsec);
349         zfcp_dbf_out(p, "fsf_prot_status", "0x%08x", r->fsf_prot_status);
350         zfcp_dbf_out(p, "fsf_status", "0x%08x", r->fsf_status);
351         zfcp_dbf_outd(p, "fsf_prot_status_qual", r->fsf_prot_status_qual,
352                       FSF_PROT_STATUS_QUAL_SIZE, 0, FSF_PROT_STATUS_QUAL_SIZE);
353         zfcp_dbf_outd(p, "fsf_status_qual", r->fsf_status_qual,
354                       FSF_STATUS_QUALIFIER_SIZE, 0, FSF_STATUS_QUALIFIER_SIZE);
355         zfcp_dbf_out(p, "fsf_req_status", "0x%08x", r->fsf_req_status);
356         zfcp_dbf_out(p, "sbal_first", "0x%02x", r->sbal_first);
357         zfcp_dbf_out(p, "sbal_curr", "0x%02x", r->sbal_curr);
358         zfcp_dbf_out(p, "pool", "0x%02x", r->pool);
359
360         switch (r->fsf_command) {
361         case FSF_QTCB_FCP_CMND:
362                 if (r->fsf_req_status & ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT)
363                         break;
364                 zfcp_dbf_out(p, "scsi_cmnd", "0x%0Lx", r->u.fcp.cmnd);
365                 zfcp_dbf_out(p, "scsi_serial", "0x%016Lx", r->u.fcp.serial);
366                 break;
367
368         case FSF_QTCB_OPEN_PORT_WITH_DID:
369         case FSF_QTCB_CLOSE_PORT:
370         case FSF_QTCB_CLOSE_PHYSICAL_PORT:
371                 zfcp_dbf_out(p, "wwpn", "0x%016Lx", r->u.port.wwpn);
372                 zfcp_dbf_out(p, "d_id", "0x%06x", r->u.port.d_id);
373                 zfcp_dbf_out(p, "port_handle", "0x%08x", r->u.port.port_handle);
374                 break;
375
376         case FSF_QTCB_OPEN_LUN:
377         case FSF_QTCB_CLOSE_LUN:
378                 zfcp_dbf_out(p, "wwpn", "0x%016Lx", r->u.unit.wwpn);
379                 zfcp_dbf_out(p, "fcp_lun", "0x%016Lx", r->u.unit.fcp_lun);
380                 zfcp_dbf_out(p, "port_handle", "0x%08x", r->u.unit.port_handle);
381                 zfcp_dbf_out(p, "lun_handle", "0x%08x", r->u.unit.lun_handle);
382                 break;
383
384         case FSF_QTCB_SEND_ELS:
385                 zfcp_dbf_out(p, "d_id", "0x%06x", r->u.els.d_id);
386                 zfcp_dbf_out(p, "ls_code", "0x%02x", r->u.els.ls_code);
387                 break;
388
389         case FSF_QTCB_ABORT_FCP_CMND:
390         case FSF_QTCB_SEND_GENERIC:
391         case FSF_QTCB_EXCHANGE_CONFIG_DATA:
392         case FSF_QTCB_EXCHANGE_PORT_DATA:
393         case FSF_QTCB_DOWNLOAD_CONTROL_FILE:
394         case FSF_QTCB_UPLOAD_CONTROL_FILE:
395                 break;
396         }
397 }
398
399 static void zfcp_hba_dbf_view_status(char **p,
400                                      struct zfcp_hba_dbf_record_status *r)
401 {
402         zfcp_dbf_out(p, "failed", "0x%02x", r->failed);
403         zfcp_dbf_out(p, "status_type", "0x%08x", r->status_type);
404         zfcp_dbf_out(p, "status_subtype", "0x%08x", r->status_subtype);
405         zfcp_dbf_outd(p, "queue_designator", (char *)&r->queue_designator,
406                       sizeof(struct fsf_queue_designator), 0,
407                       sizeof(struct fsf_queue_designator));
408         zfcp_dbf_outd(p, "payload", (char *)&r->payload, r->payload_size, 0,
409                       r->payload_size);
410 }
411
412 static void zfcp_hba_dbf_view_qdio(char **p, struct zfcp_hba_dbf_record_qdio *r)
413 {
414         zfcp_dbf_out(p, "status", "0x%08x", r->status);
415         zfcp_dbf_out(p, "qdio_error", "0x%08x", r->qdio_error);
416         zfcp_dbf_out(p, "siga_error", "0x%08x", r->siga_error);
417         zfcp_dbf_out(p, "sbal_index", "0x%02x", r->sbal_index);
418         zfcp_dbf_out(p, "sbal_count", "0x%02x", r->sbal_count);
419 }
420
421 static int zfcp_hba_dbf_view_format(debug_info_t *id, struct debug_view *view,
422                                     char *out_buf, const char *in_buf)
423 {
424         struct zfcp_hba_dbf_record *r = (struct zfcp_hba_dbf_record *)in_buf;
425         char *p = out_buf;
426
427         if (strncmp(r->tag, "dump", ZFCP_DBF_TAG_SIZE) == 0)
428                 return 0;
429
430         zfcp_dbf_tag(&p, "tag", r->tag);
431         if (isalpha(r->tag2[0]))
432                 zfcp_dbf_tag(&p, "tag2", r->tag2);
433
434         if (strncmp(r->tag, "resp", ZFCP_DBF_TAG_SIZE) == 0)
435                 zfcp_hba_dbf_view_response(&p, &r->u.response);
436         else if (strncmp(r->tag, "stat", ZFCP_DBF_TAG_SIZE) == 0)
437                 zfcp_hba_dbf_view_status(&p, &r->u.status);
438         else if (strncmp(r->tag, "qdio", ZFCP_DBF_TAG_SIZE) == 0)
439                 zfcp_hba_dbf_view_qdio(&p, &r->u.qdio);
440
441         p += sprintf(p, "\n");
442         return p - out_buf;
443 }
444
445 static struct debug_view zfcp_hba_dbf_view = {
446         "structured",
447         NULL,
448         &zfcp_dbf_view_header,
449         &zfcp_hba_dbf_view_format,
450         NULL,
451         NULL
452 };
453
454 static const char *zfcp_rec_dbf_tags[] = {
455         [ZFCP_REC_DBF_ID_THREAD] = "thread",
456         [ZFCP_REC_DBF_ID_TARGET] = "target",
457         [ZFCP_REC_DBF_ID_TRIGGER] = "trigger",
458         [ZFCP_REC_DBF_ID_ACTION] = "action",
459 };
460
461 static const char *zfcp_rec_dbf_ids[] = {
462         [1]     = "new",
463         [2]     = "ready",
464         [3]     = "kill",
465         [4]     = "down sleep",
466         [5]     = "down wakeup",
467         [6]     = "down sleep ecd",
468         [7]     = "down wakeup ecd",
469         [8]     = "down sleep epd",
470         [9]     = "down wakeup epd",
471         [10]    = "online",
472         [11]    = "operational",
473         [12]    = "scsi slave destroy",
474         [13]    = "propagate failed adapter",
475         [14]    = "propagate failed port",
476         [15]    = "block adapter",
477         [16]    = "unblock adapter",
478         [17]    = "block port",
479         [18]    = "unblock port",
480         [19]    = "block unit",
481         [20]    = "unblock unit",
482         [21]    = "unit recovery failed",
483         [22]    = "port recovery failed",
484         [23]    = "adapter recovery failed",
485         [24]    = "qdio queues down",
486         [25]    = "p2p failed",
487         [26]    = "nameserver lookup failed",
488         [27]    = "nameserver port failed",
489         [28]    = "link up",
490         [29]    = "link down",
491         [30]    = "link up status read",
492         [31]    = "open port failed",
493         [32]    = "open port failed",
494         [33]    = "close port",
495         [34]    = "open unit failed",
496         [35]    = "exclusive open unit failed",
497         [36]    = "shared open unit failed",
498         [37]    = "link down",
499         [38]    = "link down status read no link",
500         [39]    = "link down status read fdisc login",
501         [40]    = "link down status read firmware update",
502         [41]    = "link down status read unknown reason",
503         [42]    = "link down ecd incomplete",
504         [43]    = "link down epd incomplete",
505         [44]    = "sysfs adapter recovery",
506         [45]    = "sysfs port recovery",
507         [46]    = "sysfs unit recovery",
508         [47]    = "port boxed abort",
509         [48]    = "unit boxed abort",
510         [49]    = "port boxed ct",
511         [50]    = "port boxed close physical",
512         [51]    = "port boxed open unit",
513         [52]    = "port boxed close unit",
514         [53]    = "port boxed fcp",
515         [54]    = "unit boxed fcp",
516         [55]    = "port access denied ct",
517         [56]    = "port access denied els",
518         [57]    = "port access denied open port",
519         [58]    = "port access denied close physical",
520         [59]    = "unit access denied open unit",
521         [60]    = "shared unit access denied open unit",
522         [61]    = "unit access denied fcp",
523         [62]    = "request timeout",
524         [63]    = "adisc link test reject or timeout",
525         [64]    = "adisc link test d_id changed",
526         [65]    = "adisc link test failed",
527         [66]    = "recovery out of memory",
528         [67]    = "adapter recovery repeated after state change",
529         [68]    = "port recovery repeated after state change",
530         [69]    = "unit recovery repeated after state change",
531         [70]    = "port recovery follow-up after successful adapter recovery",
532         [71]    = "adapter recovery escalation after failed adapter recovery",
533         [72]    = "port recovery follow-up after successful physical port "
534                   "recovery",
535         [73]    = "adapter recovery escalation after failed physical port "
536                   "recovery",
537         [74]    = "unit recovery follow-up after successful port recovery",
538         [75]    = "physical port recovery escalation after failed port "
539                   "recovery",
540         [76]    = "port recovery escalation after failed unit recovery",
541         [77]    = "recovery opening nameserver port",
542         [78]    = "duplicate request id",
543         [79]    = "link down",
544         [80]    = "exclusive read-only unit access unsupported",
545         [81]    = "shared read-write unit access unsupported",
546         [82]    = "incoming rscn",
547         [83]    = "incoming plogi",
548         [84]    = "incoming logo",
549         [85]    = "online",
550         [86]    = "offline",
551         [87]    = "ccw device gone",
552         [88]    = "ccw device no path",
553         [89]    = "ccw device operational",
554         [90]    = "ccw device shutdown",
555         [91]    = "sysfs port addition",
556         [92]    = "sysfs port removal",
557         [93]    = "sysfs adapter recovery",
558         [94]    = "sysfs unit addition",
559         [95]    = "sysfs unit removal",
560         [96]    = "sysfs port recovery",
561         [97]    = "sysfs unit recovery",
562         [98]    = "sequence number mismatch",
563         [99]    = "link up",
564         [100]   = "error state",
565         [101]   = "status read physical port closed",
566         [102]   = "link up status read",
567         [103]   = "too many failed status read buffers",
568         [104]   = "port handle not valid abort",
569         [105]   = "lun handle not valid abort",
570         [106]   = "port handle not valid ct",
571         [107]   = "port handle not valid close port",
572         [108]   = "port handle not valid close physical port",
573         [109]   = "port handle not valid open unit",
574         [110]   = "port handle not valid close unit",
575         [111]   = "lun handle not valid close unit",
576         [112]   = "port handle not valid fcp",
577         [113]   = "lun handle not valid fcp",
578         [114]   = "handle mismatch fcp",
579         [115]   = "lun not valid fcp",
580         [116]   = "qdio send failed",
581         [117]   = "version mismatch",
582         [118]   = "incompatible qtcb type",
583         [119]   = "unknown protocol status",
584         [120]   = "unknown fsf command",
585         [121]   = "no recommendation for status qualifier",
586         [122]   = "status read physical port closed in error",
587         [123]   = "fc service class not supported ct",
588         [124]   = "fc service class not supported els",
589         [125]   = "need newer zfcp",
590         [126]   = "need newer microcode",
591         [127]   = "arbitrated loop not supported",
592         [128]   = "unknown topology",
593         [129]   = "qtcb size mismatch",
594         [130]   = "unknown fsf status ecd",
595         [131]   = "fcp request too big",
596         [132]   = "fc service class not supported fcp",
597         [133]   = "data direction not valid fcp",
598         [134]   = "command length not valid fcp",
599         [135]   = "status read act update",
600         [136]   = "status read cfdc update",
601         [137]   = "hbaapi port open",
602         [138]   = "hbaapi unit open",
603         [139]   = "hbaapi unit shutdown",
604         [140]   = "qdio error",
605         [141]   = "scsi host reset",
606         [142]   = "dismissing fsf request for recovery action",
607         [143]   = "recovery action timed out",
608         [144]   = "recovery action gone",
609         [145]   = "recovery action being processed",
610         [146]   = "recovery action ready for next step",
611 };
612
613 static int zfcp_rec_dbf_view_format(debug_info_t *id, struct debug_view *view,
614                                     char *buf, const char *_rec)
615 {
616         struct zfcp_rec_dbf_record *r = (struct zfcp_rec_dbf_record *)_rec;
617         char *p = buf;
618
619         zfcp_dbf_outs(&p, "tag", zfcp_rec_dbf_tags[r->id]);
620         zfcp_dbf_outs(&p, "hint", zfcp_rec_dbf_ids[r->id2]);
621         zfcp_dbf_out(&p, "id", "%d", r->id2);
622         switch (r->id) {
623         case ZFCP_REC_DBF_ID_THREAD:
624                 zfcp_dbf_out(&p, "total", "%d", r->u.thread.total);
625                 zfcp_dbf_out(&p, "ready", "%d", r->u.thread.ready);
626                 zfcp_dbf_out(&p, "running", "%d", r->u.thread.running);
627                 break;
628         case ZFCP_REC_DBF_ID_TARGET:
629                 zfcp_dbf_out(&p, "reference", "0x%016Lx", r->u.target.ref);
630                 zfcp_dbf_out(&p, "status", "0x%08x", r->u.target.status);
631                 zfcp_dbf_out(&p, "erp_count", "%d", r->u.target.erp_count);
632                 zfcp_dbf_out(&p, "d_id", "0x%06x", r->u.target.d_id);
633                 zfcp_dbf_out(&p, "wwpn", "0x%016Lx", r->u.target.wwpn);
634                 zfcp_dbf_out(&p, "fcp_lun", "0x%016Lx", r->u.target.fcp_lun);
635                 break;
636         case ZFCP_REC_DBF_ID_TRIGGER:
637                 zfcp_dbf_out(&p, "reference", "0x%016Lx", r->u.trigger.ref);
638                 zfcp_dbf_out(&p, "erp_action", "0x%016Lx", r->u.trigger.action);
639                 zfcp_dbf_out(&p, "requested", "%d", r->u.trigger.want);
640                 zfcp_dbf_out(&p, "executed", "%d", r->u.trigger.need);
641                 zfcp_dbf_out(&p, "wwpn", "0x%016Lx", r->u.trigger.wwpn);
642                 zfcp_dbf_out(&p, "fcp_lun", "0x%016Lx", r->u.trigger.fcp_lun);
643                 zfcp_dbf_out(&p, "adapter_status", "0x%08x", r->u.trigger.as);
644                 zfcp_dbf_out(&p, "port_status", "0x%08x", r->u.trigger.ps);
645                 zfcp_dbf_out(&p, "unit_status", "0x%08x", r->u.trigger.us);
646                 break;
647         case ZFCP_REC_DBF_ID_ACTION:
648                 zfcp_dbf_out(&p, "erp_action", "0x%016Lx", r->u.action.action);
649                 zfcp_dbf_out(&p, "fsf_req", "0x%016Lx", r->u.action.fsf_req);
650                 zfcp_dbf_out(&p, "status", "0x%08Lx", r->u.action.status);
651                 zfcp_dbf_out(&p, "step", "0x%08Lx", r->u.action.step);
652                 break;
653         }
654         p += sprintf(p, "\n");
655         return p - buf;
656 }
657
658 static struct debug_view zfcp_rec_dbf_view = {
659         "structured",
660         NULL,
661         &zfcp_dbf_view_header,
662         &zfcp_rec_dbf_view_format,
663         NULL,
664         NULL
665 };
666
667 /**
668  * zfcp_rec_dbf_event_thread - trace event related to recovery thread operation
669  * @id2: identifier for event
670  * @adapter: adapter
671  * @lock: non-zero value indicates that erp_lock has not yet been acquired
672  */
673 void zfcp_rec_dbf_event_thread(u8 id2, struct zfcp_adapter *adapter, int lock)
674 {
675         struct zfcp_rec_dbf_record *r = &adapter->rec_dbf_buf;
676         unsigned long flags = 0;
677         struct list_head *entry;
678         unsigned ready = 0, running = 0, total;
679
680         if (lock)
681                 read_lock_irqsave(&adapter->erp_lock, flags);
682         list_for_each(entry, &adapter->erp_ready_head)
683                 ready++;
684         list_for_each(entry, &adapter->erp_running_head)
685                 running++;
686         total = adapter->erp_total_count;
687         if (lock)
688                 read_unlock_irqrestore(&adapter->erp_lock, flags);
689
690         spin_lock_irqsave(&adapter->rec_dbf_lock, flags);
691         memset(r, 0, sizeof(*r));
692         r->id = ZFCP_REC_DBF_ID_THREAD;
693         r->id2 = id2;
694         r->u.thread.total = total;
695         r->u.thread.ready = ready;
696         r->u.thread.running = running;
697         debug_event(adapter->rec_dbf, 5, r, sizeof(*r));
698         spin_unlock_irqrestore(&adapter->rec_dbf_lock, flags);
699 }
700
701 static void zfcp_rec_dbf_event_target(u8 id2, void *ref,
702                                       struct zfcp_adapter *adapter,
703                                       atomic_t *status, atomic_t *erp_count,
704                                       u64 wwpn, u32 d_id, u64 fcp_lun)
705 {
706         struct zfcp_rec_dbf_record *r = &adapter->rec_dbf_buf;
707         unsigned long flags;
708
709         spin_lock_irqsave(&adapter->rec_dbf_lock, flags);
710         memset(r, 0, sizeof(*r));
711         r->id = ZFCP_REC_DBF_ID_TARGET;
712         r->id2 = id2;
713         r->u.target.ref = (unsigned long)ref;
714         r->u.target.status = atomic_read(status);
715         r->u.target.wwpn = wwpn;
716         r->u.target.d_id = d_id;
717         r->u.target.fcp_lun = fcp_lun;
718         r->u.target.erp_count = atomic_read(erp_count);
719         debug_event(adapter->rec_dbf, 3, r, sizeof(*r));
720         spin_unlock_irqrestore(&adapter->rec_dbf_lock, flags);
721 }
722
723 /**
724  * zfcp_rec_dbf_event_adapter - trace event for adapter state change
725  * @id: identifier for trigger of state change
726  * @ref: additional reference (e.g. request)
727  * @adapter: adapter
728  */
729 void zfcp_rec_dbf_event_adapter(u8 id, void *ref, struct zfcp_adapter *adapter)
730 {
731         zfcp_rec_dbf_event_target(id, ref, adapter, &adapter->status,
732                                   &adapter->erp_counter, 0, 0, 0);
733 }
734
735 /**
736  * zfcp_rec_dbf_event_port - trace event for port state change
737  * @id: identifier for trigger of state change
738  * @ref: additional reference (e.g. request)
739  * @port: port
740  */
741 void zfcp_rec_dbf_event_port(u8 id, void *ref, struct zfcp_port *port)
742 {
743         struct zfcp_adapter *adapter = port->adapter;
744
745         zfcp_rec_dbf_event_target(id, ref, adapter, &port->status,
746                                   &port->erp_counter, port->wwpn, port->d_id,
747                                   0);
748 }
749
750 /**
751  * zfcp_rec_dbf_event_unit - trace event for unit state change
752  * @id: identifier for trigger of state change
753  * @ref: additional reference (e.g. request)
754  * @unit: unit
755  */
756 void zfcp_rec_dbf_event_unit(u8 id, void *ref, struct zfcp_unit *unit)
757 {
758         struct zfcp_port *port = unit->port;
759         struct zfcp_adapter *adapter = port->adapter;
760
761         zfcp_rec_dbf_event_target(id, ref, adapter, &unit->status,
762                                   &unit->erp_counter, port->wwpn, port->d_id,
763                                   unit->fcp_lun);
764 }
765
766 /**
767  * zfcp_rec_dbf_event_trigger - trace event for triggered error recovery
768  * @id2: identifier for error recovery trigger
769  * @ref: additional reference (e.g. request)
770  * @want: originally requested error recovery action
771  * @need: error recovery action actually initiated
772  * @action: address of error recovery action struct
773  * @adapter: adapter
774  * @port: port
775  * @unit: unit
776  */
777 void zfcp_rec_dbf_event_trigger(u8 id2, void *ref, u8 want, u8 need,
778                                 void *action, struct zfcp_adapter *adapter,
779                                 struct zfcp_port *port, struct zfcp_unit *unit)
780 {
781         struct zfcp_rec_dbf_record *r = &adapter->rec_dbf_buf;
782         unsigned long flags;
783
784         spin_lock_irqsave(&adapter->rec_dbf_lock, flags);
785         memset(r, 0, sizeof(*r));
786         r->id = ZFCP_REC_DBF_ID_TRIGGER;
787         r->id2 = id2;
788         r->u.trigger.ref = (unsigned long)ref;
789         r->u.trigger.want = want;
790         r->u.trigger.need = need;
791         r->u.trigger.action = (unsigned long)action;
792         r->u.trigger.as = atomic_read(&adapter->status);
793         if (port) {
794                 r->u.trigger.ps = atomic_read(&port->status);
795                 r->u.trigger.wwpn = port->wwpn;
796         }
797         if (unit) {
798                 r->u.trigger.us = atomic_read(&unit->status);
799                 r->u.trigger.fcp_lun = unit->fcp_lun;
800         }
801         debug_event(adapter->rec_dbf, action ? 1 : 4, r, sizeof(*r));
802         spin_unlock_irqrestore(&adapter->rec_dbf_lock, flags);
803 }
804
805 /**
806  * zfcp_rec_dbf_event_action - trace event showing progress of recovery action
807  * @id2: identifier
808  * @erp_action: error recovery action struct pointer
809  */
810 void zfcp_rec_dbf_event_action(u8 id2, struct zfcp_erp_action *erp_action)
811 {
812         struct zfcp_adapter *adapter = erp_action->adapter;
813         struct zfcp_rec_dbf_record *r = &adapter->rec_dbf_buf;
814         unsigned long flags;
815
816         spin_lock_irqsave(&adapter->rec_dbf_lock, flags);
817         memset(r, 0, sizeof(*r));
818         r->id = ZFCP_REC_DBF_ID_ACTION;
819         r->id2 = id2;
820         r->u.action.action = (unsigned long)erp_action;
821         r->u.action.status = erp_action->status;
822         r->u.action.step = erp_action->step;
823         r->u.action.fsf_req = (unsigned long)erp_action->fsf_req;
824         debug_event(adapter->rec_dbf, 4, r, sizeof(*r));
825         spin_unlock_irqrestore(&adapter->rec_dbf_lock, flags);
826 }
827
828 /**
829  * zfcp_san_dbf_event_ct_request - trace event for issued CT request
830  * @fsf_req: request containing issued CT data
831  */
832 void zfcp_san_dbf_event_ct_request(struct zfcp_fsf_req *fsf_req)
833 {
834         struct zfcp_send_ct *ct = (struct zfcp_send_ct *)fsf_req->data;
835         struct zfcp_port *port = ct->port;
836         struct zfcp_adapter *adapter = port->adapter;
837         struct ct_hdr *hdr = zfcp_sg_to_address(ct->req);
838         struct zfcp_san_dbf_record *r = &adapter->san_dbf_buf;
839         struct zfcp_san_dbf_record_ct_request *oct = &r->u.ct_req;
840         unsigned long flags;
841
842         spin_lock_irqsave(&adapter->san_dbf_lock, flags);
843         memset(r, 0, sizeof(*r));
844         strncpy(r->tag, "octc", ZFCP_DBF_TAG_SIZE);
845         r->fsf_reqid = (unsigned long)fsf_req;
846         r->fsf_seqno = fsf_req->seq_no;
847         r->s_id = fc_host_port_id(adapter->scsi_host);
848         r->d_id = port->d_id;
849         oct->cmd_req_code = hdr->cmd_rsp_code;
850         oct->revision = hdr->revision;
851         oct->gs_type = hdr->gs_type;
852         oct->gs_subtype = hdr->gs_subtype;
853         oct->options = hdr->options;
854         oct->max_res_size = hdr->max_res_size;
855         oct->len = min((int)ct->req->length - (int)sizeof(struct ct_hdr),
856                        ZFCP_DBF_CT_PAYLOAD);
857         memcpy(oct->payload, (void *)hdr + sizeof(struct ct_hdr), oct->len);
858         debug_event(adapter->san_dbf, 3, r, sizeof(*r));
859         spin_unlock_irqrestore(&adapter->san_dbf_lock, flags);
860 }
861
862 /**
863  * zfcp_san_dbf_event_ct_response - trace event for completion of CT request
864  * @fsf_req: request containing CT response
865  */
866 void zfcp_san_dbf_event_ct_response(struct zfcp_fsf_req *fsf_req)
867 {
868         struct zfcp_send_ct *ct = (struct zfcp_send_ct *)fsf_req->data;
869         struct zfcp_port *port = ct->port;
870         struct zfcp_adapter *adapter = port->adapter;
871         struct ct_hdr *hdr = zfcp_sg_to_address(ct->resp);
872         struct zfcp_san_dbf_record *r = &adapter->san_dbf_buf;
873         struct zfcp_san_dbf_record_ct_response *rct = &r->u.ct_resp;
874         unsigned long flags;
875
876         spin_lock_irqsave(&adapter->san_dbf_lock, flags);
877         memset(r, 0, sizeof(*r));
878         strncpy(r->tag, "rctc", ZFCP_DBF_TAG_SIZE);
879         r->fsf_reqid = (unsigned long)fsf_req;
880         r->fsf_seqno = fsf_req->seq_no;
881         r->s_id = port->d_id;
882         r->d_id = fc_host_port_id(adapter->scsi_host);
883         rct->cmd_rsp_code = hdr->cmd_rsp_code;
884         rct->revision = hdr->revision;
885         rct->reason_code = hdr->reason_code;
886         rct->expl = hdr->reason_code_expl;
887         rct->vendor_unique = hdr->vendor_unique;
888         rct->len = min((int)ct->resp->length - (int)sizeof(struct ct_hdr),
889                        ZFCP_DBF_CT_PAYLOAD);
890         memcpy(rct->payload, (void *)hdr + sizeof(struct ct_hdr), rct->len);
891         debug_event(adapter->san_dbf, 3, r, sizeof(*r));
892         spin_unlock_irqrestore(&adapter->san_dbf_lock, flags);
893 }
894
895 static void zfcp_san_dbf_event_els(const char *tag, int level,
896                                    struct zfcp_fsf_req *fsf_req, u32 s_id,
897                                    u32 d_id, u8 ls_code, void *buffer,
898                                    int buflen)
899 {
900         struct zfcp_adapter *adapter = fsf_req->adapter;
901         struct zfcp_san_dbf_record *rec = &adapter->san_dbf_buf;
902         unsigned long flags;
903
904         spin_lock_irqsave(&adapter->san_dbf_lock, flags);
905         memset(rec, 0, sizeof(*rec));
906         strncpy(rec->tag, tag, ZFCP_DBF_TAG_SIZE);
907         rec->fsf_reqid = (unsigned long)fsf_req;
908         rec->fsf_seqno = fsf_req->seq_no;
909         rec->s_id = s_id;
910         rec->d_id = d_id;
911         rec->u.els.ls_code = ls_code;
912         debug_event(adapter->san_dbf, level, rec, sizeof(*rec));
913         zfcp_dbf_hexdump(adapter->san_dbf, rec, sizeof(*rec), level,
914                          buffer, min(buflen, ZFCP_DBF_ELS_MAX_PAYLOAD));
915         spin_unlock_irqrestore(&adapter->san_dbf_lock, flags);
916 }
917
918 /**
919  * zfcp_san_dbf_event_els_request - trace event for issued ELS
920  * @fsf_req: request containing issued ELS
921  */
922 void zfcp_san_dbf_event_els_request(struct zfcp_fsf_req *fsf_req)
923 {
924         struct zfcp_send_els *els = (struct zfcp_send_els *)fsf_req->data;
925
926         zfcp_san_dbf_event_els("oels", 2, fsf_req,
927                                fc_host_port_id(els->adapter->scsi_host),
928                                els->d_id, *(u8 *) zfcp_sg_to_address(els->req),
929                                zfcp_sg_to_address(els->req), els->req->length);
930 }
931
932 /**
933  * zfcp_san_dbf_event_els_response - trace event for completed ELS
934  * @fsf_req: request containing ELS response
935  */
936 void zfcp_san_dbf_event_els_response(struct zfcp_fsf_req *fsf_req)
937 {
938         struct zfcp_send_els *els = (struct zfcp_send_els *)fsf_req->data;
939
940         zfcp_san_dbf_event_els("rels", 2, fsf_req, els->d_id,
941                                fc_host_port_id(els->adapter->scsi_host),
942                                *(u8 *)zfcp_sg_to_address(els->req),
943                                zfcp_sg_to_address(els->resp),
944                                els->resp->length);
945 }
946
947 /**
948  * zfcp_san_dbf_event_incoming_els - trace event for incomig ELS
949  * @fsf_req: request containing unsolicited status buffer with incoming ELS
950  */
951 void zfcp_san_dbf_event_incoming_els(struct zfcp_fsf_req *fsf_req)
952 {
953         struct zfcp_adapter *adapter = fsf_req->adapter;
954         struct fsf_status_read_buffer *buf =
955                         (struct fsf_status_read_buffer *)fsf_req->data;
956         int length = (int)buf->length -
957                      (int)((void *)&buf->payload - (void *)buf);
958
959         zfcp_san_dbf_event_els("iels", 1, fsf_req, buf->d_id,
960                                fc_host_port_id(adapter->scsi_host),
961                                *(u8 *)buf->payload, (void *)buf->payload,
962                                length);
963 }
964
965 static int zfcp_san_dbf_view_format(debug_info_t *id, struct debug_view *view,
966                                     char *out_buf, const char *in_buf)
967 {
968         struct zfcp_san_dbf_record *r = (struct zfcp_san_dbf_record *)in_buf;
969         char *buffer = NULL;
970         int buflen = 0, total = 0;
971         char *p = out_buf;
972
973         if (strncmp(r->tag, "dump", ZFCP_DBF_TAG_SIZE) == 0)
974                 return 0;
975
976         zfcp_dbf_tag(&p, "tag", r->tag);
977         zfcp_dbf_out(&p, "fsf_reqid", "0x%0Lx", r->fsf_reqid);
978         zfcp_dbf_out(&p, "fsf_seqno", "0x%08x", r->fsf_seqno);
979         zfcp_dbf_out(&p, "s_id", "0x%06x", r->s_id);
980         zfcp_dbf_out(&p, "d_id", "0x%06x", r->d_id);
981
982         if (strncmp(r->tag, "octc", ZFCP_DBF_TAG_SIZE) == 0) {
983                 struct zfcp_san_dbf_record_ct_request *ct = &r->u.ct_req;
984                 zfcp_dbf_out(&p, "cmd_req_code", "0x%04x", ct->cmd_req_code);
985                 zfcp_dbf_out(&p, "revision", "0x%02x", ct->revision);
986                 zfcp_dbf_out(&p, "gs_type", "0x%02x", ct->gs_type);
987                 zfcp_dbf_out(&p, "gs_subtype", "0x%02x", ct->gs_subtype);
988                 zfcp_dbf_out(&p, "options", "0x%02x", ct->options);
989                 zfcp_dbf_out(&p, "max_res_size", "0x%04x", ct->max_res_size);
990                 total = ct->len;
991                 buffer = ct->payload;
992                 buflen = min(total, ZFCP_DBF_CT_PAYLOAD);
993         } else if (strncmp(r->tag, "rctc", ZFCP_DBF_TAG_SIZE) == 0) {
994                 struct zfcp_san_dbf_record_ct_response *ct = &r->u.ct_resp;
995                 zfcp_dbf_out(&p, "cmd_rsp_code", "0x%04x", ct->cmd_rsp_code);
996                 zfcp_dbf_out(&p, "revision", "0x%02x", ct->revision);
997                 zfcp_dbf_out(&p, "reason_code", "0x%02x", ct->reason_code);
998                 zfcp_dbf_out(&p, "reason_code_expl", "0x%02x", ct->expl);
999                 zfcp_dbf_out(&p, "vendor_unique", "0x%02x", ct->vendor_unique);
1000                 total = ct->len;
1001                 buffer = ct->payload;
1002                 buflen = min(total, ZFCP_DBF_CT_PAYLOAD);
1003         } else if (strncmp(r->tag, "oels", ZFCP_DBF_TAG_SIZE) == 0 ||
1004                    strncmp(r->tag, "rels", ZFCP_DBF_TAG_SIZE) == 0 ||
1005                    strncmp(r->tag, "iels", ZFCP_DBF_TAG_SIZE) == 0) {
1006                 struct zfcp_san_dbf_record_els *els = &r->u.els;
1007                 zfcp_dbf_out(&p, "ls_code", "0x%02x", els->ls_code);
1008                 total = els->len;
1009                 buffer = els->payload;
1010                 buflen = min(total, ZFCP_DBF_ELS_PAYLOAD);
1011         }
1012
1013         zfcp_dbf_outd(&p, "payload", buffer, buflen, 0, total);
1014         if (buflen == total)
1015                 p += sprintf(p, "\n");
1016
1017         return p - out_buf;
1018 }
1019
1020 static struct debug_view zfcp_san_dbf_view = {
1021         "structured",
1022         NULL,
1023         &zfcp_dbf_view_header,
1024         &zfcp_san_dbf_view_format,
1025         NULL,
1026         NULL
1027 };
1028
1029 static void zfcp_scsi_dbf_event(const char *tag, const char *tag2, int level,
1030                                 struct zfcp_adapter *adapter,
1031                                 struct scsi_cmnd *scsi_cmnd,
1032                                 struct zfcp_fsf_req *fsf_req,
1033                                 unsigned long old_req_id)
1034 {
1035         struct zfcp_scsi_dbf_record *rec = &adapter->scsi_dbf_buf;
1036         struct zfcp_dbf_dump *dump = (struct zfcp_dbf_dump *)rec;
1037         unsigned long flags;
1038         struct fcp_rsp_iu *fcp_rsp;
1039         char *fcp_rsp_info = NULL, *fcp_sns_info = NULL;
1040         int offset = 0, buflen = 0;
1041
1042         spin_lock_irqsave(&adapter->scsi_dbf_lock, flags);
1043         do {
1044                 memset(rec, 0, sizeof(*rec));
1045                 if (offset == 0) {
1046                         strncpy(rec->tag, tag, ZFCP_DBF_TAG_SIZE);
1047                         strncpy(rec->tag2, tag2, ZFCP_DBF_TAG_SIZE);
1048                         if (scsi_cmnd != NULL) {
1049                                 if (scsi_cmnd->device) {
1050                                         rec->scsi_id = scsi_cmnd->device->id;
1051                                         rec->scsi_lun = scsi_cmnd->device->lun;
1052                                 }
1053                                 rec->scsi_result = scsi_cmnd->result;
1054                                 rec->scsi_cmnd = (unsigned long)scsi_cmnd;
1055                                 rec->scsi_serial = scsi_cmnd->serial_number;
1056                                 memcpy(rec->scsi_opcode, scsi_cmnd->cmnd,
1057                                         min((int)scsi_cmnd->cmd_len,
1058                                                 ZFCP_DBF_SCSI_OPCODE));
1059                                 rec->scsi_retries = scsi_cmnd->retries;
1060                                 rec->scsi_allowed = scsi_cmnd->allowed;
1061                         }
1062                         if (fsf_req != NULL) {
1063                                 fcp_rsp = (struct fcp_rsp_iu *)
1064                                     &(fsf_req->qtcb->bottom.io.fcp_rsp);
1065                                 fcp_rsp_info =
1066                                     zfcp_get_fcp_rsp_info_ptr(fcp_rsp);
1067                                 fcp_sns_info =
1068                                     zfcp_get_fcp_sns_info_ptr(fcp_rsp);
1069
1070                                 rec->rsp_validity = fcp_rsp->validity.value;
1071                                 rec->rsp_scsi_status = fcp_rsp->scsi_status;
1072                                 rec->rsp_resid = fcp_rsp->fcp_resid;
1073                                 if (fcp_rsp->validity.bits.fcp_rsp_len_valid)
1074                                         rec->rsp_code = *(fcp_rsp_info + 3);
1075                                 if (fcp_rsp->validity.bits.fcp_sns_len_valid) {
1076                                         buflen = min((int)fcp_rsp->fcp_sns_len,
1077                                                      ZFCP_DBF_SCSI_MAX_FCP_SNS_INFO);
1078                                         rec->sns_info_len = buflen;
1079                                         memcpy(rec->sns_info, fcp_sns_info,
1080                                                min(buflen,
1081                                                    ZFCP_DBF_SCSI_FCP_SNS_INFO));
1082                                         offset += min(buflen,
1083                                                       ZFCP_DBF_SCSI_FCP_SNS_INFO);
1084                                 }
1085
1086                                 rec->fsf_reqid = (unsigned long)fsf_req;
1087                                 rec->fsf_seqno = fsf_req->seq_no;
1088                                 rec->fsf_issued = fsf_req->issued;
1089                         }
1090                         rec->old_fsf_reqid = old_req_id;
1091                 } else {
1092                         strncpy(dump->tag, "dump", ZFCP_DBF_TAG_SIZE);
1093                         dump->total_size = buflen;
1094                         dump->offset = offset;
1095                         dump->size = min(buflen - offset,
1096                                          (int)sizeof(struct
1097                                                      zfcp_scsi_dbf_record) -
1098                                          (int)sizeof(struct zfcp_dbf_dump));
1099                         memcpy(dump->data, fcp_sns_info + offset, dump->size);
1100                         offset += dump->size;
1101                 }
1102                 debug_event(adapter->scsi_dbf, level, rec, sizeof(*rec));
1103         } while (offset < buflen);
1104         spin_unlock_irqrestore(&adapter->scsi_dbf_lock, flags);
1105 }
1106
1107 /**
1108  * zfcp_scsi_dbf_event_result - trace event for SCSI command completion
1109  * @tag: tag indicating success or failure of SCSI command
1110  * @level: trace level applicable for this event
1111  * @adapter: adapter that has been used to issue the SCSI command
1112  * @scsi_cmnd: SCSI command pointer
1113  * @fsf_req: request used to issue SCSI command (might be NULL)
1114  */
1115 void zfcp_scsi_dbf_event_result(const char *tag, int level,
1116                                 struct zfcp_adapter *adapter,
1117                                 struct scsi_cmnd *scsi_cmnd,
1118                                 struct zfcp_fsf_req *fsf_req)
1119 {
1120         zfcp_scsi_dbf_event("rslt", tag, level, adapter, scsi_cmnd, fsf_req, 0);
1121 }
1122
1123 /**
1124  * zfcp_scsi_dbf_event_abort - trace event for SCSI command abort
1125  * @tag: tag indicating success or failure of abort operation
1126  * @adapter: adapter thas has been used to issue SCSI command to be aborted
1127  * @scsi_cmnd: SCSI command to be aborted
1128  * @new_fsf_req: request containing abort (might be NULL)
1129  * @old_req_id: identifier of request containg SCSI command to be aborted
1130  */
1131 void zfcp_scsi_dbf_event_abort(const char *tag, struct zfcp_adapter *adapter,
1132                                struct scsi_cmnd *scsi_cmnd,
1133                                struct zfcp_fsf_req *new_fsf_req,
1134                                unsigned long old_req_id)
1135 {
1136         zfcp_scsi_dbf_event("abrt", tag, 1, adapter, scsi_cmnd, new_fsf_req,
1137                             old_req_id);
1138 }
1139
1140 /**
1141  * zfcp_scsi_dbf_event_devreset - trace event for Logical Unit or Target Reset
1142  * @tag: tag indicating success or failure of reset operation
1143  * @flag: indicates type of reset (Target Reset, Logical Unit Reset)
1144  * @unit: unit that needs reset
1145  * @scsi_cmnd: SCSI command which caused this error recovery
1146  */
1147 void zfcp_scsi_dbf_event_devreset(const char *tag, u8 flag,
1148                                   struct zfcp_unit *unit,
1149                                   struct scsi_cmnd *scsi_cmnd)
1150 {
1151         zfcp_scsi_dbf_event(flag == FCP_TARGET_RESET ? "trst" : "lrst", tag, 1,
1152                             unit->port->adapter, scsi_cmnd, NULL, 0);
1153 }
1154
1155 static int zfcp_scsi_dbf_view_format(debug_info_t *id, struct debug_view *view,
1156                                      char *out_buf, const char *in_buf)
1157 {
1158         struct zfcp_scsi_dbf_record *r = (struct zfcp_scsi_dbf_record *)in_buf;
1159         struct timespec t;
1160         char *p = out_buf;
1161
1162         if (strncmp(r->tag, "dump", ZFCP_DBF_TAG_SIZE) == 0)
1163                 return 0;
1164
1165         zfcp_dbf_tag(&p, "tag", r->tag);
1166         zfcp_dbf_tag(&p, "tag2", r->tag2);
1167         zfcp_dbf_out(&p, "scsi_id", "0x%08x", r->scsi_id);
1168         zfcp_dbf_out(&p, "scsi_lun", "0x%08x", r->scsi_lun);
1169         zfcp_dbf_out(&p, "scsi_result", "0x%08x", r->scsi_result);
1170         zfcp_dbf_out(&p, "scsi_cmnd", "0x%0Lx", r->scsi_cmnd);
1171         zfcp_dbf_out(&p, "scsi_serial", "0x%016Lx", r->scsi_serial);
1172         zfcp_dbf_outd(&p, "scsi_opcode", r->scsi_opcode, ZFCP_DBF_SCSI_OPCODE,
1173                       0, ZFCP_DBF_SCSI_OPCODE);
1174         zfcp_dbf_out(&p, "scsi_retries", "0x%02x", r->scsi_retries);
1175         zfcp_dbf_out(&p, "scsi_allowed", "0x%02x", r->scsi_allowed);
1176         if (strncmp(r->tag, "abrt", ZFCP_DBF_TAG_SIZE) == 0)
1177                 zfcp_dbf_out(&p, "old_fsf_reqid", "0x%0Lx", r->old_fsf_reqid);
1178         zfcp_dbf_out(&p, "fsf_reqid", "0x%0Lx", r->fsf_reqid);
1179         zfcp_dbf_out(&p, "fsf_seqno", "0x%08x", r->fsf_seqno);
1180         zfcp_dbf_timestamp(r->fsf_issued, &t);
1181         zfcp_dbf_out(&p, "fsf_issued", "%011lu:%06lu", t.tv_sec, t.tv_nsec);
1182
1183         if (strncmp(r->tag, "rslt", ZFCP_DBF_TAG_SIZE) == 0) {
1184                 zfcp_dbf_out(&p, "fcp_rsp_validity", "0x%02x", r->rsp_validity);
1185                 zfcp_dbf_out(&p, "fcp_rsp_scsi_status", "0x%02x",
1186                              r->rsp_scsi_status);
1187                 zfcp_dbf_out(&p, "fcp_rsp_resid", "0x%08x", r->rsp_resid);
1188                 zfcp_dbf_out(&p, "fcp_rsp_code", "0x%08x", r->rsp_code);
1189                 zfcp_dbf_out(&p, "fcp_sns_info_len", "0x%08x", r->sns_info_len);
1190                 zfcp_dbf_outd(&p, "fcp_sns_info", r->sns_info,
1191                               min((int)r->sns_info_len,
1192                               ZFCP_DBF_SCSI_FCP_SNS_INFO), 0,
1193                               r->sns_info_len);
1194         }
1195         p += sprintf(p, "\n");
1196         return p - out_buf;
1197 }
1198
1199 static struct debug_view zfcp_scsi_dbf_view = {
1200         "structured",
1201         NULL,
1202         &zfcp_dbf_view_header,
1203         &zfcp_scsi_dbf_view_format,
1204         NULL,
1205         NULL
1206 };
1207
1208 /**
1209  * zfcp_adapter_debug_register - registers debug feature for an adapter
1210  * @adapter: pointer to adapter for which debug features should be registered
1211  * return: -ENOMEM on error, 0 otherwise
1212  */
1213 int zfcp_adapter_debug_register(struct zfcp_adapter *adapter)
1214 {
1215         char dbf_name[DEBUG_MAX_NAME_LEN];
1216
1217         /* debug feature area which records recovery activity */
1218         sprintf(dbf_name, "zfcp_%s_rec", zfcp_get_busid_by_adapter(adapter));
1219         adapter->rec_dbf = debug_register(dbf_name, dbfsize, 1,
1220                                           sizeof(struct zfcp_rec_dbf_record));
1221         if (!adapter->rec_dbf)
1222                 goto failed;
1223         debug_register_view(adapter->rec_dbf, &debug_hex_ascii_view);
1224         debug_register_view(adapter->rec_dbf, &zfcp_rec_dbf_view);
1225         debug_set_level(adapter->rec_dbf, 3);
1226
1227         /* debug feature area which records HBA (FSF and QDIO) conditions */
1228         sprintf(dbf_name, "zfcp_%s_hba", zfcp_get_busid_by_adapter(adapter));
1229         adapter->hba_dbf = debug_register(dbf_name, dbfsize, 1,
1230                                           sizeof(struct zfcp_hba_dbf_record));
1231         if (!adapter->hba_dbf)
1232                 goto failed;
1233         debug_register_view(adapter->hba_dbf, &debug_hex_ascii_view);
1234         debug_register_view(adapter->hba_dbf, &zfcp_hba_dbf_view);
1235         debug_set_level(adapter->hba_dbf, 3);
1236
1237         /* debug feature area which records SAN command failures and recovery */
1238         sprintf(dbf_name, "zfcp_%s_san", zfcp_get_busid_by_adapter(adapter));
1239         adapter->san_dbf = debug_register(dbf_name, dbfsize, 1,
1240                                           sizeof(struct zfcp_san_dbf_record));
1241         if (!adapter->san_dbf)
1242                 goto failed;
1243         debug_register_view(adapter->san_dbf, &debug_hex_ascii_view);
1244         debug_register_view(adapter->san_dbf, &zfcp_san_dbf_view);
1245         debug_set_level(adapter->san_dbf, 6);
1246
1247         /* debug feature area which records SCSI command failures and recovery */
1248         sprintf(dbf_name, "zfcp_%s_scsi", zfcp_get_busid_by_adapter(adapter));
1249         adapter->scsi_dbf = debug_register(dbf_name, dbfsize, 1,
1250                                            sizeof(struct zfcp_scsi_dbf_record));
1251         if (!adapter->scsi_dbf)
1252                 goto failed;
1253         debug_register_view(adapter->scsi_dbf, &debug_hex_ascii_view);
1254         debug_register_view(adapter->scsi_dbf, &zfcp_scsi_dbf_view);
1255         debug_set_level(adapter->scsi_dbf, 3);
1256
1257         return 0;
1258
1259  failed:
1260         zfcp_adapter_debug_unregister(adapter);
1261
1262         return -ENOMEM;
1263 }
1264
1265 /**
1266  * zfcp_adapter_debug_unregister - unregisters debug feature for an adapter
1267  * @adapter: pointer to adapter for which debug features should be unregistered
1268  */
1269 void zfcp_adapter_debug_unregister(struct zfcp_adapter *adapter)
1270 {
1271         debug_unregister(adapter->scsi_dbf);
1272         debug_unregister(adapter->san_dbf);
1273         debug_unregister(adapter->hba_dbf);
1274         debug_unregister(adapter->rec_dbf);
1275         adapter->scsi_dbf = NULL;
1276         adapter->san_dbf = NULL;
1277         adapter->hba_dbf = NULL;
1278         adapter->rec_dbf = NULL;
1279 }
1280
1281 #undef ZFCP_LOG_AREA