lpfc_debugfs.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687
  1. /*******************************************************************
  2. * This file is part of the Emulex Linux Device Driver for *
  3. * Fibre Channel Host Bus Adapters. *
  4. * Copyright (C) 2007-2011 Emulex. All rights reserved. *
  5. * EMULEX and SLI are trademarks of Emulex. *
  6. * www.emulex.com *
  7. * *
  8. * This program is free software; you can redistribute it and/or *
  9. * modify it under the terms of version 2 of the GNU General *
  10. * Public License as published by the Free Software Foundation. *
  11. * This program is distributed in the hope that it will be useful. *
  12. * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND *
  13. * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, *
  14. * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE *
  15. * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD *
  16. * TO BE LEGALLY INVALID. See the GNU General Public License for *
  17. * more details, a copy of which can be found in the file COPYING *
  18. * included with this package. *
  19. *******************************************************************/
  20. #ifndef _H_LPFC_DEBUG_FS
  21. #define _H_LPFC_DEBUG_FS
  22. #ifdef CONFIG_SCSI_LPFC_DEBUG_FS
  23. /* size of output line, for discovery_trace and slow_ring_trace */
  24. #define LPFC_DEBUG_TRC_ENTRY_SIZE 100
  25. /* nodelist output buffer size */
  26. #define LPFC_NODELIST_SIZE 8192
  27. #define LPFC_NODELIST_ENTRY_SIZE 120
  28. /* dumpHBASlim output buffer size */
  29. #define LPFC_DUMPHBASLIM_SIZE 4096
  30. /* dumpHostSlim output buffer size */
  31. #define LPFC_DUMPHOSTSLIM_SIZE 4096
  32. /* hbqinfo output buffer size */
  33. #define LPFC_HBQINFO_SIZE 8192
  34. /*
  35. * For SLI4 iDiag debugfs diagnostics tool
  36. */
  37. /* pciConf */
  38. #define LPFC_PCI_CFG_BROWSE 0xffff
  39. #define LPFC_PCI_CFG_RD_CMD_ARG 2
  40. #define LPFC_PCI_CFG_WR_CMD_ARG 3
  41. #define LPFC_PCI_CFG_SIZE 4096
  42. #define LPFC_PCI_CFG_RD_SIZE (LPFC_PCI_CFG_SIZE/4)
  43. #define IDIAG_PCICFG_WHERE_INDX 0
  44. #define IDIAG_PCICFG_COUNT_INDX 1
  45. #define IDIAG_PCICFG_VALUE_INDX 2
  46. /* barAcc */
  47. #define LPFC_PCI_BAR_BROWSE 0xffff
  48. #define LPFC_PCI_BAR_RD_CMD_ARG 3
  49. #define LPFC_PCI_BAR_WR_CMD_ARG 3
  50. #define LPFC_PCI_IF0_BAR0_SIZE (1024 * 16)
  51. #define LPFC_PCI_IF0_BAR1_SIZE (1024 * 128)
  52. #define LPFC_PCI_IF0_BAR2_SIZE (1024 * 128)
  53. #define LPFC_PCI_IF2_BAR0_SIZE (1024 * 32)
  54. #define LPFC_PCI_BAR_RD_BUF_SIZE 4096
  55. #define LPFC_PCI_BAR_RD_SIZE (LPFC_PCI_BAR_RD_BUF_SIZE/4)
  56. #define LPFC_PCI_IF0_BAR0_RD_SIZE (LPFC_PCI_IF0_BAR0_SIZE/4)
  57. #define LPFC_PCI_IF0_BAR1_RD_SIZE (LPFC_PCI_IF0_BAR1_SIZE/4)
  58. #define LPFC_PCI_IF0_BAR2_RD_SIZE (LPFC_PCI_IF0_BAR2_SIZE/4)
  59. #define LPFC_PCI_IF2_BAR0_RD_SIZE (LPFC_PCI_IF2_BAR0_SIZE/4)
  60. #define IDIAG_BARACC_BAR_NUM_INDX 0
  61. #define IDIAG_BARACC_OFF_SET_INDX 1
  62. #define IDIAG_BARACC_ACC_MOD_INDX 2
  63. #define IDIAG_BARACC_REG_VAL_INDX 2
  64. #define IDIAG_BARACC_BAR_SZE_INDX 3
  65. #define IDIAG_BARACC_BAR_0 0
  66. #define IDIAG_BARACC_BAR_1 1
  67. #define IDIAG_BARACC_BAR_2 2
  68. #define SINGLE_WORD 1
  69. /* queue info */
  70. #define LPFC_QUE_INFO_GET_BUF_SIZE 4096
  71. /* queue acc */
  72. #define LPFC_QUE_ACC_BROWSE 0xffff
  73. #define LPFC_QUE_ACC_RD_CMD_ARG 4
  74. #define LPFC_QUE_ACC_WR_CMD_ARG 6
  75. #define LPFC_QUE_ACC_BUF_SIZE 4096
  76. #define LPFC_QUE_ACC_SIZE (LPFC_QUE_ACC_BUF_SIZE/2)
  77. #define LPFC_IDIAG_EQ 1
  78. #define LPFC_IDIAG_CQ 2
  79. #define LPFC_IDIAG_MQ 3
  80. #define LPFC_IDIAG_WQ 4
  81. #define LPFC_IDIAG_RQ 5
  82. #define IDIAG_QUEACC_QUETP_INDX 0
  83. #define IDIAG_QUEACC_QUEID_INDX 1
  84. #define IDIAG_QUEACC_INDEX_INDX 2
  85. #define IDIAG_QUEACC_COUNT_INDX 3
  86. #define IDIAG_QUEACC_OFFST_INDX 4
  87. #define IDIAG_QUEACC_VALUE_INDX 5
  88. /* doorbell register acc */
  89. #define LPFC_DRB_ACC_ALL 0xffff
  90. #define LPFC_DRB_ACC_RD_CMD_ARG 1
  91. #define LPFC_DRB_ACC_WR_CMD_ARG 2
  92. #define LPFC_DRB_ACC_BUF_SIZE 256
  93. #define LPFC_DRB_EQCQ 1
  94. #define LPFC_DRB_MQ 2
  95. #define LPFC_DRB_WQ 3
  96. #define LPFC_DRB_RQ 4
  97. #define LPFC_DRB_MAX 4
  98. #define IDIAG_DRBACC_REGID_INDX 0
  99. #define IDIAG_DRBACC_VALUE_INDX 1
  100. /* control register acc */
  101. #define LPFC_CTL_ACC_ALL 0xffff
  102. #define LPFC_CTL_ACC_RD_CMD_ARG 1
  103. #define LPFC_CTL_ACC_WR_CMD_ARG 2
  104. #define LPFC_CTL_ACC_BUF_SIZE 256
  105. #define LPFC_CTL_PORT_SEM 1
  106. #define LPFC_CTL_PORT_STA 2
  107. #define LPFC_CTL_PORT_CTL 3
  108. #define LPFC_CTL_PORT_ER1 4
  109. #define LPFC_CTL_PORT_ER2 5
  110. #define LPFC_CTL_PDEV_CTL 6
  111. #define LPFC_CTL_MAX 6
  112. #define IDIAG_CTLACC_REGID_INDX 0
  113. #define IDIAG_CTLACC_VALUE_INDX 1
  114. /* mailbox access */
  115. #define LPFC_MBX_DMP_ARG 4
  116. #define LPFC_MBX_ACC_BUF_SIZE 512
  117. #define LPFC_MBX_ACC_LBUF_SZ 128
  118. #define LPFC_MBX_DMP_MBX_WORD 0x00000001
  119. #define LPFC_MBX_DMP_MBX_BYTE 0x00000002
  120. #define LPFC_MBX_DMP_MBX_ALL (LPFC_MBX_DMP_MBX_WORD | LPFC_MBX_DMP_MBX_BYTE)
  121. #define LPFC_BSG_DMP_MBX_RD_MBX 0x00000001
  122. #define LPFC_BSG_DMP_MBX_RD_BUF 0x00000002
  123. #define LPFC_BSG_DMP_MBX_WR_MBX 0x00000004
  124. #define LPFC_BSG_DMP_MBX_WR_BUF 0x00000008
  125. #define LPFC_BSG_DMP_MBX_ALL (LPFC_BSG_DMP_MBX_RD_MBX | \
  126. LPFC_BSG_DMP_MBX_RD_BUF | \
  127. LPFC_BSG_DMP_MBX_WR_MBX | \
  128. LPFC_BSG_DMP_MBX_WR_BUF)
  129. #define LPFC_MBX_DMP_ALL 0xffff
  130. #define LPFC_MBX_ALL_CMD 0xff
  131. #define IDIAG_MBXACC_MBCMD_INDX 0
  132. #define IDIAG_MBXACC_DPMAP_INDX 1
  133. #define IDIAG_MBXACC_DPCNT_INDX 2
  134. #define IDIAG_MBXACC_WDCNT_INDX 3
  135. /* extents access */
  136. #define LPFC_EXT_ACC_CMD_ARG 1
  137. #define LPFC_EXT_ACC_BUF_SIZE 4096
  138. #define LPFC_EXT_ACC_AVAIL 0x1
  139. #define LPFC_EXT_ACC_ALLOC 0x2
  140. #define LPFC_EXT_ACC_DRIVR 0x4
  141. #define LPFC_EXT_ACC_ALL (LPFC_EXT_ACC_DRIVR | \
  142. LPFC_EXT_ACC_AVAIL | \
  143. LPFC_EXT_ACC_ALLOC)
  144. #define IDIAG_EXTACC_EXMAP_INDX 0
  145. #define SIZE_U8 sizeof(uint8_t)
  146. #define SIZE_U16 sizeof(uint16_t)
  147. #define SIZE_U32 sizeof(uint32_t)
  148. struct lpfc_debug {
  149. char *i_private;
  150. char op;
  151. #define LPFC_IDIAG_OP_RD 1
  152. #define LPFC_IDIAG_OP_WR 2
  153. char *buffer;
  154. int len;
  155. };
  156. struct lpfc_debugfs_trc {
  157. char *fmt;
  158. uint32_t data1;
  159. uint32_t data2;
  160. uint32_t data3;
  161. uint32_t seq_cnt;
  162. unsigned long jif;
  163. };
  164. struct lpfc_idiag_offset {
  165. uint32_t last_rd;
  166. };
  167. #define LPFC_IDIAG_CMD_DATA_SIZE 8
  168. struct lpfc_idiag_cmd {
  169. uint32_t opcode;
  170. #define LPFC_IDIAG_CMD_PCICFG_RD 0x00000001
  171. #define LPFC_IDIAG_CMD_PCICFG_WR 0x00000002
  172. #define LPFC_IDIAG_CMD_PCICFG_ST 0x00000003
  173. #define LPFC_IDIAG_CMD_PCICFG_CL 0x00000004
  174. #define LPFC_IDIAG_CMD_BARACC_RD 0x00000008
  175. #define LPFC_IDIAG_CMD_BARACC_WR 0x00000009
  176. #define LPFC_IDIAG_CMD_BARACC_ST 0x0000000a
  177. #define LPFC_IDIAG_CMD_BARACC_CL 0x0000000b
  178. #define LPFC_IDIAG_CMD_QUEACC_RD 0x00000011
  179. #define LPFC_IDIAG_CMD_QUEACC_WR 0x00000012
  180. #define LPFC_IDIAG_CMD_QUEACC_ST 0x00000013
  181. #define LPFC_IDIAG_CMD_QUEACC_CL 0x00000014
  182. #define LPFC_IDIAG_CMD_DRBACC_RD 0x00000021
  183. #define LPFC_IDIAG_CMD_DRBACC_WR 0x00000022
  184. #define LPFC_IDIAG_CMD_DRBACC_ST 0x00000023
  185. #define LPFC_IDIAG_CMD_DRBACC_CL 0x00000024
  186. #define LPFC_IDIAG_CMD_CTLACC_RD 0x00000031
  187. #define LPFC_IDIAG_CMD_CTLACC_WR 0x00000032
  188. #define LPFC_IDIAG_CMD_CTLACC_ST 0x00000033
  189. #define LPFC_IDIAG_CMD_CTLACC_CL 0x00000034
  190. #define LPFC_IDIAG_CMD_MBXACC_DP 0x00000041
  191. #define LPFC_IDIAG_BSG_MBXACC_DP 0x00000042
  192. #define LPFC_IDIAG_CMD_EXTACC_RD 0x00000051
  193. uint32_t data[LPFC_IDIAG_CMD_DATA_SIZE];
  194. };
  195. struct lpfc_idiag {
  196. uint32_t active;
  197. struct lpfc_idiag_cmd cmd;
  198. struct lpfc_idiag_offset offset;
  199. void *ptr_private;
  200. };
  201. #endif
  202. /* Mask for discovery_trace */
  203. #define LPFC_DISC_TRC_ELS_CMD 0x1 /* Trace ELS commands */
  204. #define LPFC_DISC_TRC_ELS_RSP 0x2 /* Trace ELS response */
  205. #define LPFC_DISC_TRC_ELS_UNSOL 0x4 /* Trace ELS rcv'ed */
  206. #define LPFC_DISC_TRC_ELS_ALL 0x7 /* Trace ELS */
  207. #define LPFC_DISC_TRC_MBOX_VPORT 0x8 /* Trace vport MBOXs */
  208. #define LPFC_DISC_TRC_MBOX 0x10 /* Trace other MBOXs */
  209. #define LPFC_DISC_TRC_MBOX_ALL 0x18 /* Trace all MBOXs */
  210. #define LPFC_DISC_TRC_CT 0x20 /* Trace disc CT requests */
  211. #define LPFC_DISC_TRC_DSM 0x40 /* Trace DSM events */
  212. #define LPFC_DISC_TRC_RPORT 0x80 /* Trace rport events */
  213. #define LPFC_DISC_TRC_NODE 0x100 /* Trace ndlp state changes */
  214. #define LPFC_DISC_TRC_DISCOVERY 0xef /* common mask for general
  215. * discovery */
  216. #endif /* H_LPFC_DEBUG_FS */
  217. /*
  218. * Driver debug utility routines outside of debugfs. The debug utility
  219. * routines implemented here is intended to be used in the instrumented
  220. * debug driver for debugging host or port issues.
  221. */
  222. /**
  223. * lpfc_debug_dump_qe - dump an specific entry from a queue
  224. * @q: Pointer to the queue descriptor.
  225. * @idx: Index to the entry on the queue.
  226. *
  227. * This function dumps an entry indexed by @idx from a queue specified by the
  228. * queue descriptor @q.
  229. **/
  230. static inline void
  231. lpfc_debug_dump_qe(struct lpfc_queue *q, uint32_t idx)
  232. {
  233. char line_buf[LPFC_LBUF_SZ];
  234. int i, esize, qe_word_cnt, len;
  235. uint32_t *pword;
  236. /* sanity checks */
  237. if (!q)
  238. return;
  239. if (idx >= q->entry_count)
  240. return;
  241. esize = q->entry_size;
  242. qe_word_cnt = esize / sizeof(uint32_t);
  243. pword = q->qe[idx].address;
  244. len = 0;
  245. len += snprintf(line_buf+len, LPFC_LBUF_SZ-len, "QE[%04d]: ", idx);
  246. if (qe_word_cnt > 8)
  247. printk(KERN_ERR "%s\n", line_buf);
  248. for (i = 0; i < qe_word_cnt; i++) {
  249. if (!(i % 8)) {
  250. if (i != 0)
  251. printk(KERN_ERR "%s\n", line_buf);
  252. if (qe_word_cnt > 8) {
  253. len = 0;
  254. memset(line_buf, 0, LPFC_LBUF_SZ);
  255. len += snprintf(line_buf+len, LPFC_LBUF_SZ-len,
  256. "%03d: ", i);
  257. }
  258. }
  259. len += snprintf(line_buf+len, LPFC_LBUF_SZ-len, "%08x ",
  260. ((uint32_t)*pword) & 0xffffffff);
  261. pword++;
  262. }
  263. if (qe_word_cnt <= 8 || (i - 1) % 8)
  264. printk(KERN_ERR "%s\n", line_buf);
  265. }
  266. /**
  267. * lpfc_debug_dump_q - dump all entries from an specific queue
  268. * @q: Pointer to the queue descriptor.
  269. *
  270. * This function dumps all entries from a queue specified by the queue
  271. * descriptor @q.
  272. **/
  273. static inline void
  274. lpfc_debug_dump_q(struct lpfc_queue *q)
  275. {
  276. int idx, entry_count;
  277. /* sanity check */
  278. if (!q)
  279. return;
  280. dev_printk(KERN_ERR, &(((q->phba))->pcidev)->dev,
  281. "%d: [qid:%d, type:%d, subtype:%d, "
  282. "qe_size:%d, qe_count:%d, "
  283. "host_index:%d, port_index:%d]\n",
  284. (q->phba)->brd_no,
  285. q->queue_id, q->type, q->subtype,
  286. q->entry_size, q->entry_count,
  287. q->host_index, q->hba_index);
  288. entry_count = q->entry_count;
  289. for (idx = 0; idx < entry_count; idx++)
  290. lpfc_debug_dump_qe(q, idx);
  291. printk(KERN_ERR "\n");
  292. }
  293. /**
  294. * lpfc_debug_dump_fcp_wq - dump all entries from a fcp work queue
  295. * @phba: Pointer to HBA context object.
  296. * @fcp_wqidx: Index to a FCP work queue.
  297. *
  298. * This function dumps all entries from a FCP work queue specified by the
  299. * @fcp_wqidx.
  300. **/
  301. static inline void
  302. lpfc_debug_dump_fcp_wq(struct lpfc_hba *phba, int fcp_wqidx)
  303. {
  304. /* sanity check */
  305. if (fcp_wqidx >= phba->cfg_fcp_wq_count)
  306. return;
  307. printk(KERN_ERR "FCP WQ: WQ[Idx:%d|Qid:%d]\n",
  308. fcp_wqidx, phba->sli4_hba.fcp_wq[fcp_wqidx]->queue_id);
  309. lpfc_debug_dump_q(phba->sli4_hba.fcp_wq[fcp_wqidx]);
  310. }
  311. /**
  312. * lpfc_debug_dump_fcp_cq - dump all entries from a fcp work queue's cmpl queue
  313. * @phba: Pointer to HBA context object.
  314. * @fcp_wqidx: Index to a FCP work queue.
  315. *
  316. * This function dumps all entries from a FCP complete queue which is
  317. * associated to the FCP work queue specified by the @fcp_wqidx.
  318. **/
  319. static inline void
  320. lpfc_debug_dump_fcp_cq(struct lpfc_hba *phba, int fcp_wqidx)
  321. {
  322. int fcp_cqidx, fcp_cqid;
  323. /* sanity check */
  324. if (fcp_wqidx >= phba->cfg_fcp_wq_count)
  325. return;
  326. fcp_cqid = phba->sli4_hba.fcp_wq[fcp_wqidx]->assoc_qid;
  327. for (fcp_cqidx = 0; fcp_cqidx < phba->cfg_fcp_eq_count; fcp_cqidx++)
  328. if (phba->sli4_hba.fcp_cq[fcp_cqidx]->queue_id == fcp_cqid)
  329. break;
  330. if (fcp_cqidx >= phba->cfg_fcp_eq_count)
  331. return;
  332. printk(KERN_ERR "FCP CQ: WQ[Idx:%d|Qid%d]->CQ[Idx%d|Qid%d]:\n",
  333. fcp_wqidx, phba->sli4_hba.fcp_wq[fcp_wqidx]->queue_id,
  334. fcp_cqidx, fcp_cqid);
  335. lpfc_debug_dump_q(phba->sli4_hba.fcp_cq[fcp_cqidx]);
  336. }
  337. /**
  338. * lpfc_debug_dump_fcp_eq - dump all entries from a fcp work queue's evt queue
  339. * @phba: Pointer to HBA context object.
  340. * @fcp_wqidx: Index to a FCP work queue.
  341. *
  342. * This function dumps all entries from a FCP event queue which is
  343. * associated to the FCP work queue specified by the @fcp_wqidx.
  344. **/
  345. static inline void
  346. lpfc_debug_dump_fcp_eq(struct lpfc_hba *phba, int fcp_wqidx)
  347. {
  348. struct lpfc_queue *qdesc;
  349. int fcp_eqidx, fcp_eqid;
  350. int fcp_cqidx, fcp_cqid;
  351. /* sanity check */
  352. if (fcp_wqidx >= phba->cfg_fcp_wq_count)
  353. return;
  354. fcp_cqid = phba->sli4_hba.fcp_wq[fcp_wqidx]->assoc_qid;
  355. for (fcp_cqidx = 0; fcp_cqidx < phba->cfg_fcp_eq_count; fcp_cqidx++)
  356. if (phba->sli4_hba.fcp_cq[fcp_cqidx]->queue_id == fcp_cqid)
  357. break;
  358. if (fcp_cqidx >= phba->cfg_fcp_eq_count)
  359. return;
  360. if (phba->cfg_fcp_eq_count == 0) {
  361. fcp_eqidx = -1;
  362. fcp_eqid = phba->sli4_hba.sp_eq->queue_id;
  363. qdesc = phba->sli4_hba.sp_eq;
  364. } else {
  365. fcp_eqidx = fcp_cqidx;
  366. fcp_eqid = phba->sli4_hba.fp_eq[fcp_eqidx]->queue_id;
  367. qdesc = phba->sli4_hba.fp_eq[fcp_eqidx];
  368. }
  369. printk(KERN_ERR "FCP EQ: WQ[Idx:%d|Qid:%d]->CQ[Idx:%d|Qid:%d]->"
  370. "EQ[Idx:%d|Qid:%d]\n",
  371. fcp_wqidx, phba->sli4_hba.fcp_wq[fcp_wqidx]->queue_id,
  372. fcp_cqidx, fcp_cqid, fcp_eqidx, fcp_eqid);
  373. lpfc_debug_dump_q(qdesc);
  374. }
  375. /**
  376. * lpfc_debug_dump_els_wq - dump all entries from the els work queue
  377. * @phba: Pointer to HBA context object.
  378. *
  379. * This function dumps all entries from the ELS work queue.
  380. **/
  381. static inline void
  382. lpfc_debug_dump_els_wq(struct lpfc_hba *phba)
  383. {
  384. printk(KERN_ERR "ELS WQ: WQ[Qid:%d]:\n",
  385. phba->sli4_hba.els_wq->queue_id);
  386. lpfc_debug_dump_q(phba->sli4_hba.els_wq);
  387. }
  388. /**
  389. * lpfc_debug_dump_mbx_wq - dump all entries from the mbox work queue
  390. * @phba: Pointer to HBA context object.
  391. *
  392. * This function dumps all entries from the MBOX work queue.
  393. **/
  394. static inline void
  395. lpfc_debug_dump_mbx_wq(struct lpfc_hba *phba)
  396. {
  397. printk(KERN_ERR "MBX WQ: WQ[Qid:%d]\n",
  398. phba->sli4_hba.mbx_wq->queue_id);
  399. lpfc_debug_dump_q(phba->sli4_hba.mbx_wq);
  400. }
  401. /**
  402. * lpfc_debug_dump_dat_rq - dump all entries from the receive data queue
  403. * @phba: Pointer to HBA context object.
  404. *
  405. * This function dumps all entries from the receive data queue.
  406. **/
  407. static inline void
  408. lpfc_debug_dump_dat_rq(struct lpfc_hba *phba)
  409. {
  410. printk(KERN_ERR "DAT RQ: RQ[Qid:%d]\n",
  411. phba->sli4_hba.dat_rq->queue_id);
  412. lpfc_debug_dump_q(phba->sli4_hba.dat_rq);
  413. }
  414. /**
  415. * lpfc_debug_dump_hdr_rq - dump all entries from the receive header queue
  416. * @phba: Pointer to HBA context object.
  417. *
  418. * This function dumps all entries from the receive header queue.
  419. **/
  420. static inline void
  421. lpfc_debug_dump_hdr_rq(struct lpfc_hba *phba)
  422. {
  423. printk(KERN_ERR "HDR RQ: RQ[Qid:%d]\n",
  424. phba->sli4_hba.hdr_rq->queue_id);
  425. lpfc_debug_dump_q(phba->sli4_hba.hdr_rq);
  426. }
  427. /**
  428. * lpfc_debug_dump_els_cq - dump all entries from the els complete queue
  429. * @phba: Pointer to HBA context object.
  430. *
  431. * This function dumps all entries from the els complete queue.
  432. **/
  433. static inline void
  434. lpfc_debug_dump_els_cq(struct lpfc_hba *phba)
  435. {
  436. printk(KERN_ERR "ELS CQ: WQ[Qid:%d]->CQ[Qid:%d]\n",
  437. phba->sli4_hba.els_wq->queue_id,
  438. phba->sli4_hba.els_cq->queue_id);
  439. lpfc_debug_dump_q(phba->sli4_hba.els_cq);
  440. }
  441. /**
  442. * lpfc_debug_dump_mbx_cq - dump all entries from the mbox complete queue
  443. * @phba: Pointer to HBA context object.
  444. *
  445. * This function dumps all entries from the mbox complete queue.
  446. **/
  447. static inline void
  448. lpfc_debug_dump_mbx_cq(struct lpfc_hba *phba)
  449. {
  450. printk(KERN_ERR "MBX CQ: WQ[Qid:%d]->CQ[Qid:%d]\n",
  451. phba->sli4_hba.mbx_wq->queue_id,
  452. phba->sli4_hba.mbx_cq->queue_id);
  453. lpfc_debug_dump_q(phba->sli4_hba.mbx_cq);
  454. }
  455. /**
  456. * lpfc_debug_dump_sp_eq - dump all entries from slow-path event queue
  457. * @phba: Pointer to HBA context object.
  458. *
  459. * This function dumps all entries from the slow-path event queue.
  460. **/
  461. static inline void
  462. lpfc_debug_dump_sp_eq(struct lpfc_hba *phba)
  463. {
  464. printk(KERN_ERR "SP EQ: WQ[Qid:%d/Qid:%d]->CQ[Qid:%d/Qid:%d]->"
  465. "EQ[Qid:%d]:\n",
  466. phba->sli4_hba.mbx_wq->queue_id,
  467. phba->sli4_hba.els_wq->queue_id,
  468. phba->sli4_hba.mbx_cq->queue_id,
  469. phba->sli4_hba.els_cq->queue_id,
  470. phba->sli4_hba.sp_eq->queue_id);
  471. lpfc_debug_dump_q(phba->sli4_hba.sp_eq);
  472. }
  473. /**
  474. * lpfc_debug_dump_wq_by_id - dump all entries from a work queue by queue id
  475. * @phba: Pointer to HBA context object.
  476. * @qid: Work queue identifier.
  477. *
  478. * This function dumps all entries from a work queue identified by the queue
  479. * identifier.
  480. **/
  481. static inline void
  482. lpfc_debug_dump_wq_by_id(struct lpfc_hba *phba, int qid)
  483. {
  484. int wq_idx;
  485. for (wq_idx = 0; wq_idx < phba->cfg_fcp_wq_count; wq_idx++)
  486. if (phba->sli4_hba.fcp_wq[wq_idx]->queue_id == qid)
  487. break;
  488. if (wq_idx < phba->cfg_fcp_wq_count) {
  489. printk(KERN_ERR "FCP WQ[Idx:%d|Qid:%d]\n", wq_idx, qid);
  490. lpfc_debug_dump_q(phba->sli4_hba.fcp_wq[wq_idx]);
  491. return;
  492. }
  493. if (phba->sli4_hba.els_wq->queue_id == qid) {
  494. printk(KERN_ERR "ELS WQ[Qid:%d]\n", qid);
  495. lpfc_debug_dump_q(phba->sli4_hba.els_wq);
  496. }
  497. }
  498. /**
  499. * lpfc_debug_dump_mq_by_id - dump all entries from a mbox queue by queue id
  500. * @phba: Pointer to HBA context object.
  501. * @qid: Mbox work queue identifier.
  502. *
  503. * This function dumps all entries from a mbox work queue identified by the
  504. * queue identifier.
  505. **/
  506. static inline void
  507. lpfc_debug_dump_mq_by_id(struct lpfc_hba *phba, int qid)
  508. {
  509. if (phba->sli4_hba.mbx_wq->queue_id == qid) {
  510. printk(KERN_ERR "MBX WQ[Qid:%d]\n", qid);
  511. lpfc_debug_dump_q(phba->sli4_hba.mbx_wq);
  512. }
  513. }
  514. /**
  515. * lpfc_debug_dump_rq_by_id - dump all entries from a receive queue by queue id
  516. * @phba: Pointer to HBA context object.
  517. * @qid: Receive queue identifier.
  518. *
  519. * This function dumps all entries from a receive queue identified by the
  520. * queue identifier.
  521. **/
  522. static inline void
  523. lpfc_debug_dump_rq_by_id(struct lpfc_hba *phba, int qid)
  524. {
  525. if (phba->sli4_hba.hdr_rq->queue_id == qid) {
  526. printk(KERN_ERR "HDR RQ[Qid:%d]\n", qid);
  527. lpfc_debug_dump_q(phba->sli4_hba.hdr_rq);
  528. return;
  529. }
  530. if (phba->sli4_hba.dat_rq->queue_id == qid) {
  531. printk(KERN_ERR "DAT RQ[Qid:%d]\n", qid);
  532. lpfc_debug_dump_q(phba->sli4_hba.dat_rq);
  533. }
  534. }
  535. /**
  536. * lpfc_debug_dump_cq_by_id - dump all entries from a cmpl queue by queue id
  537. * @phba: Pointer to HBA context object.
  538. * @qid: Complete queue identifier.
  539. *
  540. * This function dumps all entries from a complete queue identified by the
  541. * queue identifier.
  542. **/
  543. static inline void
  544. lpfc_debug_dump_cq_by_id(struct lpfc_hba *phba, int qid)
  545. {
  546. int cq_idx = 0;
  547. do {
  548. if (phba->sli4_hba.fcp_cq[cq_idx]->queue_id == qid)
  549. break;
  550. } while (++cq_idx < phba->cfg_fcp_eq_count);
  551. if (cq_idx < phba->cfg_fcp_eq_count) {
  552. printk(KERN_ERR "FCP CQ[Idx:%d|Qid:%d]\n", cq_idx, qid);
  553. lpfc_debug_dump_q(phba->sli4_hba.fcp_cq[cq_idx]);
  554. return;
  555. }
  556. if (phba->sli4_hba.els_cq->queue_id == qid) {
  557. printk(KERN_ERR "ELS CQ[Qid:%d]\n", qid);
  558. lpfc_debug_dump_q(phba->sli4_hba.els_cq);
  559. return;
  560. }
  561. if (phba->sli4_hba.mbx_cq->queue_id == qid) {
  562. printk(KERN_ERR "MBX CQ[Qid:%d]\n", qid);
  563. lpfc_debug_dump_q(phba->sli4_hba.mbx_cq);
  564. }
  565. }
  566. /**
  567. * lpfc_debug_dump_eq_by_id - dump all entries from an event queue by queue id
  568. * @phba: Pointer to HBA context object.
  569. * @qid: Complete queue identifier.
  570. *
  571. * This function dumps all entries from an event queue identified by the
  572. * queue identifier.
  573. **/
  574. static inline void
  575. lpfc_debug_dump_eq_by_id(struct lpfc_hba *phba, int qid)
  576. {
  577. int eq_idx;
  578. for (eq_idx = 0; eq_idx < phba->cfg_fcp_eq_count; eq_idx++) {
  579. if (phba->sli4_hba.fp_eq[eq_idx]->queue_id == qid)
  580. break;
  581. }
  582. if (eq_idx < phba->cfg_fcp_eq_count) {
  583. printk(KERN_ERR "FCP EQ[Idx:%d|Qid:%d]\n", eq_idx, qid);
  584. lpfc_debug_dump_q(phba->sli4_hba.fp_eq[eq_idx]);
  585. return;
  586. }
  587. if (phba->sli4_hba.sp_eq->queue_id == qid) {
  588. printk(KERN_ERR "SP EQ[|Qid:%d]\n", qid);
  589. lpfc_debug_dump_q(phba->sli4_hba.sp_eq);
  590. }
  591. }
  592. void lpfc_debug_dump_all_queues(struct lpfc_hba *);