1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * zfcp device driver
4*4882a593Smuzhiyun * debug feature declarations
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * Copyright IBM Corp. 2008, 2020
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun #ifndef ZFCP_DBF_H
10*4882a593Smuzhiyun #define ZFCP_DBF_H
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun #include <scsi/fc/fc_fcp.h>
13*4882a593Smuzhiyun #include "zfcp_ext.h"
14*4882a593Smuzhiyun #include "zfcp_fsf.h"
15*4882a593Smuzhiyun #include "zfcp_def.h"
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun #define ZFCP_DBF_TAG_LEN 7
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun #define ZFCP_DBF_INVALID_WWPN 0x0000000000000000ull
20*4882a593Smuzhiyun #define ZFCP_DBF_INVALID_LUN 0xFFFFFFFFFFFFFFFFull
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun enum zfcp_dbf_pseudo_erp_act_type {
23*4882a593Smuzhiyun ZFCP_PSEUDO_ERP_ACTION_RPORT_ADD = 0xff,
24*4882a593Smuzhiyun ZFCP_PSEUDO_ERP_ACTION_RPORT_DEL = 0xfe,
25*4882a593Smuzhiyun };
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun /**
28*4882a593Smuzhiyun * struct zfcp_dbf_rec_trigger - trace record for triggered recovery action
29*4882a593Smuzhiyun * @ready: number of ready recovery actions
30*4882a593Smuzhiyun * @running: number of running recovery actions
31*4882a593Smuzhiyun * @want: wanted recovery action
32*4882a593Smuzhiyun * @need: needed recovery action
33*4882a593Smuzhiyun */
34*4882a593Smuzhiyun struct zfcp_dbf_rec_trigger {
35*4882a593Smuzhiyun u32 ready;
36*4882a593Smuzhiyun u32 running;
37*4882a593Smuzhiyun u8 want;
38*4882a593Smuzhiyun u8 need;
39*4882a593Smuzhiyun } __packed;
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun /**
42*4882a593Smuzhiyun * struct zfcp_dbf_rec_running - trace record for running recovery
43*4882a593Smuzhiyun * @fsf_req_id: request id for fsf requests
44*4882a593Smuzhiyun * @rec_status: status of the fsf request
45*4882a593Smuzhiyun * @rec_step: current step of the recovery action
46*4882a593Smuzhiyun * @rec_action: ERP action type
47*4882a593Smuzhiyun * @rec_count: recoveries including retries for particular @rec_action
48*4882a593Smuzhiyun */
49*4882a593Smuzhiyun struct zfcp_dbf_rec_running {
50*4882a593Smuzhiyun u64 fsf_req_id;
51*4882a593Smuzhiyun u32 rec_status;
52*4882a593Smuzhiyun u16 rec_step;
53*4882a593Smuzhiyun u8 rec_action;
54*4882a593Smuzhiyun u8 rec_count;
55*4882a593Smuzhiyun } __packed;
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun /**
58*4882a593Smuzhiyun * enum zfcp_dbf_rec_id - recovery trace record id
59*4882a593Smuzhiyun * @ZFCP_DBF_REC_TRIG: triggered recovery identifier
60*4882a593Smuzhiyun * @ZFCP_DBF_REC_RUN: running recovery identifier
61*4882a593Smuzhiyun */
62*4882a593Smuzhiyun enum zfcp_dbf_rec_id {
63*4882a593Smuzhiyun ZFCP_DBF_REC_TRIG = 1,
64*4882a593Smuzhiyun ZFCP_DBF_REC_RUN = 2,
65*4882a593Smuzhiyun };
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun /**
68*4882a593Smuzhiyun * struct zfcp_dbf_rec - trace record for error recovery actions
69*4882a593Smuzhiyun * @id: unique number of recovery record type
70*4882a593Smuzhiyun * @tag: identifier string specifying the location of initiation
71*4882a593Smuzhiyun * @lun: logical unit number
72*4882a593Smuzhiyun * @wwpn: word wide port number
73*4882a593Smuzhiyun * @d_id: destination ID
74*4882a593Smuzhiyun * @adapter_status: current status of the adapter
75*4882a593Smuzhiyun * @port_status: current status of the port
76*4882a593Smuzhiyun * @lun_status: current status of the lun
77*4882a593Smuzhiyun * @u: record type specific data
78*4882a593Smuzhiyun * @u.trig: structure zfcp_dbf_rec_trigger
79*4882a593Smuzhiyun * @u.run: structure zfcp_dbf_rec_running
80*4882a593Smuzhiyun */
81*4882a593Smuzhiyun struct zfcp_dbf_rec {
82*4882a593Smuzhiyun u8 id;
83*4882a593Smuzhiyun char tag[ZFCP_DBF_TAG_LEN];
84*4882a593Smuzhiyun u64 lun;
85*4882a593Smuzhiyun u64 wwpn;
86*4882a593Smuzhiyun u32 d_id;
87*4882a593Smuzhiyun u32 adapter_status;
88*4882a593Smuzhiyun u32 port_status;
89*4882a593Smuzhiyun u32 lun_status;
90*4882a593Smuzhiyun union {
91*4882a593Smuzhiyun struct zfcp_dbf_rec_trigger trig;
92*4882a593Smuzhiyun struct zfcp_dbf_rec_running run;
93*4882a593Smuzhiyun } u;
94*4882a593Smuzhiyun } __packed;
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun /**
97*4882a593Smuzhiyun * enum zfcp_dbf_san_id - SAN trace record identifier
98*4882a593Smuzhiyun * @ZFCP_DBF_SAN_REQ: request trace record id
99*4882a593Smuzhiyun * @ZFCP_DBF_SAN_RES: response trace record id
100*4882a593Smuzhiyun * @ZFCP_DBF_SAN_ELS: extended link service record id
101*4882a593Smuzhiyun */
102*4882a593Smuzhiyun enum zfcp_dbf_san_id {
103*4882a593Smuzhiyun ZFCP_DBF_SAN_REQ = 1,
104*4882a593Smuzhiyun ZFCP_DBF_SAN_RES = 2,
105*4882a593Smuzhiyun ZFCP_DBF_SAN_ELS = 3,
106*4882a593Smuzhiyun };
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun /** struct zfcp_dbf_san - trace record for SAN requests and responses
109*4882a593Smuzhiyun * @id: unique number of recovery record type
110*4882a593Smuzhiyun * @tag: identifier string specifying the location of initiation
111*4882a593Smuzhiyun * @fsf_req_id: request id for fsf requests
112*4882a593Smuzhiyun * @payload: unformatted information related to request/response
113*4882a593Smuzhiyun * @d_id: destination id
114*4882a593Smuzhiyun */
115*4882a593Smuzhiyun struct zfcp_dbf_san {
116*4882a593Smuzhiyun u8 id;
117*4882a593Smuzhiyun char tag[ZFCP_DBF_TAG_LEN];
118*4882a593Smuzhiyun u64 fsf_req_id;
119*4882a593Smuzhiyun u32 d_id;
120*4882a593Smuzhiyun #define ZFCP_DBF_SAN_MAX_PAYLOAD (FC_CT_HDR_LEN + 32)
121*4882a593Smuzhiyun char payload[ZFCP_DBF_SAN_MAX_PAYLOAD];
122*4882a593Smuzhiyun u16 pl_len;
123*4882a593Smuzhiyun } __packed;
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun /**
126*4882a593Smuzhiyun * struct zfcp_dbf_hba_res - trace record for hba responses
127*4882a593Smuzhiyun * @req_issued: timestamp when request was issued
128*4882a593Smuzhiyun * @prot_status: protocol status
129*4882a593Smuzhiyun * @prot_status_qual: protocol status qualifier
130*4882a593Smuzhiyun * @fsf_status: fsf status
131*4882a593Smuzhiyun * @fsf_status_qual: fsf status qualifier
132*4882a593Smuzhiyun * @port_handle: handle for port
133*4882a593Smuzhiyun * @lun_handle: handle for LUN
134*4882a593Smuzhiyun */
135*4882a593Smuzhiyun struct zfcp_dbf_hba_res {
136*4882a593Smuzhiyun u64 req_issued;
137*4882a593Smuzhiyun u32 prot_status;
138*4882a593Smuzhiyun u8 prot_status_qual[FSF_PROT_STATUS_QUAL_SIZE];
139*4882a593Smuzhiyun u32 fsf_status;
140*4882a593Smuzhiyun u8 fsf_status_qual[FSF_STATUS_QUALIFIER_SIZE];
141*4882a593Smuzhiyun u32 port_handle;
142*4882a593Smuzhiyun u32 lun_handle;
143*4882a593Smuzhiyun } __packed;
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun /**
146*4882a593Smuzhiyun * struct zfcp_dbf_hba_uss - trace record for unsolicited status
147*4882a593Smuzhiyun * @status_type: type of unsolicited status
148*4882a593Smuzhiyun * @status_subtype: subtype of unsolicited status
149*4882a593Smuzhiyun * @d_id: destination ID
150*4882a593Smuzhiyun * @lun: logical unit number
151*4882a593Smuzhiyun * @queue_designator: queue designator
152*4882a593Smuzhiyun */
153*4882a593Smuzhiyun struct zfcp_dbf_hba_uss {
154*4882a593Smuzhiyun u32 status_type;
155*4882a593Smuzhiyun u32 status_subtype;
156*4882a593Smuzhiyun u32 d_id;
157*4882a593Smuzhiyun u64 lun;
158*4882a593Smuzhiyun u64 queue_designator;
159*4882a593Smuzhiyun } __packed;
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun /**
162*4882a593Smuzhiyun * struct zfcp_dbf_hba_fces - trace record for FC Endpoint Security
163*4882a593Smuzhiyun * @req_issued: timestamp when request was issued
164*4882a593Smuzhiyun * @fsf_status: fsf status
165*4882a593Smuzhiyun * @port_handle: handle for port
166*4882a593Smuzhiyun * @wwpn: remote FC port WWPN
167*4882a593Smuzhiyun * @fc_security_old: old FC Endpoint Security
168*4882a593Smuzhiyun * @fc_security_new: new FC Endpoint Security
169*4882a593Smuzhiyun *
170*4882a593Smuzhiyun */
171*4882a593Smuzhiyun struct zfcp_dbf_hba_fces {
172*4882a593Smuzhiyun u64 req_issued;
173*4882a593Smuzhiyun u32 fsf_status;
174*4882a593Smuzhiyun u32 port_handle;
175*4882a593Smuzhiyun u64 wwpn;
176*4882a593Smuzhiyun u32 fc_security_old;
177*4882a593Smuzhiyun u32 fc_security_new;
178*4882a593Smuzhiyun } __packed;
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun /**
181*4882a593Smuzhiyun * enum zfcp_dbf_hba_id - HBA trace record identifier
182*4882a593Smuzhiyun * @ZFCP_DBF_HBA_RES: response trace record
183*4882a593Smuzhiyun * @ZFCP_DBF_HBA_USS: unsolicited status trace record
184*4882a593Smuzhiyun * @ZFCP_DBF_HBA_BIT: bit error trace record
185*4882a593Smuzhiyun * @ZFCP_DBF_HBA_BASIC: basic adapter event, only trace tag, no other data
186*4882a593Smuzhiyun * @ZFCP_DBF_HBA_FCES: FC Endpoint Security trace record
187*4882a593Smuzhiyun */
188*4882a593Smuzhiyun enum zfcp_dbf_hba_id {
189*4882a593Smuzhiyun ZFCP_DBF_HBA_RES = 1,
190*4882a593Smuzhiyun ZFCP_DBF_HBA_USS = 2,
191*4882a593Smuzhiyun ZFCP_DBF_HBA_BIT = 3,
192*4882a593Smuzhiyun ZFCP_DBF_HBA_BASIC = 4,
193*4882a593Smuzhiyun ZFCP_DBF_HBA_FCES = 5,
194*4882a593Smuzhiyun };
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun /**
197*4882a593Smuzhiyun * struct zfcp_dbf_hba - common trace record for HBA records
198*4882a593Smuzhiyun * @id: unique number of recovery record type
199*4882a593Smuzhiyun * @tag: identifier string specifying the location of initiation
200*4882a593Smuzhiyun * @fsf_req_id: request id for fsf requests
201*4882a593Smuzhiyun * @fsf_req_status: status of fsf request
202*4882a593Smuzhiyun * @fsf_cmd: fsf command
203*4882a593Smuzhiyun * @fsf_seq_no: fsf sequence number
204*4882a593Smuzhiyun * @pl_len: length of payload stored as zfcp_dbf_pay
205*4882a593Smuzhiyun * @u: record type specific data
206*4882a593Smuzhiyun * @u.res: data for fsf responses
207*4882a593Smuzhiyun * @u.uss: data for unsolicited status buffer
208*4882a593Smuzhiyun * @u.be: data for bit error unsolicited status buffer
209*4882a593Smuzhiyun * @u.fces: data for FC Endpoint Security
210*4882a593Smuzhiyun */
211*4882a593Smuzhiyun struct zfcp_dbf_hba {
212*4882a593Smuzhiyun u8 id;
213*4882a593Smuzhiyun char tag[ZFCP_DBF_TAG_LEN];
214*4882a593Smuzhiyun u64 fsf_req_id;
215*4882a593Smuzhiyun u32 fsf_req_status;
216*4882a593Smuzhiyun u32 fsf_cmd;
217*4882a593Smuzhiyun u32 fsf_seq_no;
218*4882a593Smuzhiyun u16 pl_len;
219*4882a593Smuzhiyun union {
220*4882a593Smuzhiyun struct zfcp_dbf_hba_res res;
221*4882a593Smuzhiyun struct zfcp_dbf_hba_uss uss;
222*4882a593Smuzhiyun struct fsf_bit_error_payload be;
223*4882a593Smuzhiyun struct zfcp_dbf_hba_fces fces;
224*4882a593Smuzhiyun } u;
225*4882a593Smuzhiyun } __packed;
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun /**
228*4882a593Smuzhiyun * enum zfcp_dbf_scsi_id - scsi trace record identifier
229*4882a593Smuzhiyun * @ZFCP_DBF_SCSI_CMND: scsi command trace record
230*4882a593Smuzhiyun */
231*4882a593Smuzhiyun enum zfcp_dbf_scsi_id {
232*4882a593Smuzhiyun ZFCP_DBF_SCSI_CMND = 1,
233*4882a593Smuzhiyun };
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun /**
236*4882a593Smuzhiyun * struct zfcp_dbf_scsi - common trace record for SCSI records
237*4882a593Smuzhiyun * @id: unique number of recovery record type
238*4882a593Smuzhiyun * @tag: identifier string specifying the location of initiation
239*4882a593Smuzhiyun * @scsi_id: scsi device id
240*4882a593Smuzhiyun * @scsi_lun: scsi device logical unit number, low part of 64 bit, old 32 bit
241*4882a593Smuzhiyun * @scsi_result: scsi result
242*4882a593Smuzhiyun * @scsi_retries: current retry number of scsi request
243*4882a593Smuzhiyun * @scsi_allowed: allowed retries
244*4882a593Smuzhiyun * @fcp_rsp_info: FCP response info code
245*4882a593Smuzhiyun * @scsi_opcode: scsi opcode
246*4882a593Smuzhiyun * @fsf_req_id: request id of fsf request
247*4882a593Smuzhiyun * @host_scribble: LLD specific data attached to SCSI request
248*4882a593Smuzhiyun * @pl_len: length of payload stored as zfcp_dbf_pay
249*4882a593Smuzhiyun * @fcp_rsp: response for FCP request
250*4882a593Smuzhiyun * @scsi_lun_64_hi: scsi device logical unit number, high part of 64 bit
251*4882a593Smuzhiyun */
252*4882a593Smuzhiyun struct zfcp_dbf_scsi {
253*4882a593Smuzhiyun u8 id;
254*4882a593Smuzhiyun char tag[ZFCP_DBF_TAG_LEN];
255*4882a593Smuzhiyun u32 scsi_id;
256*4882a593Smuzhiyun u32 scsi_lun;
257*4882a593Smuzhiyun u32 scsi_result;
258*4882a593Smuzhiyun u8 scsi_retries;
259*4882a593Smuzhiyun u8 scsi_allowed;
260*4882a593Smuzhiyun u8 fcp_rsp_info;
261*4882a593Smuzhiyun #define ZFCP_DBF_SCSI_OPCODE 16
262*4882a593Smuzhiyun u8 scsi_opcode[ZFCP_DBF_SCSI_OPCODE];
263*4882a593Smuzhiyun u64 fsf_req_id;
264*4882a593Smuzhiyun u64 host_scribble;
265*4882a593Smuzhiyun u16 pl_len;
266*4882a593Smuzhiyun struct fcp_resp_with_ext fcp_rsp;
267*4882a593Smuzhiyun u32 scsi_lun_64_hi;
268*4882a593Smuzhiyun } __packed;
269*4882a593Smuzhiyun
270*4882a593Smuzhiyun /**
271*4882a593Smuzhiyun * struct zfcp_dbf_pay - trace record for unformatted payload information
272*4882a593Smuzhiyun * @area: area this record is originated from
273*4882a593Smuzhiyun * @counter: ascending record number
274*4882a593Smuzhiyun * @fsf_req_id: request id of fsf request
275*4882a593Smuzhiyun * @data: unformatted data
276*4882a593Smuzhiyun */
277*4882a593Smuzhiyun struct zfcp_dbf_pay {
278*4882a593Smuzhiyun u8 counter;
279*4882a593Smuzhiyun char area[ZFCP_DBF_TAG_LEN];
280*4882a593Smuzhiyun u64 fsf_req_id;
281*4882a593Smuzhiyun #define ZFCP_DBF_PAY_MAX_REC 0x100
282*4882a593Smuzhiyun char data[ZFCP_DBF_PAY_MAX_REC];
283*4882a593Smuzhiyun } __packed;
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun /**
286*4882a593Smuzhiyun * struct zfcp_dbf - main dbf trace structure
287*4882a593Smuzhiyun * @pay: reference to payload trace area
288*4882a593Smuzhiyun * @rec: reference to recovery trace area
289*4882a593Smuzhiyun * @hba: reference to hba trace area
290*4882a593Smuzhiyun * @san: reference to san trace area
291*4882a593Smuzhiyun * @scsi: reference to scsi trace area
292*4882a593Smuzhiyun * @pay_lock: lock protecting payload trace buffer
293*4882a593Smuzhiyun * @rec_lock: lock protecting recovery trace buffer
294*4882a593Smuzhiyun * @hba_lock: lock protecting hba trace buffer
295*4882a593Smuzhiyun * @san_lock: lock protecting san trace buffer
296*4882a593Smuzhiyun * @scsi_lock: lock protecting scsi trace buffer
297*4882a593Smuzhiyun * @pay_buf: pre-allocated buffer for payload
298*4882a593Smuzhiyun * @rec_buf: pre-allocated buffer for recovery
299*4882a593Smuzhiyun * @hba_buf: pre-allocated buffer for hba
300*4882a593Smuzhiyun * @san_buf: pre-allocated buffer for san
301*4882a593Smuzhiyun * @scsi_buf: pre-allocated buffer for scsi
302*4882a593Smuzhiyun */
303*4882a593Smuzhiyun struct zfcp_dbf {
304*4882a593Smuzhiyun debug_info_t *pay;
305*4882a593Smuzhiyun debug_info_t *rec;
306*4882a593Smuzhiyun debug_info_t *hba;
307*4882a593Smuzhiyun debug_info_t *san;
308*4882a593Smuzhiyun debug_info_t *scsi;
309*4882a593Smuzhiyun spinlock_t pay_lock;
310*4882a593Smuzhiyun spinlock_t rec_lock;
311*4882a593Smuzhiyun spinlock_t hba_lock;
312*4882a593Smuzhiyun spinlock_t san_lock;
313*4882a593Smuzhiyun spinlock_t scsi_lock;
314*4882a593Smuzhiyun struct zfcp_dbf_pay pay_buf;
315*4882a593Smuzhiyun struct zfcp_dbf_rec rec_buf;
316*4882a593Smuzhiyun struct zfcp_dbf_hba hba_buf;
317*4882a593Smuzhiyun struct zfcp_dbf_san san_buf;
318*4882a593Smuzhiyun struct zfcp_dbf_scsi scsi_buf;
319*4882a593Smuzhiyun };
320*4882a593Smuzhiyun
321*4882a593Smuzhiyun /**
322*4882a593Smuzhiyun * zfcp_dbf_hba_fsf_resp_suppress - true if we should not trace by default
323*4882a593Smuzhiyun * @req: request that has been completed
324*4882a593Smuzhiyun *
325*4882a593Smuzhiyun * Returns true if FCP response with only benign residual under count.
326*4882a593Smuzhiyun */
327*4882a593Smuzhiyun static inline
zfcp_dbf_hba_fsf_resp_suppress(struct zfcp_fsf_req * req)328*4882a593Smuzhiyun bool zfcp_dbf_hba_fsf_resp_suppress(struct zfcp_fsf_req *req)
329*4882a593Smuzhiyun {
330*4882a593Smuzhiyun struct fsf_qtcb *qtcb = req->qtcb;
331*4882a593Smuzhiyun u32 fsf_stat = qtcb->header.fsf_status;
332*4882a593Smuzhiyun struct fcp_resp *fcp_rsp;
333*4882a593Smuzhiyun u8 rsp_flags, fr_status;
334*4882a593Smuzhiyun
335*4882a593Smuzhiyun if (qtcb->prefix.qtcb_type != FSF_IO_COMMAND)
336*4882a593Smuzhiyun return false; /* not an FCP response */
337*4882a593Smuzhiyun fcp_rsp = &qtcb->bottom.io.fcp_rsp.iu.resp;
338*4882a593Smuzhiyun rsp_flags = fcp_rsp->fr_flags;
339*4882a593Smuzhiyun fr_status = fcp_rsp->fr_status;
340*4882a593Smuzhiyun return (fsf_stat == FSF_FCP_RSP_AVAILABLE) &&
341*4882a593Smuzhiyun (rsp_flags == FCP_RESID_UNDER) &&
342*4882a593Smuzhiyun (fr_status == SAM_STAT_GOOD);
343*4882a593Smuzhiyun }
344*4882a593Smuzhiyun
345*4882a593Smuzhiyun static inline
zfcp_dbf_hba_fsf_resp(char * tag,int level,struct zfcp_fsf_req * req)346*4882a593Smuzhiyun void zfcp_dbf_hba_fsf_resp(char *tag, int level, struct zfcp_fsf_req *req)
347*4882a593Smuzhiyun {
348*4882a593Smuzhiyun if (debug_level_enabled(req->adapter->dbf->hba, level))
349*4882a593Smuzhiyun zfcp_dbf_hba_fsf_res(tag, level, req);
350*4882a593Smuzhiyun }
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun /**
353*4882a593Smuzhiyun * zfcp_dbf_hba_fsf_response - trace event for request completion
354*4882a593Smuzhiyun * @req: request that has been completed
355*4882a593Smuzhiyun */
356*4882a593Smuzhiyun static inline
zfcp_dbf_hba_fsf_response(struct zfcp_fsf_req * req)357*4882a593Smuzhiyun void zfcp_dbf_hba_fsf_response(struct zfcp_fsf_req *req)
358*4882a593Smuzhiyun {
359*4882a593Smuzhiyun struct fsf_qtcb *qtcb = req->qtcb;
360*4882a593Smuzhiyun
361*4882a593Smuzhiyun if (unlikely(req->status & (ZFCP_STATUS_FSFREQ_DISMISSED |
362*4882a593Smuzhiyun ZFCP_STATUS_FSFREQ_ERROR))) {
363*4882a593Smuzhiyun zfcp_dbf_hba_fsf_resp("fs_rerr", 3, req);
364*4882a593Smuzhiyun
365*4882a593Smuzhiyun } else if ((qtcb->prefix.prot_status != FSF_PROT_GOOD) &&
366*4882a593Smuzhiyun (qtcb->prefix.prot_status != FSF_PROT_FSF_STATUS_PRESENTED)) {
367*4882a593Smuzhiyun zfcp_dbf_hba_fsf_resp("fs_perr", 1, req);
368*4882a593Smuzhiyun
369*4882a593Smuzhiyun } else if (qtcb->header.fsf_status != FSF_GOOD) {
370*4882a593Smuzhiyun zfcp_dbf_hba_fsf_resp("fs_ferr",
371*4882a593Smuzhiyun zfcp_dbf_hba_fsf_resp_suppress(req)
372*4882a593Smuzhiyun ? 5 : 1, req);
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun } else if ((qtcb->header.fsf_command == FSF_QTCB_OPEN_PORT_WITH_DID) ||
375*4882a593Smuzhiyun (qtcb->header.fsf_command == FSF_QTCB_OPEN_LUN)) {
376*4882a593Smuzhiyun zfcp_dbf_hba_fsf_resp("fs_open", 4, req);
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun } else if (qtcb->header.log_length) {
379*4882a593Smuzhiyun zfcp_dbf_hba_fsf_resp("fs_qtcb", 5, req);
380*4882a593Smuzhiyun
381*4882a593Smuzhiyun } else {
382*4882a593Smuzhiyun zfcp_dbf_hba_fsf_resp("fs_norm", 6, req);
383*4882a593Smuzhiyun }
384*4882a593Smuzhiyun }
385*4882a593Smuzhiyun
386*4882a593Smuzhiyun static inline
_zfcp_dbf_scsi(char * tag,int level,struct scsi_cmnd * scmd,struct zfcp_fsf_req * req)387*4882a593Smuzhiyun void _zfcp_dbf_scsi(char *tag, int level, struct scsi_cmnd *scmd,
388*4882a593Smuzhiyun struct zfcp_fsf_req *req)
389*4882a593Smuzhiyun {
390*4882a593Smuzhiyun struct zfcp_adapter *adapter = (struct zfcp_adapter *)
391*4882a593Smuzhiyun scmd->device->host->hostdata[0];
392*4882a593Smuzhiyun
393*4882a593Smuzhiyun if (debug_level_enabled(adapter->dbf->scsi, level))
394*4882a593Smuzhiyun zfcp_dbf_scsi_common(tag, level, scmd->device, scmd, req);
395*4882a593Smuzhiyun }
396*4882a593Smuzhiyun
397*4882a593Smuzhiyun /**
398*4882a593Smuzhiyun * zfcp_dbf_scsi_result - trace event for SCSI command completion
399*4882a593Smuzhiyun * @scmd: SCSI command pointer
400*4882a593Smuzhiyun * @req: FSF request used to issue SCSI command
401*4882a593Smuzhiyun */
402*4882a593Smuzhiyun static inline
zfcp_dbf_scsi_result(struct scsi_cmnd * scmd,struct zfcp_fsf_req * req)403*4882a593Smuzhiyun void zfcp_dbf_scsi_result(struct scsi_cmnd *scmd, struct zfcp_fsf_req *req)
404*4882a593Smuzhiyun {
405*4882a593Smuzhiyun if (scmd->result != 0)
406*4882a593Smuzhiyun _zfcp_dbf_scsi("rsl_err", 3, scmd, req);
407*4882a593Smuzhiyun else if (scmd->retries > 0)
408*4882a593Smuzhiyun _zfcp_dbf_scsi("rsl_ret", 4, scmd, req);
409*4882a593Smuzhiyun else
410*4882a593Smuzhiyun _zfcp_dbf_scsi("rsl_nor", 6, scmd, req);
411*4882a593Smuzhiyun }
412*4882a593Smuzhiyun
413*4882a593Smuzhiyun /**
414*4882a593Smuzhiyun * zfcp_dbf_scsi_fail_send - trace event for failure to send SCSI command
415*4882a593Smuzhiyun * @scmd: SCSI command pointer
416*4882a593Smuzhiyun */
417*4882a593Smuzhiyun static inline
zfcp_dbf_scsi_fail_send(struct scsi_cmnd * scmd)418*4882a593Smuzhiyun void zfcp_dbf_scsi_fail_send(struct scsi_cmnd *scmd)
419*4882a593Smuzhiyun {
420*4882a593Smuzhiyun _zfcp_dbf_scsi("rsl_fai", 4, scmd, NULL);
421*4882a593Smuzhiyun }
422*4882a593Smuzhiyun
423*4882a593Smuzhiyun /**
424*4882a593Smuzhiyun * zfcp_dbf_scsi_abort - trace event for SCSI command abort
425*4882a593Smuzhiyun * @tag: tag indicating success or failure of abort operation
426*4882a593Smuzhiyun * @scmd: SCSI command to be aborted
427*4882a593Smuzhiyun * @fsf_req: request containing abort (might be NULL)
428*4882a593Smuzhiyun */
429*4882a593Smuzhiyun static inline
zfcp_dbf_scsi_abort(char * tag,struct scsi_cmnd * scmd,struct zfcp_fsf_req * fsf_req)430*4882a593Smuzhiyun void zfcp_dbf_scsi_abort(char *tag, struct scsi_cmnd *scmd,
431*4882a593Smuzhiyun struct zfcp_fsf_req *fsf_req)
432*4882a593Smuzhiyun {
433*4882a593Smuzhiyun _zfcp_dbf_scsi(tag, 1, scmd, fsf_req);
434*4882a593Smuzhiyun }
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun /**
437*4882a593Smuzhiyun * zfcp_dbf_scsi_devreset() - Trace event for Logical Unit or Target Reset.
438*4882a593Smuzhiyun * @tag: Tag indicating success or failure of reset operation.
439*4882a593Smuzhiyun * @sdev: Pointer to SCSI device as context for this event.
440*4882a593Smuzhiyun * @flag: Indicates type of reset (Target Reset, Logical Unit Reset).
441*4882a593Smuzhiyun * @fsf_req: Pointer to FSF request representing the TMF, or NULL.
442*4882a593Smuzhiyun */
443*4882a593Smuzhiyun static inline
zfcp_dbf_scsi_devreset(char * tag,struct scsi_device * sdev,u8 flag,struct zfcp_fsf_req * fsf_req)444*4882a593Smuzhiyun void zfcp_dbf_scsi_devreset(char *tag, struct scsi_device *sdev, u8 flag,
445*4882a593Smuzhiyun struct zfcp_fsf_req *fsf_req)
446*4882a593Smuzhiyun {
447*4882a593Smuzhiyun struct zfcp_adapter *adapter = (struct zfcp_adapter *)
448*4882a593Smuzhiyun sdev->host->hostdata[0];
449*4882a593Smuzhiyun char tmp_tag[ZFCP_DBF_TAG_LEN];
450*4882a593Smuzhiyun static int const level = 1;
451*4882a593Smuzhiyun
452*4882a593Smuzhiyun if (unlikely(!debug_level_enabled(adapter->dbf->scsi, level)))
453*4882a593Smuzhiyun return;
454*4882a593Smuzhiyun
455*4882a593Smuzhiyun if (flag == FCP_TMF_TGT_RESET)
456*4882a593Smuzhiyun memcpy(tmp_tag, "tr_", 3);
457*4882a593Smuzhiyun else
458*4882a593Smuzhiyun memcpy(tmp_tag, "lr_", 3);
459*4882a593Smuzhiyun
460*4882a593Smuzhiyun memcpy(&tmp_tag[3], tag, 4);
461*4882a593Smuzhiyun zfcp_dbf_scsi_common(tmp_tag, level, sdev, NULL, fsf_req);
462*4882a593Smuzhiyun }
463*4882a593Smuzhiyun
464*4882a593Smuzhiyun /**
465*4882a593Smuzhiyun * zfcp_dbf_scsi_nullcmnd() - trace NULLify of SCSI command in dev/tgt-reset.
466*4882a593Smuzhiyun * @scmnd: SCSI command that was NULLified.
467*4882a593Smuzhiyun * @fsf_req: request that owned @scmnd.
468*4882a593Smuzhiyun */
zfcp_dbf_scsi_nullcmnd(struct scsi_cmnd * scmnd,struct zfcp_fsf_req * fsf_req)469*4882a593Smuzhiyun static inline void zfcp_dbf_scsi_nullcmnd(struct scsi_cmnd *scmnd,
470*4882a593Smuzhiyun struct zfcp_fsf_req *fsf_req)
471*4882a593Smuzhiyun {
472*4882a593Smuzhiyun _zfcp_dbf_scsi("scfc__1", 3, scmnd, fsf_req);
473*4882a593Smuzhiyun }
474*4882a593Smuzhiyun
475*4882a593Smuzhiyun #endif /* ZFCP_DBF_H */
476