1
2
3
4
5
6
7
8
9#ifndef ZFCP_DBF_H
10#define ZFCP_DBF_H
11
12#include <scsi/fc/fc_fcp.h>
13#include "zfcp_ext.h"
14#include "zfcp_fsf.h"
15#include "zfcp_def.h"
16
17#define ZFCP_DBF_TAG_LEN 7
18
19#define ZFCP_DBF_INVALID_LUN 0xFFFFFFFFFFFFFFFFull
20
21enum zfcp_dbf_pseudo_erp_act_type {
22 ZFCP_PSEUDO_ERP_ACTION_RPORT_ADD = 0xff,
23 ZFCP_PSEUDO_ERP_ACTION_RPORT_DEL = 0xfe,
24};
25
26
27
28
29
30
31
32
33struct zfcp_dbf_rec_trigger {
34 u32 ready;
35 u32 running;
36 u8 want;
37 u8 need;
38} __packed;
39
40
41
42
43
44
45
46
47struct zfcp_dbf_rec_running {
48 u64 fsf_req_id;
49 u32 rec_status;
50 u16 rec_step;
51 u8 rec_action;
52 u8 rec_count;
53} __packed;
54
55
56
57
58
59
60enum zfcp_dbf_rec_id {
61 ZFCP_DBF_REC_TRIG = 1,
62 ZFCP_DBF_REC_RUN = 2,
63};
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78struct zfcp_dbf_rec {
79 u8 id;
80 char tag[ZFCP_DBF_TAG_LEN];
81 u64 lun;
82 u64 wwpn;
83 u32 d_id;
84 u32 adapter_status;
85 u32 port_status;
86 u32 lun_status;
87 union {
88 struct zfcp_dbf_rec_trigger trig;
89 struct zfcp_dbf_rec_running run;
90 } u;
91} __packed;
92
93
94
95
96
97
98
99enum zfcp_dbf_san_id {
100 ZFCP_DBF_SAN_REQ = 1,
101 ZFCP_DBF_SAN_RES = 2,
102 ZFCP_DBF_SAN_ELS = 3,
103};
104
105
106
107
108
109
110
111
112struct zfcp_dbf_san {
113 u8 id;
114 char tag[ZFCP_DBF_TAG_LEN];
115 u64 fsf_req_id;
116 u32 d_id;
117#define ZFCP_DBF_SAN_MAX_PAYLOAD (FC_CT_HDR_LEN + 32)
118 char payload[ZFCP_DBF_SAN_MAX_PAYLOAD];
119 u16 pl_len;
120} __packed;
121
122
123
124
125
126
127
128
129
130struct zfcp_dbf_hba_res {
131 u64 req_issued;
132 u32 prot_status;
133 u8 prot_status_qual[FSF_PROT_STATUS_QUAL_SIZE];
134 u32 fsf_status;
135 u8 fsf_status_qual[FSF_STATUS_QUALIFIER_SIZE];
136 u32 port_handle;
137 u32 lun_handle;
138} __packed;
139
140
141
142
143
144
145
146
147
148struct zfcp_dbf_hba_uss {
149 u32 status_type;
150 u32 status_subtype;
151 u32 d_id;
152 u64 lun;
153 u64 queue_designator;
154} __packed;
155
156
157
158
159
160
161
162enum zfcp_dbf_hba_id {
163 ZFCP_DBF_HBA_RES = 1,
164 ZFCP_DBF_HBA_USS = 2,
165 ZFCP_DBF_HBA_BIT = 3,
166 ZFCP_DBF_HBA_BASIC = 4,
167};
168
169
170
171
172
173
174
175
176
177
178
179
180struct zfcp_dbf_hba {
181 u8 id;
182 char tag[ZFCP_DBF_TAG_LEN];
183 u64 fsf_req_id;
184 u32 fsf_req_status;
185 u32 fsf_cmd;
186 u32 fsf_seq_no;
187 u16 pl_len;
188 union {
189 struct zfcp_dbf_hba_res res;
190 struct zfcp_dbf_hba_uss uss;
191 struct fsf_bit_error_payload be;
192 } u;
193} __packed;
194
195
196
197
198
199enum zfcp_dbf_scsi_id {
200 ZFCP_DBF_SCSI_CMND = 1,
201};
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220struct zfcp_dbf_scsi {
221 u8 id;
222 char tag[ZFCP_DBF_TAG_LEN];
223 u32 scsi_id;
224 u32 scsi_lun;
225 u32 scsi_result;
226 u8 scsi_retries;
227 u8 scsi_allowed;
228 u8 fcp_rsp_info;
229#define ZFCP_DBF_SCSI_OPCODE 16
230 u8 scsi_opcode[ZFCP_DBF_SCSI_OPCODE];
231 u64 fsf_req_id;
232 u64 host_scribble;
233 u16 pl_len;
234 struct fcp_resp_with_ext fcp_rsp;
235 u32 scsi_lun_64_hi;
236} __packed;
237
238
239
240
241
242
243
244
245struct zfcp_dbf_pay {
246 u8 counter;
247 char area[ZFCP_DBF_TAG_LEN];
248 u64 fsf_req_id;
249#define ZFCP_DBF_PAY_MAX_REC 0x100
250 char data[ZFCP_DBF_PAY_MAX_REC];
251} __packed;
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271struct zfcp_dbf {
272 debug_info_t *pay;
273 debug_info_t *rec;
274 debug_info_t *hba;
275 debug_info_t *san;
276 debug_info_t *scsi;
277 spinlock_t pay_lock;
278 spinlock_t rec_lock;
279 spinlock_t hba_lock;
280 spinlock_t san_lock;
281 spinlock_t scsi_lock;
282 struct zfcp_dbf_pay pay_buf;
283 struct zfcp_dbf_rec rec_buf;
284 struct zfcp_dbf_hba hba_buf;
285 struct zfcp_dbf_san san_buf;
286 struct zfcp_dbf_scsi scsi_buf;
287};
288
289
290
291
292
293
294
295static inline
296bool zfcp_dbf_hba_fsf_resp_suppress(struct zfcp_fsf_req *req)
297{
298 struct fsf_qtcb *qtcb = req->qtcb;
299 u32 fsf_stat = qtcb->header.fsf_status;
300 struct fcp_resp *fcp_rsp;
301 u8 rsp_flags, fr_status;
302
303 if (qtcb->prefix.qtcb_type != FSF_IO_COMMAND)
304 return false;
305 fcp_rsp = &qtcb->bottom.io.fcp_rsp.iu.resp;
306 rsp_flags = fcp_rsp->fr_flags;
307 fr_status = fcp_rsp->fr_status;
308 return (fsf_stat == FSF_FCP_RSP_AVAILABLE) &&
309 (rsp_flags == FCP_RESID_UNDER) &&
310 (fr_status == SAM_STAT_GOOD);
311}
312
313static inline
314void zfcp_dbf_hba_fsf_resp(char *tag, int level, struct zfcp_fsf_req *req)
315{
316 if (debug_level_enabled(req->adapter->dbf->hba, level))
317 zfcp_dbf_hba_fsf_res(tag, level, req);
318}
319
320
321
322
323
324static inline
325void zfcp_dbf_hba_fsf_response(struct zfcp_fsf_req *req)
326{
327 struct fsf_qtcb *qtcb = req->qtcb;
328
329 if (unlikely(req->status & (ZFCP_STATUS_FSFREQ_DISMISSED |
330 ZFCP_STATUS_FSFREQ_ERROR))) {
331 zfcp_dbf_hba_fsf_resp("fs_rerr", 3, req);
332
333 } else if ((qtcb->prefix.prot_status != FSF_PROT_GOOD) &&
334 (qtcb->prefix.prot_status != FSF_PROT_FSF_STATUS_PRESENTED)) {
335 zfcp_dbf_hba_fsf_resp("fs_perr", 1, req);
336
337 } else if (qtcb->header.fsf_status != FSF_GOOD) {
338 zfcp_dbf_hba_fsf_resp("fs_ferr",
339 zfcp_dbf_hba_fsf_resp_suppress(req)
340 ? 5 : 1, req);
341
342 } else if ((req->fsf_command == FSF_QTCB_OPEN_PORT_WITH_DID) ||
343 (req->fsf_command == FSF_QTCB_OPEN_LUN)) {
344 zfcp_dbf_hba_fsf_resp("fs_open", 4, req);
345
346 } else if (qtcb->header.log_length) {
347 zfcp_dbf_hba_fsf_resp("fs_qtcb", 5, req);
348
349 } else {
350 zfcp_dbf_hba_fsf_resp("fs_norm", 6, req);
351 }
352}
353
354static inline
355void _zfcp_dbf_scsi(char *tag, int level, struct scsi_cmnd *scmd,
356 struct zfcp_fsf_req *req)
357{
358 struct zfcp_adapter *adapter = (struct zfcp_adapter *)
359 scmd->device->host->hostdata[0];
360
361 if (debug_level_enabled(adapter->dbf->scsi, level))
362 zfcp_dbf_scsi(tag, level, scmd, req);
363}
364
365
366
367
368
369
370static inline
371void zfcp_dbf_scsi_result(struct scsi_cmnd *scmd, struct zfcp_fsf_req *req)
372{
373 if (scmd->result != 0)
374 _zfcp_dbf_scsi("rsl_err", 3, scmd, req);
375 else if (scmd->retries > 0)
376 _zfcp_dbf_scsi("rsl_ret", 4, scmd, req);
377 else
378 _zfcp_dbf_scsi("rsl_nor", 6, scmd, req);
379}
380
381
382
383
384
385static inline
386void zfcp_dbf_scsi_fail_send(struct scsi_cmnd *scmd)
387{
388 _zfcp_dbf_scsi("rsl_fai", 4, scmd, NULL);
389}
390
391
392
393
394
395
396
397static inline
398void zfcp_dbf_scsi_abort(char *tag, struct scsi_cmnd *scmd,
399 struct zfcp_fsf_req *fsf_req)
400{
401 _zfcp_dbf_scsi(tag, 1, scmd, fsf_req);
402}
403
404
405
406
407
408
409
410static inline
411void zfcp_dbf_scsi_devreset(char *tag, struct scsi_cmnd *scmnd, u8 flag,
412 struct zfcp_fsf_req *fsf_req)
413{
414 char tmp_tag[ZFCP_DBF_TAG_LEN];
415
416 if (flag == FCP_TMF_TGT_RESET)
417 memcpy(tmp_tag, "tr_", 3);
418 else
419 memcpy(tmp_tag, "lr_", 3);
420
421 memcpy(&tmp_tag[3], tag, 4);
422 _zfcp_dbf_scsi(tmp_tag, 1, scmnd, fsf_req);
423}
424
425
426
427
428
429
430static inline void zfcp_dbf_scsi_nullcmnd(struct scsi_cmnd *scmnd,
431 struct zfcp_fsf_req *fsf_req)
432{
433 _zfcp_dbf_scsi("scfc__1", 3, scmnd, fsf_req);
434}
435
436#endif
437