1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * zfcp device driver
4 *
5 * Debug traces for zfcp.
6 *
7 * Copyright IBM Corp. 2002, 2023
8 */
9
10 #define pr_fmt(fmt) "zfcp: " fmt
11
12 #include <linux/module.h>
13 #include <linux/ctype.h>
14 #include <linux/slab.h>
15 #include <asm/debug.h>
16 #include "zfcp_dbf.h"
17 #include "zfcp_ext.h"
18 #include "zfcp_fc.h"
19
20 static u32 dbfsize = 4;
21
22 module_param(dbfsize, uint, 0400);
23 MODULE_PARM_DESC(dbfsize,
24 "number of pages for each debug feature area (default 4)");
25
26 static u32 dbflevel = 3;
27
28 module_param(dbflevel, uint, 0400);
29 MODULE_PARM_DESC(dbflevel,
30 "log level for each debug feature area "
31 "(default 3, range 0..6)");
32
zfcp_dbf_plen(unsigned int offset)33 static inline unsigned int zfcp_dbf_plen(unsigned int offset)
34 {
35 return sizeof(struct zfcp_dbf_pay) + offset - ZFCP_DBF_PAY_MAX_REC;
36 }
37
38 static inline
zfcp_dbf_pl_write(struct zfcp_dbf * dbf,void * data,u16 length,char * area,u64 req_id)39 void zfcp_dbf_pl_write(struct zfcp_dbf *dbf, void *data, u16 length, char *area,
40 u64 req_id)
41 {
42 struct zfcp_dbf_pay *pl = &dbf->pay_buf;
43 u16 offset = 0, rec_length;
44
45 spin_lock(&dbf->pay_lock);
46 memset(pl, 0, sizeof(*pl));
47 pl->fsf_req_id = req_id;
48 memcpy(pl->area, area, ZFCP_DBF_TAG_LEN);
49
50 while (offset < length) {
51 rec_length = min((u16) ZFCP_DBF_PAY_MAX_REC,
52 (u16) (length - offset));
53 memcpy(pl->data, data + offset, rec_length);
54 debug_event(dbf->pay, 1, pl, zfcp_dbf_plen(rec_length));
55
56 offset += rec_length;
57 pl->counter++;
58 }
59
60 spin_unlock(&dbf->pay_lock);
61 }
62
63 /**
64 * zfcp_dbf_hba_fsf_res - trace event for fsf responses
65 * @tag: tag indicating which kind of FSF response has been received
66 * @level: trace level to be used for event
67 * @req: request for which a response was received
68 */
zfcp_dbf_hba_fsf_res(char * tag,int level,struct zfcp_fsf_req * req)69 void zfcp_dbf_hba_fsf_res(char *tag, int level, struct zfcp_fsf_req *req)
70 {
71 struct zfcp_dbf *dbf = req->adapter->dbf;
72 struct fsf_qtcb_prefix *q_pref = &req->qtcb->prefix;
73 struct fsf_qtcb_header *q_head = &req->qtcb->header;
74 struct zfcp_dbf_hba *rec = &dbf->hba_buf;
75 unsigned long flags;
76
77 spin_lock_irqsave(&dbf->hba_lock, flags);
78 memset(rec, 0, sizeof(*rec));
79
80 memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN);
81 rec->id = ZFCP_DBF_HBA_RES;
82 rec->fsf_req_id = req->req_id;
83 rec->fsf_req_status = req->status;
84 rec->fsf_cmd = q_head->fsf_command;
85 rec->fsf_seq_no = q_pref->req_seq_no;
86 rec->u.res.req_issued = req->issued;
87 rec->u.res.prot_status = q_pref->prot_status;
88 rec->u.res.fsf_status = q_head->fsf_status;
89 rec->u.res.port_handle = q_head->port_handle;
90 rec->u.res.lun_handle = q_head->lun_handle;
91
92 memcpy(rec->u.res.prot_status_qual, &q_pref->prot_status_qual,
93 FSF_PROT_STATUS_QUAL_SIZE);
94 memcpy(rec->u.res.fsf_status_qual, &q_head->fsf_status_qual,
95 FSF_STATUS_QUALIFIER_SIZE);
96
97 rec->pl_len = q_head->log_length;
98 zfcp_dbf_pl_write(dbf, (char *)q_pref + q_head->log_start,
99 rec->pl_len, "fsf_res", req->req_id);
100
101 debug_event(dbf->hba, level, rec, sizeof(*rec));
102 spin_unlock_irqrestore(&dbf->hba_lock, flags);
103 }
104
105 /**
106 * zfcp_dbf_hba_fsf_fces - trace event for fsf responses related to
107 * FC Endpoint Security (FCES)
108 * @tag: tag indicating which kind of FC Endpoint Security event has occurred
109 * @req: request for which a response was received
110 * @wwpn: remote port or ZFCP_DBF_INVALID_WWPN
111 * @fc_security_old: old FC Endpoint Security of FCP device or connection
112 * @fc_security_new: new FC Endpoint Security of FCP device or connection
113 */
zfcp_dbf_hba_fsf_fces(char * tag,const struct zfcp_fsf_req * req,u64 wwpn,u32 fc_security_old,u32 fc_security_new)114 void zfcp_dbf_hba_fsf_fces(char *tag, const struct zfcp_fsf_req *req, u64 wwpn,
115 u32 fc_security_old, u32 fc_security_new)
116 {
117 struct zfcp_dbf *dbf = req->adapter->dbf;
118 struct fsf_qtcb_prefix *q_pref = &req->qtcb->prefix;
119 struct fsf_qtcb_header *q_head = &req->qtcb->header;
120 struct zfcp_dbf_hba *rec = &dbf->hba_buf;
121 static int const level = 3;
122 unsigned long flags;
123
124 if (unlikely(!debug_level_enabled(dbf->hba, level)))
125 return;
126
127 spin_lock_irqsave(&dbf->hba_lock, flags);
128 memset(rec, 0, sizeof(*rec));
129
130 memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN);
131 rec->id = ZFCP_DBF_HBA_FCES;
132 rec->fsf_req_id = req->req_id;
133 rec->fsf_req_status = req->status;
134 rec->fsf_cmd = q_head->fsf_command;
135 rec->fsf_seq_no = q_pref->req_seq_no;
136 rec->u.fces.req_issued = req->issued;
137 rec->u.fces.fsf_status = q_head->fsf_status;
138 rec->u.fces.port_handle = q_head->port_handle;
139 rec->u.fces.wwpn = wwpn;
140 rec->u.fces.fc_security_old = fc_security_old;
141 rec->u.fces.fc_security_new = fc_security_new;
142
143 debug_event(dbf->hba, level, rec, sizeof(*rec));
144 spin_unlock_irqrestore(&dbf->hba_lock, flags);
145 }
146
147 /**
148 * zfcp_dbf_hba_fsf_reqid - trace only the tag and a request ID
149 * @tag: tag documenting the source
150 * @level: trace level
151 * @adapter: adapter instance the request ID belongs to
152 * @req_id: the request ID to trace
153 */
zfcp_dbf_hba_fsf_reqid(const char * const tag,const int level,struct zfcp_adapter * const adapter,const u64 req_id)154 void zfcp_dbf_hba_fsf_reqid(const char *const tag, const int level,
155 struct zfcp_adapter *const adapter,
156 const u64 req_id)
157 {
158 struct zfcp_dbf *const dbf = adapter->dbf;
159 struct zfcp_dbf_hba *const rec = &dbf->hba_buf;
160 struct zfcp_dbf_hba_res *const res = &rec->u.res;
161 unsigned long flags;
162
163 if (unlikely(!debug_level_enabled(dbf->hba, level)))
164 return;
165
166 spin_lock_irqsave(&dbf->hba_lock, flags);
167 memset(rec, 0, sizeof(*rec));
168
169 memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN);
170
171 rec->id = ZFCP_DBF_HBA_RES;
172 rec->fsf_req_id = req_id;
173 rec->fsf_req_status = ~0u;
174 rec->fsf_cmd = ~0u;
175 rec->fsf_seq_no = ~0u;
176
177 res->req_issued = ~0ull;
178 res->prot_status = ~0u;
179 memset(res->prot_status_qual, 0xff, sizeof(res->prot_status_qual));
180 res->fsf_status = ~0u;
181 memset(res->fsf_status_qual, 0xff, sizeof(res->fsf_status_qual));
182 res->port_handle = ~0u;
183 res->lun_handle = ~0u;
184
185 debug_event(dbf->hba, level, rec, sizeof(*rec));
186 spin_unlock_irqrestore(&dbf->hba_lock, flags);
187 }
188
189 /**
190 * zfcp_dbf_hba_fsf_uss - trace event for an unsolicited status buffer
191 * @tag: tag indicating which kind of unsolicited status has been received
192 * @req: request providing the unsolicited status
193 */
zfcp_dbf_hba_fsf_uss(char * tag,struct zfcp_fsf_req * req)194 void zfcp_dbf_hba_fsf_uss(char *tag, struct zfcp_fsf_req *req)
195 {
196 struct zfcp_dbf *dbf = req->adapter->dbf;
197 struct fsf_status_read_buffer *srb = req->data;
198 struct zfcp_dbf_hba *rec = &dbf->hba_buf;
199 static int const level = 2;
200 unsigned long flags;
201
202 if (unlikely(!debug_level_enabled(dbf->hba, level)))
203 return;
204
205 spin_lock_irqsave(&dbf->hba_lock, flags);
206 memset(rec, 0, sizeof(*rec));
207
208 memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN);
209 rec->id = ZFCP_DBF_HBA_USS;
210 rec->fsf_req_id = req->req_id;
211 rec->fsf_req_status = req->status;
212 rec->fsf_cmd = FSF_QTCB_UNSOLICITED_STATUS;
213
214 if (!srb)
215 goto log;
216
217 rec->u.uss.status_type = srb->status_type;
218 rec->u.uss.status_subtype = srb->status_subtype;
219 rec->u.uss.d_id = ntoh24(srb->d_id);
220 rec->u.uss.lun = srb->fcp_lun;
221 memcpy(&rec->u.uss.queue_designator, &srb->queue_designator,
222 sizeof(rec->u.uss.queue_designator));
223
224 /* status read buffer payload length */
225 rec->pl_len = (!srb->length) ? 0 : srb->length -
226 offsetof(struct fsf_status_read_buffer, payload);
227
228 if (rec->pl_len)
229 zfcp_dbf_pl_write(dbf, srb->payload.data, rec->pl_len,
230 "fsf_uss", req->req_id);
231 log:
232 debug_event(dbf->hba, level, rec, sizeof(*rec));
233 spin_unlock_irqrestore(&dbf->hba_lock, flags);
234 }
235
236 /**
237 * zfcp_dbf_hba_bit_err - trace event for bit error conditions
238 * @tag: tag indicating which kind of bit error unsolicited status was received
239 * @req: request which caused the bit_error condition
240 */
zfcp_dbf_hba_bit_err(char * tag,struct zfcp_fsf_req * req)241 void zfcp_dbf_hba_bit_err(char *tag, struct zfcp_fsf_req *req)
242 {
243 struct zfcp_dbf *dbf = req->adapter->dbf;
244 struct zfcp_dbf_hba *rec = &dbf->hba_buf;
245 struct fsf_status_read_buffer *sr_buf = req->data;
246 static int const level = 1;
247 unsigned long flags;
248
249 if (unlikely(!debug_level_enabled(dbf->hba, level)))
250 return;
251
252 spin_lock_irqsave(&dbf->hba_lock, flags);
253 memset(rec, 0, sizeof(*rec));
254
255 memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN);
256 rec->id = ZFCP_DBF_HBA_BIT;
257 rec->fsf_req_id = req->req_id;
258 rec->fsf_req_status = req->status;
259 rec->fsf_cmd = FSF_QTCB_UNSOLICITED_STATUS;
260 memcpy(&rec->u.be, &sr_buf->payload.bit_error,
261 sizeof(struct fsf_bit_error_payload));
262
263 debug_event(dbf->hba, level, rec, sizeof(*rec));
264 spin_unlock_irqrestore(&dbf->hba_lock, flags);
265 }
266
267 /**
268 * zfcp_dbf_hba_def_err - trace event for deferred error messages
269 * @adapter: pointer to struct zfcp_adapter
270 * @req_id: request id which caused the deferred error message
271 * @scount: number of sbals incl. the signaling sbal
272 * @pl: array of all involved sbals
273 */
zfcp_dbf_hba_def_err(struct zfcp_adapter * adapter,u64 req_id,u16 scount,void ** pl)274 void zfcp_dbf_hba_def_err(struct zfcp_adapter *adapter, u64 req_id, u16 scount,
275 void **pl)
276 {
277 struct zfcp_dbf *dbf = adapter->dbf;
278 struct zfcp_dbf_pay *payload = &dbf->pay_buf;
279 unsigned long flags;
280 static int const level = 1;
281 u16 length;
282
283 if (unlikely(!debug_level_enabled(dbf->pay, level)))
284 return;
285
286 if (!pl)
287 return;
288
289 spin_lock_irqsave(&dbf->pay_lock, flags);
290 memset(payload, 0, sizeof(*payload));
291
292 memcpy(payload->area, "def_err", 7);
293 payload->fsf_req_id = req_id;
294 payload->counter = 0;
295 length = min((u16)sizeof(struct qdio_buffer),
296 (u16)ZFCP_DBF_PAY_MAX_REC);
297
298 while (payload->counter < scount && (char *)pl[payload->counter]) {
299 memcpy(payload->data, (char *)pl[payload->counter], length);
300 debug_event(dbf->pay, level, payload, zfcp_dbf_plen(length));
301 payload->counter++;
302 }
303
304 spin_unlock_irqrestore(&dbf->pay_lock, flags);
305 }
306
zfcp_dbf_set_common(struct zfcp_dbf_rec * rec,struct zfcp_adapter * adapter,struct zfcp_port * port,struct scsi_device * sdev)307 static void zfcp_dbf_set_common(struct zfcp_dbf_rec *rec,
308 struct zfcp_adapter *adapter,
309 struct zfcp_port *port,
310 struct scsi_device *sdev)
311 {
312 rec->adapter_status = atomic_read(&adapter->status);
313 if (port) {
314 rec->port_status = atomic_read(&port->status);
315 rec->wwpn = port->wwpn;
316 rec->d_id = port->d_id;
317 }
318 if (sdev) {
319 rec->lun_status = atomic_read(&sdev_to_zfcp(sdev)->status);
320 rec->lun = zfcp_scsi_dev_lun(sdev);
321 } else
322 rec->lun = ZFCP_DBF_INVALID_LUN;
323 }
324
325 /**
326 * zfcp_dbf_rec_trig - trace event related to triggered recovery
327 * @tag: identifier for event
328 * @adapter: adapter on which the erp_action should run
329 * @port: remote port involved in the erp_action
330 * @sdev: scsi device involved in the erp_action
331 * @want: wanted erp_action
332 * @need: required erp_action
333 *
334 * The adapter->erp_lock has to be held.
335 */
zfcp_dbf_rec_trig(char * tag,struct zfcp_adapter * adapter,struct zfcp_port * port,struct scsi_device * sdev,u8 want,u8 need)336 void zfcp_dbf_rec_trig(char *tag, struct zfcp_adapter *adapter,
337 struct zfcp_port *port, struct scsi_device *sdev,
338 u8 want, u8 need)
339 {
340 struct zfcp_dbf *dbf = adapter->dbf;
341 struct zfcp_dbf_rec *rec = &dbf->rec_buf;
342 static int const level = 1;
343 struct list_head *entry;
344 unsigned long flags;
345
346 lockdep_assert_held(&adapter->erp_lock);
347
348 if (unlikely(!debug_level_enabled(dbf->rec, level)))
349 return;
350
351 spin_lock_irqsave(&dbf->rec_lock, flags);
352 memset(rec, 0, sizeof(*rec));
353
354 rec->id = ZFCP_DBF_REC_TRIG;
355 memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN);
356 zfcp_dbf_set_common(rec, adapter, port, sdev);
357
358 list_for_each(entry, &adapter->erp_ready_head)
359 rec->u.trig.ready++;
360
361 list_for_each(entry, &adapter->erp_running_head)
362 rec->u.trig.running++;
363
364 rec->u.trig.want = want;
365 rec->u.trig.need = need;
366
367 debug_event(dbf->rec, level, rec, sizeof(*rec));
368 spin_unlock_irqrestore(&dbf->rec_lock, flags);
369 }
370
371 /**
372 * zfcp_dbf_rec_trig_lock - trace event related to triggered recovery with lock
373 * @tag: identifier for event
374 * @adapter: adapter on which the erp_action should run
375 * @port: remote port involved in the erp_action
376 * @sdev: scsi device involved in the erp_action
377 * @want: wanted erp_action
378 * @need: required erp_action
379 *
380 * The adapter->erp_lock must not be held.
381 */
zfcp_dbf_rec_trig_lock(char * tag,struct zfcp_adapter * adapter,struct zfcp_port * port,struct scsi_device * sdev,u8 want,u8 need)382 void zfcp_dbf_rec_trig_lock(char *tag, struct zfcp_adapter *adapter,
383 struct zfcp_port *port, struct scsi_device *sdev,
384 u8 want, u8 need)
385 {
386 unsigned long flags;
387
388 read_lock_irqsave(&adapter->erp_lock, flags);
389 zfcp_dbf_rec_trig(tag, adapter, port, sdev, want, need);
390 read_unlock_irqrestore(&adapter->erp_lock, flags);
391 }
392
393 /**
394 * zfcp_dbf_rec_run_lvl - trace event related to running recovery
395 * @level: trace level to be used for event
396 * @tag: identifier for event
397 * @erp: erp_action running
398 */
zfcp_dbf_rec_run_lvl(int level,char * tag,struct zfcp_erp_action * erp)399 void zfcp_dbf_rec_run_lvl(int level, char *tag, struct zfcp_erp_action *erp)
400 {
401 struct zfcp_dbf *dbf = erp->adapter->dbf;
402 struct zfcp_dbf_rec *rec = &dbf->rec_buf;
403 unsigned long flags;
404
405 if (!debug_level_enabled(dbf->rec, level))
406 return;
407
408 spin_lock_irqsave(&dbf->rec_lock, flags);
409 memset(rec, 0, sizeof(*rec));
410
411 rec->id = ZFCP_DBF_REC_RUN;
412 memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN);
413 zfcp_dbf_set_common(rec, erp->adapter, erp->port, erp->sdev);
414
415 rec->u.run.fsf_req_id = erp->fsf_req_id;
416 rec->u.run.rec_status = erp->status;
417 rec->u.run.rec_step = erp->step;
418 rec->u.run.rec_action = erp->type;
419
420 if (erp->sdev)
421 rec->u.run.rec_count =
422 atomic_read(&sdev_to_zfcp(erp->sdev)->erp_counter);
423 else if (erp->port)
424 rec->u.run.rec_count = atomic_read(&erp->port->erp_counter);
425 else
426 rec->u.run.rec_count = atomic_read(&erp->adapter->erp_counter);
427
428 debug_event(dbf->rec, level, rec, sizeof(*rec));
429 spin_unlock_irqrestore(&dbf->rec_lock, flags);
430 }
431
432 /**
433 * zfcp_dbf_rec_run - trace event related to running recovery
434 * @tag: identifier for event
435 * @erp: erp_action running
436 */
zfcp_dbf_rec_run(char * tag,struct zfcp_erp_action * erp)437 void zfcp_dbf_rec_run(char *tag, struct zfcp_erp_action *erp)
438 {
439 zfcp_dbf_rec_run_lvl(1, tag, erp);
440 }
441
442 /**
443 * zfcp_dbf_rec_run_wka - trace wka port event with info like running recovery
444 * @tag: identifier for event
445 * @wka_port: well known address port
446 * @req_id: request ID to correlate with potential HBA trace record
447 */
zfcp_dbf_rec_run_wka(char * tag,struct zfcp_fc_wka_port * wka_port,u64 req_id)448 void zfcp_dbf_rec_run_wka(char *tag, struct zfcp_fc_wka_port *wka_port,
449 u64 req_id)
450 {
451 struct zfcp_dbf *dbf = wka_port->adapter->dbf;
452 struct zfcp_dbf_rec *rec = &dbf->rec_buf;
453 static int const level = 1;
454 unsigned long flags;
455
456 if (unlikely(!debug_level_enabled(dbf->rec, level)))
457 return;
458
459 spin_lock_irqsave(&dbf->rec_lock, flags);
460 memset(rec, 0, sizeof(*rec));
461
462 rec->id = ZFCP_DBF_REC_RUN;
463 memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN);
464 rec->port_status = wka_port->status;
465 rec->d_id = wka_port->d_id;
466 rec->lun = ZFCP_DBF_INVALID_LUN;
467
468 rec->u.run.fsf_req_id = req_id;
469 rec->u.run.rec_status = ~0;
470 rec->u.run.rec_step = ~0;
471 rec->u.run.rec_action = ~0;
472 rec->u.run.rec_count = ~0;
473
474 debug_event(dbf->rec, level, rec, sizeof(*rec));
475 spin_unlock_irqrestore(&dbf->rec_lock, flags);
476 }
477
478 #define ZFCP_DBF_SAN_LEVEL 1
479
480 static inline
zfcp_dbf_san(char * tag,struct zfcp_dbf * dbf,char * paytag,struct scatterlist * sg,u8 id,u16 len,u64 req_id,u32 d_id,u16 cap_len)481 void zfcp_dbf_san(char *tag, struct zfcp_dbf *dbf,
482 char *paytag, struct scatterlist *sg, u8 id, u16 len,
483 u64 req_id, u32 d_id, u16 cap_len)
484 {
485 struct zfcp_dbf_san *rec = &dbf->san_buf;
486 u16 rec_len;
487 unsigned long flags;
488 struct zfcp_dbf_pay *payload = &dbf->pay_buf;
489 u16 pay_sum = 0;
490
491 spin_lock_irqsave(&dbf->san_lock, flags);
492 memset(rec, 0, sizeof(*rec));
493
494 rec->id = id;
495 rec->fsf_req_id = req_id;
496 rec->d_id = d_id;
497 memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN);
498 rec->pl_len = len; /* full length even if we cap pay below */
499 if (!sg)
500 goto out;
501 rec_len = min_t(unsigned int, sg->length, ZFCP_DBF_SAN_MAX_PAYLOAD);
502 memcpy(rec->payload, sg_virt(sg), rec_len); /* part of 1st sg entry */
503 if (len <= rec_len)
504 goto out; /* skip pay record if full content in rec->payload */
505
506 /* if (len > rec_len):
507 * dump data up to cap_len ignoring small duplicate in rec->payload
508 */
509 spin_lock(&dbf->pay_lock);
510 memset(payload, 0, sizeof(*payload));
511 memcpy(payload->area, paytag, ZFCP_DBF_TAG_LEN);
512 payload->fsf_req_id = req_id;
513 payload->counter = 0;
514 for (; sg && pay_sum < cap_len; sg = sg_next(sg)) {
515 u16 pay_len, offset = 0;
516
517 while (offset < sg->length && pay_sum < cap_len) {
518 pay_len = min((u16)ZFCP_DBF_PAY_MAX_REC,
519 (u16)(sg->length - offset));
520 /* cap_len <= pay_sum < cap_len+ZFCP_DBF_PAY_MAX_REC */
521 memcpy(payload->data, sg_virt(sg) + offset, pay_len);
522 debug_event(dbf->pay, ZFCP_DBF_SAN_LEVEL, payload,
523 zfcp_dbf_plen(pay_len));
524 payload->counter++;
525 offset += pay_len;
526 pay_sum += pay_len;
527 }
528 }
529 spin_unlock(&dbf->pay_lock);
530
531 out:
532 debug_event(dbf->san, ZFCP_DBF_SAN_LEVEL, rec, sizeof(*rec));
533 spin_unlock_irqrestore(&dbf->san_lock, flags);
534 }
535
536 /**
537 * zfcp_dbf_san_req - trace event for issued SAN request
538 * @tag: identifier for event
539 * @fsf: request containing issued CT or ELS data
540 * @d_id: N_Port_ID where SAN request is sent to
541 * d_id: destination ID
542 */
zfcp_dbf_san_req(char * tag,struct zfcp_fsf_req * fsf,u32 d_id)543 void zfcp_dbf_san_req(char *tag, struct zfcp_fsf_req *fsf, u32 d_id)
544 {
545 struct zfcp_dbf *dbf = fsf->adapter->dbf;
546 struct zfcp_fsf_ct_els *ct_els = fsf->data;
547 u16 length;
548
549 if (unlikely(!debug_level_enabled(dbf->san, ZFCP_DBF_SAN_LEVEL)))
550 return;
551
552 length = (u16)zfcp_qdio_real_bytes(ct_els->req);
553 zfcp_dbf_san(tag, dbf, "san_req", ct_els->req, ZFCP_DBF_SAN_REQ,
554 length, fsf->req_id, d_id, length);
555 }
556
zfcp_dbf_san_res_cap_len_if_gpn_ft(char * tag,struct zfcp_fsf_req * fsf,u16 len)557 static u16 zfcp_dbf_san_res_cap_len_if_gpn_ft(char *tag,
558 struct zfcp_fsf_req *fsf,
559 u16 len)
560 {
561 struct zfcp_fsf_ct_els *ct_els = fsf->data;
562 struct fc_ct_hdr *reqh = sg_virt(ct_els->req);
563 struct fc_ns_gid_ft *reqn = (struct fc_ns_gid_ft *)(reqh + 1);
564 struct scatterlist *resp_entry = ct_els->resp;
565 struct fc_ct_hdr *resph;
566 struct fc_gpn_ft_resp *acc;
567 int max_entries, x, last = 0;
568
569 if (!(memcmp(tag, "fsscth2", 7) == 0
570 && ct_els->d_id == FC_FID_DIR_SERV
571 && reqh->ct_rev == FC_CT_REV
572 && reqh->ct_in_id[0] == 0
573 && reqh->ct_in_id[1] == 0
574 && reqh->ct_in_id[2] == 0
575 && reqh->ct_fs_type == FC_FST_DIR
576 && reqh->ct_fs_subtype == FC_NS_SUBTYPE
577 && reqh->ct_options == 0
578 && reqh->_ct_resvd1 == 0
579 && reqh->ct_cmd == cpu_to_be16(FC_NS_GPN_FT)
580 /* reqh->ct_mr_size can vary so do not match but read below */
581 && reqh->_ct_resvd2 == 0
582 && reqh->ct_reason == 0
583 && reqh->ct_explan == 0
584 && reqh->ct_vendor == 0
585 && reqn->fn_resvd == 0
586 && reqn->fn_domain_id_scope == 0
587 && reqn->fn_area_id_scope == 0
588 && reqn->fn_fc4_type == FC_TYPE_FCP))
589 return len; /* not GPN_FT response so do not cap */
590
591 acc = sg_virt(resp_entry);
592
593 /* cap all but accept CT responses to at least the CT header */
594 resph = (struct fc_ct_hdr *)acc;
595 if ((ct_els->status) ||
596 (resph->ct_cmd != cpu_to_be16(FC_FS_ACC)))
597 return max(FC_CT_HDR_LEN, ZFCP_DBF_SAN_MAX_PAYLOAD);
598
599 max_entries = (be16_to_cpu(reqh->ct_mr_size) * 4 /
600 sizeof(struct fc_gpn_ft_resp))
601 + 1 /* zfcp_fc_scan_ports: bytes correct, entries off-by-one
602 * to account for header as 1st pseudo "entry" */;
603
604 /* the basic CT_IU preamble is the same size as one entry in the GPN_FT
605 * response, allowing us to skip special handling for it - just skip it
606 */
607 for (x = 1; x < max_entries && !last; x++) {
608 if (x % (ZFCP_FC_GPN_FT_ENT_PAGE + 1))
609 acc++;
610 else
611 acc = sg_virt(++resp_entry);
612
613 last = acc->fp_flags & FC_NS_FID_LAST;
614 }
615 len = min(len, (u16)(x * sizeof(struct fc_gpn_ft_resp)));
616 return len; /* cap after last entry */
617 }
618
619 /**
620 * zfcp_dbf_san_res - trace event for received SAN request
621 * @tag: identifier for event
622 * @fsf: request containing received CT or ELS data
623 */
zfcp_dbf_san_res(char * tag,struct zfcp_fsf_req * fsf)624 void zfcp_dbf_san_res(char *tag, struct zfcp_fsf_req *fsf)
625 {
626 struct zfcp_dbf *dbf = fsf->adapter->dbf;
627 struct zfcp_fsf_ct_els *ct_els = fsf->data;
628 u16 length;
629
630 if (unlikely(!debug_level_enabled(dbf->san, ZFCP_DBF_SAN_LEVEL)))
631 return;
632
633 length = (u16)zfcp_qdio_real_bytes(ct_els->resp);
634 zfcp_dbf_san(tag, dbf, "san_res", ct_els->resp, ZFCP_DBF_SAN_RES,
635 length, fsf->req_id, ct_els->d_id,
636 zfcp_dbf_san_res_cap_len_if_gpn_ft(tag, fsf, length));
637 }
638
639 /**
640 * zfcp_dbf_san_in_els - trace event for incoming ELS
641 * @tag: identifier for event
642 * @fsf: request containing received ELS data
643 */
zfcp_dbf_san_in_els(char * tag,struct zfcp_fsf_req * fsf)644 void zfcp_dbf_san_in_els(char *tag, struct zfcp_fsf_req *fsf)
645 {
646 struct zfcp_dbf *dbf = fsf->adapter->dbf;
647 struct fsf_status_read_buffer *srb =
648 (struct fsf_status_read_buffer *) fsf->data;
649 u16 length;
650 struct scatterlist sg;
651
652 if (unlikely(!debug_level_enabled(dbf->san, ZFCP_DBF_SAN_LEVEL)))
653 return;
654
655 length = (u16)(srb->length -
656 offsetof(struct fsf_status_read_buffer, payload));
657 sg_init_one(&sg, srb->payload.data, length);
658 zfcp_dbf_san(tag, dbf, "san_els", &sg, ZFCP_DBF_SAN_ELS, length,
659 fsf->req_id, ntoh24(srb->d_id), length);
660 }
661
662 /**
663 * zfcp_dbf_scsi_common() - Common trace event helper for scsi.
664 * @tag: Identifier for event.
665 * @level: trace level of event.
666 * @sdev: Pointer to SCSI device as context for this event.
667 * @sc: Pointer to SCSI command, or NULL with task management function (TMF).
668 * @fsf: Pointer to FSF request, or NULL.
669 */
zfcp_dbf_scsi_common(char * tag,int level,struct scsi_device * sdev,struct scsi_cmnd * sc,struct zfcp_fsf_req * fsf)670 void zfcp_dbf_scsi_common(char *tag, int level, struct scsi_device *sdev,
671 struct scsi_cmnd *sc, struct zfcp_fsf_req *fsf)
672 {
673 struct zfcp_adapter *adapter =
674 (struct zfcp_adapter *) sdev->host->hostdata[0];
675 struct zfcp_dbf *dbf = adapter->dbf;
676 struct zfcp_dbf_scsi *rec = &dbf->scsi_buf;
677 struct fcp_resp_with_ext *fcp_rsp;
678 struct fcp_resp_rsp_info *fcp_rsp_info;
679 unsigned long flags;
680
681 spin_lock_irqsave(&dbf->scsi_lock, flags);
682 memset(rec, 0, sizeof(*rec));
683
684 memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN);
685 rec->id = ZFCP_DBF_SCSI_CMND;
686 if (sc) {
687 rec->scsi_result = sc->result;
688 rec->scsi_retries = sc->retries;
689 rec->scsi_allowed = sc->allowed;
690 rec->scsi_id = sc->device->id;
691 rec->scsi_lun = (u32)sc->device->lun;
692 rec->scsi_lun_64_hi = (u32)(sc->device->lun >> 32);
693 rec->host_scribble = (u64)sc->host_scribble;
694
695 memcpy(rec->scsi_opcode, sc->cmnd,
696 min_t(int, sc->cmd_len, ZFCP_DBF_SCSI_OPCODE));
697 } else {
698 rec->scsi_result = ~0;
699 rec->scsi_retries = ~0;
700 rec->scsi_allowed = ~0;
701 rec->scsi_id = sdev->id;
702 rec->scsi_lun = (u32)sdev->lun;
703 rec->scsi_lun_64_hi = (u32)(sdev->lun >> 32);
704 rec->host_scribble = ~0;
705
706 memset(rec->scsi_opcode, 0xff, ZFCP_DBF_SCSI_OPCODE);
707 }
708
709 if (fsf) {
710 rec->fsf_req_id = fsf->req_id;
711 rec->pl_len = FCP_RESP_WITH_EXT;
712 fcp_rsp = &(fsf->qtcb->bottom.io.fcp_rsp.iu);
713 /* mandatory parts of FCP_RSP IU in this SCSI record */
714 memcpy(&rec->fcp_rsp, fcp_rsp, FCP_RESP_WITH_EXT);
715 if (fcp_rsp->resp.fr_flags & FCP_RSP_LEN_VAL) {
716 fcp_rsp_info = (struct fcp_resp_rsp_info *) &fcp_rsp[1];
717 rec->fcp_rsp_info = fcp_rsp_info->rsp_code;
718 rec->pl_len += be32_to_cpu(fcp_rsp->ext.fr_rsp_len);
719 }
720 if (fcp_rsp->resp.fr_flags & FCP_SNS_LEN_VAL) {
721 rec->pl_len += be32_to_cpu(fcp_rsp->ext.fr_sns_len);
722 }
723 /* complete FCP_RSP IU in associated PAYload record
724 * but only if there are optional parts
725 */
726 if (fcp_rsp->resp.fr_flags != 0)
727 zfcp_dbf_pl_write(
728 dbf, fcp_rsp,
729 /* at least one full PAY record
730 * but not beyond hardware response field
731 */
732 min_t(u16, max_t(u16, rec->pl_len,
733 ZFCP_DBF_PAY_MAX_REC),
734 FSF_FCP_RSP_SIZE),
735 "fcp_riu", fsf->req_id);
736 }
737
738 debug_event(dbf->scsi, level, rec, sizeof(*rec));
739 spin_unlock_irqrestore(&dbf->scsi_lock, flags);
740 }
741
742 /**
743 * zfcp_dbf_scsi_eh() - Trace event for special cases of scsi_eh callbacks.
744 * @tag: Identifier for event.
745 * @adapter: Pointer to zfcp adapter as context for this event.
746 * @scsi_id: SCSI ID/target to indicate scope of task management function (TMF).
747 * @ret: Return value of calling function.
748 *
749 * This SCSI trace variant does not depend on any of:
750 * scsi_cmnd, zfcp_fsf_req, scsi_device.
751 */
zfcp_dbf_scsi_eh(char * tag,struct zfcp_adapter * adapter,unsigned int scsi_id,int ret)752 void zfcp_dbf_scsi_eh(char *tag, struct zfcp_adapter *adapter,
753 unsigned int scsi_id, int ret)
754 {
755 struct zfcp_dbf *dbf = adapter->dbf;
756 struct zfcp_dbf_scsi *rec = &dbf->scsi_buf;
757 unsigned long flags;
758 static int const level = 1;
759
760 if (unlikely(!debug_level_enabled(adapter->dbf->scsi, level)))
761 return;
762
763 spin_lock_irqsave(&dbf->scsi_lock, flags);
764 memset(rec, 0, sizeof(*rec));
765
766 memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN);
767 rec->id = ZFCP_DBF_SCSI_CMND;
768 rec->scsi_result = ret; /* re-use field, int is 4 bytes and fits */
769 rec->scsi_retries = ~0;
770 rec->scsi_allowed = ~0;
771 rec->fcp_rsp_info = ~0;
772 rec->scsi_id = scsi_id;
773 rec->scsi_lun = (u32)ZFCP_DBF_INVALID_LUN;
774 rec->scsi_lun_64_hi = (u32)(ZFCP_DBF_INVALID_LUN >> 32);
775 rec->host_scribble = ~0;
776 memset(rec->scsi_opcode, 0xff, ZFCP_DBF_SCSI_OPCODE);
777
778 debug_event(dbf->scsi, level, rec, sizeof(*rec));
779 spin_unlock_irqrestore(&dbf->scsi_lock, flags);
780 }
781
zfcp_dbf_reg(const char * name,int size,int rec_size)782 static debug_info_t *zfcp_dbf_reg(const char *name, int size, int rec_size)
783 {
784 struct debug_info *d;
785
786 d = debug_register(name, size, 1, rec_size);
787 if (!d)
788 return NULL;
789
790 debug_register_view(d, &debug_hex_ascii_view);
791 debug_set_level(d, dbflevel);
792
793 return d;
794 }
795
zfcp_dbf_unregister(struct zfcp_dbf * dbf)796 static void zfcp_dbf_unregister(struct zfcp_dbf *dbf)
797 {
798 if (!dbf)
799 return;
800
801 debug_unregister(dbf->scsi);
802 debug_unregister(dbf->san);
803 debug_unregister(dbf->hba);
804 debug_unregister(dbf->pay);
805 debug_unregister(dbf->rec);
806 kfree(dbf);
807 }
808
809 /**
810 * zfcp_dbf_adapter_register - registers debug feature for an adapter
811 * @adapter: pointer to adapter for which debug features should be registered
812 * return: -ENOMEM on error, 0 otherwise
813 */
zfcp_dbf_adapter_register(struct zfcp_adapter * adapter)814 int zfcp_dbf_adapter_register(struct zfcp_adapter *adapter)
815 {
816 char name[DEBUG_MAX_NAME_LEN];
817 struct zfcp_dbf *dbf;
818
819 dbf = kzalloc_obj(struct zfcp_dbf);
820 if (!dbf)
821 return -ENOMEM;
822
823 spin_lock_init(&dbf->pay_lock);
824 spin_lock_init(&dbf->hba_lock);
825 spin_lock_init(&dbf->san_lock);
826 spin_lock_init(&dbf->scsi_lock);
827 spin_lock_init(&dbf->rec_lock);
828
829 /* debug feature area which records recovery activity */
830 sprintf(name, "zfcp_%s_rec", dev_name(&adapter->ccw_device->dev));
831 dbf->rec = zfcp_dbf_reg(name, dbfsize, sizeof(struct zfcp_dbf_rec));
832 if (!dbf->rec)
833 goto err_out;
834
835 /* debug feature area which records HBA (FSF and QDIO) conditions */
836 sprintf(name, "zfcp_%s_hba", dev_name(&adapter->ccw_device->dev));
837 dbf->hba = zfcp_dbf_reg(name, dbfsize, sizeof(struct zfcp_dbf_hba));
838 if (!dbf->hba)
839 goto err_out;
840
841 /* debug feature area which records payload info */
842 sprintf(name, "zfcp_%s_pay", dev_name(&adapter->ccw_device->dev));
843 dbf->pay = zfcp_dbf_reg(name, dbfsize * 2, sizeof(struct zfcp_dbf_pay));
844 if (!dbf->pay)
845 goto err_out;
846
847 /* debug feature area which records SAN command failures and recovery */
848 sprintf(name, "zfcp_%s_san", dev_name(&adapter->ccw_device->dev));
849 dbf->san = zfcp_dbf_reg(name, dbfsize, sizeof(struct zfcp_dbf_san));
850 if (!dbf->san)
851 goto err_out;
852
853 /* debug feature area which records SCSI command failures and recovery */
854 sprintf(name, "zfcp_%s_scsi", dev_name(&adapter->ccw_device->dev));
855 dbf->scsi = zfcp_dbf_reg(name, dbfsize, sizeof(struct zfcp_dbf_scsi));
856 if (!dbf->scsi)
857 goto err_out;
858
859 adapter->dbf = dbf;
860
861 return 0;
862 err_out:
863 zfcp_dbf_unregister(dbf);
864 return -ENOMEM;
865 }
866
867 /**
868 * zfcp_dbf_adapter_unregister - unregisters debug feature for an adapter
869 * @adapter: pointer to adapter for which debug features should be unregistered
870 */
zfcp_dbf_adapter_unregister(struct zfcp_adapter * adapter)871 void zfcp_dbf_adapter_unregister(struct zfcp_adapter *adapter)
872 {
873 struct zfcp_dbf *dbf = adapter->dbf;
874
875 adapter->dbf = NULL;
876 zfcp_dbf_unregister(dbf);
877 }
878
879