xref: /OK3568_Linux_fs/kernel/drivers/s390/scsi/zfcp_dbf.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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