zfcp_dbf.h 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. /*
  2. * zfcp device driver
  3. * debug feature declarations
  4. *
  5. * Copyright IBM Corp. 2008, 2010
  6. */
  7. #ifndef ZFCP_DBF_H
  8. #define ZFCP_DBF_H
  9. #include <scsi/fc/fc_fcp.h>
  10. #include "zfcp_ext.h"
  11. #include "zfcp_fsf.h"
  12. #include "zfcp_def.h"
  13. #define ZFCP_DBF_TAG_LEN 7
  14. #define ZFCP_DBF_TAG_SIZE 4
  15. #define ZFCP_DBF_ID_SIZE 7
  16. #define ZFCP_DBF_INVALID_LUN 0xFFFFFFFFFFFFFFFFull
  17. struct zfcp_dbf_dump {
  18. u8 tag[ZFCP_DBF_TAG_SIZE];
  19. u32 total_size; /* size of total dump data */
  20. u32 offset; /* how much data has being already dumped */
  21. u32 size; /* how much data comes with this record */
  22. u8 data[]; /* dump data */
  23. } __attribute__ ((packed));
  24. /**
  25. * struct zfcp_dbf_rec_trigger - trace record for triggered recovery action
  26. * @ready: number of ready recovery actions
  27. * @running: number of running recovery actions
  28. * @want: wanted recovery action
  29. * @need: needed recovery action
  30. */
  31. struct zfcp_dbf_rec_trigger {
  32. u32 ready;
  33. u32 running;
  34. u8 want;
  35. u8 need;
  36. } __packed;
  37. /**
  38. * struct zfcp_dbf_rec_running - trace record for running recovery
  39. * @fsf_req_id: request id for fsf requests
  40. * @rec_status: status of the fsf request
  41. * @rec_step: current step of the recovery action
  42. * rec_count: recovery counter
  43. */
  44. struct zfcp_dbf_rec_running {
  45. u64 fsf_req_id;
  46. u32 rec_status;
  47. u16 rec_step;
  48. u8 rec_action;
  49. u8 rec_count;
  50. } __packed;
  51. /**
  52. * enum zfcp_dbf_rec_id - recovery trace record id
  53. * @ZFCP_DBF_REC_TRIG: triggered recovery identifier
  54. * @ZFCP_DBF_REC_RUN: running recovery identifier
  55. */
  56. enum zfcp_dbf_rec_id {
  57. ZFCP_DBF_REC_TRIG = 1,
  58. ZFCP_DBF_REC_RUN = 2,
  59. };
  60. /**
  61. * struct zfcp_dbf_rec - trace record for error recovery actions
  62. * @id: unique number of recovery record type
  63. * @tag: identifier string specifying the location of initiation
  64. * @lun: logical unit number
  65. * @wwpn: word wide port number
  66. * @d_id: destination ID
  67. * @adapter_status: current status of the adapter
  68. * @port_status: current status of the port
  69. * @lun_status: current status of the lun
  70. * @u.trig: structure zfcp_dbf_rec_trigger
  71. * @u.run: structure zfcp_dbf_rec_running
  72. */
  73. struct zfcp_dbf_rec {
  74. u8 id;
  75. char tag[ZFCP_DBF_TAG_LEN];
  76. u64 lun;
  77. u64 wwpn;
  78. u32 d_id;
  79. u32 adapter_status;
  80. u32 port_status;
  81. u32 lun_status;
  82. union {
  83. struct zfcp_dbf_rec_trigger trig;
  84. struct zfcp_dbf_rec_running run;
  85. } u;
  86. } __packed;
  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. /** struct zfcp_dbf_san - trace record for SAN requests and responses
  99. * @id: unique number of recovery record type
  100. * @tag: identifier string specifying the location of initiation
  101. * @fsf_req_id: request id for fsf requests
  102. * @payload: unformatted information related to request/response
  103. * @d_id: destination id
  104. */
  105. struct zfcp_dbf_san {
  106. u8 id;
  107. char tag[ZFCP_DBF_TAG_LEN];
  108. u64 fsf_req_id;
  109. u32 d_id;
  110. #define ZFCP_DBF_SAN_MAX_PAYLOAD (FC_CT_HDR_LEN + 32)
  111. char payload[ZFCP_DBF_SAN_MAX_PAYLOAD];
  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. */
  121. struct zfcp_dbf_hba_res {
  122. u64 req_issued;
  123. u32 prot_status;
  124. u8 prot_status_qual[FSF_PROT_STATUS_QUAL_SIZE];
  125. u32 fsf_status;
  126. u8 fsf_status_qual[FSF_STATUS_QUALIFIER_SIZE];
  127. } __packed;
  128. /**
  129. * struct zfcp_dbf_hba_uss - trace record for unsolicited status
  130. * @status_type: type of unsolicited status
  131. * @status_subtype: subtype of unsolicited status
  132. * @d_id: destination ID
  133. * @lun: logical unit number
  134. * @queue_designator: queue designator
  135. */
  136. struct zfcp_dbf_hba_uss {
  137. u32 status_type;
  138. u32 status_subtype;
  139. u32 d_id;
  140. u64 lun;
  141. u64 queue_designator;
  142. } __packed;
  143. /**
  144. * enum zfcp_dbf_hba_id - HBA trace record identifier
  145. * @ZFCP_DBF_HBA_RES: response trace record
  146. * @ZFCP_DBF_HBA_USS: unsolicited status trace record
  147. * @ZFCP_DBF_HBA_BIT: bit error trace record
  148. */
  149. enum zfcp_dbf_hba_id {
  150. ZFCP_DBF_HBA_RES = 1,
  151. ZFCP_DBF_HBA_USS = 2,
  152. ZFCP_DBF_HBA_BIT = 3,
  153. };
  154. /**
  155. * struct zfcp_dbf_hba - common trace record for HBA records
  156. * @id: unique number of recovery record type
  157. * @tag: identifier string specifying the location of initiation
  158. * @fsf_req_id: request id for fsf requests
  159. * @fsf_req_status: status of fsf request
  160. * @fsf_cmd: fsf command
  161. * @fsf_seq_no: fsf sequence number
  162. * @pl_len: length of payload stored as zfcp_dbf_pay
  163. * @u: record type specific data
  164. */
  165. struct zfcp_dbf_hba {
  166. u8 id;
  167. char tag[ZFCP_DBF_TAG_LEN];
  168. u64 fsf_req_id;
  169. u32 fsf_req_status;
  170. u32 fsf_cmd;
  171. u32 fsf_seq_no;
  172. u16 pl_len;
  173. union {
  174. struct zfcp_dbf_hba_res res;
  175. struct zfcp_dbf_hba_uss uss;
  176. struct fsf_bit_error_payload be;
  177. } u;
  178. } __packed;
  179. /**
  180. * struct zfcp_dbf_pay - trace record for unformatted payload information
  181. * @area: area this record is originated from
  182. * @counter: ascending record number
  183. * @fsf_req_id: request id of fsf request
  184. * @data: unformatted data
  185. */
  186. struct zfcp_dbf_pay {
  187. char area[ZFCP_DBF_TAG_LEN];
  188. char counter;
  189. u64 fsf_req_id;
  190. #define ZFCP_DBF_PAY_MAX_REC 0x100
  191. char data[ZFCP_DBF_PAY_MAX_REC];
  192. } __packed;
  193. struct zfcp_dbf_scsi_record {
  194. u8 tag[ZFCP_DBF_TAG_SIZE];
  195. u8 tag2[ZFCP_DBF_TAG_SIZE];
  196. u32 scsi_id;
  197. u32 scsi_lun;
  198. u32 scsi_result;
  199. u64 scsi_cmnd;
  200. #define ZFCP_DBF_SCSI_OPCODE 16
  201. u8 scsi_opcode[ZFCP_DBF_SCSI_OPCODE];
  202. u8 scsi_retries;
  203. u8 scsi_allowed;
  204. u64 fsf_reqid;
  205. u32 fsf_seqno;
  206. u64 fsf_issued;
  207. u64 old_fsf_reqid;
  208. u8 rsp_validity;
  209. u8 rsp_scsi_status;
  210. u32 rsp_resid;
  211. u8 rsp_code;
  212. #define ZFCP_DBF_SCSI_FCP_SNS_INFO 16
  213. #define ZFCP_DBF_SCSI_MAX_FCP_SNS_INFO 256
  214. u32 sns_info_len;
  215. u8 sns_info[ZFCP_DBF_SCSI_FCP_SNS_INFO];
  216. } __attribute__ ((packed));
  217. struct zfcp_dbf {
  218. debug_info_t *pay;
  219. debug_info_t *rec;
  220. debug_info_t *hba;
  221. debug_info_t *san;
  222. debug_info_t *scsi;
  223. spinlock_t pay_lock;
  224. spinlock_t rec_lock;
  225. spinlock_t hba_lock;
  226. spinlock_t san_lock;
  227. spinlock_t scsi_lock;
  228. struct zfcp_dbf_rec rec_buf;
  229. struct zfcp_dbf_hba hba_buf;
  230. struct zfcp_dbf_san san_buf;
  231. struct zfcp_dbf_scsi_record scsi_buf;
  232. struct zfcp_dbf_pay pay_buf;
  233. struct zfcp_adapter *adapter;
  234. };
  235. static inline
  236. void zfcp_dbf_hba_fsf_resp(char *tag, int level, struct zfcp_fsf_req *req)
  237. {
  238. if (level <= req->adapter->dbf->hba->level)
  239. zfcp_dbf_hba_fsf_res(tag, req);
  240. }
  241. /**
  242. * zfcp_dbf_hba_fsf_response - trace event for request completion
  243. * @fsf_req: request that has been completed
  244. */
  245. static inline
  246. void zfcp_dbf_hba_fsf_response(struct zfcp_fsf_req *req)
  247. {
  248. struct fsf_qtcb *qtcb = req->qtcb;
  249. if ((qtcb->prefix.prot_status != FSF_PROT_GOOD) &&
  250. (qtcb->prefix.prot_status != FSF_PROT_FSF_STATUS_PRESENTED)) {
  251. zfcp_dbf_hba_fsf_resp("fs_perr", 1, req);
  252. } else if (qtcb->header.fsf_status != FSF_GOOD) {
  253. zfcp_dbf_hba_fsf_resp("fs_ferr", 1, req);
  254. } else if ((req->fsf_command == FSF_QTCB_OPEN_PORT_WITH_DID) ||
  255. (req->fsf_command == FSF_QTCB_OPEN_LUN)) {
  256. zfcp_dbf_hba_fsf_resp("fs_open", 4, req);
  257. } else if (qtcb->header.log_length) {
  258. zfcp_dbf_hba_fsf_resp("fs_qtcb", 5, req);
  259. } else {
  260. zfcp_dbf_hba_fsf_resp("fs_norm", 6, req);
  261. }
  262. }
  263. static inline
  264. void zfcp_dbf_scsi(const char *tag, const char *tag2, int level,
  265. struct zfcp_dbf *dbf, struct scsi_cmnd *scmd,
  266. struct zfcp_fsf_req *req, unsigned long old_id)
  267. {
  268. if (level <= dbf->scsi->level)
  269. _zfcp_dbf_scsi(tag, tag2, level, dbf, scmd, req, old_id);
  270. }
  271. /**
  272. * zfcp_dbf_scsi_result - trace event for SCSI command completion
  273. * @dbf: adapter dbf trace
  274. * @scmd: SCSI command pointer
  275. * @req: FSF request used to issue SCSI command
  276. */
  277. static inline
  278. void zfcp_dbf_scsi_result(struct zfcp_dbf *dbf, struct scsi_cmnd *scmd,
  279. struct zfcp_fsf_req *req)
  280. {
  281. if (scmd->result != 0)
  282. zfcp_dbf_scsi("rslt", "erro", 3, dbf, scmd, req, 0);
  283. else if (scmd->retries > 0)
  284. zfcp_dbf_scsi("rslt", "retr", 4, dbf, scmd, req, 0);
  285. else
  286. zfcp_dbf_scsi("rslt", "norm", 6, dbf, scmd, req, 0);
  287. }
  288. /**
  289. * zfcp_dbf_scsi_fail_send - trace event for failure to send SCSI command
  290. * @dbf: adapter dbf trace
  291. * @scmd: SCSI command pointer
  292. */
  293. static inline
  294. void zfcp_dbf_scsi_fail_send(struct zfcp_dbf *dbf, struct scsi_cmnd *scmd)
  295. {
  296. zfcp_dbf_scsi("rslt", "fail", 4, dbf, scmd, NULL, 0);
  297. }
  298. /**
  299. * zfcp_dbf_scsi_abort - trace event for SCSI command abort
  300. * @tag: tag indicating success or failure of abort operation
  301. * @adapter: adapter thas has been used to issue SCSI command to be aborted
  302. * @scmd: SCSI command to be aborted
  303. * @new_req: request containing abort (might be NULL)
  304. * @old_id: identifier of request containg SCSI command to be aborted
  305. */
  306. static inline
  307. void zfcp_dbf_scsi_abort(const char *tag, struct zfcp_dbf *dbf,
  308. struct scsi_cmnd *scmd, struct zfcp_fsf_req *new_req,
  309. unsigned long old_id)
  310. {
  311. zfcp_dbf_scsi("abrt", tag, 1, dbf, scmd, new_req, old_id);
  312. }
  313. /**
  314. * zfcp_dbf_scsi_devreset - trace event for Logical Unit or Target Reset
  315. * @tag: tag indicating success or failure of reset operation
  316. * @scmnd: SCSI command which caused this error recovery
  317. * @flag: indicates type of reset (Target Reset, Logical Unit Reset)
  318. */
  319. static inline
  320. void zfcp_dbf_scsi_devreset(const char *tag, struct scsi_cmnd *scmnd, u8 flag)
  321. {
  322. struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(scmnd->device);
  323. zfcp_dbf_scsi(flag == FCP_TMF_TGT_RESET ? "trst" : "lrst", tag, 1,
  324. zfcp_sdev->port->adapter->dbf, scmnd, NULL, 0);
  325. }
  326. #endif /* ZFCP_DBF_H */