zfcp_dbf.h 13 KB

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