4 * Debug traces for zfcp.
6 * Copyright IBM Corporation 2002, 2008
9 #define KMSG_COMPONENT "zfcp"
10 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
12 #include <linux/ctype.h>
13 #include <asm/debug.h>
16 static u32 dbfsize
= 4;
18 module_param(dbfsize
, uint
, 0400);
19 MODULE_PARM_DESC(dbfsize
,
20 "number of pages for each debug feature area (default 4)");
22 static void zfcp_dbf_hexdump(debug_info_t
*dbf
, void *to
, int to_len
,
23 int level
, char *from
, int from_len
)
26 struct zfcp_dbf_dump
*dump
= to
;
27 int room
= to_len
- sizeof(*dump
);
29 for (offset
= 0; offset
< from_len
; offset
+= dump
->size
) {
30 memset(to
, 0, to_len
);
31 strncpy(dump
->tag
, "dump", ZFCP_DBF_TAG_SIZE
);
32 dump
->total_size
= from_len
;
33 dump
->offset
= offset
;
34 dump
->size
= min(from_len
- offset
, room
);
35 memcpy(dump
->data
, from
+ offset
, dump
->size
);
36 debug_event(dbf
, level
, dump
, dump
->size
+ sizeof(*dump
));
40 /* FIXME: this duplicate this code in s390 debug feature */
41 static void zfcp_dbf_timestamp(unsigned long long stck
, struct timespec
*time
)
43 unsigned long long sec
;
45 stck
-= 0x8126d60e46000000LL
- (0x3c26700LL
* 1000000 * 4096);
49 stck
-= (sec
* 1000000) << 12;
50 time
->tv_nsec
= ((stck
* 1000) >> 12);
53 static void zfcp_dbf_tag(char **p
, const char *label
, const char *tag
)
57 *p
+= sprintf(*p
, "%-24s", label
);
58 for (i
= 0; i
< ZFCP_DBF_TAG_SIZE
; i
++)
59 *p
+= sprintf(*p
, "%c", tag
[i
]);
60 *p
+= sprintf(*p
, "\n");
63 static void zfcp_dbf_outs(char **buf
, const char *s1
, const char *s2
)
65 *buf
+= sprintf(*buf
, "%-24s%s\n", s1
, s2
);
68 static void zfcp_dbf_out(char **buf
, const char *s
, const char *format
, ...)
72 *buf
+= sprintf(*buf
, "%-24s", s
);
73 va_start(arg
, format
);
74 *buf
+= vsprintf(*buf
, format
, arg
);
76 *buf
+= sprintf(*buf
, "\n");
79 static void zfcp_dbf_outd(char **p
, const char *label
, char *buffer
,
80 int buflen
, int offset
, int total_size
)
83 *p
+= sprintf(*p
, "%-24s ", label
);
86 if ((offset
% 32) == 0)
87 *p
+= sprintf(*p
, "\n%-24c ", ' ');
88 else if ((offset
% 4) == 0)
89 *p
+= sprintf(*p
, " ");
91 *p
+= sprintf(*p
, "%02x", *buffer
++);
92 if (++offset
== total_size
) {
93 *p
+= sprintf(*p
, "\n");
98 *p
+= sprintf(*p
, "\n");
101 static int zfcp_dbf_view_header(debug_info_t
*id
, struct debug_view
*view
,
102 int area
, debug_entry_t
*entry
, char *out_buf
)
104 struct zfcp_dbf_dump
*dump
= (struct zfcp_dbf_dump
*)DEBUG_DATA(entry
);
108 if (strncmp(dump
->tag
, "dump", ZFCP_DBF_TAG_SIZE
) != 0) {
109 zfcp_dbf_timestamp(entry
->id
.stck
, &t
);
110 zfcp_dbf_out(&p
, "timestamp", "%011lu:%06lu",
111 t
.tv_sec
, t
.tv_nsec
);
112 zfcp_dbf_out(&p
, "cpu", "%02i", entry
->id
.fields
.cpuid
);
114 zfcp_dbf_outd(&p
, "", dump
->data
, dump
->size
, dump
->offset
,
116 if ((dump
->offset
+ dump
->size
) == dump
->total_size
)
117 p
+= sprintf(p
, "\n");
123 * zfcp_hba_dbf_event_fsf_response - trace event for request completion
124 * @fsf_req: request that has been completed
126 void zfcp_hba_dbf_event_fsf_response(struct zfcp_fsf_req
*fsf_req
)
128 struct zfcp_adapter
*adapter
= fsf_req
->adapter
;
129 struct fsf_qtcb
*qtcb
= fsf_req
->qtcb
;
130 union fsf_prot_status_qual
*prot_status_qual
=
131 &qtcb
->prefix
.prot_status_qual
;
132 union fsf_status_qual
*fsf_status_qual
= &qtcb
->header
.fsf_status_qual
;
133 struct scsi_cmnd
*scsi_cmnd
;
134 struct zfcp_port
*port
;
135 struct zfcp_unit
*unit
;
136 struct zfcp_send_els
*send_els
;
137 struct zfcp_hba_dbf_record
*rec
= &adapter
->hba_dbf_buf
;
138 struct zfcp_hba_dbf_record_response
*response
= &rec
->u
.response
;
142 spin_lock_irqsave(&adapter
->hba_dbf_lock
, flags
);
143 memset(rec
, 0, sizeof(*rec
));
144 strncpy(rec
->tag
, "resp", ZFCP_DBF_TAG_SIZE
);
146 if ((qtcb
->prefix
.prot_status
!= FSF_PROT_GOOD
) &&
147 (qtcb
->prefix
.prot_status
!= FSF_PROT_FSF_STATUS_PRESENTED
)) {
148 strncpy(rec
->tag2
, "perr", ZFCP_DBF_TAG_SIZE
);
150 } else if (qtcb
->header
.fsf_status
!= FSF_GOOD
) {
151 strncpy(rec
->tag2
, "ferr", ZFCP_DBF_TAG_SIZE
);
153 } else if ((fsf_req
->fsf_command
== FSF_QTCB_OPEN_PORT_WITH_DID
) ||
154 (fsf_req
->fsf_command
== FSF_QTCB_OPEN_LUN
)) {
155 strncpy(rec
->tag2
, "open", ZFCP_DBF_TAG_SIZE
);
157 } else if (qtcb
->header
.log_length
) {
158 strncpy(rec
->tag2
, "qtcb", ZFCP_DBF_TAG_SIZE
);
161 strncpy(rec
->tag2
, "norm", ZFCP_DBF_TAG_SIZE
);
165 response
->fsf_command
= fsf_req
->fsf_command
;
166 response
->fsf_reqid
= (unsigned long)fsf_req
;
167 response
->fsf_seqno
= fsf_req
->seq_no
;
168 response
->fsf_issued
= fsf_req
->issued
;
169 response
->fsf_prot_status
= qtcb
->prefix
.prot_status
;
170 response
->fsf_status
= qtcb
->header
.fsf_status
;
171 memcpy(response
->fsf_prot_status_qual
,
172 prot_status_qual
, FSF_PROT_STATUS_QUAL_SIZE
);
173 memcpy(response
->fsf_status_qual
,
174 fsf_status_qual
, FSF_STATUS_QUALIFIER_SIZE
);
175 response
->fsf_req_status
= fsf_req
->status
;
176 response
->sbal_first
= fsf_req
->sbal_first
;
177 response
->sbal_last
= fsf_req
->sbal_last
;
178 response
->sbal_response
= fsf_req
->sbal_response
;
179 response
->pool
= fsf_req
->pool
!= NULL
;
180 response
->erp_action
= (unsigned long)fsf_req
->erp_action
;
182 switch (fsf_req
->fsf_command
) {
183 case FSF_QTCB_FCP_CMND
:
184 if (fsf_req
->status
& ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT
)
186 scsi_cmnd
= (struct scsi_cmnd
*)fsf_req
->data
;
188 response
->u
.fcp
.cmnd
= (unsigned long)scsi_cmnd
;
189 response
->u
.fcp
.serial
= scsi_cmnd
->serial_number
;
193 case FSF_QTCB_OPEN_PORT_WITH_DID
:
194 case FSF_QTCB_CLOSE_PORT
:
195 case FSF_QTCB_CLOSE_PHYSICAL_PORT
:
196 port
= (struct zfcp_port
*)fsf_req
->data
;
197 response
->u
.port
.wwpn
= port
->wwpn
;
198 response
->u
.port
.d_id
= port
->d_id
;
199 response
->u
.port
.port_handle
= qtcb
->header
.port_handle
;
202 case FSF_QTCB_OPEN_LUN
:
203 case FSF_QTCB_CLOSE_LUN
:
204 unit
= (struct zfcp_unit
*)fsf_req
->data
;
206 response
->u
.unit
.wwpn
= port
->wwpn
;
207 response
->u
.unit
.fcp_lun
= unit
->fcp_lun
;
208 response
->u
.unit
.port_handle
= qtcb
->header
.port_handle
;
209 response
->u
.unit
.lun_handle
= qtcb
->header
.lun_handle
;
212 case FSF_QTCB_SEND_ELS
:
213 send_els
= (struct zfcp_send_els
*)fsf_req
->data
;
214 response
->u
.els
.d_id
= qtcb
->bottom
.support
.d_id
;
215 response
->u
.els
.ls_code
= send_els
->ls_code
>> 24;
218 case FSF_QTCB_ABORT_FCP_CMND
:
219 case FSF_QTCB_SEND_GENERIC
:
220 case FSF_QTCB_EXCHANGE_CONFIG_DATA
:
221 case FSF_QTCB_EXCHANGE_PORT_DATA
:
222 case FSF_QTCB_DOWNLOAD_CONTROL_FILE
:
223 case FSF_QTCB_UPLOAD_CONTROL_FILE
:
227 debug_event(adapter
->hba_dbf
, level
, rec
, sizeof(*rec
));
229 /* have fcp channel microcode fixed to use as little as possible */
230 if (fsf_req
->fsf_command
!= FSF_QTCB_FCP_CMND
) {
231 /* adjust length skipping trailing zeros */
232 char *buf
= (char *)qtcb
+ qtcb
->header
.log_start
;
233 int len
= qtcb
->header
.log_length
;
234 for (; len
&& !buf
[len
- 1]; len
--);
235 zfcp_dbf_hexdump(adapter
->hba_dbf
, rec
, sizeof(*rec
), level
,
239 spin_unlock_irqrestore(&adapter
->hba_dbf_lock
, flags
);
243 * zfcp_hba_dbf_event_fsf_unsol - trace event for an unsolicited status buffer
244 * @tag: tag indicating which kind of unsolicited status has been received
245 * @adapter: adapter that has issued the unsolicited status buffer
246 * @status_buffer: buffer containing payload of unsolicited status
248 void zfcp_hba_dbf_event_fsf_unsol(const char *tag
, struct zfcp_adapter
*adapter
,
249 struct fsf_status_read_buffer
*status_buffer
)
251 struct zfcp_hba_dbf_record
*rec
= &adapter
->hba_dbf_buf
;
254 spin_lock_irqsave(&adapter
->hba_dbf_lock
, flags
);
255 memset(rec
, 0, sizeof(*rec
));
256 strncpy(rec
->tag
, "stat", ZFCP_DBF_TAG_SIZE
);
257 strncpy(rec
->tag2
, tag
, ZFCP_DBF_TAG_SIZE
);
259 rec
->u
.status
.failed
= atomic_read(&adapter
->stat_miss
);
260 if (status_buffer
!= NULL
) {
261 rec
->u
.status
.status_type
= status_buffer
->status_type
;
262 rec
->u
.status
.status_subtype
= status_buffer
->status_subtype
;
263 memcpy(&rec
->u
.status
.queue_designator
,
264 &status_buffer
->queue_designator
,
265 sizeof(struct fsf_queue_designator
));
267 switch (status_buffer
->status_type
) {
268 case FSF_STATUS_READ_SENSE_DATA_AVAIL
:
269 rec
->u
.status
.payload_size
=
270 ZFCP_DBF_UNSOL_PAYLOAD_SENSE_DATA_AVAIL
;
273 case FSF_STATUS_READ_BIT_ERROR_THRESHOLD
:
274 rec
->u
.status
.payload_size
=
275 ZFCP_DBF_UNSOL_PAYLOAD_BIT_ERROR_THRESHOLD
;
278 case FSF_STATUS_READ_LINK_DOWN
:
279 switch (status_buffer
->status_subtype
) {
280 case FSF_STATUS_READ_SUB_NO_PHYSICAL_LINK
:
281 case FSF_STATUS_READ_SUB_FDISC_FAILED
:
282 rec
->u
.status
.payload_size
=
283 sizeof(struct fsf_link_down_info
);
287 case FSF_STATUS_READ_FEATURE_UPDATE_ALERT
:
288 rec
->u
.status
.payload_size
=
289 ZFCP_DBF_UNSOL_PAYLOAD_FEATURE_UPDATE_ALERT
;
292 memcpy(&rec
->u
.status
.payload
,
293 &status_buffer
->payload
, rec
->u
.status
.payload_size
);
296 debug_event(adapter
->hba_dbf
, 2, rec
, sizeof(*rec
));
297 spin_unlock_irqrestore(&adapter
->hba_dbf_lock
, flags
);
301 * zfcp_hba_dbf_event_qdio - trace event for QDIO related failure
302 * @adapter: adapter affected by this QDIO related event
303 * @qdio_error: as passed by qdio module
304 * @sbal_index: first buffer with error condition, as passed by qdio module
305 * @sbal_count: number of buffers affected, as passed by qdio module
307 void zfcp_hba_dbf_event_qdio(struct zfcp_adapter
*adapter
,
308 unsigned int qdio_error
, int sbal_index
,
311 struct zfcp_hba_dbf_record
*r
= &adapter
->hba_dbf_buf
;
314 spin_lock_irqsave(&adapter
->hba_dbf_lock
, flags
);
315 memset(r
, 0, sizeof(*r
));
316 strncpy(r
->tag
, "qdio", ZFCP_DBF_TAG_SIZE
);
317 r
->u
.qdio
.qdio_error
= qdio_error
;
318 r
->u
.qdio
.sbal_index
= sbal_index
;
319 r
->u
.qdio
.sbal_count
= sbal_count
;
320 debug_event(adapter
->hba_dbf
, 0, r
, sizeof(*r
));
321 spin_unlock_irqrestore(&adapter
->hba_dbf_lock
, flags
);
325 * zfcp_hba_dbf_event_berr - trace event for bit error threshold
326 * @adapter: adapter affected by this QDIO related event
329 void zfcp_hba_dbf_event_berr(struct zfcp_adapter
*adapter
,
330 struct zfcp_fsf_req
*req
)
332 struct zfcp_hba_dbf_record
*r
= &adapter
->hba_dbf_buf
;
333 struct fsf_status_read_buffer
*sr_buf
= req
->data
;
334 struct fsf_bit_error_payload
*err
= &sr_buf
->payload
.bit_error
;
337 spin_lock_irqsave(&adapter
->hba_dbf_lock
, flags
);
338 memset(r
, 0, sizeof(*r
));
339 strncpy(r
->tag
, "berr", ZFCP_DBF_TAG_SIZE
);
340 memcpy(&r
->u
.berr
, err
, sizeof(struct fsf_bit_error_payload
));
341 debug_event(adapter
->hba_dbf
, 0, r
, sizeof(*r
));
342 spin_unlock_irqrestore(&adapter
->hba_dbf_lock
, flags
);
344 static void zfcp_hba_dbf_view_response(char **p
,
345 struct zfcp_hba_dbf_record_response
*r
)
349 zfcp_dbf_out(p
, "fsf_command", "0x%08x", r
->fsf_command
);
350 zfcp_dbf_out(p
, "fsf_reqid", "0x%0Lx", r
->fsf_reqid
);
351 zfcp_dbf_out(p
, "fsf_seqno", "0x%08x", r
->fsf_seqno
);
352 zfcp_dbf_timestamp(r
->fsf_issued
, &t
);
353 zfcp_dbf_out(p
, "fsf_issued", "%011lu:%06lu", t
.tv_sec
, t
.tv_nsec
);
354 zfcp_dbf_out(p
, "fsf_prot_status", "0x%08x", r
->fsf_prot_status
);
355 zfcp_dbf_out(p
, "fsf_status", "0x%08x", r
->fsf_status
);
356 zfcp_dbf_outd(p
, "fsf_prot_status_qual", r
->fsf_prot_status_qual
,
357 FSF_PROT_STATUS_QUAL_SIZE
, 0, FSF_PROT_STATUS_QUAL_SIZE
);
358 zfcp_dbf_outd(p
, "fsf_status_qual", r
->fsf_status_qual
,
359 FSF_STATUS_QUALIFIER_SIZE
, 0, FSF_STATUS_QUALIFIER_SIZE
);
360 zfcp_dbf_out(p
, "fsf_req_status", "0x%08x", r
->fsf_req_status
);
361 zfcp_dbf_out(p
, "sbal_first", "0x%02x", r
->sbal_first
);
362 zfcp_dbf_out(p
, "sbal_last", "0x%02x", r
->sbal_last
);
363 zfcp_dbf_out(p
, "sbal_response", "0x%02x", r
->sbal_response
);
364 zfcp_dbf_out(p
, "pool", "0x%02x", r
->pool
);
366 switch (r
->fsf_command
) {
367 case FSF_QTCB_FCP_CMND
:
368 if (r
->fsf_req_status
& ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT
)
370 zfcp_dbf_out(p
, "scsi_cmnd", "0x%0Lx", r
->u
.fcp
.cmnd
);
371 zfcp_dbf_out(p
, "scsi_serial", "0x%016Lx", r
->u
.fcp
.serial
);
372 p
+= sprintf(*p
, "\n");
375 case FSF_QTCB_OPEN_PORT_WITH_DID
:
376 case FSF_QTCB_CLOSE_PORT
:
377 case FSF_QTCB_CLOSE_PHYSICAL_PORT
:
378 zfcp_dbf_out(p
, "wwpn", "0x%016Lx", r
->u
.port
.wwpn
);
379 zfcp_dbf_out(p
, "d_id", "0x%06x", r
->u
.port
.d_id
);
380 zfcp_dbf_out(p
, "port_handle", "0x%08x", r
->u
.port
.port_handle
);
383 case FSF_QTCB_OPEN_LUN
:
384 case FSF_QTCB_CLOSE_LUN
:
385 zfcp_dbf_out(p
, "wwpn", "0x%016Lx", r
->u
.unit
.wwpn
);
386 zfcp_dbf_out(p
, "fcp_lun", "0x%016Lx", r
->u
.unit
.fcp_lun
);
387 zfcp_dbf_out(p
, "port_handle", "0x%08x", r
->u
.unit
.port_handle
);
388 zfcp_dbf_out(p
, "lun_handle", "0x%08x", r
->u
.unit
.lun_handle
);
391 case FSF_QTCB_SEND_ELS
:
392 zfcp_dbf_out(p
, "d_id", "0x%06x", r
->u
.els
.d_id
);
393 zfcp_dbf_out(p
, "ls_code", "0x%02x", r
->u
.els
.ls_code
);
396 case FSF_QTCB_ABORT_FCP_CMND
:
397 case FSF_QTCB_SEND_GENERIC
:
398 case FSF_QTCB_EXCHANGE_CONFIG_DATA
:
399 case FSF_QTCB_EXCHANGE_PORT_DATA
:
400 case FSF_QTCB_DOWNLOAD_CONTROL_FILE
:
401 case FSF_QTCB_UPLOAD_CONTROL_FILE
:
406 static void zfcp_hba_dbf_view_status(char **p
,
407 struct zfcp_hba_dbf_record_status
*r
)
409 zfcp_dbf_out(p
, "failed", "0x%02x", r
->failed
);
410 zfcp_dbf_out(p
, "status_type", "0x%08x", r
->status_type
);
411 zfcp_dbf_out(p
, "status_subtype", "0x%08x", r
->status_subtype
);
412 zfcp_dbf_outd(p
, "queue_designator", (char *)&r
->queue_designator
,
413 sizeof(struct fsf_queue_designator
), 0,
414 sizeof(struct fsf_queue_designator
));
415 zfcp_dbf_outd(p
, "payload", (char *)&r
->payload
, r
->payload_size
, 0,
419 static void zfcp_hba_dbf_view_qdio(char **p
, struct zfcp_hba_dbf_record_qdio
*r
)
421 zfcp_dbf_out(p
, "qdio_error", "0x%08x", r
->qdio_error
);
422 zfcp_dbf_out(p
, "sbal_index", "0x%02x", r
->sbal_index
);
423 zfcp_dbf_out(p
, "sbal_count", "0x%02x", r
->sbal_count
);
426 static void zfcp_hba_dbf_view_berr(char **p
, struct fsf_bit_error_payload
*r
)
428 zfcp_dbf_out(p
, "link_failures", "%d", r
->link_failure_error_count
);
429 zfcp_dbf_out(p
, "loss_of_sync_err", "%d", r
->loss_of_sync_error_count
);
430 zfcp_dbf_out(p
, "loss_of_sig_err", "%d", r
->loss_of_signal_error_count
);
431 zfcp_dbf_out(p
, "prim_seq_err", "%d",
432 r
->primitive_sequence_error_count
);
433 zfcp_dbf_out(p
, "inval_trans_word_err", "%d",
434 r
->invalid_transmission_word_error_count
);
435 zfcp_dbf_out(p
, "CRC_errors", "%d", r
->crc_error_count
);
436 zfcp_dbf_out(p
, "prim_seq_event_to", "%d",
437 r
->primitive_sequence_event_timeout_count
);
438 zfcp_dbf_out(p
, "elast_buf_overrun_err", "%d",
439 r
->elastic_buffer_overrun_error_count
);
440 zfcp_dbf_out(p
, "adv_rec_buf2buf_cred", "%d",
441 r
->advertised_receive_b2b_credit
);
442 zfcp_dbf_out(p
, "curr_rec_buf2buf_cred", "%d",
443 r
->current_receive_b2b_credit
);
444 zfcp_dbf_out(p
, "adv_trans_buf2buf_cred", "%d",
445 r
->advertised_transmit_b2b_credit
);
446 zfcp_dbf_out(p
, "curr_trans_buf2buf_cred", "%d",
447 r
->current_transmit_b2b_credit
);
450 static int zfcp_hba_dbf_view_format(debug_info_t
*id
, struct debug_view
*view
,
451 char *out_buf
, const char *in_buf
)
453 struct zfcp_hba_dbf_record
*r
= (struct zfcp_hba_dbf_record
*)in_buf
;
456 if (strncmp(r
->tag
, "dump", ZFCP_DBF_TAG_SIZE
) == 0)
459 zfcp_dbf_tag(&p
, "tag", r
->tag
);
460 if (isalpha(r
->tag2
[0]))
461 zfcp_dbf_tag(&p
, "tag2", r
->tag2
);
463 if (strncmp(r
->tag
, "resp", ZFCP_DBF_TAG_SIZE
) == 0)
464 zfcp_hba_dbf_view_response(&p
, &r
->u
.response
);
465 else if (strncmp(r
->tag
, "stat", ZFCP_DBF_TAG_SIZE
) == 0)
466 zfcp_hba_dbf_view_status(&p
, &r
->u
.status
);
467 else if (strncmp(r
->tag
, "qdio", ZFCP_DBF_TAG_SIZE
) == 0)
468 zfcp_hba_dbf_view_qdio(&p
, &r
->u
.qdio
);
469 else if (strncmp(r
->tag
, "berr", ZFCP_DBF_TAG_SIZE
) == 0)
470 zfcp_hba_dbf_view_berr(&p
, &r
->u
.berr
);
472 if (strncmp(r
->tag
, "resp", ZFCP_DBF_TAG_SIZE
) != 0)
473 p
+= sprintf(p
, "\n");
477 static struct debug_view zfcp_hba_dbf_view
= {
480 &zfcp_dbf_view_header
,
481 &zfcp_hba_dbf_view_format
,
486 static const char *zfcp_rec_dbf_tags
[] = {
487 [ZFCP_REC_DBF_ID_THREAD
] = "thread",
488 [ZFCP_REC_DBF_ID_TARGET
] = "target",
489 [ZFCP_REC_DBF_ID_TRIGGER
] = "trigger",
490 [ZFCP_REC_DBF_ID_ACTION
] = "action",
493 static const char *zfcp_rec_dbf_ids
[] = {
499 [6] = "down sleep ecd",
500 [7] = "down wakeup ecd",
501 [8] = "down sleep epd",
502 [9] = "down wakeup epd",
504 [11] = "operational",
505 [12] = "scsi slave destroy",
506 [13] = "propagate failed adapter",
507 [14] = "propagate failed port",
508 [15] = "block adapter",
509 [16] = "unblock adapter",
511 [18] = "unblock port",
513 [20] = "unblock unit",
514 [21] = "unit recovery failed",
515 [22] = "port recovery failed",
516 [23] = "adapter recovery failed",
517 [24] = "qdio queues down",
519 [26] = "nameserver lookup failed",
520 [27] = "nameserver port failed",
523 [30] = "link up status read",
524 [31] = "open port failed",
527 [34] = "open unit failed",
528 [35] = "exclusive open unit failed",
529 [36] = "shared open unit failed",
531 [38] = "link down status read no link",
532 [39] = "link down status read fdisc login",
533 [40] = "link down status read firmware update",
534 [41] = "link down status read unknown reason",
535 [42] = "link down ecd incomplete",
536 [43] = "link down epd incomplete",
537 [44] = "sysfs adapter recovery",
538 [45] = "sysfs port recovery",
539 [46] = "sysfs unit recovery",
540 [47] = "port boxed abort",
541 [48] = "unit boxed abort",
542 [49] = "port boxed ct",
543 [50] = "port boxed close physical",
544 [51] = "port boxed open unit",
545 [52] = "port boxed close unit",
546 [53] = "port boxed fcp",
547 [54] = "unit boxed fcp",
548 [55] = "port access denied",
552 [59] = "unit access denied",
553 [60] = "shared unit access denied open unit",
555 [62] = "request timeout",
556 [63] = "adisc link test reject or timeout",
557 [64] = "adisc link test d_id changed",
558 [65] = "adisc link test failed",
559 [66] = "recovery out of memory",
560 [67] = "adapter recovery repeated after state change",
561 [68] = "port recovery repeated after state change",
562 [69] = "unit recovery repeated after state change",
563 [70] = "port recovery follow-up after successful adapter recovery",
564 [71] = "adapter recovery escalation after failed adapter recovery",
565 [72] = "port recovery follow-up after successful physical port "
567 [73] = "adapter recovery escalation after failed physical port "
569 [74] = "unit recovery follow-up after successful port recovery",
570 [75] = "physical port recovery escalation after failed port "
572 [76] = "port recovery escalation after failed unit recovery",
574 [78] = "duplicate request id",
576 [80] = "exclusive read-only unit access unsupported",
577 [81] = "shared read-write unit access unsupported",
578 [82] = "incoming rscn",
579 [83] = "incoming wwpn",
580 [84] = "wka port handle not valid close port",
583 [87] = "ccw device gone",
584 [88] = "ccw device no path",
585 [89] = "ccw device operational",
586 [90] = "ccw device shutdown",
587 [91] = "sysfs port addition",
588 [92] = "sysfs port removal",
589 [93] = "sysfs adapter recovery",
590 [94] = "sysfs unit addition",
591 [95] = "sysfs unit removal",
592 [96] = "sysfs port recovery",
593 [97] = "sysfs unit recovery",
594 [98] = "sequence number mismatch",
596 [100] = "error state",
597 [101] = "status read physical port closed",
598 [102] = "link up status read",
599 [103] = "too many failed status read buffers",
600 [104] = "port handle not valid abort",
601 [105] = "lun handle not valid abort",
602 [106] = "port handle not valid ct",
603 [107] = "port handle not valid close port",
604 [108] = "port handle not valid close physical port",
605 [109] = "port handle not valid open unit",
606 [110] = "port handle not valid close unit",
607 [111] = "lun handle not valid close unit",
608 [112] = "port handle not valid fcp",
609 [113] = "lun handle not valid fcp",
610 [114] = "handle mismatch fcp",
611 [115] = "lun not valid fcp",
612 [116] = "qdio send failed",
613 [117] = "version mismatch",
614 [118] = "incompatible qtcb type",
615 [119] = "unknown protocol status",
616 [120] = "unknown fsf command",
617 [121] = "no recommendation for status qualifier",
618 [122] = "status read physical port closed in error",
619 [123] = "fc service class not supported",
621 [125] = "need newer zfcp",
622 [126] = "need newer microcode",
623 [127] = "arbitrated loop not supported",
625 [129] = "qtcb size mismatch",
626 [130] = "unknown fsf status ecd",
627 [131] = "fcp request too big",
629 [133] = "data direction not valid fcp",
630 [134] = "command length not valid fcp",
631 [135] = "status read act update",
632 [136] = "status read cfdc update",
633 [137] = "hbaapi port open",
634 [138] = "hbaapi unit open",
635 [139] = "hbaapi unit shutdown",
636 [140] = "qdio error outbound",
637 [141] = "scsi host reset",
638 [142] = "dismissing fsf request for recovery action",
639 [143] = "recovery action timed out",
640 [144] = "recovery action gone",
641 [145] = "recovery action being processed",
642 [146] = "recovery action ready for next step",
643 [147] = "qdio error inbound",
644 [148] = "nameserver needed for port scan",
646 [150] = "ptp attach",
647 [151] = "port validation failed",
650 static int zfcp_rec_dbf_view_format(debug_info_t
*id
, struct debug_view
*view
,
651 char *buf
, const char *_rec
)
653 struct zfcp_rec_dbf_record
*r
= (struct zfcp_rec_dbf_record
*)_rec
;
656 zfcp_dbf_outs(&p
, "tag", zfcp_rec_dbf_tags
[r
->id
]);
657 zfcp_dbf_outs(&p
, "hint", zfcp_rec_dbf_ids
[r
->id2
]);
658 zfcp_dbf_out(&p
, "id", "%d", r
->id2
);
660 case ZFCP_REC_DBF_ID_THREAD
:
661 zfcp_dbf_out(&p
, "total", "%d", r
->u
.thread
.total
);
662 zfcp_dbf_out(&p
, "ready", "%d", r
->u
.thread
.ready
);
663 zfcp_dbf_out(&p
, "running", "%d", r
->u
.thread
.running
);
665 case ZFCP_REC_DBF_ID_TARGET
:
666 zfcp_dbf_out(&p
, "reference", "0x%016Lx", r
->u
.target
.ref
);
667 zfcp_dbf_out(&p
, "status", "0x%08x", r
->u
.target
.status
);
668 zfcp_dbf_out(&p
, "erp_count", "%d", r
->u
.target
.erp_count
);
669 zfcp_dbf_out(&p
, "d_id", "0x%06x", r
->u
.target
.d_id
);
670 zfcp_dbf_out(&p
, "wwpn", "0x%016Lx", r
->u
.target
.wwpn
);
671 zfcp_dbf_out(&p
, "fcp_lun", "0x%016Lx", r
->u
.target
.fcp_lun
);
673 case ZFCP_REC_DBF_ID_TRIGGER
:
674 zfcp_dbf_out(&p
, "reference", "0x%016Lx", r
->u
.trigger
.ref
);
675 zfcp_dbf_out(&p
, "erp_action", "0x%016Lx", r
->u
.trigger
.action
);
676 zfcp_dbf_out(&p
, "requested", "%d", r
->u
.trigger
.want
);
677 zfcp_dbf_out(&p
, "executed", "%d", r
->u
.trigger
.need
);
678 zfcp_dbf_out(&p
, "wwpn", "0x%016Lx", r
->u
.trigger
.wwpn
);
679 zfcp_dbf_out(&p
, "fcp_lun", "0x%016Lx", r
->u
.trigger
.fcp_lun
);
680 zfcp_dbf_out(&p
, "adapter_status", "0x%08x", r
->u
.trigger
.as
);
681 zfcp_dbf_out(&p
, "port_status", "0x%08x", r
->u
.trigger
.ps
);
682 zfcp_dbf_out(&p
, "unit_status", "0x%08x", r
->u
.trigger
.us
);
684 case ZFCP_REC_DBF_ID_ACTION
:
685 zfcp_dbf_out(&p
, "erp_action", "0x%016Lx", r
->u
.action
.action
);
686 zfcp_dbf_out(&p
, "fsf_req", "0x%016Lx", r
->u
.action
.fsf_req
);
687 zfcp_dbf_out(&p
, "status", "0x%08Lx", r
->u
.action
.status
);
688 zfcp_dbf_out(&p
, "step", "0x%08Lx", r
->u
.action
.step
);
691 p
+= sprintf(p
, "\n");
695 static struct debug_view zfcp_rec_dbf_view
= {
698 &zfcp_dbf_view_header
,
699 &zfcp_rec_dbf_view_format
,
705 * zfcp_rec_dbf_event_thread - trace event related to recovery thread operation
706 * @id2: identifier for event
708 * This function assumes that the caller is holding erp_lock.
710 void zfcp_rec_dbf_event_thread(u8 id2
, struct zfcp_adapter
*adapter
)
712 struct zfcp_rec_dbf_record
*r
= &adapter
->rec_dbf_buf
;
713 unsigned long flags
= 0;
714 struct list_head
*entry
;
715 unsigned ready
= 0, running
= 0, total
;
717 list_for_each(entry
, &adapter
->erp_ready_head
)
719 list_for_each(entry
, &adapter
->erp_running_head
)
721 total
= adapter
->erp_total_count
;
723 spin_lock_irqsave(&adapter
->rec_dbf_lock
, flags
);
724 memset(r
, 0, sizeof(*r
));
725 r
->id
= ZFCP_REC_DBF_ID_THREAD
;
727 r
->u
.thread
.total
= total
;
728 r
->u
.thread
.ready
= ready
;
729 r
->u
.thread
.running
= running
;
730 debug_event(adapter
->rec_dbf
, 6, r
, sizeof(*r
));
731 spin_unlock_irqrestore(&adapter
->rec_dbf_lock
, flags
);
735 * zfcp_rec_dbf_event_thread - trace event related to recovery thread operation
736 * @id2: identifier for event
738 * This function assumes that the caller does not hold erp_lock.
740 void zfcp_rec_dbf_event_thread_lock(u8 id2
, struct zfcp_adapter
*adapter
)
744 read_lock_irqsave(&adapter
->erp_lock
, flags
);
745 zfcp_rec_dbf_event_thread(id2
, adapter
);
746 read_unlock_irqrestore(&adapter
->erp_lock
, flags
);
749 static void zfcp_rec_dbf_event_target(u8 id2
, void *ref
,
750 struct zfcp_adapter
*adapter
,
751 atomic_t
*status
, atomic_t
*erp_count
,
752 u64 wwpn
, u32 d_id
, u64 fcp_lun
)
754 struct zfcp_rec_dbf_record
*r
= &adapter
->rec_dbf_buf
;
757 spin_lock_irqsave(&adapter
->rec_dbf_lock
, flags
);
758 memset(r
, 0, sizeof(*r
));
759 r
->id
= ZFCP_REC_DBF_ID_TARGET
;
761 r
->u
.target
.ref
= (unsigned long)ref
;
762 r
->u
.target
.status
= atomic_read(status
);
763 r
->u
.target
.wwpn
= wwpn
;
764 r
->u
.target
.d_id
= d_id
;
765 r
->u
.target
.fcp_lun
= fcp_lun
;
766 r
->u
.target
.erp_count
= atomic_read(erp_count
);
767 debug_event(adapter
->rec_dbf
, 3, r
, sizeof(*r
));
768 spin_unlock_irqrestore(&adapter
->rec_dbf_lock
, flags
);
772 * zfcp_rec_dbf_event_adapter - trace event for adapter state change
773 * @id: identifier for trigger of state change
774 * @ref: additional reference (e.g. request)
777 void zfcp_rec_dbf_event_adapter(u8 id
, void *ref
, struct zfcp_adapter
*adapter
)
779 zfcp_rec_dbf_event_target(id
, ref
, adapter
, &adapter
->status
,
780 &adapter
->erp_counter
, 0, 0, 0);
784 * zfcp_rec_dbf_event_port - trace event for port state change
785 * @id: identifier for trigger of state change
786 * @ref: additional reference (e.g. request)
789 void zfcp_rec_dbf_event_port(u8 id
, void *ref
, struct zfcp_port
*port
)
791 struct zfcp_adapter
*adapter
= port
->adapter
;
793 zfcp_rec_dbf_event_target(id
, ref
, adapter
, &port
->status
,
794 &port
->erp_counter
, port
->wwpn
, port
->d_id
,
799 * zfcp_rec_dbf_event_unit - trace event for unit state change
800 * @id: identifier for trigger of state change
801 * @ref: additional reference (e.g. request)
804 void zfcp_rec_dbf_event_unit(u8 id
, void *ref
, struct zfcp_unit
*unit
)
806 struct zfcp_port
*port
= unit
->port
;
807 struct zfcp_adapter
*adapter
= port
->adapter
;
809 zfcp_rec_dbf_event_target(id
, ref
, adapter
, &unit
->status
,
810 &unit
->erp_counter
, port
->wwpn
, port
->d_id
,
815 * zfcp_rec_dbf_event_trigger - trace event for triggered error recovery
816 * @id2: identifier for error recovery trigger
817 * @ref: additional reference (e.g. request)
818 * @want: originally requested error recovery action
819 * @need: error recovery action actually initiated
820 * @action: address of error recovery action struct
825 void zfcp_rec_dbf_event_trigger(u8 id2
, void *ref
, u8 want
, u8 need
,
826 void *action
, struct zfcp_adapter
*adapter
,
827 struct zfcp_port
*port
, struct zfcp_unit
*unit
)
829 struct zfcp_rec_dbf_record
*r
= &adapter
->rec_dbf_buf
;
832 spin_lock_irqsave(&adapter
->rec_dbf_lock
, flags
);
833 memset(r
, 0, sizeof(*r
));
834 r
->id
= ZFCP_REC_DBF_ID_TRIGGER
;
836 r
->u
.trigger
.ref
= (unsigned long)ref
;
837 r
->u
.trigger
.want
= want
;
838 r
->u
.trigger
.need
= need
;
839 r
->u
.trigger
.action
= (unsigned long)action
;
840 r
->u
.trigger
.as
= atomic_read(&adapter
->status
);
842 r
->u
.trigger
.ps
= atomic_read(&port
->status
);
843 r
->u
.trigger
.wwpn
= port
->wwpn
;
846 r
->u
.trigger
.us
= atomic_read(&unit
->status
);
847 r
->u
.trigger
.fcp_lun
= unit
->fcp_lun
;
849 debug_event(adapter
->rec_dbf
, action
? 1 : 4, r
, sizeof(*r
));
850 spin_unlock_irqrestore(&adapter
->rec_dbf_lock
, flags
);
854 * zfcp_rec_dbf_event_action - trace event showing progress of recovery action
856 * @erp_action: error recovery action struct pointer
858 void zfcp_rec_dbf_event_action(u8 id2
, struct zfcp_erp_action
*erp_action
)
860 struct zfcp_adapter
*adapter
= erp_action
->adapter
;
861 struct zfcp_rec_dbf_record
*r
= &adapter
->rec_dbf_buf
;
864 spin_lock_irqsave(&adapter
->rec_dbf_lock
, flags
);
865 memset(r
, 0, sizeof(*r
));
866 r
->id
= ZFCP_REC_DBF_ID_ACTION
;
868 r
->u
.action
.action
= (unsigned long)erp_action
;
869 r
->u
.action
.status
= erp_action
->status
;
870 r
->u
.action
.step
= erp_action
->step
;
871 r
->u
.action
.fsf_req
= (unsigned long)erp_action
->fsf_req
;
872 debug_event(adapter
->rec_dbf
, 5, r
, sizeof(*r
));
873 spin_unlock_irqrestore(&adapter
->rec_dbf_lock
, flags
);
877 * zfcp_san_dbf_event_ct_request - trace event for issued CT request
878 * @fsf_req: request containing issued CT data
880 void zfcp_san_dbf_event_ct_request(struct zfcp_fsf_req
*fsf_req
)
882 struct zfcp_send_ct
*ct
= (struct zfcp_send_ct
*)fsf_req
->data
;
883 struct zfcp_wka_port
*wka_port
= ct
->wka_port
;
884 struct zfcp_adapter
*adapter
= wka_port
->adapter
;
885 struct ct_hdr
*hdr
= sg_virt(ct
->req
);
886 struct zfcp_san_dbf_record
*r
= &adapter
->san_dbf_buf
;
887 struct zfcp_san_dbf_record_ct_request
*oct
= &r
->u
.ct_req
;
891 spin_lock_irqsave(&adapter
->san_dbf_lock
, flags
);
892 memset(r
, 0, sizeof(*r
));
893 strncpy(r
->tag
, "octc", ZFCP_DBF_TAG_SIZE
);
894 r
->fsf_reqid
= (unsigned long)fsf_req
;
895 r
->fsf_seqno
= fsf_req
->seq_no
;
896 r
->s_id
= fc_host_port_id(adapter
->scsi_host
);
897 r
->d_id
= wka_port
->d_id
;
898 oct
->cmd_req_code
= hdr
->cmd_rsp_code
;
899 oct
->revision
= hdr
->revision
;
900 oct
->gs_type
= hdr
->gs_type
;
901 oct
->gs_subtype
= hdr
->gs_subtype
;
902 oct
->options
= hdr
->options
;
903 oct
->max_res_size
= hdr
->max_res_size
;
904 oct
->len
= min((int)ct
->req
->length
- (int)sizeof(struct ct_hdr
),
905 ZFCP_DBF_SAN_MAX_PAYLOAD
);
906 debug_event(adapter
->san_dbf
, level
, r
, sizeof(*r
));
907 zfcp_dbf_hexdump(adapter
->san_dbf
, r
, sizeof(*r
), level
,
908 (void *)hdr
+ sizeof(struct ct_hdr
), oct
->len
);
909 spin_unlock_irqrestore(&adapter
->san_dbf_lock
, flags
);
913 * zfcp_san_dbf_event_ct_response - trace event for completion of CT request
914 * @fsf_req: request containing CT response
916 void zfcp_san_dbf_event_ct_response(struct zfcp_fsf_req
*fsf_req
)
918 struct zfcp_send_ct
*ct
= (struct zfcp_send_ct
*)fsf_req
->data
;
919 struct zfcp_wka_port
*wka_port
= ct
->wka_port
;
920 struct zfcp_adapter
*adapter
= wka_port
->adapter
;
921 struct ct_hdr
*hdr
= sg_virt(ct
->resp
);
922 struct zfcp_san_dbf_record
*r
= &adapter
->san_dbf_buf
;
923 struct zfcp_san_dbf_record_ct_response
*rct
= &r
->u
.ct_resp
;
927 spin_lock_irqsave(&adapter
->san_dbf_lock
, flags
);
928 memset(r
, 0, sizeof(*r
));
929 strncpy(r
->tag
, "rctc", ZFCP_DBF_TAG_SIZE
);
930 r
->fsf_reqid
= (unsigned long)fsf_req
;
931 r
->fsf_seqno
= fsf_req
->seq_no
;
932 r
->s_id
= wka_port
->d_id
;
933 r
->d_id
= fc_host_port_id(adapter
->scsi_host
);
934 rct
->cmd_rsp_code
= hdr
->cmd_rsp_code
;
935 rct
->revision
= hdr
->revision
;
936 rct
->reason_code
= hdr
->reason_code
;
937 rct
->expl
= hdr
->reason_code_expl
;
938 rct
->vendor_unique
= hdr
->vendor_unique
;
939 rct
->max_res_size
= hdr
->max_res_size
;
940 rct
->len
= min((int)ct
->resp
->length
- (int)sizeof(struct ct_hdr
),
941 ZFCP_DBF_SAN_MAX_PAYLOAD
);
942 debug_event(adapter
->san_dbf
, level
, r
, sizeof(*r
));
943 zfcp_dbf_hexdump(adapter
->san_dbf
, r
, sizeof(*r
), level
,
944 (void *)hdr
+ sizeof(struct ct_hdr
), rct
->len
);
945 spin_unlock_irqrestore(&adapter
->san_dbf_lock
, flags
);
948 static void zfcp_san_dbf_event_els(const char *tag
, int level
,
949 struct zfcp_fsf_req
*fsf_req
, u32 s_id
,
950 u32 d_id
, u8 ls_code
, void *buffer
,
953 struct zfcp_adapter
*adapter
= fsf_req
->adapter
;
954 struct zfcp_san_dbf_record
*rec
= &adapter
->san_dbf_buf
;
957 spin_lock_irqsave(&adapter
->san_dbf_lock
, flags
);
958 memset(rec
, 0, sizeof(*rec
));
959 strncpy(rec
->tag
, tag
, ZFCP_DBF_TAG_SIZE
);
960 rec
->fsf_reqid
= (unsigned long)fsf_req
;
961 rec
->fsf_seqno
= fsf_req
->seq_no
;
964 rec
->u
.els
.ls_code
= ls_code
;
965 debug_event(adapter
->san_dbf
, level
, rec
, sizeof(*rec
));
966 zfcp_dbf_hexdump(adapter
->san_dbf
, rec
, sizeof(*rec
), level
,
967 buffer
, min(buflen
, ZFCP_DBF_SAN_MAX_PAYLOAD
));
968 spin_unlock_irqrestore(&adapter
->san_dbf_lock
, flags
);
972 * zfcp_san_dbf_event_els_request - trace event for issued ELS
973 * @fsf_req: request containing issued ELS
975 void zfcp_san_dbf_event_els_request(struct zfcp_fsf_req
*fsf_req
)
977 struct zfcp_send_els
*els
= (struct zfcp_send_els
*)fsf_req
->data
;
979 zfcp_san_dbf_event_els("oels", 2, fsf_req
,
980 fc_host_port_id(els
->adapter
->scsi_host
),
981 els
->d_id
, *(u8
*) sg_virt(els
->req
),
982 sg_virt(els
->req
), els
->req
->length
);
986 * zfcp_san_dbf_event_els_response - trace event for completed ELS
987 * @fsf_req: request containing ELS response
989 void zfcp_san_dbf_event_els_response(struct zfcp_fsf_req
*fsf_req
)
991 struct zfcp_send_els
*els
= (struct zfcp_send_els
*)fsf_req
->data
;
993 zfcp_san_dbf_event_els("rels", 2, fsf_req
, els
->d_id
,
994 fc_host_port_id(els
->adapter
->scsi_host
),
995 *(u8
*)sg_virt(els
->req
), sg_virt(els
->resp
),
1000 * zfcp_san_dbf_event_incoming_els - trace event for incomig ELS
1001 * @fsf_req: request containing unsolicited status buffer with incoming ELS
1003 void zfcp_san_dbf_event_incoming_els(struct zfcp_fsf_req
*fsf_req
)
1005 struct zfcp_adapter
*adapter
= fsf_req
->adapter
;
1006 struct fsf_status_read_buffer
*buf
=
1007 (struct fsf_status_read_buffer
*)fsf_req
->data
;
1008 int length
= (int)buf
->length
-
1009 (int)((void *)&buf
->payload
- (void *)buf
);
1011 zfcp_san_dbf_event_els("iels", 1, fsf_req
, buf
->d_id
,
1012 fc_host_port_id(adapter
->scsi_host
),
1013 buf
->payload
.data
[0], (void *)buf
->payload
.data
,
1017 static int zfcp_san_dbf_view_format(debug_info_t
*id
, struct debug_view
*view
,
1018 char *out_buf
, const char *in_buf
)
1020 struct zfcp_san_dbf_record
*r
= (struct zfcp_san_dbf_record
*)in_buf
;
1023 if (strncmp(r
->tag
, "dump", ZFCP_DBF_TAG_SIZE
) == 0)
1026 zfcp_dbf_tag(&p
, "tag", r
->tag
);
1027 zfcp_dbf_out(&p
, "fsf_reqid", "0x%0Lx", r
->fsf_reqid
);
1028 zfcp_dbf_out(&p
, "fsf_seqno", "0x%08x", r
->fsf_seqno
);
1029 zfcp_dbf_out(&p
, "s_id", "0x%06x", r
->s_id
);
1030 zfcp_dbf_out(&p
, "d_id", "0x%06x", r
->d_id
);
1032 if (strncmp(r
->tag
, "octc", ZFCP_DBF_TAG_SIZE
) == 0) {
1033 struct zfcp_san_dbf_record_ct_request
*ct
= &r
->u
.ct_req
;
1034 zfcp_dbf_out(&p
, "cmd_req_code", "0x%04x", ct
->cmd_req_code
);
1035 zfcp_dbf_out(&p
, "revision", "0x%02x", ct
->revision
);
1036 zfcp_dbf_out(&p
, "gs_type", "0x%02x", ct
->gs_type
);
1037 zfcp_dbf_out(&p
, "gs_subtype", "0x%02x", ct
->gs_subtype
);
1038 zfcp_dbf_out(&p
, "options", "0x%02x", ct
->options
);
1039 zfcp_dbf_out(&p
, "max_res_size", "0x%04x", ct
->max_res_size
);
1040 } else if (strncmp(r
->tag
, "rctc", ZFCP_DBF_TAG_SIZE
) == 0) {
1041 struct zfcp_san_dbf_record_ct_response
*ct
= &r
->u
.ct_resp
;
1042 zfcp_dbf_out(&p
, "cmd_rsp_code", "0x%04x", ct
->cmd_rsp_code
);
1043 zfcp_dbf_out(&p
, "revision", "0x%02x", ct
->revision
);
1044 zfcp_dbf_out(&p
, "reason_code", "0x%02x", ct
->reason_code
);
1045 zfcp_dbf_out(&p
, "reason_code_expl", "0x%02x", ct
->expl
);
1046 zfcp_dbf_out(&p
, "vendor_unique", "0x%02x", ct
->vendor_unique
);
1047 zfcp_dbf_out(&p
, "max_res_size", "0x%04x", ct
->max_res_size
);
1048 } else if (strncmp(r
->tag
, "oels", ZFCP_DBF_TAG_SIZE
) == 0 ||
1049 strncmp(r
->tag
, "rels", ZFCP_DBF_TAG_SIZE
) == 0 ||
1050 strncmp(r
->tag
, "iels", ZFCP_DBF_TAG_SIZE
) == 0) {
1051 struct zfcp_san_dbf_record_els
*els
= &r
->u
.els
;
1052 zfcp_dbf_out(&p
, "ls_code", "0x%02x", els
->ls_code
);
1057 static struct debug_view zfcp_san_dbf_view
= {
1060 &zfcp_dbf_view_header
,
1061 &zfcp_san_dbf_view_format
,
1066 static void zfcp_scsi_dbf_event(const char *tag
, const char *tag2
, int level
,
1067 struct zfcp_adapter
*adapter
,
1068 struct scsi_cmnd
*scsi_cmnd
,
1069 struct zfcp_fsf_req
*fsf_req
,
1070 unsigned long old_req_id
)
1072 struct zfcp_scsi_dbf_record
*rec
= &adapter
->scsi_dbf_buf
;
1073 struct zfcp_dbf_dump
*dump
= (struct zfcp_dbf_dump
*)rec
;
1074 unsigned long flags
;
1075 struct fcp_rsp_iu
*fcp_rsp
;
1076 char *fcp_rsp_info
= NULL
, *fcp_sns_info
= NULL
;
1077 int offset
= 0, buflen
= 0;
1079 spin_lock_irqsave(&adapter
->scsi_dbf_lock
, flags
);
1081 memset(rec
, 0, sizeof(*rec
));
1083 strncpy(rec
->tag
, tag
, ZFCP_DBF_TAG_SIZE
);
1084 strncpy(rec
->tag2
, tag2
, ZFCP_DBF_TAG_SIZE
);
1085 if (scsi_cmnd
!= NULL
) {
1086 if (scsi_cmnd
->device
) {
1087 rec
->scsi_id
= scsi_cmnd
->device
->id
;
1088 rec
->scsi_lun
= scsi_cmnd
->device
->lun
;
1090 rec
->scsi_result
= scsi_cmnd
->result
;
1091 rec
->scsi_cmnd
= (unsigned long)scsi_cmnd
;
1092 rec
->scsi_serial
= scsi_cmnd
->serial_number
;
1093 memcpy(rec
->scsi_opcode
, scsi_cmnd
->cmnd
,
1094 min((int)scsi_cmnd
->cmd_len
,
1095 ZFCP_DBF_SCSI_OPCODE
));
1096 rec
->scsi_retries
= scsi_cmnd
->retries
;
1097 rec
->scsi_allowed
= scsi_cmnd
->allowed
;
1099 if (fsf_req
!= NULL
) {
1100 fcp_rsp
= (struct fcp_rsp_iu
*)
1101 &(fsf_req
->qtcb
->bottom
.io
.fcp_rsp
);
1102 fcp_rsp_info
= (unsigned char *) &fcp_rsp
[1];
1104 zfcp_get_fcp_sns_info_ptr(fcp_rsp
);
1106 rec
->rsp_validity
= fcp_rsp
->validity
.value
;
1107 rec
->rsp_scsi_status
= fcp_rsp
->scsi_status
;
1108 rec
->rsp_resid
= fcp_rsp
->fcp_resid
;
1109 if (fcp_rsp
->validity
.bits
.fcp_rsp_len_valid
)
1110 rec
->rsp_code
= *(fcp_rsp_info
+ 3);
1111 if (fcp_rsp
->validity
.bits
.fcp_sns_len_valid
) {
1112 buflen
= min((int)fcp_rsp
->fcp_sns_len
,
1113 ZFCP_DBF_SCSI_MAX_FCP_SNS_INFO
);
1114 rec
->sns_info_len
= buflen
;
1115 memcpy(rec
->sns_info
, fcp_sns_info
,
1117 ZFCP_DBF_SCSI_FCP_SNS_INFO
));
1118 offset
+= min(buflen
,
1119 ZFCP_DBF_SCSI_FCP_SNS_INFO
);
1122 rec
->fsf_reqid
= (unsigned long)fsf_req
;
1123 rec
->fsf_seqno
= fsf_req
->seq_no
;
1124 rec
->fsf_issued
= fsf_req
->issued
;
1126 rec
->old_fsf_reqid
= old_req_id
;
1128 strncpy(dump
->tag
, "dump", ZFCP_DBF_TAG_SIZE
);
1129 dump
->total_size
= buflen
;
1130 dump
->offset
= offset
;
1131 dump
->size
= min(buflen
- offset
,
1133 zfcp_scsi_dbf_record
) -
1134 (int)sizeof(struct zfcp_dbf_dump
));
1135 memcpy(dump
->data
, fcp_sns_info
+ offset
, dump
->size
);
1136 offset
+= dump
->size
;
1138 debug_event(adapter
->scsi_dbf
, level
, rec
, sizeof(*rec
));
1139 } while (offset
< buflen
);
1140 spin_unlock_irqrestore(&adapter
->scsi_dbf_lock
, flags
);
1144 * zfcp_scsi_dbf_event_result - trace event for SCSI command completion
1145 * @tag: tag indicating success or failure of SCSI command
1146 * @level: trace level applicable for this event
1147 * @adapter: adapter that has been used to issue the SCSI command
1148 * @scsi_cmnd: SCSI command pointer
1149 * @fsf_req: request used to issue SCSI command (might be NULL)
1151 void zfcp_scsi_dbf_event_result(const char *tag
, int level
,
1152 struct zfcp_adapter
*adapter
,
1153 struct scsi_cmnd
*scsi_cmnd
,
1154 struct zfcp_fsf_req
*fsf_req
)
1156 zfcp_scsi_dbf_event("rslt", tag
, level
, adapter
, scsi_cmnd
, fsf_req
, 0);
1160 * zfcp_scsi_dbf_event_abort - trace event for SCSI command abort
1161 * @tag: tag indicating success or failure of abort operation
1162 * @adapter: adapter thas has been used to issue SCSI command to be aborted
1163 * @scsi_cmnd: SCSI command to be aborted
1164 * @new_fsf_req: request containing abort (might be NULL)
1165 * @old_req_id: identifier of request containg SCSI command to be aborted
1167 void zfcp_scsi_dbf_event_abort(const char *tag
, struct zfcp_adapter
*adapter
,
1168 struct scsi_cmnd
*scsi_cmnd
,
1169 struct zfcp_fsf_req
*new_fsf_req
,
1170 unsigned long old_req_id
)
1172 zfcp_scsi_dbf_event("abrt", tag
, 1, adapter
, scsi_cmnd
, new_fsf_req
,
1177 * zfcp_scsi_dbf_event_devreset - trace event for Logical Unit or Target Reset
1178 * @tag: tag indicating success or failure of reset operation
1179 * @flag: indicates type of reset (Target Reset, Logical Unit Reset)
1180 * @unit: unit that needs reset
1181 * @scsi_cmnd: SCSI command which caused this error recovery
1183 void zfcp_scsi_dbf_event_devreset(const char *tag
, u8 flag
,
1184 struct zfcp_unit
*unit
,
1185 struct scsi_cmnd
*scsi_cmnd
)
1187 zfcp_scsi_dbf_event(flag
== FCP_TARGET_RESET
? "trst" : "lrst", tag
, 1,
1188 unit
->port
->adapter
, scsi_cmnd
, NULL
, 0);
1191 static int zfcp_scsi_dbf_view_format(debug_info_t
*id
, struct debug_view
*view
,
1192 char *out_buf
, const char *in_buf
)
1194 struct zfcp_scsi_dbf_record
*r
= (struct zfcp_scsi_dbf_record
*)in_buf
;
1198 if (strncmp(r
->tag
, "dump", ZFCP_DBF_TAG_SIZE
) == 0)
1201 zfcp_dbf_tag(&p
, "tag", r
->tag
);
1202 zfcp_dbf_tag(&p
, "tag2", r
->tag2
);
1203 zfcp_dbf_out(&p
, "scsi_id", "0x%08x", r
->scsi_id
);
1204 zfcp_dbf_out(&p
, "scsi_lun", "0x%08x", r
->scsi_lun
);
1205 zfcp_dbf_out(&p
, "scsi_result", "0x%08x", r
->scsi_result
);
1206 zfcp_dbf_out(&p
, "scsi_cmnd", "0x%0Lx", r
->scsi_cmnd
);
1207 zfcp_dbf_out(&p
, "scsi_serial", "0x%016Lx", r
->scsi_serial
);
1208 zfcp_dbf_outd(&p
, "scsi_opcode", r
->scsi_opcode
, ZFCP_DBF_SCSI_OPCODE
,
1209 0, ZFCP_DBF_SCSI_OPCODE
);
1210 zfcp_dbf_out(&p
, "scsi_retries", "0x%02x", r
->scsi_retries
);
1211 zfcp_dbf_out(&p
, "scsi_allowed", "0x%02x", r
->scsi_allowed
);
1212 if (strncmp(r
->tag
, "abrt", ZFCP_DBF_TAG_SIZE
) == 0)
1213 zfcp_dbf_out(&p
, "old_fsf_reqid", "0x%0Lx", r
->old_fsf_reqid
);
1214 zfcp_dbf_out(&p
, "fsf_reqid", "0x%0Lx", r
->fsf_reqid
);
1215 zfcp_dbf_out(&p
, "fsf_seqno", "0x%08x", r
->fsf_seqno
);
1216 zfcp_dbf_timestamp(r
->fsf_issued
, &t
);
1217 zfcp_dbf_out(&p
, "fsf_issued", "%011lu:%06lu", t
.tv_sec
, t
.tv_nsec
);
1219 if (strncmp(r
->tag
, "rslt", ZFCP_DBF_TAG_SIZE
) == 0) {
1220 zfcp_dbf_out(&p
, "fcp_rsp_validity", "0x%02x", r
->rsp_validity
);
1221 zfcp_dbf_out(&p
, "fcp_rsp_scsi_status", "0x%02x",
1222 r
->rsp_scsi_status
);
1223 zfcp_dbf_out(&p
, "fcp_rsp_resid", "0x%08x", r
->rsp_resid
);
1224 zfcp_dbf_out(&p
, "fcp_rsp_code", "0x%08x", r
->rsp_code
);
1225 zfcp_dbf_out(&p
, "fcp_sns_info_len", "0x%08x", r
->sns_info_len
);
1226 zfcp_dbf_outd(&p
, "fcp_sns_info", r
->sns_info
,
1227 min((int)r
->sns_info_len
,
1228 ZFCP_DBF_SCSI_FCP_SNS_INFO
), 0,
1231 p
+= sprintf(p
, "\n");
1235 static struct debug_view zfcp_scsi_dbf_view
= {
1238 &zfcp_dbf_view_header
,
1239 &zfcp_scsi_dbf_view_format
,
1245 * zfcp_adapter_debug_register - registers debug feature for an adapter
1246 * @adapter: pointer to adapter for which debug features should be registered
1247 * return: -ENOMEM on error, 0 otherwise
1249 int zfcp_adapter_debug_register(struct zfcp_adapter
*adapter
)
1251 char dbf_name
[DEBUG_MAX_NAME_LEN
];
1253 /* debug feature area which records recovery activity */
1254 sprintf(dbf_name
, "zfcp_%s_rec", dev_name(&adapter
->ccw_device
->dev
));
1255 adapter
->rec_dbf
= debug_register(dbf_name
, dbfsize
, 1,
1256 sizeof(struct zfcp_rec_dbf_record
));
1257 if (!adapter
->rec_dbf
)
1259 debug_register_view(adapter
->rec_dbf
, &debug_hex_ascii_view
);
1260 debug_register_view(adapter
->rec_dbf
, &zfcp_rec_dbf_view
);
1261 debug_set_level(adapter
->rec_dbf
, 3);
1263 /* debug feature area which records HBA (FSF and QDIO) conditions */
1264 sprintf(dbf_name
, "zfcp_%s_hba", dev_name(&adapter
->ccw_device
->dev
));
1265 adapter
->hba_dbf
= debug_register(dbf_name
, dbfsize
, 1,
1266 sizeof(struct zfcp_hba_dbf_record
));
1267 if (!adapter
->hba_dbf
)
1269 debug_register_view(adapter
->hba_dbf
, &debug_hex_ascii_view
);
1270 debug_register_view(adapter
->hba_dbf
, &zfcp_hba_dbf_view
);
1271 debug_set_level(adapter
->hba_dbf
, 3);
1273 /* debug feature area which records SAN command failures and recovery */
1274 sprintf(dbf_name
, "zfcp_%s_san", dev_name(&adapter
->ccw_device
->dev
));
1275 adapter
->san_dbf
= debug_register(dbf_name
, dbfsize
, 1,
1276 sizeof(struct zfcp_san_dbf_record
));
1277 if (!adapter
->san_dbf
)
1279 debug_register_view(adapter
->san_dbf
, &debug_hex_ascii_view
);
1280 debug_register_view(adapter
->san_dbf
, &zfcp_san_dbf_view
);
1281 debug_set_level(adapter
->san_dbf
, 6);
1283 /* debug feature area which records SCSI command failures and recovery */
1284 sprintf(dbf_name
, "zfcp_%s_scsi", dev_name(&adapter
->ccw_device
->dev
));
1285 adapter
->scsi_dbf
= debug_register(dbf_name
, dbfsize
, 1,
1286 sizeof(struct zfcp_scsi_dbf_record
));
1287 if (!adapter
->scsi_dbf
)
1289 debug_register_view(adapter
->scsi_dbf
, &debug_hex_ascii_view
);
1290 debug_register_view(adapter
->scsi_dbf
, &zfcp_scsi_dbf_view
);
1291 debug_set_level(adapter
->scsi_dbf
, 3);
1296 zfcp_adapter_debug_unregister(adapter
);
1302 * zfcp_adapter_debug_unregister - unregisters debug feature for an adapter
1303 * @adapter: pointer to adapter for which debug features should be unregistered
1305 void zfcp_adapter_debug_unregister(struct zfcp_adapter
*adapter
)
1307 debug_unregister(adapter
->scsi_dbf
);
1308 debug_unregister(adapter
->san_dbf
);
1309 debug_unregister(adapter
->hba_dbf
);
1310 debug_unregister(adapter
->rec_dbf
);
1311 adapter
->scsi_dbf
= NULL
;
1312 adapter
->san_dbf
= NULL
;
1313 adapter
->hba_dbf
= NULL
;
1314 adapter
->rec_dbf
= NULL
;