Commit | Line | Data |
---|---|---|
2b604c9b | 1 | /* |
a54ca0f6 SS |
2 | * zfcp device driver |
3 | * debug feature declarations | |
2b604c9b | 4 | * |
a54ca0f6 | 5 | * Copyright IBM Corp. 2008, 2010 |
2b604c9b CS |
6 | */ |
7 | ||
8 | #ifndef ZFCP_DBF_H | |
9 | #define ZFCP_DBF_H | |
10 | ||
4318e08c | 11 | #include <scsi/fc/fc_fcp.h> |
dcd20e23 | 12 | #include "zfcp_ext.h" |
2b604c9b | 13 | #include "zfcp_fsf.h" |
dcd20e23 | 14 | #include "zfcp_def.h" |
2b604c9b | 15 | |
ae0904f6 | 16 | #define ZFCP_DBF_TAG_LEN 7 |
2b604c9b | 17 | |
d21e9daa CS |
18 | #define ZFCP_DBF_INVALID_LUN 0xFFFFFFFFFFFFFFFFull |
19 | ||
ae0904f6 SS |
20 | /** |
21 | * struct zfcp_dbf_rec_trigger - trace record for triggered recovery action | |
22 | * @ready: number of ready recovery actions | |
23 | * @running: number of running recovery actions | |
24 | * @want: wanted recovery action | |
25 | * @need: needed recovery action | |
26 | */ | |
27 | struct zfcp_dbf_rec_trigger { | |
2b604c9b CS |
28 | u32 ready; |
29 | u32 running; | |
2b604c9b CS |
30 | u8 want; |
31 | u8 need; | |
ae0904f6 SS |
32 | } __packed; |
33 | ||
34 | /** | |
35 | * struct zfcp_dbf_rec_running - trace record for running recovery | |
36 | * @fsf_req_id: request id for fsf requests | |
37 | * @rec_status: status of the fsf request | |
38 | * @rec_step: current step of the recovery action | |
39 | * rec_count: recovery counter | |
40 | */ | |
41 | struct zfcp_dbf_rec_running { | |
42 | u64 fsf_req_id; | |
43 | u32 rec_status; | |
44 | u16 rec_step; | |
45 | u8 rec_action; | |
46 | u8 rec_count; | |
47 | } __packed; | |
2b604c9b | 48 | |
ae0904f6 SS |
49 | /** |
50 | * enum zfcp_dbf_rec_id - recovery trace record id | |
51 | * @ZFCP_DBF_REC_TRIG: triggered recovery identifier | |
52 | * @ZFCP_DBF_REC_RUN: running recovery identifier | |
53 | */ | |
54 | enum zfcp_dbf_rec_id { | |
55 | ZFCP_DBF_REC_TRIG = 1, | |
56 | ZFCP_DBF_REC_RUN = 2, | |
7337891f | 57 | }; |
2b604c9b | 58 | |
ae0904f6 SS |
59 | /** |
60 | * struct zfcp_dbf_rec - trace record for error recovery actions | |
61 | * @id: unique number of recovery record type | |
62 | * @tag: identifier string specifying the location of initiation | |
63 | * @lun: logical unit number | |
64 | * @wwpn: word wide port number | |
65 | * @d_id: destination ID | |
66 | * @adapter_status: current status of the adapter | |
67 | * @port_status: current status of the port | |
68 | * @lun_status: current status of the lun | |
69 | * @u.trig: structure zfcp_dbf_rec_trigger | |
70 | * @u.run: structure zfcp_dbf_rec_running | |
71 | */ | |
72 | struct zfcp_dbf_rec { | |
2b604c9b | 73 | u8 id; |
ae0904f6 SS |
74 | char tag[ZFCP_DBF_TAG_LEN]; |
75 | u64 lun; | |
76 | u64 wwpn; | |
77 | u32 d_id; | |
78 | u32 adapter_status; | |
79 | u32 port_status; | |
80 | u32 lun_status; | |
2b604c9b | 81 | union { |
ae0904f6 SS |
82 | struct zfcp_dbf_rec_trigger trig; |
83 | struct zfcp_dbf_rec_running run; | |
2b604c9b | 84 | } u; |
ae0904f6 | 85 | } __packed; |
2b604c9b | 86 | |
2c55b750 SS |
87 | /** |
88 | * enum zfcp_dbf_san_id - SAN trace record identifier | |
89 | * @ZFCP_DBF_SAN_REQ: request trace record id | |
90 | * @ZFCP_DBF_SAN_RES: response trace record id | |
91 | * @ZFCP_DBF_SAN_ELS: extended link service record id | |
92 | */ | |
93 | enum zfcp_dbf_san_id { | |
94 | ZFCP_DBF_SAN_REQ = 1, | |
95 | ZFCP_DBF_SAN_RES = 2, | |
96 | ZFCP_DBF_SAN_ELS = 3, | |
97 | }; | |
98 | ||
99 | /** struct zfcp_dbf_san - trace record for SAN requests and responses | |
100 | * @id: unique number of recovery record type | |
101 | * @tag: identifier string specifying the location of initiation | |
102 | * @fsf_req_id: request id for fsf requests | |
103 | * @payload: unformatted information related to request/response | |
104 | * @d_id: destination id | |
105 | */ | |
106 | struct zfcp_dbf_san { | |
107 | u8 id; | |
108 | char tag[ZFCP_DBF_TAG_LEN]; | |
109 | u64 fsf_req_id; | |
110 | u32 d_id; | |
111 | #define ZFCP_DBF_SAN_MAX_PAYLOAD (FC_CT_HDR_LEN + 32) | |
112 | char payload[ZFCP_DBF_SAN_MAX_PAYLOAD]; | |
113 | } __packed; | |
114 | ||
a54ca0f6 SS |
115 | /** |
116 | * struct zfcp_dbf_hba_res - trace record for hba responses | |
117 | * @req_issued: timestamp when request was issued | |
118 | * @prot_status: protocol status | |
119 | * @prot_status_qual: protocol status qualifier | |
120 | * @fsf_status: fsf status | |
121 | * @fsf_status_qual: fsf status qualifier | |
122 | */ | |
123 | struct zfcp_dbf_hba_res { | |
124 | u64 req_issued; | |
125 | u32 prot_status; | |
126 | u8 prot_status_qual[FSF_PROT_STATUS_QUAL_SIZE]; | |
2b604c9b | 127 | u32 fsf_status; |
a54ca0f6 SS |
128 | u8 fsf_status_qual[FSF_STATUS_QUALIFIER_SIZE]; |
129 | } __packed; | |
2b604c9b | 130 | |
a54ca0f6 SS |
131 | /** |
132 | * struct zfcp_dbf_hba_uss - trace record for unsolicited status | |
133 | * @status_type: type of unsolicited status | |
134 | * @status_subtype: subtype of unsolicited status | |
135 | * @d_id: destination ID | |
136 | * @lun: logical unit number | |
137 | * @queue_designator: queue designator | |
138 | */ | |
139 | struct zfcp_dbf_hba_uss { | |
2b604c9b CS |
140 | u32 status_type; |
141 | u32 status_subtype; | |
a54ca0f6 SS |
142 | u32 d_id; |
143 | u64 lun; | |
144 | u64 queue_designator; | |
145 | } __packed; | |
2b604c9b | 146 | |
a54ca0f6 SS |
147 | /** |
148 | * enum zfcp_dbf_hba_id - HBA trace record identifier | |
149 | * @ZFCP_DBF_HBA_RES: response trace record | |
150 | * @ZFCP_DBF_HBA_USS: unsolicited status trace record | |
151 | * @ZFCP_DBF_HBA_BIT: bit error trace record | |
152 | */ | |
153 | enum zfcp_dbf_hba_id { | |
154 | ZFCP_DBF_HBA_RES = 1, | |
155 | ZFCP_DBF_HBA_USS = 2, | |
156 | ZFCP_DBF_HBA_BIT = 3, | |
cb452149 | 157 | ZFCP_DBF_HBA_BASIC = 4, |
a54ca0f6 | 158 | }; |
2b604c9b | 159 | |
a54ca0f6 SS |
160 | /** |
161 | * struct zfcp_dbf_hba - common trace record for HBA records | |
162 | * @id: unique number of recovery record type | |
163 | * @tag: identifier string specifying the location of initiation | |
164 | * @fsf_req_id: request id for fsf requests | |
165 | * @fsf_req_status: status of fsf request | |
166 | * @fsf_cmd: fsf command | |
167 | * @fsf_seq_no: fsf sequence number | |
168 | * @pl_len: length of payload stored as zfcp_dbf_pay | |
169 | * @u: record type specific data | |
170 | */ | |
171 | struct zfcp_dbf_hba { | |
172 | u8 id; | |
173 | char tag[ZFCP_DBF_TAG_LEN]; | |
174 | u64 fsf_req_id; | |
175 | u32 fsf_req_status; | |
176 | u32 fsf_cmd; | |
177 | u32 fsf_seq_no; | |
178 | u16 pl_len; | |
2b604c9b | 179 | union { |
a54ca0f6 SS |
180 | struct zfcp_dbf_hba_res res; |
181 | struct zfcp_dbf_hba_uss uss; | |
182 | struct fsf_bit_error_payload be; | |
6bc473dd | 183 | } u; |
a54ca0f6 SS |
184 | } __packed; |
185 | ||
250a1352 SS |
186 | /** |
187 | * enum zfcp_dbf_scsi_id - scsi trace record identifier | |
188 | * @ZFCP_DBF_SCSI_CMND: scsi command trace record | |
189 | */ | |
190 | enum zfcp_dbf_scsi_id { | |
191 | ZFCP_DBF_SCSI_CMND = 1, | |
192 | }; | |
193 | ||
194 | /** | |
195 | * struct zfcp_dbf_scsi - common trace record for SCSI records | |
196 | * @id: unique number of recovery record type | |
197 | * @tag: identifier string specifying the location of initiation | |
198 | * @scsi_id: scsi device id | |
199 | * @scsi_lun: scsi device logical unit number | |
200 | * @scsi_result: scsi result | |
201 | * @scsi_retries: current retry number of scsi request | |
202 | * @scsi_allowed: allowed retries | |
203 | * @fcp_rsp_info: FCP response info | |
204 | * @scsi_opcode: scsi opcode | |
205 | * @fsf_req_id: request id of fsf request | |
206 | * @host_scribble: LLD specific data attached to SCSI request | |
207 | * @pl_len: length of paload stored as zfcp_dbf_pay | |
208 | * @fsf_rsp: response for fsf request | |
209 | */ | |
210 | struct zfcp_dbf_scsi { | |
211 | u8 id; | |
212 | char tag[ZFCP_DBF_TAG_LEN]; | |
213 | u32 scsi_id; | |
214 | u32 scsi_lun; | |
215 | u32 scsi_result; | |
216 | u8 scsi_retries; | |
217 | u8 scsi_allowed; | |
218 | u8 fcp_rsp_info; | |
219 | #define ZFCP_DBF_SCSI_OPCODE 16 | |
220 | u8 scsi_opcode[ZFCP_DBF_SCSI_OPCODE]; | |
221 | u64 fsf_req_id; | |
222 | u64 host_scribble; | |
223 | u16 pl_len; | |
224 | struct fcp_resp_with_ext fcp_rsp; | |
225 | } __packed; | |
226 | ||
a54ca0f6 SS |
227 | /** |
228 | * struct zfcp_dbf_pay - trace record for unformatted payload information | |
229 | * @area: area this record is originated from | |
230 | * @counter: ascending record number | |
231 | * @fsf_req_id: request id of fsf request | |
232 | * @data: unformatted data | |
233 | */ | |
234 | struct zfcp_dbf_pay { | |
ea4a3a6a | 235 | u8 counter; |
a54ca0f6 | 236 | char area[ZFCP_DBF_TAG_LEN]; |
a54ca0f6 SS |
237 | u64 fsf_req_id; |
238 | #define ZFCP_DBF_PAY_MAX_REC 0x100 | |
239 | char data[ZFCP_DBF_PAY_MAX_REC]; | |
240 | } __packed; | |
2b604c9b | 241 | |
ea4a3a6a SS |
242 | /** |
243 | * struct zfcp_dbf - main dbf trace structure | |
244 | * @pay: reference to payload trace area | |
245 | * @rec: reference to recovery trace area | |
246 | * @hba: reference to hba trace area | |
247 | * @san: reference to san trace area | |
248 | * @scsi: reference to scsi trace area | |
249 | * @pay_lock: lock protecting payload trace buffer | |
250 | * @rec_lock: lock protecting recovery trace buffer | |
251 | * @hba_lock: lock protecting hba trace buffer | |
252 | * @san_lock: lock protecting san trace buffer | |
253 | * @scsi_lock: lock protecting scsi trace buffer | |
254 | * @pay_buf: pre-allocated buffer for payload | |
255 | * @rec_buf: pre-allocated buffer for recovery | |
256 | * @hba_buf: pre-allocated buffer for hba | |
257 | * @san_buf: pre-allocated buffer for san | |
258 | * @scsi_buf: pre-allocated buffer for scsi | |
259 | */ | |
d46f384a | 260 | struct zfcp_dbf { |
a54ca0f6 | 261 | debug_info_t *pay; |
5771710b SS |
262 | debug_info_t *rec; |
263 | debug_info_t *hba; | |
264 | debug_info_t *san; | |
265 | debug_info_t *scsi; | |
a54ca0f6 | 266 | spinlock_t pay_lock; |
5771710b SS |
267 | spinlock_t rec_lock; |
268 | spinlock_t hba_lock; | |
269 | spinlock_t san_lock; | |
270 | spinlock_t scsi_lock; | |
ea4a3a6a | 271 | struct zfcp_dbf_pay pay_buf; |
ae0904f6 | 272 | struct zfcp_dbf_rec rec_buf; |
a54ca0f6 | 273 | struct zfcp_dbf_hba hba_buf; |
2c55b750 | 274 | struct zfcp_dbf_san san_buf; |
250a1352 | 275 | struct zfcp_dbf_scsi scsi_buf; |
d46f384a CS |
276 | }; |
277 | ||
2e261af8 | 278 | static inline |
a54ca0f6 | 279 | void zfcp_dbf_hba_fsf_resp(char *tag, int level, struct zfcp_fsf_req *req) |
2e261af8 | 280 | { |
a54ca0f6 SS |
281 | if (level <= req->adapter->dbf->hba->level) |
282 | zfcp_dbf_hba_fsf_res(tag, req); | |
2e261af8 CS |
283 | } |
284 | ||
285 | /** | |
5771710b | 286 | * zfcp_dbf_hba_fsf_response - trace event for request completion |
250a1352 | 287 | * @req: request that has been completed |
2e261af8 | 288 | */ |
a54ca0f6 SS |
289 | static inline |
290 | void zfcp_dbf_hba_fsf_response(struct zfcp_fsf_req *req) | |
2e261af8 | 291 | { |
2e261af8 CS |
292 | struct fsf_qtcb *qtcb = req->qtcb; |
293 | ||
294 | if ((qtcb->prefix.prot_status != FSF_PROT_GOOD) && | |
295 | (qtcb->prefix.prot_status != FSF_PROT_FSF_STATUS_PRESENTED)) { | |
a54ca0f6 | 296 | zfcp_dbf_hba_fsf_resp("fs_perr", 1, req); |
2e261af8 CS |
297 | |
298 | } else if (qtcb->header.fsf_status != FSF_GOOD) { | |
a54ca0f6 | 299 | zfcp_dbf_hba_fsf_resp("fs_ferr", 1, req); |
2e261af8 CS |
300 | |
301 | } else if ((req->fsf_command == FSF_QTCB_OPEN_PORT_WITH_DID) || | |
302 | (req->fsf_command == FSF_QTCB_OPEN_LUN)) { | |
a54ca0f6 | 303 | zfcp_dbf_hba_fsf_resp("fs_open", 4, req); |
2e261af8 CS |
304 | |
305 | } else if (qtcb->header.log_length) { | |
a54ca0f6 | 306 | zfcp_dbf_hba_fsf_resp("fs_qtcb", 5, req); |
2e261af8 CS |
307 | |
308 | } else { | |
a54ca0f6 | 309 | zfcp_dbf_hba_fsf_resp("fs_norm", 6, req); |
2e261af8 | 310 | } |
2e261af8 CS |
311 | } |
312 | ||
dcd20e23 | 313 | static inline |
250a1352 SS |
314 | void _zfcp_dbf_scsi(char *tag, int level, struct scsi_cmnd *scmd, |
315 | struct zfcp_fsf_req *req) | |
dcd20e23 | 316 | { |
250a1352 SS |
317 | struct zfcp_adapter *adapter = (struct zfcp_adapter *) |
318 | scmd->device->host->hostdata[0]; | |
319 | ||
320 | if (level <= adapter->dbf->scsi->level) | |
321 | zfcp_dbf_scsi(tag, scmd, req); | |
dcd20e23 CS |
322 | } |
323 | ||
324 | /** | |
5771710b | 325 | * zfcp_dbf_scsi_result - trace event for SCSI command completion |
dcd20e23 | 326 | * @scmd: SCSI command pointer |
ab72528a | 327 | * @req: FSF request used to issue SCSI command |
dcd20e23 CS |
328 | */ |
329 | static inline | |
250a1352 | 330 | void zfcp_dbf_scsi_result(struct scsi_cmnd *scmd, struct zfcp_fsf_req *req) |
dcd20e23 | 331 | { |
ab72528a | 332 | if (scmd->result != 0) |
250a1352 | 333 | _zfcp_dbf_scsi("rsl_err", 3, scmd, req); |
ab72528a | 334 | else if (scmd->retries > 0) |
250a1352 | 335 | _zfcp_dbf_scsi("rsl_ret", 4, scmd, req); |
ab72528a | 336 | else |
250a1352 | 337 | _zfcp_dbf_scsi("rsl_nor", 6, scmd, req); |
ab72528a CS |
338 | } |
339 | ||
340 | /** | |
341 | * zfcp_dbf_scsi_fail_send - trace event for failure to send SCSI command | |
ab72528a CS |
342 | * @scmd: SCSI command pointer |
343 | */ | |
344 | static inline | |
250a1352 | 345 | void zfcp_dbf_scsi_fail_send(struct scsi_cmnd *scmd) |
ab72528a | 346 | { |
250a1352 | 347 | _zfcp_dbf_scsi("rsl_fai", 4, scmd, NULL); |
dcd20e23 CS |
348 | } |
349 | ||
350 | /** | |
5771710b | 351 | * zfcp_dbf_scsi_abort - trace event for SCSI command abort |
dcd20e23 | 352 | * @tag: tag indicating success or failure of abort operation |
dcd20e23 | 353 | * @scmd: SCSI command to be aborted |
250a1352 | 354 | * @fsf_req: request containing abort (might be NULL) |
dcd20e23 CS |
355 | */ |
356 | static inline | |
250a1352 SS |
357 | void zfcp_dbf_scsi_abort(char *tag, struct scsi_cmnd *scmd, |
358 | struct zfcp_fsf_req *fsf_req) | |
dcd20e23 | 359 | { |
250a1352 | 360 | _zfcp_dbf_scsi(tag, 1, scmd, fsf_req); |
dcd20e23 CS |
361 | } |
362 | ||
363 | /** | |
5771710b | 364 | * zfcp_dbf_scsi_devreset - trace event for Logical Unit or Target Reset |
dcd20e23 | 365 | * @tag: tag indicating success or failure of reset operation |
b62a8d9b | 366 | * @scmnd: SCSI command which caused this error recovery |
dcd20e23 | 367 | * @flag: indicates type of reset (Target Reset, Logical Unit Reset) |
dcd20e23 CS |
368 | */ |
369 | static inline | |
250a1352 | 370 | void zfcp_dbf_scsi_devreset(char *tag, struct scsi_cmnd *scmnd, u8 flag) |
dcd20e23 | 371 | { |
250a1352 SS |
372 | char tmp_tag[ZFCP_DBF_TAG_LEN]; |
373 | ||
374 | if (flag == FCP_TMF_TGT_RESET) | |
375 | memcpy(tmp_tag, "tr_", 3); | |
376 | else | |
377 | memcpy(tmp_tag, "lr_", 3); | |
b62a8d9b | 378 | |
250a1352 SS |
379 | memcpy(&tmp_tag[3], tag, 4); |
380 | _zfcp_dbf_scsi(tmp_tag, 1, scmnd, NULL); | |
dcd20e23 CS |
381 | } |
382 | ||
2b604c9b | 383 | #endif /* ZFCP_DBF_H */ |