4 * Debug traces for zfcp.
6 * Copyright IBM Corporation 2002, 2009
9 #define KMSG_COMPONENT "zfcp"
10 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
12 #include <linux/ctype.h>
13 #include <asm/debug.h>
17 static u32 dbfsize
= 4;
19 module_param(dbfsize
, uint
, 0400);
20 MODULE_PARM_DESC(dbfsize
,
21 "number of pages for each debug feature area (default 4)");
23 static void zfcp_dbf_hexdump(debug_info_t
*dbf
, void *to
, int to_len
,
24 int level
, char *from
, int from_len
)
27 struct zfcp_dbf_dump
*dump
= to
;
28 int room
= to_len
- sizeof(*dump
);
30 for (offset
= 0; offset
< from_len
; offset
+= dump
->size
) {
31 memset(to
, 0, to_len
);
32 strncpy(dump
->tag
, "dump", ZFCP_DBF_TAG_SIZE
);
33 dump
->total_size
= from_len
;
34 dump
->offset
= offset
;
35 dump
->size
= min(from_len
- offset
, room
);
36 memcpy(dump
->data
, from
+ offset
, dump
->size
);
37 debug_event(dbf
, level
, dump
, dump
->size
+ sizeof(*dump
));
41 static void zfcp_dbf_tag(char **p
, const char *label
, const char *tag
)
45 *p
+= sprintf(*p
, "%-24s", label
);
46 for (i
= 0; i
< ZFCP_DBF_TAG_SIZE
; i
++)
47 *p
+= sprintf(*p
, "%c", tag
[i
]);
48 *p
+= sprintf(*p
, "\n");
51 static void zfcp_dbf_outs(char **buf
, const char *s1
, const char *s2
)
53 *buf
+= sprintf(*buf
, "%-24s%s\n", s1
, s2
);
56 static void zfcp_dbf_out(char **buf
, const char *s
, const char *format
, ...)
60 *buf
+= sprintf(*buf
, "%-24s", s
);
61 va_start(arg
, format
);
62 *buf
+= vsprintf(*buf
, format
, arg
);
64 *buf
+= sprintf(*buf
, "\n");
67 static void zfcp_dbf_outd(char **p
, const char *label
, char *buffer
,
68 int buflen
, int offset
, int total_size
)
71 *p
+= sprintf(*p
, "%-24s ", label
);
74 if ((offset
% 32) == 0)
75 *p
+= sprintf(*p
, "\n%-24c ", ' ');
76 else if ((offset
% 4) == 0)
77 *p
+= sprintf(*p
, " ");
79 *p
+= sprintf(*p
, "%02x", *buffer
++);
80 if (++offset
== total_size
) {
81 *p
+= sprintf(*p
, "\n");
86 *p
+= sprintf(*p
, "\n");
89 static int zfcp_dbf_view_header(debug_info_t
*id
, struct debug_view
*view
,
90 int area
, debug_entry_t
*entry
, char *out_buf
)
92 struct zfcp_dbf_dump
*dump
= (struct zfcp_dbf_dump
*)DEBUG_DATA(entry
);
96 if (strncmp(dump
->tag
, "dump", ZFCP_DBF_TAG_SIZE
) != 0) {
97 stck_to_timespec(entry
->id
.stck
, &t
);
98 zfcp_dbf_out(&p
, "timestamp", "%011lu:%06lu",
100 zfcp_dbf_out(&p
, "cpu", "%02i", entry
->id
.fields
.cpuid
);
102 zfcp_dbf_outd(&p
, "", dump
->data
, dump
->size
, dump
->offset
,
104 if ((dump
->offset
+ dump
->size
) == dump
->total_size
)
105 p
+= sprintf(p
, "\n");
110 void _zfcp_dbf_hba_fsf_response(const char *tag2
, int level
,
111 struct zfcp_fsf_req
*fsf_req
,
112 struct zfcp_dbf
*dbf
)
114 struct fsf_qtcb
*qtcb
= fsf_req
->qtcb
;
115 union fsf_prot_status_qual
*prot_status_qual
=
116 &qtcb
->prefix
.prot_status_qual
;
117 union fsf_status_qual
*fsf_status_qual
= &qtcb
->header
.fsf_status_qual
;
118 struct scsi_cmnd
*scsi_cmnd
;
119 struct zfcp_port
*port
;
120 struct zfcp_unit
*unit
;
121 struct zfcp_send_els
*send_els
;
122 struct zfcp_dbf_hba_record
*rec
= &dbf
->hba_buf
;
123 struct zfcp_dbf_hba_record_response
*response
= &rec
->u
.response
;
126 spin_lock_irqsave(&dbf
->hba_lock
, flags
);
127 memset(rec
, 0, sizeof(*rec
));
128 strncpy(rec
->tag
, "resp", ZFCP_DBF_TAG_SIZE
);
129 strncpy(rec
->tag2
, tag2
, ZFCP_DBF_TAG_SIZE
);
131 response
->fsf_command
= fsf_req
->fsf_command
;
132 response
->fsf_reqid
= fsf_req
->req_id
;
133 response
->fsf_seqno
= fsf_req
->seq_no
;
134 response
->fsf_issued
= fsf_req
->issued
;
135 response
->fsf_prot_status
= qtcb
->prefix
.prot_status
;
136 response
->fsf_status
= qtcb
->header
.fsf_status
;
137 memcpy(response
->fsf_prot_status_qual
,
138 prot_status_qual
, FSF_PROT_STATUS_QUAL_SIZE
);
139 memcpy(response
->fsf_status_qual
,
140 fsf_status_qual
, FSF_STATUS_QUALIFIER_SIZE
);
141 response
->fsf_req_status
= fsf_req
->status
;
142 response
->sbal_first
= fsf_req
->queue_req
.sbal_first
;
143 response
->sbal_last
= fsf_req
->queue_req
.sbal_last
;
144 response
->sbal_response
= fsf_req
->queue_req
.sbal_response
;
145 response
->pool
= fsf_req
->pool
!= NULL
;
146 response
->erp_action
= (unsigned long)fsf_req
->erp_action
;
148 switch (fsf_req
->fsf_command
) {
149 case FSF_QTCB_FCP_CMND
:
150 if (fsf_req
->status
& ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT
)
152 scsi_cmnd
= (struct scsi_cmnd
*)fsf_req
->data
;
154 response
->u
.fcp
.cmnd
= (unsigned long)scsi_cmnd
;
155 response
->u
.fcp
.serial
= scsi_cmnd
->serial_number
;
159 case FSF_QTCB_OPEN_PORT_WITH_DID
:
160 case FSF_QTCB_CLOSE_PORT
:
161 case FSF_QTCB_CLOSE_PHYSICAL_PORT
:
162 port
= (struct zfcp_port
*)fsf_req
->data
;
163 response
->u
.port
.wwpn
= port
->wwpn
;
164 response
->u
.port
.d_id
= port
->d_id
;
165 response
->u
.port
.port_handle
= qtcb
->header
.port_handle
;
168 case FSF_QTCB_OPEN_LUN
:
169 case FSF_QTCB_CLOSE_LUN
:
170 unit
= (struct zfcp_unit
*)fsf_req
->data
;
172 response
->u
.unit
.wwpn
= port
->wwpn
;
173 response
->u
.unit
.fcp_lun
= unit
->fcp_lun
;
174 response
->u
.unit
.port_handle
= qtcb
->header
.port_handle
;
175 response
->u
.unit
.lun_handle
= qtcb
->header
.lun_handle
;
178 case FSF_QTCB_SEND_ELS
:
179 send_els
= (struct zfcp_send_els
*)fsf_req
->data
;
180 response
->u
.els
.d_id
= qtcb
->bottom
.support
.d_id
;
181 response
->u
.els
.ls_code
= send_els
->ls_code
>> 24;
184 case FSF_QTCB_ABORT_FCP_CMND
:
185 case FSF_QTCB_SEND_GENERIC
:
186 case FSF_QTCB_EXCHANGE_CONFIG_DATA
:
187 case FSF_QTCB_EXCHANGE_PORT_DATA
:
188 case FSF_QTCB_DOWNLOAD_CONTROL_FILE
:
189 case FSF_QTCB_UPLOAD_CONTROL_FILE
:
193 debug_event(dbf
->hba
, level
, rec
, sizeof(*rec
));
195 /* have fcp channel microcode fixed to use as little as possible */
196 if (fsf_req
->fsf_command
!= FSF_QTCB_FCP_CMND
) {
197 /* adjust length skipping trailing zeros */
198 char *buf
= (char *)qtcb
+ qtcb
->header
.log_start
;
199 int len
= qtcb
->header
.log_length
;
200 for (; len
&& !buf
[len
- 1]; len
--);
201 zfcp_dbf_hexdump(dbf
->hba
, rec
, sizeof(*rec
), level
, buf
,
205 spin_unlock_irqrestore(&dbf
->hba_lock
, flags
);
208 void _zfcp_dbf_hba_fsf_unsol(const char *tag
, int level
, struct zfcp_dbf
*dbf
,
209 struct fsf_status_read_buffer
*status_buffer
)
211 struct zfcp_dbf_hba_record
*rec
= &dbf
->hba_buf
;
214 spin_lock_irqsave(&dbf
->hba_lock
, flags
);
215 memset(rec
, 0, sizeof(*rec
));
216 strncpy(rec
->tag
, "stat", ZFCP_DBF_TAG_SIZE
);
217 strncpy(rec
->tag2
, tag
, ZFCP_DBF_TAG_SIZE
);
219 rec
->u
.status
.failed
= atomic_read(&dbf
->adapter
->stat_miss
);
220 if (status_buffer
!= NULL
) {
221 rec
->u
.status
.status_type
= status_buffer
->status_type
;
222 rec
->u
.status
.status_subtype
= status_buffer
->status_subtype
;
223 memcpy(&rec
->u
.status
.queue_designator
,
224 &status_buffer
->queue_designator
,
225 sizeof(struct fsf_queue_designator
));
227 switch (status_buffer
->status_type
) {
228 case FSF_STATUS_READ_SENSE_DATA_AVAIL
:
229 rec
->u
.status
.payload_size
=
230 ZFCP_DBF_UNSOL_PAYLOAD_SENSE_DATA_AVAIL
;
233 case FSF_STATUS_READ_BIT_ERROR_THRESHOLD
:
234 rec
->u
.status
.payload_size
=
235 ZFCP_DBF_UNSOL_PAYLOAD_BIT_ERROR_THRESHOLD
;
238 case FSF_STATUS_READ_LINK_DOWN
:
239 switch (status_buffer
->status_subtype
) {
240 case FSF_STATUS_READ_SUB_NO_PHYSICAL_LINK
:
241 case FSF_STATUS_READ_SUB_FDISC_FAILED
:
242 rec
->u
.status
.payload_size
=
243 sizeof(struct fsf_link_down_info
);
247 case FSF_STATUS_READ_FEATURE_UPDATE_ALERT
:
248 rec
->u
.status
.payload_size
=
249 ZFCP_DBF_UNSOL_PAYLOAD_FEATURE_UPDATE_ALERT
;
252 memcpy(&rec
->u
.status
.payload
,
253 &status_buffer
->payload
, rec
->u
.status
.payload_size
);
256 debug_event(dbf
->hba
, level
, rec
, sizeof(*rec
));
257 spin_unlock_irqrestore(&dbf
->hba_lock
, flags
);
261 * zfcp_dbf_hba_qdio - trace event for QDIO related failure
262 * @qdio: qdio structure affected by this QDIO related event
263 * @qdio_error: as passed by qdio module
264 * @sbal_index: first buffer with error condition, as passed by qdio module
265 * @sbal_count: number of buffers affected, as passed by qdio module
267 void zfcp_dbf_hba_qdio(struct zfcp_dbf
*dbf
, unsigned int qdio_error
,
268 int sbal_index
, int sbal_count
)
270 struct zfcp_dbf_hba_record
*r
= &dbf
->hba_buf
;
273 spin_lock_irqsave(&dbf
->hba_lock
, flags
);
274 memset(r
, 0, sizeof(*r
));
275 strncpy(r
->tag
, "qdio", ZFCP_DBF_TAG_SIZE
);
276 r
->u
.qdio
.qdio_error
= qdio_error
;
277 r
->u
.qdio
.sbal_index
= sbal_index
;
278 r
->u
.qdio
.sbal_count
= sbal_count
;
279 debug_event(dbf
->hba
, 0, r
, sizeof(*r
));
280 spin_unlock_irqrestore(&dbf
->hba_lock
, flags
);
284 * zfcp_dbf_hba_berr - trace event for bit error threshold
285 * @dbf: dbf structure affected by this QDIO related event
288 void zfcp_dbf_hba_berr(struct zfcp_dbf
*dbf
, struct zfcp_fsf_req
*req
)
290 struct zfcp_dbf_hba_record
*r
= &dbf
->hba_buf
;
291 struct fsf_status_read_buffer
*sr_buf
= req
->data
;
292 struct fsf_bit_error_payload
*err
= &sr_buf
->payload
.bit_error
;
295 spin_lock_irqsave(&dbf
->hba_lock
, flags
);
296 memset(r
, 0, sizeof(*r
));
297 strncpy(r
->tag
, "berr", ZFCP_DBF_TAG_SIZE
);
298 memcpy(&r
->u
.berr
, err
, sizeof(struct fsf_bit_error_payload
));
299 debug_event(dbf
->hba
, 0, r
, sizeof(*r
));
300 spin_unlock_irqrestore(&dbf
->hba_lock
, flags
);
302 static void zfcp_dbf_hba_view_response(char **p
,
303 struct zfcp_dbf_hba_record_response
*r
)
307 zfcp_dbf_out(p
, "fsf_command", "0x%08x", r
->fsf_command
);
308 zfcp_dbf_out(p
, "fsf_reqid", "0x%0Lx", r
->fsf_reqid
);
309 zfcp_dbf_out(p
, "fsf_seqno", "0x%08x", r
->fsf_seqno
);
310 stck_to_timespec(r
->fsf_issued
, &t
);
311 zfcp_dbf_out(p
, "fsf_issued", "%011lu:%06lu", t
.tv_sec
, t
.tv_nsec
);
312 zfcp_dbf_out(p
, "fsf_prot_status", "0x%08x", r
->fsf_prot_status
);
313 zfcp_dbf_out(p
, "fsf_status", "0x%08x", r
->fsf_status
);
314 zfcp_dbf_outd(p
, "fsf_prot_status_qual", r
->fsf_prot_status_qual
,
315 FSF_PROT_STATUS_QUAL_SIZE
, 0, FSF_PROT_STATUS_QUAL_SIZE
);
316 zfcp_dbf_outd(p
, "fsf_status_qual", r
->fsf_status_qual
,
317 FSF_STATUS_QUALIFIER_SIZE
, 0, FSF_STATUS_QUALIFIER_SIZE
);
318 zfcp_dbf_out(p
, "fsf_req_status", "0x%08x", r
->fsf_req_status
);
319 zfcp_dbf_out(p
, "sbal_first", "0x%02x", r
->sbal_first
);
320 zfcp_dbf_out(p
, "sbal_last", "0x%02x", r
->sbal_last
);
321 zfcp_dbf_out(p
, "sbal_response", "0x%02x", r
->sbal_response
);
322 zfcp_dbf_out(p
, "pool", "0x%02x", r
->pool
);
324 switch (r
->fsf_command
) {
325 case FSF_QTCB_FCP_CMND
:
326 if (r
->fsf_req_status
& ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT
)
328 zfcp_dbf_out(p
, "scsi_cmnd", "0x%0Lx", r
->u
.fcp
.cmnd
);
329 zfcp_dbf_out(p
, "scsi_serial", "0x%016Lx", r
->u
.fcp
.serial
);
330 p
+= sprintf(*p
, "\n");
333 case FSF_QTCB_OPEN_PORT_WITH_DID
:
334 case FSF_QTCB_CLOSE_PORT
:
335 case FSF_QTCB_CLOSE_PHYSICAL_PORT
:
336 zfcp_dbf_out(p
, "wwpn", "0x%016Lx", r
->u
.port
.wwpn
);
337 zfcp_dbf_out(p
, "d_id", "0x%06x", r
->u
.port
.d_id
);
338 zfcp_dbf_out(p
, "port_handle", "0x%08x", r
->u
.port
.port_handle
);
341 case FSF_QTCB_OPEN_LUN
:
342 case FSF_QTCB_CLOSE_LUN
:
343 zfcp_dbf_out(p
, "wwpn", "0x%016Lx", r
->u
.unit
.wwpn
);
344 zfcp_dbf_out(p
, "fcp_lun", "0x%016Lx", r
->u
.unit
.fcp_lun
);
345 zfcp_dbf_out(p
, "port_handle", "0x%08x", r
->u
.unit
.port_handle
);
346 zfcp_dbf_out(p
, "lun_handle", "0x%08x", r
->u
.unit
.lun_handle
);
349 case FSF_QTCB_SEND_ELS
:
350 zfcp_dbf_out(p
, "d_id", "0x%06x", r
->u
.els
.d_id
);
351 zfcp_dbf_out(p
, "ls_code", "0x%02x", r
->u
.els
.ls_code
);
354 case FSF_QTCB_ABORT_FCP_CMND
:
355 case FSF_QTCB_SEND_GENERIC
:
356 case FSF_QTCB_EXCHANGE_CONFIG_DATA
:
357 case FSF_QTCB_EXCHANGE_PORT_DATA
:
358 case FSF_QTCB_DOWNLOAD_CONTROL_FILE
:
359 case FSF_QTCB_UPLOAD_CONTROL_FILE
:
364 static void zfcp_dbf_hba_view_status(char **p
,
365 struct zfcp_dbf_hba_record_status
*r
)
367 zfcp_dbf_out(p
, "failed", "0x%02x", r
->failed
);
368 zfcp_dbf_out(p
, "status_type", "0x%08x", r
->status_type
);
369 zfcp_dbf_out(p
, "status_subtype", "0x%08x", r
->status_subtype
);
370 zfcp_dbf_outd(p
, "queue_designator", (char *)&r
->queue_designator
,
371 sizeof(struct fsf_queue_designator
), 0,
372 sizeof(struct fsf_queue_designator
));
373 zfcp_dbf_outd(p
, "payload", (char *)&r
->payload
, r
->payload_size
, 0,
377 static void zfcp_dbf_hba_view_qdio(char **p
, struct zfcp_dbf_hba_record_qdio
*r
)
379 zfcp_dbf_out(p
, "qdio_error", "0x%08x", r
->qdio_error
);
380 zfcp_dbf_out(p
, "sbal_index", "0x%02x", r
->sbal_index
);
381 zfcp_dbf_out(p
, "sbal_count", "0x%02x", r
->sbal_count
);
384 static void zfcp_dbf_hba_view_berr(char **p
, struct fsf_bit_error_payload
*r
)
386 zfcp_dbf_out(p
, "link_failures", "%d", r
->link_failure_error_count
);
387 zfcp_dbf_out(p
, "loss_of_sync_err", "%d", r
->loss_of_sync_error_count
);
388 zfcp_dbf_out(p
, "loss_of_sig_err", "%d", r
->loss_of_signal_error_count
);
389 zfcp_dbf_out(p
, "prim_seq_err", "%d",
390 r
->primitive_sequence_error_count
);
391 zfcp_dbf_out(p
, "inval_trans_word_err", "%d",
392 r
->invalid_transmission_word_error_count
);
393 zfcp_dbf_out(p
, "CRC_errors", "%d", r
->crc_error_count
);
394 zfcp_dbf_out(p
, "prim_seq_event_to", "%d",
395 r
->primitive_sequence_event_timeout_count
);
396 zfcp_dbf_out(p
, "elast_buf_overrun_err", "%d",
397 r
->elastic_buffer_overrun_error_count
);
398 zfcp_dbf_out(p
, "adv_rec_buf2buf_cred", "%d",
399 r
->advertised_receive_b2b_credit
);
400 zfcp_dbf_out(p
, "curr_rec_buf2buf_cred", "%d",
401 r
->current_receive_b2b_credit
);
402 zfcp_dbf_out(p
, "adv_trans_buf2buf_cred", "%d",
403 r
->advertised_transmit_b2b_credit
);
404 zfcp_dbf_out(p
, "curr_trans_buf2buf_cred", "%d",
405 r
->current_transmit_b2b_credit
);
408 static int zfcp_dbf_hba_view_format(debug_info_t
*id
, struct debug_view
*view
,
409 char *out_buf
, const char *in_buf
)
411 struct zfcp_dbf_hba_record
*r
= (struct zfcp_dbf_hba_record
*)in_buf
;
414 if (strncmp(r
->tag
, "dump", ZFCP_DBF_TAG_SIZE
) == 0)
417 zfcp_dbf_tag(&p
, "tag", r
->tag
);
418 if (isalpha(r
->tag2
[0]))
419 zfcp_dbf_tag(&p
, "tag2", r
->tag2
);
421 if (strncmp(r
->tag
, "resp", ZFCP_DBF_TAG_SIZE
) == 0)
422 zfcp_dbf_hba_view_response(&p
, &r
->u
.response
);
423 else if (strncmp(r
->tag
, "stat", ZFCP_DBF_TAG_SIZE
) == 0)
424 zfcp_dbf_hba_view_status(&p
, &r
->u
.status
);
425 else if (strncmp(r
->tag
, "qdio", ZFCP_DBF_TAG_SIZE
) == 0)
426 zfcp_dbf_hba_view_qdio(&p
, &r
->u
.qdio
);
427 else if (strncmp(r
->tag
, "berr", ZFCP_DBF_TAG_SIZE
) == 0)
428 zfcp_dbf_hba_view_berr(&p
, &r
->u
.berr
);
430 if (strncmp(r
->tag
, "resp", ZFCP_DBF_TAG_SIZE
) != 0)
431 p
+= sprintf(p
, "\n");
435 static struct debug_view zfcp_dbf_hba_view
= {
436 .name
= "structured",
437 .header_proc
= zfcp_dbf_view_header
,
438 .format_proc
= zfcp_dbf_hba_view_format
,
441 static const char *zfcp_dbf_rec_tags
[] = {
442 [ZFCP_REC_DBF_ID_THREAD
] = "thread",
443 [ZFCP_REC_DBF_ID_TARGET
] = "target",
444 [ZFCP_REC_DBF_ID_TRIGGER
] = "trigger",
445 [ZFCP_REC_DBF_ID_ACTION
] = "action",
448 static int zfcp_dbf_rec_view_format(debug_info_t
*id
, struct debug_view
*view
,
449 char *buf
, const char *_rec
)
451 struct zfcp_dbf_rec_record
*r
= (struct zfcp_dbf_rec_record
*)_rec
;
453 char hint
[ZFCP_DBF_ID_SIZE
+ 1];
455 memcpy(hint
, r
->id2
, ZFCP_DBF_ID_SIZE
);
456 hint
[ZFCP_DBF_ID_SIZE
] = 0;
457 zfcp_dbf_outs(&p
, "tag", zfcp_dbf_rec_tags
[r
->id
]);
458 zfcp_dbf_outs(&p
, "hint", hint
);
460 case ZFCP_REC_DBF_ID_THREAD
:
461 zfcp_dbf_out(&p
, "total", "%d", r
->u
.thread
.total
);
462 zfcp_dbf_out(&p
, "ready", "%d", r
->u
.thread
.ready
);
463 zfcp_dbf_out(&p
, "running", "%d", r
->u
.thread
.running
);
465 case ZFCP_REC_DBF_ID_TARGET
:
466 zfcp_dbf_out(&p
, "reference", "0x%016Lx", r
->u
.target
.ref
);
467 zfcp_dbf_out(&p
, "status", "0x%08x", r
->u
.target
.status
);
468 zfcp_dbf_out(&p
, "erp_count", "%d", r
->u
.target
.erp_count
);
469 zfcp_dbf_out(&p
, "d_id", "0x%06x", r
->u
.target
.d_id
);
470 zfcp_dbf_out(&p
, "wwpn", "0x%016Lx", r
->u
.target
.wwpn
);
471 zfcp_dbf_out(&p
, "fcp_lun", "0x%016Lx", r
->u
.target
.fcp_lun
);
473 case ZFCP_REC_DBF_ID_TRIGGER
:
474 zfcp_dbf_out(&p
, "reference", "0x%016Lx", r
->u
.trigger
.ref
);
475 zfcp_dbf_out(&p
, "erp_action", "0x%016Lx", r
->u
.trigger
.action
);
476 zfcp_dbf_out(&p
, "requested", "%d", r
->u
.trigger
.want
);
477 zfcp_dbf_out(&p
, "executed", "%d", r
->u
.trigger
.need
);
478 zfcp_dbf_out(&p
, "wwpn", "0x%016Lx", r
->u
.trigger
.wwpn
);
479 zfcp_dbf_out(&p
, "fcp_lun", "0x%016Lx", r
->u
.trigger
.fcp_lun
);
480 zfcp_dbf_out(&p
, "adapter_status", "0x%08x", r
->u
.trigger
.as
);
481 zfcp_dbf_out(&p
, "port_status", "0x%08x", r
->u
.trigger
.ps
);
482 zfcp_dbf_out(&p
, "unit_status", "0x%08x", r
->u
.trigger
.us
);
484 case ZFCP_REC_DBF_ID_ACTION
:
485 zfcp_dbf_out(&p
, "erp_action", "0x%016Lx", r
->u
.action
.action
);
486 zfcp_dbf_out(&p
, "fsf_req", "0x%016Lx", r
->u
.action
.fsf_req
);
487 zfcp_dbf_out(&p
, "status", "0x%08Lx", r
->u
.action
.status
);
488 zfcp_dbf_out(&p
, "step", "0x%08Lx", r
->u
.action
.step
);
491 p
+= sprintf(p
, "\n");
495 static struct debug_view zfcp_dbf_rec_view
= {
496 .name
= "structured",
497 .header_proc
= zfcp_dbf_view_header
,
498 .format_proc
= zfcp_dbf_rec_view_format
,
502 * zfcp_dbf_rec_thread - trace event related to recovery thread operation
503 * @id2: identifier for event
504 * @dbf: reference to dbf structure
505 * This function assumes that the caller is holding erp_lock.
507 void zfcp_dbf_rec_thread(char *id2
, struct zfcp_dbf
*dbf
)
509 struct zfcp_adapter
*adapter
= dbf
->adapter
;
510 struct zfcp_dbf_rec_record
*r
= &dbf
->rec_buf
;
511 unsigned long flags
= 0;
512 struct list_head
*entry
;
513 unsigned ready
= 0, running
= 0, total
;
515 list_for_each(entry
, &adapter
->erp_ready_head
)
517 list_for_each(entry
, &adapter
->erp_running_head
)
519 total
= adapter
->erp_total_count
;
521 spin_lock_irqsave(&dbf
->rec_lock
, flags
);
522 memset(r
, 0, sizeof(*r
));
523 r
->id
= ZFCP_REC_DBF_ID_THREAD
;
524 memcpy(r
->id2
, id2
, ZFCP_DBF_ID_SIZE
);
525 r
->u
.thread
.total
= total
;
526 r
->u
.thread
.ready
= ready
;
527 r
->u
.thread
.running
= running
;
528 debug_event(dbf
->rec
, 6, r
, sizeof(*r
));
529 spin_unlock_irqrestore(&dbf
->rec_lock
, flags
);
533 * zfcp_dbf_rec_thread - trace event related to recovery thread operation
534 * @id2: identifier for event
536 * This function assumes that the caller does not hold erp_lock.
538 void zfcp_dbf_rec_thread_lock(char *id2
, struct zfcp_dbf
*dbf
)
540 struct zfcp_adapter
*adapter
= dbf
->adapter
;
543 read_lock_irqsave(&adapter
->erp_lock
, flags
);
544 zfcp_dbf_rec_thread(id2
, dbf
);
545 read_unlock_irqrestore(&adapter
->erp_lock
, flags
);
548 static void zfcp_dbf_rec_target(char *id2
, void *ref
, struct zfcp_dbf
*dbf
,
549 atomic_t
*status
, atomic_t
*erp_count
, u64 wwpn
,
550 u32 d_id
, u64 fcp_lun
)
552 struct zfcp_dbf_rec_record
*r
= &dbf
->rec_buf
;
555 spin_lock_irqsave(&dbf
->rec_lock
, flags
);
556 memset(r
, 0, sizeof(*r
));
557 r
->id
= ZFCP_REC_DBF_ID_TARGET
;
558 memcpy(r
->id2
, id2
, ZFCP_DBF_ID_SIZE
);
559 r
->u
.target
.ref
= (unsigned long)ref
;
560 r
->u
.target
.status
= atomic_read(status
);
561 r
->u
.target
.wwpn
= wwpn
;
562 r
->u
.target
.d_id
= d_id
;
563 r
->u
.target
.fcp_lun
= fcp_lun
;
564 r
->u
.target
.erp_count
= atomic_read(erp_count
);
565 debug_event(dbf
->rec
, 3, r
, sizeof(*r
));
566 spin_unlock_irqrestore(&dbf
->rec_lock
, flags
);
570 * zfcp_dbf_rec_adapter - trace event for adapter state change
571 * @id: identifier for trigger of state change
572 * @ref: additional reference (e.g. request)
573 * @dbf: reference to dbf structure
575 void zfcp_dbf_rec_adapter(char *id
, void *ref
, struct zfcp_dbf
*dbf
)
577 struct zfcp_adapter
*adapter
= dbf
->adapter
;
579 zfcp_dbf_rec_target(id
, ref
, dbf
, &adapter
->status
,
580 &adapter
->erp_counter
, 0, 0, 0);
584 * zfcp_dbf_rec_port - trace event for port state change
585 * @id: identifier for trigger of state change
586 * @ref: additional reference (e.g. request)
589 void zfcp_dbf_rec_port(char *id
, void *ref
, struct zfcp_port
*port
)
591 struct zfcp_dbf
*dbf
= port
->adapter
->dbf
;
593 zfcp_dbf_rec_target(id
, ref
, dbf
, &port
->status
,
594 &port
->erp_counter
, port
->wwpn
, port
->d_id
,
599 * zfcp_dbf_rec_unit - trace event for unit state change
600 * @id: identifier for trigger of state change
601 * @ref: additional reference (e.g. request)
604 void zfcp_dbf_rec_unit(char *id
, void *ref
, struct zfcp_unit
*unit
)
606 struct zfcp_port
*port
= unit
->port
;
607 struct zfcp_dbf
*dbf
= port
->adapter
->dbf
;
609 zfcp_dbf_rec_target(id
, ref
, dbf
, &unit
->status
,
610 &unit
->erp_counter
, port
->wwpn
, port
->d_id
,
615 * zfcp_dbf_rec_trigger - trace event for triggered error recovery
616 * @id2: identifier for error recovery trigger
617 * @ref: additional reference (e.g. request)
618 * @want: originally requested error recovery action
619 * @need: error recovery action actually initiated
620 * @action: address of error recovery action struct
625 void zfcp_dbf_rec_trigger(char *id2
, void *ref
, u8 want
, u8 need
, void *action
,
626 struct zfcp_adapter
*adapter
, struct zfcp_port
*port
,
627 struct zfcp_unit
*unit
)
629 struct zfcp_dbf
*dbf
= adapter
->dbf
;
630 struct zfcp_dbf_rec_record
*r
= &dbf
->rec_buf
;
633 spin_lock_irqsave(&dbf
->rec_lock
, flags
);
634 memset(r
, 0, sizeof(*r
));
635 r
->id
= ZFCP_REC_DBF_ID_TRIGGER
;
636 memcpy(r
->id2
, id2
, ZFCP_DBF_ID_SIZE
);
637 r
->u
.trigger
.ref
= (unsigned long)ref
;
638 r
->u
.trigger
.want
= want
;
639 r
->u
.trigger
.need
= need
;
640 r
->u
.trigger
.action
= (unsigned long)action
;
641 r
->u
.trigger
.as
= atomic_read(&adapter
->status
);
643 r
->u
.trigger
.ps
= atomic_read(&port
->status
);
644 r
->u
.trigger
.wwpn
= port
->wwpn
;
647 r
->u
.trigger
.us
= atomic_read(&unit
->status
);
648 r
->u
.trigger
.fcp_lun
= unit
->fcp_lun
;
650 debug_event(dbf
->rec
, action
? 1 : 4, r
, sizeof(*r
));
651 spin_unlock_irqrestore(&dbf
->rec_lock
, flags
);
655 * zfcp_dbf_rec_action - trace event showing progress of recovery action
657 * @erp_action: error recovery action struct pointer
659 void zfcp_dbf_rec_action(char *id2
, struct zfcp_erp_action
*erp_action
)
661 struct zfcp_dbf
*dbf
= erp_action
->adapter
->dbf
;
662 struct zfcp_dbf_rec_record
*r
= &dbf
->rec_buf
;
665 spin_lock_irqsave(&dbf
->rec_lock
, flags
);
666 memset(r
, 0, sizeof(*r
));
667 r
->id
= ZFCP_REC_DBF_ID_ACTION
;
668 memcpy(r
->id2
, id2
, ZFCP_DBF_ID_SIZE
);
669 r
->u
.action
.action
= (unsigned long)erp_action
;
670 r
->u
.action
.status
= erp_action
->status
;
671 r
->u
.action
.step
= erp_action
->step
;
672 r
->u
.action
.fsf_req
= (unsigned long)erp_action
->fsf_req
;
673 debug_event(dbf
->rec
, 5, r
, sizeof(*r
));
674 spin_unlock_irqrestore(&dbf
->rec_lock
, flags
);
678 * zfcp_dbf_san_ct_request - trace event for issued CT request
679 * @fsf_req: request containing issued CT data
681 void zfcp_dbf_san_ct_request(struct zfcp_fsf_req
*fsf_req
)
683 struct zfcp_send_ct
*ct
= (struct zfcp_send_ct
*)fsf_req
->data
;
684 struct zfcp_wka_port
*wka_port
= ct
->wka_port
;
685 struct zfcp_adapter
*adapter
= wka_port
->adapter
;
686 struct zfcp_dbf
*dbf
= adapter
->dbf
;
687 struct ct_hdr
*hdr
= sg_virt(ct
->req
);
688 struct zfcp_dbf_san_record
*r
= &dbf
->san_buf
;
689 struct zfcp_dbf_san_record_ct_request
*oct
= &r
->u
.ct_req
;
693 spin_lock_irqsave(&dbf
->san_lock
, flags
);
694 memset(r
, 0, sizeof(*r
));
695 strncpy(r
->tag
, "octc", ZFCP_DBF_TAG_SIZE
);
696 r
->fsf_reqid
= fsf_req
->req_id
;
697 r
->fsf_seqno
= fsf_req
->seq_no
;
698 r
->s_id
= fc_host_port_id(adapter
->scsi_host
);
699 r
->d_id
= wka_port
->d_id
;
700 oct
->cmd_req_code
= hdr
->cmd_rsp_code
;
701 oct
->revision
= hdr
->revision
;
702 oct
->gs_type
= hdr
->gs_type
;
703 oct
->gs_subtype
= hdr
->gs_subtype
;
704 oct
->options
= hdr
->options
;
705 oct
->max_res_size
= hdr
->max_res_size
;
706 oct
->len
= min((int)ct
->req
->length
- (int)sizeof(struct ct_hdr
),
707 ZFCP_DBF_SAN_MAX_PAYLOAD
);
708 debug_event(dbf
->san
, level
, r
, sizeof(*r
));
709 zfcp_dbf_hexdump(dbf
->san
, r
, sizeof(*r
), level
,
710 (void *)hdr
+ sizeof(struct ct_hdr
), oct
->len
);
711 spin_unlock_irqrestore(&dbf
->san_lock
, flags
);
715 * zfcp_dbf_san_ct_response - trace event for completion of CT request
716 * @fsf_req: request containing CT response
718 void zfcp_dbf_san_ct_response(struct zfcp_fsf_req
*fsf_req
)
720 struct zfcp_send_ct
*ct
= (struct zfcp_send_ct
*)fsf_req
->data
;
721 struct zfcp_wka_port
*wka_port
= ct
->wka_port
;
722 struct zfcp_adapter
*adapter
= wka_port
->adapter
;
723 struct ct_hdr
*hdr
= sg_virt(ct
->resp
);
724 struct zfcp_dbf
*dbf
= adapter
->dbf
;
725 struct zfcp_dbf_san_record
*r
= &dbf
->san_buf
;
726 struct zfcp_dbf_san_record_ct_response
*rct
= &r
->u
.ct_resp
;
730 spin_lock_irqsave(&dbf
->san_lock
, flags
);
731 memset(r
, 0, sizeof(*r
));
732 strncpy(r
->tag
, "rctc", ZFCP_DBF_TAG_SIZE
);
733 r
->fsf_reqid
= fsf_req
->req_id
;
734 r
->fsf_seqno
= fsf_req
->seq_no
;
735 r
->s_id
= wka_port
->d_id
;
736 r
->d_id
= fc_host_port_id(adapter
->scsi_host
);
737 rct
->cmd_rsp_code
= hdr
->cmd_rsp_code
;
738 rct
->revision
= hdr
->revision
;
739 rct
->reason_code
= hdr
->reason_code
;
740 rct
->expl
= hdr
->reason_code_expl
;
741 rct
->vendor_unique
= hdr
->vendor_unique
;
742 rct
->max_res_size
= hdr
->max_res_size
;
743 rct
->len
= min((int)ct
->resp
->length
- (int)sizeof(struct ct_hdr
),
744 ZFCP_DBF_SAN_MAX_PAYLOAD
);
745 debug_event(dbf
->san
, level
, r
, sizeof(*r
));
746 zfcp_dbf_hexdump(dbf
->san
, r
, sizeof(*r
), level
,
747 (void *)hdr
+ sizeof(struct ct_hdr
), rct
->len
);
748 spin_unlock_irqrestore(&dbf
->san_lock
, flags
);
751 static void zfcp_dbf_san_els(const char *tag
, int level
,
752 struct zfcp_fsf_req
*fsf_req
, u32 s_id
, u32 d_id
,
753 u8 ls_code
, void *buffer
, int buflen
)
755 struct zfcp_adapter
*adapter
= fsf_req
->adapter
;
756 struct zfcp_dbf
*dbf
= adapter
->dbf
;
757 struct zfcp_dbf_san_record
*rec
= &dbf
->san_buf
;
760 spin_lock_irqsave(&dbf
->san_lock
, flags
);
761 memset(rec
, 0, sizeof(*rec
));
762 strncpy(rec
->tag
, tag
, ZFCP_DBF_TAG_SIZE
);
763 rec
->fsf_reqid
= fsf_req
->req_id
;
764 rec
->fsf_seqno
= fsf_req
->seq_no
;
767 rec
->u
.els
.ls_code
= ls_code
;
768 debug_event(dbf
->san
, level
, rec
, sizeof(*rec
));
769 zfcp_dbf_hexdump(dbf
->san
, rec
, sizeof(*rec
), level
,
770 buffer
, min(buflen
, ZFCP_DBF_SAN_MAX_PAYLOAD
));
771 spin_unlock_irqrestore(&dbf
->san_lock
, flags
);
775 * zfcp_dbf_san_els_request - trace event for issued ELS
776 * @fsf_req: request containing issued ELS
778 void zfcp_dbf_san_els_request(struct zfcp_fsf_req
*fsf_req
)
780 struct zfcp_send_els
*els
= (struct zfcp_send_els
*)fsf_req
->data
;
782 zfcp_dbf_san_els("oels", 2, fsf_req
,
783 fc_host_port_id(els
->adapter
->scsi_host
),
784 els
->d_id
, *(u8
*) sg_virt(els
->req
),
785 sg_virt(els
->req
), els
->req
->length
);
789 * zfcp_dbf_san_els_response - trace event for completed ELS
790 * @fsf_req: request containing ELS response
792 void zfcp_dbf_san_els_response(struct zfcp_fsf_req
*fsf_req
)
794 struct zfcp_send_els
*els
= (struct zfcp_send_els
*)fsf_req
->data
;
796 zfcp_dbf_san_els("rels", 2, fsf_req
, els
->d_id
,
797 fc_host_port_id(els
->adapter
->scsi_host
),
798 *(u8
*)sg_virt(els
->req
), sg_virt(els
->resp
),
803 * zfcp_dbf_san_incoming_els - trace event for incomig ELS
804 * @fsf_req: request containing unsolicited status buffer with incoming ELS
806 void zfcp_dbf_san_incoming_els(struct zfcp_fsf_req
*fsf_req
)
808 struct zfcp_adapter
*adapter
= fsf_req
->adapter
;
809 struct fsf_status_read_buffer
*buf
=
810 (struct fsf_status_read_buffer
*)fsf_req
->data
;
811 int length
= (int)buf
->length
-
812 (int)((void *)&buf
->payload
- (void *)buf
);
814 zfcp_dbf_san_els("iels", 1, fsf_req
, buf
->d_id
,
815 fc_host_port_id(adapter
->scsi_host
),
816 buf
->payload
.data
[0], (void *)buf
->payload
.data
,
820 static int zfcp_dbf_san_view_format(debug_info_t
*id
, struct debug_view
*view
,
821 char *out_buf
, const char *in_buf
)
823 struct zfcp_dbf_san_record
*r
= (struct zfcp_dbf_san_record
*)in_buf
;
826 if (strncmp(r
->tag
, "dump", ZFCP_DBF_TAG_SIZE
) == 0)
829 zfcp_dbf_tag(&p
, "tag", r
->tag
);
830 zfcp_dbf_out(&p
, "fsf_reqid", "0x%0Lx", r
->fsf_reqid
);
831 zfcp_dbf_out(&p
, "fsf_seqno", "0x%08x", r
->fsf_seqno
);
832 zfcp_dbf_out(&p
, "s_id", "0x%06x", r
->s_id
);
833 zfcp_dbf_out(&p
, "d_id", "0x%06x", r
->d_id
);
835 if (strncmp(r
->tag
, "octc", ZFCP_DBF_TAG_SIZE
) == 0) {
836 struct zfcp_dbf_san_record_ct_request
*ct
= &r
->u
.ct_req
;
837 zfcp_dbf_out(&p
, "cmd_req_code", "0x%04x", ct
->cmd_req_code
);
838 zfcp_dbf_out(&p
, "revision", "0x%02x", ct
->revision
);
839 zfcp_dbf_out(&p
, "gs_type", "0x%02x", ct
->gs_type
);
840 zfcp_dbf_out(&p
, "gs_subtype", "0x%02x", ct
->gs_subtype
);
841 zfcp_dbf_out(&p
, "options", "0x%02x", ct
->options
);
842 zfcp_dbf_out(&p
, "max_res_size", "0x%04x", ct
->max_res_size
);
843 } else if (strncmp(r
->tag
, "rctc", ZFCP_DBF_TAG_SIZE
) == 0) {
844 struct zfcp_dbf_san_record_ct_response
*ct
= &r
->u
.ct_resp
;
845 zfcp_dbf_out(&p
, "cmd_rsp_code", "0x%04x", ct
->cmd_rsp_code
);
846 zfcp_dbf_out(&p
, "revision", "0x%02x", ct
->revision
);
847 zfcp_dbf_out(&p
, "reason_code", "0x%02x", ct
->reason_code
);
848 zfcp_dbf_out(&p
, "reason_code_expl", "0x%02x", ct
->expl
);
849 zfcp_dbf_out(&p
, "vendor_unique", "0x%02x", ct
->vendor_unique
);
850 zfcp_dbf_out(&p
, "max_res_size", "0x%04x", ct
->max_res_size
);
851 } else if (strncmp(r
->tag
, "oels", ZFCP_DBF_TAG_SIZE
) == 0 ||
852 strncmp(r
->tag
, "rels", ZFCP_DBF_TAG_SIZE
) == 0 ||
853 strncmp(r
->tag
, "iels", ZFCP_DBF_TAG_SIZE
) == 0) {
854 struct zfcp_dbf_san_record_els
*els
= &r
->u
.els
;
855 zfcp_dbf_out(&p
, "ls_code", "0x%02x", els
->ls_code
);
860 static struct debug_view zfcp_dbf_san_view
= {
861 .name
= "structured",
862 .header_proc
= zfcp_dbf_view_header
,
863 .format_proc
= zfcp_dbf_san_view_format
,
866 void _zfcp_dbf_scsi(const char *tag
, const char *tag2
, int level
,
867 struct zfcp_dbf
*dbf
, struct scsi_cmnd
*scsi_cmnd
,
868 struct zfcp_fsf_req
*fsf_req
, unsigned long old_req_id
)
870 struct zfcp_dbf_scsi_record
*rec
= &dbf
->scsi_buf
;
871 struct zfcp_dbf_dump
*dump
= (struct zfcp_dbf_dump
*)rec
;
873 struct fcp_rsp_iu
*fcp_rsp
;
874 char *fcp_rsp_info
= NULL
, *fcp_sns_info
= NULL
;
875 int offset
= 0, buflen
= 0;
877 spin_lock_irqsave(&dbf
->scsi_lock
, flags
);
879 memset(rec
, 0, sizeof(*rec
));
881 strncpy(rec
->tag
, tag
, ZFCP_DBF_TAG_SIZE
);
882 strncpy(rec
->tag2
, tag2
, ZFCP_DBF_TAG_SIZE
);
883 if (scsi_cmnd
!= NULL
) {
884 if (scsi_cmnd
->device
) {
885 rec
->scsi_id
= scsi_cmnd
->device
->id
;
886 rec
->scsi_lun
= scsi_cmnd
->device
->lun
;
888 rec
->scsi_result
= scsi_cmnd
->result
;
889 rec
->scsi_cmnd
= (unsigned long)scsi_cmnd
;
890 rec
->scsi_serial
= scsi_cmnd
->serial_number
;
891 memcpy(rec
->scsi_opcode
, scsi_cmnd
->cmnd
,
892 min((int)scsi_cmnd
->cmd_len
,
893 ZFCP_DBF_SCSI_OPCODE
));
894 rec
->scsi_retries
= scsi_cmnd
->retries
;
895 rec
->scsi_allowed
= scsi_cmnd
->allowed
;
897 if (fsf_req
!= NULL
) {
898 fcp_rsp
= (struct fcp_rsp_iu
*)
899 &(fsf_req
->qtcb
->bottom
.io
.fcp_rsp
);
900 fcp_rsp_info
= (unsigned char *) &fcp_rsp
[1];
902 zfcp_get_fcp_sns_info_ptr(fcp_rsp
);
904 rec
->rsp_validity
= fcp_rsp
->validity
.value
;
905 rec
->rsp_scsi_status
= fcp_rsp
->scsi_status
;
906 rec
->rsp_resid
= fcp_rsp
->fcp_resid
;
907 if (fcp_rsp
->validity
.bits
.fcp_rsp_len_valid
)
908 rec
->rsp_code
= *(fcp_rsp_info
+ 3);
909 if (fcp_rsp
->validity
.bits
.fcp_sns_len_valid
) {
910 buflen
= min((int)fcp_rsp
->fcp_sns_len
,
911 ZFCP_DBF_SCSI_MAX_FCP_SNS_INFO
);
912 rec
->sns_info_len
= buflen
;
913 memcpy(rec
->sns_info
, fcp_sns_info
,
915 ZFCP_DBF_SCSI_FCP_SNS_INFO
));
916 offset
+= min(buflen
,
917 ZFCP_DBF_SCSI_FCP_SNS_INFO
);
920 rec
->fsf_reqid
= fsf_req
->req_id
;
921 rec
->fsf_seqno
= fsf_req
->seq_no
;
922 rec
->fsf_issued
= fsf_req
->issued
;
924 rec
->old_fsf_reqid
= old_req_id
;
926 strncpy(dump
->tag
, "dump", ZFCP_DBF_TAG_SIZE
);
927 dump
->total_size
= buflen
;
928 dump
->offset
= offset
;
929 dump
->size
= min(buflen
- offset
,
931 zfcp_dbf_scsi_record
) -
932 (int)sizeof(struct zfcp_dbf_dump
));
933 memcpy(dump
->data
, fcp_sns_info
+ offset
, dump
->size
);
934 offset
+= dump
->size
;
936 debug_event(dbf
->scsi
, level
, rec
, sizeof(*rec
));
937 } while (offset
< buflen
);
938 spin_unlock_irqrestore(&dbf
->scsi_lock
, flags
);
941 static int zfcp_dbf_scsi_view_format(debug_info_t
*id
, struct debug_view
*view
,
942 char *out_buf
, const char *in_buf
)
944 struct zfcp_dbf_scsi_record
*r
= (struct zfcp_dbf_scsi_record
*)in_buf
;
948 if (strncmp(r
->tag
, "dump", ZFCP_DBF_TAG_SIZE
) == 0)
951 zfcp_dbf_tag(&p
, "tag", r
->tag
);
952 zfcp_dbf_tag(&p
, "tag2", r
->tag2
);
953 zfcp_dbf_out(&p
, "scsi_id", "0x%08x", r
->scsi_id
);
954 zfcp_dbf_out(&p
, "scsi_lun", "0x%08x", r
->scsi_lun
);
955 zfcp_dbf_out(&p
, "scsi_result", "0x%08x", r
->scsi_result
);
956 zfcp_dbf_out(&p
, "scsi_cmnd", "0x%0Lx", r
->scsi_cmnd
);
957 zfcp_dbf_out(&p
, "scsi_serial", "0x%016Lx", r
->scsi_serial
);
958 zfcp_dbf_outd(&p
, "scsi_opcode", r
->scsi_opcode
, ZFCP_DBF_SCSI_OPCODE
,
959 0, ZFCP_DBF_SCSI_OPCODE
);
960 zfcp_dbf_out(&p
, "scsi_retries", "0x%02x", r
->scsi_retries
);
961 zfcp_dbf_out(&p
, "scsi_allowed", "0x%02x", r
->scsi_allowed
);
962 if (strncmp(r
->tag
, "abrt", ZFCP_DBF_TAG_SIZE
) == 0)
963 zfcp_dbf_out(&p
, "old_fsf_reqid", "0x%0Lx", r
->old_fsf_reqid
);
964 zfcp_dbf_out(&p
, "fsf_reqid", "0x%0Lx", r
->fsf_reqid
);
965 zfcp_dbf_out(&p
, "fsf_seqno", "0x%08x", r
->fsf_seqno
);
966 stck_to_timespec(r
->fsf_issued
, &t
);
967 zfcp_dbf_out(&p
, "fsf_issued", "%011lu:%06lu", t
.tv_sec
, t
.tv_nsec
);
969 if (strncmp(r
->tag
, "rslt", ZFCP_DBF_TAG_SIZE
) == 0) {
970 zfcp_dbf_out(&p
, "fcp_rsp_validity", "0x%02x", r
->rsp_validity
);
971 zfcp_dbf_out(&p
, "fcp_rsp_scsi_status", "0x%02x",
973 zfcp_dbf_out(&p
, "fcp_rsp_resid", "0x%08x", r
->rsp_resid
);
974 zfcp_dbf_out(&p
, "fcp_rsp_code", "0x%08x", r
->rsp_code
);
975 zfcp_dbf_out(&p
, "fcp_sns_info_len", "0x%08x", r
->sns_info_len
);
976 zfcp_dbf_outd(&p
, "fcp_sns_info", r
->sns_info
,
977 min((int)r
->sns_info_len
,
978 ZFCP_DBF_SCSI_FCP_SNS_INFO
), 0,
981 p
+= sprintf(p
, "\n");
985 static struct debug_view zfcp_dbf_scsi_view
= {
986 .name
= "structured",
987 .header_proc
= zfcp_dbf_view_header
,
988 .format_proc
= zfcp_dbf_scsi_view_format
,
991 static debug_info_t
*zfcp_dbf_reg(const char *name
, int level
,
992 struct debug_view
*view
, int size
)
994 struct debug_info
*d
;
996 d
= debug_register(name
, dbfsize
, level
, size
);
1000 debug_register_view(d
, &debug_hex_ascii_view
);
1001 debug_register_view(d
, view
);
1002 debug_set_level(d
, level
);
1008 * zfcp_adapter_debug_register - registers debug feature for an adapter
1009 * @adapter: pointer to adapter for which debug features should be registered
1010 * return: -ENOMEM on error, 0 otherwise
1012 int zfcp_dbf_adapter_register(struct zfcp_adapter
*adapter
)
1014 char dbf_name
[DEBUG_MAX_NAME_LEN
];
1015 struct zfcp_dbf
*dbf
;
1017 dbf
= kmalloc(sizeof(struct zfcp_dbf
), GFP_KERNEL
);
1021 dbf
->adapter
= adapter
;
1023 spin_lock_init(&dbf
->hba_lock
);
1024 spin_lock_init(&dbf
->san_lock
);
1025 spin_lock_init(&dbf
->scsi_lock
);
1026 spin_lock_init(&dbf
->rec_lock
);
1028 /* debug feature area which records recovery activity */
1029 sprintf(dbf_name
, "zfcp_%s_rec", dev_name(&adapter
->ccw_device
->dev
));
1030 dbf
->rec
= zfcp_dbf_reg(dbf_name
, 3, &zfcp_dbf_rec_view
,
1031 sizeof(struct zfcp_dbf_rec_record
));
1035 /* debug feature area which records HBA (FSF and QDIO) conditions */
1036 sprintf(dbf_name
, "zfcp_%s_hba", dev_name(&adapter
->ccw_device
->dev
));
1037 dbf
->hba
= zfcp_dbf_reg(dbf_name
, 3, &zfcp_dbf_hba_view
,
1038 sizeof(struct zfcp_dbf_hba_record
));
1042 /* debug feature area which records SAN command failures and recovery */
1043 sprintf(dbf_name
, "zfcp_%s_san", dev_name(&adapter
->ccw_device
->dev
));
1044 dbf
->san
= zfcp_dbf_reg(dbf_name
, 6, &zfcp_dbf_san_view
,
1045 sizeof(struct zfcp_dbf_san_record
));
1049 /* debug feature area which records SCSI command failures and recovery */
1050 sprintf(dbf_name
, "zfcp_%s_scsi", dev_name(&adapter
->ccw_device
->dev
));
1051 dbf
->scsi
= zfcp_dbf_reg(dbf_name
, 3, &zfcp_dbf_scsi_view
,
1052 sizeof(struct zfcp_dbf_scsi_record
));
1060 zfcp_dbf_adapter_unregister(dbf
);
1065 * zfcp_adapter_debug_unregister - unregisters debug feature for an adapter
1066 * @dbf: pointer to dbf for which debug features should be unregistered
1068 void zfcp_dbf_adapter_unregister(struct zfcp_dbf
*dbf
)
1070 debug_unregister(dbf
->scsi
);
1071 debug_unregister(dbf
->san
);
1072 debug_unregister(dbf
->hba
);
1073 debug_unregister(dbf
->rec
);
1074 dbf
->adapter
->dbf
= NULL
;