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